From 16e0ec4460954b65f3b972fab00f3ad7527062ff Mon Sep 17 00:00:00 2001 From: Astatin Date: Thu, 15 Aug 2024 16:38:19 +0900 Subject: Displaying pre-generated dungeon --- bunny.gbasm | 12 ++- definitions.gbasm | 18 +--- init.gbasm | 2 + main.gbasm | 6 +- map.gbasm | 242 ++++++++++++++++++++---------------------------------- print.gbasm | 18 ---- tiles.gbasm | 13 --- utils.gbasm | 32 ++++++++ 8 files changed, 135 insertions(+), 208 deletions(-) delete mode 100644 print.gbasm create mode 100644 utils.gbasm diff --git a/bunny.gbasm b/bunny.gbasm index ff2aa99..a297c7e 100644 --- a/bunny.gbasm +++ b/bunny.gbasm @@ -1,12 +1,16 @@ Initialize_Bunny: - LD A, $05 + LD A, $10 LD $mem_bunny_x, A - LD A, $04 + LD A, $10 LD $mem_bunny_y, A - LD A, $08 + LD A, $b8 LD $reg_viewport_x, A - LD A, $08 + LD A, $c8 LD $reg_viewport_y, A + LD A, $0b + LD $mem_viewport_x, A + LD A, $0c + LD $mem_viewport_y, A LD A, $50 LD $mem_bunny_x_px, A LD A, $40 diff --git a/definitions.gbasm b/definitions.gbasm index 88c1e5c..f6b757e 100644 --- a/definitions.gbasm +++ b/definitions.gbasm @@ -23,23 +23,7 @@ .DEFINE mem_rng_state_1 ($c00a) ; 2 bytes .DEFINE mem_rng_state_2 ($c00b) ; 2 bytes -.DEFINE mem_room_number ($c7ff) ; AND 0xf0 >> 8 gives the number of rooms and AND 0xf gives the number of corridors -.DEFINE mem_room_array $c800 ; Takes the memory from c800 to c840 -.DEFINE mem_corridors_array $c840 ; Takes the memory from c840 to c8a0 -; room = struct { -; x1: u8 -; x2: u8 -; y1: u8 -; y2: u8 -; } 4bytes -; corridor = struct { -; orientation: bool -; start u8 -; end u8 -; position u8 -; cut: u8 -; _padding: u24 -; } 8bytes +.DEFINE mem_dungeon_map $c800 ; Takes the memory from c800 to c87f .DEFINE enum_direction_left $01 .DEFINE enum_direction_right $02 diff --git a/init.gbasm b/init.gbasm index 79d09f6..8483d4a 100644 --- a/init.gbasm +++ b/init.gbasm @@ -1,3 +1,5 @@ +.DB $01, $02, $04, $08, $10, $20, $40, $80 + .PADTO 0x0040 VBlank: CALL =VBLANK_Entrypoint diff --git a/main.gbasm b/main.gbasm index c983831..a315d48 100644 --- a/main.gbasm +++ b/main.gbasm @@ -2,10 +2,10 @@ .INCLUDE "init.gbasm" Entrypoint: - CALL =Initialize_Room + CALL =Initialize_Dungeon + CALL =Initialize_Bunny CALL =Load_Tile CALL =Load_Map - CALL =Initialize_Bunny CALL =Initialize_RNG ; LCDC @@ -25,8 +25,8 @@ VBLANK_Entrypoint: RET .INCLUDE "tiles.gbasm" -.INCLUDE "print.gbasm" .INCLUDE "map.gbasm" .INCLUDE "bunny.gbasm" .INCLUDE "buttons.gbasm" .INCLUDE "rng.gbasm" +.INCLUDE "utils.gbasm" diff --git a/map.gbasm b/map.gbasm index a294eef..d664203 100644 --- a/map.gbasm +++ b/map.gbasm @@ -1,6 +1,14 @@ Load_Map: - LD C, $fd - LD B, $fd + LD A, $mem_viewport_x + SUB $02 + LD C, A + ADD $10 + LD E, A + LD A, $mem_viewport_y + SUB $02 + LD B, A + ADD $10 + LD D, A Load_Map.For_Y: Load_Map.For_X: LD A, C @@ -8,12 +16,12 @@ Load_Map: INC C LD A, C - CP $0d + CP E JR NZ, =Load_Map.For_X INC B LD A, B - CP $0d + CP D JR NZ, =Load_Map.For_Y RET @@ -96,7 +104,7 @@ Load_Column: ; (+1/-1 direction in B) POP AF RET -Load_Block: ; X in A, Y in B (X and B being AND with 0x0f) +Load_Block: ; X in A, Y in B PUSH BC PUSH AF PUSH DE @@ -228,154 +236,82 @@ Load_Block: ; X in A, Y in B (X and B being AND with 0x0f) POP BC RET -; Is_Solid: ; X in A, Y in B, Result A -; PUSH BC -; PUSH DE -; PUSH HL -; LD C, A -; -; LD D, $00 ; Constructed room number -; LD E, $00 ; Depth -; PUSH DE -; -; Is_Solid.Corridor.loop: -; LD HL, $mem_corridors_array -; POP DE -; LD A, D -; PUSH DE -; SLA A -; SLA A -; SLA A -; OR L -; LD L, A -; -; LD A, (HL+) -; CP $00 ; 0 is horizontal -; JR Z, =Is_Solid.Corridor.horizontal -; -; Is_Solid.Corridor.vertical: -; JR =Is_Solid.Corridor.next -; -; Is_Solid.Corridor.horizontal: -; LD A, (HL+) -; LD D, A -; LD A, (HL+) -; LD E, A -; LD A, (HL+) -; CP B -; JR NZ, =Is_Solid.Corridor.room_update -; LD C, A -; CP D -; JR C, =Is_Solid.Corridor.room_update -; CP E -; JR C, =Is_Solid.NotSolid -; -; Is_Solid.Corridor.room_update: -; LD A, (HL+) -; CP C -; LD A, $00 -; ADC $00 -; POP DE -; SLA D -; OR A -; LD D, A -; PUSH DE -; -; JR =Is_Solid.Corridor.next -; -; Is_Solid.Corridor.next: -; POP DE -; INC E -; LD A, E -; PUSH DE -; CP $04 -; JR NZ =Is_Solid.Corridor.loop -; -; POP DE -; LD A, $01 -; JR =Is_Solid.End -; -; Is_Solid.NotSolid: -; POP DE -; LD A, $00 -; Is_Solid.End: -; -; POP BC -; POP DE -; POP HL -; RET - -Initialize_Room: - LD HL, $mem_room_array - LD A, $00 - LD (HL+), A - LD A, $20 - LD (HL+), A - LD A, $00 - LD (HL+), A - LD A, $20 - LD (HL+), A - RET +Initial_dungeon: + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $03, $e0, $00, $00, + .DB $02, $20, $00, $00, + .DB $02, $20, $00, $00, + .DB $02, $20, $00, $00, + .DB $02, $20, $00, $00, + .DB $02, $20, $00, $00, + .DB $0e, $20, $00, $00, + .DB $3f, $20, $00, $00, + .DB $3f, $20, $00, $00, + .DB $3f, $3f, $80, $00, + .DB $3f, $00, $80, $00, + .DB $3f, $00, $80, $00, + .DB $3f, $00, $80, $00, + .DB $3f, $00, $80, $00, + .DB $3f, $00, $80, $00, + .DB $00, $01, $f8, $00, + .DB $00, $01, $f8, $00, + .DB $00, $01, $f8, $00, + .DB $00, $01, $f8, $00, + .DB $00, $01, $f8, $00, + .DB $00, $01, $ff, $80, + .DB $00, $01, $f8, $80, + .DB $00, $01, $f8, $80, + .DB $00, $00, $ff, $80, + .DB $00, $00, $00, $00, + +Initialize_Dungeon: + LD HL, $mem_dungeon_map + LD DE, =Initial_dungeon + LD BC, $0100 + JP =memcpy + Is_Solid: ; X in A, Y in B, Result A -; AND $0f -; JR Z, =Is_Solid.Solid -; LD A, B -; AND $07 -; JR Z, =Is_Solid.Solid -; -; -; Is_Solid.NonSolid: -; LD A, $00 -; JR =Is_Solid.End -; -; Is_Solid.Solid: -; LD A, $01 -; -; Is_Solid.End: -; RET - PUSH BC - PUSH DE - PUSH HL - - LD C, A - LD DE, $mem_room_array - - Is_Solid.room_loop: - LD H, D - LD L, E - - LD A, (HL+) - CP C - JR NC, =Is_Solid.room_loop.next - - LD A, (HL+) - CP C - JR C, =Is_Solid.room_loop.next - - LD A, (HL+) - CP B - JR NC, =Is_Solid.room_loop.next - - LD A, (HL+) - CP B - JR NC, =Is_Solid.NonSolid - - Is_Solid.room_loop.next: - LD A, $04 - ADD E - LD E, A - CP $40 - JR NZ, =Is_Solid.room_loop - - LD A, $01 - JR =Is_Solid.End - - Is_Solid.NonSolid: - LD A, $00 - - Is_Solid.End: - POP HL - POP DE - POP BC + PUSH BC + + CP $20 + JR NC, =Is_Solid.Solid + + LD C, A + LD A, B + CP $20 + JR NC, =Is_Solid.Solid + LD A, C + + LD H, $00 + CP $10 + RL B + AND $0f + CP $08 + RL B + AND $07 + LD L, A + + LD C, B + LD B, $c8 + LD A, (BC) + + AND (HL) + CP $01 + LD A, $00 + RL A + + POP BC RET + + Is_Solid.Solid: + LD A, $01 + POP BC + + RET diff --git a/print.gbasm b/print.gbasm deleted file mode 100644 index e5bb898..0000000 --- a/print.gbasm +++ /dev/null @@ -1,18 +0,0 @@ -Print_8bit: ; Number in A, Memory Tilemap position in HL - PUSH AF - PUSH BC - - LD C, A - SWAP A ; We start by the highest nibble - AND $0f - OR $10 - LD (HL+), A - - LD A, C - AND $0f ; Then the lowest - OR $10 - LD (HL+), A - - POP BC - POP AF - RET diff --git a/tiles.gbasm b/tiles.gbasm index 81a8a10..b66222c 100644 --- a/tiles.gbasm +++ b/tiles.gbasm @@ -102,19 +102,6 @@ Number_Font_Data: .DB $00, $7e, $60, $7c, $60, $60, $7e, $00 ; E .DB $00, $7e, $60, $7c, $60, $60, $60, $00 ; F -memcpy: ; src = DE, dest = HL, n = BC - Load_Tile.loop0: - LD A, (DE) - LD (HL+), A - INC DE - DEC BC - XOR A - CP B - JR NZ =Load_Tile.loop0 - CP C - JR NZ =Load_Tile.loop0 - RET - Load_Tile: LD HL, $8020 LD DE, =OBJ_Tile_Image_Data diff --git a/utils.gbasm b/utils.gbasm new file mode 100644 index 0000000..2c8ef2b --- /dev/null +++ b/utils.gbasm @@ -0,0 +1,32 @@ +memcpy: ; src = DE, dest = HL, n = BC + Load_Tile.loop0: + LD A, (DE) + LD (HL+), A + INC DE + DEC BC + XOR A + CP B + JR NZ =Load_Tile.loop0 + CP C + JR NZ =Load_Tile.loop0 + RET + +Print_8bit: ; Number in A, Memory Tilemap position in HL + PUSH AF + PUSH BC + + LD C, A + SWAP A ; We start by the highest nibble + AND $0f + OR $10 + LD (HL+), A + + LD A, C + AND $0f ; Then the lowest + OR $10 + LD (HL+), A + + POP BC + POP AF + RET + -- cgit v1.2.3-70-g09d2