MEMORY
Manažer paměti
V systému Litos8 sdílí aplikace i systém společný adresový prostor v prvních 64 KB paměti RAM (tj. všechny segmentové registry jsou nastaveny na 0). Jádro systému sídlí v horní polovině segmentu 64 KB (ve verzi 1.0 startuje jádro od adresy 7500h, rezidentní začátek je od adresy asi 8000h). Uživatelská aplikace se zavádí od adresy 1000h. Oblast paměti od 0 po asi 0600h je vyhrazena pro BIOS (včetně adres vektorů INT). Oblast od 0C00h po 1000h je rezervována pro adresy skoků do systémových funkcí (API). Ve zbylém prostoru 0600h až 0C00h leží implicitní zásobník.
Po startu je aplikaci přidělen paměťový blok podle údaje v hlavičce programu. Zbylý prostor je ponechán jako volný, dokud si o něj aplikace nezažádá. Paměť je systémem přidělována buď po násobcích 1 KB nebo (u paměťového bloku pod 1 KB) ve velikostech mocniny dvou: 8, 16, 32, 64, 128, 256 nebo 512 bajtů.
Při alokaci malých bloků jsou 1 KB stránky rozdělovány na segmenty o stejné velikosti. Např. si aplikace zažádá o 13 bajtů paměti. Systém nejdříve stanoví nejbližší vyšší modul velikosti mocniny dvou, tj. zaokrouhlí požadavek na 16 bajtů. Podívá se do tabulky volných 16bajtových bloků a když nemá žádný blok k dispozici, alokuje si nejdříve novou 1 KB stránku, tu rozdělí na 64 volných 16bajtových bloků a z nich aplikaci jeden přidělí.
Při uvolňování bloku převede systém nejdříve adresu bloku na číslo 1 KB stránky. Z tabulky zjistí modul velikosti bloků v této stránce - tj. např. 16 bajtů. Označí blok v tabulce 16bajtových bloků jako volný a sníží počítadlo alokovaných bloků v této 1 KB stránce. Pokud počítadlo dosáhne nuly, stránku 1 KB uvolní.
MemAlloc - allocate memory block
INTPUT:
AX = required size of memory block (0...)
OUTPUT:
AX = address of memory block (NC), or 0 (NULL) on error (CY)
CY = allocation error
MemFree - free memory block
INPUT:
AX = block address (can be NULL)
OUTPUT:
AX = block address, or 0 (NULL) if invalid memory block (CY)
CY = invalid memory block
MemResize - resize memory block
INTPUT:
AX = required new size of memory block (0 = delete block)
BX = address of memory block (NULL = create new block)
OUTPUT:
AX = new address of memory block (NC), or 0 (NULL) on error (CY)
CY = allocation error
MemDup - duplicate memory block
INTPUT:
BX = address of memory block (NULL = create new block)
OUTPUT:
AX = address of new memory block (NC) or 0 (NULL) on error (CY)
CY = allocation error
MemGetSize - get memory block size, check block address validity
INPUT:
AX = block address (can be NULL)
OUTPUT:
AX = block size (NC), or 0 if invalid memory block (CY)
CY = invalid memory block (AX = 0)
MemMaxFree - get maximum available memory block
OUTPUT:
AX = max. size of free memory space
MemGetFreeTotal - get total free memory
OUTPUT:
AX = total free memory (in bytes)
MemGetUsedTotal - get total used memory
OUTPUT:
AX = total used memory (in bytes)
GetSysMemSize - get size of system memory (640 KB)
OUTPUT:
AX = size of system memory (in KB)