SHARP PC-1600KでCP/M80!その3

f:id:PocketGriffon:20210501104229j:plain

CP/M80のPC-1600Kへの移植、その3

 

とりあえずいろんなソフトを動かしてみては動いたり動かなかったり、安定動作とはほど遠い状態で、あくまでも実験的な側面が大きい今回のCP/M80移植。

MBASICが動いた事で、なんとなくこの辺りまでで良いかな…とかも思い始めたので、この先どうするのかを考えつつも、技術資料だけは残さねば…と思ってのブログ(^^;

次にチャレンジする人(!)のためにも後世に残さねば!

MSX-DOSの移植とかも楽しいかもよ!(ハード構成が違うから簡単じゃないと思うけど…)

 

CP/M80の入手と起動準備

まずはCP/M80起動に必要なCCP、BDOSの入手のお話。

この辺り、だいぶグレーゾーンな事をしているので、ぱぱっと書きたい(^^;;

私は文豪のROMから該当するバイナリ部分を抜き出している!CCPとBDOS部分はバイナリでしか手元にない。前回のブログで「過去にCP/M80を動かすエミュレータを作った」と書いたが、その時にもバイナリ状態のCCP+BDOSでCP/M80を起動させている。

 

なぜこんな芸当でCP/M80が起動させられるのかと言えば、CP/M80は1バイト単位で「どこのアドレスに何の情報が書いてある」のかが細かく決められているからだ。所定の場所に決められた情報を配置する事で、CP/M80は起動させる事が出来る。

f:id:PocketGriffon:20210501100926j:plain

ユーザーが書くべき部分はBDOS直後に続くBIOS部分のみだ。

先頭の34バイトに17個分のジャンブテーブル、その直後に16バイトのディスクパラメータが必要。それ以降は任意のアドレスに好きに書いていく事が出来る。

「なーんだ、そんな簡単なのか」と思われた方も多いかと思うが、CP/M80は移植性が高い構成になっているので、決まりごとさえ覚えてしまえば小難しい事はない。

最低限、8080(またはZ80)の知識と、その移植するマシンについての事の理解がありさえすれば、CP/M80の移植難易度はぐっと下がる。

 

ちょっとだけ補足をすると、文豪のCP/MはPC-1600Kよりも高アドレスで動作するようになっているため、そのままではPC-1600Kで動かす事が出来ない。しかし移植性の優れたCP/MなのでMOVECPMやSYSGENなど、他環境で動かすためのツールがたくさんある。これらを駆使してPC-1600Kで使えるCCP/BDOSに作り変えた。

 

無理矢理CP/M80を起動させる!

もうこのタイトルから言って無茶してるなーって思ってもらえれば(^^;;

CP/M80の起動シーケンスは、正しい方法を取ろうとすれば結構面倒くさい。実際にどのようにしてOSが起動するのかは、その手の本を読めば沢山の情報が出てくる。

しかし今回はお気楽にCP/Mを動かしたいと考えているので、面倒な部分をすべてすっ飛ばして起動させたい。

 

具体的な方法を書いちゃうけど、メモリのC400hからCP/M80のセット(CCP+BDOS+BIOS)をロードし、BIOSの先頭アドレスへジャンプさせる。これだけだ(^^;;

そしてBIOSを初期化する前に(ブログのその1でも書いた)メモリマップの変更や割り込みへの対応をした後、通常シーケンスの初期化をしてCP/M80を起動させている。

 

BIOSには17個のエントリ(BOOT WBOOT CONST CONIN CONOUT LIST PUNCH READER HOME SELDSK SETTRK SETSEC SETDMA READ WRITE PRSTAT SECTRN)が存在するが、このうち起動させるために必要なのはBOOT、CONOUT、SELDSKの3つだ。他のは何もしない(RETのみ記述。SECTRNだけはHL=BCしてRET)だけしておけば大丈夫。起動した直後にCONSTとCONINが必要となる。

 

上記3つのエントリのうち、ちゃんと書かないといけないのはBOOTとCONOUTだけだろう。SELDSKは既定値(HL=ディスクパラメータへのアドレス)を返すようにプログラミングしておけば良い。これだけでCP/M80は起動する。

その後、CONST、CONINを正しく実装すればキー入力を受け付けるようになる、というわけだ。

 

起動までの問題は?

ぱぱっとテキストレベルで書いてみたが、実際には起動までにさまざまな問題が出た。

デバッガやエミュレータがあるわけではないので、動かなかった時の対応は非常に難しい。実はどうしてもバグが取れず、部分的ではあるがZ80エミュレータを用いている。以前書いたCP/M80エミュレータの、Z80エミュレーション部分だけを抜き出してきて動かしていた。

 

そのエミュレータ+PC-1600K本体の2段構えでCP/M80起動を試していたわけだが、どうしてもエミュレータと同じ動作にならず困惑した。

もっとも多かったトラブルが「スタック領域が足りない」というものだった。

 

CCPやBDOSがどのくらいのスタック領域を用意しているのかが分からない上に、スタックが破壊されるバグは、後々になって動作が変になる現象が出るため、非常に追いづらい。実験をしてみた結果、どうやらCCP、BDOSでは数バイト程度のスタックしか用意されていない感じだ。CP/M80という非常に軽い(軽快という意味)OSから呼び出す、PC-1600Kという非常に多機能なIOCSを呼び出すにはスタック不足になってしまうらしい。その結果、スタック付近のプログラムを破壊してしまい、後に動作が変になる…という症状だった。

 

おかげでIOCSコールをする部分にはすべてスタックを別途用意するコードを入れねばならなくなったため、さらに処理が重くなった(^^; 同様に割り込みでも同じ問題が起こる事が予想出来たため、割り込み処理の先頭にもスタックの設定をするコードが入った。うむむ…重いぞw

f:id:PocketGriffon:20210501112606j:plain

 

CP/M80の事を書いていると、テキストばっかりになってしまい、読んでる側もつまらないだろうなぁ…と思う(^^; 

一時期、文豪を活用するためにCP/Mの本を買いまくってた時期があった。そのため、私の手元にはCP/Mの本がとても沢山ある。まさか令和の時代になってまで大活躍するとは思っていなかったw

 

次回、増設メモリを用いたRAMディスクの話をしつつ、この先どうしていこうかの話を書いて終わりくらいだろうか…。MBASICが動いたことでちょっと安心してしまった自分がいる(^^;

 

ではまた次回!(^-^)ノ