Browse Source

acia: make wholly cross compilable

pull/102/head
Virgil Dupras 4 years ago
parent
commit
6beb082e29
9 changed files with 53 additions and 63 deletions
  1. +5
    -4
      blk/350
  2. +1
    -8
      blk/352
  3. +1
    -1
      blk/353
  4. +11
    -0
      blk/356
  5. +16
    -1
      blk/357
  6. +15
    -12
      blk/358
  7. +0
    -16
      blk/359
  8. +0
    -16
      blk/360
  9. +4
    -5
      recipes/rc2014/xcomp.fs

+ 5
- 4
blk/350 View File

@@ -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"

+ 1
- 8
blk/352 View File

@@ -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+


+ 1
- 1
blk/353 View File

@@ -1,4 +1,4 @@
(entry) ~ACIA
CREATE ~ACIA
AF PUSHqq,
HL PUSHqq,
DE PUSHqq,


+ 11
- 0
blk/356 View File

@@ -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. )


+ 16
- 1
blk/357 View File

@@ -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!
;

+ 15
- 12
blk/358 View File

@@ -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) ;


+ 0
- 16
blk/359 View File

@@ -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!
;

+ 0
- 16
blk/360 View File

@@ -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) ;


+ 4
- 5
recipes/rc2014/xcomp.fs View File

@@ -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!


Loading…
Cancel
Save