
CP/M-68Kを移植していく 番外編
ディスク書込みも実装してCP/M-68Kが動くようになったところで問題発覚。いくつかのコマンド実行すると、Exception $08 (特権違反)が発生。MC68010から特権命令になった MOVE SR, Dn の命令が原因らしい。 pic.twitter.com/9WsOhB3tNF
— 四寸五分 (@4sun5bu) October 20, 2024
MC68010ならではの苦悩
素直にMC68000でボード組めばよかったのに、MC68010を選んだばっかりに引っかかったおはなしです。
CP/Mが起動して試してみると、いくつかのトランジェントコマンドが、Exception $08が発生して実行できませんでした。$08は特権命令違反で、発生するアドレスをDDTで調べてみると、次のコードでした。
MOVE SR, D0
この命令は、MC68000では問題ないのですが、MC68010だと特権命令になっていて違反が発生してしまいます。
CP/M-68Kに含まれていたREADME.TXTを読んでみると、「LCPM10.SUBでCP/Mをビルドしろ」と書かれているのですが、このサブミットコマンドで使われているLO68.REL自体が違反を発生してしまいます。さらにBIOSをアセンブルするにしても、AS68.RELも違反を発生します。これでは、MC68010用のCP/Mをビルドするのに、MC68000のシステムが必要になり完全に手詰まりです。
突破口
この件をXでつぶやいたところ、Electrelicさんが解決につながるヒントをくれました。MC68010用のCP/Mは、特権命令違反が発生した場合、
MOVE from SRだったらMOVE from CCRに書き換えて再実行している
ということです。これを実装するには自分の能力がたりないので、バイナリエディタでコマンドを直接書き換えてしまいました。
具体的には、偶数番地から始まる 0x40 0xC0 を探し、0x42 0xC0 に書き換えてしまいます。コマンドにもよりますが、1,2箇所書き換え箇所がります。
最低、AS68.RELとLO68.RELを書きかえれば、BIOSのアセンブルとCPM.SYSとのリンクができます。 一度、MC68010用にビルドしたCP/Mが起動してしまえば、バイナリ書き換えをしていないコマンドでも実行できるようになります。