home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / microcrn / issue_44.arc / OR4.ARC / PC_BOX.PAS < prev    next >
Pascal/Delphi Source File  |  1988-07-31  |  6KB  |  198 lines

  1. {----------------------------------------------------------------------------}
  2. type
  3.    Screen_Buf_ad = array [1..25] of array [1..80] of integer;
  4.  
  5. var
  6.    Screen_Buf_Mono      : Screen_Buf_ad absolute $B000:$0000;
  7.    Screen_Buf_Color     : Screen_Buf_ad absolute $B800:$0000;
  8.    Save_Screen_Buf_1    : Screen_Buf_ad;
  9.    Save_Screen_Buf_2    : Screen_Buf_ad;
  10.    Screen_Mono_Color_Sw : integer;  {0=mono; 1=color}
  11.  
  12. {----------------------------------------------------------------------------}
  13. const
  14.    Char_Points : integer = 14;  {= char height in pixels - 8 ro 14}
  15.  
  16. {----------------------------------------------------------------------------}
  17. function  IsEGA : boolean;
  18.  
  19. {returns a boolean TRUE if EGA, FALSE of NOT EGA.  Trick consists of a video }
  20. {call that is not defined for the MDA & CGA;  a well-behaved BIOS will not   }
  21. {alter any registers when an undefined service request is made.              }
  22.  
  23. var
  24.    Regs : Registers;
  25. begin
  26.    Regs.AH := $12;   {select Alternate Function service}
  27.    Regs.BX := $10;   {BL=$10 means return EGA information}
  28.    Intr($10,Regs);          {Call BIOS VIDEO}
  29.    if (Regs.BX = $10)
  30.       then IsEGA := FALSE
  31.       else IsEGA := TRUE;   {... anything else means EGA!}
  32. end;  {IsEGA}
  33.  
  34. {----------------------------------------------------------------------------}
  35. type
  36.    Adapter_Type         = ( MDA, CGA, EGA_MONO, EGA_COLOR);
  37.  
  38. {----------------------------------------------------------------------------}
  39. function Query_Adapter_Type : Adapter_Type;
  40.  
  41. {returns MDA, CGA, EGA_MONO, or EGA_COLOR}
  42.  
  43. var
  44.    Regs : Registers;
  45.    Code : byte;
  46.  
  47. begin
  48.    if (IsEGA) then  begin
  49.       Regs.AH := $12;
  50.       Regs.BL := $10;
  51.       Intr($10,Regs);
  52.       if (Regs.BH = 0)
  53.          then Query_Adapter_Type := EGA_COLOR
  54.          else Query_Adapter_Type := EGA_MONO;
  55.    end
  56.    else begin
  57.       Intr($11,Regs);  {equip determination service}
  58.       Code := (Regs.AL and $30) shr 4;
  59.       case Code of
  60.          1: Query_Adapter_Type := CGA;
  61.          2: Query_Adapter_Type := CGA;
  62.          3: Query_Adapter_Type := MDA;
  63.       else  Query_Adapter_Type := CGA;
  64.       end;  {end case}
  65.    end;
  66. end;  {Query_Adapter_Type}
  67.  
  68. {----------------------------------------------------------------------------}
  69. procedure  SetMode(ModeNumber : integer);
  70.  
  71. {sets video mode}
  72.  
  73. var
  74.    Regs : Registers;
  75. begin
  76.    Regs.AH := 0;
  77.    Regs.AL := ModeNumber;
  78.    Intr($10,Regs);
  79. end;  {SetMode}
  80.  
  81. {----------------------------------------------------------------------------}
  82. procedure  CursorOff;
  83.  
  84. {turns off hardware cursor}
  85.  
  86. var
  87.    Regs : Registers;
  88. begin
  89.    Regs.AX := $0100;
  90.    Regs.CX := $2000;
  91.    intr($10,Regs);
  92. end;  {CursorOff}
  93.  
  94. {----------------------------------------------------------------------------}
  95. procedure  CursorOn;
  96. {turns cursor on - Char_Points = pixel ht of current cursor in use: 14 or 8   }
  97. var
  98.    Regs : Registers;
  99. begin
  100.    Regs.AX := $0100;
  101.    Regs.CH := Char_Points-2;
  102.    Regs.CL := Char_Points-1;
  103.    intr($10,Regs);
  104. end;  {CursorOn}
  105.  
  106. {----------------------------------------------------------------------------}
  107. procedure  Init_Screen_Buffers;
  108. var
  109.    Adapter : Adapter_Type;
  110. begin
  111.    Adapter := Query_Adapter_Type;
  112.  
  113.    case Adapter of
  114.    MDA:       begin
  115.                  Screen_Mono_Color_Sw := 0;
  116.                  SetMode(7);
  117.                  Char_Points := 14;
  118.               end;
  119.    CGA:       begin
  120.                  Screen_Mono_Color_Sw := 1;
  121.                  SetMode(3);
  122.                  Char_Points := 8;
  123.               end;
  124.    EGA_MONO:  begin
  125.                  Screen_Mono_Color_Sw := 0;
  126.                  SetMode(7);
  127.                  Char_Points := 14;
  128.               end;
  129.    EGA_COLOR: begin
  130.                  Screen_Mono_Color_Sw := 1;
  131.                  SetMode(3);
  132.                  Char_Points := 14;
  133.               end;
  134.    end;  {end case}
  135.    CursorOff;
  136.  
  137. end;  {Init_Screen_Buffers}
  138.  
  139. {----------------------------------------------------------------------------}
  140. procedure  Save_Screen_1;
  141. begin
  142.    if (Screen_Mono_Color_Sw = 0)
  143.       then Save_Screen_Buf_1 := Screen_Buf_Mono
  144.       else Save_Screen_Buf_1 := Screen_Buf_Color;
  145. end;  {Save_Screen_1}
  146.  
  147. {----------------------------------------------------------------------------}
  148. procedure  Restore_Screen_1;
  149. begin
  150.    if (Screen_Mono_Color_Sw = 0)
  151.       then Screen_Buf_Mono  := Save_Screen_Buf_1
  152.       else Screen_Buf_Color := Save_Screen_Buf_1;
  153. end;  {Restore_Screen_1}
  154.  
  155. {----------------------------------------------------------------------------}
  156. procedure  Save_Screen_2;
  157. begin
  158.    if (Screen_Mono_Color_Sw = 0)
  159.       then Save_Screen_Buf_2 := Screen_Buf_Mono
  160.       else Save_Screen_Buf_2 := Screen_Buf_Color;
  161. end;  {Save_Screen_2}
  162.  
  163. {----------------------------------------------------------------------------}
  164. procedure  Restore_Screen_2;
  165. begin
  166.    if (Screen_Mono_Color_Sw = 0)
  167.       then Screen_Buf_Mono  := Save_Screen_Buf_2
  168.       else Screen_Buf_Color := Save_Screen_Buf_2;
  169. end;  {Restore_Screen_2}
  170.  
  171. {----------------------------------------------------------------------------}
  172. type
  173.    TimeRec = record
  174.                 TimeStamp : word;  {DTA time stamp}
  175.                 Hours,Minutes,Seconds,Hundredths : word;
  176.                 SODdiv4 : word;
  177.              end;  {end record def}
  178.  
  179. {----------------------------------------------------------------------------}
  180. procedure Calc_Time (var TimeNow:TimeRec);
  181. var
  182.    Regs : Registers;
  183. begin
  184.    with TimeNow do begin
  185.       GetTime(Hours,Minutes,Seconds,Hundredths);
  186.  
  187.       {calculate Time-Stamp that DOS uses for comparing files:}
  188.       TimeStamp := (Hours shl 11) or (Minutes shl 5) or (Seconds shr 1);
  189.  
  190.       {calculate seconds of day div 4:}
  191.       SODdiv4 := (Hours*900) + (Minutes*15) + (Seconds div 4);
  192.    end;
  193. end;  {Calc_Time}
  194.  
  195. {----------------------------------------------------------------------------}
  196.  
  197.  
  198.