Panowie, konkrety poproszę...
@epi: na przykład, czy są jakieś lub działają inaczej niż na 6502 (oprócz nielegali, of coz)
Znalazem coś takiego: http://www.google.pl/url?sa=t&rct=j … OTZAqxE6Lg oraz opis do 6502: http://c64power.com/index.php/artykuly/ … esora-6502
Nie jestem programistą, a przynajmniej nie na poziomie assemblera, ale parę rzeczy w wymienionym dokumencie mnie zainteresowało:
65C816 napisał/a:MOS 65c816 jest szesnastobitowym procesorem zgodnym programowo "w dół" z zainstalowanym w ATARI XL/XE procesorem 6502. Zgodność ta nie obejmuje nielegalnych (niepublikowanych) rozkazów 6502.
65C816 napisał/a:Celem zachowania kompatybilności z aplikacjami pisanymi dla 6502 procesor ma, obok trybu 16-bitowego (tzw. native mode), również tryb emulacji 6502 (emulation mode). W trybie tym funkcjonują wszystkie rozkazy 65c816, jednak nie jest możliwe korzystanie z szesnastobitowych operandów.
65C816 napisał/a:Szesnastobitowy akumulator bezpośrednio dostępny jest jedynie w trybie natywnym, nawet jednak w trybie emulacji istnieje możliwość zamiany miejscami obydwu jego ośmiobitowych połówek. Wykonuje to rozkaz XBA. Niektóre rozkazy używają szesnastobitowego akumulatora niezależnie od bieżącego trybu pracy CPU i stanu bitu M. W takich wypadkach akumulator oznaczany jest jako rejestr C.
-tutaj podejrzany jest kawalek o używaniu szesnastobitowości akumulatora niezależnie od trybu pracy...
65C816 napisał/a:Rejestr PC jest, niestety, szesnastobitowy. Oznacza to, że procesor nie jest w stanie przekroczyć granicy 64k inaczej, niż wykonując długie skoki JMP lub JSR.
Jak to się ma do natywnych programów z 6502? Pytam z czystej ciekawości.
65C816 napisał/a:Czas wykonywania się rozkazów w trybach strony zerowej jest taki sam, jak w 6502, pod warunkiem, ze rejestr D zawiera parzysta wartość. W przeciwnym wypadku wykonanie rozkazu zajmuje jeden cykl więcej.
Hmm, możemy tracić cykle za darmo... :/
Następna rzecz może powodować nieprzewidziane działania (dla standardowego Atari z 6502C):
65C816 napisał/a:Ważna różnica pomiędzy 6502 a 65c816 jest sposób obliczania adresu efektywnego w trybach indeksowanych strony zerowej. W 6502 nie da się przekroczyć granicy tej strony: jeśli wartość wynikająca z dodania adresu absolutnego do rejestru indeksowego jest większa, niż $FF, odwołanie "zawija się" do początku strony zerowej - LDA $FF,X przy X=$01 daje adres efektywny $0000 (a nie $0100).
W 65c816 pracującym w trybie 16-bitowym (native mode) jest inaczej: indeksy dodawane SA z przeniesieniem, toteż dla powyższego przykładu zostanie wygenerowany adres efektywny $0100 (+ zawartość rejestru D). Jednak w trybie emulacji 6502, dla zachowania kompatybilności z istniejącym oprogramowaniem, procesor zachowa się tak jak 6502, wszelako (i to jest cokolwiek dziwne) tylko wtedy, gdy rejestr D=$0000 a rozkaz pochodzi z repertuaru zwyklego 6502 (uwaga: nie 65c02!). We wszystkich innych wypadkach odwolania beda przekraczac granice strony rowniez w trybie emulacji.
65C816 napisał/a:Nie da sie ukryc, ze XL OS nie ma niczego sensownego pod tym adresami, tak wiec przelaczenie CPU w tryb natywny bez wylaczenia przerwan powoduje natychmiastowe padniecie systemu.
Uppsss... Lecimy w maliny?
65C816 napisał/a:JMP - jump - skok. Dla JMP long uzywa sie tez mnemonika JML (jump long). Uwaga: tryby posrednie (abs) i (abs,X) dzialaja zgodnie z logika, tj. jeśli argument wskazuje slowo znajdujace sie na granicy stron, starszy bajt zostanie odczytany z poczatku nastepnej strony, a nie z poczatku tej samej, jak w 6502.
Czyli skoczymy fizycznie gdzie indziej... A przeca JMP jest standardowym rozkazem... :/
Dobra, trochę się czepiam, ale XXL mnie zainspirował do sprawdzenia tych kilku rzeczy. Czy ktoś z szanownych programistów znających się na assemblerze mógłby tabelarycznie porównać STANDARDOWE rozkazy 6502C i 65C816 w trybie emulacji? Wraz z rozpiską cykli, zasadniczych różnic? (na przykład skoki we wspomnianym już JMP)?
Sikor umarł...