2009-01-01から1年間の記事一覧
HDの場合は、MBRのパーティションの種類から、ファイルシステムが特定出来る(はずだ)が、 FDや、いきなりPBRを参照した場合、ファイルシステムを、どう特定するか... 結構、微妙な問題のような気がしてきた。 とは言え、FDは、ほぼ FAT12 だろうし、 …
何だか、色々と調べていくうちに、頭が混乱してくる。 混乱の原因の一つは、きっと、用語が整理出来ていないからだと思う。 実際、複数の資料で、同じ内容を違う用語で説明していたりする。 その上、どちらも、間違いとは言い切れず、 つまりは、元々混乱し…
各FAT仕様におけるディスク容量の最大値 各FATにおいて、 0x000 = 未使用、0x001 = 予約、0xFF7 = 不良クラスタ、0xFF8〜0xFFF = 終端 となっているので、実際に利用可能なクラスタは、0xFF5個。 よって、各FAT仕様における最大クラスタ数は、以下…
FSINFO FAT32 で導入された、空き領域計算高速化の為の情報領域。 通常、ブートセクタの次のセクタに配置される模様。 1セクタ分確保されているが、有効データは8バイト分。 なんとも贅沢と言うか、勿体無い気もするわけだけど、こんなもんか? バックアッ…
さて、何だか、ちょっと、脱線してしまった感じもあるわけですが、 怪我の功名と言うほどの事ではなくても、 まぁ、何となく、無駄ではなかった気もするので、 気を取り直して、調査継続です。 とりあえず、対象のHDDが、2つのパーティション、共にNTFS…
gccベース?の場合は、fseeko/ftelloで、何となく動いてくれました。 Large File Support (LFS) うんたらかんたらといった記事をいくつか見付けましたが、 大半が数年前の内容で、今時、もしかしたら、当たり前の内容なのかもしれません。(^^;;; 該当関数を…
えっと、とりあえず、自作OSで、あるメモリ領域の内容をHDに書き出したい。 さすがに、HDに対して、何も考えずに書き込むのは怖いから、 HDのフォーマットを調べて、上手く書き込んでやらないと... と。 そういう流れで、FATを調べているわけだけ…
MBR, PBR, 更に、ディレクトリ階層を辿って、目的のファイルにアクセスする事になるわけだけど、 仕様を調べているだけじゃ、やっぱり、ピンとこないので、 実際に中身を見てみる事にしよう。 と言うか、中身を見る準備って感じかな? とりあえず、MBRから覗…
PBR(Partition Boot Record) 各パーティションの先頭セクタに配置される管理情報。 フロッピーディスクの先頭セクタと、ほぼ同じ位置付けと考えられる。 FAT12or16の構成 オフセット 内容 サイズ 0 ジャンプコード 3 3 OEM名称 8 11 セクタのバイト数 2 13 …
良い機会なので、ハードディスクの容量制限の要因を、改めて整理してみる。 基本的には、ハードディスクのブロック指定方式に由来しているわけですね。当初、CHS方式で指定していたわけですけど、これには、更に、2つの仕様があって、 一つは、ATA規格の、C…
MBRの構造を調べる。 オフセット 内容 サイズ 0 ブートストラップローダ 446 446 パーティションテーブル(後述) 16*4=64 510 ブートシグネチャ(0x55,0xAA) 2 パーティションテーブルの構造 オフセット 内容 サイズ 0 ブートフラグ(0x80=ブート可,0x00=ブート…
フロッピーディスクの場合は、先頭のセクタが、BPB領域となっている。 いわゆる、ブートセクタで、はりぼてOSでも、ここから作り始めているわけで、 真面目に取り組んでいる人には、それなりに、見慣れた内容かもしれない。 ところが、ハードディスクの場…
ハードディスクに書き込みしてみたいんだけど、 さすがに、フロッピーみたいに、お手軽に!!ってわけにはいかないよなぁ... やっぱり、FATを避けて通るのは、難しいという事か!?
今のところ、二次ローダー自体が小さいので、 セクタをまとめて処理する必要性が低い... そこで、読み込みではなくて、書き込みに使ってみる事にした。 ; ; 定数 ; WRITE_SIZE EQU 64 * 2 ; 64 * 2 (* 512) ; ; ROM BIOS 領域をフロッピーディスクに書き出し…
手順をまとめてみる。 ・64K境界については、呼び出し側で保証する。 ・読み込み開始セクタが1以外の場合は、最初の読み出しはそこから。 ・読み込みセクタ数は、読み込みサイズを超えない、最大のセクタ数に調整する。 という事で... .LCHECK_START_SECTOR…
FreeBSDハンドブックによると「バウンスバッファ」、もしくは、 MS-DOSの世界では「スマートバッファ」とか呼ばれているらしい、 このDMACの64K制限&16M制限対応バッファなんですけど、 1.44Mフロッピーを前提として考えると、最低でも9K(18セクタ分)は欲し…
どうにも64K境界について、理由が分からなかったので、はりぼてWikiで質問してみた。 そこで、Kさんから回答を頂いて、それを元に調べてみた。 とりあえず、犯人は、DMACでした。 DMACは、Intel 8237 互換の物らしいです。 これらは、元々、8085と組み合わせ…
BIOS サービスの呼び出しについては、特に問題はないでしょう。 やはり、オフセット指定 BX は、0ですね。 リトライ処理も、基本的には、ipl10.nasと同様と見て良いでしょう。 後半部でのポイントも、やはり、ESレジスタに関する部分かと思います。 ここで…
64K境界問題は、とりあえず、保留にして、先に進んでみる事にしよう。 MOV AH,BL ; < BXからALの最大値をAHに計算 > CMP BH,0 ; if (BH != 0) { AH = 18; } JE .skip1 MOV AH,18 .skip1: CMP AL,AH ; if (AL > AH) { AL = AH; } JBE .skip2 MOV AL,AH .skip2…
やっぱり、根本的な疑問として、何故、64K境界なんだろう? BIOS サービスのパラメータとして、ES:BXで、アドレスを指定するわけだけど、 セグメントアドレスの方は、BIOS サービス内で変更しないと考えると、 オフセットの最大値として64Kまでですよって事…
readfastの前半部の処理を追ってみます。 そもそも、この前半部の処理が、すんなり理解出来ずに、 きちんと自分の頭で考えないといけないなぁと思って、 readfastの読み解きをしようと思い立ったわけですけど、 コメントを読んだだけで分かった気になるのは…
基本的には、今まで、1セクタ毎に読み込みしていた物を、 まとめて読み込むように修正するわけなんだけど、 ここで、いくつか注意点があると。 1つは、複数トラックにまたがるような指定は出来ないという点。 あるトラックの1セクタから読み込むのであれ…
さて、BIOS サービスを、大雑把に見てきたわけだけど、 ひとまず、どのようなサービスがあるのかは、何となく掴めた気がする。 結局のところ、起動から何らかのOSを起動するまでの、補助的な位置付けなわけだから、 至れり尽くせリの機能を求める方が、多…
INT 17h: プリンタ(セントロニクス?)関連 INT 18h: BASIC ローダー(ROM BASIC 非搭載の場合は、無効?) INT 19h: ブートストラップローダ INT 1Ah: CMOS情報関連か? これらは、当面、必要なさそうなので、現時点では、詳しく触れない。 ひとまず、BIOS サ…
拡張キーボードフラグバイト bit7:SysRq bit6:Caps Lock bit5:Num Lock bit4:Scroll lock bit3:右Alt bit2:右Ctrl bit1:左Alt bit0:左Ctrl なるほど... Altキー及びCtrlキーの左右が別々に管理されている。 一応、区別出来るって事は、憶えておくとして... …
スキャンコードの変遷を調べてみて、なんとなく、納得。 INT 16h (AH=00h, 01h, 02h) では、基本的に、オリジナルの83/84キーボードが前提っぽい。 その後、101拡張キーボードで、右Ctrlや右Altキー他、キーが大幅に追加されたらしく、 それに対応した物が、…
基本的には、INT 16h (AH=00, AH01)と同じように使えるはず。 但し、拡張とあるだけに、何か違うんだろうなぁ... とりあえず、置き換えてみると... readloop: ; キーボードステータス読み込み MOV AX, 1100h INT 16h JNZ readkey ; 入力文字があれば、読み込…
キーボードフラグの読み込み。 キーボードフラグとは、要するに、特殊キーの事。 詳細は、以下の通り。 bit7:挿入モードロック bit6:Caps lock bit5:Num lock bit4:Scroll lock bit3:Alt bit2:Ctrl bit1:左シフト bit0:右シフト シフトキーに関しては、左右…
キーボードステータス読み込み。 これは、読み込みと違い、ブロックしません。 また、入力があった場合、入力値を破棄しません。 入力が無い場合は、ゼロフラグが立ちます。 つまり、入力の有無を調べる為に使えるわけです。 そういうわけで、読み込みサービ…
キーボード入力読み込みです。 戻り値は、AH = SCAN CODE、AL = ASCII CODE のようになります。 なので、まぁ、ざっと書いてみると、こんな感じになります。 ; スタートアップメッセージ表示 MOV SI, startupmsg CALL puts readloop: ; キーボード一文字読み…