[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]
{
HENRIK SCHMIDT-MOELLER
I've made some procedures for EMS addressing in TP. EMS uses a technic called
bank switching. It reserves a 64k area (EmmSeg) in memory for EMS and maps/
unmaps 16k EMS-pages in this area. Look at interrupt 67h for a complete list of
EMS commands. I haven't had time to comment on these procedures, so if you
don't understand them, feel free to ask. OK, here goes nothing...
Oh, by the way, REMEMBER to DEallocate!!!
}
VAR
EmmSeg,
EmmHandle : Word;
Err : Byte;
PROCEDURE DeallocateMem(Handle : Word); Forward;
PROCEDURE Error(E : String);
BEGIN
DeallocateMem(Emmhandle);
WriteLn(#7 + E);
Halt(1);
END;
PROCEDURE AllocateMem(LogPages : Word);
BEGIN
ASM
MOV AH, 43h
MOV BX, LogPages
INT 67h
MOV Err, AH
MOV EmmHandle, DX
END;
CASE Err OF
$80 : Error('AllocateMem: Internal error in EMS software');
$81 : Error('AllocateMem: Malfunction in EMS software');
$84 : Error('AllocateMem: Undefined function');
$85 : Error('AllocateMem: No more handles available');
$87 : Error('AllocateMem: Allocation requested more pages than are' + #13#10 +
' physically available; no pages allocated');
$88 : Error('AllocateMem: Specified more logical pages than are'+ #13#10 +
' currently available; no pages allocated');
$89 : Error('AllocateMem: Zero pages requested');
END;
END;
PROCEDURE MapEmm(PsyPage : Byte; LogPage : Word);
BEGIN
ASM
MOV AH, 44h
MOV AL, PsyPage
MOV BX, LogPage
MOV DX, EmmHandle
INT 67h
MOV Err, AH;
END;
CASE Err OF
$80 : Error('MapEmm: Internal error in EMS software');
$81 : Error('MapEmm: Malfunction in EMS software');
$83 : Error('MapEmm: Invalid handle');
$84 : Error('MapEmm: Undefined function');
$8A : Error('MapEmm: Logical page not assigned to this handle');
$8B : Error('MapEmm: Physical page number invalid');
END;
END;
PROCEDURE DeallocateMem(Handle : Word);
BEGIN
ASM
MOV AH, 45h
MOV DX, Handle
INT 67h
END;
END;
PROCEDURE GetPageSeg;
BEGIN
ASM
MOV AH, 41h
INT 67h
MOV EmmSeg, BX
MOV Err, AH;
END;
CASE Err OF
$80 : Error('GetPageSeg: Internal error in EMS software');
$81 : Error('GetPageSeg: Malfunction in EMS software');
$84 : Error('GetPageSeg: Undefined function');
END;
END;
PROCEDURE GetMaxPages(VAR Num : Word);
VAR
Dummy : Word;
BEGIN
ASM
MOV AH, 42h
INT 67h
MOV Dummy, BX
MOV Err, AH;
END;
Num := Dummy;
CASE Err OF
$80 : Error('GetMaxPages: Internal error in EMS software');
$81 : Error('GetMaxPages: Malfunction in EMS software');
$84 : Error('GetMaxPages: Undefined function');
END;
END;
PROCEDURE WriteMem(Page : Byte; Pos : Integer; Ch : Char);
BEGIN
Mem[EmmSeg : Page * $4000 + Pos] := Ord(Ch);
END;
PROCEDURE ReadMem(Page : Byte; Pos : Integer; VAR Ch : Char);
BEGIN
Ch := Chr(Mem[EmmSeg : Page * $4000 + Pos]);
END;
[Back to MEMORY SWAG index] [Back to Main SWAG index] [Original]