diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | definitions.gbasm | 10 | ||||
-rw-r--r-- | entity/display.gbasm | 12 | ||||
-rw-r--r-- | gui.gbasm | 2 | ||||
-rw-r--r-- | init.gbasm | 11 | ||||
-rw-r--r-- | main.gbasm | 93 | ||||
-rw-r--r-- | scripts/generate-tiledata.py | 2 | ||||
-rw-r--r-- | sprites/font.png | bin | 418 -> 504 bytes | |||
-rw-r--r-- | sprites/gui/energy-points.png | bin | 0 -> 169 bytes | |||
-rw-r--r-- | sprites/gui/heart.png | bin | 126 -> 132 bytes | |||
-rw-r--r-- | tiles.gbasm | 10 | ||||
-rw-r--r-- | tileset.gbasm | 22 | ||||
-rw-r--r-- | utils.gbasm | 19 |
13 files changed, 149 insertions, 34 deletions
@@ -2,7 +2,7 @@ all: run .PHONY: build/main.rom clean -tileset.gbasm: ./scripts/generate-tiledata.py $(wildcard ./sprites/**/*) +tileset.gbasm: ./scripts/generate-tiledata.py $(wildcard ./sprites/**/* ./sprites/*) python ./scripts/generate-tiledata.py > tileset.gbasm dialogues.gbasm: ./dialogues.gbtxt ./scripts/generate_from_gbtxt.py diff --git a/definitions.gbasm b/definitions.gbasm index 045a01b..72eca2e 100644 --- a/definitions.gbasm +++ b/definitions.gbasm @@ -8,6 +8,8 @@ .DEFINE reg_bg_palette ($47) .DEFINE reg_obj0_palette ($48) .DEFINE reg_obj1_palette ($49) +.DEFINE reg_window_y ($4a) +.DEFINE reg_window_x ($4b) .DEFINE reg_interrupt_enable ($ff) .DEFINE VRAM_start $8000 @@ -42,6 +44,8 @@ .DEFINE mem_bunny_health ($cb06) .DEFINE mem_bunny_flags ($cb07) .DEFINE mem_bunny_status ($cb08) +.DEFINE mem_bunny_mana ($cb09) + .DEFINE mem_viewport_x ($c008) .DEFINE mem_viewport_y ($c009) .DEFINE mem_rng_state_1 ($c00a) ; 2 bytes @@ -65,6 +69,7 @@ ; bit 0: if dialogue box is displayed ; bit 1: dialogue box first line should be bold ; bit 2: if dialogue box text should be refreshed +; bit 3: if side window box should be displayed .DEFINE mem_current_mode ($c014) .DEFINE mem_requested_mode ($c015) @@ -209,8 +214,9 @@ .DEFINE obj_palette_normal $d3 .DEFINE obj_palette_frozen $ab -.DEFINE lcdc_window_enabled $8d -.DEFINE lcdc_window_disabled $87 +.DEFINE lcdc_guibg_tilemap $8d +.DEFINE lcdc_mapbg_no_window_tilemap $87 +.DEFINE lcdc_mapbg_window_tilemap $e7 ; HIGH_RAM: ; diff --git a/entity/display.gbasm b/entity/display.gbasm index d9baff7..69da0ab 100644 --- a/entity/display.gbasm +++ b/entity/display.gbasm @@ -78,6 +78,18 @@ Display_Entity: ADD $06 LD C, A + .Check_Window_Overlap: + LD A, $mem_display_flag + BIT 3, A + JR Z, =.Check_Window_Overlap.end + LD A, $6f + CP B + JR NC, =.Check_Window_Overlap.end + LD A, $55 + CP C + JP C, =.skip + .Check_Window_Overlap.end: + .ADD_MOVING_ANIMATION_OFFSET LD A, (HL+) @@ -207,7 +207,7 @@ Check_Open_Menu_button: CALL =Init_Menu - LD A, $05 + LD A, $0d LD $mem_display_flag, A LD A, $enum_dungeon_menu_mode @@ -65,7 +65,11 @@ Empty_VRAM: ; (Clear screen) LD $reg_obj1_palette, A Initialize_Window_GUI: - LD HL, $9c20 + LD A, $48 + LD $reg_window_y, A + LD A, $6f + LD $reg_window_x, A + LD HL, $9d80 .top_bar_loop: LD A, $10 LD (HL+), A @@ -80,6 +84,11 @@ Initialize_Window_GUI: LD DE, =Dialogue_Box_Tilemap_data CALL =memcpy + LD HL, $9c00 + LD BC, $0080 + LD DE, =Cost_Window_Tilemap_data + CALL =memcpy + Copy_OAM_DMA_Transfer_Routine_To_HRAM: LD HL, $OAM_DMA_Transfer_routine LD DE, =OAM_DMA_Transfer_routine_src @@ -13,21 +13,27 @@ $HBlank_Wait.End: .END -.MACRODEF ENABLE_WINDOW_NO_WAIT_HBLANK +.MACRODEF ENABLE_TOP_BAR XOR A LD $reg_viewport_x, A + LD A, $57 LD $reg_viewport_y, A - LD A, $lcdc_window_enabled + LD A, $lcdc_guibg_tilemap LD $reg_lcd_controller, A .END -.MACRODEF ENABLE_WINDOW +.MACRODEF ENABLE_DIALOGUE .HBLANK_WAIT - .ENABLE_WINDOW_NO_WAIT_HBLANK + XOR A + LD $reg_viewport_x, A + LD $reg_viewport_y, A + + LD A, $lcdc_guibg_tilemap + LD $reg_lcd_controller, A .END -.MACRODEF DISABLE_WINDOW +.MACRODEF DISABLE_DIALOGUE_NO_WINDOW PUSH BC LD A, $mem_prepared_viewport_x LD B, A @@ -40,7 +46,25 @@ LD $reg_viewport_y, A LD A, $mem_prepared_color_palette LD $reg_bg_palette, A - LD A, $lcdc_window_disabled + LD A, $lcdc_mapbg_no_window_tilemap + LD $reg_lcd_controller, A + POP BC +.END + +.MACRODEF DISABLE_DIALOGUE_WINDOW + PUSH BC + LD A, $mem_prepared_viewport_x + LD B, A + LD A, $mem_prepared_viewport_y + LD C, A + .HBLANK_WAIT + LD A, B + LD $reg_viewport_x, A + LD A, C + LD $reg_viewport_y, A + LD A, $mem_prepared_color_palette + LD $reg_bg_palette, A + LD A, $lcdc_mapbg_window_tilemap LD $reg_lcd_controller, A POP BC .END @@ -101,9 +125,13 @@ New_Dungeon: ; Heart LD A, $68 - LD ($9c02), A + LD ($9d62), A - .ENABLE_WINDOW_NO_WAIT_HBLANK + ; Energy points + LD A, $6a + LD ($9d66), A + + .ENABLE_TOP_BAR .ENABLE_VBLANK_INTERRUPTS EI Wait_for_Interrupt.loop: @@ -112,14 +140,17 @@ New_Dungeon: JP =Wait_for_Interrupt.loop VBLANK_Entrypoint: - .ENABLE_WINDOW_NO_WAIT_HBLANK + .ENABLE_TOP_BAR LD A, $palette_bold_font LD $reg_bg_palette, A - LD HL, $9c12 + LD HL, $9d72 LD A, $dbg_VBLANK_STATE CALL =Print_8bit + LD HL, $9c43 + LD A, $dbg_VBLANK_STATE + CALL =Print_8bit_Thin CALL $OAM_DMA_Transfer_routine CALL =Loading_Mode_VBlank @@ -127,15 +158,18 @@ VBLANK_Entrypoint: LD A, $mem_current_mode CP $enum_dungeon_mode JR NZ, =Skip_VBlank_Dungeon_Update - LD HL, $9c00 + LD HL, $9d60 LD A, $mem_bunny_health CALL =Print_8bit + LD HL, $9d64 + LD A, $mem_bunny_mana + CALL =Print_8bit + CALL =Display_Prepared_Block CALL =Display_Object Skip_VBlank_Dungeon_Update: - CALL =Copy_Dialogue_Buffer CALL =Display_dialogue_cursor @@ -144,7 +178,7 @@ VBLANK_Entrypoint: LD $dbg_VBLANK_STATE, A ; LYC - LD A, $09 + LD A, $0a LD $reg_lyc, A .ENABLE_LYC_INTERRUPT .RESET_STAT_INTERRUPT @@ -186,23 +220,23 @@ VBLANK_Entrypoint: STAT_Entrypoint: PUSH AF LD A, $reg_lyc - CP $09 - JR Z, =STAT_.End_Top_Bar + CP $0a + JR Z, =.End_Top_Bar CP $67 - JR Z, =STAT_.Start_dialogue - STAT_.Thin_font: + JR Z, =.Start_dialogue + .Thin_font: LD A, $palette_thin_font LD $reg_bg_palette, A - JR =STAT_.skip_dialogue + JR =.skip_dialogue - STAT_.Start_dialogue: + .Start_dialogue: LD A, $mem_display_flag BIT 0, A - JR Z, =STAT_.skip_dialogue - .ENABLE_WINDOW + JR Z, =.skip_dialogue + .ENABLE_DIALOGUE LD A, $mem_display_flag BIT 1, A - JR Z, =STAT_.Thin_font + JR Z, =.Thin_font LD A, $palette_bold_font LD $reg_bg_palette, A LD A, $77 @@ -211,13 +245,22 @@ STAT_Entrypoint: POP AF RETI - STAT_.skip_dialogue: + .skip_dialogue: .DISABLE_LYC_INTERRUPT POP AF RET - STAT_.End_Top_Bar: - .DISABLE_WINDOW + .End_Top_Bar: + LD A, $mem_display_flag + BIT 3, A + JR Z, =.No_Window + .Window: + .DISABLE_DIALOGUE_WINDOW + JR =.Setup_dialogue_lyc + .No_Window: + .DISABLE_DIALOGUE_NO_WINDOW + + .Setup_dialogue_lyc: LD A, $67 LD $reg_lyc, A .RESET_STAT_INTERRUPT diff --git a/scripts/generate-tiledata.py b/scripts/generate-tiledata.py index 547e9e5..2562e73 100644 --- a/scripts/generate-tiledata.py +++ b/scripts/generate-tiledata.py @@ -28,6 +28,8 @@ print("\n\t; Heart") get_sprite_png_parse_output("./sprites/gui/heart.png") print("\n\t; Cursor") get_sprite_png_parse_output("./sprites/gui/cursor.png") +print("\n\t; Energy") +get_sprite_png_parse_output("./sprites/gui/energy-points.png") sprite_idx = 0x80 print("\nFont_Data:") diff --git a/sprites/font.png b/sprites/font.png Binary files differindex ea05ca9..ff62605 100644 --- a/sprites/font.png +++ b/sprites/font.png diff --git a/sprites/gui/energy-points.png b/sprites/gui/energy-points.png Binary files differnew file mode 100644 index 0000000..ed628a1 --- /dev/null +++ b/sprites/gui/energy-points.png diff --git a/sprites/gui/heart.png b/sprites/gui/heart.png Binary files differindex cd787da..9509acf 100644 --- a/sprites/gui/heart.png +++ b/sprites/gui/heart.png diff --git a/tiles.gbasm b/tiles.gbasm index c9489ea..449f9b9 100644 --- a/tiles.gbasm +++ b/tiles.gbasm @@ -6,7 +6,7 @@ Load_Tile: LD HL, $8800 LD DE, =Font_Data - LD BC, $2b0 + LD BC, $3a0 CALL =memcpy LD HL, $9100 @@ -16,7 +16,7 @@ Load_Tile: LD HL, $9200 LD DE, =BG_Tile_Image_Data - LD BC, $04a0 + LD BC, $04b0 CALL =memcpy LD HL, $8600 @@ -83,3 +83,9 @@ Dialogue_Box_Tilemap_data: .DB 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .DB 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .DB 0x12, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +Cost_Window_Tilemap_data: + .DB 0x11, 0x17, 0x17, 0x17, 0x17, 0x17, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .DB 0x15, 0xab, 0xac, 0xad, 0xae, 0xaf, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .DB 0x15, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .DB 0x12, 0x18, 0x18, 0x18, 0x18, 0x18, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 diff --git a/tileset.gbasm b/tileset.gbasm index 27150f8..204b13e 100644 --- a/tileset.gbasm +++ b/tileset.gbasm @@ -90,11 +90,14 @@ BG_Tile_Image_Data: Small_sprites: ; Heart - .DB $00, $00, $6c, $6c, $fe, $fe, $fe, $fe, $7c, $7c, $38, $38, $10, $10, $00, $00 ; 0x68 + .DB $00, $00, $6c, $6c, $fe, $92, $fe, $82, $7c, $44, $38, $28, $10, $10, $00, $00 ; 0x68 ; Cursor .DB $00, $00, $60, $60, $78, $78, $7e, $7e, $7e, $7e, $78, $78, $60, $60, $00, $00 ; 0x69 + ; Energy + .DB $70, $70, $f8, $88, $fe, $be, $ff, $91, $ff, $b5, $ff, $81, $7e, $76, $08, $08 ; 0x6a + Font_Data: .DB $00, $00, $38, $3c, $44, $46, $44, $46, $44, $46, $44, $46, $38, $3c, $00, $00 ; 0x80 .DB $00, $00, $10, $18, $30, $38, $10, $18, $10, $18, $10, $18, $7c, $7e, $00, $00 ; 0x81 @@ -124,7 +127,7 @@ Font_Data: .DB $00, $00, $78, $7c, $44, $46, $44, $46, $78, $7c, $40, $40, $40, $40, $00, $00 ; 0x99 .DB $00, $00, $38, $3c, $44, $46, $44, $46, $54, $56, $4c, $4e, $3c, $3c, $00, $02 ; 0x9a .DB $00, $00, $78, $7c, $44, $46, $44, $46, $78, $7c, $44, $46, $44, $46, $00, $00 ; 0x9b - .DB $00, $00, $3c, $3e, $60, $60, $38, $3c, $04, $06, $04, $06, $78, $7c, $00, $00 ; 0x9c + .DB $00, $00, $3c, $3e, $40, $60, $38, $3c, $04, $06, $04, $06, $78, $7c, $00, $00 ; 0x9c .DB $00, $00, $7c, $7e, $10, $18, $10, $18, $10, $18, $10, $18, $10, $18, $00, $00 ; 0x9d .DB $00, $00, $44, $46, $44, $46, $44, $46, $44, $46, $44, $46, $38, $3c, $00, $00 ; 0x9e .DB $00, $00, $44, $46, $44, $46, $44, $46, $28, $2c, $28, $2c, $10, $18, $00, $00 ; 0x9f @@ -139,6 +142,21 @@ Font_Data: .DB $00, $00, $10, $18, $10, $18, $20, $30, $00, $00, $00, $00, $00, $00, $00, $00 ; 0xa8 .DB $00, $00, $28, $2c, $28, $2c, $28, $2c, $00, $00, $00, $00, $00, $00, $00, $00 ; 0xa9 .DB $00, $00, $00, $18, $10, $18, $00, $00, $00, $00, $10, $18, $00, $18, $00, $00 ; 0xaa + .DB $00, $00, $3c, $3c, $40, $40, $40, $40, $40, $40, $40, $40, $3c, $3c, $00, $00 ; 0xab + .DB $00, $00, $38, $38, $44, $44, $44, $44, $44, $44, $44, $44, $38, $38, $00, $00 ; 0xac + .DB $00, $00, $3c, $3c, $40, $40, $38, $38, $04, $04, $04, $04, $78, $78, $00, $00 ; 0xad + .DB $00, $00, $7c, $7c, $10, $10, $10, $10, $10, $10, $10, $10, $10, $10, $00, $00 ; 0xae + .DB $00, $00, $00, $00, $10, $10, $00, $00, $00, $00, $10, $10, $00, $00, $00, $00 ; 0xaf + .DB $00, $00, $38, $38, $44, $44, $44, $44, $44, $44, $44, $44, $38, $38, $00, $00 ; 0xb0 + .DB $00, $00, $10, $10, $30, $30, $10, $10, $10, $10, $10, $10, $7c, $7c, $00, $00 ; 0xb1 + .DB $00, $00, $38, $38, $44, $44, $04, $04, $18, $18, $20, $20, $7c, $7c, $00, $00 ; 0xb2 + .DB $00, $00, $78, $78, $04, $04, $38, $38, $04, $04, $04, $04, $78, $78, $00, $00 ; 0xb3 + .DB $00, $00, $08, $08, $18, $18, $28, $28, $48, $48, $7c, $7c, $08, $08, $00, $00 ; 0xb4 + .DB $00, $00, $78, $78, $40, $40, $78, $78, $04, $04, $04, $04, $78, $78, $00, $00 ; 0xb5 + .DB $00, $00, $38, $38, $40, $40, $78, $78, $44, $44, $44, $44, $38, $38, $00, $00 ; 0xb6 + .DB $00, $00, $7c, $7c, $04, $04, $08, $08, $10, $10, $10, $10, $10, $10, $00, $00 ; 0xb7 + .DB $00, $00, $38, $38, $44, $44, $38, $38, $44, $44, $44, $44, $38, $38, $00, $00 ; 0xb8 + .DB $00, $00, $38, $38, $44, $44, $44, $44, $3c, $3c, $04, $04, $38, $38, $00, $00 ; 0xb9 OBJ_Tile_Image_Data: diff --git a/utils.gbasm b/utils.gbasm index 8291ac2..4f7e7f7 100644 --- a/utils.gbasm +++ b/utils.gbasm @@ -145,6 +145,25 @@ Print_8bit: ; Number in A, Memory Tilemap position in HL POP AF RET +Print_8bit_Thin: ; 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 $b0 + LD (HL+), A + + LD A, C + AND $0f ; Then the lowest + OR $b0 + LD (HL+), A + + POP BC + POP AF + RET + Print_str: ; Memory Tilemap position in HL, Text address in BC, FF ended PUSH AF PUSH BC |