
|
MSX Intern (2) Genic Clubguide, 00-00-00
MSX-INTERN(2):
D E G E H E U G E N I N D E L I N G
=======================================
De belangrijkste verbinding in de MSX is die tussen de CPU
via de geheugenbeheerder naar het geheugen. Of het nu RAM of
ROM is maakt niet uit, het systeem is hetzelfde. De
communicatie tussen de CPU en het geheugen gaat via 16
adreslijnen. Wanneer er data moet worden verzonden of
opgehaald uit het geheugen, dan geeft de CPU door middel van
deze lijnen aan welk geheugenadres hij wil
beschrijven/uitlezen. Het maximum aan geheugenplaatsen die
de CPU dus kan 'adresseren' zijn 65536 plaatsen, dat is 64
kB.
Omdat men bij het ontwerpen van de MSX al voorzag dat dit
niet voldoende zou zijn, hebben ze bij alle MSX computers
tussen de CPU en het geheugen een geheugenschakelchip gezet
die de 64 kB van de microprocessor opdeelt in 4 delen,
pagina's genaamd. Deze pagina's zijn als volgt genummerd:
Geheugenadressen
&H0000-&H3FFF - Pagina 0
&H4000-&H7FFF - Pagina 1
&H8000-&HBFFF - Pagina 2
&HC000-&HFFFF - Pagina 3
Deze controllerchip heeft 4 afdelingen (sloten genoemd)
waaraan 64 kB geheugen per slot kan worden gekoppeld. Het
door de CPU werkelijk aanspreekbare geheugen kan nu uit
pagina's bestaan uit verschillende sloten. Bv pagina 0 uit
slot 0 en pagina 1 uit slot 3. Dit wil zeggen dat als de CPU
een adres aanspreekt dat ligt in pagina 0 (zie boven), dan
sluist de controllerchip bij wijze van spreken de
adreslijnen door naar slot 0, maar wanneer de CPU een adres
in pagina 1 probeert te lezen/schrijven dan worden zijn
adreslijnen doorverbonden met het geheugen in slot 1. Dit
geheel geeft al een maximaal geheugen van 4 x 64 kB = 256 kB
geheugen.
Nu ontwierp men de slot indeling zo, dat elk slot van de
geheugencontroller (ook wel primair slot genoemd) in
principe ook nog kon worden onderverdeeld in 4 sub-sloten.
In de meeste MSX2's is primair slot 3 op deze manier
onderverdeeld.
In principe kan op deze manier in het totaal 64x4x4= 1
Megabyte aan geheugen worden beheerd. Dit is echter in
verkoop-modellen niet haalbaar. Want over het algemeen zijn
slot 1 en 2 cartridgesloten en heeft slot 0 geen subsloten.
Voor RAM gebruik is het nog erger. Want op pagina 0 moet de
BIOS meestal aanwezig blijven (tenzij je zo'n goede
programmeur bent dat je geen BIOS nodig hebt), op pagina 1
moet de interpreter zitten (onder Basic) en pagina 3 mag
niet zomaar worden verwisseld in verband met de systeem
variabelen, dus kunnen de RAM pagina's die in de andere
(sub-)sloten zitten niet (makkelijk) worden gebruikt. Een
rekensommetje maakt duidelijk dat er dan nog ongeveer zo'n
16+(16x1x4)= 80 kB voor RAM onder Basic overblijft. In de
MSX2 is dit probleem echter opgelost doormiddel van de
Memory Mapper (een uitzondering als de Sony F500P
daargelaten), waarover de volgende keer meer.
Voorbeeld van een geheugenopbouw van een MSX2 computer:
PHILIPS MSX2 VG8235 GEHEUGEN INDELING
SLOT0 SLOT1 SLOT2 SLOT3
3-0 3-1 3-2 3-3
Pagina 0 (ROM) C C (ROM) --- RAM ---
A A
Pagina 1 (ROM) R R --- --- RAM (ROM)
T T
Pagina 2 --- R R --- --- RAM ---
I I
Pagina 3 --- D D --- --- RAM ---
G G
E E
(Meestal staat in een van de bij aankoop bijgeleverde boek-
jes de preciese slotindeling van uw computer.)
DE SELECTERING VAN HET GEHEUGEN
Nu we weten wat sloten zijn wordt het tijd om ze zelf te
kunnen selecteren. De primaire slotselectie kan worden
gemaakt door via een poort &HA8 de gewenste combinatie naar
de geheugencontroller te sturen. (Dit is dus niet de
memorymapper !!) Deze selectie moet in de vorm van een byte
worden verstuurd. De byte die via deze poort verzonden moet
worden krijg je zo:
PRINT &B 00 00 00 00
/ \ \ \ \
/ \ \ \ Slotnummer van pagina 0
/ \ \ Slotnummer van pagina 1
Binair getal \ Slotnummer van pagina 2
Slotnummer van pagina 3
Dus de opdrachten : LD A,&B11110000
OUT (&HA8),A
zullen pagina 0 en 1 uit slot 0 en de pagina's 2 & 3 uit
slot 3 selecteren.
De secundaire slotselectie gaat niet via een poort maar via
het geheugenadres &HFFFF van het uitgebreidde slot. De byte
die daar moet worden geschreven kan op dezelfde wijze worden
verkregen.
PRINT &B 00 00 00 00
/ \ \ \ \
/ \ \ \ Sec.Slotnummer van pagina 0
/ \ \ Sec.Slotnummer van pagina 1
Binair getal \ Sec.Slotnummer van pagina 2
Sec.Slotnummer van pagina 3
Het uitlezen van de secundaire slotindeling geeft echter wat
problemen. Het getal dat door PRINT PEEK(&HFFFF) verkregen
wordt, moet namelijk eerst ge‹nverteerd worden.
Vb. Het uitgelezen getal &H44 = &B01010101
wordt ||||||||
&B10101010 = &HAA
Wat dus aangeeft dat in het primaire slot met subsloten alle
pagina's uit subslot 2 geselecteerd zijn.
In MT kan je dus de werkelijke subslotenindeling verkrijgen
met :
LD A,(&HFFFF) ; Haal subslotindeling op
CPL ; Inverteert de Accu
DE BIOS
Het lezen en schrijven van de primaire slotindeling kan
echter ook met de BIOS routines. (Aan de BIOS zal ik later
nog een aflevering wijden.) Dit zou problemen voorkomen als
men een MSX zou uitbrengen waarbij bijvoorbeeld de primaire
slotindeling zou worden geregeld over poortnr &HA9, waardoor
dus de programma's die de slotindeling direct via poortnr
&HA8 regelen ineens niet meer zouden werken. Dit specifieke
poortnr is echter al zo 'ingeburgerd' dat een MSX-fabrikant
zich eerst twee keer van een flatgebouw zou storten alvorens
dit poortnr te veranderen.
Dit voor zover deze keer. De volgende keer zal ik zoals
gezegd de volgende stap in het geheugenbeheer nader
toelichten, De MemoryMapper dus.
M.Spoor
|