ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

TK-80 割込動作実装

割込も動作するようになった。

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命令後に変た事で意図した様に動作する結果となった。
ここに辿り着くまで結構かかってしまった。

youtu.be

EIは何で次の命令後に割込可能になるとか思っていたが、割込を動かすためには必要な要件だったことがわかった。
XTHLもほとんど使ったことがなかった様な気がするが、よく考えられているなと改めて感心した。

後はセーブ、ロード機能があれば完成となる。