Pascal ASCII mode

ASCII mode

{$G+}
Unit Qwik;

INTERFACE

const
  smal = $0707;     { For Cursor manipulate }
  norm = $0607;
  half = $0307;
  Bar  = $000D;
  Off  = $2607;
  on   = $0506;

  MaxVensters = 5;   { playraam }

type
  Charset = Set of #0..#255;  { For Qinput procedure }

  DAC_Trio=Record
    Red,Green,Blue:Byte;   { For fade in/out }
  End;

  VensterPtr = ^VENSTERTYPE;
  VENSTERTYPE    = record
    Data           : array[1..4000] of Char;
    XPos           : Byte;
    YPos           : Byte;
    VenX1          : Byte;
    VenY1          : Byte;
    VenX2          : Byte;
    VenY2          : Byte;
  end;

  ScreenArray = ARRAY[1..25 * 80] OF WORD;           { dump asci screen }
    ScreenPtr = ^ScreenArray;

  DacType = Array[1..256,1..3] of Byte;

  ByteArray  = Array[0..15] of Byte;          { New CharacterSets }
  CharArray  = Array[1..101] of Record
    CN       : Byte;
    CD       : ByteArray;
  end;

Const
  newChars : CharArray =

             { kader }

  ((CN:218;CD:(0,0,7,15,28,56,48,48,48,48,48,48,48,48,48,48)),           {Ú}
   (CN:194;CD:(0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0)),                    {Â}
   (CN:191;CD:(0,0,224,240,56,28,12,12,12,12,12,12,12,12,12,12)),        {¿}
   (CN:195;CD:(48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48)),        {Ã}
   (CN:180;CD:(12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12)),        {´}
   (CN:192;CD:(48,48,48,48,48,48,48,48,48,48,56,28,15,7,0,0)),           {À}
   (CN:193;CD:(0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0)),                    {Á}
   (CN:217;CD:(12,12,12,12,12,12,12,12,12,12,28,56,240,224,0,0)),        {Ù}

             { name softdesign ÈÉÊËÌÍÎÏÐÑÒ }

   (CN:200;CD:(127,128,128,159,144,144,144,144,158,144,144,144,
                                              144,128,128,127)),         {È}
   (CN:201;CD:(255,0,0,19,18,18,18,18,19,18,18,18,18,0,0,255)),          {É}
   (CN:202;CD:(255,0,0,195,36,36,36,36,195,128,128,68,35,0,0,255)),      {Ê}
   (CN:203;CD:(255,0,0,31,130,2,2,2,2,130,130,130,2,0,0,255)),           {Ë}
   (CN:204;CD:(255,0,0,129,2,2,2,2,2,2,2,2,1,0,0,255)),                  {Ì}
   (CN:205;CD:(255,0,0,199,36,36,36,36,39,36,36,36,196,0,0,255)),        {Í}
   (CN:206;CD:(255,0,0,132,68,68,68,68,132,4,4,4,4,0,0,255)),            {Î}
   (CN:207;CD:(255,0,0,66,98,82,74,70,66,66,66,66,66,0,0,255)),          {Ï}
   (CN:208;CD:(255,0,0,33,34,34,34,34,34,34,34,34,33,0,0,255)),          {Ð}
   (CN:209;CD:(255,0,0,196,38,37,36,36,36,36,36,36,196,0,0,255)),        {Ñ}
   (CN:210;CD:(252,2,2,34,34,34,162,98,34,34,34,34,34,2,2,252)),         {Ò}

        { diversen }

   (CN:220;CD:(0,0,255,255,255,255,255,255,255,255,255,255,255,255,
                                                          255,255)),     {Ü}
   (CN:221;CD:(252,252,252,252,252,252,252,252,252,252,252,252,
                                                  252,252,252,252)),     {Ý}
   (CN:222;CD:(31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31)),        {Þ}
   (CN:223;CD:(255,255,255,255,255,255,255,255,255,255,255,255,255,
                                                          255,0,0)),     {ß}
   
        { ASCII backgronds }

   (CN:225;CD:(148,132,72,48,0,193,34,20,148,132,72,48,0,193,34,20)),    {á}
   (CN:226;CD:(32,64,143,16,32,64,143,16,32,64,143,16,32,64,143,16)),    {â}
   (CN:227;CD:(129,66,36,16,8,4,34,25,152,66,32,16,8,36,66,129)),        {ã}
   (CN:228;CD:(62,65,65,65,65,65,62,128,62,65,65,65,65,65,62,128)),      {ä}
   (CN:229;CD:(0,0,0,0,16,32,64,255,64,32,16,0,0,0,0,0)),          { pijl å}
   (CN:230;CD:(0,0,0,0,0,1,7,252,7,1,0,0,0,0,0,0)),                { pijl æ}
   (CN:249;CD:(0,0,0,0,0,4,6,255,255,6,4,0,0,0,0,0)),    { pijl printmenu ù}

                { numbers 0..9 }

   (CN:48;CD:(0,60,66,66,66,66,66,66,66,66,66,60,0,0,0,0)),              {0}
   (CN:49;CD:(0,8,24,56,8,8,8,8,8,8,8,62,0,0,0,0)),                      {1}
   (CN:50;CD:(0,60,66,2,2,4,8,16,32,64,64,126,0,0,0,0)),                 {2}
   (CN:51;CD:(0,60,66,2,2,4,24,4,2,2,66,60,0,0,0,0)),                    {3}
   (CN:52;CD:(0,2,6,10,18,34,66,126,2,2,2,2,0,0,0,0)),                   {4}
   (CN:53;CD:(0,126,64,64,64,64,124,2,2,2,66,60,0,0,0,0)),               {5}
   (CN:54;CD:(0,60,66,64,64,64,124,66,66,66,66,60,0,0,0,0)),             {6}
   (CN:55;CD:(0,126,2,2,4,4,8,8,16,16,32,32,0,0,0,0)),                   {7}
   (CN:56;CD:(0,60,66,66,66,66,60,66,66,66,66,60,0,0,0,0)),              {8}
   (CN:57;CD:(0,60,66,66,66,66,62,2,2,2,66,60,0,0,0,0)),                 {9}

             { characters A..Z }

   (CN:65;CD:(0,60,66,66,66,66,126,66,66,66,66,66,0,0,0,0)),             {A}
   (CN:66;CD:(0,124,66,66,66,66,124,66,66,66,66,124,0,0,0,0)),           {B}
   (CN:67;CD:(0,28,34,64,64,64,64,64,64,64,34,28,0,0,0,0)),              {C}
   (CN:68;CD:(0,120,68,66,66,66,66,66,66,66,68,120,0,0,0,0)),            {D}
   (CN:69;CD:(0,126,64,64,64,64,120,64,64,64,64,126,0,0,0,0)),           {E}
   (CN:70;CD:(0,126,64,64,64,64,124,64,64,64,64,64,0,0,0,0)),            {F}
   (CN:71;CD:(0,60,66,64,64,64,78,66,66,66,66,60,0,0,0,0)),              {G}
   (CN:72;CD:(0,66,66,66,66,66,126,66,66,66,66,66,0,0,0,0)),             {H}
   (CN:73;CD:(0,28,8,8,8,8,8,8,8,8,8,28,0,0,0,0)),                       {I}
   (CN:74;CD:(0,14,4,4,4,4,4,4,4,4,68,56,0,0,0,0)),                      {J}
   (CN:75;CD:(0,66,68,72,80,96,96,96,80,72,68,66,0,0,0,0)),              {K}
   (CN:76;CD:(0,64,64,64,64,64,64,64,64,64,64,126,0,0,0,0)),             {L}
   (CN:77;CD:(0,65,65,99,85,73,65,65,65,65,65,65,0,0,0,0)),              {M}
   (CN:78;CD:(0,66,66,98,82,74,70,66,66,66,66,66,0,0,0,0)),              {N}
   (CN:79;CD:(0,24,36,66,66,66,66,66,66,66,36,24,0,0,0,0)),              {O}
   (CN:80;CD:(0,124,66,66,66,66,124,64,64,64,64,64,0,0,0,0)),            {P}
   (CN:81;CD:(0,24,36,66,66,66,66,82,74,74,36,26,0,0,0,0)),              {Q}
   (CN:82;CD:(0,124,66,66,66,66,124,96,80,72,68,66,0,0,0,0)),            {R}
   (CN:83;CD:(0,60,66,64,64,64,60,2,2,2,66,60,0,0,0,0)),                 {S}
   (CN:84;CD:(0,127,8,8,8,8,8,8,8,8,8,8,0,0,0,0)),                       {T}
   (CN:85;CD:(0,66,66,66,66,66,66,66,66,66,66,60,0,0,0,0)),              {U}
   (CN:86;CD:(0,66,66,66,66,66,66,66,36,36,36,24,0,0,0,0)),              {V}
   (CN:87;CD:(0,65,65,65,65,65,73,73,42,54,34,34,0,0,0,0)),              {W}
   (CN:88;CD:(0,66,66,66,36,36,24,24,36,36,66,66,0,0,0,0)),              {X}
   (CN:89;CD:(0,65,65,65,65,34,34,28,8,8,8,8,0,0,0,0)),                  {Y}
   (CN:90;CD:(0,127,2,4,4,8,8,16,16,32,32,127,0,0,0,0)),                 {Z}

   (CN:196;CD:(0,0,0,0,0,0,0,204,51,0,0,0,0,0,0,0)),                     {Ä}
   (CN:179;CD:(16,16,8,8,16,16,8,8,16,16,8,8,16,16,8,8)),                {³}
   (CN:58;CD:(0,0,0,0,0,12,12,0,0,0,12,12,0,0,0,0)),                     {:}
   (CN:45;CD:(0,0,0,0,0,0,0,126,0,0,0,0,0,0,0,0)),                       {-}
   (CN:40;CD:(0,2,4,4,8,8,8,8,8,4,4,2,0,0,0,0)),                         {(}
   (CN:41;CD:(0,32,16,16,8,8,8,8,8,16,16,32,0,0,0,0)),                   {)}

   
   { balk voor B.V. Vloeiende BackupStatusBar }

   (CN:231;CD:(145,196,145,196,145,196,145,196,145,196,145,196,145,
                                                      196,145,196)),   {ç}
   (CN:232;CD:(209,196,209,196,209,196,209,196,209,196,209,196,209,
                                                      196,209,196)),   {è}
   (CN:233;CD:(241,228,241,228,241,228,241,228,241,228,241,228,241,
                                                      228,241,228)),   {é}
   (CN:234;CD:(241,244,241,244,241,244,241,244,241,244,241,244,241,
                                                      244,241,244)),   {ê}
   (CN:235;CD:(249,252,249,252,249,252,249,252,249,252,249,252,249,
                                                      252,249,252)),   {ë}
   (CN:236;CD:(253,252,253,252,253,252,253,252,253,252,253,252,253,
                                                      252,253,252)),   {ì}
   (CN:237;CD:(255,254,255,254,255,254,255,254,255,254,255,254,255,
                                                      254,255,254)),   {í}
   (CN:238;CD:(255,255,255,255,255,255,255,255,255,255,255,255,255,
                                                      255,255,255)),   {î}

   { JOS DICKMANN SOFTWARE (c) 1997 }

  {J} (CN : 210;CD :
      ($1E,$1E,$0C,$0C,$0C,$0C,$0C,$0C,$CC,$CC,$CC,$CC,$78,$78,$00,$00)),
  {O} (CN : 190;CD :
      ($38,$38,$6C,$6C,$C6,$C6,$C6,$C6,$C6,$C6,$6C,$6C,$38,$38,$00,$00)),
  {S} (CN : 141;CD :
      ($7C,$7C,$C6,$C6,$E0,$E0,$78,$78,$0E,$0E,$C6,$C6,$7C,$7C,$00,$00)),
  {D} (CN : 159;CD :
      ($F8,$F8,$6C,$6C,$66,$66,$66,$66,$66,$66,$6C,$6C,$F8,$F8,$00,$00)),
  {I} (CN : 242;CD :
      ($78,$78,$30,$30,$30,$30,$30,$30,$30,$30,$30,$30,$78,$78,$00,$00)),
  {C} (CN : 226;CD :
      ($3C,$3C,$66,$66,$C0,$C0,$C0,$C0,$C0,$C0,$66,$66,$3C,$3C,$00,$00)),
  {K} (CN : 171;CD :
      ($E6,$E6,$66,$66,$6C,$6C,$78,$78,$6C,$6C,$66,$66,$E6,$E6,$00,$00)),
  {M} (CN : 156;CD :
      ($C6,$C6,$EE,$EE,$FE,$FE,$FE,$FE,$D6,$D6,$C6,$C6,$C6,$C6,$00,$00)),
  {A} (CN : 179;CD :
      ($30,$30,$78,$78,$CC,$CC,$CC,$CC,$FC,$FC,$CC,$CC,$CC,$CC,$00,$00)),
  {N} (CN : 250;CD :
      ($C6,$C6,$E6,$E6,$F6,$F6,$DE,$DE,$CE,$CE,$C6,$C6,$C6,$C6,$00,$00)),
  {F} (CN : 161;CD :
      ($FE,$FE,$62,$62,$68,$68,$78,$78,$68,$68,$60,$60,$F0,$F0,$00,$00)),
  {T} (CN : 254;CD :
      ($FC,$FC,$B4,$B4,$30,$30,$30,$30,$30,$30,$30,$30,$78,$78,$00,$00)),
  {W} (CN : 130;CD :
      ($C6,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$D6,$D6,$FE,$FE,$6C,$6C,$00,$00)),
  {R} (CN : 172;CD :
      ($FC,$FC,$66,$66,$66,$66,$7C,$7C,$6C,$6C,$66,$66,$E6,$E6,$00,$00)),
  {E} (CN : 253;CD :
      ($FE,$FE,$62,$62,$68,$68,$78,$78,$68,$68,$62,$62,$FE,$FE,$00,$00)),
  {c} (CN : 199;CD :
      ($00,$00,$00,$00,$78,$78,$CC,$CC,$C0,$C0,$CC,$CC,$78,$78,$00,$00)),
  {(} (CN : 247;CD :
      ($18,$18,$30,$30,$60,$60,$60,$60,$60,$60,$30,$30,$18,$18,$00,$00)),
  {)} (CN : 233;CD :
      ($60,$60,$30,$30,$18,$18,$18,$18,$18,$18,$30,$30,$60,$60,$00,$00)),
  {1} (CN : 248;CD :
      ($30,$30,$70,$70,$30,$30,$30,$30,$30,$30,$30,$30,$FC,$FC,$00,$00)),
  {9} (CN : 223;CD :
      ($78,$78,$CC,$CC,$CC,$CC,$7C,$7C,$0C,$0C,$18,$18,$70,$70,$00,$00)),
  {5} (CN : 191;CD :
      ($FC,$FC,$C0,$C0,$F8,$F8,$0C,$0C,$0C,$0C,$CC,$CC,$78,$78,$00,$00)));



{ QWIK.TPU }

Procedure Qread_char;  { read the standard characters ASCII set }
Procedure Qreset_char; { reset the old character set }
procedure Qfont0;      { standard ASCII font }
procedure Qfont1;      { new font for ASCII characters }
procedure Qfont_jos;

          { Qfont_jos is a personal(private) procedure  |
          | writeln('Ò¾ Ÿòâ«œ³úú ¾¡þ‚³¬ý ÷Çé øßß¿');  |
          | title =('JOS DICKMANN SOFTWARE (c) 1997')   }

Function Qinput(X,Y: Byte;StartStr,BackG,PassChar: String;MaxLen,StartPos:
    Integer;AcceptSet: CharSet;Ins: Boolean;var InputStatus: Byte):string;

          { X,Y        Where on screen to put the input.     |
          | StartStr   Default input string.                 |
          | BackG  Background Character, eg ' ' or '°' etc.  |
          | PassChar  If defined this character will be      |
          |           displyed instead of the input stream   |
          | MaxLen    MaxLen of Input.                       |
          | StartPos  Where in input string to place cursor, |
          |           -1 = End of StartStr                   |
          | AcceptSet : Which characters should be accepted  |
          | as input,often [#32..#255]                       |
          | if you include #8 in mask, you cannot use delete |
          | Ins : Begin in INSERT or OVERWRITE mode Boolean  |
          | InputStatus exit from the input routine          |
          |             13 = Input terminated with Enter.    |
          |             27 = Input terminated with ESC.      |
          |             72 = User pressed UpArrow            |
          |             80 = User pressed DownArrow          |
          |             73 = User pressed Page Up            |
          |             81 = User pressed Page Down  etc.... }

function  Qstring(x,y,color,maxlen :byte;AcceptSet: CharSet):string;

          { x,y Where on screen to put the input.  |
          | MaxLen      MaxLen of Input.           |
          | AcceptSet = Which characters should be |
          | accepted as input,  often [#32..#255]  }

          { THE FOLLOW PROCEDURES ONLY USED IN WINDOW 0,0,80,25 }
Procedure Qwrite(x, y: byte; s: string; f, b: byte);
Procedure Qhor_write(x,y,aantal,teken,kleur :byte);
          { Qhor_write(20,2,10,176,3) = °°°°°°°°°° }
Procedure Qver_write(x,y,aantal,teken,kleur :byte);
          { vertical asci rules }

          { USE IN PROCEDURE QWINDOW }
procedure Qtext(x,y :byte;str :string;kleur,achtergrondkleur : Byte);
Procedure Qhor(x,y,aantal,teken,kleur :byte);
Procedure Qver(x,y,aantal,teken,kleur :byte);

Procedure QCursor(Ctype: Word);

          { smal = $0707; |   | norm = $0607; |   | half = $0307; |
          | Bar  = $000D; |   | Off  = $2607; |   | on   = $0506; }

Procedure Qtime(x,y,kleur,achtergrondkleur :byte);
Procedure Qdate(x,y,kleur,achtergrondkleur :byte);
          { kleur = color / achtergrondkleur = background color }
Function  Qday_of_week(Month,Day,Year :word):byte;
          { read the day of the week 0..6 }
Function  NumbofDaysInMth(y,m : Word): Byte;
          { read the days in a month / januari = 31 etc... }
Procedure Qscreen_off;
Procedure Qscreen_on;
Procedure Qdelay(ms : Word);                          { ms = milliseconds }
Procedure Qfill_screen(char,color :byte);  { Fill screen 80x25 characters }
Procedure Qborder(kleur: byte);          { fills the border of the screen }
Procedure Qsave_screen(filename :string);
Procedure Qload_screen(filename :string);    { I don't know of this works }

          { var  Page    : ARRAY[0..2] OF PageType; |
          |      Counter : integer;key :char;       |
          |                                         |
          | begin                                   |
          |   Page[0] := Monitor;                   |
          |   LoadScreen(Page[1],paramstr(1));      |
          |   LoadScreen(Page[2],paramstr(2));      |
          |   repeat                                |
          |     while KeyPressed DO Key := ReadKey; |
          |     IF Counter = 1 THEN Counter := 2    |
          |     else Counter := 1;                  |
          |     PageFlip(Page[Counter],AllRand);    |
          |   until Key = #27;                      |
          |   PageFlip(Page[0],AllRand);            |
          | end.                                    }

Procedure QScroll(x,y :byte;s:string;back,textcolor,highlight,dlay,
          waitkey:word);

          {   x,y       = screen location (1..80, 1..25)           |
          |   s         = message to be displayed (length = 2..75) |
          |   back      = background color (0..7)                  |
          |   textcolor = text color       (0..15)                 |
          |   highlight = highlight color  (0..15)                 |
          |   dlay      = time delay (milliseconds) (0..)          |
          |   waitkey   = 0 - cycle once only                      |
          |               1 - continue cycle until a key is hit    }

Procedure QFade_Out;                           { also for graphics screens }
Procedure QFade_in;
Procedure Qfadeout(Speed : Integer);                    { for asci screens }
Procedure Qfadein(Speed : Integer);                     { for asci screens }

Function  QGetChar(X,Y:Byte):Char;              { get the character on X,Y }
procedure Qdel_file(filename :string);                     { delete a file }
function  Qexist_file(FileName : string) : boolean;
function  Qexist_dir(dir:string):boolean;
procedure Qget_file_attr(fn:string;var Attr:word);
procedure Qset_file_attr(fn :string;Attr:word);
procedure Qget_file_size(FName :string;var Fsize :longint;var Error :word);
procedure QCopy_file(file_of,file_to :string);
procedure Qclear_buffer;                               { clear the keybord }
function  Qread_key :word;

procedure Qsound(freq,delay :integer);
procedure Qinfo(regel :string);                 { put info-text on rule 23 }
Function  Qerror(ErrorCode :integer):string;

          {   0: No Error';                       |
          |   2: File Not Found';                 |
          |   3: Path Not Found';                 |
          |   4: Too Many Open Files';            |
          |   5: File Access Denied';             |
          |   6: Invalid File Handle';            |
          |  12: Invalid File Access Code';       |
          |  15: Invalid Drive Number';           |
          |  16: Cannot Remove Current Directory' |
          |  17: Cannot Rename Across Drives';    |
          |  18: File access error';              |
          | 100: Disk Read Error';                |
          | 101: Disk Write Error';               |
          | 102: File Not Assigned';              |
          | 103: File Not Open';                  |
          | 104: File Not Open For Input';        |
          | 105: File Not Open For Output';       |
          | 106: Invalid Numeric Format';         |
          | 150: Disk Is Write-Protected';        |
          | 151: Unknown Unit';                   |
          | 152: Drive Not Ready';                |
          | 153: Unknown Command';                |
          | 154: CRC Error In Data';              |
          | 155: Bad Drive Request Structure Leng |
          | 156: Disk Seek Error';                |
          | 157: Unknown Media Type';             |
          | 158: Sector Not Found';               |
          | 159: Printer Out Of Paper';           |
          | 160: Device Write Fault';             |
          | 161: Device Read Fault';              |
          | 162: Hardware Failure';               }

Function  Qprinter_ok :boolean;
Procedure Qwindow(lx,ly,rx,ry :integer;kleur :byte);
Procedure Qopen_window(x,y,xx,yy,color,back: Byte);
Procedure Qclose_window;
Function  Upcase_string(regel :string):string;
          { Upcase hole string }
Function  Upcase_First_char(regel :string):string;
          { Upcase only the first character of a string }
Function  Lowcase_string(regel :string):string;
          { Put string in lowercase characters }

IMPLEMENTATION

uses crt,dos;


var
  s,ss           : String;
  ch             : char;
  IS             : Byte;
  x,y,p          : integer;
  Orig_Pal       : Array[0..255] Of Dac_Trio;                { fade in/out }
  regs           : registers;
  newCharset,
  oldCharset     : Array[0..255,1..16] of Byte; { voor Qread / Qreset_char }

  raam           : array[0..MaxVensters] of VensterPtr;
  VideoVenster   : VensterPtr;
  VenTeller      : Byte;

  dac1,dac2      : DacType;
  erg,gesamt     : Word;                                 { textfadein /out }

Procedure Qread_char;{*****************************************************}

Var
  b:Byte;
  w:Word;

begin
  For b := 0 to 255 do begin
    w := b * 32;
    Inline($FA);
    PortW[$3C4] := $0402;
    PortW[$3C4] := $0704;
    PortW[$3CE] := $0204;
    PortW[$3CE] := $0005;
    PortW[$3CE] := $0006;
    Move(Ptr($A000, w)^, oldCharset[b, 1], 16);
    PortW[$3C4] := $0302;
    PortW[$3C4] := $0304;
    PortW[$3CE] := $0004;
    PortW[$3CE] := $1005;
    PortW[$3CE] := $0E06;
    Inline($FB);
  end;
end;

Procedure Qreset_char;

Var
  b:Byte;
  w:Word;

begin
  For b := 0 to 255 do begin
    w := b * 32;
    Inline($FA);
    PortW[$3C4] := $0402;
    PortW[$3C4] := $0704;
    PortW[$3CE] := $0204;
    PortW[$3CE] := $0005;
    PortW[$3CE] := $0006;
    Move(oldCharset[b, 1], Ptr($A000, w)^, 16);
    PortW[$3C4] := $0302;
    PortW[$3C4] := $0304;
    PortW[$3CE] := $0004;
    PortW[$3CE] := $1005;
    PortW[$3CE] := $0E06;
    Inline($FB);
  end;
end;

procedure Qfont0;

begin
  for p := 1 to 30 do With regs do begin
    ah := $11;
    al := $0;
    bh := $10;
    bl := 0;
    cx := 1;
    dx := NewChars[p].CN;
    es := seg(NewChars[p].CD);
    bp := ofs(NewChars[p].CD);
    intr($10,regs);
  end;
end;

procedure Qfont1;            { Alle Karakters 1..80 zonder mijn naam }

begin
  for p := 1 to 80 do With regs do begin
    ah := $11;
    al := $0;
    bh := $10;
    bl := 0;
    cx := 1;
    dx := NewChars[p].CN;
    es := seg(NewChars[p].CD);
    bp := ofs(NewChars[p].CD);
    intr($10,regs);
  end;
end;

procedure Qfont_jos;                      { zet mijn naam in tpu bestand }

begin
  for p := 81 to 101 do With regs do begin        { laatste 21 karakters }
    ah := $11;
    al := $0;
    bh := $10;
    bl := 0;
    cx := 1;
    dx := NewChars[p].CN;
    es := seg(NewChars[p].CD);
    bp := ofs(NewChars[p].CD);
    intr($10,regs);
  end;
end;


procedure QCursor(Ctype: Word); assembler;
asm
  mov ax, $0100
  mov cx, CType
  int $10
end;

Function Left(s: String;nr: byte): String;

begin
  Delete(s,nr+1,length(s));
  Left:=s;
end;

Function Mid(s: String;nr,nr2: byte): String;

begin
  Delete(s,1,nr-1);
  Delete(s,nr2+1,length(s));
  Mid:=s;
end;

Procedure WriteXY(x,y: Byte;s: String);
var
  loop:   Word;

begin
  for loop:=x to x+length(s)-1 do
    Mem[$B800:(loop-1)*2+(y-1)*160]:=Ord(S[loop-x+1]);
end;

Function RepeatChar(s: String;antal: byte): String;

var
 temp: String;

begin
  temp:=s[1];
  While Length(temp)<Antal do Insert(s[1],temp,1);
  RepeatChar:=Temp;
end;

Function qInput(X,Y: Byte;StartStr,BackG,PassChar: String;MaxLen,StartPos:
   Integer;AcceptSet: CharSet;Ins: Boolean;var InputStatus: Byte):string;

Var
  P      : Byte;
  Exit   : Boolean;
  ext    : Char;
  t      : String[1];

begin
  Exit:=False;
  if Length(PassChar)>1 then PassChar:=PassChar[1];
  if Length(BackG)>1 then BackG:=BackG[1];
  if Length(BackG)=0 then BackG:=' ';
  if Length(StartStr)>MaxLen then StartStr:=Left(StartStr,MaxLen);
  if StartPos>Length(StartStr) then StartPos:=Length(StartStr);
  if StartPos=-1 then StartPos:=Length(StartStr);
  If StartPos>=MaxLen then StartPos:=MaxLen-1;

  s:=StartStr;
  WriteXY(X,Y,RepeatChar(BackG,MaxLen));

  if StartStr<>'' then begin
  if passchar='' then WriteXY(X,Y,StartStr) else
                WriteXY(X,Y,RepeatChar(PassChar,Length(StartStr)));
end;

p:=StartPos;
GotoXY(X+StartPos,Y);

repeat
  if Ins then Qcursor(norm) else Qcursor(bar);
  ext:=#0;
  ch:=ReadKey;
  if ch=#0 then ext:=ReadKey;
  if ch=#27 then begin
    InputStatus:=27;
    Exit:=True;
  end;
  if ch in AcceptSet then begin
    t:=ch;
    if (p=length(s)) and (Length(s)<MaxLen) then begin
      s:=s+t;
      if PassChar='' then WriteXY(X+P,Y,T) else
        WriteXY(X+P,Y,PassChar);
      Inc(p);
    end else if length(s)<MaxLen then begin
      if Ins then Insert(T,S,P+1) else s[p+1]:=Ch;
      if PassChar='' then WriteXY(X+P,Y,Copy(S,P+1,Length(S)))
      else WriteXY(X+Length(S)-1,Y,PassChar);
      Inc(p);
    end else if (Length(s)=MaxLen) and (not Ins) then begin
      s[p+1]:=ch;
      if PassChar='' then WriteXY(X+P,Y,T) else
        WriteXY(X+P,Y,PassChar);
      Inc(p);
    end;
    ch:=#0;
    if p>MaxLen-1 then p:=MaxLen-1;
    GotoXY(X+P,Y);
  end else begin

   case ch of { CTRL-Y }
    #25: begin
           WriteXY(X,Y,RepeatChar(BackG,Length(S)));
           P:=0;
           S:='';
           GotoXY(X,Y);
         end;

    {Backspace}
    #8: If (P>0) then begin
      if (p+1=MaxLen) and (p<length(s)) then Ext:=#83 else begin
        Delete(S,P,1);
        Dec(P);
        GotoXY(X+P,Y);
        if PassChar='' then WriteXY(X+P,Y,Copy(S,P+1,Length(s))+BackG)
         else if P>0 then WriteXY(X+Length(s)-1,Y,PassChar+BackG) else
        WriteXY(X+Length(s),Y,BackG);
      end;
    end;

    #9: begin { Exit on TAB }
      InputStatus:=9;
      Exit:=True;
    end;

    #13: begin
      InputStatus:=13;
      Exit:=True;
    end;
  end; { Case CH of }

  case ext of

    {Left Arrow}
    #75: if P>0 then begin
      Dec(P);
      GotoXY(X+P,Y);
    end;

    {Right Arrow}
    #77: if (P<Length(s)) and (P+1<MaxLen) then begin
      Inc(P);
      GotoXY(X+P,Y);
    end;

    #82: Ins:=Not(Ins); {Insert}

    {Delete}
    #83: If P<Length(s) then begin
      Delete(S,P+1,1);
      if PassChar='' then WriteXY(X+P,Y,Copy(S,P+1,Length(s))+BackG) else
      if p>0 then WriteXY(X+Length(S)-1,Y,PassChar+BackG) else
      WriteXY(X+Length(S),Y,BackG);
    end;

    #71: begin
      p:=0;
      GotoXY(X+P,Y);
    end;

    #79: begin
      p:=Length(s);
      if p>=MaxLen then P:=MaxLen-1;
      GotoXY(X+P,Y);
    end;

    #72,#73,#80,#81,#59..#68:
    begin
      InputStatus:=Ord(Ext);
      Exit:=True;
    end;

    end; {Case of EXT }
  end; { if not normal char }

  until Exit;

  qinput:=S;
  Qcursor(off);
end;

function Qstring(x,y,color,maxlen :byte;AcceptSet: CharSet):string;

label start;

var
  posx :byte;

begin
  Qcursor(on);
  ss :='';posx :=1;
  repeat
    start:
    gotoxy(x,y);
    ch :=readkey;
    if (ch =#8) and (posx+x-1 >x) then begin
      dec(posx);
      delete(ss,posx,1);
      dec(x,1);
      gotoxy(x,y);write(' ');
      goto start;
    end;
    if (ch in AcceptSet) and (posx <maxlen) then begin
      s :=ch;insert(s,ss,posx);
      Qtext(x,y,s,color,0);
      inc(x,1);
      inc(posx);
    end;
  until ch in[#13];
  Qstring :=ss;
  Qcursor(off);
end;


procedure Qtext(x,y :byte;str :string;kleur,achtergrondkleur : Byte);

begin
  textbackground(achtergrondkleur);
  textcolor(kleur);
  gotoxy(x,y);write(str);
  textbackground(0);
end;


procedure Qwrite(x, y: byte; s: string; f, b: byte);

begin
  asm
    mov dh, y         { move X and Y into DL and DH }
    mov dl, x
    xor al, al
    mov ah, b         { load background into AH }
    mov cl, 4         { shift background over to next nibble }
    shl ax, cl
    add ah, f         { add foreground }
    push ax           { PUSH color combo onto the stack }
    mov bx, 0040h     { look at 0040h:0049h to get video mode }
    mov es, bx
    mov bx, 0049h
    mov al, es:[bx]
    cmp al, 7         { see if mode = 7 (i.e., monochrome) }
    je @mono_segment
    mov ax, 0b800h    { it's color: use segment B800h }
    jmp @got_segment
    @mono_segment:
    mov ax, 0b000h    { it's mono: use segment B000h }
    @got_segment:
    push ax           { PUSH video segment onto stack }
    mov bx, 004ah     { check 0040h:0049h to get number of screen columns }
    xor ch, ch
    mov cl, es:[bx]
    xor ah, ah        { move Y into AL; decrement to convert Pascal coords }
    mov al, dh
    dec al
    xor bh, bh        { shift X over into BL; decrement again }
    mov bl, dl
    dec bl
    cmp cl, $50       { see if we're in 80-column mode }
    je @eighty_column
    mul cx            { multiply Y by the number of columns }
    jmp @multiplied
    @eighty_column:   { 80-column mode: it may be faster to perform the }
    mov cl, 4         {   multiplication via shifts and adds: remember  }
    shl ax, cl        {   that 80d = 1010000b , so one can SHL 4, copy  }
    mov dx, ax        {   the result to DX, SHL 2, and add DX in.       }
    mov cl, 2
    shl ax, cl
    add ax, dx
    @multiplied:
    add ax, bx        { add X in }
    shl ax, 1         { multiply by 2 to get offset into video segment }
    mov di, ax        { video pointer is in DI }
    lea si, s         { string pointer is in SI }
    SEGSS lodsb
    cmp al, 00h       { if zero-length string, jump to end }
    je @done
    mov cl, al
    xor ch, ch        { string length is in CX }
    pop es            { get video segment back from stack; put in ES }
    pop ax            { get color back from stack; put in AX (AH = color) }
    @write_loop:
    SEGSS lodsb       { get character to write }
    mov es:[di], ax   { write AX to video memory }
    inc di            { increment video pointer }
    inc di
    loop @write_loop  { if CX > 0, go back to top of loop }
    @done:            { end }
    end;
end;

procedure qhor_write(x,y,aantal,teken,kleur :byte);

begin
  for p :=1 to aantal do qwrite(x+p-1,y,chr(teken),kleur,0);
end;

procedure qver_write(x,y,aantal,teken,kleur :byte);

begin
  for p :=1 to aantal do qwrite(x,y+p-1,chr(teken),kleur,0);
end;


procedure qhor(x,y,aantal,teken,kleur :byte);

begin
  for p :=1 to aantal do qtext(x+p-1,y,chr(teken),kleur,0);
end;

procedure qver(x,y,aantal,teken,kleur :byte);

begin
  for p :=1 to aantal do qtext(x,y+p-1,chr(teken),kleur,0);
end;

procedure Qtime(x,y,kleur,achtergrondkleur :byte);

function leadingzero(w :word) :string;
var
  st :string;

begin
    str(w:0,st);if length(st) =1 then st :='0' +st;leadingzero :=st;
end;

var
  h,m,s,hund       :word;

begin
    textbackground(achtergrondkleur);
    textcolor(kleur);gettime(h,m,s,hund);gotoxy(x,y);
    writeln(' ', leadingzero(h), ':',
                 leadingzero(m), ':',
                 leadingzero(s), ' ');
    textbackground(0);
end;

procedure Qdate(x,y,kleur,achtergrondkleur :byte);

var
  j,m,d,w :word;

begin
  textbackground(achtergrondkleur);
  textcolor(kleur);getdate(j,m,d,w);gotoxy(x,y);write(d,'/',m,'/',j);
  textbackground(0);
end;

function Qday_Of_Week(Month,Day,Year :WORD):byte;

var
  ivar1,ivar2 :Integer;

begin
  IF (Day > 0) AND (Day < 32) AND (Month > 0) AND (Month < 13) then begin
    ivar1 := ( Year MOD 100 );
    ivar2 := Day + ivar1 + ivar1 DIV 4;
    CASE Month OF
        4, 7    : ivar1 := 0;
        1, 10   : ivar1 := 1;
        5       : ivar1 := 2;
        8       : ivar1 := 3;
        2,3,11  : ivar1 := 4;
        6       : ivar1 := 5;
        9,12    : ivar1 := 6;
    END;
    ivar2 := ( ivar1 + ivar2 ) MOD 7;
    IF ( ivar2 = 0 ) THEN ivar2 := 7;
  END
  ELSE
    ivar2 := 0;
    Qday_Of_Week := BYTE( ivar2 );
end;
    
Function NumbofDaysInMth(y,m : Word): Byte;

begin
  Case m of
    1,3,5,7,8,10,12: NumbofDaysInMth := 31;
    4,6,9,11       : NumbofDaysInMth := 30;
    2              : NumbofDaysInMth := 28 +
                     ord((y mod 4) = 0);
  end;
end;

procedure Qscreen_off;

begin
  regs.ah := $12;                    { 12 = vgahi 640 x 480 }
  regs.al := ord(1);                 { 0 = on, 1 = off }
  regs.bl := $36;                    { Subfunction }
  intr($10, regs);                   { Call BIOS }
end;

procedure Qscreen_on;

begin
  regs.ah := $12;                    { 12 = vgahi 640 x 480 }
  regs.al := ord(0);                 { 0 = on, 1 = off }
  regs.bl := $36;                    { Subfunction }
  intr($10, regs);                   { Call BIOS }
end;

Procedure Qdelay(ms : Word); Assembler;
Asm
  mov ax, 1000;
  mul ms;
  mov cx, dx;
  mov dx, ax;
  mov ah, $86;
  int $15;
end;

procedure Qfill_screen(char,color :byte);

begin
  regs.ah :=9;
  regs.al :=char;
  regs.bh :=0;
  regs.bl :=color;
  regs.ch :=7;
  regs.cl :=208;
  intr(16,regs);
  textbackground(0);
end;

procedure Qborder(kleur: byte);

begin
  regs.ah:=$10;
  regs.al:=$01;
  regs.bh:=kleur;
  Intr(16,regs)
end;

Procedure Qsave_screen(FileName: String);

var
  AScreen    : ScreenPtr;
  f          : FILE;

begin
  if(LastMode = Mono) then AScreen := PTR($B000,0)
     else AScreen := PTR( $B800,0);

  assign(f,filename);
  rewrite(f,1);
  blockwrite(f,AScreen^,SIZEOF(AScreen^));
  close(f);
end;


Procedure Qload_screen(FileName: String);

var
  AScreen    : ScreenPtr;
  f          : FILE;

begin
  assign(f,filename);
  {$I-} reset(f,1); {$I+}
  if ioresult <>0 then exit;
  blockread(f,AScreen^,SIZEOF(AScreen^));
  close(f);
end;


procedure Qscroll(x,y :byte;s:string;back,textcolor,highlight,dlay,
          waitkey:word);

var
  l,direction : byte;
  c           : char;

begin
  regs.ax:= $0100; regs.cx:= $2607; intr($10,regs);   { hide cursor }
  direction:= 1;  l:= 1;
  gotoxy(x,y);
  textattr:= textcolor+back*16;
  write(s);
  while (keypressed=FALSE) AND (direction>0) do begin
    if direction=1 then begin
      inc(l);
      if l=length(s) then direction:= 2;
    end else begin
      dec(l);
      if l=1 then direction:= 1;
      if (WaitKey=0) AND (direction=1) then begin
        direction:=0;
        gotoxy(x,y);
        textattr:= highlight+back*16;
        write(s[1]);
        Qdelay(dlay);
      end;
    end;
    if direction>0 then begin
      gotoxy(x+(l-1),y);
      textattr:= highlight+back*16;
      c:= s[l];
      if (c>#96) AND (c<#123) then c:= chr(ord(c)-32);
      write(c);
      textattr:= textcolor+back*16;
      Qdelay(dlay);
      gotoxy(x+(l-1),y);
      write(s[l]);
    end;
  end;
  gotoxy(x,y);
  textattr:= textcolor+back*16;
  writeln(s);
  regs.ax:= $0100; regs.cx:= $0506; intr($10,regs);   { restore cursor }
end;

Procedure WaitForRetrace;

Begin
  Asm
    MOV  DX,$3DA;
@Wait1:
    IN   AL,DX
    TEST AL,8         {retrace hapening?}
    JNZ   @Wait1      {Yep, wait for it to end}
@Wait2:
    IN   AL,DX
    TEST AL,8         {Retrace happening?}
    JZ  @Wait2        {nope, wait to finish}
  End
End;

Procedure SetPal(Var P; Start:Byte; Count:Word);

Begin
  WaitForRetrace; {To eliminate snow.}
  Asm
    MOV  DX,$3C8
    MOV  AL,Start
    OUT  DX,AL
    INC  DX
    MOV  BX,DS
    LDS  SI,P
    MOV  CX,Count
    ADD  CX,Count
    ADD  CX,Count
    REP  OUTSB
    MOV  DS,BX
  End;
End;

Procedure GetPal(Var P; Start:Byte; Count:Word);

Begin
 Asm
   MOV  DX,$3C7
   MOV  AL,Start
   OUT  DX,AL
   INC  DX
   INC  DX
   MOV  BX,ES
   LES  DI,P
   MOV  CX,Count
   ADD  CX,Count
   ADD  CX,Count
   REP  INSB
   MOV  ES,BX
 End;
End;

Procedure QFade_Out;

Var
  Pal         : Array[0..255] Of Dac_Trio;
  Loop1,Loop2 : Byte;

Begin
  GetPal(Orig_Pal,0,256);              { Make a copy of origonal pallette }
  GetPal(Pal,0,255);
  For Loop1:=1 To 64 Do Begin
    For Loop2:=0 To 255 Do Begin
      If Pal[Loop2].Red>0 Then Dec(Pal[Loop2].Red);
      If Pal[Loop2].Green>0 Then Dec(Pal[Loop2].Green);
      If Pal[Loop2].Blue>0 Then Dec(Pal[Loop2].Blue);
    End;
    WaitForRetrace;
    SetPal(Pal,0,255);
  End;
End;

Procedure QFade_In;

Var
  NewPal      : Array[0..255] Of Dac_Trio Absolute orig_pal;
  Pal         : Array[0..255] Of Dac_Trio;
  Loop1,Loop2 : Byte;

Begin
  FillChar(Pal,SizeOf(Pal),0); {Set to black}
  SetPal(Pal,0,256);
  For Loop1:=63 DownTo 0 Do Begin
    For Loop2:=0 To 255 Do Begin
      If NewPal[Loop2].Red>Loop1 Then Inc(Pal[Loop2].Red);
      If NewPal[Loop2].Green>Loop1 Then Inc(Pal[Loop2].Green);
      If NewPal[Loop2].Blue>Loop1 Then Inc(Pal[Loop2].Blue);
    End;
    WaitForRetrace;
    SetPal(Pal,0,255);
  End;
End;

Function QGetChar(X,Y:Byte):Char;

Const
  ColorSeg = $B800;     (* For color system *)
  MonoSeg  = $B000;     (* For mono system  *)

begin
  QGetChar := Chr(Mem[ColorSeg:160*(Y-1) + 2*(X-1)])
end;

procedure Qdel_file(filename :string);

var
  f :file;

begin
  assign(f,filename);
  {$I-} reset(f); {$I+}
  if ioresult = 0 then begin
    close(f);
    erase(f);
  end;
end;

function Qexist_file(FileName : string) : boolean;

var
  sr : SearchRec;

begin
  FindFirst(FileName, AnyFile, sr);
  QExist_File := (DosError = 0);
end;

function Qexist_dir(dir:string):boolean;

var
  AktDir :string;

begin
  IF Dir[Length(Dir)]='\' THEN Delete(Dir,Length(dir),1);
  GetDir(0,AktDir);
  {$I-} ChDir(Dir); {$I+}
  QExist_Dir:=(IoResult=0);
  ChDir(AktDir);
end;

procedure QGet_File_Attr(fn:string;var Attr:word);

var
  Reg : Registers;

begin
  fn:=fn+#0;
  Reg.AX:=$4300;
  Reg.DS:=Seg(fn[1]);
  Reg.DX:=Ofs(fn[1]);
  Intr($21,Reg);
  Attr:=Reg.CX;
  IF Odd(Reg.Flags) THEN
    DosError:=Reg.AX
  else
    DosError:=WORD(0);
end;

procedure QSet_File_Attr(fn :string;Attr:word);

var
  Reg : Registers;

begin
  fn:=fn+#0;
  Reg.AX:=$4301;
  Reg.CX:=Attr;
  Reg.DS:=Seg(fn[1]);
  Reg.DX:=Ofs(fn[1]);
  Intr($21,Reg);
  IF Odd(Reg.Flags) THEN
    DosError:=Reg.AX
  else
    DosError:=WORD(0);
end;

procedure QGet_File_Size(FName :string;var Fsize :longint;var Error :word);

var
  SR    : SearchRec;

begin
  {$I-}
  FindFirst(FName,Archive,SR);
  Error := DosError;
  {$I+}
  if Error = 0 then
    FSize := SR.Size
  else
    FSize := 0;
end;

procedure QCopy_file(file_of,file_to :string);

Var InFile, OutFile : File;
    Buffer          : Array[ 1..1024 ] Of Char;
    NumberRead,
    NumberWritten   : Word;

begin
   Assign(InFile,file_of);
   {$I-} Reset(InFile,1); {$I+}        { neemt bestand van c: }
   if ioresult <>0 then exit;          { als bestand niet is gevonden }
   Assign(OutFile,file_to);            { bestand voor a: }
   ReWrite(OutFile,1);
   Repeat
      BlockRead ( InFile, Buffer, Sizeof( Buffer ), NumberRead );
      BlockWrite( OutFile, Buffer, NumberRead, NumberWritten );
   Until (NumberRead = 0) or (NumberRead <> NumberWritten);
   Close(InFile);
   Close(OutFile);
end;


procedure Qclear_buffer;

begin
  memw[$0000:$041C] :=memw[$0000:$041A];
end;

function Qread_key :word;

var
  Value : word;

begin
  repeat until KeyPressed;
  Value := Ord(ReadKey);
  if Value = 0
  then Value := Ord(ReadKey) + 256;
  Qread_key := Value;
end;

procedure Qsound(freq,delay :integer);

begin
  sound(freq);Qdelay(delay);nosound;
end;

procedure Qinfo(regel :string);

const
  lett : array[65..90] of string[1] =('A','B','C','D','E','F','G','H',
  'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');

var
  kleur  : byte;
  aantal : integer;

begin
  x :=40-(round(length(regel)/2));
  Qhor(4,23,74,219,0);
  for p :=1 to length(regel) do begin          { zoekt de hoofdletters op }
    s :=copy(regel,p,1);
    kleur :=7;                                    { en zet deze om in een }
    for aantal :=65 to 90 do begin                         { andere kleur }
      if lett[aantal]=s then kleur :=13;
    end;
    gotoxy(x+1,23);
    textbackground(0);
    textcolor(kleur);
    write(s);
    inc(x);
  end;
  textbackground(0);
end;

procedure Qwindow(lx,ly,rx,ry :integer;kleur :byte);

begin
  textcolor(kleur);
  window(lx,ly,rx,ry);clrscr;window(lx,ly,rx+1,ry);
  gotoxy(1,1);write(chr(218));                      { linksboven }
  for p :=1 to ((rx -lx) -1) do write(chr(194));    { boven }
  write(chr(191));                                  { rechtsboven }
  for p :=1 to ((ry -ly) -1) do begin
    gotoxy(1,1 +p);write(chr(195));                 { links }
    gotoxy((rx -lx)+1,1 +p);write(chr(180));        { rechts }
  end;
  gotoxy(1,(ry -ly) +1);write(chr(192));            { linksonder }
  for p :=1 to ((rx -lx) -1) do write(chr(193));    { onder }
  write(chr(217));                                  { rechtsonder }
  window(1,1,80,25);
end;

procedure read_dacs(Var Dac : DacType);

begin
  regs.ax := $1017;
  regs.bx := 0;
  regs.cx := 256;
  regs.es := SEG(Dac);
  regs.dx := Ofs(Dac);
  Intr($10, regs);
end;

procedure write_dacs(Dac : DacType);

begin
 regs.ax := $1012;
 regs.bx := 0;
 regs.cx := 256;
 regs.es := seg(Dac);
 regs.dx := Ofs(Dac);
 Intr($10, regs);
end;

procedure Qfadeout(Speed : Integer);

begin;
  Repeat
    erg := 0;
    For x := 1 to 256 do
      For y := 1 to 3 do
      begin
        if dac2[x, y] > 0 then
          DEC(dac2[x, y]);
        erg := erg + dac2[x, y];
      end;
    Write_Dacs(dac2);
    Qdelay(Speed);
  Until erg = 0;
end;

procedure QfadeIn(Speed : Integer);

begin;
  Repeat
    erg := 0;
    For x := 1 to 256 do
      For y := 1 to 3 do
      begin
       if dac2[x, y] < dac1[x, y] then
         INC(dac2[x,y]);
       erg := erg + dac2[x, y];
      end;
    Write_Dacs(dac2);
    Qdelay(Speed);
  Until (erg = gesamt) or (KeyPressed);
  Write_Dacs(dac1);
end;

function Qerror(ErrorCode :INTEGER):STRING;

begin
  case ErrorCode OF
          0: QError := 'No Error';
          2: QError := 'File Not Found';
          3: QError := 'Path Not Found';
          4: QError := 'Too Many Open Files';
          5: QError := 'File Access Denied';
          6: QError := 'Invalid File Handle';
         12: QError := 'Invalid File Access Code';
         15: QError := 'Invalid Drive Number';
         16: QError := 'Cannot Remove Current Directory';
         17: QError := 'Cannot Rename Across Drives';
         18: QError := 'File access error';
        100: QError := 'Disk Read Error';
        101: QError := 'Disk Write Error';
        102: QError := 'File Not Assigned';
        103: QError := 'File Not Open';
        104: QError := 'File Not Open For Input';
        105: QError := 'File Not Open For Output';
        106: QError := 'Invalid Numeric Format';
        150: QError := 'Disk Is Write-Protected';
        151: QError := 'Unknown Unit';
        152: QError := 'Drive Not Ready';
        153: QError := 'Unknown Command';
        154: QError := 'CRC Error In Data';
        155: QError := 'Bad Drive Request Structure Length';
        156: QError := 'Disk Seek Error';
        157: QError := 'Unknown Media Type';
        158: QError := 'Sector Not Found';
        159: QError := 'Printer Out Of Paper';
        160: QError := 'Device Write Fault';
        161: QError := 'Device Read Fault';
        162: QError := 'Hardware Failure';
  end;
end;

function Qprinter_ok :boolean;

begin
  If (Port[$379]) And (16) <> 16 Then
     QPrinter_OK := False
  Else
     QPrinter_OK := True;
end;

{******************************* RAAM *************************************}

function F_Video :Word;

var
  Regs       : REGISTERS;

begin
  INTR($11, Regs);
  if (Regs.AL and 48) = 48 then F_Video := $B000
    else F_Video := $B800;
end;

procedure InitVensters;

begin
  New(VideoVenster);
  for p := 0 to MaxVensters do New(raam[p]);
  with VideoVenster^ do begin
    VenX1 := 0;
    VenY1 := 0;
    VenX2 := 82;
    VenY2 := 26;
  end;
  VenTeller := 0;
  raam[VenTeller]^ := VideoVenster^;
  VideoVenster := Ptr(F_Video, $0000);
end;

procedure Kader1(x,y,xx,yy,ak :Byte);             { voor kleur }

begin
  textbackground(ak);
  window(x,y,xx,yy);clrscr;window(x,y,xx+1,yy);
  gotoxy(1,1);write(chr(218));
  gotoxy(1,(yy-y+1));write(chr(192));
  gotoxy((xx-x+1),1);write(chr(191));
  gotoxy((xx-x+1),(yy-y+1));write(chr(217));

  for p := 2 to(xx-x) do begin gotoxy(p,1);write(chr(194));end;
  for p := 2 to(xx-x) do begin gotoxy(p,(yy-y+1));write(chr(193));end;
  for p := 2 to(yy-y) do begin gotoxy(1,p);write(chr(195));end;
  for p := 2 to(yy-y) do begin gotoxy((xx-x+1),p);write(chr(180));end;

  window(x+1,y+1,xx-2,yy-1);
  textbackground(0);
end;

procedure Kader2(x,y,xx,yy,ak :Byte);      { voor monocroom }

begin
  textbackground(ak);
  window(x,y,xx,yy);clrscr;window(x,y,xx+1,yy);
  gotoxy(1,1);write(chr(218));
  gotoxy(1,(yy-y+1));write(chr(192));
  gotoxy((xx-x+1),1);write(chr(191));
  gotoxy((xx-x+1),(yy-y+1));write(chr(217));

  for p := 2 to(xx-x) do begin gotoxy(p,1);write(chr(196));end;
  for p := 2 to(xx-x) do begin gotoxy(p,(yy-y+1));write(chr(196));end;
  for p := 2 to(yy-y) do begin gotoxy(1,p);write(chr(179));end;
  for p := 2 to(yy-y) do begin gotoxy((xx-x+1),p);write(chr(179));end;

  window(x+1,y+1,xx-2,yy-1);
  textbackground(0);
end;

procedure Qopen_window(x,y,xx,yy,color,back :Byte);

begin
  textcolor(color);
  if (VenTeller < MaxVensters) and (x < xx) and (x >= 1) and
  (xx <= 80) and (y < yy) and (y >= 1) and (yy <= 25) then begin
    raam[VenTeller]^.Data :=VideoVenster^.Data;
    raam[VenTeller]^.XPos :=WHEREX;
    raam[VenTeller]^.YPos :=WHEREY;
    Inc(VenTeller);
    WINDOW(x+1,y+1,xx-2,yy-1);
    with raam[VenTeller]^ do begin
      VenX1 := x;
      VenY1 := y;
      VenX2 := xx;
      VenY2 := yy;
    end;
    if f_video =$B800 then kader1(x,y,xx,yy,back)
      else kader2(x,y,xx,yy,back);
  end
  else begin
    window(1,1,80,25);clrscr;
    gotoxy(3,5);
    write('FOUT MET VENSTERS ');
    delay(1000);
  end;
end;

procedure Qclose_window;

begin
  if VenTeller > 0 then begin
    Dec(VenTeller);
    VideoVenster^.Data :=raam[VenTeller]^.Data;
    with raam[VenTeller]^ do begin
      WINDOW(VenX1+1,VenY1+1,VenX2-2,VenY2-1);
      GOTOXY(XPos, YPos);
    end;
  end
  else begin
    CLRSCR;
    GOTOXY(3, 5);
    Write('GEEN VENSTER AANWEZIG ');
    DELAY(1000);
  end;
end;

Function Upcase_string(regel :string):string;

begin
  for p :=1 to length(regel) do regel[p] :=upcase(regel[p]);
  Upcase_string :=regel;
end;

Function Upcase_First_char(regel :string):string;

begin
  regel :=lowcase_string(regel);
  s :=copy(regel,1,1);
  for p :=1 to length(s) do s[p] :=upcase(s[p]);
  delete(regel,1,1);
  insert(s,regel,1);
  Upcase_First_char :=regel;
end;

Function Lowcase_string(regel:String):string;

Function DWNCase(DWNCH:Char):Char;

begin
  if dwnch in['A'..'Z'] then dwncase :=chr(ord(dwnch)+32)
    else dwncase :=dwnch;
end;

begin
  For p:=1 to LENGTH(regel) do regel[p]:=DWNCase(regel[p]);
  lowcase_string :=regel;
end;

begin
  textmode(CO80);
  InitVensters;

  Read_Dacs(dac1);
  dac2 := dac1;
  gesamt := 0;
  For x := 1 to 256 do For y := 1 to 3 do gesamt := gesamt + dac1[x, y];

  { The authors name in the beginning of this unit

  Qcursor(off);
  Qfill_screen(219,0);
  clrscr;
  Qread_char;
  Qfont_jos;
  gotoxy(26,12);textcolor(12);
  writeln('Ò¾ Ÿòâ«œ³úú ¾¡þ‚³¬ý ÷Çé øßß¿');
  Qdelay(1000);
  Qfadeout(10);
  Qreset_char;
  clrscr;
  Qfadein(0);

  }
end.