mirror of
https://github.com/hsoft/collapseos.git
synced 2024-12-26 05:58:05 +11:00
4515241318
How did this ever work?
58 lines
1.3 KiB
Forth
58 lines
1.3 KiB
Forth
( ACIA
|
|
|
|
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.
|
|
|
|
CONFIGURATION
|
|
|
|
ACIA_CTL: IO port for the ACIA's control registers
|
|
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.
|
|
)
|
|
|
|
0x20 CONSTANT ACIABUFSZ
|
|
|
|
: 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 )
|
|
( 4e == INTJUMP )
|
|
0xc3 0x4e RAM+ C! ( JP upcode )
|
|
['] ~ACIA 0x4f RAM+ !
|
|
(im1)
|
|
;
|
|
|
|
: 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!
|
|
;
|
|
|