Skip to content

Commit

Permalink
[Reverse-engineering] [th01/zunsoft] Identify all global variables
Browse files Browse the repository at this point in the history
Yup, the code for the first ZUN Soft logo is now completely position-
independent and ready to be decompiled.

(Also, TIL that the PC-98 GRCG has hardware support for double-buffering
through page flipping. Heh, at least one feature that makes it a viable system
for games...)
  • Loading branch information
nmlgc committed Jan 13, 2015
1 parent 44146c4 commit 60f6ece
Show file tree
Hide file tree
Showing 10 changed files with 228 additions and 215 deletions.
4 changes: 2 additions & 2 deletions libs/BorlandC/regs.inc
Expand Up @@ -21,8 +21,8 @@ _flags dw ?
WORDREGS ends

REGS union ; (sizeof=0x10, standard type)
x WORDREGS <?>
h BYTEREGS <?>
_w WORDREGS <?>
_h BYTEREGS <?>
REGS ends

SREGS struc ; (sizeof=0x8, standard type)
Expand Down
30 changes: 15 additions & 15 deletions libs/master.lib/draw_trapezoid.asm
Expand Up @@ -59,10 +59,10 @@ PAGE 98,120

; LINEWORK構造体の各メンバの定義
; 名称 - オフセット - 説明
x = 0 ; 現在のx座標
dlx = 2 ; 誤差変数への加算値
s = 4 ; 誤差変数
d = 6 ; 最小横移動量(符号付き)
koizoid_x = 0 ; 現在のx座標
koizoid_dlx = 2 ; 誤差変数への加算値
koizoid_s = 4 ; 誤差変数
koizoid_d = 6 ; 最小横移動量(符号付き)

;-------------------------------------------------------------------------
; draw_trapezoid - 台形の描画
Expand All @@ -82,14 +82,14 @@ d = 6 ; 最小横移動量(符号付き)
draw_trapezoid PROC NEAR
mov AX,ClipYB_adr
mov CS:[koizoid_yb_adr],AX
mov AX,[trapez_a+d]
mov AX,[trapez_a+koizoid_d]
mov CS:[koizoid_trapez_a_d],AX
mov AX,[trapez_b+d]
mov AX,[trapez_b+koizoid_d]
mov CS:[koizoid_trapez_b_d],AX

mov AX,[trapez_a+dlx]
mov AX,[trapez_a+koizoid_dlx]
mov CS:[koizoid_trapez_a_dlx],AX
mov AX,[trapez_b+dlx]
mov AX,[trapez_b+koizoid_dlx]
mov CS:[koizoid_trapez_b_dlx],AX

mov AX,ClipXL
Expand All @@ -102,8 +102,8 @@ draw_trapezoid PROC NEAR

push BP

mov CX,[trapez_a+x]
mov BP,[trapez_b+x]
mov CX,[trapez_a+koizoid_x]
mov BP,[trapez_b+koizoid_x]

@@YLOOP:
; 水平線 (with clipping) start ===================================
Expand Down Expand Up @@ -179,16 +179,16 @@ endif
; 水平線 (with clipping) end ===================================

@@SKIP_HLINE:
add [trapez_a+s],1234h
add [trapez_a+koizoid_s],1234h
org $-2
koizoid_trapez_a_dlx dw ?
mov CX,[trapez_a+x]
mov CX,[trapez_a+koizoid_x]
adc CX,1234h
org $-2
koizoid_trapez_a_d dw ?
mov [trapez_a+x],CX
mov [trapez_a+koizoid_x],CX

add [trapez_b+s],1234h
add [trapez_b+koizoid_s],1234h
org $-2
koizoid_trapez_b_dlx dw ?
adc BP,1234h
Expand All @@ -200,7 +200,7 @@ koizoid_trapez_b_d dw ?
js short @@OWARI
jmp @@YLOOP ; うぐぐ(;_;)
@@OWARI:
mov [trapez_b+x],BP
mov [trapez_b+koizoid_x],BP
pop BP
ret
EVEN
Expand Down
30 changes: 15 additions & 15 deletions libs/master.lib/draw_trapezoidx.asm
Expand Up @@ -59,10 +59,10 @@ PAGE 98,120

; LINEWORK構造体の各メンバの定義
; 名称 - オフセット - 説明
x = 0 ; 現在のx座標
dlx = 2 ; 誤差変数への加算値
s = 4 ; 誤差変数
d = 6 ; 最小横移動量(符号付き)
koizoidx_x = 0 ; 現在のx座標
koizoidx_dlx = 2 ; 誤差変数への加算値
koizoidx_s = 4 ; 誤差変数
koizoidx_d = 6 ; 最小横移動量(符号付き)

;-------------------------------------------------------------------------
; draw_trapezoidx - 台形の描画 高速(機能削減)版
Expand All @@ -77,23 +77,23 @@ d = 6 ; 最小横移動量(符号付き)
;
public draw_trapezoidx
draw_trapezoidx PROC NEAR
mov AX,[trapez_a+d]
mov AX,[trapez_a+koizoidx_d]
mov CS:[koizoidx_trapez_a_d],AX
mov AX,[trapez_b+d]
mov AX,[trapez_b+koizoidx_d]
mov CS:[koizoidx_trapez_b_d],AX

mov AX,[trapez_a+dlx]
mov AX,[trapez_a+koizoidx_dlx]
mov CS:[koizoidx_trapez_a_dlx],AX
mov AX,[trapez_b+dlx]
mov AX,[trapez_b+koizoidx_dlx]
mov CS:[koizoidx_trapez_b_dlx],AX

out 64h,AL ; 'out anywhere' for CPU cache clear
; 64h: PC-9801の CRTV割り込みリセット

push BP

mov BP,[trapez_a+x]
mov CX,[trapez_b+x]
mov BP,[trapez_a+koizoidx_x]
mov CX,[trapez_b+koizoidx_x]

EVEN
@@YLOOP:
Expand Down Expand Up @@ -134,16 +134,16 @@ draw_trapezoidx PROC NEAR
stosw
; 水平線 (without clipping) end ===================================

add [trapez_b+s],1234h
add [trapez_b+koizoidx_s],1234h
org $-2
koizoidx_trapez_b_dlx dw ?
mov CX,[trapez_b+x]
mov CX,[trapez_b+koizoidx_x]
adc CX,1234h
org $-2
koizoidx_trapez_b_d dw ?
mov [trapez_b+x],CX
mov [trapez_b+koizoidx_x],CX

add [trapez_a+s],1234h
add [trapez_a+koizoidx_s],1234h
org $-2
koizoidx_trapez_a_dlx dw ?
adc BP,1234h
Expand All @@ -154,7 +154,7 @@ koizoidx_trapez_a_d dw ?
dec DX ; ylen
jns short @@YLOOP

mov [trapez_a+x],BP
mov [trapez_a+koizoidx_x],BP
pop BP
ret
EVEN
Expand Down
4 changes: 2 additions & 2 deletions libs/master.lib/egc_shift_left_all.asm
Expand Up @@ -47,9 +47,9 @@ func EGC_SHIFT_LEFT_ALL ; egc_shift_left_all() {
push SI
push DI

x = (RETSIZE+1)*2
@@x = (RETSIZE+1)*2

mov BX,[BP+x]
mov BX,[BP+@@x]
mov AL,00000111b ; RegWriteEnable
out 6ah,AL
mov AL,80h ; CGmode = 1
Expand Down
12 changes: 6 additions & 6 deletions libs/master.lib/grcg_hline.asm
Expand Up @@ -57,17 +57,17 @@ func GRCG_HLINE
push DI

; PARAMETERS
xl = (RETSIZE+3)*2
xr = (RETSIZE+2)*2
y = (RETSIZE+1)*2
@@xl = (RETSIZE+3)*2
@@xr = (RETSIZE+2)*2
@@y = (RETSIZE+1)*2

mov DX,[BP+y]
mov DX,[BP+@@y]
sub DX,ClipYT ;
cmp DX,ClipYH ;
ja short @@RETURN ; y がクリップ範囲外 -> skip

mov CX,[BP+xl]
mov BX,[BP+xr]
mov CX,[BP+@@xl]
mov BX,[BP+@@xr]

mov BP,DX ; BP=VRAM ADDR
shl BP,2 ;
Expand Down
12 changes: 6 additions & 6 deletions libs/master.lib/grcg_vline.asm
Expand Up @@ -57,15 +57,15 @@ func GRCG_VLINE
push DI

; PARAMETERS
x = (RETSIZE+3)*2
y1 = (RETSIZE+2)*2
y2 = (RETSIZE+1)*2
@@x = (RETSIZE+3)*2
@@y1 = (RETSIZE+2)*2
@@y2 = (RETSIZE+1)*2

mov AX,ClipYT
mov CX,ClipYH

mov BX,[BP+y1]
mov DX,[BP+y2]
mov BX,[BP+@@y1]
mov DX,[BP+@@y2]
cmp BX,DX
jl short @@GO
xchg BX,DX
Expand All @@ -86,7 +86,7 @@ func GRCG_VLINE
and DX,DI
add DX,CX

mov AX,[BP+x] ; xのクリップ
mov AX,[BP+@@x] ; xのクリップ
cmp AX,ClipXL
jl short @@RETURN
cmp AX,ClipXR
Expand Down
5 changes: 5 additions & 0 deletions libs/master.lib/macros.inc
@@ -1,3 +1,8 @@
Point struc
x dw ?
y dw ?
Point ends

; テキスト画面関係 --------------------------------------------------------

TX_BLACK equ 001h ; テキスト属性
Expand Down
16 changes: 8 additions & 8 deletions libs/master.lib/make_linework.asm
Expand Up @@ -49,10 +49,10 @@ PAGE 98,120

; LINEWORK構造体の各メンバの定義
; 名称 - オフセット - 説明
x = 0 ; 現在のx座標
dlx = 2 ; 誤差変数への加算値
s = 4 ; 誤差変数
d = 6 ; 最小横移動量(符号付き)
make_lin_x = 0 ; 現在のx座標
make_lin_dlx = 2 ; 誤差変数への加算値
make_lin_s = 4 ; 誤差変数
make_lin_d = 6 ; 最小横移動量(符号付き)

;-------------------------------------------------------------------------
; make_linework - DDA LINE用構造体の作成
Expand All @@ -69,7 +69,7 @@ d = 6 ; 最小横移動量(符号付き)
EVEN
make_linework PROC NEAR
push SI
mov [BX+x],DX ; w.x = x1
mov [BX+make_lin_x],DX ; w.x = x1

sub AX,DX ; AX = (x2 - x1)
cmp CX,1
Expand All @@ -78,7 +78,7 @@ make_linework PROC NEAR
idiv CX
cmp DX,8000h
adc AX,-1
mov [BX+d],AX ; w.d = (x2-x1)/(y2-y1)
mov [BX+make_lin_d],AX ; w.d = (x2-x1)/(y2-y1)
cmp DX,8000h
cmc
sbb SI,SI
Expand All @@ -88,8 +88,8 @@ make_linework PROC NEAR
div CX
add AX,SI
xor AX,SI
mov [BX+dlx],AX ; w.dlx = (x2-x1)%(y2-y1)*0x10000L
mov word ptr [BX+s],8000h ; w.s = 8000h
mov [BX+make_lin_dlx],AX ; w.dlx = (x2-x1)%(y2-y1)*0x10000L
mov word ptr [BX+make_lin_s],8000h ; w.s = 8000h
pop SI
ret
EVEN
Expand Down
12 changes: 6 additions & 6 deletions libs/master.lib/super_put.asm
Expand Up @@ -51,16 +51,16 @@ func SUPER_PUT
push SI
push DI

x = (RETSIZE+3)*2
y = (RETSIZE+2)*2
num = (RETSIZE+1)*2
@@x = (RETSIZE+3)*2
@@y = (RETSIZE+2)*2
@@num = (RETSIZE+1)*2

mov BX,[BP+num]
mov BX,[BP+@@num]
shl BX,1 ;integer size & near pointer
mov DX,super_patsize[BX] ;pattern size (1-8)

mov CX,[BP+x]
mov BP,[BP+y]
mov CX,[BP+@@x]
mov BP,[BP+@@y]
mov AX,BP ;-+
shl AX,2 ; |
add BP,AX ; |BP=y*80
Expand Down

0 comments on commit 60f6ece

Please sign in to comment.