home *** CD-ROM | disk | FTP | other *** search
- 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 **