Clique sobre os objetivos listados abaixo para navegar até o conteúdo desejado.

  1. Interrupções
  2. Reset
  3. IRQ/Break
  4. MNI
  5. Bug: IRQ atrasada
  6. Bug: Branch e interrupção
  7. Bug: "Roubo" de interrupção

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.

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:
  1. 6502 recebe sinal de IRQ/BRK
  2. Salva próxima instrução no pilha
  3. Para BRK, a flag B = 1. Para IRQ flag B = 0
  4. Salvar PS na pilha
  5. Seta flag I para 1.
  6. Busca endereço de rotinas em $FFFE.
  7. 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:
  1. Restaura PS. Flag B e Bit 5 são ignoradas
  2. Seta Flag I para 0
  3. Restaura PC
  4. Continua fluxo anterior à interrupção

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:
  1. 6502 recebe sinal de MNI
  2. Salva próxima instrução no pilha
  3. Set flag B para 0)
  4. Salvar PS na pilha
  5. Seta flag I para 1.
  6. Busca endereço de rotinas em $FFFA.
  7. 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:
  1. Restaura PS
  2. Restaura PC
  3. Continua fluxo anterior à interrupção
  1. 12/03/2023 - revisão 4 - Correções em passos IRQ/BRK e MNI; Melhorias pontuais
  2. 11/09/2024 - revisão 3 - correções em descrição de IRQ, MNI e vetor de interrupções
  3. 30/08/2024 - revisão 2 - Correção em links de objetivos
  4. 04/10/2023 - revisão 1 - adição de links, correção em layout, navegação e correção de erros gramaticais
  5. 28/04/2023 - versão inicial