rendering! which shows computation is totally buggy :D

This commit is contained in:
2018-12-29 19:09:06 +01:00
parent 5d2fbf30a6
commit 816db6c101

View File

@@ -74,6 +74,10 @@ Start:
ldh [Rendered], 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
ld a, IEF_VBLANK
ld [rIE], a
@@ -124,8 +128,14 @@ Start:
ld bc, 20 * 18
call MemoryCopy
; display bg 9800
ld a, LCDCF_ON | LCDCF_BGON | LCDCF_BG9800
; set total to render to start rendering
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
; enable h-blank interrupt in lcd stat
@@ -166,7 +176,7 @@ Start:
ld hl, Old
inc [hl]
; decrement x loop
; loop horizontally
ld a, [XLoop]
dec a
jr nz, .top
@@ -216,7 +226,7 @@ Start:
inc [hl]
.noCarry
; decrement x loop
; loop horizontally
ld a, [XLoop]
dec a
jr nz, .inner
@@ -232,7 +242,7 @@ Start:
ld hl, Old
inc [hl]
; decrement y loop
; loop vertically
ld a, [YLoop]
dec a
jr nz, .leftcolumn
@@ -263,7 +273,7 @@ Start:
ld hl, Old
inc [hl]
; decrement x loop
; loop horizontally
ld a, [XLoop]
dec a
jr nz, .bottom
@@ -278,21 +288,23 @@ Start:
inc [hl]
; wait end of rendering
;.waitRender
; halt
; ; compare high byte of rendered and old pointers
; ldh a, [Rendered + 1]
; ld b, a
; ldh a, [Old + 1]
; cp a, b
; 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
.waitRenderHigh
; check high byte of TotalToRender
ldh a, [TotalToRender + 1]
or a
jr z, .waitRenderLow
halt
jr .waitRenderHigh
.waitRenderLow
; check low byte of TotalToRender
ldh a, [TotalToRender]
or a
jr z, .swap
halt
jr .waitRenderLow
.swap
; enable only v-blank interrupt
di
ld a, IEF_VBLANK
@@ -346,12 +358,19 @@ Start:
ld [rLCDC], a
.resetLowBytes
; reset low bytes of pointers
xor a
ldh [New], a
ldh [Old], a
ldh [Rendered], 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
SECTION "Load cell group and 8 neighbors to HRAM, then compute", ROM0
@@ -536,165 +555,143 @@ Conway:
SECTION "V-Blank Interrupt Handler", ROM0[$40]
VBlankInterruptHandler:
reti
; save A and flags
;push af
;
;; set max number of cells to render
;ld a, 10
;ldh [RenderCount], a
;
;; render
;jp Render
; save a
push af
; set max number of cells to render
ld a, 64
ldh [MaxRender], a
; render
jp Render
SECTION "LCD Stat Interrupt Handler", ROM0[$48]
LCDStatInterruptHandler:
reti
; save A and flags
;push af
;
;; set max number of cells to render
;ld a, 1
;ldh [RenderCount], a
;
;; render
;jp Render
; save a
push af
; set max number of cells to render
ld a, 1
ldh [MaxRender], a
; render
jp Render
SECTION "Render", ROM0
Render:
; save DE, BC, HL registers
; save registers
push de
push bc
push hl
.loop
; compare rendered and new pointers
; compare high byte first
ldh a, [New + 1]
; load counter into b
ldh a, [MaxRender]
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
jr c, .render
jr nc, .render
; compare low byte
ldh a, [Rendered + 0]
; render only what's left to
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
; save render count so that we can decrement total later
push bc
; load buffer pointer into DE
ld hl, Rendered
ld a, [hl+]
ld d, [hl]
ld e, a
; load video pointer into HL
ld hl, Video
ld a, [hl+]
ld h, [hl]
ld l, a
ld d, l
; read two bytes in bits 0 and 1 of C
ld a, [hl+]
ld b, a
ld a, [hl+]
sla a
or a, b
; store read data into C
; set c to number of tiles before next line
ld a, l
and a, $E0
add a, 20
sub a, l
ld c, a
; test bit 6 of address to determine if we're on odd or even row
bit 5, d
.loop
; copy one byte
ld a, [de]
ld [hl+], a
inc de
; store incremented rendered pointer
ld a, h
ld [Rendered + 1], a
ld a, l
ld [Rendered + 0], a
; check if we need to go to next line
dec c
jr nz , .countdown
jr z, .even
.odd:
; move read data into bits 2 and 3
sla c
sla c
; go to next line
push de
ld de, 32 - 20
add hl, de
pop de
ld c, 20
; load video pointer
ld hl, Video
ld a, [hl+]
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]
; loop over if not finished
.countdown
dec b
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
; restore DE, BC, HL registers
; restore registers
pop hl
pop bc
pop de
; restore A and flags, saved in interrupt handler
; restore A saved in interrupt handler
pop af
; return from v-blank or lcd interrupt
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]
Buffer0: ds 20 * 18
SECTION "Automata buffer 1", WRAM0, ALIGN[9]
@@ -710,7 +707,8 @@ Cells: ds 9
Result: ds 1
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
TotalToRender: ds 2 ; total number of tiles to render left
Video: ds 2 ; pointer to tilemap
Rendered: ds 2 ; pointer to bufferX
@@ -755,6 +753,7 @@ BitsSet:
SECTION "Default Map", ROM0
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, 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