De MSX turbo R uitgediept

Last updated on: August 20, 1998

Dit is het eerste deel van een reeks artikelen over de MSX turbo R.

De MSX turbo R is de laatste generatie MSX computers uit Japan. Er zijn tot nu toe twee verschillende modellen op de markt gekomen, beiden van Panasonic. Deze dragen het type nummer A1ST en A1GT respectievelijk en zullen verder alleen worden aangeduid met ST en GT voor zover het onderscheid tussen deze machines relevant is.

De minimale hardware
In de MSX turbo R zitten twee micro processors, een Z80 en een R800. Deze laatste is een Z80 compatibel micro processor met een aantal extra instructies. Verder zit er in de MSX turbo R een zogenaamde buscontroller, de S1990, die de Z80 en de R800, met daaraan het interne RAM geheugen, verbindt met de rest van de computer. In deze S1990 zit ook nog een PCM controller om geluids samples mee af te spelen en op te nemen. Om de machine helemaal compleet te maken zitten er standaard ook nog een FM-PAC, een 2+ video chip, een MSX DOS 2 en minimaal 256 kB werkgeheugen in. En voor de Japans freaks is de turbo R ook nog standaard voorzien van de JIS 1 en JIS 2 kanji ROM's, dit zijn ROM's met de Japanse karakterset, en heeft Panasonic de modellen ook nog voorzien van een hoeveelheid ingebouwde software. Deze laatste software behoort echter niet tot de MSX turbo R standaard en zal in deze serie buiten beschouwing worden gelaten. Die software maakt ook nog gebruik van een 16 kB groot SRAM geheugen dat aangesloten is op een batterij zodat de inhoud niet verloren gaat als de computer uit staat. Dit SRAM geheugen wordt tevens door de ingebouwde kanji verwerker gebruikt om zelf gedefinieerde kanji combinaties in op te slaan.

MSX standaard afgezwakt
Bij de definitie van de MSX turbo R is ASCII corporation zo vrij geweest om de MSX standaard enigszins af te zwakken. Men heeft toen besloten dat vanaf de MSX turbo R de cassette poort geen deel meer uit maakt van de MSX standaard. Verder heeft men ook de MSX AUDIO uit de standaard verwijderd. Dit is waarschijnlijk gedaan omdat bij het aansturen van de AUDIO processor even gewacht moet worden tussen de data die gestuurd worden. Aangezien de R800 echter veel sneller is dan de Z80, zal de R800 niet lang genoeg wachten en gaat de volledige aansturing van de AUDIO processor in zo'n geval verkeerd. Dit had men kunnen oplossen door de ROM's van de AUDIO BASIC hiervoor aan te passen zodat ook in R800 mode lang genoeg gewacht wordt. Dit heeft men echter waarschijnlijk niet meer gedaan omdat de AUDIO cartridge toch al jaren geleden uit produktie is genomen. Ondanks het feit dat de MSX AUDIO op de MSX turbo R niet meer tot de standaard behoort, functioneren programma's die rechtstreeks met de AUDIO processor communiceren toch nog goed op de MSX turbo R. Ze moeten dan wel onder Z80 mode werken of ze moeten speciaal zijn aangepast voor de R800 omdat ze anders de AUDIO processor te snel aansturen.

MIDI toegevoegd
Behalve de verplichte minimale hardware mag een MSX turbo R ook nog worden voorzien van optionele hardware. Hierbij heeft ASCII corporation een standaard gedefinieerd voor het MIDI gebeuren. Deze standaard heet MSX MIDI en is alleen gedefinieerd vanaf de MSX turbo R en hoger. Dit omdat de Z80 te traag is voor een echt goede aansturing van MIDI apparatuur op de achtergrond. De snelheid van de R800 is hier echt voor nodig. Het aansturen van de MIDI vanuit BASIC is in principe heel eenvoudig. Eerst kan de MIDI BASIC worden geinitialiseerd met het commando CALL MUSIC en daarna kunnen de muziekdata worden afgespeeld met PLAY #1,M$ waarbij in M$ de muziekdata staan. Dit werkt dus bijna hetzelfde als de aansturing van de FM-PAC vanuit BASIC. De MIDI BASIC biedt nog meer mogelijkheden, maar het voert te ver om die in het kader van dit artikel allemaal te bespreken.

Verschillen tussen de ST en de GT
De GT heeft een aantal extra's ten opzichte van de ST. Ten eerste zit er in de GT 512 kB werkgeheugen terwijl er in de ST slechts 256 kB werkgeheugen zit. Verder heeft de GT de MIDI uitbreidingen ingebouwd en heeft de GT een ingebouwde ROM disk met daarop MSX DOS 2 en MSX VIEW. Dit laatste is een Japanse grafische shell voor MSX DOS 2 waarvan tegenwoordig ook een Engelse vertaling te koop is bij MSX club West Friesland. Dankzij de ROM disk is het op de GT mogelijk om naar MSX DOS te gaan zonder dat er een disk met MSX DOS in de drive zit; MSX DOS wordt gewoon geboot vanaf de ROM disk. Als laatste extra zit in de GT ook nog een SRAM disk van 16 kB. Dit is een kleine RAM disk waarvan de informatie wordt vastgehouden met behulp van een batterij; zelfs als de computer uitstaat blijft de informatie behouden. Dit is dus nog eens extra geheugen bovenop de 16 kB SRAM die door de specifieke Panasonic software en door de kanji verwerker wordt gebruikt.

ROM en DRAM mode
In de MSX turbo R zitten twee soorten hoofd geheugen, het interne RAM geheugen van 256 kB of 512 kB en de ROM's met daarin de BASIC interpreter, DISK BASIC versie 1 en 2, MSX MUSIC BASIC en nog vele extra's. Het interne RAM geheugen is gemaakt van zogenaamde DRAM chips. Nu is het zo dat DRAM geheugens sneller aangesproken kunnen worden dan ROM geheugens. De ROM geheugens zijn zelfs zo traag dat ze de R800 niet kunnen bijbenen met als gevolg dat deze eventjes moet wachten op iedere instructie die uit het ROM geheugen moet komen.

Als de MSX computer onder BASIC werkt, moeten alle instructies die de processor uitvoert uit de BASIC ROM komen. Om er nu voor te zorgen dat de R800 hierdoor niet teveel wordt afgeremd onder BASIC is er gebruik gemaakt van een heel slimme truc. De opstart routine van de turbo R kopieert de hele BASIC ROM naar de vier hoogste blokken van het interne RAM geheugen en daarna wordt omgeschakeld naar de zogenaamde DRAM mode. In deze DRAM mode worden die vier hoogste geheugen blokken weggeschakeld uit het RAM geheugen en ingeschakeld op de positie waar normaal het ROM geheugen te vinden is. Hierdoor worden alle instructies van de BASIC interpreter in werkelijkheid uit snel DRAM geheugen gehaald en loopt de hele BASIC interpreter sneller omdat de R800 dan minder op het geheugen hoeft te wachten.

Nog te langzaam
Helaas is zelfs dit DRAM geheugen nog te langzaam voor de R800. Bij het aansturen van DRAM geheugen moet het adres in twee stappen worden ingesteld. Eerst moet het zogenaamde rij adres worden ingesteld en daarna het zogenaamde kolom adres. Dit vraagt twee klokpulsen. Aangezien de R800 de instructie binnen een klokpuls uit het geheugen wil krijgen moet er nu nog steeds worden gewacht. Om dit probleem te omzeilen heeft men nog een truc toegevoegd; de R800 houdt zelf bij of twee opeenvolgende instructies uit eenzelfde rij van het geheugen komen. Zoja, dan hoeft alleen het kolom adres aangepast te worden, wat slechts een klokpuls kost, en anders wordt ook het rij adres weer ingesteld.

Een zo'n rij in het DRAM is 256 bytes groot, wat inhoudt dat alleen een routine die binnen een blok van 256 bytes past op volle snelheid uitgevoerd kan worden. Hier is echter nog een grote maar aan verbonden: de R800 controleert alleen bij het ophalen van instructies of het rij adres ongewijzigd is gebleven. Zodra een variabele wordt opgehaald (bijv. middels ld hl,(nn)) of een stack instructie wordt uitgevoerd (push, pop, call en ret), neemt de R800 altijd aan dat het rij adres is veranderd en stelt dan ook zowel het rij adres als het kolom adres in. Het heeft dus geen nut om, voor extra snelheid, de stack en alle variabelen binnen hetzelfde 256 bytes grote blok te houden als de instructies. De R800 let hier helaas toch niet op.

Dit hele probleem met dat apart instellen van het rij en kolom adres had waarschijnlijk omzeild kunnen worden als er gebruik was gemaakt van snellere DRAM's en een iets andere geheugen aanstuur schakeling. Dan zou de R800 nooit op het geheugen hoeven te wachten en zou de turbo R ongeveer acht maal zo snel zijn geweest als de MSX 2(+) in plaats van slechts 5 maal zo snel.

De VDP aansturing
In de MSX turbo R zit nog een chip die te langzaam is om de R800 bij te benen; de video chip, kortweg de VDP. Ook bij het aanspreken van de VDP moet er soms worden gewacht; als er twee keer achter elkaar data naar de VDP worden gestuurd, moet daar een minimale wachttijd van 2 tot 8 micro seconden tussen zitten. Hoelang er precies gewacht moet worden is afhankelijk van de omstandigheden, maar in de praktijk is dit meestal hoogstens 3 micro seconden. Zodra je te kort wacht bij het aanspreken van de VDP zal de VDP data gaan missen en die data dan ook niet verwerken.

Nu is deze wachttijd zo kort dat programma's die op de Z80 werken hier in de praktijk niets van merken. Als je bijvoorbeeld een lus maakt waarin data van het RAM naar het video geheugen gekopieerd worden, zal het doorlopen van die lus al iets langer duren dan de wachttijd die nodig is voor de VDP aansturing. Daarom hebben de meeste MSX programma's geen wachtlussen of iets dergelijks om op de VDP te wachten. Zodra je echter zo'n programma op de R800 gaat uitvoeren zal er een probleem optreden; de R800 voert die lus veel sneller uit waardoor er tussen twee opeenvolgende lusdoorgangen niet meer lang genoeg gewacht wordt en de hele VDP aansturing de soep in loopt. Om dit probleem op te lossen controleert de S1990 continu wat de R800 aan het doen is. Zodra de R800 de VDP vaker achter elkaar aanstuurt, zal de S1990 een zogenaamd wait signaal naar de R800 sturen waardoor deze gaat wachten totdat dat wait signaal is afgelopen. De S1990 is zo ontworpen dat de aansturing van de VDP in alle gevallen goed zal gaan en laat daarom de R800 altijd 8 micro seconden wachten tussen twee VDP aansturingen. Dit is een gigantisch lange wachttijd, het komt voor de R800 overeen met 57 klokpulsen!

Gelukkig kan deze wachttijd soms, door slim te programmeren, benut worden. De S1990 start de teller waarmee op de wachttijd gecontroleerd wordt namelijk zodra een waarde naar de VDP wordt gestuurd, maar controleert of de wachttijd al verstreken is pas op het moment dat de R800 weer opnieuw de VDP aanspreekt. Als het programma dus slechts een keer de VDP aanstuurt en daarna wat berekeningen gaat doen voordat weer de VDP aangestuurd wordt, zal er korter, of zelfs helemaal niet, gewacht hoeven te worden. Een voorbeeld dat hiervan gebruik maakt wordt geillustreerd in setreg. De routines setreg1 en setreg2 stellen beiden een VDP register in en passen de bijhorende variabele in het systeem gebied aan. In de eerste routine is geen gebruik gemaakt van bovenstaande informatie; die routine past eerst het VDP register aan en slaat daarna pas de waarde op in het systeem gebied. De tweede routine doet het echter iets anders; eerst wordt de waarde naar de VDP gestuurd, dan wordt het systeemgebied aangepast en daarna wordt pas het register nummer naar de VDP gestuurd. In die tweede routine wordt dus de waarde in het geheugen opgeslagen op het moment dat in de eerste routine op de VDP wordt gewacht.

Volgende afleveringen
In dit artikel zijn nog lang niet alle aspecten van de MSX turbo R aan bod gekomen. Er is bijvoorbeeld nog geen aandacht geschonken aan de extra in/out poorten van de MSX turbo R, het rechtstreeks aansturen van de PCM controller voor het opnemen en afspelen van samples, het programmeren van de MIDI controller die in de GT zit en de geheugen indeling bij het opstarten onder DOS 1, DOS 2 en bij het gebruik van externe geheugen uitbreidingen. Ook is nog niks gezegd over de precieze snelheid van de R800, waar toch ook nog wat verwarring over bestaat. Deze onderwerpen, en alles wat ik er nog bij weet te verzinnen, zullen in volgende afleveringen aan bod komen. Mocht iemand nog vragen hebben over bepaalde onderwerpen van de MSX turbo R, schroom dan niet om ze aan mij door te spelen zodat ook die onderwerpen in deze serie aan bod kunnen komen.