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.
Bity | Znaczenie |
---|---|
0-1 | Slot dla strony 0 (#0000-#3FFF) |
2-3 | Slot dla strony 1 (#4000-#7FFF) |
4-5 | Slot dla strony 2 (#8000-#BFFF) |
6-7 | Slot 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:
Bity | Znaczenie |
---|---|
0-1 | Subslot dla strony 0 (#0000-#3FFF) |
2-3 | Subslot dla strony 1 (#4000-#7FFF) |
4-5 | Subslot dla strony 2 (#8000-#BFFF) |
6-7 | Subslot 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!