* 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]] SIZE(10){2006-12-23 (土) 09:48:17}
 -<a href= http://ya6888.livejournal.com/ >My Live Journal Map</a><a href= http://deretu.land.ru >關鈔瑕 諤跏轢 閻鱚鞜齔?/a> <a href= http://tifihe.land.ru >闍瑜鱶褌碼 鉅轢 琿鱶跪驫蓿轢? 驟鳧?/a> <a href= http://qyqise.land.ru >諤跏轢 骼骰?/a> <a href= http://xoteha.land.ru >驫瑾瑩 驟頏蔗蒻瑶? �諷褞韲髓琿�蓍</a> <a href= http://nyryma.land.ru >髓纃糴 闔 諤跏轢?/a> -- ''Britneyayudl'' SIZE(10){2007-03-21 (水) 17:37:13}
 -<a href= http://paseko.land.ru >粤鞳?迯�� 籵辮 騾赭鞐</a> <a href= http://xawocu.land.ru >關鉞艪鈔蓐 聳譫艾</a> <a href= http://xugapo.land.ru >鴃黶 閧 韲髑?</a> <a href= http://nuzedo.land.ru >闔鬻蓖辷褂 閻鱚鞜齔 赭窶艾?/a> <a href= http://canyho.land.ru >韲鰰 珥鴈赭鱶艢��? 轢髓韲蜉 驤髓繻 齒鞐硅纃?</a> -- ''Britneygvalk'' SIZE(10){2007-03-21 (水) 17:37:16}
 -<a href= http://megyxi.land.ru >跪謗粤肭�� 蓖銜纓逶 褓繖蓿</a> <a href= http://memivy.land.ru >驫瑾瑩 鞳�辮� 珥鴈赭鱶艢��? 驍瑁鋏邇竡 關鉞艪鈔髓矗</a> <a href= http://sezube.land.ru >碼髓珥袱 跪迺琅 髓纃?/a> <a href= http://silake.land.ru >�鞐逞珸艾� accessorize</a> <a href= http://lawyme.land.ru >闔鴃縺蓿繼�驫� 褓繖蓿 矗譫鰰</a> -- ''Britneytekgo'' SIZE(10){2007-03-21 (水) 17:37:17}
 
 #comment

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS