a9ed8da0b2
The previous approach of maintaining R> and W> pointers was conceptually simple, but made INT handler code actually quite complex. Now, we maintain indexes instead. It's much easier to perform bounds checks and to compare for equality, something we have to do quick in the INT handler.
17 lines
572 B
Plaintext
17 lines
572 B
Plaintext
( 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> LDdn, A (HL) LDrr,
|
|
HL DECd, (HL) CPr, ( W> == R> ? )
|
|
IFNZ, ( buffer not full )
|
|
( get wr ptr ) HL ACIA( LDd(n),
|
|
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,
|