Objetivos
Clique sobre os objetivos listados abaixo para navegar até o conteúdo desejado.
- Interrupções
- Reset
- IRQ/Break
- MNI
Bug: IRQ atrasada
Bug: Branch e interrupção
Bug: "Roubo" de interrupção
Interrupções
Interrupções são o meio pelo qual um processador interrompe seu fluxo de execução para dar atenção ou
atender a algum chamado de um periférico para um determinado tratamento. Uma vez que esse tratamento
foi feito, o processador retorna para seu fluxo anterior.
O processador 6502 possui 3 interrupções. Os endereços das rotinas de tratamento são armazenadas
em um Vetor De Interrupções localizado entre $FFFA a $FFFF. Esse vetor armazena os
endereços de rotinas(ISR - Interrupt Service Routine) para lidar com as interrupções.
Esse VDI é explicado na tabela abaixo.
Tab. 1: VDI 6502
Nome |
Endereço(LSB - MSB) |
Descrição |
RESET |
$FFFC |
$FFFD |
Reset inicial |
IRQ/BRK |
$FFFE |
$FFFF |
Interrupção mascarável |
NMI |
$FFFA |
$FFFB |
Interrupção não-mascarável |
A BRK é uma interrupção de software invocada via programação, enquanto IRQ e MNI são interrupções de Hardware
que são sinalizadas externamente. Abaixo seguem as descrições sobre cada dos itens listados na tabela acima.
Quando um hardware que utiliza o 6502 como processador principal é ligado, o processador
precisa buscar o local (Entry Point) onde um programa deve iniciar.
O processador sabe disso utilizando o vetor de interrupção no endereço $FFFC. O processador lê dois bytes neste local e
carregador para o registrador PC que irá iniciar a execução do programa.
IRQ/BRK - Interrupt Request/Break
O tipo de interrupção mascarável é aquela que o processador pode ignorar sua execução
utilizando a flag I. Quando essa flag é setada para 1, qualquer interrupção mascarável pode
ser ignorada. Quando setado para 0, esse tipo de interrupção é reconhecida e executada.
A interrupção de hardware IRQ é acionada por algum é periférico ligado ao processador 6502 enquanto
BRK é acionada pelo próprio programa.
Fluxo de execução:
- 6502 recebe sinal de IRQ/BRK
- Salva próxima instrução no pilha
- Para BRK, a flag B = 1. Para IRQ flag B = 0
- Salvar PS na pilha
- Seta flag I para 1.
- Busca endereço de rotinas em $FFFE.
- Desvia fluxo de execução para rotina em (5)
A interrupção BREAK é acionada pela instrução BRK. A sua rotina de tratamentoI(ISR) deve checar a flag B
para saber se a interrupção se trata de uma IRQ ou BRK, pois compartilham o mesmo endereço no vetor de
interrupções, e também a rotina deve recuperar o valor imediato à instrução BRK que utilizada para
depuração ou outro fim.
Ao término da execução da rotina que lida com a interrupção IRQ, o 6502 restaura os dados salvos na pilha e retorna a sua execução.
A instrução RTI deve ser utilizada como última instrução ou fim da execução de uma ISR.
Fluxo de execução:
- Restaura PS. Flag B e Bit 5 são ignoradas
- Seta Flag I para 0
- Restaura PC
- Continua fluxo anterior à interrupção
NMI - Non-Maskable Interrupt / Interrupção não-mascarável
A MNI é um tipo de interrupção que não pode ter sua execução negada pelo 6502,
uma vez que um sinal é enviado ao 6502 a ISR em $FFFA é chamada imediatamente.
O fluxo de execução é mostrado abaixo:
Fluxo de execução:
- 6502 recebe sinal de MNI
- Salva próxima instrução no pilha
- Set flag B para 0)
- Salvar PS na pilha
- Seta flag I para 1.
- Busca endereço de rotinas em $FFFA.
- Desvia fluxo de execução para rotina lida em (5)
Ao término da execução da rotina que lida com a interrupção MNI, o 6502 restaura os dados salvos na pilha e retorna a sua execução. A instrução RTI
deve ser utilizada como última instrução de uma ISR.
Fluxo de execução:
- Restaura PS
- Restaura PC
- Continua fluxo anterior à interrupção
Histórico de atualizações
- 12/03/2023 - revisão 4 - Correções em passos IRQ/BRK e MNI; Melhorias pontuais
- 11/09/2024 - revisão 3 - correções em descrição de IRQ, MNI e vetor de interrupções
- 30/08/2024 - revisão 2 - Correção em links de objetivos
- 04/10/2023 - revisão 1 - adição de links, correção em layout, navegação e correção de erros gramaticais
- 28/04/2023 - versão inicial
Os cursos oferecidos nesta página são cursos fornecidos por parceiros. Ao comprar um curso clicando
em seu banner, você está ajudando a manter o projeto TutorialDev vivo. Os sites dos cursos parceiros utilizam cookies.