From 843905eceaa7f47786c2fd2aa7c866bb334069c2 Mon Sep 17 00:00:00 2001 From: nmlgc Date: Wed, 21 Mar 2018 23:20:04 +0100 Subject: [PATCH] [Reverse-engineering] [th04/th05] ZUN Soft logo explosions Which seemed a nicer and more debuggable intro to how ZUN implements sprites than starting with a random structure from MAIN.EXE. Funded by -Tom-. --- th04/zunsoft.asm | 237 ++++++++ th04/zunsoft[bss].asm | 23 + th04_op.asm | 1182 +--------------------------------------- th05_op.asm | 1188 +---------------------------------------- 4 files changed, 270 insertions(+), 2360 deletions(-) create mode 100644 th04/zunsoft.asm create mode 100644 th04/zunsoft[bss].asm diff --git a/th04/zunsoft.asm b/th04/zunsoft.asm new file mode 100644 index 00000000..f1bff740 --- /dev/null +++ b/th04/zunsoft.asm @@ -0,0 +1,237 @@ +; Spawns [n] new explosions at [origin]. +; [origin] uses screen pixels, *not* the 1/16th-pixel units of the structure. + +; void pascal zunsoft_pyro_new(Point origin, int n, char patnum_base) +_zunsoft_pyro_new proc pascal near + local @@pyros_created:word, @@i:word + arg @@origin:Point, @@n:word, @@patnum_base:byte + + push si + push di + mov di, @@origin.y + mov @@pyros_created, 0 + mov ax, 16 + imul @@origin.x + mov @@origin.x, ax + mov ax, 16 + imul di + mov di, ax + mov si, offset _zunsoft_pyros + mov @@i, 0 + jmp short loc_B68D + +loc_B63E: + cmp [si+zunsoft_pyro_t.alive], 0 + jnz short loc_B687 + mov [si+zunsoft_pyro_t.alive], 1 + mov [si+zunsoft_pyro_t.frame], 0 + mov [si+zunsoft_pyro_t.origin.x], di + mov ax, @@origin.x + mov [si+zunsoft_pyro_t.origin.y], ax + mov [si+zunsoft_pyro_t.distance], 0 + mov [si+zunsoft_pyro_t.distance_prev], 0 + call IRand + mov bx, 224 + cwd + idiv bx + add dx, 64 + mov [si+zunsoft_pyro_t.speed], dx + call IRand + mov [si+zunsoft_pyro_t.angle], al + mov al, @@patnum_base + mov [si+zunsoft_pyro_t.patnum_base], al + inc @@pyros_created + mov ax, @@pyros_created + cmp ax, @@n + jge short loc_B694 + +loc_B687: + inc @@i + add si, size zunsoft_pyro_t + +loc_B68D: + cmp @@i, ZUNSOFT_PYRO_COUNT + jl short loc_B63E + +loc_B694: + pop di + pop si + ret +_zunsoft_pyro_new endp + + +; void pascal zunsoft_update_and_render(void) +_zunsoft_update_and_render proc pascal near + local @@patnum:word, @@draw_y:word, @@draw_x:word, @@anim_sprite:word + + push si + push di + mov si, offset _zunsoft_pyros + xor di, di + jmp loc_B7B9 + +loc_B6A8: + cmp [si+zunsoft_pyro_t.alive], 1 + jnz loc_B7B5 + inc [si+zunsoft_pyro_t.frame] + mov al, [si+zunsoft_pyro_t.frame] + mov ah, 0 + mov bx, 4 + cwd + idiv bx + mov @@anim_sprite, ax + mov al, [si+zunsoft_pyro_t.patnum_base] + mov ah, 0 + add ax, @@anim_sprite + mov @@patnum, ax + cmp [si+zunsoft_pyro_t.frame], 40 + jb short loc_B6DB + mov [si+zunsoft_pyro_t.alive], 0 + mov [si+zunsoft_pyro_t.frame], 0 + jmp loc_B7B5 + +loc_B6DB: + cmp [si+zunsoft_pyro_t.frame], 16 + jnb short loc_B6FA + mov ax, [si+zunsoft_pyro_t.origin.x] + mov bx, 16 + cwd + idiv bx + add ax, -8 + push ax + mov ax, [si+zunsoft_pyro_t.origin.y] + cwd + idiv bx + add ax, -8 + jmp loc_B7AC + +loc_B6FA: + cmp [si+zunsoft_pyro_t.frame], 32 + jnb short loc_B754 + cmp [si+zunsoft_pyro_t.frame], 16 + jnz short loc_B70D + call snd_se_play pascal, 15 + +loc_B70D: + mov ax, [si+zunsoft_pyro_t.distance] + mov [si+zunsoft_pyro_t.distance_prev], ax + mov ax, [si+zunsoft_pyro_t.speed] + add [si+zunsoft_pyro_t.distance], ax + push [si+zunsoft_pyro_t.origin.x] + push [si+zunsoft_pyro_t.distance] + mov al, [si+zunsoft_pyro_t.angle] + mov ah, 0 + add ax, ax + mov bx, ax + push _CosTable8[bx] + call vector1_at + add ax, -128 + mov @@draw_x, ax + push [si+zunsoft_pyro_t.origin.y] + push [si+zunsoft_pyro_t.distance] + mov al, [si+zunsoft_pyro_t.angle] + mov ah, 0 + add ax, ax + mov bx, ax + push _SinTable8[bx] + call vector1_at + add ax, -128 + jmp short loc_B799 + +loc_B754: + mov ax, [si+zunsoft_pyro_t.distance] + mov [si+zunsoft_pyro_t.distance_prev], ax + mov ax, [si+zunsoft_pyro_t.speed] + add [si+zunsoft_pyro_t.distance], ax + push [si+zunsoft_pyro_t.origin.x] + push [si+zunsoft_pyro_t.distance] + mov al, [si+zunsoft_pyro_t.angle] + mov ah, 0 + add ax, ax + mov bx, ax + push _CosTable8[bx] + call vector1_at + add ax, -256 + mov @@draw_x, ax + push [si+zunsoft_pyro_t.origin.y] + push [si+zunsoft_pyro_t.distance] + mov al, [si+zunsoft_pyro_t.angle] + mov ah, 0 + add ax, ax + mov bx, ax + push _SinTable8[bx] + call vector1_at + add ax, -256 + +loc_B799: + mov @@draw_y, ax + mov ax, @@draw_x + mov bx, 16 + cwd + idiv bx + push ax + mov ax, @@draw_y + cwd + idiv bx + +loc_B7AC: + push ax + push @@patnum + call super_put_rect + +loc_B7B5: + inc di + add si, size zunsoft_pyro_t + +loc_B7B9: + cmp di, ZUNSOFT_PYRO_COUNT + jl loc_B6A8 + pop di + pop si + ret +_zunsoft_update_and_render endp + + +; void pascal zunsoft_palette_update_and_show(int tone) +_zunsoft_palette_update_and_show proc near + arg @@tone:word + + push bp + mov bp, sp + push si + push di + xor si, si + jmp short loc_B7F6 + +loc_B7CE: + xor di, di + jmp short loc_B7F0 + +loc_B7D2: + mov bx, si + imul bx, 3 + mov al, _zunsoft_palette[bx+di] + mov ah, 0 + imul @@tone + mov bx, 100 + cwd + idiv bx + mov bx, si + imul bx, 3 + mov Palettes[bx+di], al + inc di + +loc_B7F0: + cmp di, 3 + jl short loc_B7D2 + inc si + +loc_B7F6: + cmp si, 15 + jl short loc_B7CE + call palette_show + pop di + pop si + pop bp + retn 2 +_zunsoft_palette_update_and_show endp diff --git a/th04/zunsoft[bss].asm b/th04/zunsoft[bss].asm new file mode 100644 index 00000000..746691c1 --- /dev/null +++ b/th04/zunsoft[bss].asm @@ -0,0 +1,23 @@ +; Copy of the palette used during the logo, to allow non-blocking fades in +; contrast to master.lib's blocking palette_black_in() and palette_black_out() +; functions. (Then again, master.lib has the PaletteTone global for that...) +_zunsoft_palette db 48 dup(?) + +; ZUN Soft logo explosion structure. +; These are only animated by increasing the distance; origin, angle, and speed +; stay constant. +; For increased precision, all coordinates (origin, distance, and speed) are +; stored in units of 1/16th of a pixel. +zunsoft_pyro_t struc + alive db ? + frame db ? ; since creation + origin Point ? + distance_prev dw ? ; unused + distance dw ? + speed dw ? + angle db ? + patnum_base db ? ; displayed sprite is incremented every 4 frames +zunsoft_pyro_t ends + +ZUNSOFT_PYRO_COUNT = 256 +_zunsoft_pyros zunsoft_pyro_t ZUNSOFT_PYRO_COUNT dup() diff --git a/th04_op.asm b/th04_op.asm index c138574e..6063f846 100644 --- a/th04_op.asm +++ b/th04_op.asm @@ -2412,272 +2412,7 @@ sub_B9CE proc near retn sub_B9CE endp - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_BA45 proc near - -var_4 = word ptr -4 -var_2 = word ptr -2 -arg_0 = byte ptr 4 -arg_2 = word ptr 6 -arg_4 = word ptr 8 -arg_6 = word ptr 0Ah - - enter 4, 0 - push si - push di - mov di, [bp+arg_6] - mov [bp+var_4], 0 - mov ax, 10h - imul [bp+arg_4] - mov [bp+arg_4], ax - mov ax, 10h - imul di - mov di, ax - mov si, 2B7Ch - mov [bp+var_2], 0 - jmp short loc_BABC -; --------------------------------------------------------------------------- - -loc_BA6D: - cmp byte ptr [si], 0 - jnz short loc_BAB6 - mov byte ptr [si], 1 - mov byte ptr [si+1], 0 - mov [si+2], di - mov ax, [bp+arg_4] - mov [si+4], ax - mov word ptr [si+8], 0 - mov word ptr [si+6], 0 - call IRand - mov bx, 0E0h - cwd - idiv bx - add dx, 40h - mov [si+0Ah], dx - call IRand - mov [si+0Ch], al - mov al, [bp+arg_0] - mov [si+0Dh], al - inc [bp+var_4] - mov ax, [bp+var_4] - cmp ax, [bp+arg_2] - jge short loc_BAC3 - -loc_BAB6: - inc [bp+var_2] - add si, 0Eh - -loc_BABC: - cmp [bp+var_2], 100h - jl short loc_BA6D - -loc_BAC3: - pop di - pop si - leave - retn 8 -sub_BA45 endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_BAC9 proc near - -var_8 = word ptr -8 -var_6 = word ptr -6 -var_4 = word ptr -4 -var_2 = word ptr -2 - - enter 8, 0 - push si - push di - mov si, 2B7Ch - xor di, di - jmp loc_BBE8 -; --------------------------------------------------------------------------- - -loc_BAD7: - cmp byte ptr [si], 1 - jnz loc_BBE4 - inc byte ptr [si+1] - mov al, [si+1] - mov ah, 0 - mov bx, 4 - cwd - idiv bx - mov [bp+var_2], ax - mov al, [si+0Dh] - mov ah, 0 - add ax, [bp+var_2] - mov [bp+var_8], ax - cmp byte ptr [si+1], 28h ; '(' - jb short loc_BB0A - mov byte ptr [si], 0 - mov byte ptr [si+1], 0 - jmp loc_BBE4 -; --------------------------------------------------------------------------- - -loc_BB0A: - cmp byte ptr [si+1], 10h - jnb short loc_BB29 - mov ax, [si+2] - mov bx, 10h - cwd - idiv bx - add ax, 0FFF8h - push ax - mov ax, [si+4] - cwd - idiv bx - add ax, 0FFF8h - jmp loc_BBDB -; --------------------------------------------------------------------------- - -loc_BB29: - cmp byte ptr [si+1], 20h ; ' ' - jnb short loc_BB83 - cmp byte ptr [si+1], 10h - jnz short loc_BB3C - call snd_se_play pascal, 15 - -loc_BB3C: - mov ax, [si+8] - mov [si+6], ax - mov ax, [si+0Ah] - add [si+8], ax - push word ptr [si+2] - push word ptr [si+8] - mov al, [si+0Ch] - mov ah, 0 - add ax, ax - mov bx, ax - push _CosTable8[bx] - call vector1_at - add ax, 0FF80h - mov [bp+var_4], ax - push word ptr [si+4] - push word ptr [si+8] - mov al, [si+0Ch] - mov ah, 0 - add ax, ax - mov bx, ax - push _SinTable8[bx] - call vector1_at - add ax, 0FF80h - jmp short loc_BBC8 -; --------------------------------------------------------------------------- - -loc_BB83: - mov ax, [si+8] - mov [si+6], ax - mov ax, [si+0Ah] - add [si+8], ax - push word ptr [si+2] - push word ptr [si+8] - mov al, [si+0Ch] - mov ah, 0 - add ax, ax - mov bx, ax - push _CosTable8[bx] - call vector1_at - add ax, 0FF00h - mov [bp+var_4], ax - push word ptr [si+4] - push word ptr [si+8] - mov al, [si+0Ch] - mov ah, 0 - add ax, ax - mov bx, ax - push _SinTable8[bx] - call vector1_at - add ax, 0FF00h - -loc_BBC8: - mov [bp+var_6], ax - mov ax, [bp+var_4] - mov bx, 10h - cwd - idiv bx - push ax - mov ax, [bp+var_6] - cwd - idiv bx - -loc_BBDB: - push ax - push [bp+var_8] - call super_put_rect - -loc_BBE4: - inc di - add si, 0Eh - -loc_BBE8: - cmp di, 100h - jl loc_BAD7 - pop di - pop si - leave - retn -sub_BAC9 endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_BBF4 proc near - -arg_0 = word ptr 4 - - push bp - mov bp, sp - push si - push di - xor si, si - jmp short loc_BC25 -; --------------------------------------------------------------------------- - -loc_BBFD: - xor di, di - jmp short loc_BC1F -; --------------------------------------------------------------------------- - -loc_BC01: - mov bx, si - imul bx, 3 - mov al, [bx+di+2B4Ch] - mov ah, 0 - imul [bp+arg_0] - mov bx, 64h ; 'd' - cwd - idiv bx - mov bx, si - imul bx, 3 - mov [bx+di+1A96h], al - inc di - -loc_BC1F: - cmp di, 3 - jl short loc_BC01 - inc si - -loc_BC25: - cmp si, 0Fh - jl short loc_BBFD - call far ptr palette_show - pop di - pop si - pop bp - retn 2 -sub_BBF4 endp - +include th04/zunsoft.asm ; =============== S U B R O U T I N E ======================================= @@ -2890,11 +2625,11 @@ loc_BE10: push 0Ah loc_BE12: - call sub_BA45 + call _zunsoft_pyro_new loc_BE15: call sub_E490 ; default - call sub_BAC9 + call _zunsoft_update_and_render call far ptr sub_E1DC loc_BE22: @@ -2923,7 +2658,7 @@ loc_BE5B: mov al, [bp+var_3] mov ah, 0 push ax - call sub_BBF4 + call _zunsoft_palette_update_and_show jmp short loc_BE81 ; --------------------------------------------------------------------------- @@ -7841,914 +7576,7 @@ byte_11E56 db ? db ? ; word_11E88 dw ? word_11E8A 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 ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - 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/zunsoft[bss].asm dd ? ; dd ? ; dd ? ; diff --git a/th05_op.asm b/th05_op.asm index 3884ab73..88e10100 100644 --- a/th05_op.asm +++ b/th05_op.asm @@ -2355,272 +2355,7 @@ sub_B5A6 proc near retn sub_B5A6 endp - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_B616 proc near - -var_4 = word ptr -4 -var_2 = word ptr -2 -arg_0 = byte ptr 4 -arg_2 = word ptr 6 -arg_4 = word ptr 8 -arg_6 = word ptr 0Ah - - enter 4, 0 - push si - push di - mov di, [bp+arg_6] - mov [bp+var_4], 0 - mov ax, 10h - imul [bp+arg_4] - mov [bp+arg_4], ax - mov ax, 10h - imul di - mov di, ax - mov si, 3F84h - mov [bp+var_2], 0 - jmp short loc_B68D -; --------------------------------------------------------------------------- - -loc_B63E: - cmp byte ptr [si], 0 - jnz short loc_B687 - mov byte ptr [si], 1 - mov byte ptr [si+1], 0 - mov [si+2], di - mov ax, [bp+arg_4] - mov [si+4], ax - mov word ptr [si+8], 0 - mov word ptr [si+6], 0 - call IRand - mov bx, 0E0h - cwd - idiv bx - add dx, 40h - mov [si+0Ah], dx - call IRand - mov [si+0Ch], al - mov al, [bp+arg_0] - mov [si+0Dh], al - inc [bp+var_4] - mov ax, [bp+var_4] - cmp ax, [bp+arg_2] - jge short loc_B694 - -loc_B687: - inc [bp+var_2] - add si, 0Eh - -loc_B68D: - cmp [bp+var_2], 100h - jl short loc_B63E - -loc_B694: - pop di - pop si - leave - retn 8 -sub_B616 endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_B69A proc near - -var_8 = word ptr -8 -var_6 = word ptr -6 -var_4 = word ptr -4 -var_2 = word ptr -2 - - enter 8, 0 - push si - push di - mov si, 3F84h - xor di, di - jmp loc_B7B9 -; --------------------------------------------------------------------------- - -loc_B6A8: - cmp byte ptr [si], 1 - jnz loc_B7B5 - inc byte ptr [si+1] - mov al, [si+1] - mov ah, 0 - mov bx, 4 - cwd - idiv bx - mov [bp+var_2], ax - mov al, [si+0Dh] - mov ah, 0 - add ax, [bp+var_2] - mov [bp+var_8], ax - cmp byte ptr [si+1], 28h ; '(' - jb short loc_B6DB - mov byte ptr [si], 0 - mov byte ptr [si+1], 0 - jmp loc_B7B5 -; --------------------------------------------------------------------------- - -loc_B6DB: - cmp byte ptr [si+1], 10h - jnb short loc_B6FA - mov ax, [si+2] - mov bx, 10h - cwd - idiv bx - add ax, 0FFF8h - push ax - mov ax, [si+4] - cwd - idiv bx - add ax, 0FFF8h - jmp loc_B7AC -; --------------------------------------------------------------------------- - -loc_B6FA: - cmp byte ptr [si+1], 20h ; ' ' - jnb short loc_B754 - cmp byte ptr [si+1], 10h - jnz short loc_B70D - call snd_se_play pascal, 15 - -loc_B70D: - mov ax, [si+8] - mov [si+6], ax - mov ax, [si+0Ah] - add [si+8], ax - push word ptr [si+2] - push word ptr [si+8] - mov al, [si+0Ch] - mov ah, 0 - add ax, ax - mov bx, ax - push _CosTable8[bx] - call vector1_at - add ax, 0FF80h - mov [bp+var_4], ax - push word ptr [si+4] - push word ptr [si+8] - mov al, [si+0Ch] - mov ah, 0 - add ax, ax - mov bx, ax - push _SinTable8[bx] - call vector1_at - add ax, 0FF80h - jmp short loc_B799 -; --------------------------------------------------------------------------- - -loc_B754: - mov ax, [si+8] - mov [si+6], ax - mov ax, [si+0Ah] - add [si+8], ax - push word ptr [si+2] - push word ptr [si+8] - mov al, [si+0Ch] - mov ah, 0 - add ax, ax - mov bx, ax - push _CosTable8[bx] - call vector1_at - add ax, 0FF00h - mov [bp+var_4], ax - push word ptr [si+4] - push word ptr [si+8] - mov al, [si+0Ch] - mov ah, 0 - add ax, ax - mov bx, ax - push _SinTable8[bx] - call vector1_at - add ax, 0FF00h - -loc_B799: - mov [bp+var_6], ax - mov ax, [bp+var_4] - mov bx, 10h - cwd - idiv bx - push ax - mov ax, [bp+var_6] - cwd - idiv bx - -loc_B7AC: - push ax - push [bp+var_8] - call super_put_rect - -loc_B7B5: - inc di - add si, 0Eh - -loc_B7B9: - cmp di, 100h - jl loc_B6A8 - pop di - pop si - leave - retn -sub_B69A endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_B7C5 proc near - -arg_0 = word ptr 4 - - push bp - mov bp, sp - push si - push di - xor si, si - jmp short loc_B7F6 -; --------------------------------------------------------------------------- - -loc_B7CE: - xor di, di - jmp short loc_B7F0 -; --------------------------------------------------------------------------- - -loc_B7D2: - mov bx, si - imul bx, 3 - mov al, [bx+di+3F54h] - mov ah, 0 - imul [bp+arg_0] - mov bx, 64h ; 'd' - cwd - idiv bx - mov bx, si - imul bx, 3 - mov [bx+di+2E1Eh], al - inc di - -loc_B7F0: - cmp di, 3 - jl short loc_B7D2 - inc si - -loc_B7F6: - cmp si, 0Fh - jl short loc_B7CE - call far ptr palette_show - pop di - pop si - pop bp - retn 2 -sub_B7C5 endp - +include th04/zunsoft.asm ; =============== S U B R O U T I N E ======================================= @@ -2832,11 +2567,11 @@ loc_B9D5: push 0Ah loc_B9D7: - call sub_B616 + call _zunsoft_pyro_new loc_B9DA: call sub_D6F0 ; default - call sub_B69A + call _zunsoft_update_and_render loc_B9E2: cmp vsync_Count1, 2 @@ -2864,7 +2599,7 @@ loc_BA1B: mov al, [bp+var_3] mov ah, 0 push ax - call sub_B7C5 + call _zunsoft_palette_update_and_show jmp short loc_BA41 ; --------------------------------------------------------------------------- @@ -8633,920 +8368,7 @@ word_12EFE dw ? dd ? ; word_12F30 dw ? word_12F32 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 ? ; -word_12FE0 dw ? -word_12FE2 dw ? -dword_12FE4 dd ? -word_12FE8 dw ? -word_12FEA 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 ? ; -byte_130EC db ? - db ? -word_130EE dw ? -word_130F0 dw ? -byte_130F2 db ? -byte_130F3 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 ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - 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/zunsoft[bss].asm dd ? ; dd ? ; dd ? ;