1: 2005-07-25 (月) 19:42:10  |
現: 2024-01-06 (土) 22:39:10  |
| | ORG 0x100 | | ORG 0x100 |
| | ;---------------------------------------------- | | ;---------------------------------------------- |
| | + | |
| | ;-----------初期値。AXに開始セクタ値、DXに終了セクタ値 | | ;-----------初期値。AXに開始セクタ値、DXに終了セクタ値 |
| | + | |
| | MOV AX,1439 | | MOV AX,1439 |
| | 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 |
| | ;--セクタ値がもっとも簡単に求められるので。 | | ;--セクタ値がもっとも簡単に求められるので。 |
| | + | |
| | MOV BX,AX ;論理セクタ数をBXにバックアップ | | MOV BX,AX ;論理セクタ数をBXにバックアップ |
| | + | |
| | MOV DL,18 ;シリンダ内セクタ数(A)をDLにセット | | MOV DL,18 ;シリンダ内セクタ数(A)をDLにセット |
| | + | |
| | DIV dl ;R ÷ Aを実行。ALに商、AHに余りがセットされる。 | | DIV dl ;R ÷ Aを実行。ALに商、AHに余りがセットされる。 |
| | ;この商は論理シリンダ数?になる。 | | ;この商は論理シリンダ数?になる。 |
| | + | |
| | ADD AH,1 ;+1を実行。これでAHにはセクタ数が入った。 | | ADD AH,1 ;+1を実行。これでAHにはセクタ数が入った。 |
| | + | |
| | MOV CL,AH ;これでCLにセクタ数はOK | | MOV CL,AH ;これでCLにセクタ数はOK |
| - | | + | |
| | + | |
| | ;--ヘッドとシリンダの値を求める--- | | ;--ヘッドとシリンダの値を求める--- |
| - | | + | |
| | + | |
| | MOV CH,AL ;CHに論理シリンダ数?をバックアップ | | MOV CH,AL ;CHに論理シリンダ数?をバックアップ |
| | + | |
| | MOV AX,2880 ;AXに総セクタ数をAXにセット | | MOV AX,2880 ;AXに総セクタ数をAXにセット |
| | MOV DL,18 ;DLにシリンダ内セクタ数をセット | | MOV DL,18 ;DLにシリンダ内セクタ数をセット |
| | DIV DL ;割り算。この割り算でALに商すなわち | | DIV DL ;割り算。この割り算でALに商すなわち |
| | ;総シリンダ数が求められる。 | | ;総シリンダ数が求められる。 |
| | + | |
| | MOV AH,0 ;ALの値を16ビット化する。(割り算のために) | | MOV AH,0 ;ALの値を16ビット化する。(割り算のために) |
| | MOV DL,2 ;ヘッド数をDLにセット | | MOV DL,2 ;ヘッド数をDLにセット |
| | + | |
| | DIV DL ;割り算。これでALに商すなわち一面のシリンダ数 | | DIV DL ;割り算。これでALに商すなわち一面のシリンダ数 |
| | ;が求められる | | ;が求められる |
| - | | + | |
| | + | |
| | MOV DL,AL ;ALにある一面シリンダ数をDLに移す | | MOV DL,AL ;ALにある一面シリンダ数をDLに移す |
| | MOV AL,CH ;CHにバックアップしておいた論理シリンダ数をALに | | MOV AL,CH ;CHにバックアップしておいた論理シリンダ数をALに |
| | DIV DL ;割り算。これでALに商すなわちヘッド値、AHに | | DIV DL ;割り算。これでALに商すなわちヘッド値、AHに |
| | ;余りすなわちシリンダ番号が入る。 | | ;余りすなわちシリンダ番号が入る。 |
| - | | + | |
| - | ;--BIOS呼び出し用に、各レジスタ位置を移動調整 | + | ;--BIOS呼び出し用に、各レジスタ位置を移動調整 |
| | + | |
| | MOV CH,AH | | MOV CH,AH |
| | MOV DH,AL | | MOV DH,AL |
| | MOV DL,0 ;ドライブ番号 | | MOV DL,0 ;ドライブ番号 |
| - | | + | |
| - | | + | |
| - | | + | |
| | ;--end--- | | ;--end--- |
| | + | |
| | ;---------------------------------------------- | | ;---------------------------------------------- |
| | MOV AX,0x4c00 | | MOV AX,0x4c00 |
| | INT 0x21 | | INT 0x21 |
| | =============================================== | | =============================================== |