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

    UNIT video;

    INTERFACE

    USES DOS;

    TYPE fontSize = (font8,font14,font16, unknownFontSize);
         adapterType = (none,mda,cga,egaMono,egaColor,vgaMono,
                       vgaColor,mcgaMono,mcgaColor);

    VAR  textBufferOrigin  : pointer; {pointer to text buffer}
         textBufferSeg     : word;
         textBufferSize    : word;    {size in bytes of...}
         visibleX,visibleY : byte;
         fontLines         : byte;

    function queryAdapterType : adapterType;
    function fontCode(h : byte) : fontSize; {convert from byte to enum}
    function getFontSize : fontSize; {normal 25 lines,ega 25 lines,vga 25 lines}
    function fontHeight(f : fontSize) : byte;
    procedure getTextBufferStats(var BX       : byte; {visible x dimentions}
                                 var BY       : byte; {visible y dimentions}
                                 var buffSize : word {refresh buffer size}
                                );
    const maxX                : integer = 79;
          maxY                : integer = 24;

    IMPLEMENTATION

    (******************************************************************************
    *                              queryAdapterType                              *
    ******************************************************************************)
    function queryAdapterType : adapterType;

    var         regs : Registers;
               code : byte;

    begin
            regs.ah := $1a; {vga identify}
            regs.al := $0;  {clear}
            intr($10,regs);
            if regs.al = $1a then { is this a bug ???? }
            begin {ps/2 bios search for ..}
                    case regs.bl of {code back in here}
                            $00 : queryAdapterType := none;
                            $01 : queryAdapterType := mda;
                            $02 : queryAdapterType := cga;
                            $04 : queryAdapterType := egaColor;
                            $05 : queryAdapterType := egaMono;
                            $07 : queryAdapterType := vgaMono;
                            $08 : queryAdapterType := vgaColor;
                            $0A,$0C : queryAdapterType := mcgaColor;
                            $0B : queryAdapterType := mcgaMono;
                            else queryAdapterType := cga;
                    end; {case}
            end {ps/2 search}
            else
            begin {look for ega bios}
                    regs.ah := $12;
                    regs.bx := $10; {bl=$10 retrn ega info if ega}
                    intr($10,regs);
                    if regs.bx <> $10 then {bx unchanged mean no ega}
                    begin
                            regs.ah := $12; {ega call again}
                            regs.bl := $10; {recheck}
                            intr($10,regs);
                            if (regs.bh = 0) then
                                    queryAdapterType := egaColor
                            else
                                    queryAdapterType := egaMono;
                    end {ega identification}
            else {mda or cga}
            begin
                    intr($11,regs); {get eqpt.}
                    code := (regs.al and $30) shr 4;
                    case code of
                            1,2 : queryAdapterType := cga;
                            3   : queryAdapterType := mda;
                            else queryAdapterType := none;
                    end; {case}
            end {mda, cga}
            end;
    end; {quertAdapterType}

    (******************************************************************************
    *                             getTextBufferStats                              *
    * return bx = #of columns, by = #of rows, buffSize = #of bytes in buffer      *
    ******************************************************************************)
    procedure getTextBufferStats;
    const screenLineMatrix : array[adapterType,fontSize] of integer =
            ( (25,25,25, -1) {none adapter}, (-1,25,-1, -1) {mda},
              (25,-1,-1, -1) {cga},(43,25,-1, -1) {egaMono}, (43,25,-1, -1) {egaColor},
              (50,28,25, -1) {vgaMono}, (50,28,25, -1) {vgaColor},
              (-1,-1,25, -1) {mcgaMono}, (-1,-1,25, -1) {mcgaColor} );
    {this matrix is saved in font8,font14,font16 sequence in rows of matrix}
    var
            regs:registers;
    begin
            regs.ah := $0f; {get current video mode}
            intr($10,regs);
            bx := regs.ah; {# of chars in a line, row}
            by := screenLineMatrix[queryAdapterType, getFontSize];
            if by > 0 then {legal height}
                    buffSize := bx * 2 * by
            else
                    buffSize := 0;
    end; {getTextBufferStats}

    (******************************************************************************
    *                                 getFontSize                                 *
    ******************************************************************************)
    function getFontSize : fontSize;
    var
            regs  : registers;
       fs    : fontSize;
       at    : adapterType;
    begin
       at := queryAdapterType;
            case at of
                    cga                 : fs := font8;
                    mda                 : fs := font14;
                    mcgaMono,
                    mcgaColor        : fs:= font16;
                    egaMono,
                    egaColor,
                    vgaMono,
                    vgaColor        : begin
                                            with regs do begin
                   (* check this interrupt call, there might be some bug,
                      either in the call conventions, or in the 3300A
                      bios. *)
                                                    ah := $11; {egavga call}
                                                    al := $30;
    (*                                                bl := $0;   *)
                                                    bh := $0;
                                            end; {with}
                                            intr($10,regs);
                                            fs := fontCode(regs.cl);
                   if (fs = unknownFontSize) then
                      fs := font16; { assume a work around in 330A screen}
                                    end; {ega vga}
            end; {case}
       getFontSize := fs;
    end; {getFontSize}

    (******************************************************************************
    *                                  fontCode                                   *
    * Convert from byte size to a fontSize type                                                                                 *
    ******************************************************************************)
    function fontCode;
    begin
            case h of
                     8 : fontCode := font8;
                    14 : fontCode := font14;
                    16 : fontCode := font16;
          else fontCode := unknownFontSize; { unKnown, assume 8 }
            end; {case}
    end; {fontCode}

    (******************************************************************************
    *                                 fontHeight                                 *
    ******************************************************************************)
    function fontHeight(f : fontSize) : byte;
    begin
            case f of
                    font8  : fontHeight := 8;
                    font14 : fontHeight := 14;
                    font16 : fontHeight := 16;
            end; {case}
    end; {fontHeight}

    begin
       getTextBufferStats(visibleX, visibleY, textBufferSize);
       maxX := visibleX - 1;
       maxY := visibleY - 1;
       fontLines := fontHeight(getFontSize);
    end.

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