[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]

    CONST
      { Constants for bit plane, video page, and memory block sizes: }
      MonoBase      = $B000;     { Segment offset of MDA/Herc video buffer  }
      CGABase       = $B800;     { Segment offset of CGA video buffer       }
      EGAVGABase    = $A000;     { Segment offset of EGA/VGA video buffer   }

      { Size of one video page buffer in modes 0..3: }
      TxtVidPageSize   : Array[0..3] of Word = ($800,$800,$1000,$1000);
      { Actual number of bytes used in these buffers }
      TxtVidPageFilled : Array[0..3] of Word = (2000,2000,4000,4000);

      CGAMemBankSize    = $2000; { Size of one CGA memory bank in modes 4, 5 and 6}
      CGAMemBankFilled  = 8000;  { Actual number of bytes used in that bank       }
      HercMemBankSize   = $2000; { Size of one Hercules memory bank               }
      HercMemBankFilled = 7830;  { Actual number of bytes used in that bank       }
      VGA256MemBankSize = 64000;

      MDAPageSize   = 4000;      { Size of MDA text buffer }
      V400PageSize  = 32000;     { Size video page in V400VM mode }

    FUNCTION GetVidMode: Byte;
      VAR Regs : Registers;
      BEGIN
        Regs.AH := $0F;
        Intr($10,Regs);
        GetVidMode := Regs.AL;
      END; { GetVidMode }

    FUNCTION VidAddress: Pointer;
      VAR VM: Byte;
      BEGIN
        VM := GetVidMode;
        CASE VM OF
          0..3   : VidAddress := Ptr(CGABase,GetVisualPage * TxtVidPageSize[VM]);
          4..6   : VidAddress := Ptr(CGABase,0);
          7      : VidAddress := Ptr(MonoBase,0);  { Also HercVM }
          13..19 : VidAddress := Ptr(EGAVGABase,0);
          V400VM : VidAddress := Ptr(EGAVGABase,GetVisualPage * V400PageSize);
          ELSE     DumBool := CheckError(TRUE,'VIDADDRESS',68);
        END;
      END; { VidAddress }

[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]