rendering! which shows computation is totally buggy :D
This commit is contained in:
289
Code/main.asm
289
Code/main.asm
@@ -74,6 +74,10 @@ Start:
|
|||||||
ldh [Rendered], a
|
ldh [Rendered], a
|
||||||
ldh [Video], a
|
ldh [Video], a
|
||||||
|
|
||||||
|
; set total to render to 0 so that interrupts don't start rendering
|
||||||
|
ldh [TotalToRender], a
|
||||||
|
ldh [TotalToRender + 1], a
|
||||||
|
|
||||||
; enable v-blank interrupt
|
; enable v-blank interrupt
|
||||||
ld a, IEF_VBLANK
|
ld a, IEF_VBLANK
|
||||||
ld [rIE], a
|
ld [rIE], a
|
||||||
@@ -124,8 +128,14 @@ Start:
|
|||||||
ld bc, 20 * 18
|
ld bc, 20 * 18
|
||||||
call MemoryCopy
|
call MemoryCopy
|
||||||
|
|
||||||
; display bg 9800
|
; set total to render to start rendering
|
||||||
ld a, LCDCF_ON | LCDCF_BGON | LCDCF_BG9800
|
ld a, LOW(20 * 18)
|
||||||
|
ldh [TotalToRender], a
|
||||||
|
ld a, HIGH(20 * 18)
|
||||||
|
ldh [TotalToRender + 1], a
|
||||||
|
|
||||||
|
; enable screen but don't display anything yet
|
||||||
|
ld a, LCDCF_ON
|
||||||
ld [rLCDC], a
|
ld [rLCDC], a
|
||||||
|
|
||||||
; enable h-blank interrupt in lcd stat
|
; enable h-blank interrupt in lcd stat
|
||||||
@@ -136,7 +146,7 @@ Start:
|
|||||||
|
|
||||||
; enable v-blank and lcd stat interrupt for h-blank
|
; enable v-blank and lcd stat interrupt for h-blank
|
||||||
di
|
di
|
||||||
ld a, IEF_VBLANK ;| IEF_LCDC
|
ld a, IEF_VBLANK; | IEF_LCDC
|
||||||
ld [rIE], a
|
ld [rIE], a
|
||||||
ei
|
ei
|
||||||
|
|
||||||
@@ -166,7 +176,7 @@ Start:
|
|||||||
ld hl, Old
|
ld hl, Old
|
||||||
inc [hl]
|
inc [hl]
|
||||||
|
|
||||||
; decrement x loop
|
; loop horizontally
|
||||||
ld a, [XLoop]
|
ld a, [XLoop]
|
||||||
dec a
|
dec a
|
||||||
jr nz, .top
|
jr nz, .top
|
||||||
@@ -216,7 +226,7 @@ Start:
|
|||||||
inc [hl]
|
inc [hl]
|
||||||
.noCarry
|
.noCarry
|
||||||
|
|
||||||
; decrement x loop
|
; loop horizontally
|
||||||
ld a, [XLoop]
|
ld a, [XLoop]
|
||||||
dec a
|
dec a
|
||||||
jr nz, .inner
|
jr nz, .inner
|
||||||
@@ -232,7 +242,7 @@ Start:
|
|||||||
ld hl, Old
|
ld hl, Old
|
||||||
inc [hl]
|
inc [hl]
|
||||||
|
|
||||||
; decrement y loop
|
; loop vertically
|
||||||
ld a, [YLoop]
|
ld a, [YLoop]
|
||||||
dec a
|
dec a
|
||||||
jr nz, .leftcolumn
|
jr nz, .leftcolumn
|
||||||
@@ -263,7 +273,7 @@ Start:
|
|||||||
ld hl, Old
|
ld hl, Old
|
||||||
inc [hl]
|
inc [hl]
|
||||||
|
|
||||||
; decrement x loop
|
; loop horizontally
|
||||||
ld a, [XLoop]
|
ld a, [XLoop]
|
||||||
dec a
|
dec a
|
||||||
jr nz, .bottom
|
jr nz, .bottom
|
||||||
@@ -278,21 +288,23 @@ Start:
|
|||||||
inc [hl]
|
inc [hl]
|
||||||
|
|
||||||
; wait end of rendering
|
; wait end of rendering
|
||||||
;.waitRender
|
.waitRenderHigh
|
||||||
; halt
|
; check high byte of TotalToRender
|
||||||
; ; compare high byte of rendered and old pointers
|
ldh a, [TotalToRender + 1]
|
||||||
; ldh a, [Rendered + 1]
|
or a
|
||||||
; ld b, a
|
jr z, .waitRenderLow
|
||||||
; ldh a, [Old + 1]
|
halt
|
||||||
; cp a, b
|
jr .waitRenderHigh
|
||||||
; jr nz, .waitRender
|
|
||||||
; ; compare low byte of rendered and old pointers
|
|
||||||
; ldh a, [Rendered]
|
|
||||||
; ld b, a
|
|
||||||
; ldh a, [Old]
|
|
||||||
; cp a, b
|
|
||||||
; jr nz, .waitRender
|
|
||||||
|
|
||||||
|
.waitRenderLow
|
||||||
|
; check low byte of TotalToRender
|
||||||
|
ldh a, [TotalToRender]
|
||||||
|
or a
|
||||||
|
jr z, .swap
|
||||||
|
halt
|
||||||
|
jr .waitRenderLow
|
||||||
|
|
||||||
|
.swap
|
||||||
; enable only v-blank interrupt
|
; enable only v-blank interrupt
|
||||||
di
|
di
|
||||||
ld a, IEF_VBLANK
|
ld a, IEF_VBLANK
|
||||||
@@ -346,12 +358,19 @@ Start:
|
|||||||
ld [rLCDC], a
|
ld [rLCDC], a
|
||||||
|
|
||||||
.resetLowBytes
|
.resetLowBytes
|
||||||
|
; reset low bytes of pointers
|
||||||
xor a
|
xor a
|
||||||
ldh [New], a
|
ldh [New], a
|
||||||
ldh [Old], a
|
ldh [Old], a
|
||||||
ldh [Rendered], a
|
ldh [Rendered], a
|
||||||
ldh [Video], a
|
ldh [Video], a
|
||||||
|
|
||||||
|
; set total to render to start rendering
|
||||||
|
ld a, LOW(20 * 18)
|
||||||
|
ldh [TotalToRender], a
|
||||||
|
ld a, HIGH(20 * 18)
|
||||||
|
ldh [TotalToRender + 1], a
|
||||||
|
|
||||||
jp .mainloop
|
jp .mainloop
|
||||||
|
|
||||||
SECTION "Load cell group and 8 neighbors to HRAM, then compute", ROM0
|
SECTION "Load cell group and 8 neighbors to HRAM, then compute", ROM0
|
||||||
@@ -536,165 +555,143 @@ Conway:
|
|||||||
|
|
||||||
SECTION "V-Blank Interrupt Handler", ROM0[$40]
|
SECTION "V-Blank Interrupt Handler", ROM0[$40]
|
||||||
VBlankInterruptHandler:
|
VBlankInterruptHandler:
|
||||||
reti
|
; save a
|
||||||
; save A and flags
|
push af
|
||||||
;push af
|
|
||||||
;
|
; set max number of cells to render
|
||||||
;; set max number of cells to render
|
ld a, 64
|
||||||
;ld a, 10
|
ldh [MaxRender], a
|
||||||
;ldh [RenderCount], a
|
|
||||||
;
|
; render
|
||||||
;; render
|
jp Render
|
||||||
;jp Render
|
|
||||||
|
|
||||||
SECTION "LCD Stat Interrupt Handler", ROM0[$48]
|
SECTION "LCD Stat Interrupt Handler", ROM0[$48]
|
||||||
LCDStatInterruptHandler:
|
LCDStatInterruptHandler:
|
||||||
reti
|
; save a
|
||||||
; save A and flags
|
push af
|
||||||
;push af
|
|
||||||
;
|
; set max number of cells to render
|
||||||
;; set max number of cells to render
|
ld a, 1
|
||||||
;ld a, 1
|
ldh [MaxRender], a
|
||||||
;ldh [RenderCount], a
|
|
||||||
;
|
; render
|
||||||
;; render
|
jp Render
|
||||||
;jp Render
|
|
||||||
|
|
||||||
SECTION "Render", ROM0
|
SECTION "Render", ROM0
|
||||||
Render:
|
Render:
|
||||||
; save DE, BC, HL registers
|
; save registers
|
||||||
push de
|
push de
|
||||||
push bc
|
push bc
|
||||||
push hl
|
push hl
|
||||||
|
|
||||||
.loop
|
; load counter into b
|
||||||
; compare rendered and new pointers
|
ldh a, [MaxRender]
|
||||||
; compare high byte first
|
|
||||||
ldh a, [New + 1]
|
|
||||||
ld b, a
|
ld b, a
|
||||||
ldh a, [Rendered + 1]
|
|
||||||
|
; check there is more than 255 bytes to render left
|
||||||
|
ldh a, [TotalToRender + 1]
|
||||||
|
and a
|
||||||
|
jr nz, .render
|
||||||
|
|
||||||
|
; check there is anything at all to render
|
||||||
|
ldh a, [TotalToRender]
|
||||||
|
and a
|
||||||
|
jr z, .exit
|
||||||
|
|
||||||
|
; check we're not trying to render more than what's left to render
|
||||||
cp a, b
|
cp a, b
|
||||||
jr c, .render
|
jr nc, .render
|
||||||
|
|
||||||
; compare low byte
|
; render only what's left to
|
||||||
ldh a, [Rendered + 0]
|
|
||||||
ld b, a
|
ld b, a
|
||||||
ldh a, [New + 0]
|
|
||||||
sub a, b
|
|
||||||
jr z, .exit
|
|
||||||
|
|
||||||
; check there are at least two bytes to render
|
|
||||||
dec a
|
|
||||||
jr z, .exit
|
|
||||||
|
|
||||||
; load rendered pointer
|
|
||||||
.render
|
.render
|
||||||
|
; save render count so that we can decrement total later
|
||||||
|
push bc
|
||||||
|
|
||||||
|
; load buffer pointer into DE
|
||||||
ld hl, Rendered
|
ld hl, Rendered
|
||||||
ld a, [hl+]
|
ld a, [hl+]
|
||||||
|
ld d, [hl]
|
||||||
|
ld e, a
|
||||||
|
|
||||||
|
; load video pointer into HL
|
||||||
|
ld hl, Video
|
||||||
|
ld a, [hl+]
|
||||||
ld h, [hl]
|
ld h, [hl]
|
||||||
ld l, a
|
ld l, a
|
||||||
ld d, l
|
|
||||||
|
|
||||||
; read two bytes in bits 0 and 1 of C
|
; set c to number of tiles before next line
|
||||||
ld a, [hl+]
|
ld a, l
|
||||||
ld b, a
|
and a, $E0
|
||||||
ld a, [hl+]
|
add a, 20
|
||||||
sla a
|
sub a, l
|
||||||
or a, b
|
|
||||||
|
|
||||||
; store read data into C
|
|
||||||
ld c, a
|
ld c, a
|
||||||
|
|
||||||
; test bit 6 of address to determine if we're on odd or even row
|
.loop
|
||||||
bit 5, d
|
; copy one byte
|
||||||
|
ld a, [de]
|
||||||
|
ld [hl+], a
|
||||||
|
inc de
|
||||||
|
|
||||||
; store incremented rendered pointer
|
; check if we need to go to next line
|
||||||
ld a, h
|
dec c
|
||||||
ld [Rendered + 1], a
|
jr nz , .countdown
|
||||||
ld a, l
|
|
||||||
ld [Rendered + 0], a
|
|
||||||
|
|
||||||
jr z, .even
|
; go to next line
|
||||||
.odd:
|
push de
|
||||||
; move read data into bits 2 and 3
|
ld de, 32 - 20
|
||||||
sla c
|
add hl, de
|
||||||
sla c
|
pop de
|
||||||
|
ld c, 20
|
||||||
|
|
||||||
; load video pointer
|
; loop over if not finished
|
||||||
ld hl, Video
|
.countdown
|
||||||
ld a, [hl+]
|
dec b
|
||||||
ld h, [hl]
|
|
||||||
ld l, a
|
|
||||||
|
|
||||||
; load current data
|
|
||||||
ld a, [hl]
|
|
||||||
|
|
||||||
; add read data
|
|
||||||
or a, c
|
|
||||||
|
|
||||||
; write updated data into video ram
|
|
||||||
ld [hl], a
|
|
||||||
|
|
||||||
; increment video pointer by 1
|
|
||||||
ld hl, Video
|
|
||||||
inc [hl]
|
|
||||||
|
|
||||||
; check end of line
|
|
||||||
ld a, [Rendered]
|
|
||||||
and %11111
|
|
||||||
jr nz, .next
|
|
||||||
|
|
||||||
; increment video pointer by 16 to go to next line
|
|
||||||
ldh a, [Video]
|
|
||||||
add a, 16
|
|
||||||
ldh [Video], a
|
|
||||||
jr nc, .next
|
|
||||||
ld hl, Video + 1
|
|
||||||
inc [hl]
|
|
||||||
|
|
||||||
jr .next
|
|
||||||
.even:
|
|
||||||
; load video pointer
|
|
||||||
ld hl, Video
|
|
||||||
ld a, [hl+]
|
|
||||||
ld h, [hl]
|
|
||||||
ld l, a
|
|
||||||
|
|
||||||
; write data into video ram
|
|
||||||
ld [hl], c
|
|
||||||
|
|
||||||
; increment video pointer by 1
|
|
||||||
ld hl, Video
|
|
||||||
inc [hl]
|
|
||||||
|
|
||||||
; check end of line
|
|
||||||
ld a, [Rendered]
|
|
||||||
and %11111
|
|
||||||
jr nz, .next
|
|
||||||
|
|
||||||
; move back to beginning of video line
|
|
||||||
ldh a, [Video]
|
|
||||||
add a, -16
|
|
||||||
ldh [Video], a
|
|
||||||
|
|
||||||
; decrement render count
|
|
||||||
.next
|
|
||||||
ld hl, RenderCount
|
|
||||||
dec [hl]
|
|
||||||
jr nz, .loop
|
jr nz, .loop
|
||||||
|
|
||||||
|
; save incremented video and buffer pointers
|
||||||
|
ld a, l
|
||||||
|
ldh [Video], a
|
||||||
|
ld a, h
|
||||||
|
ldh [Video + 1], a
|
||||||
|
|
||||||
|
ld a, e
|
||||||
|
ldh [Rendered], a
|
||||||
|
ld a, d
|
||||||
|
ldh [Rendered + 1], a
|
||||||
|
|
||||||
|
; restore max render
|
||||||
|
pop bc
|
||||||
|
|
||||||
|
; decrement total to render
|
||||||
|
ldh a, [TotalToRender]
|
||||||
|
sub a, b
|
||||||
|
ldh [TotalToRender], a
|
||||||
|
jr nc, .exit
|
||||||
|
ld hl, TotalToRender + 1
|
||||||
|
dec [hl]
|
||||||
|
|
||||||
.exit
|
.exit
|
||||||
; restore DE, BC, HL registers
|
; restore registers
|
||||||
pop hl
|
pop hl
|
||||||
pop bc
|
pop bc
|
||||||
pop de
|
pop de
|
||||||
|
|
||||||
; restore A and flags, saved in interrupt handler
|
; restore A saved in interrupt handler
|
||||||
pop af
|
pop af
|
||||||
|
|
||||||
; return from v-blank or lcd interrupt
|
; return from v-blank or lcd interrupt
|
||||||
reti
|
reti
|
||||||
|
|
||||||
|
|
||||||
|
; automata buffers with 4 cells per byte
|
||||||
|
; 2x2 bytes per cell, bit ordering:
|
||||||
|
; ___ ___
|
||||||
|
; |0 1| |0 1|
|
||||||
|
; |2 3| eg. |1 0| is %0110 = 6
|
||||||
|
; ‾‾‾ ‾‾‾
|
||||||
|
; bits 4, 5, 6 and 7 are not used
|
||||||
SECTION "Automata buffer 0", WRAM0, ALIGN[9]
|
SECTION "Automata buffer 0", WRAM0, ALIGN[9]
|
||||||
Buffer0: ds 20 * 18
|
Buffer0: ds 20 * 18
|
||||||
SECTION "Automata buffer 1", WRAM0, ALIGN[9]
|
SECTION "Automata buffer 1", WRAM0, ALIGN[9]
|
||||||
@@ -710,9 +707,10 @@ Cells: ds 9
|
|||||||
Result: ds 1
|
Result: ds 1
|
||||||
|
|
||||||
SECTION "Render Memory", HRAM
|
SECTION "Render Memory", HRAM
|
||||||
RenderCount: ds 1 ; max number of tiles to render before leaving
|
MaxRender: ds 1 ; max number of tiles to render before leaving
|
||||||
Video: ds 2 ; pointer to tilemap
|
TotalToRender: ds 2 ; total number of tiles to render left
|
||||||
Rendered: ds 2 ; pointer to bufferX
|
Video: ds 2 ; pointer to tilemap
|
||||||
|
Rendered: ds 2 ; pointer to bufferX
|
||||||
|
|
||||||
SECTION "Game of Life neighboring cells offset tables", ROM0
|
SECTION "Game of Life neighboring cells offset tables", ROM0
|
||||||
; for a looping grid of 20x18 cells
|
; for a looping grid of 20x18 cells
|
||||||
@@ -755,6 +753,7 @@ BitsSet:
|
|||||||
|
|
||||||
SECTION "Default Map", ROM0
|
SECTION "Default Map", ROM0
|
||||||
DefaultMap:
|
DefaultMap:
|
||||||
|
; 20x18 map with a glider on the top left corner
|
||||||
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
db 0, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
db 0, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
db 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
db 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
|||||||
Reference in New Issue
Block a user