Nieudokumentowane rozkazy 6502C

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 17:26, 23 kwi 2012
Xxl (Dyskusja | wkład)

← Previous diff
Wersja z dnia 07:25, 24 kwi 2012
Xxl (Dyskusja | wkład)

Next diff →
Linia 2: Linia 2:
{| border="1" cellpadding="1" cellspacing="1" {| border="1" cellpadding="1" cellspacing="1"
-! KOD !! +00 !! +01 !! +02 !! +03 !! +04 !! +05 !! +06 !! +07 !! +08 !! +09 !! +0A !! +0B !! +0C !! +0D !! +0E !! +0F !! +10 !! +11 !! +12 !! +13 !! +14 !! +15 !! +16 !! +17 !! +18 !! +19 !! +1A !! +1B !! +1C !! +1D !! +1E !! +1F+! width="65px" | KOD !! width="65px" | +00 !! +01 !! width="65px" | +02 !! width="65px" | +03 !! width="65px" | +04 !! +05 !! +06 !! width="65px" | +07 !! +08 !! width="65px" | +09 !! width="65px" | +0A !! width="65px" | +0B !! width="65px" | +0C !! +0D !! width="65px" | +0E !! width="65px" | +0F
|- |-
-! +00 || || || style="color:RED" | CIM || style="color:GREEN" | ASO || style="color:GREEN" | DOP || || || style="color:GREEN" | ASO || || || || style="color:GREEN" | ANC || style="color:GREEN" | TOP || || || style="color:GREEN" | ASO || || || style="color:RED" | CIM || style="color:GREEN" | ASO || style="color:GREEN" | DOP || || || style="color:GREEN" | ASO || || || style="color:GREEN" | NPO || style="color:GREEN" | ASO || style="color:GREEN" | TOP || || || style="color:GREEN" | ASO +! +00 || || || style="color:RED" | CIM || style="color:GREEN" | ASO (Z,X) || style="color:GREEN" | DOP Z || || || style="color:GREEN" | ASO Z || || || || style="color:GREEN" | ANC #n || style="color:GREEN" | TOP Q || || || style="color:GREEN" | ASO Q
|- |-
-! +20 || || || style="color:RED" | CIM || style="color:GREEN" | RLN || || || || style="color:GREEN" | RLN || || || || style="color:GREEN" | ANC || || || || style="color:GREEN" | RLN || || || style="color:RED" | CIM || style="color:GREEN" | RLN || style="color:GREEN" | DOP || || || style="color:GREEN" | RLN || || || style="color:GREEN" | NPO || style="color:GREEN" | RLN || style="color:GREEN" | TOP || || || style="color:GREEN" | RLN +! +10 || || || style="color:RED" | CIM || style="color:GREEN" | ASO (Z),Y || style="color:GREEN" | DOP Z,X || || || style="color:GREEN" | ASO Z,X || || || style="color:GREEN" | NPO || style="color:GREEN" | ASO Q,Y || style="color:GREEN" | TOP Q,X || || || style="color:GREEN" | ASO Q,X
|- |-
-! +40 || || || style="color:RED" | CIM || style="color:GREEN" | LSE || style="color:GREEN" | DOP || || || style="color:GREEN" | LSE || || || || style="color:GREEN" | ALR || || || || style="color:GREEN" | LSE || || || style="color:RED" | CIM || style="color:GREEN" | LSE || style="color:GREEN" | DOP || || || style="color:GREEN" | LSE || || || style="color:GREEN" | NPO || style="color:GREEN" | LSE || style="color:GREEN" | TOP || || || style="color:GREEN" | LSE +! +20 || || || style="color:RED" | CIM || style="color:GREEN" | RLN (Z,X) || || || || style="color:GREEN" | RLN Z || || || || style="color:GREEN" | ANC #n || || || || style="color:GREEN" | RLN Q
|- |-
-! +60 || || || style="color:RED" | CIM || style="color:GREEN" | RRD || style="color:GREEN" | DOP || || || style="color:GREEN" | RRD || || || || style="color:GREEN" | ARR || || || || style="color:GREEN" | RRD || || || style="color:RED" | CIM || style="color:GREEN" | RRD || style="color:GREEN" | DOP || || || style="color:GREEN" | RRD || || || style="color:GREEN" | NPO || style="color:GREEN" | RRD || style="color:GREEN" | TOP || || || style="color:GREEN" | RRD +! +30 || || || style="color:RED" | CIM || style="color:GREEN" | RLN (Z),Y || style="color:GREEN" | DOP Z,X || || || style="color:GREEN" | RLN Z,X || || || style="color:GREEN" | NPO || style="color:GREEN" | RLN Q,Y || style="color:GREEN" | TOP Q,X || || || style="color:GREEN" | RLN Q,X
|- |-
-! +80 || style="color:GREEN" | DOP || || style="color:GREEN" | DOP || style="color:GREEN" | SAX || || || || style="color:GREEN" | SAX || || style="color:GREEN" | DOP || || style="color:RED" | ANE || || || || style="color:GREEN" | SAX || || || style="color:RED" | CIM || style="color:RED" | SHA || || || || style="color:GREEN" | SAX || || || || style="color:RED" | SHS || style="color:GREEN" | SHY || || style="color:GREEN" | SHX || style="color:RED" | SHA +! +40 || || || style="color:RED" | CIM || style="color:GREEN" | LSE (Z,X) || style="color:GREEN" | DOP Z || || || style="color:GREEN" | LSE Z || || || || style="color:GREEN" | ALR #n || || || || style="color:GREEN" | LSE Q
|- |-
-! +A0 || || || || style="color:GREEN" | LAX || || || || style="color:GREEN" | LAX || || || || style="color:RED" | ANX || || || || style="color:GREEN" | LAX || || || style="color:RED" | CIM || style="color:GREEN" | LAX || || || || style="color:GREEN" | LAX || || || || style="color:RED" | LAS || || || || style="color:GREEN" | LAX +! +50 || || || style="color:RED" | CIM || style="color:GREEN" | LSE (Z),Y || style="color:GREEN" | DOP Z,X || || || style="color:GREEN" | LSE Z,X || || || style="color:GREEN" | NPO || style="color:GREEN" | LSE Q,Y || style="color:GREEN" | TOP Q,X || || || style="color:GREEN" | LSE Q,X
|- |-
-! +C0 || || || style="color:GREEN" | DOP || style="color:GREEN" | DCP || || || || style="color:GREEN" | DCP || || || || style="color:GREEN" | SBX || || || || style="color:GREEN" | DCP || || || style="color:RED" | CIM || style="color:GREEN" | DCP || style="color:GREEN" | DOP || || || style="color:GREEN" | DCP || || || style="color:GREEN" | NPO || style="color:GREEN" | DCP || style="color:GREEN" | TOP || || || style="color:GREEN" | DCP +! +60 || || || style="color:RED" | CIM || style="color:GREEN" | RRD (Z,X) || style="color:GREEN" | DOP Z || || || style="color:GREEN" | RRD Z || || || || style="color:GREEN" | ARR #n || || || || style="color:GREEN" | RRD Q
|- |-
-! +E0 || || || style="color:GREEN" | DOP || style="color:GREEN" | ISB || || || || style="color:GREEN" | ISB || || || || style="color:GREEN" | SBC || || || || style="color:GREEN" | ISB || || || style="color:RED" | CIM || style="color:GREEN" | ISB || style="color:GREEN" | DOP || || || style="color:GREEN" | ISB || || || style="color:GREEN" | NPO || style="color:GREEN" | ISB || style="color:GREEN" | TOP || || || style="color:GREEN" | ISB +! +70 || || || style="color:RED" | CIM || style="color:GREEN" | RRD (Z),Y || style="color:GREEN" | DOP Z,X || || || style="color:GREEN" | RRD Z,X || || || style="color:GREEN" | NPO || style="color:GREEN" | RRD Q,Y || style="color:GREEN" | TOP Q,X || || || style="color:GREEN" | RRD Q,X
 +|-
 +! +80 || style="color:GREEN" | DOP #n || || style="color:GREEN" | DOP #n || style="color:GREEN" | SAX (Z,X) || || || || style="color:GREEN" | SAX Z || || style="color:GREEN" | DOP #n || || style="color:RED" | ANE #n || || || || style="color:GREEN" | SAX Q
 +|-
 +! +90 || || || style="color:RED" | CIM || style="color:RED" | SHA (Z),Y|| || || || style="color:GREEN" | SAX Z,Y || || || || style="color:RED" | SHS Q,Y || style="color:GREEN" | SHY Q,X || || style="color:GREEN" | SHX Q,Y || style="color:RED" | SHA Q,Y
 +|-
 +! +A0 || || || || style="color:GREEN" | LAX (Z,X) || || || || style="color:GREEN" | LAX Z || || || || style="color:RED" | ANX #n || || || || style="color:GREEN" | LAX Q
 +|-
 +! +B0 || || || style="color:RED" | CIM || style="color:GREEN" | LAX (Z),Y || || || || style="color:GREEN" | LAX Z,Y || || || || style="color:RED" | LAS Q,Y || || || || style="color:GREEN" | LAX Q,Y
 +|-
 +! +C0 || || || style="color:GREEN" | DOP #n || style="color:GREEN" | DCP (Z,X) || || || || style="color:GREEN" | DCP Z || || || || style="color:GREEN" | SBX #n || || || || style="color:GREEN" | DCP Q
 +|-
 +! +D0 || || || style="color:RED" | CIM || style="color:GREEN" | DCP (Z),Y || style="color:GREEN" | DOP Z,X || || || style="color:GREEN" | DCP Z,X || || || style="color:GREEN" | NPO || style="color:GREEN" | DCP Q,Y || style="color:GREEN" | TOP Q,X || || || style="color:GREEN" | DCP Q,Z
 +|-
 +! +E0 || || || style="color:GREEN" | DOP #n || style="color:GREEN" | ISB (Z,X) || || || || style="color:GREEN" | ISB Z || || || || style="color:GREEN" | SBC #n || || || || style="color:GREEN" | ISB Q
 +|-
 +! +F0 || || || style="color:RED" | CIM || style="color:GREEN" | ISB (Z),Y || style="color:GREEN" | DOP Z,X || || || style="color:GREEN" | ISB Z,X || || || style="color:GREEN" | NPO || style="color:GREEN" | ISB Q,Y || style="color:GREEN" | TOP Q,X || || || style="color:GREEN" | ISB Q,X
|- |-
|} |}
Linia 28: Linia 44:
<br>Z - adres jednobajtowy danych lub adresu pośredniego, <br>Z - adres jednobajtowy danych lub adresu pośredniego,
<br>* - dodać cykl przy zmianie strony. <br>* - dodać cykl przy zmianie strony.
-<br>Użyto mnemoników stosowanych w emulatorze [[Atari800Win_PLus|Atari800Win PLus]] oraz makroassemblerze [[MADS]].+<br>Użyto mnemoników stosowanych w makroassemblerze [[MADS]] oraz monitorze emulatora [[Atari800Win_PLus|Atari800Win PLus]].
== KODY STABILNE == == KODY STABILNE ==

Wersja z dnia 07:25, 24 kwi 2012

Listę niepublikowanych kodów (zwanych również rozkazami nielegalnymi) 6502C SALLY można podzielić na dwie grupy. Kody stabilne (zielone) działają na wszystkich komputerach Atari serii XL/XE oraz tej części modeli 400/800 w której montowano procesor 6502C SALLY, natomiast kody niestabilne (czerwone) na procesorze 6502C działają w sposób nieprzewidywalny.

KOD +00 +01 +02 +03 +04 +05 +06 +07 +08 +09 +0A +0B +0C +0D +0E +0F
+00 CIM ASO (Z,X) DOP Z ASO Z ANC #n TOP Q ASO Q
+10 CIM ASO (Z),Y DOP Z,X ASO Z,X NPO ASO Q,Y TOP Q,X ASO Q,X
+20 CIM RLN (Z,X) RLN Z ANC #n RLN Q
+30 CIM RLN (Z),Y DOP Z,X RLN Z,X NPO RLN Q,Y TOP Q,X RLN Q,X
+40 CIM LSE (Z,X) DOP Z LSE Z ALR #n LSE Q
+50 CIM LSE (Z),Y DOP Z,X LSE Z,X NPO LSE Q,Y TOP Q,X LSE Q,X
+60 CIM RRD (Z,X) DOP Z RRD Z ARR #n RRD Q
+70 CIM RRD (Z),Y DOP Z,X RRD Z,X NPO RRD Q,Y TOP Q,X RRD Q,X
+80 DOP #n DOP #n SAX (Z,X) SAX Z DOP #n ANE #n SAX Q
+90 CIM SHA (Z),Y SAX Z,Y SHS Q,Y SHY Q,X SHX Q,Y SHA Q,Y
+A0 LAX (Z,X) LAX Z ANX #n LAX Q
+B0 CIM LAX (Z),Y LAX Z,Y LAS Q,Y LAX Q,Y
+C0 DOP #n DCP (Z,X) DCP Z SBX #n DCP Q
+D0 CIM DCP (Z),Y DOP Z,X DCP Z,X NPO DCP Q,Y TOP Q,X DCP Q,Z
+E0 DOP #n ISB (Z,X) ISB Z SBC #n ISB Q
+F0 CIM ISB (Z),Y DOP Z,X ISB Z,X NPO ISB Q,Y TOP Q,X ISB Q,X


Legenda:
n - dane w trybie natychmiastowym,
Q - adres dwubajtowy,
Z - adres jednobajtowy danych lub adresu pośredniego,
* - dodać cykl przy zmianie strony.
Użyto mnemoników stosowanych w makroassemblerze MADS oraz monitorze emulatora Atari800Win PLus.

KODY STABILNE

ANC / ANC
Wykonuje AND na A i danej. Znacznik C ustawiany tak jak N.
Znaczniki: N,Z,C

Assembler kod dł. cykle
ANC #n $0B 2 2
ANC #n $2B 2 2


SAX / SAX
Wykonuje AND pomiędzy A i rejestrem X, wynik zapisuje w pamięci. Rejestry A i X pozostają niezmienione.
Znaczniki: -

Assembler kod dł. cykle
SAX Z $87 2 3
SAX Z,Y $97 2 4
SAX (Z,X) $83 2 6
SAX Q $8F 3 4


ALR / ALR
Wykonuje AND na A i danej, następnie LSR @.
Znaczniki: N,Z,C

Assembler kod dł. cykle
ALR #n $4B 2 2


SBX / SBX
Wykonuje AND pomiędzy rejestrem X i A, wynik w rejestrze X. Znacznik C ustawiany gdy zawartość rejestru X jest większa lub równa danej. Od rejestru X odejmuje daną (bez pożyczki).
Znaczniki: N,Z,C

Assembler kod dł. cykle
SBX #n $CB 2 2


DCM / DCP
Zmniejsza o jeden wartość bajtu pamięci następnie wykonuje CMP na A i tej wartości.
Znaczniki: N,Z,C

Assembler kod dł. cykle
DCP Z $C7 2 5
DCP Z,X $D7 2 6
DCP Q $CF 3 6
DCP Q,X $DF 3 7
DCP Q,Y $DB 3 7
DCP (Z,X) $C3 2 8
DCP (Z),Y $D3 2 8


INS / ISB
Zwiększa o jeden zawartość pamięci. Od A odejmuje wartość pamięci (z pożyczką).
Znaczniki: N,V,Z,C

Assembler kod dł. cykle
ISB Z $E7 2 5
ISB Z,X $F7 2 6
ISB Q $EF 3 6
ISB Q,X $FF 3 7
ISB Q,Y $FB 3 7
ISB (Z,X) $E3 2 8
ISB (Z),Y $F3 2 8


NOP / NPO
Niepublikowany NOP
Znaczniki: -

Assembler kod dł. cykle
NPO $1A 1 2
NPO $3A 1 2
NPO $5A 1 2
NPO $7A 1 2
NPO $DA 1 2
NPO $FA 1 2


NOP / NPO (DOP)
Dwubajtowy NOP
Znaczniki: -

Assembler kod dł. cykle
NPO Z $04 2 3
NPO Z,X $14 2 4
NPO Z,X $34 2 4
NPO Z $44 2 3
NPO Z,X $54 2 4
NPO Z $64 2 3
NPO Z,X $74 2 4
NPO #n $80 2 2
NPO #n $82 2 2
NPO #n $89 2 2
NPO #n $C2 2 2
NPO Z,X $D4 2 4
NPO #n $E2 2 2
NPO Z,X $F4 2 4


NOP / NPO (TOP)
Trzybajtowy NOP
Znaczniki: -

Assembler kod dł. cykle
NPO Q $0C 3 4
NPO Q,X $1C 3 4 *
NPO Q,X $3C 3 4 *
NPO Q,X $5C 3 4 *
NPO Q,X $7C 3 4 *
NPO Q,X $DC 3 4 *
NPO Q,X $FC 3 4 *


SBC / SBC (?)
Niepublikowany SBC #n.
Znaczniki: N,V,Z,C

Assembler kod dł. cykle
SBC #n $EB 2 2


LAX / LAX
Załaduje daną do A i rejestru X.
Znaczniki: N,Z

Assembler kod dł. cykle
LAX Z $A7 2 3
LAX Z,Y $B7 2 4
LAX Q $AF 3 4
LAX Q,Y $BF 3 4 *
LAX (Z,X) $A3 2 6
LAX (Z),Y $B3 2 5 *


RLA / RLN
Wykonuje ROL na pamięci, następnie AND z A (wynik w A).
Znaczniki: N,Z,C

Assembler kod dł. cykle
RLN Z $27 2 5
RLN Z,X $37 2 6
RLN Q $2F 3 6
RLN Q,X $3F 3 7
RLN Q,Y $3B 3 7
RLN (Z,X) $23 2 8
RLN (Z),Y $33 2 8


RRA / RRD
Wykonuje ROR na pamięci, następnie ADC z A (wynik w A).
Znaczniki: N,V,Z,C

Assembler kod dł. cykle
RRD Z $67 2 5
RRD Z,X $77 2 6
RRD Q $6F 3 6
RRD Q,X $7F 3 7
RRD Q,Y $7B 3 7
RRD (Z,X) $63 2 8
RRD (Z),Y $73 2 8


ASO / ASO
Wykonuje ASL na pamięci, następnie ORA z A (wynik w A).
Znaczniki: N,Z,C

Assembler kod dł. cykle
ASO Z $07 2 5
ASO Z,X $17 2 6
ASO Q $0F 3 6
ASO Q,X $1F 3 7
ASO Q,Y $1B 3 7
ASO (Z,X) $03 2 8
ASO (Z),Y $13 2 8


LSE / LSE
Wykonuje LSR na pamięci, następnie EOR z A (wynik w A).
Znaczniki: N,Z,C

Assembler kod dł. cykle
LSE Z $47 2 5
LSE Z,X $57 2 6
LSE Q $4F 3 6
LSE Q,X $5F 3 7
LSE Q,Y $5B 3 7
LSE (Z,X) $43 2 8
LSE (Z),Y $53 2 8


SHX / SHX
Do starszego bajtu adresu dodaje jeden i wykonuje AND z rejestrem X. Tak otrzymaną wartość zapisuje w pamięci. Jeśli nastąpiło przekroczenie granicy strony zapis wykona pod adresem którego starszy bajt jest równy otrzymanej wartości.
Znaczniki: -

Assembler kod dł. cykle
SHX Q,Y $9E 3 5


SHY / SHY
Do starszego bajtu adresu dodaje jeden i wykonuje AND z rejestrem Y. Tak otrzymana wartość zapisuje w pamięci. Jeśli nastąpiło przekroczenie granicy strony zapis wykona pod adresem którego starszy bajt jest równy otrzymanej wartości.
Znaczniki: -

Assembler kod dł. cykle
SHY Q,X $9C 3 5


ARR / ARR
Gdy znacznik D=0 rozkaz działa następująco:
Wykonuje AND na A i danej po czym ROR.
Znacznik C wpisuje do b7, b6 do znacznika C, do V b6 EOR b5.
Znaczniki: N,V,Z,C

Assembler kod dł. cykle
ARR #n $6B 2 2


KODY NIESTABILNE


CIM / CIM
Blokuje procesor.
Znaczniki: -

Assembler kod dł. cykle
CIM $02 1 -
CIM $12 1 -
CIM $22 1 -
CIM $32 1 -
CIM $42 1 -
CIM $52 1 -
CIM $62 1 -
CIM $72 1 -
CIM $92 1 -
CIM $B2 1 -
CIM $D2 1 -
CIM $F2 1 -


SHA / SHA
Do starszego bajtu adresu dodaje jeden i wykonuje AND z A, następnie AND z rejestrem X. Tak otrzymaną wartość zapisuje w pamięci. Jeśli nastąpi przekroczenie granicy strony zapis wykona pod adresem którego starszy bajt jest równy otrzymanej wartości.
Znaczniki: -

Assembler kod dł. cykle
SHA Q,Y $9F 3 5
SHA (Z),Y $93 2 6


SHS / SHS
Do rejestru S zapisuje wynik operacji A AND X następnie do starszego bajtu adresu dodaje jeden, wykonuje AND z S i zapisuje wynik w pamięci. Jeśli nastąpi przekroczenie granicy strony zapis wykona pod adresem którego starszy bajt jest równy otrzymanej wartości.
Znaczniki: -

Assembler kod dł. cykle
SHS Q,Y $9B 3 5


LAS / LAS
Wykonuje AND na zawartości pamięci i rejestru S, wynik zapisuje w rejestrach A, X, S.
Znaczniki: N,Z

Assembler kod dł. cykle
LAS Q,Y $BB 3 4 *


ANE / ANE
Znaczniki procesora ustawiane są wg. operacji argument AND A.
Rozkaz najpierw wykonuje sumę logiczną argumentu i wartości $EF, następnie operacji AND na rejestrze X i wyniku. W kolejnym kroku z tak otrzymaną wartością wykona AND z A. Wynik w A.
Znaczniki: N,Z

Assembler kod dł. cykle
ANE #n $8B 2 2


ANX / ANX
Wykonuje operację argument AND A, wynik zapisuje w A oraz rejetrze X.
Znaczniki: N,Z

Assembler kod dł. cykle
ANX #n $AB 2 2



CIEKAWOSTKI

Rozkazy niepublikowane użyte zostały w grze Alley Cat.

Personal tools