diff options
author | Astatin <[email protected]> | 2024-09-10 17:21:56 +0900 |
---|---|---|
committer | Astatin <astatin@redacted> | 2024-09-10 17:21:56 +0900 |
commit | 240deda011c7ad562507759c1839d8ece785de77 (patch) | |
tree | 1853df786794da9eb8c2b096b31147925c325989 | |
parent | c3d302cd8332d55bb477b5e93ea0f6027d26c632 (diff) |
Use DMA OAM transfer to write entities to OAM
-rw-r--r-- | definitions.gbasm | 24 | ||||
-rw-r--r-- | entities.gbasm | 110 | ||||
-rw-r--r-- | init.gbasm | 16 | ||||
-rw-r--r-- | main.gbasm | 3 |
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 @@ -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: @@ -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" |