2009-01-01から1年間の記事一覧

ファイルシステムの特定って?

HDの場合は、MBRのパーティションの種類から、ファイルシステムが特定出来る(はずだ)が、 FDや、いきなりPBRを参照した場合、ファイルシステムを、どう特定するか... 結構、微妙な問題のような気がしてきた。 とは言え、FDは、ほぼ FAT12 だろうし、 …

用語の整理

何だか、色々と調べていくうちに、頭が混乱してくる。 混乱の原因の一つは、きっと、用語が整理出来ていないからだと思う。 実際、複数の資料で、同じ内容を違う用語で説明していたりする。 その上、どちらも、間違いとは言い切れず、 つまりは、元々混乱し…

FAT関連メモ・続き

各FAT仕様におけるディスク容量の最大値 各FATにおいて、 0x000 = 未使用、0x001 = 予約、0xFF7 = 不良クラスタ、0xFF8〜0xFFF = 終端 となっているので、実際に利用可能なクラスタは、0xFF5個。 よって、各FAT仕様における最大クラスタ数は、以下…

FAT関連メモ

FSINFO FAT32 で導入された、空き領域計算高速化の為の情報領域。 通常、ブートセクタの次のセクタに配置される模様。 1セクタ分確保されているが、有効データは8バイト分。 なんとも贅沢と言うか、勿体無い気もするわけだけど、こんなもんか? バックアッ…

ATA HDD or USB Memory or USB HDD

さて、何だか、ちょっと、脱線してしまった感じもあるわけですが、 怪我の功名と言うほどの事ではなくても、 まぁ、何となく、無駄ではなかった気もするので、 気を取り直して、調査継続です。 とりあえず、対象のHDDが、2つのパーティション、共にNTFS…

fseeko/ftello

gccベース?の場合は、fseeko/ftelloで、何となく動いてくれました。 Large File Support (LFS) うんたらかんたらといった記事をいくつか見付けましたが、 大半が数年前の内容で、今時、もしかしたら、当たり前の内容なのかもしれません。(^^;;; 該当関数を…

ちょっと整理...

えっと、とりあえず、自作OSで、あるメモリ領域の内容をHDに書き出したい。 さすがに、HDに対して、何も考えずに書き込むのは怖いから、 HDのフォーマットを調べて、上手く書き込んでやらないと... と。 そういう流れで、FATを調べているわけだけ…

とりあえず見てみるか...

MBR, PBR, 更に、ディレクトリ階層を辿って、目的のファイルにアクセスする事になるわけだけど、 仕様を調べているだけじゃ、やっぱり、ピンとこないので、 実際に中身を見てみる事にしよう。 と言うか、中身を見る準備って感じかな? とりあえず、MBRから覗…

PBR

PBR(Partition Boot Record) 各パーティションの先頭セクタに配置される管理情報。 フロッピーディスクの先頭セクタと、ほぼ同じ位置付けと考えられる。 FAT12or16の構成 オフセット 内容 サイズ 0 ジャンプコード 3 3 OEM名称 8 11 セクタのバイト数 2 13 …

ちょっと寄り道(CHS編)

良い機会なので、ハードディスクの容量制限の要因を、改めて整理してみる。 基本的には、ハードディスクのブロック指定方式に由来しているわけですね。当初、CHS方式で指定していたわけですけど、これには、更に、2つの仕様があって、 一つは、ATA規格の、C…

MBR

MBRの構造を調べる。 オフセット 内容 サイズ 0 ブートストラップローダ 446 446 パーティションテーブル(後述) 16*4=64 510 ブートシグネチャ(0x55,0xAA) 2 パーティションテーブルの構造 オフセット 内容 サイズ 0 ブートフラグ(0x80=ブート可,0x00=ブート…

ハードディスクの場合

フロッピーディスクの場合は、先頭のセクタが、BPB領域となっている。 いわゆる、ブートセクタで、はりぼてOSでも、ここから作り始めているわけで、 真面目に取り組んでいる人には、それなりに、見慣れた内容かもしれない。 ところが、ハードディスクの場…

FAT再び?

ハードディスクに書き込みしてみたいんだけど、 さすがに、フロッピーみたいに、お手軽に!!ってわけにはいかないよなぁ... やっぱり、FATを避けて通るのは、難しいという事か!?

読み込みは止めて、書き込みに使ってみた

今のところ、二次ローダー自体が小さいので、 セクタをまとめて処理する必要性が低い... そこで、読み込みではなくて、書き込みに使ってみる事にした。 ; ; 定数 ; WRITE_SIZE EQU 64 * 2 ; 64 * 2 (* 512) ; ; ROM BIOS 領域をフロッピーディスクに書き出し…

fdread

手順をまとめてみる。 ・64K境界については、呼び出し側で保証する。 ・読み込み開始セクタが1以外の場合は、最初の読み出しはそこから。 ・読み込みセクタ数は、読み込みサイズを超えない、最大のセクタ数に調整する。 という事で... .LCHECK_START_SECTOR…

しかし、なのである...

FreeBSDハンドブックによると「バウンスバッファ」、もしくは、 MS-DOSの世界では「スマートバッファ」とか呼ばれているらしい、 このDMACの64K制限&16M制限対応バッファなんですけど、 1.44Mフロッピーを前提として考えると、最低でも9K(18セクタ分)は欲し…

64K境界解決

どうにも64K境界について、理由が分からなかったので、はりぼてWikiで質問してみた。 そこで、Kさんから回答を頂いて、それを元に調べてみた。 とりあえず、犯人は、DMACでした。 DMACは、Intel 8237 互換の物らしいです。 これらは、元々、8085と組み合わせ…

readfastの後半部

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境界?

やっぱり、根本的な疑問として、何故、64K境界なんだろう? BIOS サービスのパラメータとして、ES:BXで、アドレスを指定するわけだけど、 セグメントアドレスの方は、BIOS サービス内で変更しないと考えると、 オフセットの最大値として64Kまでですよって事…

readfastの前半部

readfastの前半部の処理を追ってみます。 そもそも、この前半部の処理が、すんなり理解出来ずに、 きちんと自分の頭で考えないといけないなぁと思って、 readfastの読み解きをしようと思い立ったわけですけど、 コメントを読んだだけで分かった気になるのは…

まとめて読む

基本的には、今まで、1セクタ毎に読み込みしていた物を、 まとめて読み込むように修正するわけなんだけど、 ここで、いくつか注意点があると。 1つは、複数トラックにまたがるような指定は出来ないという点。 あるトラックの1セクタから読み込むのであれ…

はりぼてのreadfastを読み解く

さて、BIOS サービスを、大雑把に見てきたわけだけど、 ひとまず、どのようなサービスがあるのかは、何となく掴めた気がする。 結局のところ、起動から何らかのOSを起動するまでの、補助的な位置付けなわけだから、 至れり尽くせリの機能を求める方が、多…

INT 17h, INT 18h, INT 19h, INT 1Ah

INT 17h: プリンタ(セントロニクス?)関連 INT 18h: BASIC ローダー(ROM BASIC 非搭載の場合は、無効?) INT 19h: ブートストラップローダ INT 1Ah: CMOS情報関連か? これらは、当面、必要なさそうなので、現時点では、詳しく触れない。 ひとまず、BIOS サ…

INT 16h (AH=12h)

拡張キーボードフラグバイト bit7:SysRq bit6:Caps Lock bit5:Num Lock bit4:Scroll lock bit3:右Alt bit2:右Ctrl bit1:左Alt bit0:左Ctrl なるほど... Altキー及びCtrlキーの左右が別々に管理されている。 一応、区別出来るって事は、憶えておくとして... …

INT 16h (AH=1xh) 系

スキャンコードの変遷を調べてみて、なんとなく、納得。 INT 16h (AH=00h, 01h, 02h) では、基本的に、オリジナルの83/84キーボードが前提っぽい。 その後、101拡張キーボードで、右Ctrlや右Altキー他、キーが大幅に追加されたらしく、 それに対応した物が、…

INT 16h (AH=10h, AH=11h)

基本的には、INT 16h (AH=00, AH01)と同じように使えるはず。 但し、拡張とあるだけに、何か違うんだろうなぁ... とりあえず、置き換えてみると... readloop: ; キーボードステータス読み込み MOV AX, 1100h INT 16h JNZ readkey ; 入力文字があれば、読み込…

INT 16h (AH=02)

キーボードフラグの読み込み。 キーボードフラグとは、要するに、特殊キーの事。 詳細は、以下の通り。 bit7:挿入モードロック bit6:Caps lock bit5:Num lock bit4:Scroll lock bit3:Alt bit2:Ctrl bit1:左シフト bit0:右シフト シフトキーに関しては、左右…

INT 16h (AH=01)

キーボードステータス読み込み。 これは、読み込みと違い、ブロックしません。 また、入力があった場合、入力値を破棄しません。 入力が無い場合は、ゼロフラグが立ちます。 つまり、入力の有無を調べる為に使えるわけです。 そういうわけで、読み込みサービ…

INT 16h (AH=00)

キーボード入力読み込みです。 戻り値は、AH = SCAN CODE、AL = ASCII CODE のようになります。 なので、まぁ、ざっと書いてみると、こんな感じになります。 ; スタートアップメッセージ表示 MOV SI, startupmsg CALL puts readloop: ; キーボード一文字読み…