雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
1: 2005-07-25 (月) 02:11:40 ソース バックアップ No.1 を復元して編集 現: 2024-01-06 (土) 22:39:10 ソース 編集
Line 7: Line 7:
 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
 ===============================================  ===============================================