maps: Added simple RLE to map converter and loader
authorLukas Krickl <lukas@krickl.dev>
Sat, 21 Jun 2025 08:40:42 +0000 (10:40 +0200)
committerLukas Krickl <lukas@krickl.dev>
Sat, 21 Jun 2025 08:40:42 +0000 (10:40 +0200)
maps/default_map.s
src/map.s
tools/tms2map.py

index 04cbbd5a81487d8053a12488390bf99950b12ecc..e4b0aea7f081cb831988e1135b7f0021110c8883 100644 (file)
@@ -10,197 +10,31 @@ dw bank9000
 
 default_map_bg:
 
-.db 0x65, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x6b, 0x6b, 0x6b, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x65, 0x64, 0x64, 0x64, 0x64, 0x4a, 0x5c, 0x5c
-.db 0x5c, 0x4b, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x5d, 0x7a, 0x7a
-.db 0x7a, 0x4d, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x6c, 0x6a, 0x6b
-.db 0x6b, 0x6d, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x78, 0x78, 0x78
-.db 0x78, 0x78, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x74, 0x74, 0x74
-.db 0x74, 0x74, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x74, 0x74, 0x74
-.db 0x74, 0x74, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x74, 0x74, 0x74
-.db 0x74, 0x74, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x74, 0x74, 0x74
-.db 0x74, 0x74, 0x74, 0x74, 0x74, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x74, 0x74, 0x74, 0x74, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64
-.db 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65
+.db 0x1, 0x65, 0x1f, 0x64, 0x1, 0x64, 0x1, 0x64
+.db 0x3, 0x6b, 0x1b, 0x64, 0x1, 0x64, 0x5, 0x64
+.db 0x2, 0x65, 0x18, 0x64, 0x1, 0x64, 0x5, 0x64
+.db 0x2, 0x65, 0x18, 0x64, 0x1, 0x64, 0x7, 0x64
+.db 0x1, 0x65, 0x4, 0x64, 0x1, 0x4a, 0x3, 0x5c
+.db 0x1, 0x4b, 0xe, 0x64, 0x1, 0x64, 0xc, 0x64
+.db 0x1, 0x5d, 0x3, 0x7a, 0x1, 0x4d, 0xe, 0x64
+.db 0x1, 0x64, 0xc, 0x64, 0x1, 0x6c, 0x1, 0x6a
+.db 0x2, 0x6b, 0x1, 0x6d, 0xe, 0x64, 0x1, 0x64
+.db 0xc, 0x64, 0x5, 0x78, 0xe, 0x64, 0x1, 0x64
+.db 0x1f, 0x64, 0x1, 0x64, 0x1f, 0x64, 0x1, 0x64
+.db 0x4, 0x64, 0x5, 0x74, 0x16, 0x64, 0x1, 0x64
+.db 0x4, 0x64, 0x5, 0x74, 0x16, 0x64, 0x1, 0x64
+.db 0x4, 0x64, 0x5, 0x74, 0x16, 0x64, 0x1, 0x64
+.db 0x4, 0x64, 0x8, 0x74, 0x13, 0x64, 0x1, 0x64
+.db 0x8, 0x64, 0x4, 0x74, 0x13, 0x64, 0x1, 0x64
+.db 0x1f, 0x64, 0x1, 0x64, 0x1f, 0x64, 0x1, 0x64
+.db 0x1f, 0x64, 0x1, 0x64, 0x1f, 0x64, 0x1, 0x64
+.db 0x1f, 0x64, 0x1, 0x64, 0x1f, 0x64, 0x1, 0x64
+.db 0x1f, 0x64, 0x1, 0x64, 0x1f, 0x64, 0x1, 0x64
+.db 0x1e, 0x64, 0x1, 0x65
+.db 0x00 ; termiante data
 default_map_tile_flags:
 
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1
-.db 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1
-.db 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-.db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
+.db 0x22, 0x0, 0x3, 0x1, 0x68, 0x0, 0x5, 0x1
+.db 0x3b, 0x0, 0x4, 0x1, 0xff, 0x0, 0xff, 0x0
+.db 0x31, 0x0
+.db 0x00 ; termiante data
index 777c114af4e99e7d4c935672746c9c03951c01ff..db453b3cd02969d78fdcdc5f33c42fe7d16b1a10 100644 (file)
--- a/src/map.s
+++ b/src/map.s
@@ -109,8 +109,12 @@ map_tiles_load:
   ; this can either be tiles or flags
   ; based on its offset and the compressed ptr 
   ; 
+  ; map compression:
+  ;   maps are using a simple RLE
+  ;   1 byte of length, 1 byte of data
+  ;   the data is terminated with a 0x00 length byte
   ; inputs:
-  ;   hl: compressed map data
+  ;   hl: compressed map data 
   ;   de: target offset (usually 0/1)
 tile_map_compressed_load:
   push hl
@@ -118,28 +122,29 @@ tile_map_compressed_load:
 
   ld hl, map
   add hl, de ; + offset
-  ; de = loop counter
-  ld de, MAP_SIZE
   ; bc = destination
-  ; hl = c_tile  
+  ; hl = rle encoded data  
 
-@loop:
-  ; tile
+@decompress_loop:
+  ; load run length 
   ld a, [bc]
-  inc bc ; bc++
-  ld [hl+], a
-  inc hl ; hl++ to skip over unneeded byte
-
-  ; de--
-  dec de
-
-  ; check if de is 0
-  ld a, d
-  or a, e
   cp a, 0
-  jr nz, @loop REL
+  ret z ; if run length == 0 exit
+  ld d, a ; d = copy coutner
+  
+  inc bc
+  ld a, [bc] ; load data
+  inc bc
+  
+@copy_loop:
+    ld [hl+], a
+    inc hl ; hl++ to skip over unneeded byte
+    
+    dec d
+  jr nz, @copy_loop REL
 
-  ret
+  ; again
+  jr @decompress_loop REL
 
   ; loads a map's state
   ; inputs:
index 0c52a7562b47091076f353a9ad8929d9fa770f1f..61b19f4f912f702629695923cbd4a539ac36c8d5 100755 (executable)
@@ -27,8 +27,26 @@ if len(sys.argv) < 3:
 src = sys.argv[1]
 name = sys.argv[2]
 
-def compress_map(data):
-    return data
+def compress(data, convert):
+    compressed = []
+
+    run_length = 0
+    last_byte = 0
+
+    for i, byte in enumerate(data):
+        if (last_byte != byte and run_length > 0) or run_length >= 255:
+            compressed.append(run_length)
+            compressed.append(convert(last_byte))
+            run_length = 0
+        
+        last_byte = byte
+        run_length += 1
+    
+    if run_length > 0:
+        compressed.append(run_length)
+        compressed.append(convert(last_byte))
+
+    return compressed
 
 
 def convert_val(byte):
@@ -41,10 +59,11 @@ def convert_none(byte):
     return int(byte)
 
 def print_bg_data(data, name, layer):
-    split = compress_map(data.split(","))
+    split = data.split(",")
     print_data(split, name, layer, convert_val)
 
 def print_data(data, name, layer, convert):
+    data = compress(data, convert)
     print(name + "_" + layer + ":")
     for i, byte in enumerate(data):
         end = ', '
@@ -52,7 +71,7 @@ def print_data(data, name, layer, convert):
         if i % 8 == 0: 
             print("\n.db ", end = '');
         
-        val = convert(byte)
+        val = byte
 
         if (i+1) % 8 == 0:
             end = ''
@@ -60,6 +79,8 @@ def print_data(data, name, layer, convert):
             end = '\n'
         print(hex(val), end=end)
 
+    print(".db 0x00 ; termiante data")
+
 def print_bg_flags(data, name, layer):
     split = data.split(",")
     flags = []