Nieudokumentowane rozkazy 6502C

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 10:08, 20 cze 2012
Xxl (Dyskusja | wkład)

← Previous diff
Wersja z dnia 13:56, 25 lip 2012
Tdc (Dyskusja | wkład)
(drobne redakcyjne)
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]] (<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.+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" {| border="1" cellpadding="1" cellspacing="1"

Wersja z dnia 13:56, 25 lip 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,X
+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.
Gdy znacznik D=1 rozkaz:
Wykonuje AND na A i danej (cząstkowy wynik w postaci młodszego i starszego nibbla przechowuje) następnie wykonuje ROR @.
Jeśli wartość młodszego nibbla cząstkowego wyniku powiększona o jego b0 będzie większa lub równa od 5 to młodszy nibbel wyniku w A zostanie zwiększony o 6, przy czym cząstkowe przeniesienie do starszego nibbla zostanie utracone.
Podobnie starszy nibbel cząstkowego wyniku, jeśli wartość po zwiększeniu o b0 będzie większa lub równa 5 to starszy nibbel wyniku w A zwiększony będzie o 6 a dodatkowo znacznik C zostanie ustawiony, jeśli nie było korekty starszego nibbla wyniku znacznik C będzie skasowany.
Flaga V ustawiona gdy w b6 zmieni swoj stan po AND i ROR, kasowany w przeciwnym wypadku.
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 stabilne użyte zostały w grach: Alex, Alley Cat, Flinstone's Adventures, Gallahad, Ghastly Night, Indiana Jones - The Last Crusade, Jurassic Park, Landscape, Leader Board, Nexuss, Riot, SOS Saturn, Terminator, Vanguard; programach demonstracyjnych: Film Editor, Platfus Demo, Rolex, Rolex 2, Rolex 3, Rolex IV, Szczemp Sex Demo.
  • Rozkazy niepublikowane niestabilne użyte zostały w grze G.I.L.P.; programach: 6502 Illegal Codes Test (Krógera).
  • Bracia Selinger używali niepublikowanych rozkazów we wszystkich swoich grach.
Personal tools