( Save ACIA conf ) ACIA_CTL : ACIA_CTL [ LITN ] ; ACIA_IO : ACIA_IO [ LITN ] ; ( 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. ) (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? ) JRZ, L2 FWR ( end, no, wrong interrupt cause. ) ACIAW> LDHL(nn), ( is it == to ACIAR>? ) DE ACIAR> LDdd(nn), ( carry cleared from ANDn above ) DE SBCHLss, JRZ, L3 FWR ( end, buffer full ) DE ADDHLss, ( restore ACIAW> ) ( buffer not full, let's write ) ACIA_IO INAn, (HL) A LDrr, ( advance W> ) HL INCss, ACIAW> LD(nn)HL, DE ACIA) LDdd(nn), DE SUBHLss, JRNZ, L4 FWR ( skip ) ( end of buffer reached ) ACIA( LDHL(nn), ACIAW> LD(nn)HL, L4 FSET ( skip ) L3 FSET L2 FSET ( end ) DE POPqq, HL POPqq, AF POPqq, EI, RETI,