1: 2005-07-24 (日) 17:04:52 |
現: 2024-01-06 (土) 22:39:10 |
| ORG 0x100 | | ORG 0x100 |
| ;---------------------------------------------- | | ;---------------------------------------------- |
| + | |
| ;-----------初期値。AXに開始セクタ値、DXに終了セクタ値 | | ;-----------初期値。AXに開始セクタ値、DXに終了セクタ値 |
| + | |
| MOV AX,33 | | MOV AX,33 |
| MOV DX,161 | | MOV DX,161 |
| + | |
| ;--繰り返す回数を求めておく。 | | ;--繰り返す回数を求めておく。 |
| SUB DX,AX ;DXの値は破壊されるが、回数が得られれば | | SUB DX,AX ;DXの値は破壊されるが、回数が得られれば |
| ;いらないはず。 | | ;いらないはず。 |
| + | |
| MOV CX,DX ;CXに回数がセットされた。 | | MOV CX,DX ;CXに回数がセットされた。 |
- | | + | |
| + | |
| ;--ヘッドの値を求める--- | | ;--ヘッドの値を求める--- |
| PUSH CX ;CXには回数が入っている。バックアップ | | PUSH CX ;CXには回数が入っている。バックアップ |
| PUSH AX ;AXには論理セクタ値が入っている。一旦バックアップ。 | | PUSH AX ;AXには論理セクタ値が入っている。一旦バックアップ。 |
| + | |
| MOV CX,2880 ;まず、CXに総セクタ数を入れる。 | | MOV CX,2880 ;まず、CXに総セクタ数を入れる。 |
| SHR CX,1 ;CX ÷ 2 を実行ししたのと同じ結果になる。 | | SHR CX,1 ;CX ÷ 2 を実行ししたのと同じ結果になる。 |
| + | |
| MOV DX,0 ;これでDX:AXの値は32bitながら論理セクタ値となるはず。 | | MOV DX,0 ;これでDX:AXの値は32bitながら論理セクタ値となるはず。 |
| + | |
| DIV CX ;これで、AXにはhの値が入っているはず。 | | DIV CX ;これで、AXにはhの値が入っているはず。 |
| + | |
| MOV DX,AX ;AXの値(h)をDXレジスタに移す | | MOV DX,AX ;AXの値(h)をDXレジスタに移す |
| + | |
| POP AX ;AXを初期値に戻す(論理セクター値) | | POP AX ;AXを初期値に戻す(論理セクター値) |
| POP CX ;CXを初期値に戻す | | POP CX ;CXを初期値に戻す |
| + | |
| ;--この時点で、AXに開始値、CXに回数、DXにはヘッド値が入るはず。 | | ;--この時点で、AXに開始値、CXに回数、DXにはヘッド値が入るはず。 |
| + | |
| MOV DH,DL ;DHにヘッド値を移す | | MOV DH,DL ;DHにヘッド値を移す |
| MOV DL,0 ;DLにドライブ番号をあてる | | MOV DL,0 ;DLにドライブ番号をあてる |
| + | |
| ;--これで、DXレジスタの値は完成したはず。 | | ;--これで、DXレジスタの値は完成したはず。 |
- | | + | |
- | | + | |
| + | |
| ;--シリンダ値を求める | | ;--シリンダ値を求める |
| ;シリンダ値の算出にヘッダ値がいるので先に行う | | ;シリンダ値の算出にヘッダ値がいるので先に行う |
| ;------ Q = B ÷ A ÷ 2 ;先に一面のシリンダ数を求める | | ;------ Q = B ÷ A ÷ 2 ;先に一面のシリンダ数を求める |
| ;------ c = R ÷ A - (Q * h) | | ;------ c = R ÷ A - (Q * h) |
| + | |
| PUSH DX ;例によってレジスタをバックアップ | | PUSH DX ;例によってレジスタをバックアップ |
| PUSH CX | | PUSH CX |
| ;---以下のスタック位置を、仮称でV地点とする | | ;---以下のスタック位置を、仮称でV地点とする |
| PUSH AX ;AXの値が計算で必要なのでもう一回保存 | | PUSH AX ;AXの値が計算で必要なのでもう一回保存 |
| + | |
| MOV AX,2880 ;AXに総セクタ数をセット(B) | | MOV AX,2880 ;AXに総セクタ数をセット(B) |
| ;--DHにはヘッド値が入っているのでDLを使う | | ;--DHにはヘッド値が入っているのでDLを使う |
| SHR DL,1 ;A÷2が完成する | | SHR DL,1 ;A÷2が完成する |
| DIV DL ;(Q)がALにセットされた | | DIV DL ;(Q)がALにセットされた |
| + | |
| ;--この時点ではとりあえずAXの値はもう壊れてもかまわない | | ;--この時点ではとりあえずAXの値はもう壊れてもかまわない |
| MOV AL,DH ;ヘッド値をALに移す | | MOV AL,DH ;ヘッド値をALに移す |
| MUL DL ;AL × DL(Q*h)が実行され、答えはAXに入る。 | | MUL DL ;AL × DL(Q*h)が実行され、答えはAXに入る。 |
| + | |
| ;上記でAXに得られた値とV地点とを入れ替える作業。 | | ;上記でAXに得られた値とV地点とを入れ替える作業。 |
| ;(おかしな処理だが、ようは置く所がないため) | | ;(おかしな処理だが、ようは置く所がないため) |
| + | |
| MOV DX,AX ;AXの値をDXに複製 | | MOV DX,AX ;AXの値をDXに複製 |
| POP AX ;V地点の値がAXに戻ってくる | | POP AX ;V地点の値がAXに戻ってくる |
| PUSH DX ;得られた(Q*h)がV地点にバックアップされる | | PUSH DX ;得られた(Q*h)がV地点にバックアップされる |
| + | |
| ;上記の処理で入れ替えと、AXにRを入れる処理が完成する | | ;上記の処理で入れ替えと、AXにRを入れる処理が完成する |
| ;また、DXの値(Q*h)はバックアップされたので壊れてもよい。 | | ;また、DXの値(Q*h)はバックアップされたので壊れてもよい。 |
| + | |
| MOV DL,18 ;DLに18(A)をセットする。 | | MOV DL,18 ;DLに18(A)をセットする。 |
| DIV DL ;AX ÷ DL が実行され、ALに答えが入る | | DIV DL ;AX ÷ DL が実行され、ALに答えが入る |
| MOV AH,0 ;これでALの値をムリヤリ16ビット化する。 | | MOV AH,0 ;これでALの値をムリヤリ16ビット化する。 |
| ;次の引き算のため符号をそろえる | | ;次の引き算のため符号をそろえる |
| + | |
| POP DX ;v地点の値(Q*h)をDXにレストアする。 | | POP DX ;v地点の値(Q*h)をDXにレストアする。 |
| + | |
| SUB AX,DX ;最終的な答えが得られるが、マイナスになる | | SUB AX,DX ;最終的な答えが得られるが、マイナスになる |
| ;場合もある。しかし、この値は8ビットなので、 | | ;場合もある。しかし、この値は8ビットなので、 |
| ;上位8ビットを切り捨てればOK。つまり、ALの | | ;上位8ビットを切り捨てればOK。つまり、ALの |
| ;値がシリンダ値。 | | ;値がシリンダ値。 |
| + | |
| MOV BX,AX ;置く所がないのでBXに転送 | | MOV BX,AX ;置く所がないのでBXに転送 |
| + | |
| POP AX ;レジスタをレストア | | POP AX ;レジスタをレストア |
| POP CX | | POP CX |
| POP DX | | POP DX |
| + | |
| ;この時点で、AXに論理セクタ値、CXに回数、DXにドライブ番頭&ヘッド値、 | | ;この時点で、AXに論理セクタ値、CXに回数、DXにドライブ番頭&ヘッド値、 |
| ;BXにシリンダ値が入っていることになる。 | | ;BXにシリンダ値が入っていることになる。 |
- | | + | |
- | | + | |
| + | |
| ;--セクタ値を求める | | ;--セクタ値を求める |
| ;-----------s = R mod A + 1 | | ;-----------s = R mod A + 1 |
| PUSH AX | | PUSH AX |
| PUSH BX | | PUSH BX |
- | | + | |
| + | |
| MOV DL,18 ;DLレジスタに物理セクタ数をセット | | MOV DL,18 ;DLレジスタに物理セクタ数をセット |
| + | |
| DIV DL ;AX÷DLが実行され、AHに余りが入る | | DIV DL ;AX÷DLが実行され、AHに余りが入る |
| + | |
| ADD AH,1 ;AHにセクタ値が得られたはず。 | | ADD AH,1 ;AHにセクタ値が得られたはず。 |
| + | |
| POP BX ;BXをレストア。BLにはシリンダ値がある。 | | POP BX ;BXをレストア。BLにはシリンダ値がある。 |
| + | |
| ;BIOSを呼ぶ時の値と逆なのでひっくり返す。 | | ;BIOSを呼ぶ時の値と逆なのでひっくり返す。 |
| + | |
| MOV BH,BL ;BLにあるシリンダ値をBHに移す | | MOV BH,BL ;BLにあるシリンダ値をBHに移す |
| MOV BL,AH ;AHのセクタ値をBLに移す。 | | MOV BL,AH ;AHのセクタ値をBLに移す。 |
| + | |
| ;これによって、BHにシリンダ値、BLにセクタ値が得られる。 | | ;これによって、BHにシリンダ値、BLにセクタ値が得られる。 |
| ;あとはこのBXの値をCXに移せばOKとなる。 | | ;あとはこのBXの値をCXに移せばOKとなる。 |
| + | |
| POP AX ;レジスタのレストア | | POP AX ;レジスタのレストア |
| POP CX | | POP CX |
| POP DX | | POP DX |
| + | |
| ;ーーこの時点で、AXに開始値、CXに回数、DXにドライブ&ヘッド値、BXにシリンダ&セクタがセットされているはず。 | | ;ーーこの時点で、AXに開始値、CXに回数、DXにドライブ&ヘッド値、BXにシリンダ&セクタがセットされているはず。 |
- | | + | |
- | | + | ;--end--- |
- | | + | |
- | | + | ;---------------------------------------------- |
- | | + | MOV AX,0x4c00 |
- | | + | INT 0x21 |
- | | + | =============================================== |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | ;--end--- | + | |
- | | + | |
- | ;---------------------------------------------- | + | |
- | MOV AX,0x4c00 | + | |
- | INT 0x21 | + | |
- | =============================================== | + | |