
*** Is de omschrijving van functie -1 wel verwijderd?? ***


MEMMAN versie 2.0 specificaties
-------------------------------

Beknopte omschrijving van enkele gebruikte termen:

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 aangeschakelt. 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    - Dynamisch blok geheugen waarvan een stuk aan te vragen en daarna
          vrij te gebruiken is. Dit is ingebouwd voor programma's als een
          Ramdisk welke sector buffers in pagina 3 aan moeten maken.

FastUse - Zelfde als Use, maar dan het adres waarop de routine direct aan te
          roepen is. Een aantal controles op de juiste segmentsoort worden bij
          het gebruik van FastUse ook overgeslagen. Normaal zal de gewone Use
          entry voldoen, maar programma's die echt snel moeten zijn kunnen
          deze adressen gebruiken.

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
          11. Normaal hoeft een segment niet de Reserved status gegeven te
          worden. Pas als een segment door een TSR aangevraagd wordt is het
          noodzakelijk om dit te doen.


Naam   : Use0
Nummer : 0
Functie: Actief maken van een segment op pagina 0 (0000..3FFF)
In     : HL = Segmentcode
Uit    : A  = Resultaatcode (-1 = Mislukt, 0 = Gelukt)


Naam   : Use1
Nummer : 1
Functie: Actief maken van een segment op pagina 1 (4000..7FFF)
In     : HL = Segmentcode
Uit    : A  = Resultaatcode (-1 = Mislukt, 0 = Gelukt)


Naam   : Use2
Nummer : 2
Functie: Actief maken van een segment op pagina 2 (8000..BFFF)
In     : HL = Segmentcode
Uit    : A  = Resultaatcode (-1 = Mislukt, 0 = Gelukt)


Naam   : Alloc
Nummer : 10
Functie: Aanvragen van een segment
In     : B  = Segment voorkeuze code
Uit    : HL = Segmentcode. (0000 = Geen segment meer vrij)
         B  = Segmentsoort code (-1 = FSeg, 0 = PSeg)

Segment voorkeuze code overzicht:

Register B: Bit 7 6 5 4 3 2 1 0
	  ^ ^ ^ ^ ^ ^ ^ ^
	  | | | | | | | |
	  | | | | | | +-+--> Segment Type. 00 = PSEG0000
	  | 0 0 0 0 0	          01 = PSEG4000
	  |	          10 = PSEG8000
	  |	          11 = FSEG
	  +----------------> Prefereer Niet-Expanded Slot

De bits 6 tot en met 2 zijn niet gebruikt en moeten 0 zijn.


Naam   : SetRes
Nummer : 11
Functie: Segment de Reserved status geven
In     : HL = Segmentcode


Naam   : DeAlloc
Nummer : 20
Functie: Teruggeven van een segment
In     : HL = Segmentcode

Als er onder dos2 gewerkt wordt, dan wordt het vrijgekomen segment, mits het
een segment is dat dos2 in zijn beheer had, teruggegeven aan dos2.

Naam   : ClrRes
Nummer : 21
Functie: Reserved status van een segment opheffen
In     : HL = Segmentcode

Het is niet nodig deze functie voor DeAlloc aan te roepen. DeAlloc wist
zelf al de Reserved status van een segment.


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)

Deze routine telt de waarde "M" op bij A waardoor er een MemMan aanwezigheids
controle mee uitgevoerd kan worden. In DE komt het versienummer terug. Verder
wordt er een UnCrash uitgevoerd en worden de segmentcodes van de actief
aangeschakelde sloten berekend en opgeslagen voor GetCur. Als er onder dos2
gewerkt wordt, dan worden alle vrijgekomen segmenten, mits ze door dos2 in
beheer waren toen wij ze aanvroegen, meteen teruggegeven aan dos2.


Naam   : Status
Nummer : 31
Functie: Status gegevens van MemMan ophalen
Uit    : HL = Aantal aanwezige segmenten
         BC = Aantal nog vrije segmenten
         A  = Connected Status van de aangesloten hardware.

Alleen het aantal 'echte' segmenten wordt geteld. De extra bijgemaakte
segmenten voor ROM-Registratie etc worden niet getelt. Als bit 0 van
de Connected Status gezet is, dan is dos2.20 aanwezig. Bij het aantal
nog vrij segmenten zitten ook de segmenten die nog bij dos2 aanwezig zijn,
deze hoeven niet noodzakelijkerwijs nog beschikbaar te zijn. Onder dos1
is dit getal wel precies.


Naam   : CurSeg
Nummer : 32
Functie: Segmentcode van een aangeschakeld segment ophalen
In     : B  = Paginanummer (0,1,2)
Uit    : HL = Segmentcode
         A  = Segmentsoort code (-1 = FSeg, 0 = Pseg)

Als HL de waarde 0000 bevat na aanroep van deze functie, dan is de
segmentcode van de aangevraagde pagina niet te bepalen. Dit kan alleen
voorkomen als een onbekend slot aangeschakelt staat en MemMan dit slot
niet kan reserveren in de segmenten tabel. De kans dat dit gebeurt is
heel erg klein.


Naam   : NowSeg
Nummer : 33
Functie: Bepaal de actieve segmentcode van een pagina en geef deze terug
In     : B  = Paginanummer (0..3)
Uit    : HL = Segmentcode
         A  = Segmentsoort code (-1 = FSeg, 0 = PSeg)

Deze functie geeft dezelfde gegevens terug als CurSeg (functie 32), alleen
bepaald deze functie eerst opnieuw de huidige segmentcode aan de hand van
de actieve slotstand. Deze functie moet gebruikt worden door TSRs omdat deze
niet zeker weten wat de actieve stand is van een bepaalde pagina. De codes
worden niet opgeslagen in een of andere tabel. De resultaten van CurSeg
bijvoorbeeld worden dus niet beinvloed.


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 de codes welke
in beginsel door IniChk berekend zijn en later door de Use functies geupdate
zijn. De opgeslagen stand is niet de huidige stand, maar de voor MemMan
bekende stand. TSR kunnen hiermee dus niet de actieve stand opslaan.


Naam   : RstSeg
Nummer : 41
Functie: Opgeslagen segmenten stand actief maken
In     : HL = Buffer adres

Deze routine schakelt een opgeslagen segmenten stand weer terug. De gegevens
die GetCur terug geeft zijn weer net zo als op het moment waarop de codes
opgeslagen werden met StoCur. Ook de slotstanden worden aangepast aan de hand
van de opgeslagen segmentcodes.


Naam   : Info
Nummer : 50
Functie: Verschillende soorten informatie omtrend MemMan
In     : B  = Informatie nummer (1..6)
Uit    : HL = Informatie

Informatie nummers overzicht:

0 - FastUse0 adres (functie 1)
1 - FastUse1 adres (functie 2)
2 - FastUse2 adres (functie 3)
3 - TsrCall adres (functie 61)
4 - NowSeg adres (functie 33)


Naam   : Get TSR-ID
Nummer : 60
Functie: Bepaal TSR ID code
In     : HL = Pointer naar de TsrNaam (12 tekens)
Uit    : Gevonden: IX = TSR ID
         Anders  : IX = 0000


Naam   : HeapAlloc
Nummer : 70
Functie: Alloceer ruimte in de heap
In     : HL = Gewenste grootte van de ruimte
Uit    : Genoeg ruimte: HL = Startadres van de ruimte
         Anders       : HL = 0000 -> Geen ruimte beschikbaar


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 vrij blok


Naam   : TsrInfo   *** Niet Publiceren, Alleen voor INTERN gebruik ***
Nummer : -1
Functie: Verschillende soorten informatie omtrend de TsrManager
In     : B = Informatie nummer (0..3)

Informatie nummers overzicht:

0 - TsrMan segmentcode
1 - HookIn adres
2 - TsrMan overhead lengte
3 - TsrMan versie nummer


Nog enkele opmerkingen omtrend TSR's:

Een geactiveerde TSR mag niet zomaar IniChk aanroepen. Dit zou nare gevolgen
voor een programma, dat ook van MemMan gebruik maakt, hebben. Alle door dat
programma aangevraagde segmenten zouden dan in een keer weer vrij zijn.

Voordat een segment geschakeld kan worden vanuit een TSR, moet eerste de
actieve stand bepaald worden. Omdat TSR meestal aan hooks hangen, is de
stand op dat moment niet bekend bij MemMan. Het is daarom niet mogelijk om
via functie 32 de stand te bepalen. Hiervoor moet functie 33 gebruikt worden.

Wees er zeker van dat de door een TSR aangevraagde segmenten de Reserved
status hebben, anders zou bij het opstarten van een MemMan applicatie
programma het segment weer vrij worden gegeven, omdat deze programma's altijd
eerst IniChk aanroepen en deze meteen met het UnCrashen van segmenten begint.

Als een TSR weer verwijderd wordt, dan wordt het KILL adres van de TSR
aangeroepen. Op dat moment moeten alle segmenten weer terug worden gegeven
en het op de heap gealloceerde geheugen weer vrij worden gegeven. Gebeurt
dit niet, dan zullen er niet meer terug te vinden stukken geheugen op de
heap en eventuele segmenten opbruikbaar worden.

** Einde **
