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