次はOS?
ハード(?)は決まった。
後は実現可能か検討する必要はあるだろうが、とりあえず実現できると考えて進めていこう。
どうせ先生の許可がなければ、先へは進めないのだ。
「ハードが決まったら次はソフトだ」
ソフトなければただの箱、とはよくあるコンピュータを揶揄する言葉だ。
そりゃあプログラム内蔵方式なのだから、ソフトがないとはプログラムが無いわけで動くわけがない。
さしずめここではただの紙切れに板切れか。
「かといっていきなり表計算とかワープロとか作れるはずもないよな」
昔のコンピュータは本当に計算だけを延々とやってたわけだから、最初はまあこの程度でよかろう。
少しづつ高度なことをできるようにしていけばいいのだから焦る必要はない。
とはいえ最初の仕様というのは重要だ。
ソフトというのは予想以上に長い間使われることがある。
昔はまさか二〇〇〇年まで使わないだろうとメモリーの節約のためにほとんどのソフトが西暦の下二桁で年を表していた。
しかし二〇〇〇年が近づいてきて、皆が気づき始めた。
これやばくね? と。
年が一九〇〇になってしまうのだ。ソートすれば最新データが最古データになってしまう。
この騒ぎを覚えている人もまだ多いだろう。
例の二〇〇〇年問題だ。
そうでなくても、互換性というものが求められる。
新しいパソコンを買っても古いソフトが動かなくなったらまた買い換えなければならない。
そのため一度デファクトスタンダードとなったコンピュータはよっぽどのパラダイムシフトがなければ変えることは難しい。
ハードを換えることは簡単でも、ソフトを換えるのは大変なのだ。
「とりあえず必要なのはOSか?」
今のパソコンにOSは必須の存在だ。
Windowsとかunix系とか。
スマホなんかでもAndroidやらiOSやらがOSである。
「いやいや無理だから」
今のOSは長い年月をかけて大勢の人の力で作り上げてきたものだ。
一人でどうこうできるものではない。
「そうなるとやはり参考にするのは八ビットマシンか」
昔のパソコンは最小構成でできていると言っても過言ではない。
一人でOSもゲームもコンパイラやインタープリタだって作れた。
「だけど昔のパソコンはBASICがOS代わりだったんだよなー」
大抵のパソコンには標準でBASICが搭載されていて、電源を入れると即BASICが起動した。
必要があればそのBASICから他のソフトを読み込み実行するという形式だった。
僕の買ったパソコンには当時としては珍しくBASICが搭載されていなくて、必要に応じてテープレコーダから読み込む方式だったため、モニターと呼ばれる基本ソフトしか入っていなかった。
読み込みに時間はかかるが、専用テープレコーダーが付いていたため他の機種より読み込みは早かったし、エラーも起こりにくかったから、それほど気になるものではなかったし、BASICが無い分広いメモリーエリアが使えたからBASIC以外の言語なども好きにロードして使えた。
だけど中身がまるっきり違ってしまうし、エディタとコンパイラがセットだったりするから、好きなエディタで編集して好きなコンパイラでコンパイルするってことができなかったんだよなー。
「それができるようになったのはCP/Mを導入してからだったな」
だんだん思い出してきたぞ。
CP/Mは八ビットマシンで割と普及していたDOS、ディスクオペレーティングシステムだ。
フロッピーディスクが記憶装置として出始めた頃にそのフロッピーを制御するシステムとして開発された。
Windowsが普及するまで一般的に使われていたMS-DOSもこのCP/Mのクローンだったらしい。
CP/MはCCP、BDOS、BIOSと言われるプログラム郡で構成される。
CPPはシェル、いわゆるMS-DOSでいうところのCOMMAND.COMあるいはコマンドプロンプトのCMD.COMだ。
ユーザー入出力を担当する部分だ。
BDOSがOS本体で、画面表示やファイルの制御などOSに必要な基本機能を担当する。
そしてBIOSとはハードウエアとのやり取りをするいわゆるハードウエア制御を行う部分で、BIOSを移植するだけで、他のPCでもCPUが同じならCCPやBDOSは同じものが使えるようになっていた。
現在のパソコンでBIOSといえば、F-ROM化されていて、ハードウェアの基本設定をしたりOSを読み込むブートローダーをイメージする人も多いだろうが、本来はBasic Input/Output Systemの略語の通り、基本的な入出力システムを意味する言葉だ。
「ハードウェア依存部分はBIOSに集中して、インターフェイスを共通化すればハードウェアが進化してもBIOSを書き直すだけでOS部分はずっと使えるはずだ」
ハードウエアについてはまだまだ机上の空論レベルの設計だ。
実際に作るとなれば細かな、場合によっては大きな変更が必要になるであろう。
しかしそのたびに全体を書き換えていたのでは手間がかかって仕方がない。
互換性を保つためには、ハードウェア依存部分をできるだけ少なくする他ない。
もちろんOS自体の互換性も無視できないわけだが。
「まずはハードウエア制御の基本インターフェイスであるBIOSを作るのが良さそうだ」
CP/MのBIOSなら僕も作ったことがある。
パソコンを買い替えたときにそのパソコン用のCP/Mがむちゃくちゃ高かったので、なら書いちまえと。
今考えれば工数的にいって買ってしまった方が安いのだろうけど、そのおかげでRAMディスクや、フロッピーディスクのキャッシュ機能、二画面切り替え機能、プリンタスプーラなどの普通のCP/Mにはない機能を追加し、ものすごく快適な環境を手に入れることができたので、自分的には満足だった。
まあ、基本はそれをベースに作れば問題なかろう。
ハードウエアとして考えているのは表示部分、データ記憶部分、そしてデータ入力部分だ。
表示部分いわゆるディスプレイの制御と、メモリーやHDDに相当する部分、そしてキーボード入力を制御する部分をそれぞれ作っていかなければならない。
「とにかく出力ができなければ結果が確認できないからディスプレイ制御部分から考えるか」
入力は手書きでも行けるし、メモリーは精霊自身の記憶領域が使える。
つまりディスプレイ表示さえできればとりあえず動作確認できるということだ。
「問題は表示方式か」
パソコンはキャラクタRAMとグラフィックRAMの片方、あるいは両方を備えている。
キャラクタRAMとはそこにキャラクタコードを書き込むと別のチップがROMからデータに対応したフォントデータを取り出し、文字を表示するものだ。
これの利点は一バイトあるいは二バイトを書き込むだけで文字が表示できるので、高速であるしフォントデータがROMで別に用意されるので、主記憶領域を圧迫することもない。
性能の低い八ビットパソコンではよく使われた方式だ。
しかしこれはROMデータで用意されたフォントしか使えず、昔は漢字どころかひらがなさえ表示できなかったものである。
それに対してグラフィックRAMはその名の通りグラフィック、つまり画像で表示する方式だ。
画像であるので絵も文字も表示することができる。
そのかわり別途メモリ中にフォントや絵画データを用意しておかなければならない(漢字ROMが搭載されていた機種もあるが)。
こちらは基本小さなドットの集まりであるため一文字を表現するためには複数ドットが必要になる。
英数字なら最低限八×八の六四ドットは必要になるから1ビット1ドットとしても、キャラクタRAMに比べて少なくとも八倍の手間がかかると言うことになる。
しかし物は精霊コンピュータだ。
グラフィック表示をドットデータで表示する必要はない。
光魔法は非常に柔軟性のある魔法だ。
まるで鏡のように背景を映し出すこともできるし、拡大縮小も可能だ。そしてそれをするのにドットデータに変換する必要もない。
フォントのサンプルがあればそれを拡大縮小して表示することができるのだ。
データとしてはキャラクタRAM方式が簡単だろう。
とりあえず文字が表示できればいいから、表示方式はこれでいいか。
表示するのは精霊語と自国語。数字と後はいくつかの記号があればいいだろう。
自国語も母音と子音を組み合わせた精霊語をベースとしている文字らしく、形状は割と似ているし文字数も精霊語より二文字ほど多いか。
使う文字は自国語精霊語合わせて五〇文字くらいしか無いから数字と記号合わせてとりあえず一〇〇文字分もあれば表示上問題ないはずだ。
もちろん世界各国の文字や特殊記号を入れようとすれば、数万どころか数百万文字とか必要になってくるだろうが、まずは最低限の機能があればいいのだ。
表示サイズは八〇文字×二五文字とする。
これは国民機PC9801シリーズで英数字を表示したときの文字数だ。
今回は全角文字を想定していないから、キャラクタRAMは八〇×二五個あれば足りる。
元になるフォントは一〇〇文字以内に収めるつもりだから、一〇×一〇のテーブルがあればいいのだが今後電子式のコンピュータも作られるかもしれないし、ビットデータのシリアル伝送とかだとバイトやワードという単位が使われるかもしれないから、とりあえず二五六個のテーブルを用意すべきであろう。
そのうちShiftーJISとかも開発されるかもしれないし。
キャラクタRAM上の文字コードの数値×二五六して文字テーブルを探して、それを光魔法で転写すればいい。
表示ルーチンはこれを精霊語で書くだけだ。
あとは四則演算ルーチンと簡単な文字処理ルーチンを書けばいいか。
どうせ四則演算と文字処理は他でも使うしな。
僕は文字表示ルーチン、四則演算ルーチン、文字処理ルーチン構想をまとめ、紙に記載していく。
CP/M移植の話は実話です。
当時SMC-777CからPC-8801mkIIFRに1Mバイトの拡張メモリボードを突っ込み、CP/Mを移植。
RAMディスクや、フロッピーディスクのキャッシュ機能、二画面切り替え機能、プリンタスプーラなどもちゃんと実装されていました。
PC-8801mkIIFRは320KバイトのFDDが2機だったので、フルキャッシュしても640Kバイトで同じ大きさのRAMディスクを入れても、960Kバイト。
ちょうどメインメモリと同じ64Kバイトが余ったので、ここに2画面用のデータ退避エリアを設定。
OS用のエリアとか退避不要なエリアにプリンタースプーラ用のバッファを設定。
作中のようなCP/Mが完成しました。
表側でソースコードを修正して保存。裏に移ってコンパイル&GO。修正が必要なら表に戻って修正なんてやってました。