@@ -1,9 +1,9 @@ | |||||
ACIA driver | ACIA driver | ||||
Manage I/O from an asynchronous communication interface adapter | Manage I/O from an asynchronous communication interface adapter | ||||
(ACIA). provides "EMIT" to put c char on the ACIA as well as | |||||
an input buffer. You have to call "~ACIA" on interrupt for | |||||
this module to work well. | |||||
(ACIA). provides "(emit)" to put c char on the ACIA as well as | |||||
an input buffer from which a provided "(key)" reads. You have | |||||
to call "~ACIA" on interrupt for this module to work well. | |||||
CONFIGURATION | CONFIGURATION | ||||
@@ -12,4 +12,5 @@ ACIA_IO: IO port for the ACIA's data registers | |||||
ACIA_MEM: Address in memory that can be used variables shared | ACIA_MEM: Address in memory that can be used variables shared | ||||
with ACIA's native words. 8 bytes used. | with ACIA's native words. 8 bytes used. | ||||
Load z80 words with "352 LOAD" and Forth words with "357 LOAD". | |||||
The whole driver is cross-compilable and is loaded with | |||||
"352 LOAD" |
@@ -1,15 +1,8 @@ | |||||
( Save ACIA conf ) | |||||
ACIA_CTL | |||||
: ACIA_CTL [ LITN ] ; | |||||
ACIA_IO | |||||
: ACIA_IO [ LITN ] ; | |||||
ACIA_MEM | |||||
: ACIA_MEM [ LITN ] ; | |||||
( Memory layout | ( Memory layout | ||||
+0 ACIAR> | +0 ACIAR> | ||||
+2 ACIAW> | +2 ACIAW> | ||||
+4 ACIA( | +4 ACIA( | ||||
+6 ACIA) ) | +6 ACIA) ) | ||||
1 3 LOADR+ | |||||
1 6 LOADR+ | |||||
@@ -1,4 +1,4 @@ | |||||
(entry) ~ACIA | |||||
CREATE ~ACIA | |||||
AF PUSHqq, | AF PUSHqq, | ||||
HL PUSHqq, | HL PUSHqq, | ||||
DE PUSHqq, | DE PUSHqq, | ||||
@@ -0,0 +1,11 @@ | |||||
( Points to ACIA buf ) | |||||
: ACIA( [ ACIA_MEM 4 + LITN ] ; | |||||
( Points to ACIA buf end ) | |||||
: ACIA) [ ACIA_MEM 6 + LITN ] ; | |||||
( Read buf pointer. Pre-inc ) | |||||
: ACIAR> [ ACIA_MEM LITN ] ; | |||||
( Write buf pointer. Post-inc ) | |||||
: ACIAW> [ ACIA_MEM 2 + LITN ] ; | |||||
( This means that if W> == R>, buffer is full. | |||||
If R>+1 == W>, buffer is empty. ) | |||||
@@ -1 +1,16 @@ | |||||
1 3 LOADR+ | |||||
: (key) | |||||
( inc then fetch ) | |||||
ACIAR> @ 1+ DUP ACIA) @ = IF | |||||
DROP ACIA( @ | |||||
THEN | |||||
( As long as R> == W>-1, it means that buffer is empty ) | |||||
BEGIN DUP ACIAW> @ = NOT UNTIL | |||||
ACIAR> ! | |||||
ACIAR> @ C@ | |||||
; | |||||
: (emit) | |||||
( As long at CTL bit 1 is low, we are transmitting. wait ) | |||||
BEGIN [ ACIA_CTL LITN ] PC@ 0x02 AND UNTIL | |||||
( The way is clear, go! ) | |||||
[ ACIA_IO LITN ] PC! | |||||
; |
@@ -1,13 +1,16 @@ | |||||
0x20 CONSTANT ACIABUFSZ | |||||
( Points to ACIA buf ) | |||||
: ACIA( [ ACIA_MEM 4 + LITN ] ; | |||||
( Points to ACIA buf end ) | |||||
: ACIA) [ ACIA_MEM 6 + LITN ] ; | |||||
( Read buf pointer. Pre-inc ) | |||||
: ACIAR> [ ACIA_MEM LITN ] ; | |||||
( Write buf pointer. Post-inc ) | |||||
: ACIAW> [ ACIA_MEM 2 + LITN ] ; | |||||
( This means that if W> == R>, buffer is full. | |||||
If R>+1 == W>, buffer is empty. ) | |||||
: ACIA$ | |||||
H@ DUP DUP ACIA( ! ACIAR> ! | |||||
1+ ACIAW> ! ( write index starts one position later ) | |||||
0x20 ( buffer size ) ALLOT | |||||
H@ ACIA) ! | |||||
( setup ACIA | |||||
CR7 (1) - Receive Interrupt enabled | |||||
CR6:5 (00) - RTS low, transmit interrupt disabled. | |||||
CR4:2 (101) - 8 bits + 1 stop bit | |||||
CR1:0 (10) - Counter divide: 64 ) | |||||
0b10010110 [ ACIA_CTL LITN ] PC! | |||||
( setup interrupt ) | |||||
0xc3 0x4e RAM+ C! ( c3==JP, 4e==INTJUMP ) | |||||
~ACIA 0x4f RAM+ ! | |||||
(im1) ; | |||||
@@ -1,16 +0,0 @@ | |||||
: (key) | |||||
( inc then fetch ) | |||||
ACIAR> @ 1+ DUP ACIA) @ = IF | |||||
DROP ACIA( @ | |||||
THEN | |||||
( As long as R> == W>-1, it means that buffer is empty ) | |||||
BEGIN DUP ACIAW> @ = NOT UNTIL | |||||
ACIAR> ! | |||||
ACIAR> @ C@ | |||||
; | |||||
: (emit) | |||||
( As long at CTL bit 1 is low, we are transmitting. wait ) | |||||
BEGIN ACIA_CTL PC@ 0x02 AND UNTIL | |||||
( The way is clear, go! ) | |||||
ACIA_IO PC! | |||||
; |
@@ -1,16 +0,0 @@ | |||||
: ACIA$ | |||||
H@ DUP DUP ACIA( ! ACIAR> ! | |||||
1+ ACIAW> ! ( write index starts one position later ) | |||||
ACIABUFSZ ALLOT | |||||
H@ ACIA) ! | |||||
( setup ACIA | |||||
CR7 (1) - Receive Interrupt enabled | |||||
CR6:5 (00) - RTS low, transmit interrupt disabled. | |||||
CR4:2 (101) - 8 bits + 1 stop bit | |||||
CR1:0 (10) - Counter divide: 64 ) | |||||
0b10010110 ACIA_CTL PC! | |||||
( setup interrupt ) | |||||
0xc3 0x4e RAM+ C! ( c3==JP, 4e==INTJUMP ) | |||||
['] ~ACIA 0x4f RAM+ ! | |||||
(im1) ; | |||||
@@ -12,21 +12,20 @@ RAMSTART 0x70 + CONSTANT ACIA_MEM | |||||
: CODE XCODE ; | : CODE XCODE ; | ||||
: IMMEDIATE XIMM ; | : IMMEDIATE XIMM ; | ||||
: (entry) (xentry) ; | : (entry) (xentry) ; | ||||
: CREATE XCREATE ; | |||||
: : [ ' X: , ] ; | : : [ ' X: , ] ; | ||||
CURRENT @ XCURRENT ! | CURRENT @ XCURRENT ! | ||||
282 LOAD ( boot.z80 ) | 282 LOAD ( boot.z80 ) | ||||
352 LOAD ( acia.z80 ) | |||||
372 LOAD ( sdc.z80 ) | |||||
393 LOAD ( icore low ) | 393 LOAD ( icore low ) | ||||
352 LOAD ( acia ) | |||||
372 LOAD ( sdc.z80 ) | |||||
415 LOAD ( icore high ) | 415 LOAD ( icore high ) | ||||
(entry) _ | (entry) _ | ||||
( Update LATEST ) | ( Update LATEST ) | ||||
PC ORG @ 8 + ! | PC ORG @ 8 + ! | ||||
422 437 XPACKR ( core ) | |||||
358 360 XPACKR ( acia.fs ) | |||||
438 452 XPACKR ( print fmt readln ) | |||||
422 452 XPACKR ( core print fmt readln ) | |||||
123 132 XPACKR ( linker ) | 123 132 XPACKR ( linker ) | ||||
," : _ ACIA$ RDLN$ (ok) ; _ " | ," : _ ACIA$ RDLN$ (ok) ; _ " | ||||
ORG @ 256 /MOD 2 PC! 2 PC! | ORG @ 256 /MOD 2 PC! 2 PC! | ||||