MSX turbo R - CPU Schakelen en Z80 DRAM uitgediept

Last updated on: August 27, 1998

In deze aflevering ga ik verder in op de CPU schakel routine en de Z80 DRAM mode.

Het grote voordeel van de R800 DRAM mode is dat de R800 sneller instructies kan ophalen uit het DRAM dan uit het ROM geheugen. Voor de Z80 gaat dit voordeel niet op omdat het ROM geheugen in de MSX turbo R snel genoeg is om de Z80 bij te houden. Desondanks kan het handig zijn om in de Z80 DRAM mode te werken. Dit is het geval omdat een bijkomend voordeel van de DRAM mode is dat de kopie van het ROM BIOS en de BASIC interpreter aangepast kan worden als de computer in de ROM mode staat en dat zo'n aanpassing actief wordt zodra de MSX turbo R in de DRAM mode komt te staan. Een voorbeeld van deze toepassing is het aanpassen van de land-code in de ROM BIOS zodat spellen als NEMESIS 2 in Europese mode werken in plaats van in Japanse mode. Een andere voorbeeld is het vervangen van de Japanse karakterset in de ROM kopie door een europese karakterset.

EuroTR
In de listing eurotr11.gen staat een programma dat de landcode in de ROM BIOS kopie vervangt door de Europese landcode en vervolgens de Z80 DRAM mode inschakelt. Verder past het programma de CPU schakel routine aan zodat er vanaf nu bijna altijd naar de Z80 DRAM mode wordt geschakeld in plaats van naar de Z80 ROM mode. Deze laatste aanpassing is vooral handig als er onder MSXDOS 2 gewerkt wordt. MSX DOS 2 schakelt namelijk bij iedere disk actie terug naar de Z80 mode met als gevolg dat de Z80 DRAM mode binnen de kortste tijd uitgeschakeld zou worden als de schakelroutine niet aangepast zou zijn.
Het programma kan geassembleerd worden met gen80 en de geassembleerde versie kan vanuit MSXDOS worden opgestart.

De werking
Het programma schakelt eerst de R800 ROM mode in zodat de kopie van de BIOS aanpasbaar is. De kopie van het ROM BIOS en de BASIC interpreter is te vinden in de vier hoogste blokken van de memory mapper. Aangezien alleen de BIOS kopie aangepast hoeft te worden, schakelt het programma het mapper segment met deze kopie in op pagina 1.
Vervolgens wordt in dit segment een tabel opgezocht die de CPU schakel routine gebruikt om de goede CPU in te schakelen. Indien deze tabel niet aanwezig is, wordt een foutmelding gegeven. In het andere geval wordt de tabel aangepast; alle Z80 ROM inschakel codes worden vervangen door Z80 DRAM inschakel codes. Nadat de CPU schakeltabel aangepast is, wordt de landcode vervangen en schakelt het programma de Z80 mode in. Als laatste stap schakelt het programma de Z80 DRAM mode in. Dit moet hier expliciet gebeuren omdat de MSX turbo R in de R800 ROM mode stond bij het aanroepen van de CPU schakel routine. Hierdoor werd de (niet aan te passen) routine in de echte ROM gebruikt die netjes naar de Z80 ROM mode schakelde i.p.v. naar de gewenste Z80 DRAM mode. Dit probleem treedt overigens iedere keer op als de R800 ROM mode ingeschakeld is geweest. Vanuit de R800 ROM mode ga je altijd terug naar de Z80 ROM mode. Na de bovenstaande aanpassing kan alleen naar de Z80 DRAM mode worden geschakeld vanuit de R800 DRAM mode en vanuit de Z80 DRAM mode.

Haasje over
Bovenstaand programma past de CPU schakel routine aan. Om deze aanpassing volledig te begrijpen is het van belang om te begrijpen hoe de samenwerking tussen de Z80 en de R800 precies geregeld is. De Z80 en de R800 zijn twee volledig onafhankelijke CPU's, met ieder een eigen program counter en een eigen register set. De S1990 bus-controller zorgt ervoor dat altijd slechts een van de CPU's tegelijk actief is; bit 5 van register 6 geeft aan welke CPU ingeschakeld is.
Op het moment dat de MSX turbo R net ingeschakeld of gereset is, staat bij beide CPU's de program counter op adres 0 en is de Z80 actief. De Z80 begint dan aan de reset routine. Hierbij wordt eerst naar bit 5 van in/out poort 0F4h gekeken. Dit bit is op dat moment nog nul en daarom zet de Z80 het bit op een waarna de reset routine wordt voortgezet met het rechstreeks inschakelen van de R800 ROM mode.
Zodra dit laatste gebeurt is blijft de Z80 hangen op de positie waar deze was en begint de R800 vooraan, op adres 0, met de reset routine. Ook de R800 controleert bit 5 van in/out poort 0F4h. Omdat dit bit net geset is door de Z80, zal de R800 een ander deel van de reset routine volgen; de R800 springt naar de algemene CPU schakel routine toe met de waarde nul in de accu. Door deze routine wordt vervolgens weer de Z80 ingeschakeld en zodra dit is gebeurt blijft de R800 in de CPU schakel routine hangen.
De Z80 zal nu verder gaan waar deze gebleven was, dus in de reset routine met de instructie die direct volgt op de instructie waar de R800 werd ingeschakeld. Hierna vervolgt de reset routine met diverse initialisaties en op een gegeven moment wordt de subrom ingeschakeld van waaruit het MSX turbo R opstart scherm wordt afgebeeld.
Om dit MSX turbo R scherm af te beelden moet weer de R800 ingeschakeld worden. De Z80 is niet snel genoeg om het bekende 'snel in elkaar schuif' effect af te handelen. Het wisselen van de CPU mode wordt vanaf nu altijd gedaan met de CPU schakel routine. Om naar de R800 mode te gaan, wordt deze schakel routine aangeroepen met de goede parameter in de accu. Aangezien er omgeschakeld wordt naar een andere processor met eigen registers, moeten alle registers -inclusief de stack pointer- worden doorgegeven aan die andere processor. De CPU die de routine aanroept (in dit geval de Z80) zet daartoe alle registers op de stapel en slaat de stack pointer op in het geheugen op adres 0FFFDh. Hierna wordt de goede waarde naar register 6 van de S1990 geschreven. Deze waarde wordt opgehaald uit een tabel. Direct nadat deze waarde naar de S1990 is gestuurd, wordt er van CPU omgeschakeld. In dit geval betekent dat dus dat de R800 geactiveerd wordt. De R800 was het laatst actief toen de reset routine nog maar net opgestart was en de laatst uitgevoerde instructie was het inschakelen van de Z80 vanuit de CPU schakel routine. Dit houdt dus in dat de R800 nog altijd in de CPU schakel routine is en die dan ook verder af zal gaan handelen. De eerste instructie die de R800 dan uitvoert is het ophalen van de stack pointer uit geheugen adres 0FFFDh en vervolgens gaat de R800 verder met het van de stapel halen van alle registers.
Indien nu op een gegeven moment weer wordt teruggeschakeld naar de Z80, zal de Z80 dus ook weer verder gaan vanuit de CPU schakel routine omdat de Z80 in deze routine bleef hangen op het moment dat de R800 werd ingeschakeld. Op deze manier zit er dus continue een processor vast in de CPU schakel routine en is de andere processor bezig met het uitvoeren van allemaal instructies.
Het programma EuroTR past de tabel aan waarin de CPU schakel routine opzoekt welke waarde naar register 6 van de S1990 moet worden geschreven.

Pattern
Een ander programma dat gebruik maakt van de Z80 DRAM mode, is het programma pattern van Bernard Lamers (alias Bloody Bert). Dit programma is op het diskabonnement te vinden. Met pattern kan een alternatieve karakterset worden geinitialiseerd welke CLS bestendig is, te gebruiken is op alle grafische schermen en bovendien geen enkele byte van het BASIC geheugen in beslag neemt. Pattern werkt op de MSX turbo R en op MSX computers met een externe geheugen uitbreiding van minimaal 16 kB. Zelf gebruik ik pattern bijvoorbeeld om op mijn MSX turbo R met een europese karakterset te werken.

Pattern op de MSX turbo R
Op de MSX turbo R wordt de karakterset in de kopie van de ROM BIOS gezet, over de originele japanse karakterset heen. Hierna wordt de CPU schakelroutine aangepast zodat de alternatieve karakterset ook actief blijft bij programma's die liever in Z80 mode werken.

Pattern op de niet MSX turbo R
Op de overige MSX computers wordt de karakterset in een niet-actief geheugen blok gezet. Als onder MSXDOS het interne geheugen is ingeschakeld, wordt de karakterset dus in de externe geheugenuitbreiding gezet. Is daarentegen de externe geheugenuitbreiding ingeschakeld onder MSXDOS, dan wordt de karakterset in het interne geheugen gezet. Pattern ondersteund hierbij tevens memman 2.4 en hoger zodat er ook nog samengewerkt kan worden met andere programma's die extra geheugen gebruiken. Indien memman afwezig is, zal pattern evengoed functioneren. In dat geval kan echter niet worden gegarandeerd dat er geen conflicten optreden met andere programma's die ook extra geheugen willen gebruiken.

Gebruiksaanwijzing
Pattern kan onder MSXDOS(2) worden opgestart middels:

PATTERN [d:][pad][filenaam][.ext] [/D]

Alle parameters zijn dus optioneel.
In het eerste geval, als geen enkele parameter wordt opgegeven, toont pattern een korte uitleg op het scherm.
In het tweede geval, als de parameter /d wordt opgegeven, wordt de alternatieve karakterset verwijderd. De overige parameters worden dan genegeerd.
In het derde geval gaat pattern ervan uit dat er een karakterset naam wordt aangegeven. De drive, het zoekpad en de extensie zijn dan optioneel. Indien geen extensie wordt opgegeven, neemt Pattern de extensie .CHR. Verder is het onder MSXDOS 2 ook nog mogelijk om een alternatieve karakter set directory in te stellen met behulp van de environment variabele PATTERN middels het MSXDOS 2 commando:

SET PATTERN=directorynaam

Dit laatste is vooral handig voor harddisk bezitters zodat ze niet iedere keer bij een karakterset wisseling een komplete directorie naam hoeven in te typen.

De karaktersets dienen in BASIC BSAVE formaat op de disk te staan. Dus een 7-byte grote header en dan de bitpatronen die de karakters vormen.