para:
- Atender a interrupção
- Decodificar a linha do teclado (ler porta C da PPI)
- colocar o valor das colunas (na porta B da PPI)
- Pulsar o sinal GO para liberar o Z80
Eis abaixo o código da rotina de interrupção:
...
volatile unsigned char matriz[11];
...
ISR(INT0_vect)
{
PORTB = matriz[PORTC & 0x0f]; // results in SBI which does not affect SREG
PORTD &= ~(1 << (GO)); // Clear Flip Flop and release Z80 from Wait
PORTD |= (1 << (GO));
}
O código acima depois de compilado demora entre 33 a 36 ciclos de clock do AVR entre a decodificação do sinal e a liberação do Z80 de seu estado WAIT (contando entre 8 e 11 ciclos de clock para atender a interrupção mais 25 ciclos até o reset do flip flop).
Considerando o AVR com clock interno de 8MHz isso significa um tempo máximo de 36/8MHz = 36 x 125nS = 4500ns ou 4,5us.
Se o MSX faz uma leitura das 11 linhas do a cada 3 interrupções do VDP, isso significa que a cada (3 x 16,67ms) nós perdemos (11 * 4,5us), ou seja, ficamos 0,098% mais lentos, o que é desprezível.
(Código compilado)
ISR(INT0_vect)
{ (ciclos) cumulativo
push r1 (2) 2
push r0 (2) 4
in r0, 0x3f (1) 5
push r0 (2) 7
eor r1, r1 (1) 8
push r24 (2) 10
push r30 (2) 12
push r31 (2) 14
PORTB = matriz[PORTC & 0x0f]; // results in SBI which does not affect SREG
in r30, 0x15 (1) 15
ldi r31, 0x00 (1) 16
andi r30, 0x0F (1) 17
andi r31, 0x00 (1) 18
subi r30, 0xA0 (1) 19
sbci r31, 0xFF (1) 20
ld r24, Z (2) 22
out 0x18, r24 (1) 23
PORTD &= ~(1 << (GO)); // Clear Flip Flop and release Z80 from Wait
cbi 0x12, 4 (2) 25
PORTD |= (1 << (GO));
sbi 0x12, 4 (2) 27
}
pop r31 (2) 29
pop r30 (2) 31
pop r24 (2) 33
pop r0 (2) 35
out 0x3f, r0 (1) 36
pop r0 (2) 38
pop r1 (2) 40
reti (5) 45
Um comentário:
Hola, espero que entiendas catellano!!
He agregado tu RSS al RetroInvaders, aqui estan todos tus articulos: http://retroinvaders.com/pt/blog/345
Si tienes algún inconveniente me avisas! (josezanni@gmail.com)
Saludos
Josepzin
Postar um comentário