CYLS自動調節型IPLを作ろう!
- (by K, 2006.09.30)
- 発展課題のページ(全部読む前にここを読むのは混乱するのでおすすめじゃないです)
はじめに
- ディスクイメージにあれこれファイルを詰め込んでいくと、CYLSが足りなくなって、うまく動かなくなることがあります。しかしだからといっていつも最大値の33を指定していると、今度は起動が遅くなって(特に実機では遅い)、イライラします(本来必要のない部分を読むせいで余計に待たされているということが特にくやしい)。
- ということで、起動時に読み込んだFATを解析することでCYLSを自動計算して、いつも必要な分だけ読み込むIPLを作りました。
改造点
- ipl09.nas (この改造後は ipl09.nas という名前はもうふさわしくはないけれどね)
(中略)
; ディスクを読む
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; シリンダ0
MOV DH,0 ; ヘッド0
MOV CL,2 ; セクタ2
MOV BX,18*2-1 ; 読み込みたい合計セクタ数 (2006.12.23 バグ修正)
CALL readfast ; 高速読み込み
MOV BX,4312+0x8200+2
fatloop:
ADD BX,-2
CMP WORD [BX],0
JZ fatloop
MOV AX,BX
ADD AX,-0x8200-5+54+53
MOV BL,54
DIV BL ; AL = AX / BL
CMP AL,0
JNZ fatskip1
MOV AL,1
fatskip1:
CMP AL,33
JBE fatskip2
MOV AL,33
fatskip2:
MOV [0x0ff0],AL ; IPLがどこまで読んだのかをメモ
ADD AL,-1
JZ fatskip3
MOV AH,0
IMUL BX,AX,18*2
MOV AX,0x0c80
MOV ES,AX
MOV CH,1 ; シリンダ1
MOV DH,0 ; ヘッド0
MOV CL,1 ; セクタ1
CALL readfast ; 高速読み込み
fatskip3:
; 読み終わったのでharibote.sysを実行だ!
JMP 0xc200
(中略)
簡単な解説
- MOV BX,4312+0x8200+2
- 4312というのは、FAT上での最後のクラスタの位置です。そしてFATデータは0x8200からあるのでそれを足して、さらに次にすぐ-2を加えるので+2した状態を代入しています。
- fatloop
- FATを後ろからたどり、0じゃない部分を探します。最終使用クラスタはどこかな?
- ADD AX,-0x8200-5+54+53
- 最終使用クラスタを求めるために、まずFAT内での何バイト目かが知りたいので0x8200を引きます。さらに5を引くのは、最初に読み込んだ0シリンダ内に2〜4クラスタが既に含まれていて、その分は追加で読み込む量の計算には入れたくないからです。
- 54という数字についてです。1シリンダ中に36クラスタあって、これを1.5倍すると54になります。つまり54は、FAT内での1シリンダのバイト数です。で、その54を足すのは、あとで [0x0ff0] に書き込むときに1加えるのが面倒だったのでここで足しているだけです。53を加えているのは、切り上げ計算をしたかったからです。
- [0x0ff0]に1を加える必要があった理由は、[0x0ff0]の値は最初に読んだ1シリンダ分も含まれるからです。
- DIV BL
- 割り算をしています。AXをBLで割った答えがALに入ります。
- IMUL BX,AX,18*2
- 「BX = AX * 18 * 2」という命令です。
こめんと欄
- Akkieさんの指摘のおかげでバグを見つけました。あっきぃさんどうもありがとう! -- K 2006-12-23 (土) 09:48:17
|