; hello-os ; TAB=4 ;; -- 重要 ---------------------------------------------------------- ORG 0x7c00 ; このプログラムがどこに読み込まれるのか ;; ------------------------------------------------------------------ ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 ;; -- 重要 ---------------------------------------------------------- ;; 1日目の「DB 0xeb, 0x4e, 0x90」のマシン語が ;; アセンブラでは以下のようになる JMP entry DB 0x90 ;; ------------------------------------------------------------------ DB "HELLOIPL" ; ブートセクタの名前を自由に書いてよい(8バイト) DW 512 ; 1セクタの大きさ(512にしなければいけない) DB 1 ; クラスタの大きさ(1セクタにしなければいけない) DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする) DB 2 ; FATの個数(2にしなければいけない) DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする) DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない) DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない) DW 9 ; FAT領域の長さ(9セクタにしなければいけない) DW 18 ; 1トラックにいくつのセクタがあるか(18にしなければいけない) DW 2 ; ヘッドの数(2にしなければいけない) DD 0 ; パーティションを使ってないのでここは必ず0 DD 2880 ; このドライブ大きさをもう一度書く DB 0,0,0x29 ; よくわからないけどこの値にしておくといいらしい DD 0xffffffff ; たぶんボリュームシリアル番号 DB "HELLO-OS " ; ディスクの名前(11バイト) DB "FAT12 " ; フォーマットの名前(8バイト) RESB 18 ; とりあえず18バイトあけておく ;; -- 重要 ---------------------------------------------------------- ; プログラム本体 entry: MOV AX,0 ; レジスタ初期化 MOV SS,AX MOV SP,0x7c00 MOV DS,AX MOV ES,AX MOV SI,msg ;; 出力するメッセージのアドレスをSIレジスタに入れる putloop: MOV AL,[SI] ;; msgの1文字をALへ入れる ADD SI,1 ; SIに1を足す ;;(msgの文字を1文字ずらす) CMP AL,0 ;; 終端かどうかを調べる JE fin ;; 終端なら終わり MOV AH,0x0e ; 一文字表示ファンクション MOV BX,15 ; カラーコード INT 0x10 ; ビデオBIOS呼び出し JMP putloop ;; putloopへ戻る(繰り返す) fin: HLT ; 何かあるまでCPUを停止させる JMP fin ; 無限ループ ;; ------------------------------------------------------------------ msg: DB 0x0a, 0x0a ; 改行を2つ DB "I will make the hariboteOS after 30 days." DB 0x0a ; 改行 DB 0 RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令 DB 0x55, 0xaa