[Reverse-engineering] [th02/th04/th05] Stage background tile ring buffer

Funded by -Tom-.
This commit is contained in:
nmlgc 2018-12-27 21:10:47 +01:00
parent 8ee87233b8
commit e1e4f819ed
6 changed files with 87 additions and 1018 deletions

View File

@ -71,3 +71,8 @@ PLAYFIELD_VRAM_X = PLAYFIELD_X / 8
PLAYFIELD_VRAM_W = PLAYFIELD_W / 8
ROW_SIZE = (RES_X / 8)
TILE_W = 16
TILE_H = 16
TILES_Y = 1 + (PLAYFIELD_H / TILE_H) + 1
TILES_X = (PLAYFIELD_W / TILE_W)

4
th02/tiles[bss].asm Normal file
View File

@ -0,0 +1,4 @@
TILE_COUNT = TILES_X * TILES_Y
public _tile_ring
_tile_ring db TILE_COUNT dup(?)

View File

@ -1244,7 +1244,7 @@ loc_44BF:
mov al, map[bx]
mov [si+4DF6h], al
mov bx, [bp+var_2]
mov [bx+si+4E0Fh], al
mov _tile_ring[bx+si], al
inc si
inc cx
@ -1410,12 +1410,12 @@ loc_45CB:
mov al, map[bx+si]
mov bx, 17h
sub bx, di
imul bx, 18h
mov [bx+si+4E0Fh], al
imul bx, TILES_X
mov _tile_ring[bx+si], al
inc si
loc_45ED:
cmp si, 18h
cmp si, TILES_X
jl short loc_45CB
inc di
@ -1569,8 +1569,8 @@ loc_46C6:
loc_46D9:
push [bp+var_2]
mov bx, si
imul bx, 18h
mov al, [bx+di+4E0Fh]
imul bx, TILES_X
mov al, _tile_ring[bx+di]
mov ah, 0
push ax
call sub_4419
@ -1706,8 +1706,8 @@ loc_47B2:
loc_47B9:
mov bx, [bp+var_2]
imul bx, 18h
mov al, [bx+si+4E0Fh]
imul bx, TILES_X
mov al, _tile_ring[bx+si]
mov ah, 0
mov [bp+var_4], ax
push di
@ -1717,7 +1717,7 @@ loc_47B9:
add di, 2
loc_47D1:
cmp si, 18h
cmp si, TILES_X
jl short loc_47B9
inc [bp+var_2]
add [bp+var_6], 500h
@ -1757,7 +1757,7 @@ sub_480C proc far
var_6 = word ptr -6
var_4 = word ptr -4
var_2 = word ptr -2
arg_0 = word ptr 6
@@tile = word ptr 6
arg_2 = word ptr 8
arg_4 = word ptr 0Ah
@ -1779,10 +1779,10 @@ arg_4 = word ptr 0Ah
mov word_22862, 0
mov word_22864, 10h
mov bx, [bp+var_2]
imul bx, 18h
imul bx, TILES_X
add bx, [bp+var_4]
mov al, byte ptr [bp+arg_0]
mov [bx+4E0Fh], al
mov al, byte ptr [bp+@@tile]
mov _tile_ring[bx], al
call sub_43B0
mov dx, 0A6h ; '¦'
mov al, byte_20619
@ -1799,13 +1799,13 @@ arg_4 = word ptr 0Ah
add ax, dx
mov [bp+var_6], ax
push ax
push [bp+arg_0]
push [bp+@@tile]
call sub_43E0
mov dx, 0A6h ; '¦'
mov al, byte_20618
out dx, al
push [bp+var_6]
push [bp+arg_0]
push [bp+@@tile]
call sub_43E0
nopcall egc_off
pop di
@ -38522,156 +38522,7 @@ word_22864 dw ?
dd ? ;
dd ? ;
byte_2287E db ?
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
include th02/tiles[bss].asm
dd ? ;
dd ? ;
dd ? ;

View File

@ -1,5 +1,14 @@
; Each tile defines a 384×80 section of the background, which internally are
; further divided into 5 rows of 16 pixels each.
; No idea why ZUN just didn't go with the actually visible space of 384
; horizontal tiles. That's 8 wasted tiles per row that the game doesn't do
; anything with?
TILES_MEMORY_X = 512 / TILE_W
public _tile_ring
_tile_ring dw (TILES_MEMORY_X * TILES_Y) dup(?)
if GAME eq 5
public _tile_index_ptr
_tile_index_ptr dw ?

View File

@ -1418,7 +1418,7 @@ arg_4 = word ptr 0Ah
pop bx
add bx, ax
mov ax, [bp+arg_0]
mov [bx+4D40h], ax
mov _tile_ring[bx], ax
mov al, [bp+var_1]
mov byte_255BC, al
pop di
@ -1537,7 +1537,7 @@ loc_B896:
loc_B89D:
shl ax, 6
add ax, 4D40h
add ax, offset _tile_ring
mov di, ax
xor ax, ax
mov al, _tile_row
@ -1555,7 +1555,7 @@ loc_B89D:
push ds
mov ax, map_seg
mov ds, ax
mov cx, 18h
mov cx, TILES_X
rep movsw
pop ds
@ -1822,8 +1822,8 @@ sub_BAA2 proc near
push si
push ds
xor bx, bx
mov di, 4D40h
add di, 600h
mov di, offset _tile_ring
add di, TILES_MEMORY_X * (TILES_Y - 1) * 2
xor dx, dx
mov ax, ds
mov es, ax
@ -1843,10 +1843,10 @@ loc_BAC0:
mov ah, 5
loc_BAD4:
mov cx, 0Ch
mov cx, TILES_X / 2
rep movsd
sub di, 70h ; 'p'
sub si, 70h ; 'p'
sub di, (TILES_MEMORY_X + TILES_X) * 2
sub si, (TILES_MEMORY_X + TILES_X) * 2
dec ah
jnz short loc_BAD4
inc bx
@ -1883,7 +1883,7 @@ sub_BAEE proc near
shr ax, 4
shl ax, 6
mov bx, ax
mov si, [bx+4D40h]
mov si, _tile_ring[bx]
mov bx, dx
and bx, 0Fh
mov cx, bx
@ -1909,7 +1909,7 @@ loc_BB49:
xor dh, dh
loc_BB4B:
mov dl, 18h
mov dl, TILES_X
mov word_25109, cx
loc_BB51:
@ -1921,8 +1921,8 @@ loc_BB51:
loc_BB60:
mov bp, es:[si]
mov es:[di], bp
add si, 50h ; 'P'
add di, 50h ; 'P'
add si, ROW_SIZE
add di, ROW_SIZE
loop loc_BB60
or bl, bl
jz short loc_BB8F
@ -1935,7 +1935,7 @@ loc_BB60:
sub bx, 640h
loc_BB87:
mov si, [bx+4D40h]
mov si, _tile_ring[bx]
xor bx, bx
jmp short loc_BB60
; ---------------------------------------------------------------------------
@ -1944,7 +1944,7 @@ loc_BB8F:
mov cx, word_25109
add ax, 2
mov bx, ax
mov si, [bx+4D40h]
mov si, _tile_ring[bx]
dec dl
jnz short loc_BB51
pop di
@ -1966,17 +1966,17 @@ sub_BBA4 proc near
mov bx, 4D20h
mov di, 7A84h
mov dh, 32h ; '2'
mov si, 600h
mov si, TILES_MEMORY_X * (TILES_Y - 1) * 2
loc_BBB9:
mov dl, 18h
mov dl, TILES_X
loc_BBBB:
cmp byte ptr [bx], 0
jz short loc_BBE7
push si
mov byte ptr [bx], 0
mov si, [si+4D40h]
mov si, _tile_ring[si]
test dh, 1
jnz short loc_BBD1
add si, 280h
@ -4195,13 +4195,13 @@ sub_CBB8 proc near
push di
call sub_CBFA
mov di, 7804h
mov bx, 5340h
mov bx, offset _tile_ring[TILES_MEMORY_X * (TILES_Y - 1) * 2]
mov ax, GRAM_400
mov es, ax
assume es:nothing
loc_CBC8:
mov dl, 18h
mov dl, TILES_X
loc_CBCA:
mov si, [bx]
@ -4211,14 +4211,14 @@ loc_CBCA:
loc_CBD0:
mov ax, es:[si]
mov es:[di], ax
add si, 50h ; 'P'
add di, 50h ; 'P'
add si, ROW_SIZE
add di, ROW_SIZE
loop loc_CBD0
sub di, 4FEh
add bx, 2
dec dl
jnz short loc_CBCA
sub bx, 70h ; 'p'
sub bx, (TILES_MEMORY_X + TILES_X) * 2
sub di, 530h
jge short loc_CBC8
call egc_off
@ -8246,9 +8246,9 @@ loc_EAB0:
mov ax, [bx]
loc_EABB:
mov [di+4D40h], ax
add di, 40h
cmp di, 640h
mov _tile_ring[di], ax
add di, (TILES_MEMORY_X * 2)
cmp di, (TILES_MEMORY_X * 2) * TILES_Y
jb short loc_EABB
mov di, dx
@ -8295,7 +8295,7 @@ var_2 = word ptr -2
loc_EB0F:
mov bx, word_22D9C
imul bx, 18h
imul bx, TILES_X
cmp byte ptr [bx+di+199Ch], 2
jnz short loc_EB41
mov al, byte_25668 ; jump table for switch statement
@ -8311,13 +8311,13 @@ loc_EB0F:
mov dx, di
add dx, dx
add bx, dx
mov [bx+4D40h], ax
mov _tile_ring[bx], ax
loc_EB41:
inc di
loc_EB42:
cmp di, 18h
cmp di, TILES_X
jl short loc_EB0F
cmp frame, 1
ja short loc_EB8A
@ -8339,11 +8339,11 @@ loc_EB59:
mov si, di
add si, si
mov ax, [si+190Ch]
mov [bx+4D40h], ax
mov _tile_ring[bx], ax
inc di
loc_EB72:
cmp di, 18h
cmp di, TILES_X
jl short loc_EB59
inc [bp+var_2]
@ -46185,407 +46185,7 @@ map_seg dw ?
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
include th04/formats/tiles[bss].asm
include th04/tiles[bss].asm
dword_266C6 dd ?
frame dw ?
include th03/frame_mod[bss].asm

View File

@ -1798,8 +1798,8 @@ sub_BB9A proc near
push ds
mov bx, _tile_index_ptr
sub bx, 4
mov di, 4FB6h
add di, 600h
mov di, offset _tile_ring
add di, TILES_MEMORY_X * (TILES_Y - 1) * 2
xor dx, dx
mov ax, ds
mov es, ax
@ -1819,10 +1819,10 @@ loc_BBBD:
mov ah, 5
loc_BBCF:
mov cx, 0Ch
mov cx, TILES_X / 2
rep movsd
sub di, 70h ; 'p'
sub si, 70h ; 'p'
sub di, (TILES_MEMORY_X + TILES_X) * 2
sub si, (TILES_MEMORY_X + TILES_X) * 2
dec ah
jnz short loc_BBCF
inc bx
@ -1843,13 +1843,13 @@ sub_BBE8 proc near
push di
call sub_BC2A
mov di, 7804h
mov bx, 55B6h
mov bx, offset _tile_ring[TILES_MEMORY_X * (TILES_Y - 1) * 2]
mov ax, GRAM_400
mov es, ax
assume es:nothing
loc_BBF8:
mov dl, 18h
mov dl, TILES_X
loc_BBFA:
mov si, [bx]
@ -1866,7 +1866,7 @@ loc_BC00:
add bx, 2
dec dl
jnz short loc_BBFA
sub bx, 70h ; 'p'
sub bx, (TILES_MEMORY_X + TILES_X) * 2
sub di, 530h
jge short loc_BBF8
call egc_off
@ -1919,7 +1919,7 @@ sub_BC6A proc near
shr ax, 4
shl ax, 6
mov bx, ax
mov si, [bx+4FB6h]
mov si, _tile_ring[bx]
mov bx, dx
and bx, 0Fh
mov cx, bx
@ -1945,7 +1945,7 @@ loc_BCC5:
xor dh, dh
loc_BCC7:
mov dl, 18h
mov dl, TILES_X
mov word_23F01, cx
loc_BCCD:
@ -1971,7 +1971,7 @@ loc_BCDC:
sub bx, 640h
loc_BD03:
mov si, [bx+4FB6h]
mov si, _tile_ring[bx]
xor bx, bx
jmp short loc_BCDC
; ---------------------------------------------------------------------------
@ -1980,7 +1980,7 @@ loc_BD0B:
mov cx, word_23F01
add ax, 2
mov bx, ax
mov si, [bx+4FB6h]
mov si, _tile_ring[bx]
dec dl
jnz short loc_BCCD
pop di
@ -2037,7 +2037,7 @@ loc_BD81:
loc_BD88:
shl ax, 6
add ax, 4FB6h
add ax, offset _tile_ring
mov di, ax
xor ax, ax
mov al, _tile_row
@ -2054,7 +2054,7 @@ loc_BD88:
push ds
mov ax, map_seg
mov ds, ax
mov cx, 18h
mov cx, TILES_X
rep movsw
pop ds
@ -2206,17 +2206,17 @@ sub_BF46 proc near
mov bx, 4F96h
mov di, 7A84h
mov dh, 32h ; '2'
mov si, 600h
mov si, TILES_MEMORY_X * (TILES_Y - 1) * 2
loc_BF5B:
mov dl, 18h
mov dl, TILES_X
loc_BF5D:
cmp byte ptr [bx], 0
jz short loc_BF89
push si
mov byte ptr [bx], 0
mov si, [si+4FB6h]
mov si, _tile_ring[si]
test dh, 1
jnz short loc_BF73
add si, 280h
@ -2991,7 +2991,7 @@ numerals_draw endp
pop bx
add bx, ax
mov ax, [bp+6]
mov [bx+4FB6h], ax
mov _tile_ring[bx], ax
mov al, [bp-1]
mov byte_2CE00, al
pop di
@ -12735,13 +12735,13 @@ loc_11441:
mov ax, di
add ax, ax
add bx, ax
mov word ptr [bx+4FB6h], 5048h
mov _tile_ring[bx], 5048h
mov bx, [bp+var_2]
shl bx, 6
mov ax, [bp+var_4]
add ax, ax
add bx, ax
mov word ptr [bx+4FB6h], 5048h
mov _tile_ring[bx], 5048h
inc [bp+var_2]
loc_11469:
@ -12773,7 +12773,7 @@ loc_11491:
mov ax, di
add ax, ax
add bx, ax
mov word ptr [bx+4FB6h], 48h ; 'H'
mov _tile_ring[bx], 48h
inc [bp+var_2]
loc_114A6:
@ -44347,407 +44347,7 @@ map_seg dw ?
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
dd ? ;
include th04/formats/tiles[bss].asm
include th04/tiles[bss].asm
dword_25FDC dd ?
frame dw ?
include th03/frame_mod[bss].asm