aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAstatin <[email protected]>2025-06-06 12:30:32 +0200
committerAstatin <[email protected]>2025-06-06 12:30:32 +0200
commit103260bbab1f6816d578cafb641e7458b66eea15 (patch)
tree3e2e33ddc4d4ba7fcdefe2783be72a49b92b4523
parenteca91612b60b5379f9e8d6ce6f51366db54aacc3 (diff)
Add script to extract build/tileset.png from Load_Tile routine in tiles.gbasm
-rw-r--r--Makefile10
-rw-r--r--scripts/extract-vram-tileset.py47
-rw-r--r--scripts/generate-tiledata.py15
-rw-r--r--scripts/tileset-dump.gbasm10
-rw-r--r--tiles.gbasm12
-rw-r--r--tileset.gbasm27
6 files changed, 115 insertions, 6 deletions
diff --git a/Makefile b/Makefile
index 8318a40..d471a23 100644
--- a/Makefile
+++ b/Makefile
@@ -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: