IPL
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* ブートセクタ(IPL)を書く上で必要になりそうな情報 [#c4be9...
* DOS互換にするならブートセクタにBPBも書きます [#cf09cbe5]
*** 一番古い形式のFAT12/FAT16用BPB [#s846720e]
-最初の11バイト:
--AT/98の場合:
---+0x00 - +0x02 : jmp命令用の空き
---+0x03 - +0x0a : 名前(たいていはファイルシステムの名...
--TOWNSの形式1の場合:
---+0x00 - +0x03 : ブート可能であることを示すシグネチャ...
---+0x04 - +0x0a : jmp命令用の空き(あまりには名前を書い...
--TOWNSの形式2の場合:
---+0x00 - +0x02 : jmp命令用の空き
---+0x03 - +0x06 : ブート可能であることを示すシグネチャ...
---+0x07 - +0x0a : 名前
-+0x0b - +0x0c : セクタサイズ(一般的には512か1024)
-+0x0d : クラスタサイズ(1クラスタが何セクタで構成されて...
-+0x0e - +0x0f : FATがどこから格納されているか(このBPB...
-+0x10 : FATがいくつあるか(一般的には2)
-+0x11 - +0x12 : ルートディレクトリの長さ(32バイト単位)
-+0x13 - +0x14 : このドライブ(FDの場合はディスク、HDDの...
--ここは2バイトまでしか書けないので、1セクタ512バイトの場...
-+0x15 : メディアのタイプ(一般に1440KB-FDの場合は0xf0を...
-+0x16 - +0x17 : FATの長さ(1つ分の長さをセクタ数で)
-+0x18 - +0x19 : 1トラックにいくつのセクタがあるか(一般...
-+0x1a - +0x1b : ヘッドの数はいくつか(一般に1440KB-FDの...
-+0x1c - +0x1d : このBPBセクタはデバイスの先頭から数えて...
-全体的なフォーマット:
--+0x0e - +0x0fの値で示される部分から、次の順序で並ぶ。
|名前|長さ(バイト数)|備考|
|第一FAT|(+0x16 - 0x17)x(+0x0b - +0x0c)||
|第二FAT|(+0x16 - 0x17)x(+0x0b - +0x0c)|内容は第一FAT...
|ルートディレクトリ|(+0x11 - +0x12)x 32||
|ファイル領域|下記||
--ファイル領域のバイト数は(+0x13 - +0x14)x(+0x0b - +0x...
-FAT12/FAT16の区別は?
--まずファイル領域の総クラスタ数を算出。これは上記の方法...
*** 現在の形式のFAT12/FAT16用BPB [#lfe224ca]
-+0x1e - +0x1f : HDDの大容量化にあわせて+0x1c - 0x1dの内...
-+0x20 - +0x23 : +0x13 - +0x14の内容を4バイトで書いたもの
-+0x24 : 物理ドライブ番号(とりあえず0にしておくといいら...
-+0x25 : 予約(とりあえず0にしておくといいらしい)
-+0x26 : 拡張ブート識別コード(とりあえず0x29を書くらし...
-+0x27 - +0x2a : 0xffffffffを書いておくといいらしい(ボ...
-+0x2b - +0x35 : ディスクの名前、もしくはパーティション...
-+0x36 - +0x3d : "FAT12"(46 41 54 31 32 20 20 20)か、"...
*** さらに拡張されたSF16用BPB [#s2f9b71d]
-FAT16の記述に対してさらに+0x4fまで規定されている。詳細は...
*** FAT32用BPB [#udf2953e]
-(のんびり更新中)
* AT互換機の場合 [#cea2fe31]
-FDDの場合:
--ブートセクタの内容が0x0000:0x7c00に転送されます。そして...
--まだ確信はありませんが、この時のレジスタ状況はこんな感...
--DS=ES=SS=0, SP=0x7c00, FLAGS.IF=1(割り込み許可)
--ということでNASMやNASKを使ってブートセクタを書くなら、...
--このレジスタ初期値とかロード位置とかって、もしかして8bi...
--ブートセクタの最後の2バイトはシグネチャーです。0x55 0xa...
-HDDの場合:
--上記に加えて、SIにも値がセットされます。DS:SIからの16バ...
* TOWNSの場合 [#uf966747]
-形式1:
--セクタの最初の4バイトはシグネチャーになっております。ブ...
--0xb0000~0xb03ffにロードされる(512バイトセクタのときは...
--システムからはCALL 0xb000:0x0004で呼ばれる。
---ブートに失敗した場合、RETFするのが作法。その場合、シス...
---もしBPBを置くならここからプログラムを書くのは難しいの...
-形式2: (これって初代TOWNSとかでも使えるのかな?)
--セクタの0x03からの4バイトはシグネチャーになっております...
--0xb0000~0xb03ffにロードされる(512バイトセクタのときは...
--システムからはCALL 0xb000:0x0000で呼ばれる。
---ブートに失敗した場合、RETFするのが作法。その場合、シス...
---もしBPBを置くならここからプログラムを書くのは難しいの...
-IPLからCALLされた段階では、まだBIOSが使えない(泣)。と...
--ディスク読み込みファンクション
---AH = 0x05
---AL = device no. (0x20:FD0)
---CX = cylinder
---DH = head
---DL = sector no.
---BX = sectors
---DS:DI = buf-addr
---CALL 0xfffb:0x0014
---CF = 0なら正常終了
--文字表示ファンクション (シフトJISが使える)
---ES = 0xc000
---BH = 0x02
---DS:SI = struct { char y, x, len, string... } の構造体...
---CALL 0xfffb:0x001e
-TOWNSではATとは異なり、どのデバイスからのブートであるか...
--BLの下位4bit:デバイスのタイプ:1=HDD、2=FDD、8=CD-ROM
--BHの下位3bit:デバイス番号:0~7らしい
* 98の場合 [#g90df619]
-どうやらシグネチャーはありません。だからデータディスクで...
-ブートセクタの内容が0x1fc0:0x0000に転送されます。そしてB...
--512バイトセクタのときは、0x1fe0:0x0000なのかな?
-この項未完成
* AT/TOWNS/98対応IPLを作る場合 [#xed02ca1]
-TOWNSでは形式2を使って、そんでもって1440KBフォーマットに...
--もちろんATとTOWNSのシグネチャーを書きます。
-TOWNSの形式1を使った、つわものアルゴリズムもこの世には存...
-(まだできていないけどそろそろできるはずの)[[KHBIOS]]を...
* こめんと欄 [#z8dd6646]
-ATの上記情報は[[K]]が解析した内容をまとめただけです。も...
-TOWNSのブートシグニチャは0x03に置いてもちゃんと認識され...
-なんと!やるなーうんず! -- [[K]] SIZE(10){2003-07-01 (...
-実機でダンプをとったら, セクタサイズに関係なく1KB読み込...
-興味深い・・・。1440KBに最初に対応したのってHG/HRらしい...
#comment
終了行:
* ブートセクタ(IPL)を書く上で必要になりそうな情報 [#c4be9...
* DOS互換にするならブートセクタにBPBも書きます [#cf09cbe5]
*** 一番古い形式のFAT12/FAT16用BPB [#s846720e]
-最初の11バイト:
--AT/98の場合:
---+0x00 - +0x02 : jmp命令用の空き
---+0x03 - +0x0a : 名前(たいていはファイルシステムの名...
--TOWNSの形式1の場合:
---+0x00 - +0x03 : ブート可能であることを示すシグネチャ...
---+0x04 - +0x0a : jmp命令用の空き(あまりには名前を書い...
--TOWNSの形式2の場合:
---+0x00 - +0x02 : jmp命令用の空き
---+0x03 - +0x06 : ブート可能であることを示すシグネチャ...
---+0x07 - +0x0a : 名前
-+0x0b - +0x0c : セクタサイズ(一般的には512か1024)
-+0x0d : クラスタサイズ(1クラスタが何セクタで構成されて...
-+0x0e - +0x0f : FATがどこから格納されているか(このBPB...
-+0x10 : FATがいくつあるか(一般的には2)
-+0x11 - +0x12 : ルートディレクトリの長さ(32バイト単位)
-+0x13 - +0x14 : このドライブ(FDの場合はディスク、HDDの...
--ここは2バイトまでしか書けないので、1セクタ512バイトの場...
-+0x15 : メディアのタイプ(一般に1440KB-FDの場合は0xf0を...
-+0x16 - +0x17 : FATの長さ(1つ分の長さをセクタ数で)
-+0x18 - +0x19 : 1トラックにいくつのセクタがあるか(一般...
-+0x1a - +0x1b : ヘッドの数はいくつか(一般に1440KB-FDの...
-+0x1c - +0x1d : このBPBセクタはデバイスの先頭から数えて...
-全体的なフォーマット:
--+0x0e - +0x0fの値で示される部分から、次の順序で並ぶ。
|名前|長さ(バイト数)|備考|
|第一FAT|(+0x16 - 0x17)x(+0x0b - +0x0c)||
|第二FAT|(+0x16 - 0x17)x(+0x0b - +0x0c)|内容は第一FAT...
|ルートディレクトリ|(+0x11 - +0x12)x 32||
|ファイル領域|下記||
--ファイル領域のバイト数は(+0x13 - +0x14)x(+0x0b - +0x...
-FAT12/FAT16の区別は?
--まずファイル領域の総クラスタ数を算出。これは上記の方法...
*** 現在の形式のFAT12/FAT16用BPB [#lfe224ca]
-+0x1e - +0x1f : HDDの大容量化にあわせて+0x1c - 0x1dの内...
-+0x20 - +0x23 : +0x13 - +0x14の内容を4バイトで書いたもの
-+0x24 : 物理ドライブ番号(とりあえず0にしておくといいら...
-+0x25 : 予約(とりあえず0にしておくといいらしい)
-+0x26 : 拡張ブート識別コード(とりあえず0x29を書くらし...
-+0x27 - +0x2a : 0xffffffffを書いておくといいらしい(ボ...
-+0x2b - +0x35 : ディスクの名前、もしくはパーティション...
-+0x36 - +0x3d : "FAT12"(46 41 54 31 32 20 20 20)か、"...
*** さらに拡張されたSF16用BPB [#s2f9b71d]
-FAT16の記述に対してさらに+0x4fまで規定されている。詳細は...
*** FAT32用BPB [#udf2953e]
-(のんびり更新中)
* AT互換機の場合 [#cea2fe31]
-FDDの場合:
--ブートセクタの内容が0x0000:0x7c00に転送されます。そして...
--まだ確信はありませんが、この時のレジスタ状況はこんな感...
--DS=ES=SS=0, SP=0x7c00, FLAGS.IF=1(割り込み許可)
--ということでNASMやNASKを使ってブートセクタを書くなら、...
--このレジスタ初期値とかロード位置とかって、もしかして8bi...
--ブートセクタの最後の2バイトはシグネチャーです。0x55 0xa...
-HDDの場合:
--上記に加えて、SIにも値がセットされます。DS:SIからの16バ...
* TOWNSの場合 [#uf966747]
-形式1:
--セクタの最初の4バイトはシグネチャーになっております。ブ...
--0xb0000~0xb03ffにロードされる(512バイトセクタのときは...
--システムからはCALL 0xb000:0x0004で呼ばれる。
---ブートに失敗した場合、RETFするのが作法。その場合、シス...
---もしBPBを置くならここからプログラムを書くのは難しいの...
-形式2: (これって初代TOWNSとかでも使えるのかな?)
--セクタの0x03からの4バイトはシグネチャーになっております...
--0xb0000~0xb03ffにロードされる(512バイトセクタのときは...
--システムからはCALL 0xb000:0x0000で呼ばれる。
---ブートに失敗した場合、RETFするのが作法。その場合、シス...
---もしBPBを置くならここからプログラムを書くのは難しいの...
-IPLからCALLされた段階では、まだBIOSが使えない(泣)。と...
--ディスク読み込みファンクション
---AH = 0x05
---AL = device no. (0x20:FD0)
---CX = cylinder
---DH = head
---DL = sector no.
---BX = sectors
---DS:DI = buf-addr
---CALL 0xfffb:0x0014
---CF = 0なら正常終了
--文字表示ファンクション (シフトJISが使える)
---ES = 0xc000
---BH = 0x02
---DS:SI = struct { char y, x, len, string... } の構造体...
---CALL 0xfffb:0x001e
-TOWNSではATとは異なり、どのデバイスからのブートであるか...
--BLの下位4bit:デバイスのタイプ:1=HDD、2=FDD、8=CD-ROM
--BHの下位3bit:デバイス番号:0~7らしい
* 98の場合 [#g90df619]
-どうやらシグネチャーはありません。だからデータディスクで...
-ブートセクタの内容が0x1fc0:0x0000に転送されます。そしてB...
--512バイトセクタのときは、0x1fe0:0x0000なのかな?
-この項未完成
* AT/TOWNS/98対応IPLを作る場合 [#xed02ca1]
-TOWNSでは形式2を使って、そんでもって1440KBフォーマットに...
--もちろんATとTOWNSのシグネチャーを書きます。
-TOWNSの形式1を使った、つわものアルゴリズムもこの世には存...
-(まだできていないけどそろそろできるはずの)[[KHBIOS]]を...
* こめんと欄 [#z8dd6646]
-ATの上記情報は[[K]]が解析した内容をまとめただけです。も...
-TOWNSのブートシグニチャは0x03に置いてもちゃんと認識され...
-なんと!やるなーうんず! -- [[K]] SIZE(10){2003-07-01 (...
-実機でダンプをとったら, セクタサイズに関係なく1KB読み込...
-興味深い・・・。1440KBに最初に対応したのってHG/HRらしい...
#comment
ページ名: