MILC logo

IndexVorigeVolgendeLeeg

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 **

    

Index

Vorige

Volgende