Como usar o IC 6551A (ACIA) como interface serie no z80.
Alguma informação sobre o calculo das resistencias pull up e pull down a usar na serie 74LSxxx, os calculos também se aplicam para outras series 74YYxxx, adequando a corrente e os níveis lógicos de tensão.
https://www.electronics-tutorials.ws/logic/pull-up-resistor.html
Datasheet do IC UM6551A
Circuito da placa serial IO (6551A) para o Z80 com o bus RC2014
Esquema de ligação
Ligações dos pinos do IC6551A
GND – GND
CS0 < not(IOREQ_L) and M1 and A3
CS1_L < A2
RST_L < RESET_L
RxC – not connected
XTAL1 < 1.8432MHz clock signal
XTAL2 < not connected
RTS_L > not connected
CTS_L < GND
TxD > TX out
DTR_L > not connected
RxD < RX in
RS0 < A0
RS1 < A1
VCC – VCC
DCD_L < GND
DSR_L < GND
DB0, DB7 – D0, D7
IRQ_L > INT_L
PHI2 < not(RD_L) or not(WR_L) ) and not(IOREQ_L)
R/W_L < WR_L
Algumas notas sobre a ligação do PHI2. Inicialmente, v1 do circuito, tinha ligado o PHI2 directamente ao clock do Z80. O sistema funcionava mas tinha sempre a transmissão de 3 caracteres em vez de 1.
O problema é que como é visível na imagem Z80 – IO timing, existem 3 ciclos de relógio, enquanto que na imagem UM6551 – Timing, é visível que o 6551 espera um único pulso. Por isso passei a usar os sinais RD_L e WR_L, em conjunto com o IOREQ_L, para formar o sinal de entrada em PHI2.
not(RD_L) or not(WR_L) ) and not(IOREQ_L)


O circuito de teste foi implementado numa breadboard

Programa em z80 assembly que faz uso do circuito como porta serie e que implementa um echo do receive no transmit
            .ORG    0000 
STACKS      EQU     0xFFFF 
ACIA_DATA   EQU     0x08 
ACIA_STAT   EQU     0x09 
ACIA_CMD    EQU     0x0A 
ACIA_CTL    EQU     0x0B 
MAIN:                
; set stack pointer
            LD      SP,STACKS 
; test io ports
            LD      a,0x01 
            OUT     (0x00),a 
            IN      a,(0x00) 
            OUT     (0x00),a 
            LD      a,0xFF 
            OUT     (0x00),a 
            LD      a,0x00 
            OUT     (0x00),a 
            NOP      
; acia 6551 init
            LD      a,%00000000 ;software reset
            OUT     (ACIA_CMD),a 
            LD      a,%00001011 ;no parity, no echo, no interrupt
            OUT     (ACIA_CMD),a 
            LD      a,%00011111 ;1 stop bit, 8 data bits, 19200 baud
            OUT     (ACIA_CTL),a 
;JP      OLDTEST
HELLO:               
            LD      a,$68 
            CALL    OUTCHAR 
            LD      a,$65 
            CALL    OUTCHAR 
            LD      a,$6C 
            CALL    OUTCHAR 
            LD      a,$6C 
            CALL    OUTCHAR 
            LD      a,$6F 
            CALL    OUTCHAR 
            LD      a,$0A 
            CALL    OUTCHAR 
            LD      a,$0D 
            CALL    OUTCHAR 
            
            ;JP      HELLO
LOOP:                
            CALL    INCHAR
            ;a char is received
            LD      c, b
            LD      b,%00001000 
            AND     b 
            JP      nz,INC_IDLE
            ; yes get received char
            LD      a, c
            CALL    OUTCHAR 
            
INC_IDLE:
            ; no received char
            JP      LOOP 
;
; OUTCHAR 
; arguments
; a = char to output
;
OUTCHAR:             
            LD      c,a
OUTCHART:
            ; check transmit flag is set
            LD      b,%00010000 ; 
            IN      a,(ACIA_STAT) 
            ;OUT     ($00),a         ;show stat on leds
            AND     b 
            JP      z,OUTCHART 
            ; send char
            LD      a,c 
            OUT     (ACIA_DATA),a 
            RET      
;
; OUTCHAR 
; arguments
; a = char to output
;
INCHAR:              
            LD      c,$00 
            ; check receiv flag is set
            LD      b,%00001000
            IN      a,(ACIA_STAT) 
            ;OUT     ($00),a         ;show stat on leds
            AND     b 
            JP      z,INCHAR_ 
            ; read receive register
            IN      a,(ACIA_DATA) 
            LD      c,a 
            LD      b,$00 
INCHAR_:    
            ; no received char
            LD      a,b 
            LD      b,c 
            RET      
ACIA6551_STATUS:             
; led show FF
            LD      a,$FF 
            OUT     ($00),a 
; show cmd reg
            IN      a,(ACIA_CMD) 
            OUT     ($00),a 
; show ctl reg
            IN      a,(ACIA_CTL) 
            OUT     ($00),a 
; show stat reg
            IN      a,(ACIA_STAT) 
            OUT     ($00),a 
      
            JP      loop 
Alguns recursos consultados para desenvolver o port do acia 6551 serial IO para o z80.
UM6551A
https://www.grappendorf.net/projects/6502-home-computer/acia-serial-interface-hello-world.html
ACIA 6551
https://www.atarimagazines.com/compute/issue10/075_1_EXPERIMENTING_WITH_THE_6551_ACIA.php
Homebrew 6502 : 6551 UART issues
https://github.com/ancientcomputing/rc2014/tree/master/source/6502/monitor