1: 2005-07-25 (月) 02:11:40 |
現: 2024-01-06 (土) 22:39:10 |
| ORG 0x100 | | ORG 0x100 |
| ;---------------------------------------------- | | ;---------------------------------------------- |
| + | |
| ;-----------初期値。AXに開始セクタ値、DXに終了セクタ値 | | ;-----------初期値。AXに開始セクタ値、DXに終了セクタ値 |
| + | |
| MOV AX,1440 | | MOV AX,1440 |
| MOV DX,161 | | MOV DX,161 |
| + | |
| ;--繰り返す回数を求めておく。 | | ;--繰り返す回数を求めておく。 |
| SUB DX,AX ;DXの値は破壊されるが、回数が得られれば | | SUB DX,AX ;DXの値は破壊されるが、回数が得られれば |
| ;いらないはず。 | | ;いらないはず。 |
| + | |
| PUSH DX ;値(回数)をスタック位置1にバックアップ | | PUSH DX ;値(回数)をスタック位置1にバックアップ |
- | | + | |
| + | |
| ;--セクタ値を求める | | ;--セクタ値を求める |
| ;-----------s = R mod A + 1 | | ;-----------s = R mod A + 1 |
| ;--セクタ値がもっとも簡単に求められるので。 | | ;--セクタ値がもっとも簡単に求められるので。 |
| + | |
| PUSH AX ;レジスタのバックアップ | | PUSH AX ;レジスタのバックアップ |
| + | |
| MOV DL,18 ;シリンダ内セクタ数(A)をDLにセット | | MOV DL,18 ;シリンダ内セクタ数(A)をDLにセット |
| + | |
| DIV dl ;R ÷ Aを実行。AHに余りがセットされる。 | | DIV dl ;R ÷ Aを実行。AHに余りがセットされる。 |
| + | |
| ADD AH,1 ;+1を実行。これでAHにはセクタ数が入った。 | | ADD AH,1 ;+1を実行。これでAHにはセクタ数が入った。 |
| + | |
| ;スタックに積むため16ビットに整形 | | ;スタックに積むため16ビットに整形 |
| MOV AL,AH | | MOV AL,AH |
| MOV AH,0 | | MOV AH,0 |
| MOV DX,AX ;次、AXに書き戻しがあるのでDXに複製 | | MOV DX,AX ;次、AXに書き戻しがあるのでDXに複製 |
| + | |
| POP AX ;AXの値も戻す。 | | POP AX ;AXの値も戻す。 |
| PUSH DX ;値(セクタ数)がスタック位置2にバックアップ | | PUSH DX ;値(セクタ数)がスタック位置2にバックアップ |
- | | + | |
- | | + | |
| + | |
| ;ーーこの時点で、AXに開始値、スタックに回数とセクタ数がセットされている | | ;ーーこの時点で、AXに開始値、スタックに回数とセクタ数がセットされている |
- | | + | |
| + | |
| ;--ヘッドとシリンダの値を求める--- | | ;--ヘッドとシリンダの値を求める--- |
| PUSH AX ;AXには論理セクタ値が入っている。一旦バックアップ。 | | PUSH AX ;AXには論理セクタ値が入っている。一旦バックアップ。 |
| + | |
| MOV AX,2880 ;AXに総セクタ数をセット | | MOV AX,2880 ;AXに総セクタ数をセット |
| MOV DL,18 ;DLにシリンダ内セクタ数をセット | | MOV DL,18 ;DLにシリンダ内セクタ数をセット |
| + | |
| DIV DL ;割り算。これで総シリンダ数がわかる | | DIV DL ;割り算。これで総シリンダ数がわかる |
| ;商はALレジスタに入っている。 | | ;商はALレジスタに入っている。 |
| + | |
| MOV AH,0 ;割り算用に、ALを強制的に16ビット化 | | MOV AH,0 ;割り算用に、ALを強制的に16ビット化 |
| MOV DL,2 ;DLにヘッド数をセット | | MOV DL,2 ;DLにヘッド数をセット |
| + | |
| DIV DL ;総シリンダ数 ÷ ヘッド数。これで1つの面に | | DIV DL ;総シリンダ数 ÷ ヘッド数。これで1つの面に |
| ;あるシリンダ数がわかる。商はALに入っている。 | | ;あるシリンダ数がわかる。商はALに入っている。 |
- | | + | |
| + | |
| MOV DL,AL ;一面シリンダ値をDLにセット(退避) | | MOV DL,AL ;一面シリンダ値をDLにセット(退避) |
| + | |
| POP AX ;論理セクタ値を戻す | | POP AX ;論理セクタ値を戻す |
| MOV DH,18 ;空いているDHにシリンダ内セクタ数をセット | | MOV DH,18 ;空いているDHにシリンダ内セクタ数をセット |
| + | |
| DIV DH ;これで論理シリンダ数?がALに入る。 | | DIV DH ;これで論理シリンダ数?がALに入る。 |
| + | |
| MOV AH,0 ;強制的に論理シリンダ数?を16ビット化 | | MOV AH,0 ;強制的に論理シリンダ数?を16ビット化 |
| + | |
| DIV DL ;論理シリンダ数?を片面シリンダ数で割る。ALに入った | | DIV DL ;論理シリンダ数?を片面シリンダ数で割る。ALに入った |
| ;商がヘッド値となり、AHに入った余りがシリンダ数になる。 | | ;商がヘッド値となり、AHに入った余りがシリンダ数になる。 |
| + | |
| ;BIOS呼び出し用の定位置にするため、入れ替え | | ;BIOS呼び出し用の定位置にするため、入れ替え |
| + | |
| POP DX ;DXにセクタ数が戻る。しかし下位8ビットしか意味がない。 | | POP DX ;DXにセクタ数が戻る。しかし下位8ビットしか意味がない。 |
| MOV DH,AH ;これでDXの値は呼び出し時のCXと同じになった。 | | MOV DH,AH ;これでDXの値は呼び出し時のCXと同じになった。 |
| ; | | ; |
| + | |
| MOV AH,AL | | MOV AH,AL |
| MOV AL,0 ;これでAXはBIOS呼び出し時のDXと同じになった。 | | MOV AL,0 ;これでAXはBIOS呼び出し時のDXと同じになった。 |
- | | + | |
- | | + | |
| + | |
| ;--end--- | | ;--end--- |
| + | |
| ;---------------------------------------------- | | ;---------------------------------------------- |
| MOV AX,0x4c00 | | MOV AX,0x4c00 |
| INT 0x21 | | INT 0x21 |
| =============================================== | | =============================================== |