o pamięci w MSXach

Zagłębienie w temacik pamięci w MSXach, w szczególności MSX2 – w ramach kontynuacji tematu poruszonego przy okazji “uniwersalnego POKE”.

podział pamięci RAM w MSXach

Układ, który zarządza m.in. pamięcią w MSXach zwany jest PPI / Programmable Peripheral Interface / 8255. PPI kontroluje wiele rzeczy w komputerze MSX, począwszy od wyboru slotu pamięci, poprzez obsługę magnetofonu oraz klawiatury.

W ujęciu tematu pamięci interesuje nas jego rejestr A czyli znajdujący się pod adresem

#A8 PPI-register A, Primary slot select register. 

czyli jego odczytu możemy dokonać w BASICu przez

PRINT PEEK(hA8)

pokazuje nam układ slotów pamięci podstawowej. W moim przypadku (Philips NMS8280) jest to wartość 243 czyli binarnie 11110011.

64k pamięci głównej MSX jest podzielone na cztery bloki po 16k, zwane stronami/slotami. Rejestr kontroluje, które gniazdo podstawowe będzie mapowane na każdą stronę pamięci.

BityZnaczenie
0-1Slot dla strony 0 (#0000-#3FFF)
2-3Slot dla strony 1 (#4000-#7FFF)
4-5Slot dla strony 2 (#8000-#BFFF)
6-7Slot dla strony 3 (#C000-#FFFF)

Rejestr ten może być zapisywany i odczytywany. Ponadto każdy podstawowy slot może i często będzie rozszerzany do czterech subslotów. Rejestr pamięci rozszerzonej czyli wyboru podslotu można znaleźć pod adresem pamięci #FFFF, a znaczenie bitów tego rejestru to:

BityZnaczenie
0-1Subslot dla strony 0 (#0000-#3FFF)
2-3Subslot dla strony 1 (#4000-#7FFF)
4-5Subslot dla strony 2 (#8000-#BFFF)
6-7Subslot dla strony 3 (#C000-#FFFF)

Kiedy ten rejestr jest odczytywany, zwraca poprzednio zapisanej wartości.

Rejestr subslotu ma wpływ tylko na slot podstawowy wybrane na stronie 3 (w którym znajduje się adres #FFFF). To sprawia, że wybranie innej podrzędnej niż np. strona 1 jest trochę mniej niż trywialne, gdy strona 1 nie ma tego samego miejsca podstawowego co strona 3. Obejmuje to przełączenie miejsca na stronie 1 na stronę 3, wybranie żądanej sekcji pomocniczej i przełączenie z powrotem oryginalnej sekcji na stronę 3. Wszystko to musi być wykonywane z wyłączonymi przerwaniami i zawierać adres spoza zakresu # C000- # FFFF. Nie można też zapomnieć o… stosie (ale to już historia dla programujących w assemblerze).

ENASLT

Tak naprawdę mamy w BIOSie MSXa procedurę ENASLT. Jej wywołanie pod adresem #0024 polega na wcześniejszym załadowaniu do A (akumulator) ID/numeru slotu, a do rejestru H do bitów 6-7 numeru strony (czyli wartości 00-11)… no i wywołaniu/skoku do samej procedury.

RDSLT

Skoro już jesteśmy w BIOSie to warto sobie zapamiętać funkcję RDSLT pod adresem #000C.

Funkcja ta pozwala odczytać wartość adresu w innym slocie.
Na wejściu ładujemy do A (akumulator) wartość z odpowiedniu ustawionymi bitami wg wzoru:

ExxxSSPP Slot-ID
│   ││└┴─ Primary slot number (00-11)
│   └┴─── Secondary slot number (00-11)
└──────── Expanded slot (0 = no, 1 = yes)

oraz do rejestru HL adres jaki chcemy odczytać.

Na wyjściu z procedury dostaniemy w A (akumulator) wartość z odczytanego adresu. Co ważne – procedura ta “rusza” rejestry AF, C, DE. Warto też pamiętać, że procedura ta sama wyłącza przerwania, ale nie włącza ich z powrotem!