home *** CD-ROM | disk | FTP | other *** search
/ Emulator Universe CD / emulatoruniversecd1998.iso / MSX / OS / MSXDOS2.ZIP / MEMMAN24.LZH / MM24SPEC.TXT < prev    next >
Encoding:
Text File  |  1996-08-23  |  42.3 KB  |  907 lines

  1. File : MM24SPEC.TXT
  2. Datum: 19 september 1992
  3. Door : Ries Vriend / Ramon van der Winkel - (c) MST
  4. ---------------------------------------------------
  5.  
  6. Deze tekst bevat de informatie die nodig is voor het schrijven van
  7. MemMan 2.4 toepassingsprogramma's. Voor specifieke specificaties
  8. omtrend het programmeren van TSR's wordt echter verwezen naar de
  9. technische documentie die te vinden is op de `TSR-Development disk'.
  10. Hierop staan de volledige TSR specificaties en enkele TSR ontwikkel
  11. tools. Deze disk kan besteld worden bij het MST, zie voor meer
  12. informatie hierover de LezersService van MSX Computer Magazine.
  13.  
  14.  
  15. Inhoud
  16. ------
  17.  
  18. Wijzigingen in MemMan 2.3 ten opzichte van versie 2.2
  19. Updates van MemMan 2.30 naar MemMan 2.31
  20. Wijzigingen in MemMan 2.4 ten opzichte van versie 2.3
  21.  
  22. Waarom MemMan 2.4?
  23.  
  24. De principes
  25.  
  26. Appendix 1: BIOS aanroepen onder Turbo Pascal
  27. Appendix 2: Tips en aanwijzingen voor programmeurs
  28.  
  29.  
  30. MEMMAN versie 2.4 - specificaties
  31. =================================
  32.  
  33. Wijzigingen in MemMan 2.3 ten opzichte van versie 2.2:
  34. -----------------------------------------------------
  35.  
  36. -      De functie XTsrCall (61) is toegevoegd. Deze functie werkt
  37.        identiek aan de functie TsrCall (63), het Tsr-ID wordt echter
  38.        verwacht in register IX in plaats van BC. Hierdoor komt
  39.        register BC vrij om als invoerparameter gebruikt te worden.
  40.  
  41. -      Door middel van de functie Info (50) kan het adres worden
  42.        opgevraagd waarop XTsrCall rechtstreeks kan worden aangeroe-
  43.        pen.
  44.  
  45. -      De funtie status (31) is verbeterd. De totale hoeveelheid
  46.        bruikbaar werkgeheugen in de computer wordt nu correct gemeld,
  47.        ook onder MSX-DOS2.
  48.  
  49. -      De Alloc (10) functie herkent nu ook geheugen dat beschikbaar
  50.        komt wanneer de DOS2 RAMdisk wordt verwijderd of verkleind!
  51.        Het maakt daarbij niet meer uit of de RAMdisk wordt aangemaakt
  52.        voor- of nadat MemMan werd geïnstalleerd.
  53.  
  54. -      De interne stack van MemMan die gebruikt wordt om functie-
  55.        aanroepen te verwerken is vergroot tot 240 bytes, in plaats
  56.        van 160. In de praktijk bleek dat de functiestack van MemMan
  57.        2.2 te krap was om geneste "tsrCalls" te verwerken.
  58.  
  59.  
  60. Updates van MemMan 2.30 naar MemMan 2.31:
  61. ----------------------------------------
  62.  
  63. -      Er bleek een bug te zitten in TL.COM, waardoor het inladen
  64.        van TSR's onder DOS1 niet goed ging. De fout zat in het parsen
  65.        van de command line, en was daags na de beurs bekend en
  66.        opgelost. Patches zijn gepubliceerd in MSX Computer Magazine
  67.        nummer 49 pagina 66 en MSX Club Magazine 38 pagina 56 en PTC
  68.        Print nummer 59 pagina 7.
  69.  
  70. -      De tweede bug was complexer, en kwam aan het licht tijdens
  71.        experimenten met nieuwe TSR's. Hij was nog niet eerder gemeld.
  72.        Het ging om CMD TL. Dat commando voerde geen IniChk uit,
  73.        waardoor de CurSeg functie van MemMan ook nog niet goed
  74.        werkte. TSR's die CurSeg gebruikten en geheugen schakelden in
  75.        pagina 2 liepen daardoor vast. Dat was (is?) op dat moment
  76.        alleen de printerbuffer PB.TSR. Bij het laden van een TSR met
  77.        TL.COM ging het wel goed, die doet namelijk wel een IniChk.
  78.        Ook deze bug is opgelost met een patch, gepubliceerd in MSX
  79.        Computer Magazine 52 pagina 21 en MSX Club Magazine 40 pagina
  80.        89 en PTC Print nummer 59 pagina 7.
  81.  
  82.  
  83. Wijzigingen in MemMan 2.4 ten opzichte van versie 2.3:
  84. -----------------------------------------------------
  85.  
  86. -      De GetTPA (33) functie is toegevoegd, zodat het nu ook onder
  87.        Disk BASIC mogelijk is de 32 kB RAM `achter' het BIOS en het
  88.        BASIC ROM te gebruiken. Veel mensen hebben hierom gevraagd!
  89.  
  90. -      CMD HELP wordt nu ondersteund door de standaard TSR `MST
  91.        TsrUtils'. Met dit commando kan een kort overzicht van de
  92.        extra BASIC commando's op het scherm gezet worden. Zie voor
  93.        meer informatie over CMD HELP de tips en aanwijzingen voor
  94.        programmeurs.
  95.  
  96. -      TL.COM maakt nu onder DOS 2 gebruik van het Environment Item
  97.        TL, om te achterhalen waar de TSR's staan. Harddisk bezitters
  98.        hoeven slechts een `SET TL=A:\TSRS' in hun AUTOEXEC.BAT op te
  99.        nemen en alle TSR's in de subdirectory A:\TSRS zijn ten aller
  100.        tijd bereikbaar voor TL. Het opgeven van een pad is dan niet
  101.        meer nodig.
  102.  
  103. -      TV.COM laat nu ook zien in welk segment de verschillende
  104.        TSR's zitten. Hierdoor is het eenvoudig mogelijk een extra
  105.        segment vrij te maken door de TSR's die er in zitten te
  106.        verwijderen. TSR segment 0 is het MemMan segment, het geheugen
  107.        dat in dat segment nog vrij is kan niet door andere program-
  108.        ma's maar alleen door TSR's gebruikt worden.
  109.  
  110. -      Er zijn twee functies toegevoegd voor het uitlezen en instel-
  111.        len van de stack pointer van MemMan's interne stack. Dat is
  112.        nodig als een programma de Expressie evaluator in het BASIC
  113.        ROM aanroept en fouten zelf wil afhandelen. Het kan dan
  114.        namelijk zijn dat de ExpEval een TSR aanroept, die zelf weer
  115.        ExpEval aanroept en er op dat moment een fout optreedt. Dan
  116.        blijft er rotzooi op de MemMan stack achter. Als na dergelijke
  117.        fouten de errorhandler van MSX BASIC gebruikt wordt is er
  118.        niets aan de hand: dan maakt MemMan zijn stack zelf schoon.
  119.  
  120. -      In elk TSR segment begint op adres &h4002 de MemMan functie
  121.        afhandelings routine. MemMan aanroepen uit een TSR kan dus
  122.        voortaan eenvoudig en snel met een `CALL &h4002'
  123.  
  124. -      Er wordt een nieuwe versie (1.04) van de bestandskopieerder
  125.        BK meegeleverd die geen fouten maakt als er meer dan 4 MB
  126.        geheugen beschikbaar is. In versie 1.02 liep een tellertje
  127.        over waardoor de hoeveelheid geheugen onjuist op het scherm
  128.        werd aangegeven.
  129.  
  130. -      IniChk geeft in HL nu het adres van de MemMan functieafhan-
  131.        delingsroutine terug. Die hoeft dus niet apart via de Info
  132.        functie opgevraagd te worden.
  133.  
  134.  
  135. Waarom MemMan 2.4?
  136. -----------------
  137.  
  138. In feite is er na de updates van MemMan 2.30 weinig reden geweest
  139. tot het uitbrengen van een volgende versie. De verschillen tussen
  140. 2.3 en 2.4 zijn dan ook klein. Alle bekende bugs waren al verbeterd,
  141. en grote uitbreidingen zijn er niet. Het is dus gebleven bij de een
  142. aantal kleine extra's.
  143. Naast wat er nu nieuw is hadden en hebben we nog meer en grotere
  144. plannen. Daar wordt nog steeds aan gewerkt, maar we willen niet
  145. wachten tot die goed uitgewerkt en vooral getest zijn met het uit-
  146. brengen van 2.4. Dat doen we met name omdat er de laatste tijd meer
  147. en meer programmeurs tegen een ontwerpfout in MemMan opgelopen zijn:
  148. het was namelijk onmogelijk om de 32 kB RAM achter het ROM vanuit
  149. Disk BASIC door middel van MemMan in te schakelen. Dat is nu opge-
  150. lost: voortaan kan al het schakelwerk netjes via MemMan gebeuren, ook
  151. als een programma onder Disk BASIC draait en echt al het geheugen tot
  152. zijn beschikking wil hebben.
  153. Alle andere uitbreidingen zijn leuk en aardig, maar hadden ook kunnen
  154. wachten. Bovendien zitten er in de verdere plannen ook wat wensen en
  155. verlangens die in feite behoorlijk belangrijk zijn. Stuk voor stuk
  156. vereisen die echter een flinke verbouwing van de interne structuur
  157. van MemMan en dat kost nu eenmaal tijd.
  158.  
  159.  
  160. Gebruikte terminologie
  161. ----------------------
  162.  
  163. Segment      Geheugenblok van 16kB. Segmenten komen voor in Pagina
  164.              specifieke segmenten (PSEG) en Flexibele segmenten
  165.              (FSEG). De Flexibele segmenten kunnen op de pagina's 0,
  166.              1 en 2 worden aangeschakeld. De Pagina specifieke
  167.              segmenten alleen op hun eigen pagina. Er zijn drie
  168.              soorten pagina specifieke segment: PSEG0000, PSEG4000
  169.              en PSEG8000. Ze zijn op respectievelijk pagina 0,1 en 2
  170.              aanschakelbaar.
  171.  
  172. Heap         Stuk geheugen in pagina 3 (ergens tussen &hC000 en
  173.              &hFFFF) waarvan MemMan toepassingsprogramma's een stuk
  174.              aan kunnen vragen en daarna vrij mogen gebruiken. De
  175.              grootte ervan kan met behulp van het configuratiepro-
  176.              gramma CFGMMAN ingesteld worden.
  177.  
  178. FastUse      Zelfde als Use, maar dan het adres waarop de routine
  179.              direct aan te roepen is in pagina 3. Ook een aantal
  180.              andere routines kunnen direct aangeroepen worden, wat de
  181.              snelheid ten goede komt.
  182.  
  183. UnCrash      Om te voorkomen dat segmenten aangevraagd zijn en door
  184.              een crash van een programma nooit meer vrij zouden
  185.              worden gegeven, voert de IniChk routine een unCrash
  186.              uit. Hierbij worden alle segmenten weer vrijgegeven.
  187.              Het unCrashen van een segment is te voorkomen door een
  188.              segment de Reserved status te geven. Dit kan met de
  189.              functie SetRes (11). Normaal gesproken hoeft een segment
  190.              niet de Reserved status gegeven te worden.
  191.  
  192. TPA          `Transient Program Area'. Oorspronkelijk werd hiermee
  193.              onder CP/M en dus MSX DOS het stuk geheugen tussen
  194.              adres &h0100 en de eerste byte van het operating systeem
  195.              bedoeld. In dat gebied konden gebruikersprogramma's
  196.              geladen worden. In deze tekst bedoelen we met TPA de
  197.              vier segmenten (64 kB) die ingeschakeld zijn onder MSX
  198.              DOS. De bovenste twee daarvan zijn ook ingeschakeld
  199.              onder MSX BASIC.
  200.  
  201.  
  202. De principes
  203. ------------
  204.  
  205. MemMan verdeelt het aanwezige geheugen in segmenten van 16 kB.
  206. Voordat een segment gebruikt mag worden moet het worden aangevraagd.
  207. Na gebruik dient het weer te worden vrijgegeven. Er zijn twee soorten
  208. segmenten: de zogenaamde pagina-specifieke ofwel PSEG's en de flexib-
  209. ele FSEG's.
  210.  
  211. PSEG's zijn segmenten die aangevraagd worden voor het gebruik op een
  212. bepaalde pagina, bijvoorbeeld van &h4000-&h7FFF of van &h8000-&hBFFF.
  213. Wanneer er een PSEG aangevraagd wordt zal MemMan zo mogelijk geheu-
  214. gensegmenten toewijzen die niet in een memory-mapper zitten. FSEG's
  215. zijn segmenten die op elke willekeurige pagina kunnen worden inge-
  216. schakeld. Deze segmenten komen altijd uit memory mappers.
  217.  
  218. Welk soort segment er ook aangevraagd wordt, MemMan zal een 16-bits
  219. `segmentcode' teruggeven. Deze segmentcode is weer nodig bij het
  220. inschakelen of het weer vrijgeven van het segment. Wie alleen maar
  221. geheugen nodig heeft in het gebied van &h8000 tot &hBFFF kan dus het
  222. beste PSEG's aanvragen. MemMan gebruikt dan eerst zoveel mogelijk
  223. geheugen uit de `oude' 16- en 64 Kb modules en gaat dan de mapper
  224. gebruiken.
  225.  
  226. Met behulp van MemMan hoeft er dus nooit meer naar geheugen gezocht
  227. te worden. Simpelweg een pagina aanvragen, gebruiken en uiteindelijk
  228. weer vrijgeven. Zo eenvoudig is dat.
  229. Overigens is er een pagina die zich met MemMan niet laat schakelen.
  230. Pagina 3 bevat behalve de MemMan code zelf ook de stack (meestal) en
  231. een grote hoeveelheid systeemvariabelen. Er zitten nogal wat haken en
  232. ogen aan het wegschakelen van dat alles.
  233.  
  234.  
  235. Functieomschrijving MemMan 2.4
  236. ------------------------------
  237.  
  238. MemMan functies kunnen worden uitgevoerd door een aanroep van de
  239. `Extended BIOS' of EXTBIO hook, op adres &hFFCA. Het device ID van
  240. MemMan - `M' oftewel &h4D - moet in register D worden geplaatst.
  241. Register E dient het MemMan functienummer te bevatten. Na aanroep van
  242. een MemMan functie kunnen alle registers gewijzigd zijn, behalve
  243. indien het tegendeel wordt vermeld bij de functie-omschrijving.
  244.  
  245. Het is ook mogelijk MemMan direct aan te roepen, het adres waarop
  246. dat kan gebeuren kan opgevraagd worden via de Info functie (50) en
  247. wordt ook teruggegeven door IniChk (30) Op die manier worden de
  248. nadelen van het aanroepen van MemMan via de hook omzeild. Zie voor
  249. meer informatie de tips en aanwijzingen voor programmeurs.
  250.  
  251. De interruptstand blijft na een MemMan functie-aanroep in meeste
  252. gevallen ongewijzigd. Sommige functies zoals de diverse (Fast)Use
  253. functies schakelen de interrupts echter uit. Wanneer een MemMan
  254. functie werd aangeroepen met de interrupts uit, zal MemMan nooit
  255. terugkeren met de interrupts ingeschakeld.
  256. Deze eigenschap is bijvoorbeeld van belang voor TSR programma's die
  257. slechts een zeer kleine stack ter beschikking hebben. Zo lang de
  258. interrupts uit staan, kunnen alle MemMan functies zonder problemen
  259. worden uitgevoerd, mits de functie verwerkingsroutine van MemMan
  260. rechtstreeks wordt aangeroepen. Wanneer de interrupts echter aan
  261. staan is een grote stack vereist, omdat de interrupt-verwerkingsrou-
  262. tine enkele tientallen bytes op de stack plaatst.
  263.  
  264.  
  265. Naam:        Use0
  266. Nummer:      0
  267. Functie:     Aanschakelen van een segment op pagina 0 (adresgebied
  268.              &h0000..&h3FFF)
  269. In:          HL           = Segmentcode
  270. Uit:         A            = Resultaatcode (-1 = Mislukt, 0 = Gelukt)
  271.  
  272.              Het inschakelen van een segment in pagina 0 is alleen
  273.              mogelijk indien het segment de MSX-standaard slot-
  274.              schakel entry points bevat.
  275.  
  276. Opm:         Deze functie mag niet worden aangeroepen via de EXTBIO
  277.              hook. Deze functie mag alleen worden uitgevoerd door
  278.              een rechtstreekse aanroep van de MemMan functie afhande-
  279.              lingsroutine of de FastUse0 functie. De adressen waarop
  280.              deze routines aangeroepen kunnen worden, kunnen via de
  281.              info functie (50) worden verkregen.
  282.  
  283.  
  284. Naam:        Use1
  285. Nummer:      1
  286. Functie:     Aanschakelen van een segment op pagina 1 (adresgebied
  287.              &h4000..&h7FFF)
  288. In:          HL           = Segmentcode
  289. Uit:         A            = Resultaatcode (-1 = Mislukt, 0 = Gelukt)
  290.  
  291. Opm:         Deze functie mag niet worden aangeroepen via de EXTBIO
  292.              hook. Deze functie mag alleen worden uitgevoerd door
  293.              een rechtstreekse aanroep van de MemMan functie afhande-
  294.              lingsroutine of de FastUse1 functie. De adressen waarop
  295.              deze routines aangeroepen kunnen worden, kunnen via de
  296.              info functie (50) worden verkregen.
  297.  
  298.  
  299. Naam:        Use2
  300. Nummer:      2
  301. Functie:     Aanschakelen van een segment op pagina 2 (adresgebied
  302.              &h8000..&hBFFF)
  303. In:          HL           = Segmentcode
  304. Uit:         A            = Resultaatcode (-1 = Mislukt, 0 = Gelukt)
  305.  
  306. Opm:         Deze functie mag niet worden aangeroepen via de EXTBIO
  307.              hook. Deze functie mag alleen worden uitgevoerd door
  308.              een rechtstreekse aanroep van de MemMan functie afhande-
  309.              lingsroutine of de FastUse2 functie. De adressen waarop
  310.              deze routines aangeroepen kunnen worden, kunnen via de
  311.              info functie (50) worden verkregen.
  312.  
  313.  
  314. Naam:        Alloc
  315. Nummer:      10
  316. Functie:     Aanvragen van een segment
  317. In:          B            = Segment voorkeuze code
  318.              Bit 0 en 1:  00 = PSEG0000
  319.                           01 = PSEG4000
  320.                           10 = PSEG8000
  321.                           11 = FSEG
  322.              Bit 2 tot 5: Ongebruikt. Moeten 0 zijn.
  323.              Bit 6:       1 = Prefereer TPA oftewel het standaard
  324.                           MSXDOS RAM slot. Dit resulteerd in sneller
  325.                           schakelen, maar waarschijnlijk niet samen-
  326.                           werken met niet-MemMan TSR's die zelf al in
  327.                           het TPA slot gaan zitten.
  328.              Bit 7:       1 = Prefereer ongeexpandeerd (dus snel)
  329.                           slot. Hiervoor geldt hetzelfde als bij bit
  330.                           zes. Ongeexpandeerde sloten schakelen
  331.                           sneller, maar hebben een grotere kans al
  332.                           in gebruik zijn door niet-MemMan toepas-
  333.                           singen.
  334. Uit:         HL           = Segmentcode. (&h0000 = Geen segment meer
  335.                             vrij)
  336.              B            = Segmentsoort code (-1 = FSeg, 0 = PSeg)
  337.  
  338.              Mocht een PSEG type aangevraagd, maar niet beschikbaar
  339.              zijn wordt - indien mogelijk - een FSEG ter beschikking
  340.              gesteld die dan het PSEG kan vervangen.
  341.  
  342.  
  343. Naam:        SetRes
  344. Nummer:      11
  345. Functie:     Segment de Reserved status geven
  346. In:          HL           = Segmentcode
  347.  
  348.              Geeft een segment de `Reserved-status'; zodat het
  349.              segment niet automatisch wordt vrij gegeven na aanroep
  350.              van de IniChk routine. Normaal gesproken hoeven program-
  351.              ma's de reserved status niet te zetten, behalve als een
  352.              programma - bijvoorbeeld een Ramdisk - een segment voor
  353.              eigen gebruik zeker wil stellen.
  354.  
  355.  
  356. Naam:        DeAlloc
  357. Nummer:      20
  358. Functie:     Teruggeven van een segment
  359. In:          HL           = Segmentcode
  360.  
  361.              Bij het verlaten van een programma dient deze functie
  362.              gebruikt te worden om alle aangevraagde segmenten weer
  363.              terug te geven aan MemMan. De eventuele reserved status
  364.              van het terug te geven segment wordt door DeAlloc
  365.              automatisch opgeheven.
  366.              Segmenten die ook door DOS2 beheerd worden, worden door
  367.              de DeAlloc functie weer ter beschikking gesteld van
  368.              DOS2.
  369.  
  370.  
  371. Naam:        ClrRes
  372. Nummer:      21
  373. Functie:     Reserved status van het segment opheffen
  374. In:          HL           = Segmentcode
  375.  
  376.              Het is niet nodig deze functie vlak voor DeAlloc aan te
  377.              roepen. DeAlloc heft zelf de Reserved status van het
  378.              segment op.
  379.  
  380.  
  381. Naam:        IniChk
  382. Nummer:      30
  383. Functie:     Initialisatie MemMan voor een programma
  384. In:          A            = Controle code
  385. Uit:         A            = Controle code + "M"
  386.              DE           = Versie nummer (format: Versie #D.E)
  387.              HL           = Vanaf versie 2.4: adres MemMan functie-
  388.                             afhandelings routine (Zie Info (50) voor
  389.                             meer informatie)
  390.  
  391.              Deze routine telt de ASCII-waarde van de letter "M" op
  392.              bij de inhoud van register A. Hierdoor kan er een MemMan
  393.              aanwezigheids controle uitgevoerd worden. Verder wordt
  394.              er een unCrash uitgevoerd en worden de segmentcodes van
  395.              de actief aangeschakelde sloten berekend en opgeslagen
  396.              voor CurSeg.
  397.              De IniChk functie mag slechts één keer door ieder MemMan
  398.              toepassings programma aangeroepen worden. Dit aanroepen
  399.              van IniChk dient te gebeuren voordat de overige functies
  400.              van MemMan aangroepen worden. TSR programma's mogen de
  401.              IniChk functie nooit aanroepen.
  402.  
  403.  
  404. Naam:        Status
  405. Nummer:      31
  406. Functie:     Status gegevens van MemMan ophalen
  407. Uit:         HL           = Aantal aanwezige segmenten
  408.              BC           = Aantal nog vrije segmenten
  409.              DE           = Aantal segmenten in dubbel beheer bij
  410.                             DOS2 en MemMan
  411.              A            = Connected Status van de aangesloten
  412.                             hardware.
  413.                             Bit 0: 1 indien DOS2 Mapper Support
  414.                             Routines aanwezig, anders 0
  415.                             Bit 1-7: Gereserveerd, altijd 0.
  416.  
  417.              Als bit 0 van de Connected status gezet is, zijn de
  418.              geheugenbeheer functies van DOS 2.20 aanwezig.
  419.              Het aantal nog vrije segmenten kan lager zijn dan is
  420.              aangegeven in register BC, omdat sommige segmenten na
  421.              de installatie van MemMan door DOS2 gebruikt zijn - om
  422.              bijvoorbeeld een ramdisk te installeren.
  423.  
  424.  
  425. Naam:        CurSeg
  426. Nummer:      32
  427. Functie:     Segmentcode van een aangeschakeld segment opvragen.
  428. In:          B            = Paginanummer (0,1,2,3)
  429. Uit:         HL           = Segmentcode
  430.              A            = Segmentsoort code (255 = FSeg, 0 = Pseg)
  431.  
  432.              Deze routine geeft de huidige segmentcode terug van een
  433.              van de vier pagina's.
  434.              TSR programma's mogen deze functie niet gebruiken om
  435.              het actieve segment in geheugen pagina 0 te bepalen. Om
  436.              tijd te sparen wordt deze stand niet automatisch bepaald
  437.              en opgeslagen bij de aanroep van een TSR. De actieve
  438.              segmenten in de pagina's 1 en 2 worden echter bij iedere
  439.              hook-aanroep opnieuw bepaald en kunnen ten alle tijde
  440.              via deze functie opgevraagd worden. Omdat in pagina 3
  441.              altijd hetzelfde segment actief is, is ook de segmentco-
  442.              de van pagina 3 altijd opvraagbaar.
  443.              Een snellere variant van deze functie is FastCurSeg
  444.              routine. gebruikt. Het adres waarop deze routine aange-
  445.              roepen kan worden is via de Info functie (50) op te
  446.              vragen.
  447.  
  448.  
  449. Naam:        GetTPA
  450. Nummer:      33
  451. Functie:     Segmentcode van een TPA segment opvragen.
  452. In:          B            = Paginanummer (0,1,2,3)
  453. Uit:         HL           = Segmentcode
  454.              A            = Segmentsoort code (255 = FSeg, 0 = Pseg)
  455.  
  456.              Deze functie dient op vanuit een programma onder Disk
  457.              BASIC toch de `onderste' 32 kB van het TPA aan te kunnen
  458.              spreken. MemMan laat die twee segmenten normaal gespro-
  459.              ken ongemoeid, omdat er wel eens RAMcartridges in zouden
  460.              kunnen zitten, of bijvoorbeeld BASIC's RAMdisk. Gebruik
  461.              ervan is dus op eigen risico. Controleer indien nodig
  462.              wel of het om FSegs gaat!
  463.  
  464.  
  465. Naam:        StoSeg
  466. Nummer:      40
  467. Functie:     Huidige segmenten stand opslaan
  468. In:          HL           = Buffer adres (9 bytes groot)
  469.  
  470.              De voor MemMan bekende segmentcodes van de actief
  471.              aangeschakelde sloten worden opgeslagen in het buffer.
  472.              Deze segmentcodes zijn in beginsel door IniChk berekend
  473.              en later door de Use functies geupdate. De opgeslagen
  474.              stand is niet de huidige stand, maar de voor MemMan
  475.              bekende stand. TSR kunnen hiermee dus niet de actieve
  476.              stand opslaan.
  477.  
  478. Opm:         Deze functie mag niet worden aangeroepen via de EXTBIO
  479.              hook. Deze functie mag alleen worden uitgevoerd door
  480.              een rechtstreekse aanroep van de MemMan functie afhande-
  481.              lingsroutine. Het adres waarop deze routine aangeroepen
  482.              kan worden, kan via de info functie (50) worden verkre-
  483.              gen.
  484.              Natuurlijk kunnen ook de (Fast)CurSeg functies gebruikt
  485.              worden om de momentele segment-stand op te vragen.
  486.  
  487.  
  488. Naam:        RstSeg
  489. Nummer:      41
  490. Functie:     Opgeslagen segment-stand actief maken
  491. In:          HL           = Buffer adres
  492.  
  493.              De in het buffer opgeslagen segment-stand wordt weer
  494.              actief gemaakt en wordt opgeslagen voor CurSeg.
  495.  
  496. Opm:         Deze functie mag niet worden aangeroepen via de EXTBIO
  497.              hook. Deze functie mag alleen worden uitgevoerd door
  498.              een rechtstreekse aanroep van de MemMan functie afhande-
  499.              lingsroutine. Het adres waarop deze routine aangeroepen
  500.              kan worden, kan via de info functie (50) worden verkre-
  501.              gen.
  502.              Natuurlijk kunnen ook de (Fast)Use functies gebruikt
  503.              worden om een segment-stand te herstellen.
  504.  
  505.  
  506. Naam:        Info
  507. Nummer:      50
  508. Functie:     Geeft informatie over onder andere aanroep-adressen van
  509.              MemMan functies
  510. In:          B            = Informatie nummer (0..8)
  511. Uit:         HL           = Informatie
  512.  
  513.              Informatie nummer overzicht. Tussen haakjes staan de
  514.              equivalente MemMan functie codes:
  515.              0 - Aanroepadres van FastUse0 (functie 0)
  516.              1 - Aanroepadres van FastUse1 (functie 1)
  517.              2 - Aanroepadres van FastUse2 (functie 2)
  518.              3 - Aanroepadres van TsrCall (functie 63)
  519.              4 - Aanroepadres van BasicCall
  520.              5 - Aanroepadres van FastCurSeg (functie 32)
  521.              6 - Aanroepadres van MemMan, de functie-afhandelings-
  522.              routine
  523.              7 - Versienummer van MemMan, format: Versie #H.L
  524.              8 - Aanroepadres van XTsrCall (functie 61)
  525.              9 - Aanroepadres van GetMMSP
  526.              10 - Aanroepadres van SetMMSP
  527.  
  528.              De bovengenoemde functie-adressen mogen door een toe-
  529.              passingsprogramma of TSR rechtstreeks aangeroepen
  530.              worden. Alle entry adressen liggen gegarandeerd in
  531.              pagina 3.
  532.              De functies worden snel uitgevoerd omdat de MemMan CALL
  533.              naar de EXTBIO hook vervalt en de functie-codes in
  534.              registers D en E niet uitgeplozen hoeven worden. Een
  535.              ander voordeel is dat parameters ook via het register DE
  536.              doorgegeven kunnen worden, dit is vooral van belang bij
  537.              de TsrCall en BasicCall functies.
  538.              Bijvoorbeeld, de initialisatie routine van een TSR kan
  539.              de benodigde functieadressen via de INFO functie opvra-
  540.              gen en deze vervolgens voor later gebruik in de TSR
  541.              programmacode opslaan, wat de snelheid van het TSR
  542.              programma zeer ten goede kan komen.
  543.              Een exacte beschrijving van de bovenstaande functies
  544.              kan gevonden worden bij de MemMan functie waarvan het
  545.              nummer tussen haakjes is aangegeven.
  546.              Houd echter onder de aandacht dat de `snelle' functies
  547.              op de volgende punten van de gewone MemMan functies
  548.              verschillen:
  549.  
  550. fastUse?:    Schakelt een segment in in een bepaalde geheugen pagina.
  551.              Zie de omschrijving bij de memMan `Use' functies.
  552.  
  553. tsrCall:     Register [DE] wordt ongewijzigd aan de TSR doorgegeven.
  554.              Dit in tegenstelling tot functie 63 (TsrCall), register
  555.              DE is dan al bezet om het MemMan functienummer in op te
  556.              slaan.
  557.  
  558. xTsrCall:    Alle mainregisters (AF,HL,BC,DE) worden ongewijzigd aan
  559.              de TSR doorgegeven. De TSR-ID code dient in register IX
  560.              te worden geplaatst.
  561.  
  562. basicCall:   Heeft geen MemMan functie nummer.
  563. Functie:     Aanroepen van een routine in de BASIC ROM.
  564. In:          IX           = Call address in pagina 0 of 1
  565.              AF,HL,BC,DE  = dataregisters voor de BASIC-ROM
  566. Uit:         AF,HL,BC,E   = dataregisters van de BASIC-ROM
  567.                           Interrupts disabled
  568.  
  569.              Via deze functie kunnen TSR's een routine aanroepen die
  570.              zich in pagina 0 en/of pagina 1 van het BASIC-ROM
  571.              bevindt. De bios moet al in pagina 0 aangeschakeld
  572.              zijn. In pagina 1 wordt de BASIC ROM door MemMan aange-
  573.              schakeld.
  574.              Dit is bijvoorbeeld noodzakelijk om de math-pack rou-
  575.              tines aan te kunnen roepen die in pagina 0 van de BASIC
  576.              ROM zitten, maar tussendoor ook een aantal routines in
  577.              pagina 1 aanroepen.
  578.              De H.STKE (stack error) hook wordt afgebogen, zodat na
  579.              een eventueel op getreden BASIC error de interne stacks
  580.              van MemMan gereset kunnen worden.
  581.  
  582. fastCurSeg:  In register [A] komt geen zinnige waarde terug. De
  583.              MemMan CurSeg functie (32) geeft aan of het een FSEG/-
  584.              PSEG betreft.
  585.  
  586. memMan:      Heeft geen MemMan functienummer
  587. Functie:     Rechtstreeks aanroepen van een MemMan functie.
  588. In:          E            = MemMan functienummer
  589.              AF,HL,BC     = Dataregisters afhankelijk van de aan te
  590.                             roepen functie.
  591. Uit:         AF,HL,BC,DE  = dataregisters afhankelijk van de aan-
  592.                             geroepen functie.
  593.  
  594.              Een aanroep van deze routine heeft hetzelfde effect als
  595.              het aanroepen van een MemMan functie via de EXTBIO
  596.              hook. Doordat echter de aanroep naar de EXTBIO hook
  597.              vervalt, worden de overige uitbreidingen die aan deze
  598.              hook gekoppeld zijn niet aangeroepen. Hierdoor blijft
  599.              het stack gebruik beperkt en wordt de verwerkingssnel-
  600.              heid verhoogd.
  601.  
  602. GetMMSP:     Heeft geen MemMan functienummer
  603. Functie:     Opvragen adres interne MemMan Stack Pointer
  604. In:          Niets
  605. Uit:         HL           = Interne stackpointer van de TSR-Manager.
  606.  
  607. SetMMSP:     Heeft geen MemMan functienummer
  608. Functie:     Instellen adres interne MemMan Stack Pointer
  609. In:          HL           = Nieuwe waarde voor interne stackpointer
  610.                             van de TSR-Manager.
  611. Uit:         Niets
  612.  
  613.              TSR's kunnen met deze twee functies de interne stack
  614.              pointer van MemMan opvragen, en weer herstellen wanneer
  615.              een bepaalde TSR niet netjes is teruggekeerd naar het
  616.              returnadres van de TSR-Manager. 
  617.              Dat is bijvoorbeeld nodig als een programma de Expres-
  618.              sie evaluator in het BASIC ROM aanroept en fouten zelf
  619.              wil afhandelen. Het kan dan namelijk zijn dat de ExpEval
  620.              een TSR aanroept, die zelf weer ExpEval aanroept en er
  621.              op dat moment een fout optreedt. Dan blijft er rotzooi
  622.              op de MemMan stack achter. Als na dergelijke fouten de
  623.              errorhandler van MSX BASIC gebruikt wordt is er niets
  624.              aan de hand: dan maakt MemMan zijn stack zelf schoon.
  625.  
  626.              Voorbeeld:
  627.              ; Dit is een voorbeeld van een goede aanroep van de
  628.              ; expressieevaluator in het BASIC ROM, zoals die in
  629.              ; een programma voor kan komen.
  630.              ...
  631.              ld (saveSP),sp          ;Bewaar SP van TSR-programma
  632.              call getMMSP
  633.              ld (saveMMSP),hl        ;Bewaar SP van MemMan
  634.              aanroep frmEval         ;Evalueer expressie (BIOS)
  635.              ...
  636.              jp main
  637.  
  638.              ; Deze routine hangt aan de H.ERRO
  639.              ; wordt aangeroepen indien er een
  640.              ; fout in de expressie zat
  641.              ld sp,(saveSP)          ;Herstel de TSR-stack
  642.              ld hl,(saveMMSP)
  643.              call setMMSP            ;Herstel de MemMan stack
  644.              jp main                 ;Doe alsof niets gebeurd is...
  645.  
  646.  
  647. Naam:        XTsrCall
  648. Nummer:      61
  649. Functie:     Roep het driver-entry van een TSR aan
  650. In:          IX           = ID code van de aan te roepen TSR
  651.              AF,HL,BC,DE  = worden ongewijzigd doorgeven aan de TSR.
  652. Uit:         AF,HL,BC,DE  = komen ongewijzigd terug van de TSR.
  653.  
  654.              Deze functie is een verbeterde versie van de functie
  655.              TsrCall (63). Omdat met deze functie alle main-regis-
  656.              ters aan de TSR kunnen worden doorgegeven, verdient het
  657.              aanbeveling om deze functie te gebruiken in plaats van
  658.              functie 63.
  659.  
  660. Opm:         Deze functie mag niet worden aangeroepen via de EXTBIO
  661.              hook, omdat bij een aanroep via EXTBIO het IX-register
  662.              verminkt wordt. Roep deze functie daarom rechtstreeks
  663.              aan, of gebruik de MemMan functie-afhandelingsroutine.
  664.              De adressen waarop deze routines aangeroepen kunnen
  665.              worden, kunnen via de info functie (50) worden opge-
  666.              vraagd.
  667.  
  668.  
  669. Naam:        GetTsrID
  670. Nummer:      62
  671. Functie:     Bepaal TSR ID code
  672. In:          HL           = Pointer naar de TsrNaam (12 tekens).
  673.                             Ongebruikte posities opvullen met spa-
  674.                             ties.
  675. Uit:         Carry        = Clear (NC) als TSR gevonden is, Set (C)
  676.                             als TSR niet gevonden is.
  677.              BC           = TSR ID code
  678.  
  679.  
  680. Naam:        TsrCall
  681. Nummer:      63
  682. Functie:     Roep het driver-entry van een TSR aan
  683. In:          BC           = ID code van de aan te roepen TSR
  684.              AF,HL,DE     = worden ongewijzigd doorgeven aan de TSR.
  685. Uit:         AF,HL,BC,DE  = komen ongewijzigd terug van de TSR.
  686.  
  687.              Merk op dat alhoewel het DE register ongewijzigd aan de
  688.              TSR wordt doorgegeven, het niet voor parameter-invoer
  689.              benut kan worden. De Extended BIOS functiecode van
  690.              MemMan (D='M' E=63) moet namelijk in dat register
  691.              geplaatst worden.
  692.              Bij de Fast-TsrCall routine treedt deze complicatie
  693.              niet op; het adres van deze routine kan middels de info
  694.              functie opgevraagd worden.
  695.  
  696.  
  697. Naam:        HeapAlloc
  698. Nummer:      70
  699. Functie:     Alloceer ruimte in de heap
  700. In:          HL           = Gewenste grootte van de ruimte (in bytes)
  701. Uit:         HL           = &h0000 als er onvoldoende ruimte was,
  702.                             anders het startadres van de ruimte.
  703.  
  704.              Door middel van deze functie kan een stuk geheugen
  705.              gealloceerd worden. Het geheugenblok zal zich gegaran-
  706.              deerd in pagina 3 bevinden.
  707.              De heap is vooral nuttig voor TSR programma's, die hem
  708.              bijvoorbeeld als tijdelijke of permanente diskbuffer
  709.              kunnen gebruiken. Ook andere buffers - waarvan het
  710.              absoluut noodzakelijk is dat ze zich in pagina 3 bevin-
  711.              den - kunnen op de heap worden geplaatst.
  712.              Aangevraagde blokken geheugen uit de heap blijven
  713.              onbruikbaar voor andere programma's totdat een `Heap-
  714.              DeAlloc' is uitgevoerd (functie 71).
  715.              De grootte van de heap kan worden ingesteld door middel
  716.              van het configuratie programma CFGMMAN.
  717.  
  718.  
  719. Naam:        HeapDeAlloc
  720. Nummer:      71
  721. Functie:     Geef geAlloceerde ruimte van de heap weer vrij
  722. In:          HL           = Startadres van de ruimte
  723.  
  724.  
  725. Naam:        HeapMax
  726. Nummer:      72
  727. Functie:     Geef de lengte van het grootste vrije blok geheugen in
  728.              de heap terug
  729. Uit:         HL           = Lengte van het grootste vrije blok
  730.  
  731.  
  732. Gebruik van de stack onder MemMan
  733. ---------------------------------
  734.  
  735. MemMan toepassingsprogramma's dienen de stack pointer (SP) bij
  736. voorkeur in pagina 2 of 3 (tussen &h8000 en &hFFFF) te plaatsen.
  737. Indien MemMan door een hook-aanroep geactiveerd wordt, wordt het
  738. huidige segment in pagina 1 (&h4000 tot &h8000) namelijk weggescha-
  739. keld om plaats te maken voor de TSR-Manager en de eventuele TSR's.
  740. Indien de stack zich op dat moment in pagina 1 bevindt zal de compu-
  741. ter vastlopen.
  742.  
  743. Indien TSR's na een BDOS call of interrupt via een BIOS-hook worden
  744. aangeroepen treden geen stackproblemen op; ook niet indien de stack
  745. van het toepassingsprogramma in pagina 1 staat. De BDOS en interrupt-
  746. functies gebruiken namelijk hun eigen stack in pagina 3. De stack
  747. bevindt zich dan alsnog in pagina 3 op het moment dat de hook aange-
  748. roepen wordt.
  749.  
  750. Bestaande CP/M en MSX-DOS programmatuur is dus zonder problemen in
  751. combinatie met MemMan 2 te gebruiken - maar alleen indien de stan-
  752. daard BDOS calls gebruikt worden. Wanneer echter via een interslot
  753. call een BIOS routine rechtstreeks aangeroepen wordt, dient de stack
  754. in pagina 2 of 3 te staan. Reserveer in dat geval minimaal 150 bytes
  755. voor de stack.
  756.  
  757.  
  758. Appendix 1: BIOS aanroepen onder Turbo Pascal
  759. ---------------------------------------------
  760.  
  761. Indien in een Turbo Pascal programma interslot-calls naar de BIOS
  762. gebruikt worden, is het belangrijk dat de stack in pagina 2 of 3
  763. staat. Op het moment dat de BIOS dan een hook aanroept kan MemMan
  764. veilig de TSR's aktiveren. De positie van de stack is afhankelijk
  765. van het maximum programma adres dat tijdens de compilatie in Turbo
  766. Pascal is ingesteld. De stack bevindt zich in Turbo Pascal direkt
  767. onder het variabelen geheugen. Het variabelen geheugen dient bij
  768. programma's die de BIOS aanroepen dus ruim boven adres &h8000 ge-
  769. plaatst te worden.
  770.  
  771. Is geen source voorhanden, dan is het mogelijk om met een debugger
  772. het stack adres van Turbo Pascal programma's aan te passen. De
  773. initialisatie code van een TP programma ziet er als volgt uit:
  774.  
  775.   start: jp init
  776.          ...
  777.          ...
  778.   init:  ld sp,100h
  779.          ld hl,nn
  780.          ld de,nn
  781.          ld bc,nn
  782.          call yy
  783.          ld hl,nn
  784.          ld de,stack    ;DE bevat het stack adres, hoeft
  785.          ld bc,nn       ; alleen aangepast te worden als het
  786.          call zz        ; lager is dan &h80A0
  787.          ...
  788.  
  789. Het stackadres in register DE kan bijvoorbeeld op &hC100 gezet
  790. worden.
  791.  
  792.  
  793. Appendix 2: Tips en aanwijzingen voor programmeurs
  794. --------------------------------------------------
  795.  
  796. Omdat de EXTBIO hook gebruikt wordt voor diverse systeem uitbrei-
  797. dingen zoals Kanji en RS232 interfaces, is het mogelijk dat MemMan
  798. functie-aanroepen bijzonder langzaam verwerkt worden. De prestaties
  799. van de MemMan toepassingsprogramma's kunnen aanmerkelijk worden
  800. verhoogd door functie afhandelingsroutine van MemMan rechtstreeks aan
  801. te roepen, in plaats van de EXTBIO hook. Het adres waarop de functie
  802. afhandelingsroutine aangeroepen kan worden, kan worden opgevraagd via
  803. de info functie (50). Ook IniChk (30) geeft sinds versie 2.4 het
  804. adres van de functieafhandelingsroutine in HL terug, zodat het meteen
  805. in het programma ingevuld kan worden.
  806.  
  807. De meeste MemMan functies bevinden zich in een apart geheugensegment
  808. in pagina 1. Deze functies schakelen over op een een interne stack,
  809. waardoor MemMan toepassingsprogramma's met een betrekkelijk kleine
  810. stack kunnen volstaan. Door een MemMan functie worden maximaal
  811. twintig bytes op de stack van het toepassingsprogramma geplaatst. Dit
  812. geldt echter alleen indien de functie rechtstreeks, of via de MemMan
  813. functie-afhandelingsroutine wordt aangeroepen. Een functie-aanroep
  814. via de EXTBIO hook kan echter een bijzonder grote stack vereisen. Dit
  815. wordt veroorzaakt doordat alle uitbreidings-modules die aan de EXTBIO
  816. hook gekoppeld zijn elkaar aanroepen, net zo lang totdat één module
  817. de functieaanroep herkent. Wanneer er tussendoor ook nog interrupts
  818. afgehandeld worden, kan het stackgebruik sterk oplopen. Al met al kan
  819. gesteld worden dat er bij een aanroep van de EXTBIO hook minimaal 150
  820. bytes stackruimte beschikbaar moet zijn. Ook om deze reden is het
  821. verstandig om de MemMan functie-afhandelingsroutine te gebruiken in
  822. plaats van de EXTBIO hook.
  823.  
  824. MemMan versie 1.1 bevat nog een aantal bugs die in versie 2 opgelost
  825. zijn. Het voordeel van MemMan 1.1 is echter dat er geen extra segment
  826. gebruikt wordt, en het programma dus ook loopt op 64 kB computers.
  827. Het is echter ondoenlijk om voor die beperkte groep MemMan 1.1 nog up
  828. to date te houden. Om een programma ook op 64 kB computers te laten
  829. werken adviseren wij dan ook wanneer MemMan niet aanwezig is zelf 64
  830. kB RAM in te schakelen en te gebruiken, of eventueel zelfs de hele
  831. mapper. Onder DOS is er om 64 kB RAM in te schakelen immers geen
  832. MemMan nodig, en vanuit MSX Basic kan het met MemMan 1.1 toch niet
  833. netjes. MemMan versie 1.1 zal niet verder ontwikkeld worden.
  834.  
  835. Bij het programmeren van TSR's kan sinds versie 2.4 gebruikt gemaakt
  836. worden van de MemMan functie-afhandelingsroutine op adres &h4002, die
  837. daar altijd staat als er een TSR-segment ingeschakeld is. dat maakt
  838. de code in TSR's sneller en een stuk overzichtelijker!
  839.  
  840. Maak bij het schrijven van de VDP registers altijd gebruik van de
  841. daarvoor bedoelde BIOS routines! Dan worden namelijk ook de systeem-
  842. variabelen in pagina 3 bijgehouden, en sommige TSR's (CurBlink,
  843. screendumpers, screensavers, debuggers, memory viewers) maken daar
  844. gebruik van. Bijvoorbeeld om te achterhalen wel schermtype er op dit
  845. moment actief is of waar de sprite-tabellen staan. Ook het beschrij-
  846. ven van de palet-registers dient via de BIOS te gebeuren, zodat de
  847. informatie in het VRAM ook bijgewerkt wordt. Alleen als dat VRAM
  848. absoluut voor andere zaken nodig is (Bijvoorbeeld bij een VDP(24)
  849. scroll) moet hiervan helaas afgeweken worden.
  850.  
  851. Zet de interupts uit bij het sturen van een blok data naar het VRAM.
  852. Het is mogelijk dat een TSR die tussendoor actief wordt iets uit het
  853. VRAM leest of er naar schrijft, en dan wordt de lees/schrijfpointer
  854. van de VDP gewijzigd. Let er op dat sommige BIOS routines de inter-
  855. rupts zelf aanzetten! In die gevallen kan er in het hoofdprogramma
  856. (in TSR kan het ook, maar dan moet de toestand van het bit eerst
  857. gelezen en bewaard worden) gebruik gemaakt worden van het Interupt
  858. Enable bit in de VDP. Door die uit te zetten genereerd de VDP geen
  859. interrupts meer. Een DI is nog steeds nodig, er zijn namelijk ook
  860. cartridges die interrupts kunnen genereren, maar het is iets veili-
  861. ger.
  862.  
  863. Het aanvragen van segmenten (ALLOC) uit een interrupt routine kan
  864. tot het ophangen van de machine leiden. Dit omdat DOS2 niet reentrant
  865. is. Als DOS2 actief is op moment dat een interrupt optreedt en uit de
  866. interrupt routine wordt DOS2 nogmaals aangeroepen wordt onder andere
  867. de interne stack van DOS2 overschreven. En ALLOC roept (als DOS2
  868. aanwezig is) de DOS2 mapper support routines aan. Een goede en
  869. afdoende oplossing voor dit probleem is nog niet bekend. Voor DEALLOC
  870. geldt waarschijnlijk hetzelfde. USE, zo leert de ervaring met de
  871. printerbuffer, levert geen enkel probleem op.
  872.  
  873. Laat programma's een vastgesteld maximum aantal segmenten aanvragen.
  874. Er bestaan 4 MB Memory Mappers, en het is niet eens erg ingewikkeld
  875. om acht van die dingen via twee slotexpanders op een MSX aan te
  876. sluiten. Dat levert een totaal van meer dan 32 MB (2048 segmenten)
  877. op. Meer segmenten aanvragen dan nodig is kost slechts nodeloos tijd
  878. en ruimte. Overigens heeft bijvoorbeeld BK ook een grens, die vraagt
  879. maximaal 4 MB aan. In versie 1.02 gaat het echter toch fout als die
  880. 4 MB ook daadwerkelijk beschikbaar blijkt te zijn... De oplossing is
  881. in dat geval een voldoende grote RAMdisk of printerbuffer installe-
  882. ren. De tekstverwerker TED doet het wel foutloos: die vraagt maximaal
  883. 2 MB aan bij MemMan.
  884.  
  885. Het is handig om TSR's die BASIC op de één of andere manier uitbrei-
  886. den te voorzien ook `CMD HELP' te laten herkennen en een kort over-
  887. zicht van de mogelijkheden te laten afdrukken. Door de `QuitHook'
  888. vlag bij het verlaten niet te zetten en de stack in tact te laten
  889. worden ook de CMD HELPS's van andere TSR's (en uiteindelijk die van
  890. `MST TsrUtils', die de foutmelding van BASIC onderdrukt) ook uitge-
  891. voerd.
  892.  
  893. Vergeet nooit op de aanwezigheid en (ook in TSR's!) het versienummer
  894. van MemMan te testen. Vereis minimaal 2.3(1), of beter nog: 2.4. Die
  895. versie kan gewoon met het programma verspreid worden, dus een beper-
  896. king hoeft dat niet te zijn.
  897.  
  898. Het is vaak makkelijk het huidige segment in pagina 2 en eventueel
  899. (voor programma's onder Disk BASIC) de TPA segmenten 0 en 1, die
  900. tegenwoordig met GetTPA achterhaald kunnen worden in de segmententa-
  901. bel te zetten. Let er echter op het aanroepen van DeAlloc voor die
  902. segmenten niet nodig is. MemMan controleert de aan DeAlloc aangeboden
  903. segmentcodes namelijk niet en gaat fouten maken!
  904.  
  905.  
  906. ** Einde **
  907.