見出し画像

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 の実装ですが、これは少し説明が厄介なのでどうしますかね。


いいなと思ったら応援しよう!