A causa era a falta de um NOP entre as instruções OUT que escreviam o CRC "dummy", e as intruções IN logo em seguida.
É que as instruções de entrada/saída automática (INI, OUTI, INIR, OUTIR) demoram alguns ciclos de clock a mais que as instruções IN e OUT, dando tempo da interface transferir automaticamente os 8 bits. No caso da instrução IN e OUT eu tenho apenas o tempo entre a borda de subida do sinal IORQ da instrução anterior e a borda de descida deste mesmo sinal na próxima instrução.Pelas minhas contas até dava, mas vou ter que estudar isso mais a fundo depois.
O fato é que nos testes que eu fiz, o NOP realmente fez a diferença, e resolveu o problema.
Segue abaixo o trecho de código que foi corrigido:
LD A,0FFH
OUT (C),A ; DUMMY CRC
NOP
OUT (C),A ; DUMMY CRC
NOP
IN A,(C) ; DESCARTA
NOP
IN A,(C); TRANSF RESPOSTA
AND 01FH
CP 05
JP NZ,ERROR
Uma sutileza no funcionamento da interface, é que quando se faz uma leitura, o valor lido é o que foi recebido na transferência anterior. Por isso a leitura da primeira instrução IN logo após a transferência do CRC é descartada. Este primeiro IN também poderia ser um OUT, pois serve apenas para iniciar a transferência do byte seguinte.
O código atual, capturado da porta da impressora, encontra-se neste link.
Nenhum comentário:
Postar um comentário