Nieudokumentowane rozkazy 6502C

From Atariki

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

← Previous diff
Wersja z dnia 17:26, 23 kwi 2012
Xxl (Dyskusja | wkład)

Next diff →
Linia 1: Linia 1:
-Listę niepublikowanych kodów (zwanych również rozkazami nielegalnymi) [[6502C]] [[SALLY]] można podzielić na dwie grupy. [[Nieudokumentowane_rozkazy_6502C#KODY STABILNE|Kody stabilne]] działają na wszystkich komputerach Atari serii [[XL]]/[[XE]] oraz tej części modeli [[400]]/[[800]] w której montowano procesor [[6502C]] [[SALLY]], natomiast [[Nieudokumentowane_rozkazy_6502C#KODY NIESTABILNE|kody niestabilne]] na procesorze [[6502C]] działają w sposób nieprzewidywalny.+Listę niepublikowanych kodów (zwanych również rozkazami nielegalnymi) [[6502C]] [[SALLY]] można podzielić na dwie grupy. [[Nieudokumentowane_rozkazy_6502C#KODY STABILNE|Kody stabilne]] (<span style="color: green">zielone</span>) działają na wszystkich komputerach Atari serii [[XL]]/[[XE]] oraz tej części modeli [[400]]/[[800]] w której montowano procesor [[6502C]] [[SALLY]], natomiast [[Nieudokumentowane_rozkazy_6502C#KODY NIESTABILNE|kody niestabilne]] (<span style="color: red">czerwone</span>) na procesorze [[6502C]] działają w sposób nieprzewidywalny.
 + 
 +{| 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
 +|-
 +! +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
 +|-
 +! +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
 +|-
 +! +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
 +|-
 +! +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
 +|-
 +! +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
 +|-
 +! +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
 +|-
 +! +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
 +|-
 +! +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
 +|-
 +|}
 + 
Legenda: Legenda:

Wersja z dnia 17:26, 23 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 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +1A +1B +1C +1D +1E +1F
+00 CIM ASO DOP ASO ANC TOP ASO CIM ASO DOP ASO NPO ASO TOP ASO
+20 CIM RLN RLN ANC RLN CIM RLN DOP RLN NPO RLN TOP RLN
+40 CIM LSE DOP LSE ALR LSE CIM LSE DOP LSE NPO LSE TOP LSE
+60 CIM RRD DOP RRD ARR RRD CIM RRD DOP RRD NPO RRD TOP RRD
+80 DOP DOP SAX SAX DOP ANE SAX CIM SHA SAX SHS SHY SHX SHA
+A0 LAX LAX ANX LAX CIM LAX LAX LAS LAX
+C0 DOP DCP DCP SBX DCP CIM DCP DOP DCP NPO DCP TOP DCP
+E0 DOP ISB ISB SBC ISB CIM ISB DOP ISB NPO ISB TOP ISB


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 emulatorze Atari800Win PLus oraz makroassemblerze MADS.

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