@@ 1,174 1,111 @@
( ----- 600 )
-601 ACIA 606 Zilog SIO driver
+601 MC6850 driver 606 Zilog SIO driver
615 SPI relay 619 Xcomp unit
( ----- 601 )
-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 from which a provided "(key)" reads. This driver
-installs an interrupt handler at RST38 to handle RX.
-
-To use, begin by loading declarations (B582) before xcomp is
-loaded. These declarations provide default values for ports and
-memory offsets that you can override. See B582.
-
-Then, in the driver part, load range 583-588.
+( MC6850 Driver. Load range B601-B603. Requires:
+ 6850_CTL for control register
+ 6850_IO for data register.
+ CTL numbers used: 0x16 = no interrupt, 8bit words, 1 stop bit
+ 64x divide. 0x56 = RTS high )
+CODE 6850<
+ A 0x16 ( RTS low ) LDri, 6850_CTL OUTiA,
+ BEGIN,
+ 6850_CTL INAi, 0x01 ANDi, ( is ACIA rcv buf full? )
+ JRZ, ( no, loop ) AGAIN,
+ A 0x56 ( RTS high ) LDri, 6850_CTL OUTiA,
+ ( we have data, fetch and push )
+ 6850_IO INAi, PUSHA,
+;CODE
( ----- 602 )
-0x80 CONSTANT ACIA_CTL ( IO port for ACIA's control register )
-0x81 CONSTANT ACIA_IO ( IO port for ACIA's data registers )
-0x20 CONSTANT ACIA_BUFSZ ( SZ-1 must be a mask )
-( Address in memory that can be used variables shared
- with ACIA's native words. 4 bytes used. )
-CREATE ACIA_MEM SYSVARS 0x70 + ,
-( Points to ACIA buf )
-: ACIA( ACIA_MEM @ 2+ ;
-( Read buf idx Pre-inc )
-: ACIAR> ACIA_MEM @ ;
-( Write buf idx Post-inc )
-: ACIAW> ACIA_MEM @ 1+ ;
-( This means that if W> == R>, buffer is full.
- If R>+1 == W>, buffer is empty. )
+CODE 6850>
+ HL POP, chkPS,
+ BEGIN,
+ 6850_CTL INAi, 0x02 ANDi, ( are we transmitting? )
+ JRZ, ( yes, loop ) AGAIN,
+ A L LDrr, 6850_IO OUTiA,
+;CODE
( ----- 603 )
-( ACIA INT handler, read into ACIAW> )
-( Set RST 38 jump ) PC ORG @ 0x39 + !
- AF PUSH,
- ACIA_CTL INAi, 0x01 ANDi, ( is ACIA rcv buf full? )
- IFZ, ( no, abort ) AF POP, EI, RETI, THEN,
- HL PUSH,
- HL ACIAW> LDdi, A (HL) LDrr,
- HL DECd, (HL) CPr, ( W> == R> ? )
- IFNZ, ( buffer not full )
- ( get wr ptr ) HL ACIA( LDd(i),
- L ADDr, IFC, H INCr, THEN, L A LDrr,
- ( fetch/write ) ACIA_IO INAi, (HL) A LDrr,
- ( advance W> ) ACIAW> LDA(i), A INCr,
- ACIA_BUFSZ 1- ANDi, ACIAW> LD(i)A,
- THEN,
- HL POP, AF POP, EI, RETI,
-( ----- 604 )
-: (key)
- ( inc then fetch )
- [ ACIAR> LITN ] C@ 1+ [ ACIA_BUFSZ 1- LITN ] AND
- ( As long as R> == W>-1, it means that buffer is empty )
- BEGIN DUP [ ACIAW> LITN ] C@ = NOT UNTIL
- DUP [ ACIA( LITN ] @ + C@ ( ridx c )
- SWAP [ ACIAR> LITN ] C! ( 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!
-;
+: (key) 6850< ;
+: (emit) 6850> ;
+: 6850$ 0x56 ( RTS high ) [ 6850_CTL LITN ] PC! ;
( ----- 605 )
-: ACIA$
- H@ [ ACIA( LITN ] ! 0 [ ACIAR> LITN ] C!
- 1 [ ACIAW> LITN ] C! ( write index starts one pos later )
- [ ACIA_BUFSZ LITN ] ALLOT
-( 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!
- (im1) ;
+( Zilog SIO driver. Load range B605-607. Requires:
+ SIOA_CTL for ch A control register
+ SIOA_DATA for ch A data register
+ SIOB_CTL for ch B control register
+ SIOB_DATA for ch B data register )
+CODE SIOA<
+ A 0x05 ( PTR5 ) LDri, SIOA_CTL OUTiA,
+ A 0b01101000 ( De-assert RTS ) LDri, SIOA_CTL OUTiA,
+ BEGIN,
+ SIOA_CTL ( RR0 ) INAi, 0x01 ANDi, ( is rcv buf full? )
+ JRZ, ( no, loop ) AGAIN,
+ A 0x05 ( PTR5 ) LDri, SIOA_CTL OUTiA,
+ A 0b01101010 ( Assert RTS ) LDri, SIOA_CTL OUTiA,
+ ( we have data, fetch and push )
+ SIOA_DATA INAi, PUSHA,
+;CODE
( ----- 606 )
-Zilog SIO driver
-
-Declarations at B607
-
-Driver load range at B608-B610
+CODE SIOA>
+ HL POP, chkPS,
+ BEGIN,
+ SIOA_CTL INAi, 0x04 ANDi, ( are we transmitting? )
+ JRZ, ( yes, loop ) AGAIN,
+ A L LDrr, SIOA_DATA OUTiA,
+;CODE
+CREATE _ ( init data ) 0x18 C, ( CMD3 )
+ 0x24 C, ( CMD2/PTR4 ) 0b11000100 C, ( WR4/64x/1stop/nopar )
+ 0x03 C, ( PTR3 ) 0b11000001 C, ( WR3/RXen/8char )
+ 0x05 C, ( PTR5 ) 0b01101010 C, ( WR5/TXen/8char/RTS )
+ 0x21 C, ( CMD2/PTR1 ) 0 C, ( WR1/Rx no INT )
+: SIOA$ 9 0 DO _ I + C@ [ SIOA_CTL LITN ] PC! LOOP ;
( ----- 607 )
-0x80 CONSTANT SIO_ACTL 0x81 CONSTANT SIO_ADATA
-0x82 CONSTANT SIO_BCTL 0x83 CONSTANT SIO_BDATA
-0x20 CONSTANT SIO_BUFSZ ( SZ-1 must be a mask )
-( Address in memory that can be used variables shared
- with SIO native words. 4 bytes used. )
-CREATE SIO_MEM SYSVARS 0x70 + ,
-( Points to SIO buf )
-: SIO( SIO_MEM @ 2+ ;
-( Read buf idx Pre-inc )
-: SIOR> SIO_MEM @ ;
-( Write buf idx Post-inc )
-: SIOW> SIO_MEM @ 1+ ;
-( This means that if W> == R>, buffer is full.
- If R>+1 == W>, buffer is empty. )
-( ----- 608 )
-( INT handler. Set RST 38 jump ) PC ORG @ 0x39 + !
-AF PUSH, BEGIN,
-SIO_ACTL INAi, ( RR0 ) 0x01 ANDi, ( is recv buf full? )
-IFZ, ( nope, exit ) A 0x20 ( CMD 4 ) LDri, SIO_ACTL OUTiA,
- AF POP, EI, RETI, THEN,
-HL PUSH,
-HL SIOW> LDdi, A (HL) LDrr,
-HL DECd, (HL) CPr, ( W> == R> ? )
-IFNZ, ( buffer not full )
- ( get wr ptr ) HL SIO( LDd(i),
- L ADDr, IFC, H INCr, THEN, L A LDrr,
- ( fetch/write ) SIO_ADATA INAi, (HL) A LDrr,
- ( advance W> ) SIOW> LDA(i), A INCr,
- SIO_BUFSZ 1- ANDi, SIOW> LD(i)A,
-THEN, HL POP, JR, AGAIN,
-( ----- 609 )
-: (key)
- ( inc then fetch )
- [ SIOR> LITN ] C@ 1+ [ SIO_BUFSZ 1- LITN ] AND
- ( As long as R> == W>-1, it means that buffer is empty )
- BEGIN DUP [ SIOW> LITN ] C@ = NOT UNTIL
- DUP [ SIO( LITN ] @ + C@ ( ridx c )
- SWAP [ SIOR> LITN ] C! ( c )
-;
-: (emit)
- ( As long at CTL bit 2 is low, we are transmitting. wait )
- BEGIN [ SIO_ACTL LITN ] PC@ 0x04 AND UNTIL
- ( The way is clear, go! )
- [ SIO_ADATA LITN ] PC!
-;
-( ----- 610 )
-: _ [ SIO_ACTL LITN ] PC! ;
-: SIO$
- H@ [ SIO( LITN ] ! 0 [ SIOR> LITN ] C!
- 1 [ SIOW> LITN ] C! ( write index starts one pos later )
- [ SIO_BUFSZ LITN ] ALLOT
- 0x18 _ ( CMD3 )
- 0x24 _ ( CMD2/PTR4 ) 0b11000100 _ ( WR4/64x/1stop/nopar )
- 0x03 _ ( PTR3 ) 0b11000001 _ ( WR3/RXen/8char )
- 0x05 _ ( PTR5 ) 0b01101000 _ ( WR5/TXen/8char )
- 0x21 _ ( CMD2/PTR1 ) 0b00011000 _ ( WR1/Rx INT all chars )
- (im1)
-;
+CODE SIOB<
+ BEGIN,
+ SIOB_CTL ( RR0 ) INAi, 0x01 ANDi, ( is rcv buf full? )
+ JRZ, ( no, loop ) AGAIN,
+ ( we have data, fetch and push )
+ SIOB_DATA INAi, PUSHA,
+;CODE
+CODE SIOB>
+ HL POP, chkPS,
+ BEGIN,
+ SIOB_CTL INAi, 0x04 ANDi, ( are we transmitting? )
+ JRZ, ( yes, loop ) AGAIN,
+ A L LDrr, SIOB_DATA OUTiA,
+;CODE
+: SIOB$ 9 0 DO _ I + C@ [ SIOB_CTL LITN ] PC! LOOP ;
( ----- 619 )
-( RC2014 classic with ACIA )
+( RC2014 classic with MC6850 )
0xff00 CONSTANT RS_ADDR 0xfffa CONSTANT PS_ADDR
RS_ADDR 0x80 - CONSTANT SYSVARS
0x8000 CONSTANT HERESTART
+0x80 CONSTANT 6850_CTL 0x81 CONSTANT 6850_IO
4 CONSTANT SPI_DATA 5 CONSTANT SPI_CTL 1 CONSTANT SDC_DEVID
-602 LOAD ( acia decl )
5 LOAD ( z80 assembler )
262 LOAD ( xcomp ) 282 LOAD ( boot.z80.decl )
270 LOAD ( xcomp overrides ) 283 335 LOADR ( boot.z80 )
-353 LOAD ( xcomp core low ) 603 605 LOADR ( acia )
+353 LOAD ( xcomp core low ) 601 603 LOADR ( MC6850 )
419 LOAD ( SPI relay ) 423 436 LOADR ( SD Card )
400 LOAD ( AT28 )
390 LOAD ( xcomp core high )
(entry) _
PC ORG @ 8 + ! ( Update LATEST )
-," ACIA$ BLK$ " EOT,
+," 6850$ BLK$ " EOT,
( ----- 620 )
( RC2014 classic with SIO )
0xff00 CONSTANT RS_ADDR 0xfffa CONSTANT PS_ADDR
RS_ADDR 0x80 - CONSTANT SYSVARS
0x8000 CONSTANT HERESTART
+0x80 CONSTANT SIOA_CTL 0x81 CONSTANT SIOA_DATA
+0x82 CONSTANT SIOB_CTL 0x83 CONSTANT SIOB_DATA
4 CONSTANT SPI_DATA 5 CONSTANT SPI_CTL 1 CONSTANT SDC_DEVID
-607 LOAD ( SIO decl )
5 LOAD ( z80 assembler )
262 LOAD ( xcomp ) 282 LOAD ( boot.z80.decl )
270 LOAD ( xcomp overrides ) 283 335 LOADR ( boot.z80 )
-353 LOAD ( xcomp core low ) 608 610 LOADR ( SIO )
+353 LOAD ( xcomp core low ) 605 607 LOADR ( SIO )
419 LOAD ( SPI relay ) 423 436 LOADR ( SD Card )
-400 LOAD ( AT28 )
+400 LOAD ( AT28 ) : (key) SIOB< ; : (emit) SIOB> ;
390 LOAD ( xcomp core high )
-(entry) _
-PC ORG @ 8 + ! ( Update LATEST )
-," SIO$ BLK$ " EOT,
+(entry) _ PC ORG @ 8 + ! ( Update LATEST )
+," SIOB$ BLK$ " EOT,