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

コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2007-03-21 (水) 17:37:17 (5365d)