雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
==================================================
[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
===============================================

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