25ー27日目 - naskの代替ツールの開発 2016/5/11, 14, 15

方針転換

自ら修正しておきながらですが、このまま既存のnaskを修正していくのは不可能と判断し、自分独自のツールを作っていくことに決めました。

格納先はHiroyuki-Nagata / opennask、それなりに動きます。

Parasol

構文解析器として、手軽なC++のツールを探したところParasolというものが見つかったので、それを使用させていただきました。

ドキュメントは乏しいですが、それなりに思ったように動いてくれるので使いやすいです。

Parasol - 実行時文法定義のできる構文解析ライブラリ -

1日目の終了の時

ようやく憎いnaskファイルをimgファイルに変換し、実行できる時が来ました。

何がnaskだ!要は構文解釈してバイナリ出しとるだけや。悪しきC言語使用者に死の裁きを…

; hello-os
; TAB=4

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

		DB		0xeb, 0x4e, 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バイトあけておく

; プログラム本体

		DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
		DB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
		DB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
		DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
		DB		0xee, 0xf4, 0xeb, 0xfd

; メッセージ部分

		DB		0x0a, 0x0a		; 改行を2つ
		DB		"hello, world"
		DB		0x0a			; 改行
		DB		0

		RESB		0x1fe-$			; 0x001feまでを0x00で埋める命令

		DB		0x55, 0xaa

; 以下はブートセクタ以外の部分の記述

		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB		4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB		1469432

Hello, World部分は好きに変えられます。手こずらせやがって…

Finish first Day!