MSX turbo R - I/O Poorten, geheugenindeling en Z80 DRAM mode

Last updated on: August 23, 1998

Deze keer zal ik diverse onderwerpen van de MX turbo R behandelen, zoals de in/out poorten en de geheugen indeling onder MSX DOS 1 en MSX DOS 2.

De I/O poorten
In onderstaande tabel staat een overzicht van de I/O poorten van de MSX turbo R. Helaas is dit overzicht niet volledig. De enige persoon die ik ken met een volledig officieel overzicht van de MSX turbo R I/O poorten zit momenteel in Japan. De informatie in deze tabel heb ik dan ook gedeeltelijk uit technische documentatie van de MSX 1 en de MSX 2 gehaald en een ander deel van de informatie heb ik experimenteel achterhaald en door de BIOS van de MSX turbo R te bekijken.
Addr Type Omschrijving MSX Versie
1 2 2+ tR
00h-3Fh . Ongedefinieerd . . . .
40h-4Fh . Switched I/O ports - + + +
50h-7Dh . Gereserveerd . . . .
7Ch-7Dh . MSX Music - - + +
7Eh-7Fh . MSX2 key cartridge - + ? ?
80h-83h 
80h 
81h 
82h 
82h 
83h
R/W 
R/W 


 
RS232C-support: 8251 comm. interf 
8251 Data port 
8251 Command/status port 
Status sense port 
Interrupt mask register 
Reserved




+




+




+




+
84h-87h 
84h 
85h 
86h 
87h
R/W 
R/W 
R/W 
W
RS232C-support: 8253 prog. timer 
Counter 0 
8253 Counter 1 
8253 Counter 2 
Mode register



+



+



+



+
88h-8Bh . V9938 VDP voor MSX1 adaptor + + - -
8Ch-8Dh . MSX Modem, werkt mbc TELECOM BIOS - + ? ?
8Eh-8Fh . Gereserveerd . . . .
90h-91h 
90h 
90h 
91h


W
Printer interface 
bit 1 = printer status 
bit 0 = strobe signaal 
8 bits data


+


+


+


+
92h-97h . Gereserveerd . . . .
98h-9Bh . VDP (TMS 9918A, V9938 of V9958) + + + +
9Ch-9Fh . Gereserveerd . . . .
A0-A3h 
A0h 
A1h 
A2h
R/W 

R
PSG (AY-3-8910) 
Adres register 
Data naar register schrijven 
Data uit register lezen


+


+


+


+
A4h-A5h 
A4h 
A4h 
A5h


R/W
PCM controller 
2 bits teller 
8 bits PCM waarde 
Controle bits/Comparator output


-


-


-


+
A6H . Gereserveerd . . . .
A7h 
A7h 
A7h

W
Pause en R800 info 
Pause flip/flop 
R800 lead en pause led

-

-

-

+
A8h-ABh 
A8h 
A9h 
AAh 
ABh
R/W 
R/W 
R/W 
R/W
PPI interface (8255) 
Poort A lezen en schrijven 
Poort B lezen en schrijven 
Poort C lezen en schrijven 
Mode setting register



+



+



+



+
ACh-AFh . MSX-Engine - + + +
B0h-B3h . Extern geheugen (Sony) + + + ?
B4h-B5h 
B4h 
B5h

R/W
klok chip (RP-5C01) 
Adres register 
Data poort

+

+

+

+
B6h-B7h . Gereserveerd . . . .
B8h-BBh . Lichtpen interface (Sanyo) + + + ?
BCh-BFh . VHD interface (JVC, via een 8255) - + + ?
C0h-C1h 
C0h 
C0h 
C1h


W
MSX Audio (Y8950) 
Status register 
Adres register 
Data poort


-


+


+


-
C2h-C3h . 2de MSX Audio, optioneel - + + -
C4h-C7h . Gereserveerd . . . .
C8h-CFh . MSX Interface - + + +
D0h-D7h . Floppie disk controller + + + +
D8h-D9h . Kanji ROM, JIS 1 + + + +
DAh-DBh . Kanji ROM, JIS 2 - - ? +
DCh-DDh . 24 punts kanji ROM - + ? ?
DEh-DFh . Gereserveerd . . . .
E0h-E2h . Externde MIDI interface (micro pack) - - - +
E3h . Gereserveerd . . . .
E4H-E7h 
E4H 
E5h 
E6h 
E6h 
E7h
R/W 
R/W 


R
S1990 controller functies 
Adres register 
Data poort 
Reset 16 bits teller 
16 bits teller LSB 
16 bits teller MSB




-




-




-




+
E8h-EFh . Interne MIDI interface (GT) - - - +
F0h-F3h . Gereserveerd . . . .
F4h R/W Systeem flags - - + +
F5h W Systeem controle - + + +
F6h ? Gereserveerd voor color bus I/O - + + ?
F7h W Audio/video controlle + + + ?
F8h W Opt. A/V controlle voor PAL versie - + ? ?
F9h-FBh . Gereserveerd . . . .
FCh-FFh 
FCh 
FDh 
FEh 
FFh



W
Memory mapper 
Mapper blok op pagina 0 
Mapper blok op pagina 1 
Mapper blok op pagina 2 
Mapper blok op pagina 3



-



+



+



+
Een aantal van de I/O poorten in de tabel is ook al aanwezig op de MSX 1, de MSX 2 en de MSX 2+. Aan die I/O poorten zal ik in deze reeks verder geen aandacht besteden. De overige poorten zijn echter specifiek voor de MSX turbo R en zullen dan ook allemaal aan bod komen.
De I/O poorten van de PCM controler -op adres 0A4h en 0A5h- en de 16 bits teller op adres 0E6h en 0E7h zijn in het artikel over de PCM controler in MCCM 74 al aan bod gekomen.
De I/O poorten van de MIDI controler -op adres 0E0h-0E2h en adres 0E8h-0EFh- zullen in een apart artikel behandeld worden. Dit kan nog een tijdje duren want van die poorten moet ik zelf ook nog het een en ander uitzoeken.
De overige MSX turbo R I/O poorten komen in dit artikel aan bod.

Merk overigens nog het volgende op over de I/O poorten:

  1. Op de MSX 1 zijn de I/O adressen voorkeur adressen. Een fabrikant is niet verplicht om ze ook te gebruiken. In de praktijk hebben echter alle fabrikanten deze officiele adressen gebruikt.
  2. Bij de MSX 2 zijn de meeste I/O adressen officieel verplicht geworden. Alleen de VDP kan nog op 2 verschillende gebieden zitten. Dit is een gevolg van het bestaan van een MSX 2 adapter voor de MSX 1.
  3. Vanaf de MSX 2+ ligt ook het VDP adres vast.
  4. Als de disk controler op I/O adres D0h-D7h wordt gezet, dient er extra hardware aanwezig te zijn om de disk controler af te koppelen. Dit is nodig om ervoor te zorgen dat er meerdere disk interfaces in de MSX kunnen zitten. De disk controler mag alleen aan de poorten zijn gekoppeld op het moment dat de disk routines de drive aansturen. De meeste Japanse en Europese MSX modellen hebben een memory-mapped disk controller en gebruiken deze poorten dus helemaal niet. In Brazilie zijn er daarentegen diverse disk interfaces die de I/O poorten gebruiken.
I/O poort 0A7H uitlezen
Op bit 0 van deze poort zit de zogenaamde pause flip flop aangesloten. De waarde van die flip flop wordt geinverteerd bij het indrukken van de pause toets. De pause flip flop is niet alleen verbonden met bit 0 van I/O poort 0A7h maar tevens met de wait aansluiting van de Z80. Hierdoor is de werking van de pause toets anders in Z80 mode dan in R800 mode. In Z80 mode werkt de pause toets echt hardware matig en is dan dus niet te omzeilen. In R800 mode werkt de pause toets echter software matig. De interrupt routine in de ROM BIOS controleert of bit 0 van deze I/O poort geset is. Zoja, dan wordt het pause lampje aangezet en blijft de routine wachten tot het bit weer gereset is. De pause toets valt in R800 mode dan ook op twee manieren te omzeilen.
  1. Schrijf een eigen interrupt routine die niet op het pause bit controleert of iets speciaals doet als het pause bit geset is. Dit laatste heb ik zelf onder andere in de MOD player gedaan om de pause tekst over het scherm te laten rondspringen.
  2. Buig de interrupt hook op adres 0FD9Ah om zodat de pause toets controle in de ROM BIOS overgeslagen wordt.
Naar I/O poort 0A7h schrijven
Op bit 7 en bit 0 van deze poort zitten respectievelijk het R800 lampje en het pause lampje. De ROM BIOS houdt op adres 0FCB1h een kopie bij van de waarde die naar deze poort is geschreven. Dit is nodig omdat de toestand van de lampjes niet is uit te lezen. Een lampje is aan als de waarde een naar het betreffende bit is geschreven en het lampje is uit als de waarde nul is geschreven.

I/O poort 0E4h en 0E5h
Deze poorten hebben te maken met het functioneren van de zogenaamde bus controler, de S1990. De S1990 heeft een aantal registers die hiermee ingesteld en uitgelezen kunnen worden.
De I/O poort op adres 0E4h is het adres register; de waarde in deze poort bepaald welk S1990 register ingesteld of uitgelezen wordt.
De I/O poort op adres 0E5h is de data poort; met deze poort kan het geselecteerde register ingesteld of uitgelezen worden.
Momenteel ken ik alleen de functies van register 6, 14 en 15. Register 14 en 15 kunnen alleen worden uitgelezen. De S1990 plaatst de laatste byte die naar het geheugen is geschreven in register 15 en de op een na laaste byte in register 14. Dit gebeurt voor alle instructies die naar het geheugen schrijven. Wat hier verder het nut van is weet ik ook niet maar het zal wel iets te maken hebben met het intern functioneren van de S1990.

Z80 DRAM mode
Register 6 is een stuk interresanter; dit register bepaalt welke CPU actief is en of de MSX turbo R in ROM mode danwel DRAM mode staat. De betekenis van de bits is als volgt:
 

Met behulp van dit register is het dus mogelijk om de MSX turbo R in Z80 DRAM mode te zetten; selecteer de Z80 ROM mode met de bios routine op adres 0180h en zet vervolgens de waarde 64 in register 6. Dit laatste kan onder BASIC met de instructies:
out &he4,6:out &he5,64

Wait functie uitschakelen ?
In het artikel over de MSX turbo R in MCCM 73 heb ik geschreven dat de S1990 een wait functie heeft voor de VDP toegang; de S1990 zorgt ervoor dat er minimaal 8 micro seconden tussen twee opeenvolgende VDP toegangen wordt gewacht. In de tussentijd heb ik van diverse kanten geruchten gehoord dat die wait functie uitschakelbaar is, maar jammer genoeg weet niemand erbij te vertellen hoe. Mijn eigen vermoeden is dat de wait functie mischien uitschakelbaar is door een van de bitjes in een van de S1990 registers om te zetten. Ik ben er echter tot nu toe nog niet achter gekomen welk bit in welk register hiervoor dient. Mocht ik dit ooit nog eens te weten komen, dan zal ik het zeker bekend maken.

De geheugen indeling
In de rest van dit artikel zal ik aandacht besteden aan de indeling van het RAM geheugen van de MSX turbo  R bij het gebruik van meerdere memory mappers onder MSX DOS 1 en MSX DOS 2.
Als er geen externe geheugen uitbreidingen worden gebruikt is de situatie vrij eenvoudig: alle RAM geheugen zit in slot 3,0.
Bij het gebruik van een externe memory mapper wordt het echter ingewikkelder. Programma's die onder MSX DOS 1/DISK BASIC 1 worden opgestart en de memory mapper gebruiken, kunnen dan vastlopen. Dit heeft te maken met de manier waarop het geheugen wordt ingeschakeld door de ROM BIOS en de geheugen zoek routines van DOS 1. De initialisatie van het geheugen werkt namelijk als volgt:

Veel programma's die de memory mapper rechtstreeks aanspreken nemen aan dat in alle slots dezelfde mapper actief is. Deze programma's laden vaak alle data in via pagina 2 -waar slot 3,0 actief is-, schakelen vervolgens in pagina 1 het RAM in door te kijken naar de systeem variabele op adres 0F342h -waardoor op pagina 1 de externe memory mapper wordt ingeschakeld- en springen vervolgens naar een routine in pagina 1 toe. Op dat moment zal de computer dus vastlopen omdat in de externe mapper geen zinnige data zijn geladen.

De geheugenindeling onder DOS 2
Het bovenstaande probleem treedt gelukkig niet op bij het gebruik van DOS 2. De in de MSX turbo R ingebouwde DOS 2 is namelijk speciaal voor de MSX turbo R aangepast en zal dan ook op alle vier de pagina's het interne RAM geheugen als hoofd memory mapper gebruiken. Het gebruik van DOS 2 brengt echter ook complicaties met zich mee; MSX DOS 2 gebruikt zelf de memory mapper voor interne buffers en systeem variabelen. Hierdoor schakelt DOS 2 zelf met de memory mapper. Dit is funest voor programma's die de mapper rechtstreeks aansturen omdat de geheugenindeling dan vaak anders is dan die programma's denken.
Om bovenstaand probleem op te lossen, en tevens om ervoor te zorgen dat meerdere programma's de memory mapper kunnen gebruiken zonder elkaar in de weg te zitten, heeft MSX DOS 2 een aantal ingebouwde memory mapper support functies. Het voert echter te ver om deze functies nog in dit artikel te behandelen. Hierover zal ik nog een apart artikel schrijven.