65C816
From Atariki
Wersja z dnia 02:42, 19 lut 2006 KMK (Dyskusja | wkład) ← Previous diff |
Aktualna wersja KMK (Dyskusja | wkład) (→Emulatory) |
||
Linia 1: | Linia 1: | ||
- | [[65C816]] to 16-bitowy następca układu MOS [[6502]], można nim zastąpić zastosowany w Atari procesor [[6502C]]. [[65C816]] zaprojektowany został przez [http://en.wikipedia.org/wiki/Bill_Mensch Williama D. Menscha] jako wersja rozwojowa i następca procesora [[65C02]]. Produkowany jest przez [http://wdesignc.com Western Design Center]. | + | 16-bitowy następca układu MOS [[6502]], można nim zastąpić zastosowany w Atari [[procesor]] [[6502C]]. [[65C816]] został zaprojektowany w latach 1982-84 przez [http://en.wikipedia.org/wiki/Bill_Mensch Williama D. Menscha] jako wersja rozwojowa i następca procesora [[65C02]]. Produkowany jest przez [http://wdesignc.com Western Design Center]. |
== Architektura == | == Architektura == | ||
{{grafr|65c816.gif}} | {{grafr|65c816.gif}} | ||
* ośmiobitowa szyna danych | * ośmiobitowa szyna danych | ||
- | * 24-bitowa szyna adresowa | + | * 24-bitowa (multipleksowana) szyna adresowa |
* 92 rozkazy | * 92 rozkazy | ||
* 22 tryby adresowania | * 22 tryby adresowania | ||
Linia 19: | Linia 19: | ||
* dwa tryby pracy: natywny oraz tryb emulacji [[6502]] (w tym ostanim procesor się "budzi" po włączeniu zasilania i resecie) | * dwa tryby pracy: natywny oraz tryb emulacji [[6502]] (w tym ostanim procesor się "budzi" po włączeniu zasilania i resecie) | ||
- | W trybie emulacji 6502 działają wszystkie rozkazy i tryby adresowania 65C816, nie da się jedynie skorzystać z 16-bitowych rejestrów. Dodatkową różnicą jest działanie trybów adresowania indeksowanych strony zerowej: jeśli adres wynikający z dodania adresu bazowego i rejestru indeksowego jest większy niż 255, w trybie emulacji 6502 "zawija się" on do początku strony zerowej, natomiast w trybie natywnym adres efektywny wskaże obszar poza stroną zerową. Żeby było dowcipniej, zachowanie takie w trybie emulacji dotyczy tylko rozkazów [[6502]], ale nie [[65C02]] - dlatego w trybie emulacji 6502, gdy rejestr X ma wartość $FF, rozkaz STZ $FF,X zapisze daną pod zupełnie inny adres ($01FE) niż rozkaz STA $FF,X ($00FE). | + | Procesor składa się z 22000 tranzystorów. |
+ | == Osobliwości == | ||
+ | |||
+ | === Rejestry === | ||
Osobliwością procesora jest działanie rejestrów C, X i Y: są one 16-bitowe, ale żeby skorzystać z ich pełnego rozmiaru, trzeba oddzielnym rozkazem dokonać przełączenia dodatkowych bitów rejestru statusu. Jeden z nich, zwany M, wybiera rozmiar akumulatora oraz operacji na pamięci (1 - ośmiobitowe, 0 - szesnastobitowe), drugi zwany X ma analogiczne znaczenie dla obydwu rejestrów indeksowych. | Osobliwością procesora jest działanie rejestrów C, X i Y: są one 16-bitowe, ale żeby skorzystać z ich pełnego rozmiaru, trzeba oddzielnym rozkazem dokonać przełączenia dodatkowych bitów rejestru statusu. Jeden z nich, zwany M, wybiera rozmiar akumulatora oraz operacji na pamięci (1 - ośmiobitowe, 0 - szesnastobitowe), drugi zwany X ma analogiczne znaczenie dla obydwu rejestrów indeksowych. | ||
- | Dodatkowo rejestry indeksowe i akumulator zachowują się nieco odmiennie przy manipulacji bitami M i X. Mianowicie przełączenie rejestrów X i Y z szesnastu na osiem bitów zeruje ich starsze bajty, natomiast przełączenie akumulatora na osiem bitów powoduje, że "rozpada się" on na dwie połówki, ale zawartość starszej jest w dalszym ciągu dostępna jako "akumulator B". | + | Dodatkowo rejestry indeksowe i akumulator zachowują się nieco odmiennie przy manipulacji bitami M i X. Mianowicie przełączenie rejestrów X i Y z szesnastu na osiem bitów zeruje ich starsze bajty, natomiast przełączenie akumulatora na osiem bitów powoduje, że ulega on rozłączeniu na dwie połówki, ale zawartość starszej jest w dalszym ciągu dostępna jako "akumulator B". |
Szesnastobitowe rejestry C, X, Y są dostępne tylko w trybie natywnym 65C816, natomiast w trybie emulacji 6502 istnieje dostęp do akumulatora B - obydwie połówki rejestru C można zamienić miejscami. | Szesnastobitowe rejestry C, X, Y są dostępne tylko w trybie natywnym 65C816, natomiast w trybie emulacji 6502 istnieje dostęp do akumulatora B - obydwie połówki rejestru C można zamienić miejscami. | ||
+ | |||
+ | === Tryb emulacji 6502 === | ||
+ | W trybie emulacji 6502 działają wszystkie rozkazy i tryby adresowania 65C816, nie da się jedynie, jak napisano powyżej, skorzystać z 16-bitowych rejestrów. | ||
+ | |||
+ | Dodatkową różnicą jest działanie trybów adresowania indeksowanych strony zerowej: jeśli adres wynikający z dodania adresu bazowego i rejestru indeksowego jest większy niż 255, w trybie emulacji 6502 "zawija się" on do początku strony zerowej, natomiast w trybie natywnym adres efektywny wskaże obszar poza stroną zerową. Żeby było dowcipniej, zachowanie takie w trybie emulacji dotyczy tylko rozkazów [[6502]], ale nie [[65C02]] - dlatego w trybie emulacji 6502, gdy rejestr X ma wartość $FF, rozkaz STZ $FF,X zapisze daną pod zupełnie inny adres ($01FE) niż rozkaz STA $FF,X ($00FE). | ||
+ | |||
+ | Do osobliwości (jeśli nie błędów w konstrukcji CPU) można też zaliczyć działanie indeksowanych trybów adresowania absolutnego: jeśli adres wynikający z dodania adresu bazowego i rejestru indeksowego jest większy niż 65535, dochodzi do przekroczenia granicy segmentu 64k. Np. załadowanie do rejestru X wartości $FF i wykonanie rozkazu LDA $FFFF,X sprawi, że procesor dokona odczytu spod adresu $0100FE. Dzieje się tak nie tylko w trybie natywnym (co naturalne), ale również w trybie emulacji, a to powoduje problemy z kompatybilnością z oprogramowaniem pisanym dla 6502, jeśli dostępy nie są wykonywane zawsze w ten sam sposób (lecz np. zapisy trybami adresowania strony zerowej, a odczyty jak powyżej, lub odwrotnie). Ten problem ma np. [[MyDOS]]. Można to rozwiązać w dwojaki sposób: albo poprawiając program (niekiedy zresztą tego typu działanie jest po prostu błędem, który na 6502 pozostaje niezauważony), albo sprzętowo powielając stronę zerową w obszarze $010000-$0100FF. To drugie zaimplementowano w karcie [[Rapidus Accelerator]]. | ||
== Rozszerzenia oparte na 65C816 == | == Rozszerzenia oparte na 65C816 == | ||
- | === Simple 65C816 Processor Adapter (Sweet 16) === | + | * [[Antonia 4 MB]], [[F7]], [[HyperSpeed XL/XE]], [[Rapidus Accelerator]], [[Sweet 16]], [[Turbo-816]], [[Warp4]], [[XL7]], [[XL14]] |
- | Jest to rozwiązanie umożliwiające tylko korzystanie z większej liczby rozkazów. Nie pozwala ono na dołączenie większej ilości [[Pamięć liniowa|pamięci liniowej]] (jak wiadomo 65C816 może zaadresować do 16MB pamięci). Szczegóły montażu w stołówce [http://hardware.atari8.info/65816.php Simple 65C816 Processor Adapter]. Na takiej samej zasadzie działa rozszerzenie [[Sweet16]]. | + | |
- | {{grafr|Si-65816.png}} | + | |
- | === Warp4 === | + | == Programy ze wsparciem dla 65C816 == |
- | Od powyższego, bardziej zaawansowane rozszerzenie to [[Warp4]], autorstwa [[Pasiu|Pasia]]/[[SSG]]. Warp4 opórcz samego CPU oferuje też nieco (1 MB) [[pamięć liniowa|pamięci liniowej]]. Obszar powyżej pierwszych 64k pamięci taktowany jest szybszym zegarem - w zależności od wersji procesora może to być 3,54 lub 7 MHz. "Stare" 64k taktowane jest tradycyjnie, na 1,773 MHz. | + | |
- | === Projekt F7 === | + | * OS-y: [[DracOS]], [[Turbo-816 OS]] |
- | Pasiu pracuje również nad kolejnym rozszerzeniem, dla którego inspiracją jest [[Hyperspeed XL-XE|Hyperspeed XL/XE]]. | + | * DOS-y: [[SpartaDOS X]] |
+ | * Programy narzędziowe: [[EYE]], RAMD816.SYS (ramdysk dla [[SpartaDOS X]], w późniejszych wersjach moduł do RAMDISK.SYS), RAMD816L.SYS (ramdysk dla SpartaDOS X używający pamięci tzw. [[pamięć liniowa|liniowej]]), [[Turbo 816 Monitor]] | ||
+ | * Programy użytkowe: [[CC65]], [[MAE]], [[MultiBASIC]], [[SD-Load]], [[SysInfo]], [[Turbo-Assembler/16]], [[Let's Emu!]] | ||
- | Projekt F7 to system dwuprocesorowy, gdzie 65C816 może pracować równolegle z [[6502C]]. Podobnie jak w Warp4 dostępny jest 1 MB szybkiej pamięci taktowanej zegarem 14 MHz, a dodatkowo 64k pracującego z tą samą częstotliwością cache'u zapewniającego szybki odczyt ze "starego" obszaru pierwszych 64k. | + | == Emulatory == |
- | Obok screenshot z [[SysInfo]] pokazujący parametry prototypowej instalacji: | + | * [[Altirra]] - emuluje 65C816 z zegarem do 21,28 MHz (NTSC 21,48 MHz) i do 16 MB pamięci liniowej. |
+ | |||
+ | == Inne == | ||
+ | |||
+ | * [http://atariage.com/forums/topic/194253-turbobasicxl-problem/page-6#entry2477246 Poprawki do MyDOS-a] | ||
==Zobacz też== | ==Zobacz też== | ||
* [http://www.westerndesigncenter.com/wdc/datasheets/w65c816s.pdf 65C816 Microprocessor Data Sheet (po angielsku)] | * [http://www.westerndesigncenter.com/wdc/datasheets/w65c816s.pdf 65C816 Microprocessor Data Sheet (po angielsku)] | ||
- | * [http://westerndesigncenter.com/wdc/datasheets/Programmanual.pdf 65C02/65C816 Programming Manual (po angielsku)] | + | * [http://wiki.nesdev.com/w/images/7/76/Programmanual.pdf 6502/65C02/65C816 Programming Manual (po angielsku)] |
- | * [http://atariarea.krap.pl/artykuly.php?akcja=pokaz_artykul&id=42 Procesor MOS 65C816 (po polsku)] | + | * [http://www.cs.xu.edu/~ryanr/atari/65816.html Programming notes for 65C816] by John Harris (po angielsku) |
+ | * [http://energy.scene.pl/index.php?page=slodka-szestnastka artykuł KMK zamieszczony w "ENERGY" #1] | ||
+ | |||
+ | ==Inne== | ||
* [[Przerwania]] | * [[Przerwania]] | ||
+ | * [[65C802]] | ||
* [[65C832]] | * [[65C832]] | ||
[[Kategoria:Atari 8-bit]] | [[Kategoria:Atari 8-bit]] |
Aktualna wersja
16-bitowy następca układu MOS 6502, można nim zastąpić zastosowany w Atari procesor 6502C. 65C816 został zaprojektowany w latach 1982-84 przez Williama D. Menscha jako wersja rozwojowa i następca procesora 65C02. Produkowany jest przez Western Design Center.
Spis treści |
Architektura
- ośmiobitowa szyna danych
- 24-bitowa (multipleksowana) szyna adresowa
- 92 rozkazy
- 22 tryby adresowania
- 16-bitowe ALU
- jeden 16-bitowy rejestr ogólnego przeznaczenia (akumulator A/B, czyli C)
- dwa szesnastobitowe rejestry indeksowe (X i Y)
- szesnastobitowy wskaźnik strony zerowej - D
- szesnastobitowy wskaźnik stosu - S
- dziewięciobitowy rejestr statusu - P
- dwa ośmiobitowe rejestry adresowe banku programu i danych (K i B)
- szesnastobitowy licznik programu - PC (razem z rejestrem banku programu stanowi 24-bitowy adres)
- wsparcie dla zewnętrznego MMU
- rozkazy przesłań blokowych
- dwa tryby pracy: natywny oraz tryb emulacji 6502 (w tym ostanim procesor się "budzi" po włączeniu zasilania i resecie)
Procesor składa się z 22000 tranzystorów.
Osobliwości
Rejestry
Osobliwością procesora jest działanie rejestrów C, X i Y: są one 16-bitowe, ale żeby skorzystać z ich pełnego rozmiaru, trzeba oddzielnym rozkazem dokonać przełączenia dodatkowych bitów rejestru statusu. Jeden z nich, zwany M, wybiera rozmiar akumulatora oraz operacji na pamięci (1 - ośmiobitowe, 0 - szesnastobitowe), drugi zwany X ma analogiczne znaczenie dla obydwu rejestrów indeksowych.
Dodatkowo rejestry indeksowe i akumulator zachowują się nieco odmiennie przy manipulacji bitami M i X. Mianowicie przełączenie rejestrów X i Y z szesnastu na osiem bitów zeruje ich starsze bajty, natomiast przełączenie akumulatora na osiem bitów powoduje, że ulega on rozłączeniu na dwie połówki, ale zawartość starszej jest w dalszym ciągu dostępna jako "akumulator B".
Szesnastobitowe rejestry C, X, Y są dostępne tylko w trybie natywnym 65C816, natomiast w trybie emulacji 6502 istnieje dostęp do akumulatora B - obydwie połówki rejestru C można zamienić miejscami.
Tryb emulacji 6502
W trybie emulacji 6502 działają wszystkie rozkazy i tryby adresowania 65C816, nie da się jedynie, jak napisano powyżej, skorzystać z 16-bitowych rejestrów.
Dodatkową różnicą jest działanie trybów adresowania indeksowanych strony zerowej: jeśli adres wynikający z dodania adresu bazowego i rejestru indeksowego jest większy niż 255, w trybie emulacji 6502 "zawija się" on do początku strony zerowej, natomiast w trybie natywnym adres efektywny wskaże obszar poza stroną zerową. Żeby było dowcipniej, zachowanie takie w trybie emulacji dotyczy tylko rozkazów 6502, ale nie 65C02 - dlatego w trybie emulacji 6502, gdy rejestr X ma wartość $FF, rozkaz STZ $FF,X zapisze daną pod zupełnie inny adres ($01FE) niż rozkaz STA $FF,X ($00FE).
Do osobliwości (jeśli nie błędów w konstrukcji CPU) można też zaliczyć działanie indeksowanych trybów adresowania absolutnego: jeśli adres wynikający z dodania adresu bazowego i rejestru indeksowego jest większy niż 65535, dochodzi do przekroczenia granicy segmentu 64k. Np. załadowanie do rejestru X wartości $FF i wykonanie rozkazu LDA $FFFF,X sprawi, że procesor dokona odczytu spod adresu $0100FE. Dzieje się tak nie tylko w trybie natywnym (co naturalne), ale również w trybie emulacji, a to powoduje problemy z kompatybilnością z oprogramowaniem pisanym dla 6502, jeśli dostępy nie są wykonywane zawsze w ten sam sposób (lecz np. zapisy trybami adresowania strony zerowej, a odczyty jak powyżej, lub odwrotnie). Ten problem ma np. MyDOS. Można to rozwiązać w dwojaki sposób: albo poprawiając program (niekiedy zresztą tego typu działanie jest po prostu błędem, który na 6502 pozostaje niezauważony), albo sprzętowo powielając stronę zerową w obszarze $010000-$0100FF. To drugie zaimplementowano w karcie Rapidus Accelerator.
Rozszerzenia oparte na 65C816
Programy ze wsparciem dla 65C816
- OS-y: DracOS, Turbo-816 OS
- DOS-y: SpartaDOS X
- Programy narzędziowe: EYE, RAMD816.SYS (ramdysk dla SpartaDOS X, w późniejszych wersjach moduł do RAMDISK.SYS), RAMD816L.SYS (ramdysk dla SpartaDOS X używający pamięci tzw. liniowej), Turbo 816 Monitor
- Programy użytkowe: CC65, MAE, MultiBASIC, SD-Load, SysInfo, Turbo-Assembler/16, Let's Emu!
Emulatory
- Altirra - emuluje 65C816 z zegarem do 21,28 MHz (NTSC 21,48 MHz) i do 16 MB pamięci liniowej.
Inne
Zobacz też
- 65C816 Microprocessor Data Sheet (po angielsku)
- 6502/65C02/65C816 Programming Manual (po angielsku)
- Programming notes for 65C816 by John Harris (po angielsku)
- artykuł KMK zamieszczony w "ENERGY" #1