CP/M-68Kを移植していく Part 4
Exception $03 を解決する
前回、コンソール入出力のみ実装して、A> が出るところまできましたが、Exception $03 が出ていました。今回は、これを止めに行きます。
Exception $03 とは何なのか?
https://people.engr.tamu.edu/rgutier/lectures/mbsd/mbsd_l9.pdf
を参照すると、$03はAddress Errorです。CPUが奇数アドレスを16-bit か 32-bitアクセスすると起きる例外です。
$03に続くメッセージを見ると、$9a0800007 で起きていることがわかり、たしかに奇数アドレスなのがわかります。で、まだ実装していないどれかのBIOSファンクションが原因です。
色々調べてみると、BIOSファンクション22番のSet Exception Handler Address が原因だとわかりました。CP/M-68Kでは、BDOSをコールするためにTRAP #2 を使うのですが、 ファンクション22番が未実装のため、#2に対するHandlerが設定できません。このまま、TRAP #2 が使われてしまうと、そこに記録されていた不正なアドレスにジャンプしてしまいます。
CP/M-68KのDISK7に入っている、ERGBIOS から該当する部分を持ってきます。d1の値を調べ、問題なければハンドラーのアドレスをベクターテーブルに設定します。
setexc:
andi.l #$ff, d1
cmpi #47, d1
beq noset
cmpi #9, d1
beq noset
lsl #2, d1
movea.l d1, a0
move.l (a0), d0
move.l d2, (a0)
noset:
rts
ついでに、#18 の Get Address of Memory Region Table も持ってきます。このファンクションはTPAの領域を決めるのに使われるので、この先、DISK I/Oを実装し、コマンドを実行するために必要になります。領域は1つだけで、$20000から始まり$20000バイトです。
getseg:
move.l #memrgn, d0
rts
memrgn:
dc.w 1
dc.l $00020000
dc.l $00020000
これで、Exception $03 はでなくなりました。次はDISK I/O の実装ですが、これは少し説明が厄介なのでどうしますかね。