晴れのちおおさわぎ!(PC-98,カクテル・ソフト)ADVSHELL.COM解析(その1)からの続き。
最初の1行だけ重複してます。
3B66:074C E8 0001 call sub_13 ; (0750)
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0678, 074C ;ディスクリザルト,ディスクリセットルーチン
;##########################################################################
3B66:0750 sub_13 proc near
3B66:0750 2B C0 sub ax,ax ; AX=0000H
3B66:0752 8E C0 mov es,ax ; ES=0000H
3B66:0754 ,BB 0564 mov bx,0564h ;
3B66:0757 B0 C0 mov al,0C0h
3B66:0759 B9 0004 mov cx,4
3B66:075C locloop_27: ; xref 3B66:0762
3B66:075C 26: 08 07 or es:[bx],al
3B66:075F 83 C3 08 add bx,8
3B66:0762 E2 F8 loop locloop_27 ; Loop if cx > 0
3B66:0764 B4 0D mov ah,0Dh
3B66:0766 CD 21 int 21h ; DOS Services ah=function 0Dh
; flush disk buffers to disk
3B66:0768 C3 retn
sub_13 endp
3B66:074F C3 retn ;==================================================================
sub_12 endp
3B66:0793 E8 FEF4 call sub_10 ; (068A)
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0793
;##########################################################################
3B66:068A sub_10 proc near
3B66:068A 56 push si ; SI退避
3B66:068B 06 push es ; ES退避
3B66:068C 2B F6 sub si,si ; SI=0000H
3B66:068E B8 0002 mov ax,2 ; AX=0002H
3B66:0691 B1 21 mov cl,21h ; CL=21H
3B66:0693 D3 E8 shr ax,cl ; AXを21H回右シフト。AX=0000H,
; Shift w/zeros fill
3B66:0695 A9 0001 test ax,1 ; ZF=0
3B66:0698 74 39 jz 06D3h ; Jump if zero,ZF=1なら06D3Hへ
3B66:069A 46 inc si ; SI=0001H
3B66:069B 1E push ds ; DS退避
3B66:069C 2B C0 sub ax,ax ; AX=0000H
3B66:069E 8E D8 mov ds,ax ; DS=0000H
3B66:06A0 ,BB 0018 mov bx,0018 ; BX=0018H
3B66:06A3 8B 07 mov ax,[bx] ; AX=DS:[0018H],STOPキーの割込ベクタオフセットのメモリ
3B66:06A5 2E: A3 06DC mov cs:[06DCH],ax ; CS:[06DCH]にSTOPキーの割込ベクタオフセットのメモリを代入
3B66:06A9 8B 47 02 mov ax,[bx+2] ; AX=DS:[001AH],STOPキーの割込ベクタセグメントのメモリ
3B66:06AC 2E: A3 06DE mov cs:[06DEH],ax ; CS:[06DEH]に=STOPキーの割込ベクタセグメントのメモリを代入
3B66:06B0 B8 06E0 mov ax,6E0h ; AX=6E0H
3B66:06B3 89 07 mov [bx],ax ; DS:[0018H],STOPキーの割込ベクタオフセットのメモリを6E0Hに書き換え
3B66:06B5 8C 4F 02 mov [bx+2],cs ; DS:[001AH],STOPキーの割込ベクタセグメントのメモリをCS:に書き換え
; [001AH]:[0018H]=本来のSTOPキーの割込ベクタを[06DEH]:[06DCH]にコピーし,
; STOPキーの割込ベクタをCS:[06E0H]にコピーした
3B66:06B8 2B C0 sub ax,ax ; AX=0000H
3B66:06BA BB 00FF mov bx,0FFh ; BX=00FFH
3B66:06BD 0F ;* pop cs ; DS=CS,Dangerous-8088 only
3B66:06BE BE 2EC3 mov si,2EC3h ; SI=2EC3H
3B66:06C1 C4 16 06DC les dx,dword ptr ds:06DCh ; Load seg:offset ptr,word load reg and ES
; DXに[06DCH],ESにDS:,=本来のSTOPキーの割込ベクタのメモリをロード
3B66:06C5 ,BB 0018 mov bx,0018 ; BX=0018H
3B66:06C8 89 17 mov [bx],dx ; [0018H]にDS:[06DCH]を代入
3B66:06CA 8C 47 02 mov [bx+2],es ; [001AH]にDS:を代入 ;★本来のSTOPキーの割込ベクタの内容に戻っただけか?
3B66:06CD 1F pop ds ; DS復帰
3B66:06CE 0B C0 or ax,ax ; Zero ? AX=0000HなのでZF=1
3B66:06D0 74 01 jz 06D3h ; Jump if zero ZF=1なので06D3Hへ
3B66:06D2 46 inc si ; SI=2EC4H
3B66:06D3 loc_23: ; xref 3B66:0698, 06D0
3B66:06D3 8B C6 mov ax,si ; 06D0HからきたときはSI=23C3H=AX
3B66:06D5 A2 0616 mov [0616h],al ; [0616H]=C3H
3B66:06D8 07 pop es ; ES復帰
3B66:06D9 5E pop si ; SI復帰
3B66:06DA C3 retn
sub_10 endp
3B66:0796 0E push cs ;
3B66:0797 07 pop es ; ES=CS
3B66:0798 BB 061E mov bx,61Eh ; BX=061EH
3B66:079B 83 C3 0F add bx,0Fh ; BX=062DH
3B66:079E B1 04 mov cl,4 ; CL=04H
3B66:07A0 D3 EB shr bx,cl ; BXを4H回右シフト。BX=0062H
; Shift w/zeros fill
3B66:07A2 C3 retn
sub_14 endp
3B66:020E B4 4A mov ah,4Ah ; 割り当てられたメモリブロックのサイズ変更。メモリ開放処理。
3B66:0210 CD 21 int 21h ; DOS Services ah=function 4Ah, ES=メモリ領域のセグメントアドレス
; change memory allocation BX==開放したいメモリの大きさ(パラグラフ)
; bx=bytes/16, es=mem segment
3B66:0212 ,BA 0368 mov dx,0368H ; DX=0368H,文字列'メモリーが解放できません。$'
3B66:0215 73 07 jnc 021Eh ; Jump if carry=0, CF=0(エラーなし)なら0021EHへ
3B66:0217 90 nop
ADVSHELL endp
;**********************************************************************************************
;メモリ解放エラー発生時
3B66:0218 sub_1 proc near
3B66:0218 loc_1: ; xref 3B66:0254
3B66:0218 E8 0069 call 0284h ; (0284) エラー文字列表示ルーチンへ
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0218 ; エラー文字列表示ルーチン
;##########################################################################
3B66:0284 sub_3 proc near
3B66:0284 B4 09 mov ah,9 ; DX=0368Hで飛んできた。文字列 'メモリーが解放できません。$'
3B66:0286 CD 21 int 21h ; DOS Services ah=function 09h 文字列の表示,DS:DXから$までの文字列を画面に表示
; display char string at ds:dx
3B66:0288 loc_10: ; xref 3B66:028A
3B66:0288 ,FA cli ; Disable interrupts 外部割込禁止
3B66:0289 F4 hlt ; Halt processor 割込がかかるまでCPUを停止させる
3B66:028A EB FC jmp short loc_10 ; (0288)
sub_3 endp
;メモリ解放エラー発生時処理終了
;**********************************************************************************************
;使われない処理?
3B66:021B 90 nop
3B66:021C loc_2: ; xref 3B66:021C
3B66:021C EB FE jmp short loc_2 ; (021C) 無限ループ
sub_1 endp
;メモリ解放成功時 プログラムロード準備ルーチン
3B66:021E loc_3: ; xref 3B66:0215
3B66:021E ,BE 03FA mov si,03FAH ; SI=03FAH
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[03FAH],INT 0FEHの割込ベクタセグメントアドレス
3B66:0223 84 C0 test al,al ; (3B66:03FA=01H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=03C0H=[03FBH]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=03A3H=[03FDH]
3B66:0230 83 C6 05 add si,5 ; SI=03FFH
3B66:0233 FE C8 dec al ; AL=00H
3B66:0235 74 18 jz 024Fh ; Jump if zero
3B66:0237 FE C8 dec al
3B66:0239 74 08 jz 0243h ; Jump if zero
3B66:023B FE C8 dec al
3B66:023D 75 10 jnz 024Fh ; Jump if not zero
3B66:023F B0 02 mov al,2 ; AL=02H
3B66:0241 EB 08 jmp short 024Bh ; (024B)
3B66:0243 loc_7: ; xref 3B66:0239
3B66:0243 2A C0 sub al,al ; AL=00H
3B66:0245 8B D9 mov bx,cx
3B66:0247 CD F1 int 0F1h ; ??INT Non-standard interrupt
3B66:0249 B0 01 mov al,1 ; AL=01H
3B66:024B loc_8: ; xref 3B66:0241
3B66:024B CD F1 int 0F1h ; ??INT Non-standard interrupt
3B66:024D EB D2 jmp short 0221h ; (0221)
3B66:024F loc_9: ; xref 3B66:0235, 023D
3B66:024F 56 push si ; SI退避,SI=03FFH
3B66:0250 E8 0005 call sub_2 ; (0258)
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0250
;##########################################################################
3B66:0258 sub_2 proc near ; CX=03C0H,DX=03A3H(='MUSDRV.COM')
3B66:0258 0E push cs
3B66:0259 07 pop es ; CS=ES,パラメータブロックセグメントアドレス
3B66:025A FE 06 03A0 inc byte ptr [03A0h] ; (3B66:03A0=30H='0')インクリメントして31H='1'
3B66:025E ,BB 041E mov bx,041Eh ; BX=041EH,パラメータブロックオフセットアドレス
; パラメータブロックはCS:041EH
3B66:0261 C7 07 0000 mov word ptr [bx],0 ; DS:[041EH]=0000H ;041EH以下のメモリ書き換え
3B66:0265 89 4F 02 mov [bx+2],cx ; DS:[0420H]=CX=03C0H ;041E 00 00
3B66:0268 8C 5F 04 mov [bx+4],ds ; DS:[0422H]=DS ;0420 C0 03 DS DS 5C 00 DS DS
3B66:026B C7 47 06 005C mov word ptr [bx+6],5Ch ; DS:[0424H]=005CH ;0428 6C 00 DS DS
3B66:0270 8C 5F 08 mov [bx+8],ds ; DS:[0426H]=DS
3B66:0273 C7 47 0A 006C mov word ptr [bx+0Ah],6Ch ; DS:[0428H]=006CH
3B66:0278 8C 5F 0C mov [bx+0Ch],ds ; DS:[042AH]=DS
3B66:027B B8 4B00 mov ax,4B00h ; プログラムのロードと実行
; DS:DX==実行可能プログラムファイルのASCIIZパス名の位置,パス名はNULLで終わらなければならない。
; ES:BX=パラメータブロックの位置 (03C0=00 0D) ドライブ番号0H:カレント,リターンキーのキャラクターコード
3B66:027E CD 21 int 21h ; DOS Services ah=function 4Bh
; run progm @ds:dx, parm @es:bx INT 0F0Hのアドレスにロードした?
3B66:0280 BA 0383 mov dx,383h ; 文字列'プログラムが起動できません。(1)$'
3B66:0283 C3 retn
sub_2 endp
3B66:0253 5E pop si ; SI復帰,SI=03FFH
3B66:0254 72 C2 jc 0218h ; Jump if carry Set エラーなければCF=0でスルー,エラーがあればCF=1なので0218Hへ
;**********************************************************************************************
;プログラムロードエラー発生時
3B66:0218 sub_1 proc near
3B66:0218 loc_1: ; xref 3B66:0254
3B66:0218 E8 0069 call 0284h ; (0284) エラー文字列表示ルーチンへ
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0218 ; エラー文字列表示ルーチン
;##########################################################################
3B66:0284 sub_3 proc near
3B66:0284 B4 09 mov ah,9 ; DX=0383Hで飛んできた。文字列 'プログラムが起動できません。(0)$'
3B66:0286 CD 21 int 21h ; DOS Services ah=function 09h 文字列の表示,DS:DXから$までの文字列を画面に表示
; display char string at ds:dx
3B66:0288 loc_10: ; xref 3B66:028A
3B66:0288 ,FA cli ; Disable interrupts 外部割込禁止
3B66:0289 F4 hlt ; Halt processor 割込がかかるまでCPUを停止させる
3B66:028A EB FC jmp short loc_10 ; (0288)
sub_3 endp
;**********************************************************************************************
;プログラムロード成功時
3B66:0256 EB C9 jmp short 0221h ; (0221),SI=03FFH
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[03FFH]
3B66:0223 84 C0 test al,al ; (3B66:03FF=01H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=03C4H=[0400H]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=03AEH=[0402H]
3B66:0230 83 C6 05 add si,5 ; SI=0404H
3B66:0233 FE C8 dec al ; AL=00H
3B66:0235 74 18 jz 024Fh ; Jump if zero
(省略)
3B66:024F loc_9: ; xref 3B66:0235, 023D
3B66:024F 56 push si ; SI退避,SI=0404H
3B66:0250 E8 0005 call sub_2 ; (0258)
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0250
;##########################################################################
3B66:0258 sub_2 proc near ; CX=03C4H,DX=03AEH(='HARE.EXE')
3B66:0258 0E push cs
3B66:0259 07 pop es ; CS=ES,パラメータブロックセグメントアドレス
3B66:025A FE 06 03A0 inc byte ptr [03A0h] ; (3B66:03A0=31H='1')インクリメントして32H='2'
3B66:025E ,BB 041E mov bx,041Eh ; BX=041EH,パラメータブロックオフセットアドレス
; パラメータブロックはCS:041EH
3B66:0261 C7 07 0000 mov word ptr [bx],0 ; DS:[041EH]=0000H ;041EH以下のメモリ書き換え
3B66:0265 89 4F 02 mov [bx+2],cx ; DS:[0420H]=CX=03C4H ;041E 00 00
3B66:0268 8C 5F 04 mov [bx+4],ds ; DS:[0422H]=DS ;0420 C4 03 DS DS 5C 00 DS DS
3B66:026B C7 47 06 005C mov word ptr [bx+6],5Ch ; DS:[0424H]=005CH,第1FCB ;0428 6C 00 DS DS
3B66:0270 8C 5F 08 mov [bx+8],ds ; DS:[0426H]=DS
3B66:0273 C7 47 0A 006C mov word ptr [bx+0Ah],6Ch ; DS:[0428H]=006CH,第2FCB
3B66:0278 8C 5F 0C mov [bx+0Ch],ds ; DS:[042AH]=DS
3B66:027B B8 4B00 mov ax,4B00h ; プログラムのロードと実行
; DS:DX=パス名の位置,ES:BX=パラメータブロックの位置(03C4=02 20 31 0D)
;ドライブ番号2=B:半角スペース'1'リターンキー
3B66:027E CD 21 int 21h ; DOS Services ah=function 4Bh
; run progm @ds:dx, parm @es:bx INT 0F1Hのアドレスにロードした?
3B66:0280 BA 0383 mov dx,383h ; 文字列'プログラムが起動できません。(2)$'
3B66:0283 C3 retn
sub_2 endp
3B66:0253 5E pop si ; SI復帰,SI=0404H
3B66:0254 72 C2 jc 0218h ; Jump if carry Set エラーなければCF=0でスルー,エラーがあればCF=1なので0218Hへ
3B66:0256 EB C9 jmp short 0221h ; (0221)
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[0404H]=02H
3B66:0223 84 C0 test al,al ; (3B66:0404=02H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=03EAH=[0405H]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=0000H=[0407H]
3B66:0230 83 C6 05 add si,5 ; SI=0409H
3B66:0233 FE C8 dec al ; AL=01H
3B66:0235 74 18 jz 024Fh ; Jump if zero 0じゃないのでスルー
3B66:0237 FE C8 dec al ; AL=00H
3B66:0239 74 08 jz 0243h ; Jump if zero 0なので0243Hへ
(省略)
3B66:0243 loc_7: ; xref 3B66:0239
3B66:0243 2A C0 sub al,al ; AL=00H
3B66:0245 8B D9 mov bx,cx ; BX=03EAH(03EA=42 3A 5C 4D 55 53 5C 48 4F 2D 4F 50 4E 2E 4D 00)
;'B:\MUS\HO-OPN.M'
3B66:0247 CD F1 int 0F1h ; INT 0F1H ;HARE.EXEを実行
3B66:0249 B0 01 mov al,1 ; AL=01H
3B66:024B loc_8: ; xref 3B66:0241
3B66:024B CD F1 int 0F1h ; INT 0F1H ;AL=01Hで再びHARE.EXEを実行か?
3B66:024D EB D2 jmp short 0221h ; (0221)
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[0409H]=01H
3B66:0223 84 C0 test al,al ; (3B66:0409=01H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=03CAH=[040AH]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=03AEH=[040CH]
3B66:0230 83 C6 05 add si,5 ; SI=040EH
3B66:0233 FE C8 dec al ; AL=00H
3B66:0235 74 18 jz 024Fh ; Jump if zero 0なので024FHへ
(省略)
3B66:024F loc_9: ; xref 3B66:0235, 023D
3B66:024F 56 push si ; SI退避,SI=040EH
3B66:0250 E8 0005 call sub_2 ; (0258)
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0250
;##########################################################################
3B66:0258 sub_2 proc near ; CX=03CAH,DX=03AEH(='HARE.EXE')
3B66:0258 0E push cs
3B66:0259 07 pop es ; CS=ES,パラメータブロックセグメントアドレス
3B66:025A FE 06 03A0 inc byte ptr [03A0h] ; (3B66:03A0=32H='2')インクリメントして33H='3'
3B66:025E ,BB 041E mov bx,041Eh ; BX=041EH,パラメータブロックオフセットアドレス
; パラメータブロックはCS:041EH
3B66:0261 C7 07 0000 mov word ptr [bx],0 ; DS:[041EH]=0000H ;041EH以下のメモリ書き換え
3B66:0265 89 4F 02 mov [bx+2],cx ; DS:[0420H]=CX=03CAH ;041E 00 00
3B66:0268 8C 5F 04 mov [bx+4],ds ; DS:[0422H]=DS ;0420 CA 03 DS DS 5C 00 DS DS
3B66:026B C7 47 06 005C mov word ptr [bx+6],5Ch ; DS:[0424H]=005CH ;0428 6C 00 DS DS
3B66:0270 8C 5F 08 mov [bx+8],ds ; DS:[0426H]=DS
3B66:0273 C7 47 0A 006C mov word ptr [bx+0Ah],6Ch ; DS:[0428H]=006CH
3B66:0278 8C 5F 0C mov [bx+0Ch],ds ; DS:[042AH]=DS
3B66:027B B8 4B00 mov ax,4B00h ; プログラムのロードと実行
; DS:DX=パス名の位置,ES:BX=パラメータブロックの位置(03CA=02 20 32 0D)
3B66:027E CD 21 int 21h ; DOS Services ah=function 4Bh =B:半角スペース'2'リターンキー
; run progm @ds:dx, parm @es:bx INT 0F2Hのアドレスにロードした?
3B66:0280 BA 0383 mov dx,383h ; 文字列'プログラムが起動できません。(3)$'
3B66:0283 C3 retn
sub_2 endp
3B66:0253 5E pop si ; SI復帰,SI=040EH
3B66:0254 72 C2 jc 0218h ; Jump if carry Set エラーなければCF=0でスルー,エラーがあればCF=1なので0218Hへ
3B66:0256 EB C9 jmp short 0221h ; (0221)
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[040EH]=03H
3B66:0223 84 C0 test al,al ; (3B66:0404=03H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=0000H=[040FH]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=0000H=[0411H]
3B66:0230 83 C6 05 add si,5 ; SI=0413H
3B66:0233 FE C8 dec al ; AL=02H
3B66:0235 74 18 jz 024Fh ; Jump if zero 0じゃないのでスルー
3B66:0237 FE C8 dec al ; AL=01H
3B66:0239 74 08 jz 0243h ; Jump if zero 0じゃないのでスルー
3B66:023B FE C8 dec al ; AL=00H
3B66:023D 75 10 jnz 024Fh ; Jump if not zero 0なのでスルー
3B66:023F B0 02 mov al,2 ; AL=02H
3B66:0241 EB 08 jmp short 024Bh ; (024B)
(省略)
3B66:024B loc_8: ; xref 3B66:0241
3B66:024B CD F1 int 0F1h ; AL=02HでHARE.EXE?
3B66:024D EB D2 jmp short 0221h ; (0221)
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[0413H]=01H
3B66:0223 84 C0 test al,al ; (3B66:0413=01H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=03D6H=[0414H]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=03B7H=[0416H]
3B66:0230 83 C6 05 add si,5 ; SI=0418H
3B66:0233 FE C8 dec al ; AL=00H
3B66:0235 74 18 jz 024Fh ; Jump if zero 0なので024FHへ
(省略)
3B66:024F loc_9: ; xref 3B66:0235, 023D
3B66:024F 56 push si ; SI退避,SI=0418H
3B66:0250 E8 0005 call sub_2 ; (0258)
以下,その3に続く。
晴れのちおおさわぎ!(PC-98,カクテル・ソフト)ADVSHELL.COM解析(その1)はこちら。
晴れのちおおさわぎ!(PC-98,カクテル・ソフト)ADVSHELL.COM解析(その3)はこちら。
<<著作権に関して>>
本記事に引用している全てのソフトの名称・画像の著作権・その他権利は、制作、販売されたソフトハウス、メーカー、または作者様に帰属します。本サイトでの上記著作物の取扱いは、著作権など各権利関係を侵害することが目的ではありません。問題などある場合は、メール(gekigangarあっとmail.goo.ne.jp)にてその旨お知らせください。
最初の1行だけ重複してます。
3B66:074C E8 0001 call sub_13 ; (0750)
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0678, 074C ;ディスクリザルト,ディスクリセットルーチン
;##########################################################################
3B66:0750 sub_13 proc near
3B66:0750 2B C0 sub ax,ax ; AX=0000H
3B66:0752 8E C0 mov es,ax ; ES=0000H
3B66:0754 ,BB 0564 mov bx,0564h ;
3B66:0757 B0 C0 mov al,0C0h
3B66:0759 B9 0004 mov cx,4
3B66:075C locloop_27: ; xref 3B66:0762
3B66:075C 26: 08 07 or es:[bx],al
3B66:075F 83 C3 08 add bx,8
3B66:0762 E2 F8 loop locloop_27 ; Loop if cx > 0
3B66:0764 B4 0D mov ah,0Dh
3B66:0766 CD 21 int 21h ; DOS Services ah=function 0Dh
; flush disk buffers to disk
3B66:0768 C3 retn
sub_13 endp
3B66:074F C3 retn ;==================================================================
sub_12 endp
3B66:0793 E8 FEF4 call sub_10 ; (068A)
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0793
;##########################################################################
3B66:068A sub_10 proc near
3B66:068A 56 push si ; SI退避
3B66:068B 06 push es ; ES退避
3B66:068C 2B F6 sub si,si ; SI=0000H
3B66:068E B8 0002 mov ax,2 ; AX=0002H
3B66:0691 B1 21 mov cl,21h ; CL=21H
3B66:0693 D3 E8 shr ax,cl ; AXを21H回右シフト。AX=0000H,
; Shift w/zeros fill
3B66:0695 A9 0001 test ax,1 ; ZF=0
3B66:0698 74 39 jz 06D3h ; Jump if zero,ZF=1なら06D3Hへ
3B66:069A 46 inc si ; SI=0001H
3B66:069B 1E push ds ; DS退避
3B66:069C 2B C0 sub ax,ax ; AX=0000H
3B66:069E 8E D8 mov ds,ax ; DS=0000H
3B66:06A0 ,BB 0018 mov bx,0018 ; BX=0018H
3B66:06A3 8B 07 mov ax,[bx] ; AX=DS:[0018H],STOPキーの割込ベクタオフセットのメモリ
3B66:06A5 2E: A3 06DC mov cs:[06DCH],ax ; CS:[06DCH]にSTOPキーの割込ベクタオフセットのメモリを代入
3B66:06A9 8B 47 02 mov ax,[bx+2] ; AX=DS:[001AH],STOPキーの割込ベクタセグメントのメモリ
3B66:06AC 2E: A3 06DE mov cs:[06DEH],ax ; CS:[06DEH]に=STOPキーの割込ベクタセグメントのメモリを代入
3B66:06B0 B8 06E0 mov ax,6E0h ; AX=6E0H
3B66:06B3 89 07 mov [bx],ax ; DS:[0018H],STOPキーの割込ベクタオフセットのメモリを6E0Hに書き換え
3B66:06B5 8C 4F 02 mov [bx+2],cs ; DS:[001AH],STOPキーの割込ベクタセグメントのメモリをCS:に書き換え
; [001AH]:[0018H]=本来のSTOPキーの割込ベクタを[06DEH]:[06DCH]にコピーし,
; STOPキーの割込ベクタをCS:[06E0H]にコピーした
3B66:06B8 2B C0 sub ax,ax ; AX=0000H
3B66:06BA BB 00FF mov bx,0FFh ; BX=00FFH
3B66:06BD 0F ;* pop cs ; DS=CS,Dangerous-8088 only
3B66:06BE BE 2EC3 mov si,2EC3h ; SI=2EC3H
3B66:06C1 C4 16 06DC les dx,dword ptr ds:06DCh ; Load seg:offset ptr,word load reg and ES
; DXに[06DCH],ESにDS:,=本来のSTOPキーの割込ベクタのメモリをロード
3B66:06C5 ,BB 0018 mov bx,0018 ; BX=0018H
3B66:06C8 89 17 mov [bx],dx ; [0018H]にDS:[06DCH]を代入
3B66:06CA 8C 47 02 mov [bx+2],es ; [001AH]にDS:を代入 ;★本来のSTOPキーの割込ベクタの内容に戻っただけか?
3B66:06CD 1F pop ds ; DS復帰
3B66:06CE 0B C0 or ax,ax ; Zero ? AX=0000HなのでZF=1
3B66:06D0 74 01 jz 06D3h ; Jump if zero ZF=1なので06D3Hへ
3B66:06D2 46 inc si ; SI=2EC4H
3B66:06D3 loc_23: ; xref 3B66:0698, 06D0
3B66:06D3 8B C6 mov ax,si ; 06D0HからきたときはSI=23C3H=AX
3B66:06D5 A2 0616 mov [0616h],al ; [0616H]=C3H
3B66:06D8 07 pop es ; ES復帰
3B66:06D9 5E pop si ; SI復帰
3B66:06DA C3 retn
sub_10 endp
3B66:0796 0E push cs ;
3B66:0797 07 pop es ; ES=CS
3B66:0798 BB 061E mov bx,61Eh ; BX=061EH
3B66:079B 83 C3 0F add bx,0Fh ; BX=062DH
3B66:079E B1 04 mov cl,4 ; CL=04H
3B66:07A0 D3 EB shr bx,cl ; BXを4H回右シフト。BX=0062H
; Shift w/zeros fill
3B66:07A2 C3 retn
sub_14 endp
3B66:020E B4 4A mov ah,4Ah ; 割り当てられたメモリブロックのサイズ変更。メモリ開放処理。
3B66:0210 CD 21 int 21h ; DOS Services ah=function 4Ah, ES=メモリ領域のセグメントアドレス
; change memory allocation BX==開放したいメモリの大きさ(パラグラフ)
; bx=bytes/16, es=mem segment
3B66:0212 ,BA 0368 mov dx,0368H ; DX=0368H,文字列'メモリーが解放できません。$'
3B66:0215 73 07 jnc 021Eh ; Jump if carry=0, CF=0(エラーなし)なら0021EHへ
3B66:0217 90 nop
ADVSHELL endp
;**********************************************************************************************
;メモリ解放エラー発生時
3B66:0218 sub_1 proc near
3B66:0218 loc_1: ; xref 3B66:0254
3B66:0218 E8 0069 call 0284h ; (0284) エラー文字列表示ルーチンへ
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0218 ; エラー文字列表示ルーチン
;##########################################################################
3B66:0284 sub_3 proc near
3B66:0284 B4 09 mov ah,9 ; DX=0368Hで飛んできた。文字列 'メモリーが解放できません。$'
3B66:0286 CD 21 int 21h ; DOS Services ah=function 09h 文字列の表示,DS:DXから$までの文字列を画面に表示
; display char string at ds:dx
3B66:0288 loc_10: ; xref 3B66:028A
3B66:0288 ,FA cli ; Disable interrupts 外部割込禁止
3B66:0289 F4 hlt ; Halt processor 割込がかかるまでCPUを停止させる
3B66:028A EB FC jmp short loc_10 ; (0288)
sub_3 endp
;メモリ解放エラー発生時処理終了
;**********************************************************************************************
;使われない処理?
3B66:021B 90 nop
3B66:021C loc_2: ; xref 3B66:021C
3B66:021C EB FE jmp short loc_2 ; (021C) 無限ループ
sub_1 endp
;メモリ解放成功時 プログラムロード準備ルーチン
3B66:021E loc_3: ; xref 3B66:0215
3B66:021E ,BE 03FA mov si,03FAH ; SI=03FAH
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[03FAH],INT 0FEHの割込ベクタセグメントアドレス
3B66:0223 84 C0 test al,al ; (3B66:03FA=01H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=03C0H=[03FBH]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=03A3H=[03FDH]
3B66:0230 83 C6 05 add si,5 ; SI=03FFH
3B66:0233 FE C8 dec al ; AL=00H
3B66:0235 74 18 jz 024Fh ; Jump if zero
3B66:0237 FE C8 dec al
3B66:0239 74 08 jz 0243h ; Jump if zero
3B66:023B FE C8 dec al
3B66:023D 75 10 jnz 024Fh ; Jump if not zero
3B66:023F B0 02 mov al,2 ; AL=02H
3B66:0241 EB 08 jmp short 024Bh ; (024B)
3B66:0243 loc_7: ; xref 3B66:0239
3B66:0243 2A C0 sub al,al ; AL=00H
3B66:0245 8B D9 mov bx,cx
3B66:0247 CD F1 int 0F1h ; ??INT Non-standard interrupt
3B66:0249 B0 01 mov al,1 ; AL=01H
3B66:024B loc_8: ; xref 3B66:0241
3B66:024B CD F1 int 0F1h ; ??INT Non-standard interrupt
3B66:024D EB D2 jmp short 0221h ; (0221)
3B66:024F loc_9: ; xref 3B66:0235, 023D
3B66:024F 56 push si ; SI退避,SI=03FFH
3B66:0250 E8 0005 call sub_2 ; (0258)
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0250
;##########################################################################
3B66:0258 sub_2 proc near ; CX=03C0H,DX=03A3H(='MUSDRV.COM')
3B66:0258 0E push cs
3B66:0259 07 pop es ; CS=ES,パラメータブロックセグメントアドレス
3B66:025A FE 06 03A0 inc byte ptr [03A0h] ; (3B66:03A0=30H='0')インクリメントして31H='1'
3B66:025E ,BB 041E mov bx,041Eh ; BX=041EH,パラメータブロックオフセットアドレス
; パラメータブロックはCS:041EH
3B66:0261 C7 07 0000 mov word ptr [bx],0 ; DS:[041EH]=0000H ;041EH以下のメモリ書き換え
3B66:0265 89 4F 02 mov [bx+2],cx ; DS:[0420H]=CX=03C0H ;041E 00 00
3B66:0268 8C 5F 04 mov [bx+4],ds ; DS:[0422H]=DS ;0420 C0 03 DS DS 5C 00 DS DS
3B66:026B C7 47 06 005C mov word ptr [bx+6],5Ch ; DS:[0424H]=005CH ;0428 6C 00 DS DS
3B66:0270 8C 5F 08 mov [bx+8],ds ; DS:[0426H]=DS
3B66:0273 C7 47 0A 006C mov word ptr [bx+0Ah],6Ch ; DS:[0428H]=006CH
3B66:0278 8C 5F 0C mov [bx+0Ch],ds ; DS:[042AH]=DS
3B66:027B B8 4B00 mov ax,4B00h ; プログラムのロードと実行
; DS:DX==実行可能プログラムファイルのASCIIZパス名の位置,パス名はNULLで終わらなければならない。
; ES:BX=パラメータブロックの位置 (03C0=00 0D) ドライブ番号0H:カレント,リターンキーのキャラクターコード
3B66:027E CD 21 int 21h ; DOS Services ah=function 4Bh
; run progm @ds:dx, parm @es:bx INT 0F0Hのアドレスにロードした?
3B66:0280 BA 0383 mov dx,383h ; 文字列'プログラムが起動できません。(1)$'
3B66:0283 C3 retn
sub_2 endp
3B66:0253 5E pop si ; SI復帰,SI=03FFH
3B66:0254 72 C2 jc 0218h ; Jump if carry Set エラーなければCF=0でスルー,エラーがあればCF=1なので0218Hへ
;**********************************************************************************************
;プログラムロードエラー発生時
3B66:0218 sub_1 proc near
3B66:0218 loc_1: ; xref 3B66:0254
3B66:0218 E8 0069 call 0284h ; (0284) エラー文字列表示ルーチンへ
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0218 ; エラー文字列表示ルーチン
;##########################################################################
3B66:0284 sub_3 proc near
3B66:0284 B4 09 mov ah,9 ; DX=0383Hで飛んできた。文字列 'プログラムが起動できません。(0)$'
3B66:0286 CD 21 int 21h ; DOS Services ah=function 09h 文字列の表示,DS:DXから$までの文字列を画面に表示
; display char string at ds:dx
3B66:0288 loc_10: ; xref 3B66:028A
3B66:0288 ,FA cli ; Disable interrupts 外部割込禁止
3B66:0289 F4 hlt ; Halt processor 割込がかかるまでCPUを停止させる
3B66:028A EB FC jmp short loc_10 ; (0288)
sub_3 endp
;**********************************************************************************************
;プログラムロード成功時
3B66:0256 EB C9 jmp short 0221h ; (0221),SI=03FFH
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[03FFH]
3B66:0223 84 C0 test al,al ; (3B66:03FF=01H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=03C4H=[0400H]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=03AEH=[0402H]
3B66:0230 83 C6 05 add si,5 ; SI=0404H
3B66:0233 FE C8 dec al ; AL=00H
3B66:0235 74 18 jz 024Fh ; Jump if zero
(省略)
3B66:024F loc_9: ; xref 3B66:0235, 023D
3B66:024F 56 push si ; SI退避,SI=0404H
3B66:0250 E8 0005 call sub_2 ; (0258)
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0250
;##########################################################################
3B66:0258 sub_2 proc near ; CX=03C4H,DX=03AEH(='HARE.EXE')
3B66:0258 0E push cs
3B66:0259 07 pop es ; CS=ES,パラメータブロックセグメントアドレス
3B66:025A FE 06 03A0 inc byte ptr [03A0h] ; (3B66:03A0=31H='1')インクリメントして32H='2'
3B66:025E ,BB 041E mov bx,041Eh ; BX=041EH,パラメータブロックオフセットアドレス
; パラメータブロックはCS:041EH
3B66:0261 C7 07 0000 mov word ptr [bx],0 ; DS:[041EH]=0000H ;041EH以下のメモリ書き換え
3B66:0265 89 4F 02 mov [bx+2],cx ; DS:[0420H]=CX=03C4H ;041E 00 00
3B66:0268 8C 5F 04 mov [bx+4],ds ; DS:[0422H]=DS ;0420 C4 03 DS DS 5C 00 DS DS
3B66:026B C7 47 06 005C mov word ptr [bx+6],5Ch ; DS:[0424H]=005CH,第1FCB ;0428 6C 00 DS DS
3B66:0270 8C 5F 08 mov [bx+8],ds ; DS:[0426H]=DS
3B66:0273 C7 47 0A 006C mov word ptr [bx+0Ah],6Ch ; DS:[0428H]=006CH,第2FCB
3B66:0278 8C 5F 0C mov [bx+0Ch],ds ; DS:[042AH]=DS
3B66:027B B8 4B00 mov ax,4B00h ; プログラムのロードと実行
; DS:DX=パス名の位置,ES:BX=パラメータブロックの位置(03C4=02 20 31 0D)
;ドライブ番号2=B:半角スペース'1'リターンキー
3B66:027E CD 21 int 21h ; DOS Services ah=function 4Bh
; run progm @ds:dx, parm @es:bx INT 0F1Hのアドレスにロードした?
3B66:0280 BA 0383 mov dx,383h ; 文字列'プログラムが起動できません。(2)$'
3B66:0283 C3 retn
sub_2 endp
3B66:0253 5E pop si ; SI復帰,SI=0404H
3B66:0254 72 C2 jc 0218h ; Jump if carry Set エラーなければCF=0でスルー,エラーがあればCF=1なので0218Hへ
3B66:0256 EB C9 jmp short 0221h ; (0221)
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[0404H]=02H
3B66:0223 84 C0 test al,al ; (3B66:0404=02H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=03EAH=[0405H]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=0000H=[0407H]
3B66:0230 83 C6 05 add si,5 ; SI=0409H
3B66:0233 FE C8 dec al ; AL=01H
3B66:0235 74 18 jz 024Fh ; Jump if zero 0じゃないのでスルー
3B66:0237 FE C8 dec al ; AL=00H
3B66:0239 74 08 jz 0243h ; Jump if zero 0なので0243Hへ
(省略)
3B66:0243 loc_7: ; xref 3B66:0239
3B66:0243 2A C0 sub al,al ; AL=00H
3B66:0245 8B D9 mov bx,cx ; BX=03EAH(03EA=42 3A 5C 4D 55 53 5C 48 4F 2D 4F 50 4E 2E 4D 00)
;'B:\MUS\HO-OPN.M'
3B66:0247 CD F1 int 0F1h ; INT 0F1H ;HARE.EXEを実行
3B66:0249 B0 01 mov al,1 ; AL=01H
3B66:024B loc_8: ; xref 3B66:0241
3B66:024B CD F1 int 0F1h ; INT 0F1H ;AL=01Hで再びHARE.EXEを実行か?
3B66:024D EB D2 jmp short 0221h ; (0221)
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[0409H]=01H
3B66:0223 84 C0 test al,al ; (3B66:0409=01H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=03CAH=[040AH]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=03AEH=[040CH]
3B66:0230 83 C6 05 add si,5 ; SI=040EH
3B66:0233 FE C8 dec al ; AL=00H
3B66:0235 74 18 jz 024Fh ; Jump if zero 0なので024FHへ
(省略)
3B66:024F loc_9: ; xref 3B66:0235, 023D
3B66:024F 56 push si ; SI退避,SI=040EH
3B66:0250 E8 0005 call sub_2 ; (0258)
;##########################################################################
; SUBROUTINE
;
; Called from: 3B66:0250
;##########################################################################
3B66:0258 sub_2 proc near ; CX=03CAH,DX=03AEH(='HARE.EXE')
3B66:0258 0E push cs
3B66:0259 07 pop es ; CS=ES,パラメータブロックセグメントアドレス
3B66:025A FE 06 03A0 inc byte ptr [03A0h] ; (3B66:03A0=32H='2')インクリメントして33H='3'
3B66:025E ,BB 041E mov bx,041Eh ; BX=041EH,パラメータブロックオフセットアドレス
; パラメータブロックはCS:041EH
3B66:0261 C7 07 0000 mov word ptr [bx],0 ; DS:[041EH]=0000H ;041EH以下のメモリ書き換え
3B66:0265 89 4F 02 mov [bx+2],cx ; DS:[0420H]=CX=03CAH ;041E 00 00
3B66:0268 8C 5F 04 mov [bx+4],ds ; DS:[0422H]=DS ;0420 CA 03 DS DS 5C 00 DS DS
3B66:026B C7 47 06 005C mov word ptr [bx+6],5Ch ; DS:[0424H]=005CH ;0428 6C 00 DS DS
3B66:0270 8C 5F 08 mov [bx+8],ds ; DS:[0426H]=DS
3B66:0273 C7 47 0A 006C mov word ptr [bx+0Ah],6Ch ; DS:[0428H]=006CH
3B66:0278 8C 5F 0C mov [bx+0Ch],ds ; DS:[042AH]=DS
3B66:027B B8 4B00 mov ax,4B00h ; プログラムのロードと実行
; DS:DX=パス名の位置,ES:BX=パラメータブロックの位置(03CA=02 20 32 0D)
3B66:027E CD 21 int 21h ; DOS Services ah=function 4Bh =B:半角スペース'2'リターンキー
; run progm @ds:dx, parm @es:bx INT 0F2Hのアドレスにロードした?
3B66:0280 BA 0383 mov dx,383h ; 文字列'プログラムが起動できません。(3)$'
3B66:0283 C3 retn
sub_2 endp
3B66:0253 5E pop si ; SI復帰,SI=040EH
3B66:0254 72 C2 jc 0218h ; Jump if carry Set エラーなければCF=0でスルー,エラーがあればCF=1なので0218Hへ
3B66:0256 EB C9 jmp short 0221h ; (0221)
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[040EH]=03H
3B66:0223 84 C0 test al,al ; (3B66:0404=03H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=0000H=[040FH]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=0000H=[0411H]
3B66:0230 83 C6 05 add si,5 ; SI=0413H
3B66:0233 FE C8 dec al ; AL=02H
3B66:0235 74 18 jz 024Fh ; Jump if zero 0じゃないのでスルー
3B66:0237 FE C8 dec al ; AL=01H
3B66:0239 74 08 jz 0243h ; Jump if zero 0じゃないのでスルー
3B66:023B FE C8 dec al ; AL=00H
3B66:023D 75 10 jnz 024Fh ; Jump if not zero 0なのでスルー
3B66:023F B0 02 mov al,2 ; AL=02H
3B66:0241 EB 08 jmp short 024Bh ; (024B)
(省略)
3B66:024B loc_8: ; xref 3B66:0241
3B66:024B CD F1 int 0F1h ; AL=02HでHARE.EXE?
3B66:024D EB D2 jmp short 0221h ; (0221)
3B66:0221 loc_4: ; xref 3B66:024D, 0256
3B66:0221 ,8A 04 mov al,[si] ; AL=[0413H]=01H
3B66:0223 84 C0 test al,al ; (3B66:0413=01H),AL=00Hでなければ,ZF=0
3B66:0225 75 03 jnz 022Ah ; Jump if not zero, ZF=0なら022AHへ
3B66:0227 loc_5: ; xref 3B66:0227
3B66:0227 EB FE jmp short loc_5 ; (0227)
3B66:0229 90 db 90h
3B66:022A loc_6: ; xref 3B66:0225
3B66:022A 8B 4C 01 mov cx,[si+1] ; CX=03D6H=[0414H]
3B66:022D 8B 54 03 mov dx,[si+3] ; DX=03B7H=[0416H]
3B66:0230 83 C6 05 add si,5 ; SI=0418H
3B66:0233 FE C8 dec al ; AL=00H
3B66:0235 74 18 jz 024Fh ; Jump if zero 0なので024FHへ
(省略)
3B66:024F loc_9: ; xref 3B66:0235, 023D
3B66:024F 56 push si ; SI退避,SI=0418H
3B66:0250 E8 0005 call sub_2 ; (0258)
以下,その3に続く。
晴れのちおおさわぎ!(PC-98,カクテル・ソフト)ADVSHELL.COM解析(その1)はこちら。
晴れのちおおさわぎ!(PC-98,カクテル・ソフト)ADVSHELL.COM解析(その3)はこちら。
<<著作権に関して>>
本記事に引用している全てのソフトの名称・画像の著作権・その他権利は、制作、販売されたソフトハウス、メーカー、または作者様に帰属します。本サイトでの上記著作物の取扱いは、著作権など各権利関係を侵害することが目的ではありません。問題などある場合は、メール(gekigangarあっとmail.goo.ne.jp)にてその旨お知らせください。
※コメント投稿者のブログIDはブログ作成者のみに通知されます