まだまだ、PBR
seg000:00E0 sub di, di seg000:00E2 seg000:00E2 loc_7CE2: ; CODE XREF: seg000:00F3^Yj seg000:00E2 push cx seg000:00E3 push di seg000:00E4 lea si, [bp+46h] seg000:00E7 mov cx, 0Bh seg000:00EA repe cmpsb seg000:00EC pop di seg000:00ED pop cx seg000:00EE jz short loc_7D03 seg000:00F0 add di, 20h ; ' ' seg000:00F3 loop loc_7CE2
DIレジスタゼロクリア。
CXレジスタ、DIレジスタ、一時退避。
SIレジスタに[BP+46h]の実効アドレス値を転送。"IBMBIO COM"の先頭アドレス。
CXレジスタに即値:0Bhを転送。11文字分。
REPE CMPSB は、ES:DIとDS:SIとを一文字ずつ比較していって、
一致しないか、CXレジスタ分カウントするか、どちらかまで繰り返す。
最後まで一致すれば、loc_7D03へジャンプ
DIレジスタに20h加算する。次のエントリ情報へ。
ルートエントリ最大数分繰り返し。
全部チェックしても一致しなければ、loc_7CF5(終了処理)へ流れる。
seg000:0183 sub_7D83 proc near ; CODE XREF: seg000:00D5^Xp seg000:0183 ; seg000:0126^Xp ... seg000:0183 xor bx, bx seg000:0185 push ax seg000:0186 push dx seg000:0187 call sub_7D9F seg000:018A mov ax, es seg000:018C add ax, 20h ; ' ' seg000:018F mov es, ax seg000:0191 assume es:nothing seg000:0191 pop dx seg000:0192 pop ax seg000:0193 add ax, 1 seg000:0196 adc dx, 0 seg000:0199 dec byte ptr [bp+2Bh] seg000:019C jnz short sub_7D83 seg000:019E seg000:019E locret_7D9E: ; CODE XREF: sub_7D9F+20^Yj seg000:019E retn
BXレジスタゼロクリア。
AXレジスタ、DXレジスタ、一時退避。
sub_7D9Fをコール。
ESレジスタの内容を20h増やす。(512Byte分進める)
DXレジスタ、AXレジスタ、復元。
AXレジスタの内容に即値:1加算。
DXレジスタの内容にキャリー加算。
[BP+2Bh]の内容を1減らす。
ゼロになるまで繰り返す。
near リターン。
seg000:019F sub_7D9F proc near ; CODE XREF: sub_7D83+4^Xp seg000:019F seg000:019F ; FUNCTION CHUNK AT seg000:00F5 SIZE 0000000E BYTES seg000:019F seg000:019F div word ptr [bp+18h] seg000:01A2 inc dx seg000:01A3 mov cl, dl seg000:01A5 xor dx, dx seg000:01A7 div word ptr [bp+1Ah] seg000:01AA mov dh, dl seg000:01AC ror ah, 1 seg000:01AE ror ah, 1 seg000:01B0 and ah, 0C0h seg000:01B3 or cl, ah seg000:01B5 mov ch, al seg000:01B7 mov dl, [bp+24h] seg000:01BA seg000:01BA loc_7DBA: ; CODE XREF: sub_7D9F+25^Yj seg000:01BA mov ax, 201h seg000:01BD int 13h ; DISK - READ SECTORS INTO MEMORY seg000:01BD ; AL = number of sectors to read, CH = track, CL = sector seg000:01BD ; DH = head, DL = drive, ES:BX -> buffer to fill seg000:01BD ; Return: CF set on error, AH = status, AL = number of sectors read seg000:01BF jnb short locret_7D9E seg000:01C1 dec byte ptr [bp+26h] seg000:01C4 jnz short loc_7DBA seg000:01C6 jmp loc_7CF5
AX/[BP+18h]1トラックあたりのセクタ数。
商はAXレジスタに、余りはDXレジスタに格納。
DXレジスタの内容に1を加算。
CLレジスタにDLレジスタの内容を転送。←セクタ
DXレジスタゼロクリア。
AX/[BP+1Ah]ドライブのヘッド数。
DHレジスタにDLレジスタの内容を転送。←ヘッド
AHレジスタの内容を右に2ビット回転。下位2ビットが上位に移動。
AHレジスタの内容と即値:C0hとの論理積を求める。上位2ビットを残してマスク。
CLレジスタの内容とAHレジスタの内容との論理和を求める。←トラックの上位2ビットを含ませる。
CHレジスタにALレジスタの内容を転送。←トラック
DLレジスタに[BP+24h]の内容を転送。←ドライブ
AXレジスタに即値:0x0201を転送。1セクタ分読み込み。
BIOS CALL ディスクサービス呼び出し。
エラーがなければ、locret_7D9Eへジャンプ → そのままリターン。
[BP+26h]の内容を1減らす。シグネチャ?
ゼロでなければ、繰り返す。<リトライ
それでもダメなら、エラー終了。