割込も動作するようになった。
EIはEIの次の命令を実行すると割込可能になるとあった。
EIの次を実行した後に割込が入る様に実装していた。
これで試していると思った様な動作にならなかった。
TK-80ではステップモードにするとブレークポイントが未設定だと1命令ずつ実行されるのだが、同じアドレスに留まって先に進まなかった。
モニタープログラムの出口はこの様になっている。
;; ;; REGISTER RESTORE ;; RESRG: LHLD SSAVE SPHL ; PS RESTORE LHLD PSAVE PUSH H ; PC STOERD IN USER STACK LHLD LSAVE PUSH H ; HL STOERD BELOW USER STACK LHLD FSAVE PUSH H ; PSW STOERD BELOW USER STACK LHLD CSAVE MOV C,L MOV B,H ; BC RESTORED LHLD ESAVE XCHG ; DE RESTORED POP PSW ; PSW RESTORED POP H ; HL RESTORED EI ; INTERRUPT ENABLED RET ; PC RESTORED & GO TO USER CONTR ROUTINE
最後にEIがっあって次にRETがある。
EIの次の命令であるRETを実行した後に割込が入ることになる。
RETはPSAVEに保存されたアドレスに飛ぶことになる。
モニタープログラムでは割込が入った時のアドレスがPSAVEに入っている。
仮に8200Hアドレスが入っているとして、ここで割込が入るとRST 7が実行されてスタックにPC(8200H)が積まれその後BRENTに飛ぶ。
;; ;; BREAK ENTRY ;; BREAK & ONE STEP OPERATION ;; BRENT: XTHL ; HL<-->PC(SAVED) SHLD PSAVE ; PC(LO)$83E0,PC(HI) $83E1 SAVED PUSH PSW ; PSW SAVE LXI H,4H DAD SP ; HL<--SP POP PSW ; PSW RECOVER SHLD SSAVE ; SP(LO)$83E2,SP(HI)$83E3 SAVED POP H ; HL RECOVER
XTHLでは積まれた8200HがPSAVEに保存される。同様にスタックのアドレスはSSAVEに保存される。
またモニターから抜ける時にはRESRGで逆にSSAVEをスタックに戻してRETでPSAVEに飛ぶことになる。
となるといつまで経っても8200Hから抜けなくなる。
本当はもう1つ進んでから割込が入って欲しい。
RETで割込から戻ってから1命令実行して割込がかかる様にしたい。
EIはEIの次の命令を実行すると割込可能となるが、実際に割込が入るのは2命令後とすると良さそうだ。
2命令後に変た事で意図した様に動作する結果となった。
ここに辿り着くまで結構かかってしまった。
EIは何で次の命令後に割込可能になるとか思っていたが、割込を動かすためには必要な要件だったことがわかった。
XTHLもほとんど使ったことがなかった様な気がするが、よく考えられているなと改めて感心した。
後はセーブ、ロード機能があれば完成となる。