Jest to trochę inspirowane wyzwaniem Intel 8086, które również tutaj jest, ale myślałem, że wyzwanie 6502 również będzie interesujące.
Wyzwanie
Pomyślałem, że fajnie byłoby zobaczyć wyniki. Ten jest oczywiście w kierunku bardziej zaawansowanej strony spektrum. Wyzwanie polega na napisaniu własnego emulatora procesora 6502. Obejmuje to oczywiście zrozumienie zestawu instrukcji i formatu kodowania. Zasoby są powiązane na dole tego. 6502 jest jednym z najłatwiejszych do emulacji procesorów w świecie rzeczywistym. Na potrzeby tego wyzwania nie musisz martwić się o czas cyklu, jeśli nie chcesz - ale to zawsze plus!
NIE KOPIUJ KODU INNEGO! Oczywiście możesz zerknąć na inne emulatory, które pomogą Ci zrozumieć, ale nie kopiuj i wklejaj! :)
Gdy twój kod zadziała, możesz zawsze zrobić coś więcej, jeśli chcesz i przekształcić go w emulator Apple II lub NES, C64, VIC-20 lub dowolny inny miliard starych systemów opartych na 6502 z dawnych czasów.
Testowanie emulatora
Skompilowałem zestaw testowy 6502, do którego znalazłem kod źródłowy tutaj: http://code.google.com/p/hmc-6502/source/browse/trunk/emu/testvectors/AllSuiteA.asm
Moja skompilowana wersja można pobrać tutaj: http://rubbermallet.org/AllSuiteA.zip
Załaduj 48 KB pliku binarnego do pamięci twojego emulatora za 4000 USD, co pozostawia 16 KB pamięci RAM do odczytu i zapisu poniżej. Po zakończeniu testu wartość pod adresem $ 0210 powinna wynosić $ FF, jeśli procesor przejdzie pomyślnie. Będziesz wiedział, że test jest zakończony, gdy licznik programu (PC) osiągnie adres 45C0 $.
Inne testy są również dostępne tutaj: http://visual6502.org/wiki/index.php?title=6502TestPrograms
Robienie z tym czegoś bardziej interaktywnego
Gdy twój procesor zacznie działać, prawdopodobnie będziesz chciał zrobić coś więcej zabawy niż gapić się na wynik testu! Skompilowałem obraz ROM Enhanced BASIC dla 6502. Ma on 16 KB, więc powinieneś załadować go do C000 $ emulowanej przestrzeni pamięci, zresetować wirtualną 6502 i rozpocząć wykonywanie.
Pobierz ZIP, który zawiera ehbasic.bin: http://rubbermallet.org/ehbasic.zip
Sposób, w jaki EhBASIC obsługuje wejścia / wyjścia, jest bardzo prosty. Kiedy chce napisać znak do konsoli, zapisuje bajt w miejscu pamięci $ F001. Tak więc, gdy twój emulator zobaczy, że 6502 próbuje zapisać w tej lokalizacji, po prostu wydrukuj tę wartość znaku na konsoli za pomocą printf („% c”, wartość); lub jakkolwiek chcesz. (To wyzwanie nie ogranicza się oczywiście do C)
Kiedy odpytuje o znak wprowadzany z konsoli, jest bardzo podobny. Ciągle odczytuje z lokalizacji pamięci $ F004, gdzie powinieneś mieć następną wartość znaku ASCII z klawiatury oczekującą na odczyt. Jeśli nie ma już żadnych danych wejściowych do odczytu, powinna zwrócić wartość zero.
EhBASIC odpytuje wartość w tym miejscu, dopóki nie będzie różna od zera, co oznacza, że bajt jest prawidłowym wprowadzeniem z klawiatury. Dlatego jeśli nie ma więcej danych do odczytu, emulator powinien zwrócić tam zero. EhBASIC będzie się nad nim obracał, aż będzie szukał ważnego klucza.
Jeśli nie wyczyścisz tej wartości do zera po odczytaniu ostatniej wartości klucza, spowoduje to, że powtórzy się tak, jakbyś przytrzymał klawisz, więc uważaj, aby to zrobić poprawnie!
Jeśli emulator działa poprawnie, to zobaczysz wydrukowane na konsoli po uruchomieniu obrazu ROM:
6502 EhBASIC [C]old/[W]arm ?
Naciśnij C, następnie naciśnij enter i powinieneś zobaczyć:
Memory size ?
31999 Bytes free
Enhanced BASIC 2.22
Ready
Wolne bajty mogą być różne dla ciebie, ale w moim emulatorze ograniczyłem obszar pamięci do zapisu do limitu 32 KB. Naprawdę możesz przejść aż do miejsca, w którym zaczyna się pamięć ROM, czyli znak 48 KB.
6502 Łącza do zasobów procesora
Oto niektóre zasoby, które powinny dać ci wystarczającą ilość informacji do pracy:
http://www.obelisk.demon.co.uk/6502/instructions.html
http://www.e-tradition.net/bytes/6502/6502_instruction_set.html
http://www.llx.com/~nparker/a2/opcodes.html <- ten zawiera kilka bardzo interesujących informacji
http://en.wikipedia.org/wiki/MOS_Technology_6502
Jeśli masz pytania lub potrzebujesz więcej informacji technicznych, możesz mnie zapytać. Istnieje również ogromne bogactwo innych informacji 6502 w Internecie. Google to twój przyjaciel!
źródło
Odpowiedzi:
Myślałem, że pójdę naprzód i opublikuję własną implementację. ZUPEŁNIE nie jest golfem, ale jest to pełna implementacja.
źródło
Emulator MOS 6502 w Haskell. Dodatki zawarte:
To nieco golfowa wersja pełnej implementacji (z większą liczbą funkcji), którą zrobiłem dla tego wyzwania, które opublikuję później. Mimo golfa kod jest wciąż prosty. Jedyną znaną brakującą funkcją jest tryb BCD (nadchodzi ...)
Uruchamia kod ehBASIC:
I kod, w sumie poniżej 300 linii:
źródło
Dla wszystkich zainteresowanych myślałem, że podzielę się moją implementacją 6502 w C #. Podobnie jak w przypadku innych postów tutaj, jest on całkowicie pozbawiony golfa, ale jest cechą pełną implementacji.
Rozpocząłem ten projekt od stworzenia arkusza kalkulacyjnego instrukcji, kiedy po raz pierwszy poznałem procesor. Zdałem sobie sprawę, że mogę użyć tego arkusza kalkulacyjnego, aby zaoszczędzić trochę pisania. Przekształciłem to w tabelę plików tekstowych, którą ładuje emulator, aby policzyć cykle i ułatwić wyjście danych z demontażu.
Cały projekt jest dostępny na Github https://github.com/amensch/e6502
źródło