
|
Memman 2.4 specificaties R.Vriend/R.vd Winkel, 19-09-92
File : MM24SPEC.TXT
Datum: 19 september 1992
Door : Ries Vriend / Ramon van der Winkel - (c) MST
---------------------------------------------------
Deze tekst bevat de informatie die nodig is voor het schrijven van
MemMan 2.4 toepassingsprogramma's. Voor specifieke specificaties
omtrend het programmeren van TSR's wordt echter verwezen naar de
technische documentie die te vinden is op de `TSR-Development disk'.
Hierop staan de volledige TSR specificaties en enkele TSR ontwikkel
tools. Deze disk kan besteld worden bij het MST, zie voor meer
informatie hierover de LezersService van MSX Computer Magazine.
Inhoud
------
Wijzigingen in MemMan 2.3 ten opzichte van versie 2.2
Updates van MemMan 2.30 naar MemMan 2.31
Wijzigingen in MemMan 2.4 ten opzichte van versie 2.3
Waarom MemMan 2.4?
De principes
Appendix 1: BIOS aanroepen onder Turbo Pascal
Appendix 2: Tips en aanwijzingen voor programmeurs
MEMMAN versie 2.4 - specificaties
=================================
Wijzigingen in MemMan 2.3 ten opzichte van versie 2.2:
-----------------------------------------------------
- De functie XTsrCall (61) is toegevoegd. Deze functie werkt
identiek aan de functie TsrCall (63), het Tsr-ID wordt echter
verwacht in register IX in plaats van BC. Hierdoor komt
register BC vrij om als invoerparameter gebruikt te worden.
- Door middel van de functie Info (50) kan het adres worden
opgevraagd waarop XTsrCall rechtstreeks kan worden aangeroe-
pen.
- De funtie status (31) is verbeterd. De totale hoeveelheid
bruikbaar werkgeheugen in de computer wordt nu correct gemeld,
ook onder MSX-DOS2.
- De Alloc (10) functie herkent nu ook geheugen dat beschikbaar
komt wanneer de DOS2 RAMdisk wordt verwijderd of verkleind!
Het maakt daarbij niet meer uit of de RAMdisk wordt aangemaakt
voor- of nadat MemMan werd ge‹nstalleerd.
- De interne stack van MemMan die gebruikt wordt om functie-
aanroepen te verwerken is vergroot tot 240 bytes, in plaats
van 160. In de praktijk bleek dat de functiestack van MemMan
2.2 te krap was om geneste "tsrCalls" te verwerken.
Updates van MemMan 2.30 naar MemMan 2.31:
----------------------------------------
- Er bleek een bug te zitten in TL.COM, waardoor het inladen
van TSR's onder DOS1 niet goed ging. De fout zat in het parsen
van de command line, en was daags na de beurs bekend en
opgelost. Patches zijn gepubliceerd in MSX Computer Magazine
nummer 49 pagina 66 en MSX Club Magazine 38 pagina 56 en PTC
Print nummer 59 pagina 7.
- De tweede bug was complexer, en kwam aan het licht tijdens
experimenten met nieuwe TSR's. Hij was nog niet eerder gemeld.
Het ging om CMD TL. Dat commando voerde geen IniChk uit,
waardoor de CurSeg functie van MemMan ook nog niet goed
werkte. TSR's die CurSeg gebruikten en geheugen schakelden in
pagina 2 liepen daardoor vast. Dat was (is?) op dat moment
alleen de printerbuffer PB.TSR. Bij het laden van een TSR met
TL.COM ging het wel goed, die doet namelijk wel een IniChk.
Ook deze bug is opgelost met een patch, gepubliceerd in MSX
Computer Magazine 52 pagina 21 en MSX Club Magazine 40 pagina
89 en PTC Print nummer 59 pagina 7.
Wijzigingen in MemMan 2.4 ten opzichte van versie 2.3:
-----------------------------------------------------
- De GetTPA (33) functie is toegevoegd, zodat het nu ook onder
Disk BASIC mogelijk is de 32 kB RAM `achter' het BIOS en het
BASIC ROM te gebruiken. Veel mensen hebben hierom gevraagd!
- CMD HELP wordt nu ondersteund door de standaard TSR `MST
TsrUtils'. Met dit commando kan een kort overzicht van de
extra BASIC commando's op het scherm gezet worden. Zie voor
meer informatie over CMD HELP de tips en aanwijzingen voor
programmeurs.
- TL.COM maakt nu onder DOS 2 gebruik van het Environment Item
TL, om te achterhalen waar de TSR's staan. Harddisk bezitters
hoeven slechts een `SET TL=A:\TSRS' in hun AUTOEXEC.BAT op te
nemen en alle TSR's in de subdirectory A:\TSRS zijn ten aller
tijd bereikbaar voor TL. Het opgeven van een pad is dan niet
meer nodig.
- TV.COM laat nu ook zien in welk segment de verschillende
TSR's zitten. Hierdoor is het eenvoudig mogelijk een extra
segment vrij te maken door de TSR's die er in zitten te
verwijderen. TSR segment 0 is het MemMan segment, het geheugen
dat in dat segment nog vrij is kan niet door andere program-
ma's maar alleen door TSR's gebruikt worden.
- Er zijn twee functies toegevoegd voor het uitlezen en instel-
len van de stack pointer van MemMan's interne stack. Dat is
nodig als een programma de Expressie evaluator in het BASIC
ROM aanroept en fouten zelf wil afhandelen. Het kan dan
namelijk zijn dat de ExpEval een TSR aanroept, die zelf weer
ExpEval aanroept en er op dat moment een fout optreedt. Dan
blijft er rotzooi op de MemMan stack achter. Als na dergelijke
fouten de errorhandler van MSX BASIC gebruikt wordt is er
niets aan de hand: dan maakt MemMan zijn stack zelf schoon.
- In elk TSR segment begint op adres &h4002 de MemMan functie
afhandelings routine. MemMan aanroepen uit een TSR kan dus
voortaan eenvoudig en snel met een `CALL &h4002'
- Er wordt een nieuwe versie (1.04) van de bestandskopieerder
BK meegeleverd die geen fouten maakt als er meer dan 4 MB
geheugen beschikbaar is. In versie 1.02 liep een tellertje
over waardoor de hoeveelheid geheugen onjuist op het scherm
werd aangegeven.
- IniChk geeft in HL nu het adres van de MemMan functieafhan-
delingsroutine terug. Die hoeft dus niet apart via de Info
functie opgevraagd te worden.
Waarom MemMan 2.4?
-----------------
In feite is er na de updates van MemMan 2.30 weinig reden geweest
tot het uitbrengen van een volgende versie. De verschillen tussen
2.3 en 2.4 zijn dan ook klein. Alle bekende bugs waren al verbeterd,
en grote uitbreidingen zijn er niet. Het is dus gebleven bij de een
aantal kleine extra's.
Naast wat er nu nieuw is hadden en hebben we nog meer en grotere
plannen. Daar wordt nog steeds aan gewerkt, maar we willen niet
wachten tot die goed uitgewerkt en vooral getest zijn met het uit-
brengen van 2.4. Dat doen we met name omdat er de laatste tijd meer
en meer programmeurs tegen een ontwerpfout in MemMan opgelopen zijn:
het was namelijk onmogelijk om de 32 kB RAM achter het ROM vanuit
Disk BASIC door middel van MemMan in te schakelen. Dat is nu opge-
lost: voortaan kan al het schakelwerk netjes via MemMan gebeuren, ook
als een programma onder Disk BASIC draait en echt al het geheugen tot
zijn beschikking wil hebben.
Alle andere uitbreidingen zijn leuk en aardig, maar hadden ook kunnen
wachten. Bovendien zitten er in de verdere plannen ook wat wensen en
verlangens die in feite behoorlijk belangrijk zijn. Stuk voor stuk
vereisen die echter een flinke verbouwing van de interne structuur
van MemMan en dat kost nu eenmaal tijd.
Gebruikte terminologie
----------------------
Segment Geheugenblok van 16kB. Segmenten komen voor in Pagina
specifieke segmenten (PSEG) en Flexibele segmenten
(FSEG). De Flexibele segmenten kunnen op de pagina's 0,
1 en 2 worden aangeschakeld. De Pagina specifieke
segmenten alleen op hun eigen pagina. Er zijn drie
soorten pagina specifieke segment: PSEG0000, PSEG4000
en PSEG8000. Ze zijn op respectievelijk pagina 0,1 en 2
aanschakelbaar.
Heap Stuk geheugen in pagina 3 (ergens tussen &hC000 en
&hFFFF) waarvan MemMan toepassingsprogramma's een stuk
aan kunnen vragen en daarna vrij mogen gebruiken. De
grootte ervan kan met behulp van het configuratiepro-
gramma CFGMMAN ingesteld worden.
FastUse Zelfde als Use, maar dan het adres waarop de routine
direct aan te roepen is in pagina 3. Ook een aantal
andere routines kunnen direct aangeroepen worden, wat de
snelheid ten goede komt.
UnCrash Om te voorkomen dat segmenten aangevraagd zijn en door
een crash van een programma nooit meer vrij zouden
worden gegeven, voert de IniChk routine een unCrash
uit. Hierbij worden alle segmenten weer vrijgegeven.
Het unCrashen van een segment is te voorkomen door een
segment de Reserved status te geven. Dit kan met de
functie SetRes (11). Normaal gesproken hoeft een segment
niet de Reserved status gegeven te worden.
TPA `Transient Program Area'. Oorspronkelijk werd hiermee
onder CP/M en dus MSX DOS het stuk geheugen tussen
adres &h0100 en de eerste byte van het operating systeem
bedoeld. In dat gebied konden gebruikersprogramma's
geladen worden. In deze tekst bedoelen we met TPA de
vier segmenten (64 kB) die ingeschakeld zijn onder MSX
DOS. De bovenste twee daarvan zijn ook ingeschakeld
onder MSX BASIC.
De principes
------------
MemMan verdeelt het aanwezige geheugen in segmenten van 16 kB.
Voordat een segment gebruikt mag worden moet het worden aangevraagd.
Na gebruik dient het weer te worden vrijgegeven. Er zijn twee soorten
segmenten: de zogenaamde pagina-specifieke ofwel PSEG's en de flexib-
ele FSEG's.
PSEG's zijn segmenten die aangevraagd worden voor het gebruik op een
bepaalde pagina, bijvoorbeeld van &h4000-&h7FFF of van &h8000-&hBFFF.
Wanneer er een PSEG aangevraagd wordt zal MemMan zo mogelijk geheu-
gensegmenten toewijzen die niet in een memory-mapper zitten. FSEG's
zijn segmenten die op elke willekeurige pagina kunnen worden inge-
schakeld. Deze segmenten komen altijd uit memory mappers.
Welk soort segment er ook aangevraagd wordt, MemMan zal een 16-bits
`segmentcode' teruggeven. Deze segmentcode is weer nodig bij het
inschakelen of het weer vrijgeven van het segment. Wie alleen maar
geheugen nodig heeft in het gebied van &h8000 tot &hBFFF kan dus het
beste PSEG's aanvragen. MemMan gebruikt dan eerst zoveel mogelijk
geheugen uit de `oude' 16- en 64 Kb modules en gaat dan de mapper
gebruiken.
Met behulp van MemMan hoeft er dus nooit meer naar geheugen gezocht
te worden. Simpelweg een pagina aanvragen, gebruiken en uiteindelijk
weer vrijgeven. Zo eenvoudig is dat.
Overigens is er een pagina die zich met MemMan niet laat schakelen.
Pagina 3 bevat behalve de MemMan code zelf ook de stack (meestal) en
een grote hoeveelheid systeemvariabelen. Er zitten nogal wat haken en
ogen aan het wegschakelen van dat alles.
Functieomschrijving MemMan 2.4
------------------------------
MemMan functies kunnen worden uitgevoerd door een aanroep van de
`Extended BIOS' of EXTBIO hook, op adres &hFFCA. Het device ID van
MemMan - `M' oftewel &h4D - moet in register D worden geplaatst.
Register E dient het MemMan functienummer te bevatten. Na aanroep van
een MemMan functie kunnen alle registers gewijzigd zijn, behalve
indien het tegendeel wordt vermeld bij de functie-omschrijving.
Het is ook mogelijk MemMan direct aan te roepen, het adres waarop
dat kan gebeuren kan opgevraagd worden via de Info functie (50) en
wordt ook teruggegeven door IniChk (30) Op die manier worden de
nadelen van het aanroepen van MemMan via de hook omzeild. Zie voor
meer informatie de tips en aanwijzingen voor programmeurs.
De interruptstand blijft na een MemMan functie-aanroep in meeste
gevallen ongewijzigd. Sommige functies zoals de diverse (Fast)Use
functies schakelen de interrupts echter uit. Wanneer een MemMan
functie werd aangeroepen met de interrupts uit, zal MemMan nooit
terugkeren met de interrupts ingeschakeld.
Deze eigenschap is bijvoorbeeld van belang voor TSR programma's die
slechts een zeer kleine stack ter beschikking hebben. Zo lang de
interrupts uit staan, kunnen alle MemMan functies zonder problemen
worden uitgevoerd, mits de functie verwerkingsroutine van MemMan
rechtstreeks wordt aangeroepen. Wanneer de interrupts echter aan
staan is een grote stack vereist, omdat de interrupt-verwerkingsrou-
tine enkele tientallen bytes op de stack plaatst.
Naam: Use0
Nummer: 0
Functie: Aanschakelen van een segment op pagina 0 (adresgebied
&h0000..&h3FFF)
In: HL = Segmentcode
Uit: A = Resultaatcode (-1 = Mislukt, 0 = Gelukt)
Het inschakelen van een segment in pagina 0 is alleen
mogelijk indien het segment de MSX-standaard slot-
schakel entry points bevat.
Opm: Deze functie mag niet worden aangeroepen via de EXTBIO
hook. Deze functie mag alleen worden uitgevoerd door
een rechtstreekse aanroep van de MemMan functie afhande-
lingsroutine of de FastUse0 functie. De adressen waarop
deze routines aangeroepen kunnen worden, kunnen via de
info functie (50) worden verkregen.
Naam: Use1
Nummer: 1
Functie: Aanschakelen van een segment op pagina 1 (adresgebied
&h4000..&h7FFF)
In: HL = Segmentcode
Uit: A = Resultaatcode (-1 = Mislukt, 0 = Gelukt)
Opm: Deze functie mag niet worden aangeroepen via de EXTBIO
hook. Deze functie mag alleen worden uitgevoerd door
een rechtstreekse aanroep van de MemMan functie afhande-
lingsroutine of de FastUse1 functie. De adressen waarop
deze routines aangeroepen kunnen worden, kunnen via de
info functie (50) worden verkregen.
Naam: Use2
Nummer: 2
Functie: Aanschakelen van een segment op pagina 2 (adresgebied
&h8000..&hBFFF)
In: HL = Segmentcode
Uit: A = Resultaatcode (-1 = Mislukt, 0 = Gelukt)
Opm: Deze functie mag niet worden aangeroepen via de EXTBIO
hook. Deze functie mag alleen worden uitgevoerd door
een rechtstreekse aanroep van de MemMan functie afhande-
lingsroutine of de FastUse2 functie. De adressen waarop
deze routines aangeroepen kunnen worden, kunnen via de
info functie (50) worden verkregen.
Naam: Alloc
Nummer: 10
Functie: Aanvragen van een segment
In: B = Segment voorkeuze code
Bit 0 en 1: 00 = PSEG0000
01 = PSEG4000
10 = PSEG8000
11 = FSEG
Bit 2 tot 5: Ongebruikt. Moeten 0 zijn.
Bit 6: 1 = Prefereer TPA oftewel het standaard
MSXDOS RAM slot. Dit resulteerd in sneller
schakelen, maar waarschijnlijk niet samen-
werken met niet-MemMan TSR's die zelf al in
het TPA slot gaan zitten.
Bit 7: 1 = Prefereer ongeexpandeerd (dus snel)
slot. Hiervoor geldt hetzelfde als bij bit
zes. Ongeexpandeerde sloten schakelen
sneller, maar hebben een grotere kans al
in gebruik zijn door niet-MemMan toepas-
singen.
Uit: HL = Segmentcode. (&h0000 = Geen segment meer
vrij)
B = Segmentsoort code (-1 = FSeg, 0 = PSeg)
Mocht een PSEG type aangevraagd, maar niet beschikbaar
zijn wordt - indien mogelijk - een FSEG ter beschikking
gesteld die dan het PSEG kan vervangen.
Naam: SetRes
Nummer: 11
Functie: Segment de Reserved status geven
In: HL = Segmentcode
Geeft een segment de `Reserved-status'; zodat het
segment niet automatisch wordt vrij gegeven na aanroep
van de IniChk routine. Normaal gesproken hoeven program-
ma's de reserved status niet te zetten, behalve als een
programma - bijvoorbeeld een Ramdisk - een segment voor
eigen gebruik zeker wil stellen.
Naam: DeAlloc
Nummer: 20
Functie: Teruggeven van een segment
In: HL = Segmentcode
Bij het verlaten van een programma dient deze functie
gebruikt te worden om alle aangevraagde segmenten weer
terug te geven aan MemMan. De eventuele reserved status
van het terug te geven segment wordt door DeAlloc
automatisch opgeheven.
Segmenten die ook door DOS2 beheerd worden, worden door
de DeAlloc functie weer ter beschikking gesteld van
DOS2.
Naam: ClrRes
Nummer: 21
Functie: Reserved status van het segment opheffen
In: HL = Segmentcode
Het is niet nodig deze functie vlak voor DeAlloc aan te
roepen. DeAlloc heft zelf de Reserved status van het
segment op.
Naam: IniChk
Nummer: 30
Functie: Initialisatie MemMan voor een programma
In: A = Controle code
Uit: A = Controle code + "M"
DE = Versie nummer (format: Versie #D.E)
HL = Vanaf versie 2.4: adres MemMan functie-
afhandelings routine (Zie Info (50) voor
meer informatie)
Deze routine telt de ASCII-waarde van de letter "M" op
bij de inhoud van register A. Hierdoor kan er een MemMan
aanwezigheids controle uitgevoerd worden. Verder wordt
er een unCrash uitgevoerd en worden de segmentcodes van
de actief aangeschakelde sloten berekend en opgeslagen
voor CurSeg.
De IniChk functie mag slechts ‚‚n keer door ieder MemMan
toepassings programma aangeroepen worden. Dit aanroepen
van IniChk dient te gebeuren voordat de overige functies
van MemMan aangroepen worden. TSR programma's mogen de
IniChk functie nooit aanroepen.
Naam: Status
Nummer: 31
Functie: Status gegevens van MemMan ophalen
Uit: HL = Aantal aanwezige segmenten
BC = Aantal nog vrije segmenten
DE = Aantal segmenten in dubbel beheer bij
DOS2 en MemMan
A = Connected Status van de aangesloten
hardware.
Bit 0: 1 indien DOS2 Mapper Support
Routines aanwezig, anders 0
Bit 1-7: Gereserveerd, altijd 0.
Als bit 0 van de Connected status gezet is, zijn de
geheugenbeheer functies van DOS 2.20 aanwezig.
Het aantal nog vrije segmenten kan lager zijn dan is
aangegeven in register BC, omdat sommige segmenten na
de installatie van MemMan door DOS2 gebruikt zijn - om
bijvoorbeeld een ramdisk te installeren.
Naam: CurSeg
Nummer: 32
Functie: Segmentcode van een aangeschakeld segment opvragen.
In: B = Paginanummer (0,1,2,3)
Uit: HL = Segmentcode
A = Segmentsoort code (255 = FSeg, 0 = Pseg)
Deze routine geeft de huidige segmentcode terug van een
van de vier pagina's.
TSR programma's mogen deze functie niet gebruiken om
het actieve segment in geheugen pagina 0 te bepalen. Om
tijd te sparen wordt deze stand niet automatisch bepaald
en opgeslagen bij de aanroep van een TSR. De actieve
segmenten in de pagina's 1 en 2 worden echter bij iedere
hook-aanroep opnieuw bepaald en kunnen ten alle tijde
via deze functie opgevraagd worden. Omdat in pagina 3
altijd hetzelfde segment actief is, is ook de segmentco-
de van pagina 3 altijd opvraagbaar.
Een snellere variant van deze functie is FastCurSeg
routine. gebruikt. Het adres waarop deze routine aange-
roepen kan worden is via de Info functie (50) op te
vragen.
Naam: GetTPA
Nummer: 33
Functie: Segmentcode van een TPA segment opvragen.
In: B = Paginanummer (0,1,2,3)
Uit: HL = Segmentcode
A = Segmentsoort code (255 = FSeg, 0 = Pseg)
Deze functie dient op vanuit een programma onder Disk
BASIC toch de `onderste' 32 kB van het TPA aan te kunnen
spreken. MemMan laat die twee segmenten normaal gespro-
ken ongemoeid, omdat er wel eens RAMcartridges in zouden
kunnen zitten, of bijvoorbeeld BASIC's RAMdisk. Gebruik
ervan is dus op eigen risico. Controleer indien nodig
wel of het om FSegs gaat!
Naam: StoSeg
Nummer: 40
Functie: Huidige segmenten stand opslaan
In: HL = Buffer adres (9 bytes groot)
De voor MemMan bekende segmentcodes van de actief
aangeschakelde sloten worden opgeslagen in het buffer.
Deze segmentcodes zijn in beginsel door IniChk berekend
en later door de Use functies geupdate. De opgeslagen
stand is niet de huidige stand, maar de voor MemMan
bekende stand. TSR kunnen hiermee dus niet de actieve
stand opslaan.
Opm: Deze functie mag niet worden aangeroepen via de EXTBIO
hook. Deze functie mag alleen worden uitgevoerd door
een rechtstreekse aanroep van de MemMan functie afhande-
lingsroutine. Het adres waarop deze routine aangeroepen
kan worden, kan via de info functie (50) worden verkre-
gen.
Natuurlijk kunnen ook de (Fast)CurSeg functies gebruikt
worden om de momentele segment-stand op te vragen.
Naam: RstSeg
Nummer: 41
Functie: Opgeslagen segment-stand actief maken
In: HL = Buffer adres
De in het buffer opgeslagen segment-stand wordt weer
actief gemaakt en wordt opgeslagen voor CurSeg.
Opm: Deze functie mag niet worden aangeroepen via de EXTBIO
hook. Deze functie mag alleen worden uitgevoerd door
een rechtstreekse aanroep van de MemMan functie afhande-
lingsroutine. Het adres waarop deze routine aangeroepen
kan worden, kan via de info functie (50) worden verkre-
gen.
Natuurlijk kunnen ook de (Fast)Use functies gebruikt
worden om een segment-stand te herstellen.
Naam: Info
Nummer: 50
Functie: Geeft informatie over onder andere aanroep-adressen van
MemMan functies
In: B = Informatie nummer (0..8)
Uit: HL = Informatie
Informatie nummer overzicht. Tussen haakjes staan de
equivalente MemMan functie codes:
0 - Aanroepadres van FastUse0 (functie 0)
1 - Aanroepadres van FastUse1 (functie 1)
2 - Aanroepadres van FastUse2 (functie 2)
3 - Aanroepadres van TsrCall (functie 63)
4 - Aanroepadres van BasicCall
5 - Aanroepadres van FastCurSeg (functie 32)
6 - Aanroepadres van MemMan, de functie-afhandelings-
routine
7 - Versienummer van MemMan, format: Versie #H.L
8 - Aanroepadres van XTsrCall (functie 61)
9 - Aanroepadres van GetMMSP
10 - Aanroepadres van SetMMSP
De bovengenoemde functie-adressen mogen door een toe-
passingsprogramma of TSR rechtstreeks aangeroepen
worden. Alle entry adressen liggen gegarandeerd in
pagina 3.
De functies worden snel uitgevoerd omdat de MemMan CALL
naar de EXTBIO hook vervalt en de functie-codes in
registers D en E niet uitgeplozen hoeven worden. Een
ander voordeel is dat parameters ook via het register DE
doorgegeven kunnen worden, dit is vooral van belang bij
de TsrCall en BasicCall functies.
Bijvoorbeeld, de initialisatie routine van een TSR kan
de benodigde functieadressen via de INFO functie opvra-
gen en deze vervolgens voor later gebruik in de TSR
programmacode opslaan, wat de snelheid van het TSR
programma zeer ten goede kan komen.
Een exacte beschrijving van de bovenstaande functies
kan gevonden worden bij de MemMan functie waarvan het
nummer tussen haakjes is aangegeven.
Houd echter onder de aandacht dat de `snelle' functies
op de volgende punten van de gewone MemMan functies
verschillen:
fastUse?: Schakelt een segment in in een bepaalde geheugen pagina.
Zie de omschrijving bij de memMan `Use' functies.
tsrCall: Register [DE] wordt ongewijzigd aan de TSR doorgegeven.
Dit in tegenstelling tot functie 63 (TsrCall), register
DE is dan al bezet om het MemMan functienummer in op te
slaan.
xTsrCall: Alle mainregisters (AF,HL,BC,DE) worden ongewijzigd aan
de TSR doorgegeven. De TSR-ID code dient in register IX
te worden geplaatst.
basicCall: Heeft geen MemMan functie nummer.
Functie: Aanroepen van een routine in de BASIC ROM.
In: IX = Call address in pagina 0 of 1
AF,HL,BC,DE = dataregisters voor de BASIC-ROM
Uit: AF,HL,BC,E = dataregisters van de BASIC-ROM
Interrupts disabled
Via deze functie kunnen TSR's een routine aanroepen die
zich in pagina 0 en/of pagina 1 van het BASIC-ROM
bevindt. De bios moet al in pagina 0 aangeschakeld
zijn. In pagina 1 wordt de BASIC ROM door MemMan aange-
schakeld.
Dit is bijvoorbeeld noodzakelijk om de math-pack rou-
tines aan te kunnen roepen die in pagina 0 van de BASIC
ROM zitten, maar tussendoor ook een aantal routines in
pagina 1 aanroepen.
De H.STKE (stack error) hook wordt afgebogen, zodat na
een eventueel op getreden BASIC error de interne stacks
van MemMan gereset kunnen worden.
fastCurSeg: In register [A] komt geen zinnige waarde terug. De
MemMan CurSeg functie (32) geeft aan of het een FSEG/-
PSEG betreft.
memMan: Heeft geen MemMan functienummer
Functie: Rechtstreeks aanroepen van een MemMan functie.
In: E = MemMan functienummer
AF,HL,BC = Dataregisters afhankelijk van de aan te
roepen functie.
Uit: AF,HL,BC,DE = dataregisters afhankelijk van de aan-
geroepen functie.
Een aanroep van deze routine heeft hetzelfde effect als
het aanroepen van een MemMan functie via de EXTBIO
hook. Doordat echter de aanroep naar de EXTBIO hook
vervalt, worden de overige uitbreidingen die aan deze
hook gekoppeld zijn niet aangeroepen. Hierdoor blijft
het stack gebruik beperkt en wordt de verwerkingssnel-
heid verhoogd.
GetMMSP: Heeft geen MemMan functienummer
Functie: Opvragen adres interne MemMan Stack Pointer
In: Niets
Uit: HL = Interne stackpointer van de TSR-Manager.
SetMMSP: Heeft geen MemMan functienummer
Functie: Instellen adres interne MemMan Stack Pointer
In: HL = Nieuwe waarde voor interne stackpointer
van de TSR-Manager.
Uit: Niets
TSR's kunnen met deze twee functies de interne stack
pointer van MemMan opvragen, en weer herstellen wanneer
een bepaalde TSR niet netjes is teruggekeerd naar het
returnadres van de TSR-Manager.
Dat is bijvoorbeeld nodig als een programma de Expres-
sie evaluator in het BASIC ROM aanroept en fouten zelf
wil afhandelen. Het kan dan namelijk zijn dat de ExpEval
een TSR aanroept, die zelf weer ExpEval aanroept en er
op dat moment een fout optreedt. Dan blijft er rotzooi
op de MemMan stack achter. Als na dergelijke fouten de
errorhandler van MSX BASIC gebruikt wordt is er niets
aan de hand: dan maakt MemMan zijn stack zelf schoon.
Voorbeeld:
; Dit is een voorbeeld van een goede aanroep van de
; expressieevaluator in het BASIC ROM, zoals die in
; een programma voor kan komen.
...
ld (saveSP),sp ;Bewaar SP van TSR-programma
call getMMSP
ld (saveMMSP),hl ;Bewaar SP van MemMan
aanroep frmEval ;Evalueer expressie (BIOS)
...
jp main
; Deze routine hangt aan de H.ERRO
; wordt aangeroepen indien er een
; fout in de expressie zat
ld sp,(saveSP) ;Herstel de TSR-stack
ld hl,(saveMMSP)
call setMMSP ;Herstel de MemMan stack
jp main ;Doe alsof niets gebeurd is...
Naam: XTsrCall
Nummer: 61
Functie: Roep het driver-entry van een TSR aan
In: IX = ID code van de aan te roepen TSR
AF,HL,BC,DE = worden ongewijzigd doorgeven aan de TSR.
Uit: AF,HL,BC,DE = komen ongewijzigd terug van de TSR.
Deze functie is een verbeterde versie van de functie
TsrCall (63). Omdat met deze functie alle main-regis-
ters aan de TSR kunnen worden doorgegeven, verdient het
aanbeveling om deze functie te gebruiken in plaats van
functie 63.
Opm: Deze functie mag niet worden aangeroepen via de EXTBIO
hook, omdat bij een aanroep via EXTBIO het IX-register
verminkt wordt. Roep deze functie daarom rechtstreeks
aan, of gebruik de MemMan functie-afhandelingsroutine.
De adressen waarop deze routines aangeroepen kunnen
worden, kunnen via de info functie (50) worden opge-
vraagd.
Naam: GetTsrID
Nummer: 62
Functie: Bepaal TSR ID code
In: HL = Pointer naar de TsrNaam (12 tekens).
Ongebruikte posities opvullen met spa-
ties.
Uit: Carry = Clear (NC) als TSR gevonden is, Set (C)
als TSR niet gevonden is.
BC = TSR ID code
Naam: TsrCall
Nummer: 63
Functie: Roep het driver-entry van een TSR aan
In: BC = ID code van de aan te roepen TSR
AF,HL,DE = worden ongewijzigd doorgeven aan de TSR.
Uit: AF,HL,BC,DE = komen ongewijzigd terug van de TSR.
Merk op dat alhoewel het DE register ongewijzigd aan de
TSR wordt doorgegeven, het niet voor parameter-invoer
benut kan worden. De Extended BIOS functiecode van
MemMan (D='M' E=63) moet namelijk in dat register
geplaatst worden.
Bij de Fast-TsrCall routine treedt deze complicatie
niet op; het adres van deze routine kan middels de info
functie opgevraagd worden.
Naam: HeapAlloc
Nummer: 70
Functie: Alloceer ruimte in de heap
In: HL = Gewenste grootte van de ruimte (in bytes)
Uit: HL = &h0000 als er onvoldoende ruimte was,
anders het startadres van de ruimte.
Door middel van deze functie kan een stuk geheugen
gealloceerd worden. Het geheugenblok zal zich gegaran-
deerd in pagina 3 bevinden.
De heap is vooral nuttig voor TSR programma's, die hem
bijvoorbeeld als tijdelijke of permanente diskbuffer
kunnen gebruiken. Ook andere buffers - waarvan het
absoluut noodzakelijk is dat ze zich in pagina 3 bevin-
den - kunnen op de heap worden geplaatst.
Aangevraagde blokken geheugen uit de heap blijven
onbruikbaar voor andere programma's totdat een `Heap-
DeAlloc' is uitgevoerd (functie 71).
De grootte van de heap kan worden ingesteld door middel
van het configuratie programma CFGMMAN.
Naam: HeapDeAlloc
Nummer: 71
Functie: Geef geAlloceerde ruimte van de heap weer vrij
In: HL = Startadres van de ruimte
Naam: HeapMax
Nummer: 72
Functie: Geef de lengte van het grootste vrije blok geheugen in
de heap terug
Uit: HL = Lengte van het grootste vrije blok
Gebruik van de stack onder MemMan
---------------------------------
MemMan toepassingsprogramma's dienen de stack pointer (SP) bij
voorkeur in pagina 2 of 3 (tussen &h8000 en &hFFFF) te plaatsen.
Indien MemMan door een hook-aanroep geactiveerd wordt, wordt het
huidige segment in pagina 1 (&h4000 tot &h8000) namelijk weggescha-
keld om plaats te maken voor de TSR-Manager en de eventuele TSR's.
Indien de stack zich op dat moment in pagina 1 bevindt zal de compu-
ter vastlopen.
Indien TSR's na een BDOS call of interrupt via een BIOS-hook worden
aangeroepen treden geen stackproblemen op; ook niet indien de stack
van het toepassingsprogramma in pagina 1 staat. De BDOS en interrupt-
functies gebruiken namelijk hun eigen stack in pagina 3. De stack
bevindt zich dan alsnog in pagina 3 op het moment dat de hook aange-
roepen wordt.
Bestaande CP/M en MSX-DOS programmatuur is dus zonder problemen in
combinatie met MemMan 2 te gebruiken - maar alleen indien de stan-
daard BDOS calls gebruikt worden. Wanneer echter via een interslot
call een BIOS routine rechtstreeks aangeroepen wordt, dient de stack
in pagina 2 of 3 te staan. Reserveer in dat geval minimaal 150 bytes
voor de stack.
Appendix 1: BIOS aanroepen onder Turbo Pascal
---------------------------------------------
Indien in een Turbo Pascal programma interslot-calls naar de BIOS
gebruikt worden, is het belangrijk dat de stack in pagina 2 of 3
staat. Op het moment dat de BIOS dan een hook aanroept kan MemMan
veilig de TSR's aktiveren. De positie van de stack is afhankelijk
van het maximum programma adres dat tijdens de compilatie in Turbo
Pascal is ingesteld. De stack bevindt zich in Turbo Pascal direkt
onder het variabelen geheugen. Het variabelen geheugen dient bij
programma's die de BIOS aanroepen dus ruim boven adres &h8000 ge-
plaatst te worden.
Is geen source voorhanden, dan is het mogelijk om met een debugger
het stack adres van Turbo Pascal programma's aan te passen. De
initialisatie code van een TP programma ziet er als volgt uit:
start: jp init
...
...
init: ld sp,100h
ld hl,nn
ld de,nn
ld bc,nn
call yy
ld hl,nn
ld de,stack ;DE bevat het stack adres, hoeft
ld bc,nn ; alleen aangepast te worden als het
call zz ; lager is dan &h80A0
...
Het stackadres in register DE kan bijvoorbeeld op &hC100 gezet
worden.
Appendix 2: Tips en aanwijzingen voor programmeurs
--------------------------------------------------
Omdat de EXTBIO hook gebruikt wordt voor diverse systeem uitbrei-
dingen zoals Kanji en RS232 interfaces, is het mogelijk dat MemMan
functie-aanroepen bijzonder langzaam verwerkt worden. De prestaties
van de MemMan toepassingsprogramma's kunnen aanmerkelijk worden
verhoogd door functie afhandelingsroutine van MemMan rechtstreeks aan
te roepen, in plaats van de EXTBIO hook. Het adres waarop de functie
afhandelingsroutine aangeroepen kan worden, kan worden opgevraagd via
de info functie (50). Ook IniChk (30) geeft sinds versie 2.4 het
adres van de functieafhandelingsroutine in HL terug, zodat het meteen
in het programma ingevuld kan worden.
De meeste MemMan functies bevinden zich in een apart geheugensegment
in pagina 1. Deze functies schakelen over op een een interne stack,
waardoor MemMan toepassingsprogramma's met een betrekkelijk kleine
stack kunnen volstaan. Door een MemMan functie worden maximaal
twintig bytes op de stack van het toepassingsprogramma geplaatst. Dit
geldt echter alleen indien de functie rechtstreeks, of via de MemMan
functie-afhandelingsroutine wordt aangeroepen. Een functie-aanroep
via de EXTBIO hook kan echter een bijzonder grote stack vereisen. Dit
wordt veroorzaakt doordat alle uitbreidings-modules die aan de EXTBIO
hook gekoppeld zijn elkaar aanroepen, net zo lang totdat ‚‚n module
de functieaanroep herkent. Wanneer er tussendoor ook nog interrupts
afgehandeld worden, kan het stackgebruik sterk oplopen. Al met al kan
gesteld worden dat er bij een aanroep van de EXTBIO hook minimaal 150
bytes stackruimte beschikbaar moet zijn. Ook om deze reden is het
verstandig om de MemMan functie-afhandelingsroutine te gebruiken in
plaats van de EXTBIO hook.
MemMan versie 1.1 bevat nog een aantal bugs die in versie 2 opgelost
zijn. Het voordeel van MemMan 1.1 is echter dat er geen extra segment
gebruikt wordt, en het programma dus ook loopt op 64 kB computers.
Het is echter ondoenlijk om voor die beperkte groep MemMan 1.1 nog up
to date te houden. Om een programma ook op 64 kB computers te laten
werken adviseren wij dan ook wanneer MemMan niet aanwezig is zelf 64
kB RAM in te schakelen en te gebruiken, of eventueel zelfs de hele
mapper. Onder DOS is er om 64 kB RAM in te schakelen immers geen
MemMan nodig, en vanuit MSX Basic kan het met MemMan 1.1 toch niet
netjes. MemMan versie 1.1 zal niet verder ontwikkeld worden.
Bij het programmeren van TSR's kan sinds versie 2.4 gebruikt gemaakt
worden van de MemMan functie-afhandelingsroutine op adres &h4002, die
daar altijd staat als er een TSR-segment ingeschakeld is. dat maakt
de code in TSR's sneller en een stuk overzichtelijker!
Maak bij het schrijven van de VDP registers altijd gebruik van de
daarvoor bedoelde BIOS routines! Dan worden namelijk ook de systeem-
variabelen in pagina 3 bijgehouden, en sommige TSR's (CurBlink,
screendumpers, screensavers, debuggers, memory viewers) maken daar
gebruik van. Bijvoorbeeld om te achterhalen wel schermtype er op dit
moment actief is of waar de sprite-tabellen staan. Ook het beschrij-
ven van de palet-registers dient via de BIOS te gebeuren, zodat de
informatie in het VRAM ook bijgewerkt wordt. Alleen als dat VRAM
absoluut voor andere zaken nodig is (Bijvoorbeeld bij een VDP(24)
scroll) moet hiervan helaas afgeweken worden.
Zet de interupts uit bij het sturen van een blok data naar het VRAM.
Het is mogelijk dat een TSR die tussendoor actief wordt iets uit het
VRAM leest of er naar schrijft, en dan wordt de lees/schrijfpointer
van de VDP gewijzigd. Let er op dat sommige BIOS routines de inter-
rupts zelf aanzetten! In die gevallen kan er in het hoofdprogramma
(in TSR kan het ook, maar dan moet de toestand van het bit eerst
gelezen en bewaard worden) gebruik gemaakt worden van het Interupt
Enable bit in de VDP. Door die uit te zetten genereerd de VDP geen
interrupts meer. Een DI is nog steeds nodig, er zijn namelijk ook
cartridges die interrupts kunnen genereren, maar het is iets veili-
ger.
Het aanvragen van segmenten (ALLOC) uit een interrupt routine kan
tot het ophangen van de machine leiden. Dit omdat DOS2 niet reentrant
is. Als DOS2 actief is op moment dat een interrupt optreedt en uit de
interrupt routine wordt DOS2 nogmaals aangeroepen wordt onder andere
de interne stack van DOS2 overschreven. En ALLOC roept (als DOS2
aanwezig is) de DOS2 mapper support routines aan. Een goede en
afdoende oplossing voor dit probleem is nog niet bekend. Voor DEALLOC
geldt waarschijnlijk hetzelfde. USE, zo leert de ervaring met de
printerbuffer, levert geen enkel probleem op.
Laat programma's een vastgesteld maximum aantal segmenten aanvragen.
Er bestaan 4 MB Memory Mappers, en het is niet eens erg ingewikkeld
om acht van die dingen via twee slotexpanders op een MSX aan te
sluiten. Dat levert een totaal van meer dan 32 MB (2048 segmenten)
op. Meer segmenten aanvragen dan nodig is kost slechts nodeloos tijd
en ruimte. Overigens heeft bijvoorbeeld BK ook een grens, die vraagt
maximaal 4 MB aan. In versie 1.02 gaat het echter toch fout als die
4 MB ook daadwerkelijk beschikbaar blijkt te zijn... De oplossing is
in dat geval een voldoende grote RAMdisk of printerbuffer installe-
ren. De tekstverwerker TED doet het wel foutloos: die vraagt maximaal
2 MB aan bij MemMan.
Het is handig om TSR's die BASIC op de ‚‚n of andere manier uitbrei-
den te voorzien ook `CMD HELP' te laten herkennen en een kort over-
zicht van de mogelijkheden te laten afdrukken. Door de `QuitHook'
vlag bij het verlaten niet te zetten en de stack in tact te laten
worden ook de CMD HELPS's van andere TSR's (en uiteindelijk die van
`MST TsrUtils', die de foutmelding van BASIC onderdrukt) ook uitge-
voerd.
Vergeet nooit op de aanwezigheid en (ook in TSR's!) het versienummer
van MemMan te testen. Vereis minimaal 2.3(1), of beter nog: 2.4. Die
versie kan gewoon met het programma verspreid worden, dus een beper-
king hoeft dat niet te zijn.
Het is vaak makkelijk het huidige segment in pagina 2 en eventueel
(voor programma's onder Disk BASIC) de TPA segmenten 0 en 1, die
tegenwoordig met GetTPA achterhaald kunnen worden in de segmententa-
bel te zetten. Let er echter op het aanroepen van DeAlloc voor die
segmenten niet nodig is. MemMan controleert de aan DeAlloc aangeboden
segmentcodes namelijk niet en gaat fouten maken!
** Einde **
|