diff options
Diffstat (limited to 'src/home/bg_map.asm')
-rw-r--r-- | src/home/bg_map.asm | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/home/bg_map.asm b/src/home/bg_map.asm new file mode 100644 index 0000000..43dfe7b --- /dev/null +++ b/src/home/bg_map.asm @@ -0,0 +1,117 @@ +; reads structs: +; x (1 byte), y (1 byte), data (n bytes), $00 +; x (1 byte), y (1 byte), data (n bytes), $00 +; ... +; $ff +; for each struct, writes data to BGMap0-translated x,y +WriteDataBlocksToBGMap0: + call WriteDataBlockToBGMap0 + bit 7, [hl] ; check for $ff + jr z, WriteDataBlocksToBGMap0 + ret + +; reads struct: +; x (1 byte), y (1 byte), data (n bytes), $00 +; writes data to BGMap0-translated x,y +WriteDataBlockToBGMap0: + ld b, [hl] + inc hl + ld c, [hl] + inc hl + push hl ; hl = addr of data + push bc ; b,c = x,y + ld b, -1 +.find_zero_loop + inc b + ld a, [hli] + or a + jr nz, .find_zero_loop + ld a, b ; length of data + pop bc ; x,y + push af + call BCCoordToBGMap0Address + pop af + ld b, a ; length of data + pop hl ; addr of data + or a + jr z, .move_to_next + push bc + push hl + call SafeCopyDataHLtoDE ; copy data to de (BGMap0 translated x,y) + pop hl + pop bc + +.move_to_next + inc b ; length of data += 1 (to account for the last $0) + ld c, b + ld b, 0 + add hl, bc ; point to next structure + ret + +; writes a to [v*BGMap0 + BG_MAP_WIDTH * c + b] +WriteByteToBGMap0: + push af + ld a, [wLCDC] + rla + jr c, .lcd_on + pop af + push hl + push de + push bc + push af + call BCCoordToBGMap0Address + pop af + ld [de], a + pop bc + pop de + pop hl + ret +.lcd_on + pop af +; fallthrough + +; writes a to [v*BGMap0 + BG_MAP_WIDTH * c + b] during hblank +HblankWriteByteToBGMap0: ; 06d9 + push hl + push de + push bc + ld hl, wTempByte + push hl + ld [hl], a + call BCCoordToBGMap0Address + pop hl + ld b, 1 + call HblankCopyDataHLtoDE + pop bc + pop de + pop hl + ret + +; copy a bytes of data from hl to vBGMap0 address pointed to by coord at bc +CopyDataToBGMap0: + push bc + push hl + push af + call BCCoordToBGMap0Address + pop af + ld b, a + pop hl + call SafeCopyDataHLtoDE + pop bc + ret + +; copy b bytes of data from hl to de +; if LCD on, copy during h-blank only +SafeCopyDataHLtoDE: ; 6fc (0:6fc) + ld a, [wLCDC] + rla + jr c, JPHblankCopyDataHLtoDE +.lcd_off_loop + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .lcd_off_loop + ret +JPHblankCopyDataHLtoDE: + jp HblankCopyDataHLtoDE |