Z8530 SCCを制御するコードも上げておきます。
先ずは初期化のコードです。送受信の割り込みが処理できるように初期化しています。この石もかなり曲者で初期化手順を間違うとうまく動きません。
発生させる割り込み込みベクタは0x10からで、チャンネルAの送信が0x18で、受信が0x1cになります。
.equ SCCAC, 0x0009 .equ SCCAD, 0x000D init_scc: ld r2, #(scccmde - scccmds) ! initialize Z8530 ld r3, #SCCAC ld r4, #scccmds otirb @r3, @r4, r2 ret scccmds: .byte 9, 0xc0 ! Reset .byte 4, 0x44 ! x16, 1stop-bit, non-parity .byte 3, 0xe0 ! Receive 8bit/char, rts auto .byte 5, 0xe2 ! Send 8bit/char, dtr rts .byte 2, 0x10 ! Interrupt vector .byte 1, 0x12 ! Interruprt on Rx All character and Tx Int .byte 9, 0x09 ! MIE, VIS, Status=Low .byte 11, 0x50 ! BG use for receiver and transmiter .byte 12, 30 ! 4800bps at 5MHz clock .byte 13, 00 .byte 14, 0x02 ! PCLK for BG .byte 14, 0x03 ! BG enable .byte 3, 0xe1 ! Receiver enable .byte 5, 0xea ! Transmiter enable scccmde:
割り込みハンドラーは、次のようなコードです。リングバッファ処理部分は端折ってあります。Z8536と同じで割り込み処理の終了処理を正しく行わないと、優先順位の低い割り込みがかからなくなったりします。
scc_rxint: ! Rx InterruptHandler push @r15, r0 push @r15, r1 1: inb rl0, #SCCAC andb rl0, #0x01 jr z, 1b inb rh0, #SCCAD ! Read a data from Rx buffer ! ! ldb rl0, #0x38 ! Enable IUS outb #SCCAC, rl0 pop r1, @r15 pop r0, @r15 iret scc_txint: ! Tx Interrupt Handler push @r15, r0 push @r15, r1 ! ! outb #SCCAD, rl0 ! Write a data to Tx buffer ldb rl0, #0x28 ! Clear Tx interrupt pendinng outb #SCCAC, rl0 ldb rl0, #0x38 ! Enable IUS outb #SCCAC, rl0 pop r1, @r15 pop r0, @r15 iret