[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]