雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
==================================================
[BITS 16]
[OPTIMIZE 1]
[OPTION 1]
[INSTRSET "8086"]
[FORMAT "BIN"]
ORG 0x100
;----------------------------------------------

;-----------初期値。AXに開始セクタ値、DXに終了セクタ値

	MOV	AX,33
	MOV	DX,161

;--繰り返す回数を求めておく。
	SUB	DX,AX	;DXの値は破壊されるが、回数が得られれば
			;いらないはず。

	MOV	CX,DX	;CXに回数がセットされた。


;--ヘッドの値を求める---
	PUSH    CX	;CXには回数が入っている。バックアップ
	PUSH    AX	;AXには論理セクタ値が入っている。一旦バックアップ。

	MOV     CX,2880	;まず、CXに総セクタ数を入れる。
	SHR     CX,1	;CX ÷ 2 を実行ししたのと同じ結果になる。

	MOV     DX,0	;これでDX:AXの値は32bitながら論理セクタ値となるはず。
 
	DIV     CX	;これで、AXにはhの値が入っているはず。

	MOV     DX,AX	;AXの値(h)をDXレジスタに移す

	POP	AX	;AXを初期値に戻す(論理セクター値)
	POP     CX	;CXを初期値に戻す

;--この時点で、AXに開始値、CXに回数、DXにはヘッド値が入るはず。

	MOV	DH,DL	;DHにヘッド値を移す
	MOV	DL,0	;DLにドライブ番号をあてる

;--これで、DXレジスタの値は完成したはず。



;--シリンダ値を求める
;シリンダ値の算出にヘッダ値がいるので先に行う
;------ Q = B ÷ A ÷ 2   ;先に一面のシリンダ数を求める
;------ c = R ÷ A - (Q * h)            

	PUSH	DX	;例によってレジスタをバックアップ
	PUSH	CX	
	PUSH	AX
	;---以下のスタック位置を、仮称でV地点とする
	PUSH	AX	;AXの値が計算で必要なのでもう一回保存

	MOV	AX,2880	;AXに総セクタ数をセット(B)
	;--DHにはヘッド値が入っているのでDLを使う
	MOV	DL,18	;DLにシリンダ内のセクタ数をセット(A)
	SHR	DL,1	;A÷2が完成する
	DIV	DL	;(Q)がALにセットされた

	;--この時点ではとりあえずAXの値はもう壊れてもかまわない
	MOV	AL,DH	;ヘッド値をALに移す
	MUL	DL	;AL × DL(Q*h)が実行され、答えはAXに入る。

	;上記でAXに得られた値とV地点とを入れ替える作業。
	;(おかしな処理だが、ようは置く所がないため)

	MOV	DX,AX	;AXの値をDXに複製	
	POP	AX	;V地点の値がAXに戻ってくる
	PUSH	DX	;得られた(Q*h)がV地点にバックアップされる

	;上記の処理で入れ替えと、AXにRを入れる処理が完成する
	;また、DXの値(Q*h)はバックアップされたので壊れてもよい。

	MOV	DL,18	;DLに18(A)をセットする。
	DIV	DL	;AX ÷ DL が実行され、ALに答えが入る
	MOV	AH,0	;これでALの値をムリヤリ16ビット化する。
			;次の引き算のため符号をそろえる

	POP	DX	;v地点の値(Q*h)をDXにレストアする。

	SUB	AX,DX	;最終的な答えが得られるが、マイナスになる
			;場合もある。しかし、この値は8ビットなので、
			;上位8ビットを切り捨てればOK。つまり、ALの
			;値がシリンダ値。
	
	MOV	BX,AX	;置く所がないのでBXに転送

	POP	AX	;レジスタをレストア
	POP	CX
	POP	DX
	
	;この時点で、AXに論理セクタ値、CXに回数、DXにドライブ番頭&ヘッド値、
	;BXにシリンダ値が入っていることになる。



;--セクタ値を求める
;-----------s = R mod A + 1
	PUSH	DX	;レジスタのバックアップ
	PUSH	CX
	PUSH	AX
	PUSH	BX


	MOV	DL,18	;DLレジスタに物理セクタ数をセット

	DIV	DL	;AX÷DLが実行され、AHに余りが入る

	ADD	AH,1	;AHにセクタ値が得られたはず。

	POP	BX	;BXをレストア。BLにはシリンダ値がある。

	;BIOSを呼ぶ時の値と逆なのでひっくり返す。

	MOV	BH,BL	;BLにあるシリンダ値をBHに移す
	MOV	BL,AH	;AHのセクタ値をBLに移す。

	;これによって、BHにシリンダ値、BLにセクタ値が得られる。
	;あとはこのBXの値をCXに移せばOKとなる。

	POP	AX	;レジスタのレストア
	POP	CX
	POP	DX

;ーーこの時点で、AXに開始値、CXに回数、DXにドライブ&ヘッド値、BXにシリンダ&セクタがセットされているはず。

;--end---

;----------------------------------------------
MOV AX,0x4c00
INT 0x21
===============================================

最終更新: 2024-01-06 (土) 22:39:10 (JST) (103d) by