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