|
1: 2005-07-25 (月) 02:11:40 |
| + | ================================================== |
| + | [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 |
| + | =============================================== |