From 6beb082e298889d3e89bb7a842e745dfb94110b1 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 11 May 2020 21:52:44 -0400 Subject: [PATCH] acia: make wholly cross compilable --- blk/350 | 9 +++++---- blk/352 | 9 +-------- blk/353 | 2 +- blk/356 | 11 +++++++++++ blk/357 | 17 ++++++++++++++++- blk/358 | 27 +++++++++++++++------------ blk/359 | 16 ---------------- blk/360 | 16 ---------------- recipes/rc2014/xcomp.fs | 9 ++++----- 9 files changed, 53 insertions(+), 63 deletions(-) create mode 100644 blk/356 delete mode 100644 blk/359 delete mode 100644 blk/360 diff --git a/blk/350 b/blk/350 index feeaaf1..ff7b42c 100644 --- a/blk/350 +++ b/blk/350 @@ -1,9 +1,9 @@ ACIA driver 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 @@ -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 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" diff --git a/blk/352 b/blk/352 index 5398d52..030f71c 100644 --- a/blk/352 +++ b/blk/352 @@ -1,15 +1,8 @@ -( Save ACIA conf ) -ACIA_CTL -: ACIA_CTL [ LITN ] ; -ACIA_IO -: ACIA_IO [ LITN ] ; -ACIA_MEM -: ACIA_MEM [ LITN ] ; ( Memory layout +0 ACIAR> +2 ACIAW> +4 ACIA( +6 ACIA) ) -1 3 LOADR+ +1 6 LOADR+ diff --git a/blk/353 b/blk/353 index 037aff6..a983aa4 100644 --- a/blk/353 +++ b/blk/353 @@ -1,4 +1,4 @@ -(entry) ~ACIA +CREATE ~ACIA AF PUSHqq, HL PUSHqq, DE PUSHqq, diff --git a/blk/356 b/blk/356 new file mode 100644 index 0000000..591001a --- /dev/null +++ b/blk/356 @@ -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. ) + diff --git a/blk/357 b/blk/357 index 2a492bf..bd73fd4 100644 --- a/blk/357 +++ b/blk/357 @@ -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! +; diff --git a/blk/358 b/blk/358 index 7399fb7..a570057 100644 --- a/blk/358 +++ b/blk/358 @@ -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) ; diff --git a/blk/359 b/blk/359 deleted file mode 100644 index 04e7aa8..0000000 --- a/blk/359 +++ /dev/null @@ -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! -; diff --git a/blk/360 b/blk/360 deleted file mode 100644 index c522efc..0000000 --- a/blk/360 +++ /dev/null @@ -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) ; - diff --git a/recipes/rc2014/xcomp.fs b/recipes/rc2014/xcomp.fs index 903cade..95a92bf 100644 --- a/recipes/rc2014/xcomp.fs +++ b/recipes/rc2014/xcomp.fs @@ -12,21 +12,20 @@ RAMSTART 0x70 + CONSTANT ACIA_MEM : CODE XCODE ; : IMMEDIATE XIMM ; : (entry) (xentry) ; +: CREATE XCREATE ; : : [ ' X: , ] ; CURRENT @ XCURRENT ! 282 LOAD ( boot.z80 ) -352 LOAD ( acia.z80 ) -372 LOAD ( sdc.z80 ) 393 LOAD ( icore low ) +352 LOAD ( acia ) +372 LOAD ( sdc.z80 ) 415 LOAD ( icore high ) (entry) _ ( Update LATEST ) 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 ) ," : _ ACIA$ RDLN$ (ok) ; _ " ORG @ 256 /MOD 2 PC! 2 PC!