create every day - 福野泰介の一日一創

ジャンクパソコンで遊ぼう! 「30日でできる! OS自作入門」でパソコン再入門

2015/12/28 23:55:00
#maker #pcos 

現代のパソコンは電源を入れるとOSがすでにインストールされていて、当たり前のようにウィンドウな画面が出てきます。 これをOS部分から作って使ってみます(これを近年はベアメタルと呼ぶらしい)。

先日作りかけた「IchigoJam for PC」は、残念ながら実機では起動しなかったので、もう一度名著「30日でできる! OS自作入門」を読みながら、挑戦! ちょっとプログラミングをかじったことある人向けに書かれているので非常に楽しく読めます。 (Amazonさんによると私はこの本、2006/4/4に購入した様子、もう約10年前!Kindle版もでています!)

Intelのマシン語を使うのは実は初めて。8bit時代から、レジスタがA(8bit)、AX(16bit)、EAX(32bit)と歴史が感じられて楽しい。


今日は、画面モード320x200に切り替えて、文字とドットを表示してみるところまで。

本書内のリンクが変更されているので注意。
http://community.osdev.info/?(AT)memorymap → http://oswiki.osask.jp/?(AT)memorymap
0x7c00 に起動用のプログラムが設置される!

http://community.osdev.info/?(AT)BIOS → http://oswiki.osask.jp/?(AT)BIOS
INT命令で呼び出すさまざまなBIOS(=Basic Input Output System)の呼び出し方が書いてある。
BASIC言語のことではなく、現代風にいうと基本的な入出力APIのこと。
INT 0x1a を使うと時間が取得できるので、壊れたパソコンを変わった時計にしておくのもありかも。
「INT(0x18); ROM-BASICを起動 」とかあっておもしろい。(残念ながら動きません、動くパソコンあったら楽しい!)

こちらがOS入門から改造した今回のコードです。naskという筆者オリジナルのアセンブラ言語で書かれていますが、だいたい標準?

ORG 0x7c00 ; このプログラムがどこに読み込まれるのか ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 JMP entry DB 0x90 DB "IPL-15 " ; ブートセクタの名前を自由に書いてよい(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 "IchigoJamPC" ; ディスクの名前(11バイト) DB "FAT12 " ; フォーマットの名前(8バイト) RESB 18 ; とりあえず18バイトあけておく ; プログラム本体 entry: MOV AX,0 ; レジスタ初期化 MOV SS,AX MOV SP,0x7c00 MOV DS,AX MOV ES,AX ;basic: ; INT 0x18 ; ROM BASICを起動! chmod: MOV AH,0x00 ; 画面モード変更 ; MOV AL,0x12 ; 640x480x4bit MOV AL,0x13 ; 320x200x8bit ; MOV AL,0x03 ; 80x25 text INT 0x10 ; ビデオBIOS呼び出し ; JMP screen screen: MOV AX,0x1010 MOV BX,1 MOV DH,0xff MOV CH,0xff MOV CL,0xff INT 0x10 MOV AH,0x0c MOV AL,1 MOV CX,40 MOV DX,40 INT 0x10 MOV AH,0x0c MOV AL,1 MOV CX,20 MOV DX,20 INT 0x10 MOV AH,0x0c MOV AL,1 MOV CX,30 MOV DX,30 INT 0x10 MOV SI,msg putloop: MOV AL,[SI] ADD SI,1 ; SIに1を足す CMP AL,0 JE fin MOV AH,0x0e ; 一文字表示ファンクション MOV BX,1 ; カラーコード INT 0x10 ; ビデオBIOS呼び出し JMP putloop fin: HLT ; 何かあるまでCPUを停止させる JMP fin ; 無限ループ msg: DB "IchigoJam BASIC pc ver0.0.1 by jig.jp" DB 0x0d, 0xa ; 改行 DB 0 RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令 DB 0x55, 0xaa

年末年始、OSからの再入門、いかがでしょう?

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image