Powoli uruchamiam obecnie CP/M na komputerku własnej konstrukcji. A tak właściwie na kilku komputerkach, bo na przestrzeni kilku ostatnich lat powstało kilka wersji hardware'u:
- Konstrukcja oparta o polski mikroprocesor MCY7880, sklecona na płytce prototypowej, z połączeniami wykonanymi kynarem. Ta wersja jako jedyna posiada układ graficzny (TMS9918).
- Nowsza wersja powyższego, już zbudowana na dwóch wytrawianych płytkach. Na razie nie ma jeszcze trzeciej płytki, która ma zawierać układ graficzny.
- Nieco uproszczona wersja na 8085.
Wszystkie wersje posiadają podobna architekturę, ale jest też kilka drobnych różnic. Identyczna jest organizacja pamięci, ale pojawiają się różnice w mapowaniu urządzeń w przestrzeni I/O. Z tego powodu niektóre komponenty oprogramowania trzeba budować osobno dla każdej rewizji.
Eksperymenty zaczynałem od TinyBasica, jednak potem przerzuciłem się na CP/M. Każdy komputerek posiada gniazdo karty CF, z którego zczytywany jest obraz systemu, zapisywany do pamięci RAM.
W chwili obecnej jestem na etapie pisania własnego BIOS-a. Sporą część udało mi się już napisać - działa konsola. jestem w stanie czytać zawartość partycji systemowej i uruchamiać (niektóre) programy. Nie działa jeszcze m.in. obsługa przełączania się na inne "dyski" (a właściwie partycje na tej samej karcie) oraz zapisywania danych na dysku.
Zaczynając pracę nad projektem przyjąłem następujące założenia co do organizacji pamięci:
- 0x0000 - 0x7FFF - główna pamięć RAM (32kB)
- 0x8000 - 0xBFFF - dodatkowa pamięć RAM, dostępna w postaci dwóch przełączanych banków po 16kB
- 0xC000 - 0xFFFF - pamięć EPROM
Takie rozwiązanie potem stosowałem w kolejnych wersjach komputerka. Nie mam tu żadnego ROM shadowingu, więc EPROM jest cały czas dostępny w przestrzeni adresowej. Z jednej strony jest to ułatwieniem (mogę wołać trzymane w nim funkcje pomocnicze z poziomu BIOS-a CP/M-u) z drugiej strony ogranicza ilość pamięci dostępnej po zbootwaniu systemu. Tak naprawdę cały system operacyjny i/lub używany program i stos muszę zmieścić w pierwzych 32kB. Pamięć podzieloną na banki wykorzystuję w tej chwili na bufory pomocnicze/cache wykorzystywany przy operacjach dyskowych.
Wyszedłem z założenia, że kiedy wychodził CP/M 2.2, pamięć była droga i sporo komputerów miało nawet mniejszy RAM.
Teraz jednak zabrałem się za próby uruchamiania gier i widzę, że sporo z nich nie chce działać.
- Collosal Cave Adventure przez chwile się ładuje, ale po chwili wywala komunikat "BAD LOAD".
- Zork1 wpada w jakąś pętlę podczas próby załadowania - dioda aktywności karty CF pulsuje, ale nic się nie dzieje.
- Sargon przy próbie załadowania zawiesza komputer - niby dioda przestaje migać, ale nic się nie dzieje.
I teraz zastanawiam się, czy problemy wynikają ze zbyt małej pamięci, czy tej przyczyna leży gdzie indziej, np. w niepełnej implementacji BIOS-u.
Czy ktoś mógłby polecić jakąś grę (najlepiej tekstówkę), która będzie działała przy takiej ilości RAM-u, a jednocześnie nie korzysta z callbacka do zapisywania danych na dysku?