mirror of
https://github.com/hsoft/collapseos.git
synced 2024-12-25 04:28:05 +11:00
Copy ACIA driver to blkfs
We can get rid of acia.z80, but not of acia.fs yet, we still need it.
This commit is contained in:
parent
dd6ce1b8fe
commit
a19376df6c
2
blk/001
2
blk/001
@ -3,7 +3,7 @@ MASTER INDEX
|
||||
3 Usage 30 Dictionary
|
||||
70 Implementation notes 100 Block editor
|
||||
200 Z80 assembler 260 Cross compilation
|
||||
280 Z80 boot code
|
||||
280 Z80 boot code 350 ACIA driver
|
||||
|
||||
|
||||
|
||||
|
15
blk/350
Normal file
15
blk/350
Normal file
@ -0,0 +1,15 @@
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
Load z80 words with "352 LOAD" and Forth words with "357 LOAD".
|
15
blk/352
Normal file
15
blk/352
Normal file
@ -0,0 +1,15 @@
|
||||
( 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) )
|
||||
|
||||
353 356 LOADR
|
||||
|
16
blk/353
Normal file
16
blk/353
Normal file
@ -0,0 +1,16 @@
|
||||
(entry) ~ACIA
|
||||
AF PUSHqq,
|
||||
HL PUSHqq,
|
||||
DE PUSHqq,
|
||||
( Read our character from ACIA into our BUFIDX )
|
||||
ACIA_CTL INAn,
|
||||
0x01 ANDn, ( is ACIA rcv buf full? )
|
||||
IFNZ,
|
||||
( correct interrupt cause )
|
||||
( +2 == ACIAW> )
|
||||
ACIA_MEM 2+ LDHL(nn),
|
||||
( is it == to ACIAR>? )
|
||||
( +0 == ACIAR> )
|
||||
DE ACIA_MEM LDdd(nn),
|
||||
( carry cleared from ANDn above )
|
||||
DE SBCHLss, ( cont. )
|
16
blk/354
Normal file
16
blk/354
Normal file
@ -0,0 +1,16 @@
|
||||
IFNZ, ( buffer full? )
|
||||
( no, continue )
|
||||
DE ADDHLss, ( restore ACIAW> )
|
||||
( buffer not full, let's write )
|
||||
ACIA_IO INAn,
|
||||
(HL) A LDrr,
|
||||
( advance W> )
|
||||
HL INCss,
|
||||
( +2 == ACIAW> )
|
||||
ACIA_MEM 2+ LD(nn)HL,
|
||||
( +6 == ACIA) )
|
||||
DE ACIA_MEM 6 + LDdd(nn),
|
||||
DE SUBHLss,
|
||||
|
||||
|
||||
( cont. )
|
16
blk/356
Normal file
16
blk/356
Normal file
@ -0,0 +1,16 @@
|
||||
IFZ, ( end of buffer reached? )
|
||||
( yes )
|
||||
( +4 == ACIA( )
|
||||
ACIA_MEM 4 + LDHL(nn),
|
||||
( +2 == ACIAW> )
|
||||
ACIA_MEM 2+ LD(nn)HL,
|
||||
THEN,
|
||||
THEN,
|
||||
THEN,
|
||||
DE POPqq,
|
||||
HL POPqq,
|
||||
AF POPqq,
|
||||
EI,
|
||||
RETI,
|
||||
|
||||
|
14
blk/357
Normal file
14
blk/357
Normal file
@ -0,0 +1,14 @@
|
||||
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. )
|
||||
|
||||
358 360 LOADR
|
16
blk/358
Normal file
16
blk/358
Normal file
@ -0,0 +1,16 @@
|
||||
: 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)
|
||||
;
|
14
blk/359
Normal file
14
blk/359
Normal file
@ -0,0 +1,14 @@
|
||||
: 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@
|
||||
;
|
||||
|
||||
|
7
blk/360
Normal file
7
blk/360
Normal file
@ -0,0 +1,7 @@
|
||||
: 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!
|
||||
;
|
||||
|
60
drv/acia.z80
60
drv/acia.z80
@ -1,60 +0,0 @@
|
||||
( 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)
|
||||
)
|
||||
|
||||
(entry) ~ACIA
|
||||
AF PUSHqq,
|
||||
HL PUSHqq,
|
||||
DE PUSHqq,
|
||||
|
||||
( Read our character from ACIA into our BUFIDX )
|
||||
ACIA_CTL INAn,
|
||||
0x01 ANDn, ( is ACIA rcv buf full? )
|
||||
IFNZ,
|
||||
( correct interrupt cause )
|
||||
( +2 == ACIAW> )
|
||||
ACIA_MEM 2+ LDHL(nn),
|
||||
( is it == to ACIAR>? )
|
||||
( +0 == ACIAR> )
|
||||
DE ACIA_MEM LDdd(nn),
|
||||
( carry cleared from ANDn above )
|
||||
DE SBCHLss,
|
||||
IFNZ, ( buffer full? )
|
||||
( no, continue )
|
||||
DE ADDHLss, ( restore ACIAW> )
|
||||
( buffer not full, let's write )
|
||||
ACIA_IO INAn,
|
||||
(HL) A LDrr,
|
||||
|
||||
( advance W> )
|
||||
HL INCss,
|
||||
( +2 == ACIAW> )
|
||||
ACIA_MEM 2+ LD(nn)HL,
|
||||
( +6 == ACIA) )
|
||||
DE ACIA_MEM 6 + LDdd(nn),
|
||||
DE SUBHLss,
|
||||
IFZ, ( end of buffer reached? )
|
||||
( yes )
|
||||
( +4 == ACIA( )
|
||||
ACIA_MEM 4 + LDHL(nn),
|
||||
( +2 == ACIAW> )
|
||||
ACIA_MEM 2+ LD(nn)HL,
|
||||
THEN,
|
||||
THEN,
|
||||
THEN,
|
||||
|
||||
DE POPqq,
|
||||
HL POPqq,
|
||||
AF POPqq,
|
||||
EI,
|
||||
RETI,
|
@ -6,7 +6,7 @@ STAGE2 = $(EDIR)/stage2
|
||||
EMUL = $(BASEDIR)/emul/hw/rc2014/classic
|
||||
BOOTSRCS = conf.fs \
|
||||
$(EDIR)/xcomp.fs \
|
||||
$(BASEDIR)/drv/acia.z80 \
|
||||
drvz80.fs \
|
||||
$(BASEDIR)/drv/sdc.z80 \
|
||||
$(FDIR)/icore.fs \
|
||||
$(EDIR)/stop.fs
|
||||
|
1
recipes/rc2014/drvz80.fs
Normal file
1
recipes/rc2014/drvz80.fs
Normal file
@ -0,0 +1 @@
|
||||
352 LOAD ( acia.z80 )
|
Loading…
Reference in New Issue
Block a user