quarta-feira, 22 de fevereiro de 2012

Overhead gasto nos ciclos de Wait para o adaptador de teclado.

A fim de calcular o overhead que os ciclos WAIT necessários para atender ao teclado representariam no MSX, fiz uma experiência usando linguagem C num AVR. O objetivo é calcular o tempo necessário
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:

Josepzin disse...

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