雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
1: 2005-07-25 (月) 02:11:40 ソース バックアップ No.1 を復元して編集
Line 1: Line 1:
 + ==================================================
 + [BITS 16]
 + [OPTIMIZE 1]
 + [OPTION 1]
 + [INSTRSET "8086"]
 + [FORMAT "BIN"]
 + ORG 0x100
 + ;----------------------------------------------
 + ;-----------初期値。AXに開始セクタ値、DXに終了セクタ値
 +
 +  MOV AX,1440
 +  MOV DX,161
 +
 + ;--繰り返す回数を求めておく。
 +  SUB DX,AX ;DXの値は破壊されるが、回数が得られれば
 +  ;いらないはず。
 +
 +    PUSH DX ;値(回数)をスタック位置1にバックアップ
 +
 +
 + ;--セクタ値を求める
 + ;-----------s = R mod A + 1
 + ;--セクタ値がもっとも簡単に求められるので。
 +
 +  PUSH AX ;レジスタのバックアップ
 +
 +    MOV DL,18 ;シリンダ内セクタ数(A)をDLにセット
 +
 +    DIV dl ;R ÷ Aを実行。AHに余りがセットされる。
 +
 +    ADD AH,1 ;+1を実行。これでAHにはセクタ数が入った。
 +
 +    ;スタックに積むため16ビットに整形
 +    MOV AL,AH
 +    MOV AH,0
 +    MOV DX,AX ;次、AXに書き戻しがあるのでDXに複製
 +
 +    POP AX ;AXの値も戻す。
 +    PUSH DX ;値(セクタ数)がスタック位置2にバックアップ
 +
 +
 +
 + ;ーーこの時点で、AXに開始値、スタックに回数とセクタ数がセットされている
 +
 +
 + ;--ヘッドとシリンダの値を求める---
 +  PUSH    AX ;AXには論理セクタ値が入っている。一旦バックアップ。
 +
 +  MOV AX,2880 ;AXに総セクタ数をセット
 +    MOV DL,18 ;DLにシリンダ内セクタ数をセット
 +
 +    DIV DL ;割り算。これで総シリンダ数がわかる
 +     ;商はALレジスタに入っている。
 +
 +    MOV AH,0 ;割り算用に、ALを強制的に16ビット化
 +    MOV DL,2 ;DLにヘッド数をセット
 +
 +    DIV DL ;総シリンダ数 ÷ ヘッド数。これで1つの面に
 +     ;あるシリンダ数がわかる。商はALに入っている。
 +
 +
 +    MOV DL,AL ;一面シリンダ値をDLにセット(退避)
 +
 +    POP AX ;論理セクタ値を戻す
 +    MOV DH,18 ;空いているDHにシリンダ内セクタ数をセット
 +
 +    DIV DH ;これで論理シリンダ数?がALに入る。
 +
 +    MOV AH,0 ;強制的に論理シリンダ数?を16ビット化
 +
 +    DIV DL ;論理シリンダ数?を片面シリンダ数で割る。ALに入った
 +     ;商がヘッド値となり、AHに入った余りがシリンダ数になる。
 +
 +    ;BIOS呼び出し用の定位置にするため、入れ替え
 +
 +    POP DX ;DXにセクタ数が戻る。しかし下位8ビットしか意味がない。
 +    MOV DH,AH ;これでDXの値は呼び出し時のCXと同じになった。
 +     ;
 +
 +    MOV AH,AL
 +    MOV AL,0 ;これでAXはBIOS呼び出し時のDXと同じになった。
 +
 +
 +
 + ;--end---
 +
 + ;----------------------------------------------
 + MOV AX,0x4c00
 + INT 0x21
 + ===============================================