aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bunny.gbasm6
-rw-r--r--map.gbasm226
2 files changed, 173 insertions, 59 deletions
diff --git a/bunny.gbasm b/bunny.gbasm
index 2be262c..467f9dd 100644
--- a/bunny.gbasm
+++ b/bunny.gbasm
@@ -90,6 +90,7 @@ Move_Bunny:
LD A, $mem_viewport_x
ADD B
LD $mem_viewport_x, A
+ CALL =Load_Column
Move_Bunny.horizontal_tile_move.move_viewport_end:
LD A, $mem_bunny_x
ADD B
@@ -102,6 +103,7 @@ Move_Bunny:
LD A, $mem_viewport_y
ADD B
LD $mem_viewport_y, A
+ CALL =Load_Row
Move_Bunny.vertical_tile_move.move_viewport_end:
LD A, $mem_bunny_y
ADD B
@@ -111,11 +113,11 @@ Move_Bunny:
RET
Display_Bunny: ; X position in $81, Y position in $80
- LD A, $mem_viewport_x
+ LD A, $mem_bunny_x
LD HL, $9840
CALL =Print_8bit
- LD A, $mem_viewport_y
+ LD A, $mem_bunny_y
LD HL, $9860
CALL =Print_8bit
diff --git a/map.gbasm b/map.gbasm
index 1ce61ea..9692367 100644
--- a/map.gbasm
+++ b/map.gbasm
@@ -1,74 +1,186 @@
Load_Map:
- LD DE, $9800
+ LD C, $fd
+ LD B, $fd
+ Load_Map.For_Y:
+ Load_Map.For_X:
+ LD A, C
+ CALL =Load_Block
+
+ INC C
+ LD A, C
+ CP $0d
+ JR NZ, =Load_Map.For_X
+
+ INC B
+ LD A, B
+ CP $0d
+ JR NZ, =Load_Map.For_Y
- Load_Map.loop:
- LD C, E
+ RET
+
+Load_Row: ; (+1/-1 direction in B)
+ PUSH AF
+ PUSH BC
+ PUSH DE
+ LD A, B
+ CP $01
+ JR NZ, =Load_Row.Up
+
+ LD A, $mem_viewport_y
+ ADD $0C
+ LD B, A
+ JR =Load_Row.Set_X_Limits
+
+ Load_Row.Up:
+ LD A, $mem_viewport_y
+ SUB $02
+ LD B, A
+
+ Load_Row.Set_X_Limits:
+ LD A, $mem_viewport_x
+ SUB $03
+ LD D, A
+ LD A, $mem_viewport_x
+ ADD $0D
+ LD E, A
+ Load_Row.For_X:
LD A, D
- AND 0x03
- LD B, A
- PUSH BC
-
- SRA B
- RR C
- SRA B
- RR C
- SRA C
- SRA C
- SRA C
- SRA C
- LD A, C
-
- POP BC
- LD B, A
- LD A, C
- SRA A
- AND $0f
-
- CALL =Is_Solid
- CP $00
- JR Z, =Load_Map.loop.next
+ CALL =Load_Block
+ INC D
+ LD A, D
+ CP E
+ JR NZ, =Load_Row.For_X
+
+ POP DE
+ POP BC
+ POP AF
+ RET
+
+Load_Column: ; (+1/-1 direction in B)
+ PUSH AF
+ PUSH BC
+ PUSH DE
+ LD A, B
+ CP $01
+ JR NZ, =Load_Column.Left
+
+ LD A, $mem_viewport_x
+ ADD $0C
+ LD D, A
+ JR =Load_Column.Set_Y_Limits
+
+ Load_Column.Left:
+ LD A, $mem_viewport_x
+ SUB $02
+ LD D, A
+
+ Load_Column.Set_Y_Limits:
+ LD A, $mem_viewport_y
+ SUB $03
+ LD B, A
+ LD A, $mem_viewport_y
+ ADD $0D
+ LD E, A
+ Load_Column.For_Y:
+ LD A, D
+ CALL =Load_Block
+
+ INC B
+ LD A, B
+ CP E
+ JR NZ, =Load_Column.For_Y
+
+ POP DE
+ POP BC
+ POP AF
+ RET
+
+Load_Block: ; X in A, Y in B (X and B being AND with 0x0f)
+ PUSH BC
+ PUSH AF
+ PUSH DE
+
+ ; Construct Tile Map address from A and B in DE
+ PUSH AF
+ PUSH BC
+
+ AND $0f
+ LD C, A
+ LD A, B
+ AND $0f
+ LD B, A
+ LD A, C
+
+ LD D, $00
+ LD E, $00
+ LD E, B
+ SWAP E
+ SLA E
+ RL D
+ SLA E
+ RL D
+ SLA A
+ OR E
+ LD E, A
+ LD A, D
+ OR $98
+ LD D, A
+ POP BC
+ POP AF
+
+ CALL =Is_Solid
+
+ CP $00
+ JR Z, =Load_Block.Empty
+ Load_Block.Solid:
+ LD A, $20
+ LD (DE), A
LD A, E
- AND $20
- SRL A
- SRL A
- SRL A
- SRL A
- LD C, A
- LD A, E
- AND $01
- OR C
OR $20
+ LD E, A
+ LD A, $22
+ LD (DE), A
+ INC E
+ LD A, $23
+ LD (DE), A
+ LD A, E
+ AND $DF
+ LD E, A
+ LD A, $21
+ LD (DE), A
+
+ JR =Load_Block.End
+ Load_Block.Empty:
+ LD A, $00
+ LD (DE), A
+ LD A, E
+ OR $20
+ LD E, A
+ LD A, $00
+ LD (DE), A
+ INC E
+ LD A, $00
+ LD (DE), A
+ LD A, E
+ AND $DF
+ LD E, A
+ LD A, $00
LD (DE), A
- Load_Map.loop.next:
-
- INC DE
- LD A, $9c
- CP D
- JR NZ =Load_Map.loop
-
- LD DE, $9853
- LD A, $24
- LD (DE), A
- LD DE, $9854
- LD A, $25
- LD (DE), A
- LD DE, $9873
- LD A, $26
- LD (DE), A
- LD DE, $9874
- LD A, $27
- LD (DE), A
+ Load_Block.End:
+ POP DE
+ POP AF
+ POP BC
RET
Is_Solid: ; X in A, Y in B, Result A
PUSH BC
PUSH DE
-
- CP $10
+
+ CP $15
JR NC, =Is_Solid.Not_Empty
CP $02
@@ -76,7 +188,7 @@ Is_Solid: ; X in A, Y in B, Result A
LD A, B
- CP $10
+ CP $05
JR NC, =Is_Solid.Not_Empty
CP $02