domingo, 13 de julho de 2014

Modo de interrupção 2

Interrupção para o Z80 refere-se a um evento em que o processamento normal é interrompido, para que uma rotina de serviço de interrupção (ISR - Interrupt Service Routine) seja executada. Existem dois tipos de requisição de interrupção neste microprocessador, uma é a interrupção mascarável (MI) e outra é a não mascarável (NMI - non-maskable interrupt). 

Fonte: El wiki de speccy.org
Existem 3 diferentes modos de definir ISR para interrupções mascaráveis no Z80, sendo que a primeira, IM 0 (modo de interrupção 0), praticamente não tem utilidade na programação do TK90X. O modo padrão neste computador é o IM 1 em que, cada vez que a ULA envia um sinal no pino /INT do Z80 (que ocorre 60 vezes a cada segundo), o processamento é interrompido e passa-se a executar sub-rotina da ROM no endereço 56 (#38 em hexadecimal). Esta sub-rotina faz a varredura do teclado e a atualização da variável de sistema FRAMES (ou TVCOUNT).

O IM 2 é o modo mais poderoso, pois permite a criação de uma ISR própria. Seu funcionamento é relativamente complexo. Quando uma requisição de interrupção é aceita, o Z80 espera que algum periférico coloque um valor de 8 bits (1 byte) no barramento de dados. Depois de fazer a leitura deste byte, ele é juntado com os 8 bits do registrador I para formar um endereço de 16 bits (endereço do vetor de interrupção) que pode ser calculado como: 
Endereço do vetor de interrupção = 256×I+(byte lido no barramento)

Porém este endereço ainda não é o da rotina a ser executada; ela aponta para a posição da memória em que este endereço se encontra. Portanto a ideia é que exista uma tabela (vetor) de endereços de rotinas ISR na memória, cujo valor é selecionado pelo periférico que fez a requisição. No caso do TK90X, a ULA não coloca um valor no barramento de dados e seria esperado que o valor lido pelo Z80 seja 255 (#FF). Porém isto não é seguro, pois pode ser que um outro periférico coloque algum valor espúrio no barramento. Portanto o recomendável é se construir um vetor em que todos os endereços de ISR sejam sempre o mesmo e simétrico.

Por exemplo, considerando que I=254 (#FE), deve-se construir uma tabela entre 65024 (#FE00) a 65280 (#FF00). Se for colocado 257 bytes todos com valor 253 (#FD), o endereço de ISR será 65021 (#FDFD). A partir deste endereço, o melhor é colocar uma instrução 'JP xxxx' que realiza salto para a ISR propriamente dita.

Para preparar toda a infraestrutura na memória para usar o IM 2, há uma rotina que tenho visto repetidamente em jogos e que também fiz uso em demos que produzi. Apesar de não ser inédito, um arquivo fonte com esta rotina economiza tempo na hora de se escrever um programa. Por isto criei IM2.asm que poderá ser utilizado livremente para desenvolver programas para o TK90X, disponível neste link.

Nenhum comentário:

Postar um comentário

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.