aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--definitions.gbasm24
-rw-r--r--entities.gbasm110
-rw-r--r--init.gbasm16
-rw-r--r--main.gbasm3
4 files changed, 96 insertions, 57 deletions
diff --git a/definitions.gbasm b/definitions.gbasm
index 84e7691..7ac2721 100644
--- a/definitions.gbasm
+++ b/definitions.gbasm
@@ -37,6 +37,7 @@
.DEFINE next_free_head_higher_bytes $c7
.DEFINE mem_next_free_head_lower_bytes ($c6ff)
+
.DEFINE mem_dungeon_generation_heads $c700 ; Takes the memory from c700 to c717
; struct head {
; direction: u8 (really u3 but padding),
@@ -63,15 +64,36 @@
; _padding: u24
; }
-.DEFINE mem_entites_list $c980 ; Until IDK WHERE
+.DEFINE mem_entites_list $c980 ; Until c9ff
; struct entity {
; sprite: u8,
; x: u8,
; y: u8,
; direction: u8 (bit 3 = is_moving, bit 2-0: direction),
+; ai_function_pointer: 16
+; _padding: u16
; }
+.DEFINE mem_oam_buffer $ca00 ; Until $ca9f
+.DEFINE mem_oam_buffer_high $ca
+
.DEFINE enum_direction_left $01
.DEFINE enum_direction_right $02
.DEFINE enum_direction_up $03
.DEFINE enum_direction_down $04
+
+
+; HIGH_RAM:
+;
+; 80-85 ; Free to use as temporary variables
+.DEFINE tmp_var_1 ($80)
+.DEFINE tmp_var_2 ($81)
+.DEFINE tmp_var_3 ($82)
+.DEFINE tmp_var_4 ($83)
+.DEFINE tmp_var_5 ($84)
+.DEFINE tmp_var_6 ($85)
+
+; 86-90 ; OAM_DMA_Transfer_routine
+.DEFINE OAM_DMA_Transfer_routine $ff86
+
+; 90-fe ; Stack
diff --git a/entities.gbasm b/entities.gbasm
index 1e4772f..03786d9 100644
--- a/entities.gbasm
+++ b/entities.gbasm
@@ -1,12 +1,12 @@
-Display_Entities:
+Prepare_Entities:
LD A, $00
- LD ($80), A
+ LD $tmp_var_1, A
LD HL, $mem_entites_list
- CALL =Display_Entity
- CALL =Display_Entity
+ CALL =Prepare_Entity
+ CALL =Prepare_Entity
RET
-Display_Entity:
+Prepare_Entity:
LD A, (HL+)
LD E, A
@@ -17,10 +17,10 @@ Display_Entity:
LD B, A
SUB $83
CP D
- JP NC, =Display_Entity.skip
+ JP NC, =Prepare_Entity.skip
ADD $10
CP D
- JP C, =Display_Entity.skip
+ JP C, =Prepare_Entity.skip
LD A, D
SUB $80
SUB B
@@ -35,10 +35,10 @@ Display_Entity:
LD C, A
SUB $83
CP D
- JP NC, =Display_Entity.skip
+ JP NC, =Prepare_Entity.skip
ADD $10
CP D
- JP C, =Display_Entity.skip
+ JP C, =Prepare_Entity.skip
LD A, D
SUB $80
SUB C
@@ -50,16 +50,16 @@ Display_Entity:
LD A, $mem_bunny_direction
BIT 3, A
- JR Z, =Display_Entity.Viewport_offset_end
+ JR Z, =Prepare_Entity.Viewport_offset_end
AND $07
CP $enum_direction_down
- JR Z, =Display_Entity.Viewport_offset_down
+ JR Z, =Prepare_Entity.Viewport_offset_down
CP $enum_direction_right
- JR Z, =Display_Entity.Viewport_offset_right
+ JR Z, =Prepare_Entity.Viewport_offset_right
CP $enum_direction_up
- JR Z, =Display_Entity.Viewport_offset_up
+ JR Z, =Prepare_Entity.Viewport_offset_up
- Display_Entity.Viewport_offset_left:
+ Prepare_Entity.Viewport_offset_left:
LD A, $reg_viewport_x
SUB $08
AND $0f
@@ -68,9 +68,9 @@ Display_Entity:
ADD B
LD B, A
- JR =Display_Entity.Viewport_offset_end
+ JR =Prepare_Entity.Viewport_offset_end
- Display_Entity.Viewport_offset_right:
+ Prepare_Entity.Viewport_offset_right:
LD A, $reg_viewport_x
SUB $08
AND $0f
@@ -79,9 +79,9 @@ Display_Entity:
LD B, A
- JR =Display_Entity.Viewport_offset_end
+ JR =Prepare_Entity.Viewport_offset_end
- Display_Entity.Viewport_offset_up:
+ Prepare_Entity.Viewport_offset_up:
LD A, $reg_viewport_y
SUB $08
AND $0f
@@ -91,9 +91,9 @@ Display_Entity:
LD C, A
- JR =Display_Entity.Viewport_offset_end
+ JR =Prepare_Entity.Viewport_offset_end
- Display_Entity.Viewport_offset_down:
+ Prepare_Entity.Viewport_offset_down:
LD A, $reg_viewport_y
SUB $08
AND $0f
@@ -102,74 +102,74 @@ Display_Entity:
LD C, A
- Display_Entity.Viewport_offset_end:
+ Prepare_Entity.Viewport_offset_end:
LD A, (HL+)
BIT 3, A
LD D, A
LD A, $00
- JR Z, =Display_Entity.Not_Moving_Animation
+ JR Z, =Prepare_Entity.Not_Moving_Animation
LD A, D
AND $07
CP $enum_direction_down
- JR Z, =Display_Entity.moving_offset_down
+ JR Z, =Prepare_Entity.moving_offset_down
CP $enum_direction_right
- JR Z, =Display_Entity.moving_offset_right
+ JR Z, =Prepare_Entity.moving_offset_right
CP $enum_direction_up
- JR Z, =Display_Entity.moving_offset_up
+ JR Z, =Prepare_Entity.moving_offset_up
- Display_Entity.moving_offset_left:
+ Prepare_Entity.moving_offset_left:
LD A, $mem_moving_animation_step
XOR $ff
ADD B
LD B, A
- JR =Display_Entity.moving_offset_end
+ JR =Prepare_Entity.moving_offset_end
- Display_Entity.moving_offset_right:
+ Prepare_Entity.moving_offset_right:
LD A, $mem_moving_animation_step
INC A
ADD B
LD B, A
- JR =Display_Entity.moving_offset_end
+ JR =Prepare_Entity.moving_offset_end
- Display_Entity.moving_offset_up:
+ Prepare_Entity.moving_offset_up:
LD A, $mem_moving_animation_step
XOR $ff
ADD C
LD C, A
- JR =Display_Entity.moving_offset_end
+ JR =Prepare_Entity.moving_offset_end
- Display_Entity.moving_offset_down:
+ Prepare_Entity.moving_offset_down:
LD A, $mem_moving_animation_step
INC A
ADD C
LD C, A
- Display_Entity.moving_offset_end:
+ Prepare_Entity.moving_offset_end:
LD A, $mem_moving_animation_step
- Display_Entity.Not_Moving_Animation:
+ Prepare_Entity.Not_Moving_Animation:
SUB $08
BIT 7, A
- JR Z, =Display_Entity.Hop_ABS1_end
+ JR Z, =Prepare_Entity.Hop_ABS1_end
; Adding hop animation to Y
XOR $ff
INC A
- Display_Entity.Hop_ABS1_end:
+ Prepare_Entity.Hop_ABS1_end:
SUB $04
BIT 7, A
- JR Z, =Display_Entity.Hop_ABS2_end
+ JR Z, =Prepare_Entity.Hop_ABS2_end
XOR $ff
INC A
- Display_Entity.Hop_ABS2_end:
+ Prepare_Entity.Hop_ABS2_end:
ADD C
LD C, A
@@ -178,43 +178,43 @@ Display_Entity:
AND $07
CP $enum_direction_left
- JR Z, =Display_Entity.Left_Direction_sprite
+ JR Z, =Prepare_Entity.Left_Direction_sprite
CP $enum_direction_right
- JR Z, =Display_Entity.Right_Direction_sprite
+ JR Z, =Prepare_Entity.Right_Direction_sprite
CP $enum_direction_up
- JR Z, =Display_Entity.Up_Direction_sprite
- JP =Display_Entity.Down_Direction_sprite
+ JR Z, =Prepare_Entity.Up_Direction_sprite
+ JP =Prepare_Entity.Down_Direction_sprite
- Display_Entity.Left_Direction_sprite:
+ Prepare_Entity.Left_Direction_sprite:
LD D, $00
- JP =Display_Entity.Write_OBJ
+ JP =Prepare_Entity.Write_OBJ
- Display_Entity.Right_Direction_sprite:
+ Prepare_Entity.Right_Direction_sprite:
LD A, $02
ADD E
LD E, A
LD D, $20
- JP =Display_Entity.Write_OBJ
+ JP =Prepare_Entity.Write_OBJ
- Display_Entity.Up_Direction_sprite:
+ Prepare_Entity.Up_Direction_sprite:
LD A, $04
ADD E
LD E, A
LD D, $00
- JP =Display_Entity.Write_OBJ
+ JP =Prepare_Entity.Write_OBJ
- Display_Entity.Down_Direction_sprite:
+ Prepare_Entity.Down_Direction_sprite:
LD A, $08
ADD E
LD E, A
LD D, $00
- JP =Display_Entity.Write_OBJ
+ JP =Prepare_Entity.Write_OBJ
- Display_Entity.Write_OBJ:
+ Prepare_Entity.Write_OBJ:
PUSH HL
; First OBJ (left)
- LD H, $FE
- LD A, ($80)
+ LD HL, $mem_oam_buffer
+ LD A, $tmp_var_1
LD L, A
LD A, C
LD (HL+), A
@@ -242,8 +242,8 @@ Display_Entity:
LD A, D
LD (HL+), A
LD A, L
- LD ($80), A
+ LD $tmp_var_1, A
POP HL
- Display_Entity.skip:
+ Prepare_Entity.skip:
RET
diff --git a/init.gbasm b/init.gbasm
index ec41320..8898848 100644
--- a/init.gbasm
+++ b/init.gbasm
@@ -60,4 +60,20 @@ Empty_VRAM: ; (Clear screen)
LD A, $01
LD $reg_interrupt_enable, A
+Copy_OAM_DMA_Transfer_Routine_To_HRAM:
+ LD HL, $OAM_DMA_Transfer_routine
+ LD DE, =OAM_DMA_Transfer_routine_src
+ LD BC, $000a
+ CALL =memcpy
+
JP =Entrypoint
+
+OAM_DMA_Transfer_routine_src:
+ LD A, $mem_oam_buffer_high
+ LD ($46), A
+ LD A, $28 ; delay for a total of 4×40 = 160 M-cycles
+ OAM_DMA_Transfer_routine_src.wait:
+ DEC A ; 1 M-cycle
+ JR NZ, =OAM_DMA_Transfer_routine_src.wait ; 3 M-cycles
+ RET
+ OAM_DMA_Transfer_routine_src.end:
diff --git a/main.gbasm b/main.gbasm
index ad1fa44..eb1ea52 100644
--- a/main.gbasm
+++ b/main.gbasm
@@ -24,7 +24,7 @@ New_Dungeon:
VBLANK_Entrypoint:
CALL =Display_Prepared_Block
CALL =Display_Object
- CALL =Display_Entities
+ CALL $OAM_DMA_Transfer_routine
CALL =Object_Interactions_Check
@@ -32,6 +32,7 @@ VBLANK_Entrypoint:
CALL =Move_Bunny
CALL =Prepare_Scrolling_Map
+ CALL =Prepare_Entities
RET
.INCLUDE "tiles.gbasm"