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

Os modos de endereçamento representam a forma como os operando ou dados são recuperados pelo processador para processamento de uma instrução.

Ao todo, o 6502 possui ao todo 12 modos de endereçamento que serão vistos nesta parte do tutorial. A compreensão é importante para continuar os estudos do processador.

Notação utilizada:
#$NN Valor hexadecimal imediato
#$NNNN; Endereço hexadecimal imediato
$NNNN Endereço hexadecimal
$NN ou h Valor hexadecimal
MNEMÔNICO Abreviação do nome de uma instrução
; Comentário
| Concatenação
<- Atribuição
Byte Valor com 8-bits
Word Valor com 16-bits

No ME implícito, o mais básico dos endereçamentos, não há operandos para buscar. A própria instrução contém as informações necessárias para execução.

Fórmula:
-
Sintaxe:
MNEMÔNICO
Ex:
;Limpa flag Carry
CLC

No modo imediato, um valor byte ou word faz parte da instrução. Esse valor é obtido e utilizado pela instrução para realizar operações aritméticas , lógicas e outras.

Fórmula:
-
Sintaxe:
MNEMÔNICO #$NN
Ex:
;Ou lógico com A
ORA #$FF

No modo relativo, um byte imediato é utilizado para realizar um cálculo e desviar o fluxo de execução de código sendo somado ao conteúdo do PC. Esse byte imediato é sinalizado tendo o intervalo de -128 até 127 permitindo que o desvio do fluxo possa ser feito “para frente” ou “para trás”. Esse modo é utilizado em instrução de branch(desvio).

Fórmula:
PC <- PC (-/+)valor_imediato
Sintaxe:
MNEMÔNICO $NN
Ex:
;Desvio de fluxo de execução
BCC nome_funcao ; Desvia se Carry = 0

No endereçamento absoluto, um valor imediato de 16-bits é utilizado como endereço de origem ou destino onde um valor será lido ou escrito. Utilizando esse modo de endereçamento na página 0 ou 1 não terá o funcionamento circular.

Sintaxe:
MNEMÔNICO $NNNN
Ex:
;Armazena A em memória
STA $0200

O modo Absolute indexed(Absoluto Indexado) utiliza um valor imediato de 16-bits que é adicionado ao registrador de índice X para calcular o endereço final para leitura ou escrita de um valor. Utilizando o modo de endereçamento na página 0 ou 1 não terá o funcionamento circular.

Fórmula:
endereço_final <- #$NNNN + X
Sintaxe:
MNEMÔNICO $NNNN, X
Ex:
; X = 4
LDA $0400,X ; $0400 + 4 = $0404

O modo Absolute indexed(Absoluto Indexado) utiliza um valor imediato de 16-bits que é adicionado aos registrador Y para calcular o endereço final para leitura ou escrita de um valor. Utilizando o modo de endereçamento na página 0 ou 1 não terá o funcionamento circular.

Fórmula:
endereço_final <- #$NNNN + Y
Sintaxe:
MNEMÔNICO $NNNN, Y
Ex:
; X = 4
LDA $0400,X ; $0400 + 4 = $0404

Nesse modo de endereçamento um valor pode ser lido ou escrito na página zero da memória do 6502. O MSB, byte mais significativo do endereço é sempre 00h e um valor imediato de 8-bits armazena o LSB, byte menos significativo do endereço final de 16-bits que é utilizando.

Fórmula:
endereço_final <- $00|$NN
Sintaxe:
MNEMÔNICO $NN
Ex:
 LDA $01 ; 00 + 01 = $0001

Nesse modo de endereçamento um valor pode ser lido ou escrito na página zero da memória do 6502. O MSB do endereço é sempre 00h, um valor imediato de 8-bits é adicionado ao registrador X gerando assim o endereço de 16-bits que é utilizando.

Fórmula:
endereço_final <- $00|$NN + X

Ao somar $NN + X, o valor do "vai-um" é sempre desprezado formando um endereço de página zero.

Sintaxe:
MNEMÔNICO $NN, X
Ex:
; X = 4
;RAM[0004] = 0xff
LDA $00,X ; 00 + 04 = $0004

Nesse modo de endereçamento um valor pode ser lido ou escrito na página zero da memória do 6502. O MSB do endereço é sempre 00h, um valor imediato de 8-bits é adicionado ao registrador Y gerando assim o endereço de 16-bits que é utilizando.

Fórmula:
 endereço_final <- $00|$NN + Y

Ao somar $NN + X, o valor do "vai-um" é sempre desprezado formando um endereço de página zero/Zero Page.

Sintaxe:
MNEMÔNICO $NN, Y
Ex:
; Y = 4
;RAM[0004] = 0xff
LDA $00,Y ; 00 + 04 = $0004

No modo Obsoluto indireto um valor pode ser lido ou escrito na memória do 6502 de forma indireta. Um valor absoluto imediato armazena um endereço de memória que contém um endereço 16-bits que é utilizado.

Fórmula:
endereço_final <- ($NNNN)
Sintaxe:
MNEMÔNICO ($NNNN)
Ex:

$0000: contém o valor $0400(LE)
$0004: contém o valor $0500(LE)

Ao executar:
JMP ($0000) ; desvio de código
Temos:

O endereço indireto contido nos bytes LSB($04) e MSB($00) contidos $0000 formam um endereço indireto $0004 em tem os bytes LSB($05) e o MSB($00) formando o endereço final $0005 que é carregado no registrador PC.

BUG: O 6502 possui um bug quando um JMP indireto é executado. Quando o endereço indireto atravessa uma pagina de memória, exemplo 0x01FF, o byte menos significativo do endereço indireto e recuperado de 0x01FF e o byte mais significativo é recuperado de 0x0100 ao invés de 0x0200.

Neste modo de endereçamento que utiliza os conceitos da Página Zero, um byte imediato é somado ao conteúdo do registrador X para formar um endereço de 16-bits onde o endereço final, indireto, é obtido.

Esse modo de endereçamento possui o mesmo comportamento circular já discutido acima.

Fórmula:
endereço <- (00$NN + X + 1)(00$NN + X)
endereço_final <- (endereço)
Onde:
(): conteúdo de memória
$NN: valor imediato página zero.
Sintaxe:
MNEMÔNICO ($NN,X)
Ex:

X contém $00
$0000: contém o valor $0400(LE)
$0004: contém o valor $0500(LE)

Ao executar:
 ADC ($00,X) ; adição
Temos:

O bytes contidos em $00 + X + 1 e $00 + X contém $04 e $00 resultando em no endereço $0004. Os bytes $05 e $00 contidos $0004 e $0005 formam um endereço indireto $0005 que é local de onde um byte é lido para realização da adição.

Neste modo de endereçamento que também utiliza os conceitos da Página Zero, um byte imediato é utilizado para gerar um endereço para a página zero que contém um endereço de 16-bits. Esse endereço contém um endereço indireto que é somado ao registrador Y para formar um endereço indireto final que será utilizado.

Esse modo de endereçamento possui o mesmo comportamento circular já discutido acima.

Fórmula:
endereço <- (00$NN + 1)(00$NN)
endereço_indireto <- (endereço)
endereço_final <- endereço_indireto + Y
Onde:
(): conteúdo de memória
$NN: valor imediato página zero.
Sintaxe:
MNEMÔNICO ($NN),Y
Ex:

Y contém $04
$0000: contém o valor $0400(LE)
$0004: contém o valor $0500(LE)

Ao executar:
ADC ($00),Y ; adição
Temos:

Os bytes contidos em $00 + 1 e $00 forma endereço $0004. Os bytes $05 e $00 contidos $0004 e $0005 formam um endereço indireto $0005 que adicionado ao registrador Y formando o endereço final $0009 que é local de onde um byte é recuperado para realização da adição.

  1. 11/03/2025 - revisão 4 - Correções em absoluto X/Y, Indireto X/Y;Adição de bug JMP indireto;
  2. 11/09/2024 - revisão 3 - Correção em descrição de modos indexados e fórmulas
  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 erros gramaticais
  5. 28/04/2023 - versão inicial