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