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 |