2023年1月19日木曜日

昔、同人ソフトでPC-9801でMS-DOS不要のソフトを作った話

昔、同人ソフトを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でもちゃんと動作したのには感動した。