diff options
author | Astatin <[email protected]> | 2025-06-06 12:30:32 +0200 |
---|---|---|
committer | Astatin <[email protected]> | 2025-06-06 12:30:32 +0200 |
commit | 103260bbab1f6816d578cafb641e7458b66eea15 (patch) | |
tree | 3e2e33ddc4d4ba7fcdefe2783be72a49b92b4523 | |
parent | eca91612b60b5379f9e8d6ce6f51366db54aacc3 (diff) |
Add script to extract build/tileset.png from Load_Tile routine in tiles.gbasm
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | scripts/extract-vram-tileset.py | 47 | ||||
-rw-r--r-- | scripts/generate-tiledata.py | 15 | ||||
-rw-r--r-- | scripts/tileset-dump.gbasm | 10 | ||||
-rw-r--r-- | tiles.gbasm | 12 | ||||
-rw-r--r-- | tileset.gbasm | 27 |
6 files changed, 115 insertions, 6 deletions
@@ -26,6 +26,16 @@ build/main.rom.unsigned: main.gbasm tileset.gbasm text.gbasm dialogues/text.gbas mkdir -p build gbasm $< $@ > build/main.sym +build/tileset-dump.rom: scripts/tileset-dump.gbasm + mkdir -p build + gbasm $< $@ > /dev/null + +build/tileset-dump.rom.vram.dump: build/tileset-dump.rom + gb --skip-bootrom --stop-dump-state $< + +build/tileset.png: build/tileset-dump.rom.vram.dump scripts/extract-vram-tileset.py + python scripts/extract-vram-tileset.py $< $@ + run: build/main.rom mkdir -p recordings gb $< --record-input "./recordings/$(shell date -Iseconds).record" diff --git a/scripts/extract-vram-tileset.py b/scripts/extract-vram-tileset.py new file mode 100644 index 0000000..93b5f8b --- /dev/null +++ b/scripts/extract-vram-tileset.py @@ -0,0 +1,47 @@ +from PIL import Image +import numpy as np +import sys + +colours = [(0xe0, 0xf8, 0xd0), (0x88, 0xc0, 0x70), (0x34, 0x68, 0x56), (0x08, 0x18, 0x20)] + +if len(sys.argv) != 3: + print("Usage: ./extract-vram-tileset.py [vram_dump_file] [output_png]") + sys.exit(-1) + +filename = sys.argv[1] + +output_filename = sys.argv[2] + +file = open(filename, "r") + +vram_text = file.read() + +vram = [int(x, 16) for x in vram_text.split()] + +def parse_tile(image, tile, offset): + for y in range(0, 16, 2): + for x in range(0, 8): + colour_id = 0b00 + colour_id |= (tile[y] >> (7-x)) & 1 + colour_id |= ((tile[y+1] >> (7-x)) & 1) << 1 + image.putpixel((x+offset[0],int(y/2)+offset[1]), colours[colour_id]) + return image + +image = Image.new("RGB", (128,128)) + +x = 0 +y = 0 +for tile_addr in range(0x1000, 0x1800, 0x10): + parse_tile(image, vram[tile_addr:tile_addr + 0x10], (x * 8, y * 8)) + x += 1 + if x == 0x10: + x = 0 + y += 1 +for tile_addr in range(0x800, 0x1000, 0x10): + parse_tile(image, vram[tile_addr:tile_addr + 0x10], (x * 8, y * 8)) + x += 1 + if x == 0x10: + x = 0 + y += 1 + +image.save(output_filename) diff --git a/scripts/generate-tiledata.py b/scripts/generate-tiledata.py index e236fdd..729fc50 100644 --- a/scripts/generate-tiledata.py +++ b/scripts/generate-tiledata.py @@ -14,6 +14,7 @@ def get_sprite_png_parse_output(png, tallmode=False, sprite_1bpp_mode=False): sprite_idx = 0x10 print("GUI_Border_Data:") get_sprite_png_parse_output("./sprites/gui/borders.png") +print("GUI_Border_Data.end:") sprite_idx = 0x20 print("BG_Tile_Image_Data:") @@ -27,6 +28,7 @@ print("\n\t; Leaf") get_sprite_png_parse_output("./sprites/bg/leaf.png") print("\n\t; Box") get_sprite_png_parse_output("./sprites/bg/box.png") +print("BG_Tile_Image_Data.end:") sprite_idx = 0xf0 print("Small_sprites:") @@ -44,10 +46,12 @@ print("\n\t; Freeze status") get_sprite_png_parse_output("./sprites/gui/status-frozen.png") print("\n\t; Poison status") get_sprite_png_parse_output("./sprites/gui/status-poison.png") +print("Small_sprites.end:") sprite_idx = 0x80 print("\nFont_Data:") get_sprite_png_parse_output("./sprites/font.png") +print("\nFont_Data.end:") sprite_idx = 0x02 print("\nOBJ_Tile_Image_Data:") @@ -58,6 +62,7 @@ print("\n\t; Bunny back") get_sprite_png_parse_output("./sprites/bunny/bunny-back.png", tallmode=True) print("\n\t; Bunny front") get_sprite_png_parse_output("./sprites/bunny/bunny-front.png", tallmode=True) +print("\n.Bunny.end:") print("\n.Fox:") print("\n\t; Fox side") @@ -66,6 +71,7 @@ print("\n\t; Fox back") get_sprite_png_parse_output("./sprites/fox/fox-back.png", tallmode=True) print("\n\t; Fox front") get_sprite_png_parse_output("./sprites/fox/fox-front.png", tallmode=True) +print("\n.Fox.end:") print("\n.Cat:") print("\n\t; Cat side") @@ -74,6 +80,7 @@ print("\n\t; Cat back") get_sprite_png_parse_output("./sprites/cat/back.png", tallmode=True) print("\n\t; Cat front") get_sprite_png_parse_output("./sprites/cat/front.png", tallmode=True) +print("\n.Cat.end:") print("\n.Owl:") print("\n\t; Owl side") @@ -82,6 +89,7 @@ print("\n\t; Owl back") get_sprite_png_parse_output("./sprites/owl/back.png", tallmode=True) print("\n\t; Owl front") get_sprite_png_parse_output("./sprites/owl/front.png", tallmode=True) +print("\n.Owl.end:") print("\n.Bug:") print("\n\t; Bug side") @@ -90,6 +98,7 @@ print("\n\t; Bug back") get_sprite_png_parse_output("./sprites/bug/back.png", tallmode=True) print("\n\t; Bug front") get_sprite_png_parse_output("./sprites/bug/front.png", tallmode=True) +print("\n.Bug.end:") print("\n.Mouse:") print("\n\t; Mouse side") @@ -98,6 +107,7 @@ print("\n\t; Mouse back") get_sprite_png_parse_output("./sprites/mouse/back.png", tallmode=True) print("\n\t; Mouse front") get_sprite_png_parse_output("./sprites/mouse/front.png", tallmode=True) +print("\n.Mouse.end:") print("\n.Fimsh:") print("\n\t; Fimsh side") @@ -106,6 +116,7 @@ print("\n\t; Fimsh back") get_sprite_png_parse_output("./sprites/fimsh/back.png", tallmode=True) print("\n\t; Fimsh front") get_sprite_png_parse_output("./sprites/fimsh/front.png", tallmode=True) +print("\n.Fimsh.end:") print("\n.Penguin:") print("\n\t; Penguin side") @@ -114,6 +125,7 @@ print("\n\t; Penguin back") get_sprite_png_parse_output("./sprites/penguin/back.png", tallmode=True) print("\n\t; Penguin front") get_sprite_png_parse_output("./sprites/penguin/front.png", tallmode=True) +print("\n.Penguin.end:") print("\n.Frog:") print("\n\t; Frog side") @@ -122,6 +134,8 @@ print("\n\t; Frog back") get_sprite_png_parse_output("./sprites/frog/back.png", tallmode=True) print("\n\t; Frog front") get_sprite_png_parse_output("./sprites/frog/front.png", tallmode=True) +print("\n.Frog.end:") +print("\nOBJ_Tile_Image_Data.end:") sprite_idx = 0x60 print("\nAnimation_Sprites_Data:") @@ -131,3 +145,4 @@ get_sprite_png_parse_output("./sprites/animations/sparkle2.png", tallmode=True) get_sprite_png_parse_output("./sprites/animations/ball.png", tallmode=True) get_sprite_png_parse_output("./sprites/animations/bubble1.png", tallmode=True) get_sprite_png_parse_output("./sprites/animations/bubble2.png", tallmode=True) +print("\nAnimation_Sprites_Data.end:") diff --git a/scripts/tileset-dump.gbasm b/scripts/tileset-dump.gbasm new file mode 100644 index 0000000..d6015ac --- /dev/null +++ b/scripts/tileset-dump.gbasm @@ -0,0 +1,10 @@ +.PADTO $100 +LD SP, $fffe +CALL =Load_Tile +STOP + +.INCLUDE "definitions.gbasm" +.INCLUDE "utils.gbasm" +.INCLUDE "tileset.gbasm" +.INCLUDE "tiles.gbasm" +Entity_list: diff --git a/tiles.gbasm b/tiles.gbasm index 94e7ca5..b30a114 100644 --- a/tiles.gbasm +++ b/tiles.gbasm @@ -1,32 +1,32 @@ Load_Tile: LD HL, $8020 LD DE, =OBJ_Tile_Image_Data.Bunny - LD BC, $00c0 + LD BC, =OBJ_Tile_Image_Data.Bunny.end-=OBJ_Tile_Image_Data.Bunny CALL =memcpy LD HL, $8800 LD DE, =Font_Data - LD BC, $3a0 + LD BC, =Font_Data.end-=Font_Data CALL =memcpy LD HL, $9100 LD DE, =GUI_Border_Data - LD BC, $00d0 + LD BC, =GUI_Border_Data.end-=GUI_Border_Data CALL =memcpy LD HL, $9200 LD DE, =BG_Tile_Image_Data - LD BC, $0500 + LD BC, =BG_Tile_Image_Data.end-=BG_Tile_Image_Data CALL =memcpy LD HL, $8f00 LD DE, =Small_sprites - LD BC, $0070 + LD BC, =Small_sprites.end-=Small_sprites CALL =memcpy LD HL, $8620 LD DE, =Animation_Sprites_Data - LD BC, $00a0 + LD BC, =Animation_Sprites_Data.end-=Animation_Sprites_Data CALL =memcpy RET diff --git a/tileset.gbasm b/tileset.gbasm index f53d297..f4479f9 100644 --- a/tileset.gbasm +++ b/tileset.gbasm @@ -13,6 +13,7 @@ GUI_Border_Data: .DB $e6, $e2, $e6, $22, $c6, $42, $86, $82, $0e, $02, $fc, $04, $f8, $f8, $00, $00 ; 0x1a .DB $00, $00, $07, $07, $07, $04, $03, $02, $01, $01, $ff, $00, $ff, $ff, $00, $00 ; 0x1b .DB $06, $02, $e6, $e2, $e6, $22, $c6, $42, $8e, $82, $fc, $04, $f8, $f8, $00, $00 ; 0x1c +GUI_Border_Data.end: BG_Tile_Image_Data: ; Trees @@ -104,6 +105,7 @@ BG_Tile_Image_Data: .DB $00, $00, $00, $00, $00, $00, $fc, $fc, $3e, $06, $fa, $0e, $f2, $fe, $d2, $3e ; 0x6d .DB $bf, $86, $f9, $f9, $8b, $89, $9f, $8f, $ff, $80, $80, $ff, $7f, $7f, $00, $00 ; 0x6e .DB $d2, $3e, $f2, $fe, $d2, $3e, $d2, $3e, $92, $7e, $14, $fc, $f8, $f8, $00, $00 ; 0x6f +BG_Tile_Image_Data.end: Small_sprites: ; Heart @@ -126,6 +128,7 @@ Small_sprites: ; Poison status .DB $70, $70, $b8, $88, $f8, $88, $f8, $88, $76, $76, $0b, $09, $0f, $09, $06, $06 ; 0xf6 +Small_sprites.end: Font_Data: .DB $00, $00, $38, $3c, $44, $46, $44, $46, $44, $46, $44, $46, $38, $3c, $00, $00 ; 0x80 @@ -187,6 +190,8 @@ Font_Data: .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 +Font_Data.end: + OBJ_Tile_Image_Data: .Bunny: @@ -209,6 +214,8 @@ OBJ_Tile_Image_Data: .DB $00, $00, $00, $00, $00, $00, $70, $70, $e8, $98, $e8, $b8, $f0, $30, $e0, $e0 ; 0x0c .DB $d0, $70, $e8, $98, $e8, $18, $f8, $08, $f8, $08, $d0, $70, $60, $e0, $c0, $c0 ; 0x0d +.Bunny.end: + .Fox: ; Fox side @@ -229,6 +236,8 @@ OBJ_Tile_Image_Data: .DB $00, $00, $8e, $8e, $de, $d2, $de, $d2, $7e, $e2, $46, $fa, $e2, $be, $e2, $3e ; 0x18 .DB $c2, $fe, $22, $fe, $24, $fc, $64, $fc, $dc, $5c, $c0, $40, $c0, $40, $c0, $c0 ; 0x19 +.Fox.end: + .Cat: ; Cat side @@ -249,6 +258,8 @@ OBJ_Tile_Image_Data: .DB $00, $00, $88, $88, $54, $dc, $d4, $5c, $5e, $d2, $ce, $4a, $8e, $6a, $4e, $ca ; 0x24 .DB $8e, $ea, $ce, $4a, $fe, $72, $fc, $c4, $f8, $f8, $c0, $c0, $c0, $c0, $80, $80 ; 0x25 +.Cat.end: + .Owl: ; Owl side @@ -269,6 +280,8 @@ OBJ_Tile_Image_Data: .DB $00, $00, $e0, $e0, $10, $f0, $68, $98, $68, $d8, $e8, $58, $88, $f8, $04, $fc ; 0x30 .DB $64, $bc, $e4, $3c, $a4, $7c, $64, $bc, $b4, $5c, $5c, $bc, $f0, $f0, $60, $60 ; 0x31 +.Owl.end: + .Bug: ; Bug side @@ -289,6 +302,8 @@ OBJ_Tile_Image_Data: .DB $00, $00, $00, $00, $04, $04, $08, $08, $08, $08, $90, $90, $60, $e0, $c8, $c8 ; 0x3c .DB $e8, $68, $fc, $7c, $34, $f4, $34, $f4, $56, $f6, $b0, $f0, $d8, $d8, $40, $40 ; 0x3d +.Bug.end: + .Mouse: ; Mouse side @@ -309,6 +324,8 @@ OBJ_Tile_Image_Data: .DB $00, $00, $c0, $c0, $20, $20, $00, $00, $00, $00, $b8, $b8, $c4, $fc, $74, $cc ; 0x48 .DB $f4, $cc, $f8, $18, $f8, $58, $f8, $28, $78, $c8, $f8, $88, $d0, $f0, $60, $60 ; 0x49 +.Mouse.end: + .Fimsh: ; Fimsh side @@ -329,6 +346,8 @@ OBJ_Tile_Image_Data: .DB $00, $00, $e0, $e0, $c4, $44, $8c, $8c, $7c, $f4, $fc, $04, $3c, $c4, $84, $7c ; 0x54 .DB $7c, $84, $08, $f8, $f8, $08, $10, $f0, $a0, $60, $c0, $c0, $00, $00, $00, $00 ; 0x55 +.Fimsh.end: + .Penguin: ; Penguin side @@ -349,6 +368,8 @@ OBJ_Tile_Image_Data: .DB $00, $00, $e0, $e0, $f0, $f0, $f0, $b0, $f0, $50, $70, $90, $f0, $30, $f8, $78 ; 0x60 .DB $fc, $7c, $fc, $3c, $fc, $3c, $fc, $3c, $f0, $70, $f0, $f0, $e0, $e0, $00, $70 ; 0x61 +.Penguin.end: + .Frog: ; Frog side @@ -369,6 +390,10 @@ OBJ_Tile_Image_Data: .DB $00, $00, $38, $38, $fc, $c4, $7c, $d4, $7c, $c4, $3c, $fc, $84, $fc, $c6, $7e ; 0x6c .DB $c2, $3e, $c2, $3e, $82, $7e, $d2, $7e, $52, $fe, $8a, $fe, $8c, $fc, $fc, $fc ; 0x6d +.Frog.end: + +OBJ_Tile_Image_Data.end: + Animation_Sprites_Data: ; Sparkles @@ -382,3 +407,5 @@ Animation_Sprites_Data: .DB $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 0x67 .DB $38, $38, $44, $7c, $82, $ce, $82, $de, $82, $fe, $44, $7c, $38, $38, $00, $00 ; 0x68 .DB $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 0x69 + +Animation_Sprites_Data.end: |