Processadores 6502 e 65C02




Códigos do assembler 6502/65C02



Apresentando o MOS 6502


O MOS 6502 é um microprocessador de 8 bits projetado por Chuck Peddle para a MOS Technology em 1975.
Quando foi apresentado, era a CPU completa mais barata do mercado, custando cerca de 1/6 (ou menos) do preço de dispositivos similares feitos por grandes empresas concorrentes, como Motorola e Intel.
Era ainda mais rápido do que a maioria deles, e, juntamente com o Zilog Z80, deu origem a uma série de projetos de computadores que eventualmente resultaram na revolução dos computadores domésticos dos anos 1980.
A fabricação do 6502 foi também suprida originalmente pela Rockwell e Synertek, e posteriormente licenciada para várias outras empresas; ele ainda é produzido para uso em sistemas embarcados.


Descrição ténica

A lógica interna do 6502 funciona na mesma velocidade do clock externo, mas apesar das baixas velocidades do clock o desempenho do 6502 era competitivo com outras CPUs contemporâneas que utilizavam clocks com mais velocidade.
Isso se dá devido a máquina de estado simples que é implementada pela lógica computacional (sem relógio). A baixa frequência do clock moderou o requisito de velocidade da memória e periféricos acoplados ao CPU, já que apenas 50% do clico do clock estava disponível para o acesso à memória.
Como o chip só acessava a memória durante algumas partes do ciclo do clock, assim esses ciclos eram indicados pelo pino de baixa PHI clock-out, já outros chips podiam acessar a memória durante os momentos em que o 6502 estava fora do barramento.


Endereçamento

O chip utiliza registradores de índice e pilha efetivamente com vários modos de endereçamento, incluindo um modo rápido de "página direta", que é semelhante ao encontrado no PDP-8, que acessava locais de memória dos endereços de 0 a 255 com um único endereço de 8 bits.
Em alguns microcomputadores baseados em 6502 com um sistema operacional, o sistema operacional usava a maior parte da página direta, deixando apenas alguns locais para o usuário.


Aplicações do MOS 6502

O primeiro dispositivo a utilizar o microprocessador foi o Apple I em 1976, no ano seguinte foi utilizado no Apple II e no Commodore PET, em 1979 na família Atari de 8-bits.
Na década de 1980 foi utilizado no Acorn Atom, BBC Micro, Oric e Commodore VIC-20.



O surgimento do CMOS 65C02


O microprocessador Western Design Center (WDC) 65C02 é uma versão CMOS aprimorada do MOS 6502. O 65C02 corrigiu vários problemas do 6502 original e adicionou algumas novas instruções, mas sua principal característica foi o uso bastante reduzido no consumo de energia, na ordem de 10 a 20 vezes menos do que o 6502 original rodando na mesma velocidade.
O consumo de energia reduzido tornou o 65C02 útil em computadores portáteis e sistemas de microcontroladores em ambientes industriais. Ele tem sido usado em alguns computadores domésticos, bem como em aplicações, incluindo dispositivos implantados de grau médico.

O desenvolvimento do WDC 65C02 começou em 1981 com amostras lançadas no início de 1983. O 65C02 foi lançado oficialmente pouco depois. A WDC licenciou o projeto para Synertek, NCR, GTE e Rockwell Semiconductor.
O principal interesse da Rockwell estava no mercado de embutidos e pediu que vários novos comandos fossem adicionados para ajudar nessa função. Mais tarde, eles foram copiados de volta para a versão de linha de base, quando a WDC adicionou dois novos comandos próprios para criar o W65C02. Mais tarde, a Sanyo também licenciou o design, e a Seiko Epson produziu uma versão modificada chamada de oHuC6280.

As primeiras versões usavam encapsulamento DIP de 40 pinos e estavam disponíveis em versões de 1, 2 e 4 MHz, correspondendo às velocidades das versões nMOS originais. Versões posteriores foram produzidas em pacotes PLCC e QFP, bem como PDIP, e com classificações de velocidade de clock muito mais altas. A versão atual da WDC, o W65C02S-14 tem um núcleo totalmente estático e funciona oficialmente em velocidades de até 14 MHz quando alimentado em 5 volts.

A arquitetura básica do 65C02 é idêntica ao 6502 original e pode ser considerada uma implementação de baixo consumo de energia desse projeto. Operando a 1 MHz, a velocidade mais popular para o 6502 original, o 65C02 requer apenas 20 mW, enquanto o original usa 450 mW, uma redução de mais de vinte vezes. O núcleo otimizado manualmente e o uso de baixa potência destinam-se a tornar o 65C02 adequado para projetos de sistema em chip (SoC) de baixa potência.

Um modelo de descrição de hardware Verilog está disponível para projetar o núcleo W65C02S em um circuito integrado específico de aplicação (ASIC) ou uma matriz de portas programáveis ​​em campo (FPGA). Como é comum na indústria de semicondutores, a WDC oferece um sistema de desenvolvimento, que inclui uma placa de desenvolvimento, um emulador in-circuit (ICE) e um sistema de desenvolvimento de software.


Comparação com o NMOS 6502


Arquitetura básica

Embora o 65C02 possa ser pensado principalmente como um 6502 de baixo consumo, ele também corrige vários bugs encontrados no original e adiciona novas instruções, modos de endereçamento e recursos que podem ajudar o programador a escrever programas menores e de execução mais rápida. Estima-se que o programa em linguagem assembly 6502 médio pode ser feito de 10 a 15 por cento menor no 65C02 e ver uma melhoria semelhante no desempenho, principalmente por meio de acessos à memória evitados pelo uso de menos instruções para realizar uma determinada tarefa.

Instruções não documentadas removidas

O 6502 original tinha 56 instruções, que, quando combinadas com diferentes modos de endereçamento, produziam um total de 151 opcodes dos possíveis 256 padrões de opcode de 8 bits. Os 105 opcodes restantes não utilizados foram indefinidos, com o conjunto de códigos com 4 bits de ordem inferior com 3, 7, B ou F deixados totalmente sem uso, o código com 2 de ordem inferior tendo apenas um único opcode.

O 6502 era famoso pela maneira como alguns desses códigos restantes realmente executavam ações. Devido à forma como o decodificador de instruções do 6502 funcionava, simplesmente definir certos bits no opcode faria com que partes do processamento da instrução ocorressem. Alguns desses opcodes imediatamente travavam o processador, enquanto outros executavam funções úteis e até recebiam mnemônicos de montador não oficiais pelos usuários.

O 65C02 adicionou vários novos opcodes que usaram vários desses slots de "instrução não documentada" anteriormente, por exemplo, $FF agora era usado para a nova instrução BBS (veja abaixo). Aqueles que permaneceram verdadeiramente não utilizados foram configurados para executar NOPs. Programas que tiraram proveito desses códigos não funcionarão no 65C02.

Correções de bugs

O 6502 original tinha várias erratas quando lançado inicialmente. As primeiras versões do processador tinham uma RORinstrução defeituosa (girar para a direita), que emite a tecnologia MOS abordada por não documentar a instrução ROR que foi corrigido logo que foi detectado em produção e não foi um problema para a grande maioria das máquinas que usavam o processador.

Em contraste, um bug notório que está presente em todas as variantes do NMOS 6502 envolve a instrução de salto ao usar endereçamento indireto. Neste modo de endereçamento, o endereço de destino da instrução JMP é buscado na memória, o vetor de salto, em vez de ser um operando para a instrução JMP. Por exemplo, JMP ($1234) buscaria o valor nos locais de memória $1234 (byte menos significativo) e $1235 (byte mais significativo) e carregaria esses valores no contador de programa, o que faria com que o processador continuasse a execução no endereço armazenado no vetor.

O bug aparece quando o endereço do vetor termina em $FF, que é o limite de uma página de memória. Nesse caso, buscará o byte mais significativo do endereço de destino de $00 da página original em vez de $00 da nova página. Portanto, obteria o byte menos significativo do endereço de destino em $12FF e o byte mais significativo do endereço de destino em $1200 em vez de $1300. O 65C02 corrigiu esse problema.

Mais um descuido do que um bug, o estado do sinalizador (D)ecimal no registro de status do NMOS 6502 é indefinido após uma reinicialização ou interrupção. Isso significa que os programadores precisam definir o sinalizador para um valor conhecido para evitar erros relacionados a operações aritméticas. Como resultado, encontra-se uma instrução CLD (CLear Decimal) em quase todos os manipuladores de interrupção do 6502, bem como no início do código de reset. O 65C02 limpa automaticamente este sinalizador depois de empurrar o registrador de status para a pilha em resposta a qualquer interrupção ou em resposta a uma reinicialização de hardware, colocando o processador de volta no modo aritmético binário.

Durante a aritmética do modo decimal, o NMOS 6502 atualizará os sinalizadores (N)egative, o(V)erflow e (Z)ero para refletir o resultado da aritmética binária subjacente, ou seja, os sinalizadores estão refletindo um resultado calculado antes do processador realizando a correção decimal. Em contraste, o 65C02 configura esses sinalizadores de acordo com o resultado da aritmética decimal, ao custo de um ciclo de clock extra por instrução aritmética.

Ao executar uma instrução read-modify-write (R-M-W), como em INC addr, todas as variantes NMOS farão uma escrita dupla em addr, primeiro reescrevendo o valor atual encontrado em addr e depois escrevendo o valor modificado. Esse comportamento pode resultar em bugs difíceis de resolver se addr for um registro de hardware. Isso pode ocorrer se o hardware estiver observando alterações no valor do registrador e então realizar uma ação, neste caso, ele realizará duas ações, uma com o valor original e outra com o novo valor. Em vez disso, o 65C02 executa uma leitura dupla de addr, seguida por uma única gravação.

Ao executar o endereçamento indexado, se a indexação cruzar um limite de página, todas as variantes do NMOS 6502 lerão um endereço inválido antes de acessar o endereço correto. Assim como em uma instrução R-M-W, esse comportamento pode causar problemas ao acessar registradores de hardware via indexação. O 65C02 corrigiu esse problema executando uma leitura fictícia do opcode da instrução quando a indexação cruzava um limite de página. No entanto, essa correção introduziu um novo bug que ocorre quando o endereço base está em um limite de página uniforme (o que significa que a indexação nunca cruzará para a próxima página). Com o novo bug, uma leitura fictícia é executada no endereço base antes da indexação, de modo que LDA $1200,X fará uma leitura fictícia em $1200 antes do valor de X ser adicionado a $1200. Novamente, se indexar em endereços de registro de hardware, esse bug pode resultar em comportamento indefinido.

Se um NMOS 6502 estiver buscando um opcode BRK (interrupção de software) ao mesmo tempo em que ocorre uma interrupção de hardware, o BRK será ignorado conforme o processador reage à interrupção de hardware. O 65C02 lida corretamente com essa situação atendendo a interrupção e executando o BRK.


Novos modos de endereçamento

O 6502 possui dois modos de endereçamento indireto que cancelam a referência por meio de endereços de 16 bits armazenados na página zero:

- Indireta indexada, LDA ($10,X), adiciona o registrador X ao endereço zero da página fornecido antes de ler o vetor de 16 bits. Neste exemplo, se X for 5, ele lê o endereço de 16 bits do local $15/$16. Isso é útil quando há uma matriz de ponteiros na página zero.
- Indireta indexada LDA ($10),Y, adiciona o registrador Y ao vetor de 16 bits lido do endereço zero da página fornecido. Por exemplo, se Y for 5 e $10/$11 contiver o vetor $1000, isso lerá o valor de $1005. Isso executa o endereçamento de deslocamento de ponteiro.

Uma desvantagem desse modelo é que, se a indexação não for necessária, mas o endereço estiver na página zero, um dos registradores de índice ainda deve ser definido como zero e usado em uma dessas instruções. O 65C02 adicionou um modo de endereçamento indireto não indexado LDA ($10) a todas as instruções que usavam modos indexados indiretos e indiretos, liberando os registradores de índice.

A instrução JMP do 6502 tinha um modo de endereçamento exclusivo (entre 6502 instruções) conhecido como "absoluto indireto" que lia um valor de 16 bits de um determinado endereço de memória e depois pulava para o endereço nesse valor de 16 bits. Por exemplo, se o local de memória $A000 contiver $34 e $A001 contiver $12, JMP ($A000) leria esses dois bytes, construiria o valor $1234 e depois pularia para esse local.

Um uso comum para endereçamento indireto é construir tabelas de ramificações, uma lista de pontos de entrada para sub-rotinas que podem ser acessadas usando um índice. Por exemplo, um driver de dispositivo pode listar os pontos de entrada para OPEN, CLOSE, READ, etc em uma tabela em $A000. READ é a terceira entrada, indexada a zero, e cada endereço requer 16 bits, então para chamar um READ usaria algo semelhante a JMP ($A004). Se o driver for atualizado e o código da sub-rotina se mover na memória, qualquer código existente ainda funcionará enquanto a tabela de ponteiros permanecer em $A000.

O 65C02 adicionou o novo modo "indireto absoluto indexado" que facilitou o uso de tabelas de ramais. Este modo adiciona o valor do registrador X ao endereço absoluto e retira o endereço de 16 bits do local resultante. Por exemplo, para acessar a função READ da tabela acima, armazenaríamos 4 em X, depois JMP ($A000,X). Esse estilo de acesso simplifica o acesso às tabelas de ramificação, pois um único endereço de base é usado em conjunto com um deslocamento de 8 bits. O mesmo poderia ser alcançado na versão NMOS usando o modo indireto indexado, mas apenas se a tabela estivesse na página zero, um recurso limitado. Permitir que elas sejam construídas fora da página zero não apenas diminuiu a demanda por esse recurso, mas também permitiu que as tabelas fossem construídas em ROM.


Instruções novas e modificadas

Além dos novos modos de endereçamento, o "modelo base" 65C02 também adicionou um conjunto de novas instruções.

- INC e DEC sem parâmetros agora incrementa ou decrementa o acumulador. Este foi um descuido estranho no conjunto de instruções original, que incluía apenas INX / DEX, INY / DEY e INC addr/ DEC addr. Alguns montadores usam as formas alternativas INA / DEA ou INC A / DEC A.
- STZ addr, STore Zero no endereço. Substitui a necessidade de usar LDA #0;STA addr e não exige a alteração do valor do acumulador. Como essa tarefa é comum na maioria dos programas, o uso do STZ pode reduzir o tamanho do código, tanto eliminando o LDA quanto qualquer código necessário para salvar o valor do acumulador, normalmente um par PHA PLA.
- PHX, PLX, PHY, PLY, empurra e puxa os registradores X e Y para/da pilha. Anteriormente, apenas o acumulador e o registrador de status tinham instruções push e pull. X e Y só podem ser empilhados movendo-os primeiro para o acumulador com TXA ou TYA, alterando assim o conteúdo do acumulador e usando PHA.
- BRA, BRanch Always. Opera como um JMP mas usa um endereço relativo de 1 byte como outros ramos, economizando um byte. A velocidade é geralmente a mesma que o JMP absoluto de 3 ciclos, a menos que uma página seja cruzada, o que tornaria o BRA 1 ciclo mais longo (4 ciclos). Como o endereço é relativo, também é útil ao escrever código relocável, uma tarefa comum na era anterior às unidades de gerenciamento de memória .


Instruções de manipulação de bits

Tanto a WDC quanto a Rockwell contribuíram com melhorias para as funções de teste e manipulação de bits no 65C02. A WDC adicionou novos modos de endereçamento à instrução BIT que estava presente no 6502, bem como duas novas instruções para manipulação conveniente de campos de bits, uma atividade comum em drivers de dispositivo.

O BIT no 65C02 adiciona o modo imediato, página zero indexada por X e indexada absoluta por endereçamento X. O endereçamento de modo imediato é particularmente conveniente por ser completamente não destrutivo. Por exemplo:

LDA $1234
BIT #%00010000
pode ser usado no lugar de:

LDA $1234
AND #%00010000

A operação AND altera o valor no acumulador, de modo que o valor original carregado de $1234 é perdido. O uso BIT deixa o valor no acumulador inalterado, para que o código subsequente possa fazer testes adicionais em relação ao valor original, evitando ter que recarregar o valor da memória.

Além dos aprimoramentos da instrução BIT, a WDC adicionou duas instruções projetadas para manipular convenientemente os campos de bits:

- TSB addr e TRB addr, Test e Set Bit e Test e Reset Bit.
Uma máscara no acumulador ( .A) é logicamente ANDed (adicionado) com memória em addr, cuja localização pode ser página zero ou absoluta. O sinalizador Z no registrador de status é condicionado de acordo com o resultado do AND lógico - nenhum outro sinalizador de registrador de status é afetado. Além disso, os bits em addr são definidos (TSB) ou limpos (TRB) de acordo com a máscara em .A. De forma sucinta, o TSB executa um OR lógico após o AND lógico e armazena o resultado do OR lógico em addr , enquanto o TRB armazena os resultados do AND lógico em addr . Em ambos os casos, o sinalizador Z no registrador de status indica o resultado de antes do conteúdo de .A AND addr. TRB e TSB substituem assim uma sequência de instruções, essencialmente combinando a instrução BIT com etapas adicionais para salvar as alterações computacionais, mas de uma forma que informa o status do valor afetado antes de ser alterado.
As alterações da Rockwell adicionaram mais instruções de manipulação de bits para configurar e testar diretamente qualquer bit e combinar o teste, limpar e ramificar em um único opcode. As novas instruções estavam disponíveis desde o início na família R65C00 da Rockwell, mas não faziam parte da especificação 65C02 original e não eram encontradas em versões feitas pela WDC ou seus outros licenciados. Estes foram posteriormente copiados de volta para o design da linha de base e estavam disponíveis em versões posteriores do WDC.


As instruções específicas da Rockwell são:

- SMBbit# zp / RMBbit# zp. Definir ou Redefinir (limpar) bit número bit# em zero página byte zp.
RMB e SMB são usados ​​para limpar (RMB) ou definir (SMB) bits individuais em um campo de bits, cada um substituindo uma sequência de três instruções. Como RMB e SMB são apenas endereçamento de página zero, essas instruções são limitadas em utilidade e são principalmente de valor em sistemas nos quais os registradores de dispositivo estão presentes em página zero. O componente bit# da instrução geralmente é escrito como parte do mnemônico, como o SMB1 $12 que define o bit 1 no endereço de página zero $12. Alguns montadores tratam o bit# como parte do operando da instrução, por exemplo, SMB 1,$12, que tem a vantagem de permitir que seja substituído por um nome de variável ou número calculado.

- BBR bit#,offset,addr e BBS bit#,offset,addr. Ramificar no Bit Set/Reset.
Mesmo endereçamento de página zero e limitações como RMB e SMB, mas desvia para addr se o bit selecionado estiver limpo (BBR) ou definido (BBS). Como é o caso de RMB e SMB, BBR e BBS substituem uma sequência de três instruções.


Modos de baixo consumo

Além dos novos comandos acima, a WDC também adicionou as instruções STP e WAI para oferecer suporte aos modos de baixo consumo de energia.

STP, STop the Processor, interrompeu todo o processamento até que uma reinicialização de hardware fosse emitida. Isso pode ser usado para colocar um sistema em "suspensão" e, em seguida, acordá-lo rapidamente com uma reinicialização. Normalmente, isso exigiria algum sistema externo para manter a memória principal e não era amplamente utilizado.

WAIt teve um efeito semelhante, entrando no modo de baixo consumo de energia, mas esta instrução acordou o processador novamente na recepção de uma interrupção. Anteriormente, lidar com uma interrupção geralmente envolvia executar um loop para verificar se uma interrupção foi recebida, às vezes conhecida como "looping", verificar o tipo quando uma é recebida e, em seguida, pular para o código de processamento. Isso significava que o processador estava funcionando durante todo o processo, mesmo quando nenhuma interrupção estava ocorrendo.

Em contraste, no 65C02, o código de interrupção pode ser escrito tendo um WAI seguido imediatamente por um JSR ou JMP para o manipulador. Quando o WAI foi encontrado, o processamento parou e o processador entrou no modo de baixo consumo de energia. Quando a interrupção foi recebida, ela imediatamente processou JSR e tratou a solicitação.

Isso tinha a vantagem adicional de melhorar um pouco o desempenho. No caso "looping", a interrupção pode chegar no meio de uma das instruções do loop e, para permitir que ela reinicie após retornar do manipulador, o processador gasta um ciclo para salvar sua localização. Com WAI, o processador entra no estado de baixo consumo de energia em um local conhecido onde todas as instruções são garantidas como completas, de modo que, quando a interrupção chega, ela não pode interromper uma instrução e o processador pode continuar com segurança sem gastar um estado de economia de ciclo.

Características

   Lançamento:
       - MOS 6502 - 1975
       - COS 65C02 - 1983


   Velocidade:
       - 6502 executando entre 1 Mhz até 3 Mhz
       - 65C02 executando entre 1 Mhz até 14 Mhz


   BUS de dados:
       - 6502: 8 bits
       - 65C02: 8 bits


   BUS de endereços e contador de programa:
       - 6502: 16 bits
       - 65C02: 16 bits


   Conjunto de Instruções:
       - 6502: 56 instruções
       - 65C02: 69 instruções


   Memória RAM:
       - 6502: máximo de 64Kb
       - 65C02: máximo de 64Kb


   Voltagem:
       - 6502: 0,3V até 7V
       - 65C02: 1,71V até 5,25V




Guia rápido conjunto de instruções 6502


Instruções por ordem alfabética


     Legenda para os Flags:
     +  Modificado
     -  Não modificado
     1  Marcado
     0  Desmarcado
     M6  Bit 6 da memória
     M7  Bit 7 da memória


     Legenda para os ciclos das instruções:
      *  adicione 1 ciclo se o limite da página for ultrapassado
      ** adicione 1 ciclo se ocorrer ramificação na mesma página
         adicione 2 ciclos se ocorrer ramificação para página diferente


ADC
     Add Memory to Accumulator with Carry
     Soma conteúdo da Memória no Acumulador com Carry

     Flags afetados após a execução:
     N Z C I D V
     + + + - - +


EndereçamentoComandoCódigoBytesCiclos
imediatoADC #oper6922
zeropageADC oper6523
zeropage,XADC oper,X7524
absolutoADC oper6D34
absoluto,XADC oper,X7D34*
absoluto,YADC oper,Y7934*
(indireto,X)ADC (oper,X)6126
(indireto),YADC (oper),Y7125*


AND
     AND Memory with Accumulator
     AND Memory with Accumulator
     Executa um AND do conteúdo de Memória com o Acumulador

      Flags afetados após a execução:
      N Z C I D V
      + + - - - -

EndereçamentoComandoCódigoBytesCiclos
immediateAND #oper2922
zeropageAND oper2523
zeropage,XAND oper,X3524
absoluteAND oper2D34
absolute,XAND oper,X3D34*
absolute,YAND oper,Y3934*
(indirect,X)AND (oper,X)2126
(indirect),YAND (oper),Y3125*


ASL
     Shift Left One Bit (Memory or Accumulator)
     Deslocar (rotaciona) um bit do byte para a esquerda (da memória ou do acumulador)

     Flags afetados após a execução:
     N Z C I D V
     + + + - - -

EndereçamentoComandoCódigoBytesCiclos
accumulatorASL A0A12
zeropage ASL oper 0625
zeropage,X ASL oper,X 1626
absolute ASL oper 0E36
absolute,X ASL oper,X 1E37


BCC
     Branch on Carry Clear
     Desvia execução quando flag Carry for zerado (C = 0)

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
relativeBCC oper9022


BCS
     Branch on Carry Set
     Desvia execução quando flag Carry for setado (C = 1)

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
relativeBCS operB022**


BEQ
     Branch on Result Zero
     Desvia execução quando flag Zero for setado (Z = 1)

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
relativeBEQ operF022**


BIT
     Test Bits in Memory with Accumulator
     Testa conteúdo de Bits na memória com o Acumulador

     bits 7 and 6 of operand are transfered to bit 7 and 6 of SR (N,V);
     the zero-flag is set to the result of operand AND accumulator.

     Flags afetados após a execução:
     N Z C I D V
     M7+ - - - M6

EndereçamentoComandoCódigoBytesCiclos
zeropageBIT oper2423
absoluteBIT oper2C34


BMI
     Branch on Result Minus
     Desvia execução quando flag Negative for setado (N = 1)

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
relativeBMI oper3022**


BNE
     Branch on Result not Zero
     Desvia execução quando flag Zero não for setado (Z = 0)

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
relativeBNE operD022**


BPL
     Branch on Result Plus
     Desvia execução quando flag Negativo for zerado (N = 0)

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
relativeBPL oper1022**


BRK
     Force Break
     Força parada de execução

     BRK inicia uma interrupção de software semelhante a uma
     interrupção de hardware (IRQ). O endereço de retorno colocado na pilha é
     PC+2, fornecendo um byte extra de espaço para uma marca de quebra
     (identificando o motivo da quebra).
     O registrador de status será colocado na pilha com o
     sinalizador de quebra definido como 1. No entanto, quando recuperado durante RTI ou por uma
     instrução PLP, o flag break será ignorado.
     O sinalizador de desativação de interrupção não é definido automaticamente.

     Flags afetados após a execução:
     N Z C I D V
     - - - 1 - -

EndereçamentoComandoCódigoBytesCiclos
impliedBRK0017


BVC
     Branch on Overflow Clear
     Desvia execução quando flag Overflow for zerado (V = 0)

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
relativeBVC oper5022**


BVS
     Branch on Overflow Set
     Desvia execução quando flag Overflow for setado (V = 1)

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
relativeBVS oper7022**


CLC
     Clear Carry Flag
     Limpa flag Carry

     Flags afetados após a execução:
     N Z C I D V
     - - 0 - - -

EndereçamentoComandoCódigoBytesCiclos
impliedCLC1812


CLD
     Clear Decimal Mode
     Limpa flag de modo Decimal

     Flags afetados após a execução:
     N Z C I D V
     - - - - 0 -

EndereçamentoComandoCódigoBytesCiclos
impliedCLDD812


CLI
     Clear Interrupt Disable Bit
     Limpa flag de Interrupção

     Flags afetados após a execução:
     N Z C I D V
     - - - 0 - -

EndereçamentoComandoCódigoBytesCiclos
impliedCLI5812


CLV
     Clear Overflow Flag
     Limpa flag de Overflow

     Flags afetados após a execução:
     N Z C I D V
     - - - - - 0

EndereçamentoComandoCódigoBytesCiclos
impliedCLVB812


CMP
     Compare Memory with Accumulator
     Compara byte na Memória com Acumulador

     Flags afetados após a execução:
     N Z C I D V
     + + + - - -

EndereçamentoComandoCódigoBytesCiclos
immediateCMP #operC922
zeropageCMP operC523
zeropage,XCMP oper,XD524
absoluteCMP operCD34
absolute,XCMP oper,XDD34*
absolute,YCMP oper,YD934*
(indirect,X CMP (oper,X)C126
(indirect),YCMP (oper),YD125*


CPX
     Compare Memory and Index X
     Compara byte na Memória com Index X

     Flags afetados após a execução:
     N Z C I D V
     + + + - - -

EndereçamentoComandoCódigoBytesCiclos
immediateCPX #operE022
zeropageCPX operE423
absoluteCPX operEC34


CPY
     Compare Memory and Index Y
     Compara byte na Memória com Index Y

     Flags afetados após a execução:
     N Z C I D V
     + + + - - -

EndereçamentoComandoCódigoBytesCiclos
immediateCPY #operC022
zeropageCPY operC423
absoluteCPY operCC34


DEC
     Decrement Memory by One
     Decrementa byte na memória com 1

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
zeropageDEC operC625
zeropage,XDEC oper,XD626
absoluteDEC operCE36
absolute,XDEC oper,XDE37


DEX
     Decrement Index X by One
     Decrementa Index X com 1

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedDEXCA12


DEY
     Decrement Index Y by One
     Decrementa Index Y com 1

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedDEY o8812


EOR
     Exclusive-OR Memory with Accumulator
     Executa um Exclusive-OR num byte da Memory com o Accumulator

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
immediateEOR #oper4922
zeropageEOR oper4523
zeropage,XEOR oper,X5524
absoluteEOR oper4D34
absolute,XEOR oper,X5D34*
absolute,YEOR oper,Y5934*
(indirect,X)EOR (oper,X)4126
(indirect),YEOR (oper),Y5125*


INC
     Increment Memory by One
     Incrementa byte na Memória com 1

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
zeropageINC operE625
zeropage,XINC oper,XF626
absoluteINC operEE36
absolute,XINC oper,XFE37


INX
     Increment Index X by One
     Incrementa Index X com 1

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedINXE812


INY
     Increment Index Y by One
     Incrementa Index Y com 1

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedINYC812


JMP
     Jump to New Location
     Desvia a execução para novo endereço de memória

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
absoluteJMP oper4C33
indirectJMP (oper)6C35


JSR
     Jump to New Location Saving Return Address
     Desvia a execução para novo endereço de memória (subrotina) e retorna a execução após o desvio

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
absoluteJSR oper2036


LDA
     Load Accumulator with Memory
     Carrega Acumulador com byte da Memória

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
immediateLDA #operA922
zeropageLDA operA523
zeropage,XLDA oper,XB524
absoluteLDA operAD34
absolute,XLDA oper,XBD34*
absolute,YLDA oper,YB934*
(indirect,X)LDA (oper,X)A126
(indirect),YLDA (oper),YB125*


LDX
     Load Index X with Memory
     Carrega Index X com byte da Memória

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
immediateLDX #operA222
zeropageLDX operA623
zeropage,YLDX oper,YB624
absoluteLDX operAE34
absolute,YLDX oper,YBE34*


LDY
     Load Index Y with Memory
     Carrega Index Y com byte da Memória

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
immediateLDY #operA022
zeropageLDY operA423
zeropage,XLDY oper,XB424
absoluteLDY operAC34
absolute,XLDY oper,XBC34*


LSR
     Shift One Bit Right (Memory or Accumulator)
     Deslocar (rotaciona) um bit do byte para a direita (da memória ou do acumulador)

     Flags afetados após a execução:
     N Z C I D V
     0 + + - - -

EndereçamentoComandoCódigoBytesCiclos
accumulatorLSR A4A12
zeropageLSR oper4625
zeropage,XLSR oper,X5626
absoluteLSR oper4E36
absolute,XLSR oper,X5E37


NOP
     No Operation
     Sem operação (não faz nada na execução)

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedNOPEA12


ORA
     OR Memory with Accumulator
     Executa um OR entre byte na Memória com o Acumulador

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
immediateORA #oper0922
zeropageORA oper0523
zeropage,XORA oper,X1524
absoluteORA oper0D34
absolute,XORA oper,X1D34*
absolute,YORA oper,Y1934*
(indirect,X)ORA (oper,X)0126
(indirect),YORA (oper),Y1125*


PHA
     Push Accumulator on Stack
     Coloca o valor do Acumulador na Pilha

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedPHA4813


PHP
     Push Processor Status on Stack
     Coloca registrador de Status do Processador na Pilha

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedPHP0813


PLA
     Pull Accumulator from Stack
     Retorna o valor da Pilha no Acumulador

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedPLA6814


PLP
     Pull Processor Status from Stack
     Retorna o registrador de Status do Processador da Pilha

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedPLP2814


ROL
     Rotate One Bit Left (Memory or Accumulator)
     Gira um Bit do byte para a Esquerda (memória ou acumulador)

     Flags afetados após a execução:
     N Z C I D V
     + + + - - -

EndereçamentoComandoCódigoBytesCiclos
accumulatorROL A2A12
zeropageROL oper2625
zeropage,XROL oper,X3626
absoluteROL oper2E36
absolute,XROL oper,X3E37


ROR
     Rotate One Bit Right (Memory or Accumulator)
     Gira um Bit do byte para a Direita (memória ou acumulador)

     Flags afetados após a execução:
     N Z C I D V
     + + + - - -

EndereçamentoComandoCódigoBytesCiclos
accumulatorROR A6A12
zeropageROR oper6625
zeropage,XROR oper,X7626
absoluteROR oper6E36
absolute,XROR oper,X7E37


RTI
     Return from Interrupt
     Retona execução após uma Interrupção

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedRTI4016


RTS
     Return from Subroutine
     Retorna a execução para o endereço que desviou a execução (subrotina)

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedRTS6016


SBC
     Subtract Memory from Accumulator with Borrow
     Subtrair memória do acumulador com empréstimo

     Flags afetados após a execução:
     N Z C I D V
     + + + - - +

EndereçamentoComandoCódigoBytesCiclos
immediateSBC #operE922
zeropageSBC operE523
zeropage,XSBC oper,XF524
absoluteSBC operED34
absolute,XSBC oper,XFD34*
absolute,YSBC oper,YF934*
(indirect,X)SBC (oper,X)E126
(indirect),YSBC (oper),YF125*


SEC
     Set Carry Flag
     Liga o flag Carry

     Flags afetados após a execução:
     N Z C I D V
     - - 1 - - -

EndereçamentoComandoCódigoBytesCiclos
impliedSEC3812


SED
     Set Decimal Flag
     Liga o flag Decimal

     Flags afetados após a execução:
     N Z C I D V
     - - - - 1 -

EndereçamentoComandoCódigoBytesCiclos
impliedSEDF812


SEI
     Set Interrupt Disable Status
     Liga o flag de status do Interruptor

     Flags afetados após a execução:
     N Z C I D V
     - - - 1 - -

EndereçamentoComandoCódigoBytesCiclos
impliedSEI7812


STA
     Store Accumulator in Memory
     Armazena o byte do Acumulador na Memória

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
zeropageSTA oper8523
zeropage,XSTA oper,X9524
absoluteSTA oper8D34
absolute,XSTA oper,X9D35
absolute,YSTA oper,Y9935
(indirect,X)STA (oper,X)8126
(indirect),YSTA (oper),Y9126


STX
     Store Index X in Memory
     Armazena o byte do Index X na Memória

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
zeropageSTX oper8623
zeropage,YSTX oper,Y9624
absoluteSTX oper8E34


STY
     Store Index Y in Memory
     Armazena o byte do Index Y na Memória

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
zeropageSTY oper8423
zeropage,XSTY oper,X9424
absoluteSTY oper8C34


TAX
     Transfer Accumulator to Index X
     Trasnfere o byte do Acumulador para o Index X

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedTAXAA12


TAY
     Transfer Accumulator to Index Y
     Trasnfere o byte do Acumulador para o Index Y

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedTAYA812


TSX
     Transfer Stack Pointer to Index X
     Trasnfere o byte do Stack Pointer para o Index X

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedTSXBA12


TXA
     Transfer Index X to Accumulator
     Trasnfere o byte do Index X para o Acumulador

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedTXA8A12


TXS
     Transfer Index X to Stack Register
     Trasnfere o byte do Index X para o Stack Register

     Flags afetados após a execução:
     N Z C I D V
     - - - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedTXS9A12


TYA
     Transfer Index Y to Accumulator
     Trasnfere o byte do Index Y para o Acumulador

     Flags afetados após a execução:
     N Z C I D V
     + + - - - -

EndereçamentoComandoCódigoBytesCiclos
impliedTYA9812


Copyright © 2012 ~ 2022, Apple2Pro.com.br. Todos os direitos reservados.
#217238