昔、同人ソフトをPC-9801用の作ってた頃、ソフトと言えば
MS-DOSが必要だった。買う人はたぶんMS-DOSを持って
いただろうし困ってる程の話では無かったのだが、やっぱり
MS-DOSが不要が望ましかった。
この頃に有料だが、GR-DOSと言う同人向けのOSが発売された。
有料は仕方が無いとしても、ライセンス形態がいまひとつ良く
判らず結局買わずに自力でMS-DOS無しのソフトを作った。
昔の話だし、今更PC-9801のソフトを作る人は居ないと思うが、
MS-Cを使ってROM化を検討している人の参考になるかもしれない
ので記録として書いておこうと思う。
昔、本で読んだのだが、MS-Cを使ってROM化をしようと思ったら
うまくできないのでMASMでやり直したら同じところでつまづいた
と言う話があった。つまりMASMでC関数を呼び出す事が出来たら
ROM化と言うのはMS-Cで出来ると言う事だと考えた。
当時MS-Cを購入して、最初は判らず配列の為にhugeでコンパイル
して、理解が進んでcompact→small→tinyとなっていった。com
までくればIPL起動の可能性に気づきコンパイラの出すアセンブル
リストを検討した。
どうすれば良いかと書くと、C関数を呼び出す短いアセンブラを
書けば良い話だ。当時のアセンブルプログラムのコメント等を外した
り固有名称を変更したものを記載する。
extrn _c_main:near
DGROUP GROUP _DATA,_TEXT
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
_TEXT segment WORD PUBLIC 'CODE'
org 0h
start:
mov ax,cs
mov ds,ax
cli
mov ss,ax
mov sp,0ffffh
sti
call _c_main
end_a:
jmp end_a
_TEXT ends
end start
このアセンブラプログラムからC言語を呼び出す。
void _cdecl c_main()
{}
C側はこんな感じだ。これをLINKでまとめてからIPLで読み込ませて
起動していた(IPLはオールアセンブラで書いた)。当時はIPLで起動
させたが、ROM化の場合、そのまま動くかもしれないか若しくは
少しの改良で済むのではないだろうか。
当然の話だが、MS-DOSが無いのでシステムコールを利用したり
自作の画面表示関数が必要になる。動作環境で数値演算プロセッサの
有無があったりするので、ライブラリはエミュレータのCLIBCEを
使っていた。
これまた昔の話だがWindows用のPC-9801エミュレータを知った頃、
前述のMS-DOS不要プログラムをフロッピーディスクイメージにして
起動したところ、非MS-DOSでもちゃんと動作したのには感動した。