ページへ戻る

+ Links

 印刷 

sero​/g01_os :: OSASK計画

osaskwiki:sero/g01_os

g01ってOSと見なせるよね? anchor.png

  • g01では、実行ファイルのフォーマットが規定されていて、ファイル入出力・キーボード入力・画面出力・コマンドライン取得のAPIが定義されている。
  • これだけのものがあれば、もはやg01は新たなプラットフォームのOSだと見なしてもかまわないはず。
  • Kさんのメモでもすでにそう述べられている。
  • 2011年05月中旬に、(少なくとも自分にとっては)面白いことを思いついたから、実践してみよう。
  • 開発ツール系のアプリがg01として作られているんだから、純粋にg01だけでアプリ開発ができるはずだ(cc1.exeはg01でないからnaskがメインになるけど)。
  • つまり、この新しいプラットフォームg01上でセルフ開発やってみようという企画。
Page Top

環境整備 anchor.png

  • まずは使える道具を確認しよう。hidetol_8を用意して、z_toolsを眺めてみる。
  • 使える(g01の)ツールは、akusA, bim2g01, bim2hrb, bin2obj, bin2ucc, cpy, cpyc, gas2nask, golib00, hexdump, makefont, mtek2org, naskcnv0, Nasuka, obj2bim, rjcg01, sjisconv, tekmin0, tekmin1
  • よく知らないものを調べる。
    bin2ucc
    ファイルをC言語のunsigned char配列形式にダンプする
    mtek2org, rjcg01, tekmin*
    よく分からなかった(あとで調べるかもしれない)
  • C言語でなくnaskがメインになる予定なので、z_tools/com*.txtを読んでnaskからg01を得る手順を調べる。
    • nask:nask→obj, obj2bim:obj→bim×rlm, bim2g01:bim×rlm→g01, tekmin0;bim2bin;tekmin1:g01→g01(tekによる圧縮)
    • bim2binはg01でないので圧縮はいったんあきらめる。したがって、nask;obj2bim;bim2g01でnask→g01(圧縮なし)のビルドができることがわかった。
  • あとは、キーボードからの入力をファイルに書き出す補助ツールがあれば、「ソースの入力→アセンブル→リンク」がg01だけで実現できることになる。
  • で、作った。ファイル名: input.c
    #include <guigui01.h>
    
    void G01Main(void) {
    	static const unsigned char cmdusage[] = {
    		0x86, 0x50,
    		0x8c,
    		0x40
    	};
    	char * const p0 = g01_bss1a1, *p = p0;
    	int flag = 0;
    
    	g01_setcmdlin(cmdusage);
    
    	for (;;) {
    		int c = jg01_inkey3();
    		if (c == '\r')
    			c = '\n';
    		g01_putc(c);
    
    		if (!flag) {
    			if (c == 'q')
    				flag = 1;
    			else
    				*p++ = c;
    		} else {
    			if (c == '\n')
    				break;
    			*p++ = 'q';
    			*p++ = c;
    			flag = 0;
    		}
    	}
    	*p = '\0';
    
    	g01_getcmdlin_fopen_s_3_5(0);
    	jg01_fwrite1f_5(p - p0, p0);
    }
  • 出力ファイル名を受け取り、入力された文字をそこに書き込む。入力の終了は'q'+Enterで表す。
  • 必要最低限のツールセットができた。
  • まとめ:hidetol_8 + ソースの入力ツールinput.g01 を使ってnaskで開発ができる。
Page Top

g01-computer? anchor.png

  • (概念的な話なのでこの節は読み飛ばし可)
  • 想像してみよう。あなたのPC(Windows/Linux)から通信のケーブルが伸びている。その先には5インチHDDくらいの大きさの黒い箱がつながっていて、上面には"g01-computer"と刻印がある。
  • この箱はコンピュータでありx86のCPUを積んでいることはほぼ確実だが、その他のハードウェア構成は不明である。あるプロトコルに基づいてPCと接続されていることも分かっている。
  • PCでefg(あるいはhijk)を起動すると、指定されたプログラムがg01-computerで実行される。
    • (何らかの方法でPCとg01-computerはストレージを共有している、すなわちファイルは自由に読み書きできると仮定する)
  • つまり、「efgはg01プログラムの実行環境(仮想マシン)である」という通常の解釈のほかに「efgは接続された架空のコンピュータの端末エミュレータである」という解釈もできるわけだ。
  • この企画が実現しようとしているのは、後者の解釈における架空のコンピュータ"g01-computer"上でのセルフ開発である。
  • このコンピュータ用のアセンブラとリンカがすでに作成されているのだから、あとは端末からの入力をそのままファイルに書き出すプログラムがそのコンピュータ上で動けば(理論上)セルフ開発が実現できる。
Page Top

Getting started anchor.png

  • まずはおなじみのHello, worldから始める。
  • 先ほど作ったinput.g01を起動して、
    ../z_tools/hijk input hello.nas
  • GUIGUI01​/memo30のソースを一文字ずつ入力する。終了は'q'+Enter。
    • input.g01は入力ミスをしても取り消す方法がないので、Ctrl+Cで強制終了して初めからやり直すことになる。(ミスタイプで2回やり直した)
  • そしてアセンブル&リンク
    ../z_tools/hijk ../z_tools/Nasuka hello.nas hello.obj
    ../z_tools/hijk ../z_tools/obj2bim rul:../z_tools/guigui01/guigui01.rul out:hello.bim stack:0 rlm:hello.rlm ../z_tools/guigui01/g01libc0.lib hello.obj ../z_tools/guigui01/g01libc1.lib
    ../z_tools/hijk ../z_tools/bim2g01 hello.bim hello.g01 hello.rlm
    • (このステップも面倒だから自動化したいけど、今のg01は外部プログラムの起動がサポートされてないので手入力)
  • 実行
    ../z_tools/hijk hello
Page Top

ラインエディタ → 中止 anchor.png

  • 最小限のツールセット(上記)でもプログラムが作れることは実証できた。
  • しかし、ミスタイプがあるたびに入力を最初からやり直すことは、ある程度以上の規模のプログラムにおいて、現実的でない。そしてこの規模の限界は相当小さい。
    • hello, worldくらいならともかくも、入力のやり直し中にさらにミスタイプすることは十分に起こりえる、というか起きないほうがおかしい。
  • (ミスタイプのたびに入力をやり直すなんてパンチカード・紙テープの時代みたいだ)
  • だから、実際の開発ではテキストの編集操作が行えるテキストエディタが必要となる。
  • ところで、この企画はセルフ開発がテーマだった。だからこのテキストエディタもg01プログラムとして作成する必要があるし、その上、作成に使える道具は最小限のツールセットだけだ。
  • 上で述べたことから、テキストエディタの作成自体もそれなりに困難な作業になってしまうので、できるだけ簡単に作れるエディタが望ましい。
  • じゃあ仕様から。テキストの編集は行を追加・削除することで行う。つまり作成するエディタはラインエディタとなる。
  • これ以外の機能は持たせない。つまり、起動すると新規ファイルを作成する→行を追加していく→間違えた行を削除し正しい行を追加する→終了時にファイルに書き込む、という入力作業になる。
  • と、2010-07-01の昼頃からこの仕様を考えた。これから、紙の上でnaskプログラムを作成する。
  • プログラム作成の手順は次のようにすることを考えた。
    1. まず、"_G01Main: ret"という何もしないプログラムを作成する。
    2. これに、機能をひとつ付け加えたプログラムを紙の上で作る。
    3. 元のプログラムをcpy.g01でバックアップし、input.g01で新しいプログラムを入力する。
    4. 動作を確認し、次の機能の作成に移る。
    5. 以上を、プログラムが完成するまで繰り返す。
  • この手順だと、書くべきプログラムの量は増えるが、全体を一気に入力する方法に比べてデバッグがやりやすいと考えた。
  • 2011-07-13現在、上の手順を2回繰り返し、コマンドラインパラメータの定義と、入力ファイルを開き(デバッグ用に)そのまま出力する機能が実装された。
  • この時点でプログラムは607バイトあり、この入力に約5回タイプミスをしてやり直した。
  • 手元にラインエディタ全体で約2.5KBを下回ることはないという見積もりがあるので、プログラムの長さはこの約4倍以上になる。
  • 簡単な計算によりこのプログラム全体をタイプミス無しに入力できるまでのやり直し回数の期待値は600回余りとなる。
  • これは(不可能でないまでも)現実的な値でないので、もっと短いプログラムでソースコードの入力支援を行う必要があると結論し、ラインエディタの作成を中止した。
  • まだ未完成。進展があったら更新。
Page Top

展望 anchor.png

  • この企画でやってみたいことの列挙
    Hello, world
    GUIGUI01によるセルフ開発が可能であることの実証 (完了)
    ラインエディタ
    テキストデータの入力支援
    (詳細未定)
    プログラムの入力支援
Page Top

コメント欄 anchor.png

  • おもしろそう! -- k-tan 2011-07-01 (金) 09:18:22
  • なるほど、確かに外部プログラム起動の機能はほしいですね。 -- k-tan 2011-07-04 (月) 07:29:45

Last-modified: 2011-07-20 (水) 00:00:00 (JST) (319d) by lina