2009-11-01から1ヶ月間の記事一覧

CPUID命令を試す

さて、EFLAGSのIDビットが有効であれば、CPUID命令が使用可能という事で、 実際に、CPUID命令を使ってみます。(代表的な物だけ) ; CPUID (EAX=0000-0000h) XOR EAX, EAX ; CPUID DB 0x0F, 0xA2 CALL puthexl MOV SI, crlf CALL puts MOV [idstr+0], EBX MOV …

EFLAGSの任意のフラグをチェックする

先に作成したサブルーチンを使うと... ; IDフラグ MOV ECX, 21 CALL checkflg JNC noid MOV SI, idokmsg CALL puts みたいな感じになると。

面倒なので、フラグチェックを、サブルーチン化してみる。

; ; EFLAGSの指定ビットをチェックする ; ECX=チェックビット ; 指定ビットが変更可能であればCF=1 ; checkflg: PUSH EAX ; EAXレジスタの内容を退避 PUSH EBX ; EBXレジスタの内容を退避 ; 指定ビットをテスト&反転 PUSHFD ; フラグレジスタの内容を退避 P…

まずは、EFLAGSのチェック

CPUID命令が使用可能かどうかは、EFLAGSの21ビット目が、変更可能かどうかで判定する。 というわけで、やってみる。 ; フラグのbit21をオンにする PUSHFD ; フラグレジスタの内容を退避 POP EAX ; フラグレジスタの内容をEAXレジスタに転写 BTS EAX, 21 ; EA…

CPUID命令を調べる

さて、あれやこれやと、紆余曲折・試行錯誤の末、 一次ローダから二次ローダを読み込む事が出来るようになった。 この過程で、実は、意味もなく、32bitレジスタ(EAXとかEBXとか)を使ってみた。 当然だけど、8086には、32bit長レジスタなんてないわけだから、…

二次ローダ(とは限らないが... )の方は...

とりあえず、今までの内容を引っ越して、ORG 0x8000 に変更してみる。 はりぼてに倣ってビルド手順を進めようと思っていたけれど、 これまでの説明通り、FAT無しで進める事にしたので、色々と具合が悪い。 何よりも、edimgが、ブートセクタに関しては、BPBを…

で、僕はどうするか?

元々、FATについては、無視してきたけれど、 今回も、FATについては、無しにしようかと思います。 本来、FATは、MS-DOS用のファイルシステムであって、 一次ローダや二次ローダに、必ず必要な物であるわけじゃない。 まぁ、二次ローダによっては、あるファイ…

二次ローダのロード先とジャンプ先

ちょっと、繰り返しになるかもしれないけれど、用語が混乱しないように、再確認。 一次ローダとは、ブートセクタに含まれるコード。 ブートストラップローダとかIPLとか呼ばれる事もあるけれど、 用語が様々のようなので、僕は、一次ローダと呼ぶ事にして…

FAT12概要

はりぼてのFDイメージは、FAT12に準じています。 よって、ブートセクタの直後のセクタ、 つまり2セクタ目からは、FATが配置されています。 FAT領域は、メディアの全クラスタをポイントする必要がある為、 最低限、全クラスタ数x12bitの容量が必要になりま…

一次ローダ

そろそろ、ブートセクタの512Byteだけでは、手狭になってきたので、 一次ローダから、二次ローダ領域をロードする事にしよう。 もっとも、二次ローダが、ローダとして働くのは、先の事になりそうで、 暫くは、今までと同じように、遊び場として考える方針で。

INT 11h, INT 12h, INT 15h etc.

INT 11h ; INT 11h INT 11h ; 機器リストを表示 CALL puthex MOV SI, crlf CALL puts AXレジスタに機器リストが返る。 でも、機器リストの内容が、ちょっと古い感じ... INT 12h ; INT 12h INT 12h ; メモリサイズを表示 CALL puthex MOV SI, crlf CALL puts …

グラフィックは後回し

INT 10h 関連は、ひとまず、終了。 グラフィック系は、また、必要になった時に、調べましょう。

INT 10h (AH=B) やり直し

そういうわけで、パレット切り替えを、やり直しです。 chgpal: ; INT 10h(AH=0Bh) MOV AX, 0B00h ; INT 10h ; ちょっと待つ MOV AX, 0FFFFh ; CALL waitmsec RET パレット切り替え部分を、サブルーチン化してみました。 そんでもって、順に呼び出してみる。 …

INT 10h (AH=B)

INT 10h (AH=B):パレット指定... のはずなんだけど... ; INT 10h(AH=0Ah) MOV AX, 0A00h ; MOV BX, 000Fh ; INT 10h ; ちょっと待つ MOV AX, 0FFFFh ; CALL waitmsec ; INT 10h(AH=0Ah) MOV AX, 0A00h ; MOV BX, 001Eh ; INT 10h ; ちょっと待つ MOV AX, 0FF…

INT 10h (AH=8,9,A)

INT 10h (AH=8):カーソル位置の文字と属性を取得 ; カーソル位置の文字と属性を取得 MOV AX, 0800h MOV BX, 0000h INT 10h 結果は、AXに戻される。 今まで、レジスタの内容を、 その都度 AX レジスタに代入して puthex をコールしていたけど、 面倒になって…

INT 10h (AH=6,7)

INT 10h AH=6:スクロールアップ ; INT 10h AH=06h MOV AX, 0601h ; AL=スクロールアップ行数 MOV BX, 0000h ; BH=空行属性 MOV CX, 0505h ; CH=左上行, CL=左上列 MOV DX, 1345h ; DH=右下行, DL=右下列 INT 10h CX,DXレジスタで、スクロール対象のウィンド…

INT 10h (AH=4,5)

ビデオBIOSサービスルーチンを順に試す。 INT 10h AH=4:ライトペンの位置を取得 MOV AX, 0400h ; ライトペン位置の取得 INT 0x10 CALL puthex ; AX: ペンからのシグナル MOV SI, crlf ; 改行 CALL puts ; MOV AX, BX ; CALL puthex ; BX: ピクセルカラム? M…

INT 10h (AH=1,2,3)

ビデオBIOSサービスルーチンを順に試す。 INT 10h AH=1:カーソルタイプ設定 MOV AX, 0100h ; カーソルタイプ設定コマンド MOV CX, 0607h ; 開始終了スキャンライン INT 0x10 ; ビデオBIOS呼び出し CHに開始スキャンライン、CLに終了スキャンラインを設定。 …

落ちた!!

ビデオBIOSサービスルーチン(INT 10h)の画面モード取得(AH=0Fh)を実行してみたらQemuが落ちた。 vgabios.binが怪しそうだったので、Bochs関連のサイトから、新しそうなvgabios.binをダウンロード。 差し替えて試してみたところ、うまく動いた。 ふと、もしや…

次に、数値

文字列は、はりぼてのお陰で、さっくりと用意出来ましたが、 数値を表示するには、更に、もう一捻り必要になります。 いや、シンプルに出来るのかもしれないけれど、 僕の発想では、やはり、一捻り必要に思えるのです。 ひとまず、自分のやり方でやってみて…

まずは、文字列出力

なにはともあれ、文字列出力です。 でも、これって、はりぼての最初でも、やってるんですね。 だから、ここでは、素直に、はりぼての真似をしてみようと思います。 はりぼての helloos を参考に、文字列出力部を、サブルーチン化します。 パラメータは1つ。…

INT 10h 関連

実際、これらは、時代にマッチしているのかどうか、ちょっと疑問...

ようやく

さて、ようやく、本来のスタート地点に立てた感じです。 そしたら、何から始めましょうか... と。 BIOS がブートセクタをロードしてくれた後、 本来は、ブートローダがOS本体をロードするような手順になるわけだけど、 それは、まだ、必要ないので、必要に迫…

ブート出来た!!

ISO 9660 や EL TORITO の資料と首引きで、はりぼてイメージを追い掛けているうちに、 何となくだけれど、ブータブルCDのイメージが掴めてきた。 ブートイメージを自作するつもりでいたけれど、 どのようなイメージを作れば良いのか、具体的に分かってきた…

分かったっぽい

ディレクトリレコードの System Use 領域に書き込まれている内容は、 どうも RockRidge なる、拡張フォーマットらしい。 mkisofs が、Linux系のツールのようなので、そういう関係かな? とりあえず、正体は分かったっぽいので、本筋とは関係無さそうだから、…

ディレクトリレコード・改

まだ続いている、ディレクトリレコードとの格闘。 で、少し手直しした内容が、まぁ、こんな感じ。 typedef struct ISO_DR_t { uint8 Length; // [0000] このディレクトリのデータ長 uint8 ExtLength; // [0001] 拡張属性レコードのデータ長 // uint32both Lo…

はりぼてイメージを詳しく見てみたら、セクタ20が謎セクタになっている模様。 通常?ボリューム記述子群に続いて、パステーブルが配置されている事になっているみたいだけど、 ボリューム記述子群終端子がセクタ19にあって、 パステーブルがセクタ21か…

ISO 9660 ディレクトリレコード

構造としては、こんな感じになるわけだけど... // // Directory Record // (ディレクトリレコード) // typedef struct ISO_DR_t { uint8 Length; // [0000] このディレクトリのデータ長 uint8 ExtLength; // [0001] 拡張属性レコードのデータ長 uint32 Locat…

CDイメージを自作してみる

QEMUで、ほりぼてイメージからのブートが失敗する原因は、 ちょっと調べてみたけれど、すぐに分かりそうにないので、 一旦保留にして、自分でブートイメージを作って試してみる事にした。 ISO 9660 の仕様に沿ったデータ構造を、ちまちま実装中。

QEMUでCDブート出来ない?

ブータブルはりぼてイメージを使ってQEMUでの起動を試みる。 結果、起動せず... エラーコードのような数字が表示されて止まってしまう。 試しに、CDに焼いて、実機で試してみる。 こちらは起動した。 何故だ??? もう少し調べてみよう。