home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / turbopas / pscreen.zip / SCREEN.PAS < prev   
Pascal/Delphi Source File  |  1989-11-01  |  8KB  |  232 lines

  1. PROGRAM Screen_Writing_Routines;
  2. {$D-,R-,S-,V- }
  3. {    2LT Michael P. Kelly, U.S. Army Signal Corps
  4.  
  5.     This program shows you 5 possible ways in which to place text on the
  6.     screen using QuickPascal.  They same can be done in Turbo Pascal as
  7.     well.  The 5 methods (and there are more than just these) are:
  8.  
  9.         1.  Write(ln) using the Crt UNIT global variable set to True
  10.             for direct to screen memory writing.
  11.         2.  Write(ln) using the Crt UNIT global variable set to False
  12.             for screen writing using the BIOS.
  13.         3.  Using a data structure imitating the screen and placing it
  14.             over the screen memory using the ABSOLUTE keyword.  Then
  15.             make all writes to that data structure (VIDEORAM).
  16.         4.  Using the MEM[] function to access the screen memory
  17.             directly and placing the character and attribute there
  18.             yourself.  Similar in concept to #3, but attacking it from
  19.             at different angle.
  20.         5.  Using a pointer of type byte to write directly to the
  21.             video memory in RAM.
  22.  
  23.     The program writes 'limit' number of lines on the screen of all X's
  24.     for each method mentioned above.  A timer is run on each and the
  25.     time for each is then displayed as well as a ratio of performance
  26.     versus the fastest one.  IF YOU OWN A MONOCHROME MONITOR - change the
  27.     CONST VID_SEG from $B800 to $B000 and recompile.
  28.  
  29.     I recently bought QuickPascal v1.0 by MicroSoft for $59.61 at a local
  30.     software store.  It was a deal!  While my native tongue is C, Pascal
  31.     is good to come back to now and then.  But as always, it is not the
  32.     language that matters, it is the programmer!  So I will avoid any
  33.     discussions as to which language is superior.  Anyway, if you can
  34.     get your hands on QuickPascal, do it while the price is still low.  It
  35.     is a nice compiler to have around for the price.  I like to take a
  36.     vacation from Turbo C once in a while as well.
  37.  
  38.     If you are looking to do any serious programming at all in Pascal, you
  39.     will eventually come across choosing a method by which to write text
  40.     to the screen.  Speed and compatibility are your two major concerns
  41.     at this point.  They also seem to be inversely proportionate to each
  42.     other.  These routines and the program to test them will show you
  43.     basically what each of the 5 methods has to offer in the way of speed
  44.     and ease of implementation.  Feel free to chop these routines out and
  45.     use them in your code!
  46.  
  47.     If anyone has source code to some good Turbo Pascal routines, please
  48.     contact me vie Email at mkelly@galaxy.afit.af.mil or CompuServe
  49.     73747,420.  I would like to run it through QuickPascal so I can have
  50.     some .QPU (Microsoft's version of .TPU) files for program development.
  51. }
  52. USES CRT,
  53.     DOS,
  54.     CONVERT;  { My personal UNIT of data conversion routines. }
  55. CONST
  56.     VID_SEG = $B800;
  57. TYPE
  58.     CELL = RECORD
  59.         CHARACTER : CHAR;
  60.         ATTRIBUTE : BYTE;
  61.     END;
  62.     VIDEORAM = ARRAY[1 .. 2000] OF CELL;
  63. VAR
  64.     I             : INTEGER;
  65.     C             : CHAR;
  66.     H1,M1,S1,HUN1     : WORD;
  67.     H2,M2,S2,HUN2     : WORD;
  68.     H3,M3,S3,HUN3     : WORD;
  69.     H4,M4,S4,HUN4     : WORD;
  70.     H5,M5,S5,HUN5    : WORD;
  71.     H6,M6,S6,HUN6  : WORD;
  72.     H7,M7,S7,HUN7     : WORD;
  73.     H8,M8,S8,HUN8    : WORD;
  74.     H9,M9,S9,HUN9    : WORD;
  75.     H10,M10,S10,HUN10 : WORD;
  76.     B,D,M,A,P        : INTEGER;
  77.     VIDEO         : VIDEORAM ABSOLUTE VID_SEG:0000;
  78.     LIMIT        : INTEGER;
  79.  
  80. PROCEDURE WRITE_CHAR(ROW,COL : INTEGER;CH : CHAR;ATTR : BYTE);
  81. VAR
  82.     TMP : INTEGER;
  83. BEGIN
  84.     TMP := (ROW * 80) + COL;
  85.     VIDEO[TMP].CHARACTER := CH;
  86.     VIDEO[TMP].ATTRIBUTE := ATTR;
  87. END;
  88.  
  89. PROCEDURE WRITE_CHAR_2MEM(ROW,COL : INTEGER;CH : CHAR;ATTR : BYTE);
  90. VAR
  91.     OFFSET : INTEGER;
  92. BEGIN
  93.     OFFSET := (ROW * 160) + (COL * 2);
  94.     MEM[VID_SEG:OFFSET] := CHAR2BYTE(CH);
  95.     MEM[VID_SEG:OFFSET+1] := ATTR;
  96. END;
  97.  
  98. PROCEDURE WRITE_STR_2MEM(ROW,COL : INTEGER;STR : STRING;ATTR : BYTE);
  99. VAR
  100.     I : INTEGER;
  101. BEGIN
  102.     FOR I := 1 TO LENGTH(STR) DO
  103.     BEGIN
  104.         WRITE_CHAR_2MEM(ROW,COL+I-1,STR[I],ATTR);
  105.     END;
  106. END;
  107.  
  108. PROCEDURE WRITE_STR(ROW,COL : INTEGER;STR : STRING;ATTR : BYTE);
  109. VAR
  110.     I : INTEGER;
  111. BEGIN
  112.     FOR I := 1 TO LENGTH(STR) DO
  113.     BEGIN
  114.         WRITE_CHAR(ROW,COL+I-1,STR[I],ATTR);
  115.     END;
  116. END;
  117.  
  118. PROCEDURE WRITE_PTR_CHAR(ROW,COL : INTEGER;CH : CHAR;ATTR : BYTE);
  119. VAR
  120.     OFFSET : INTEGER;
  121.     BYTE_PTR : ^BYTE;
  122. BEGIN
  123.     OFFSET := (ROW * 160) + (COL * 2);
  124.     BYTE_PTR := PTR(VID_SEG,OFFSET);
  125.     BYTE_PTR^ := CHAR2BYTE(CH);
  126.     BYTE_PTR := PTR(VID_SEG,OFFSET+1);
  127.     BYTE_PTR^ := ATTR;
  128. END;
  129.  
  130. PROCEDURE WRITE_PTR_STR(ROW,COL : INTEGER;STR : STRING;ATTR : BYTE);
  131. VAR
  132.     I : INTEGER;
  133. BEGIN
  134.     FOR I := 1 TO LENGTH(STR) DO
  135.     BEGIN
  136.         WRITE_PTR_CHAR(ROW,COL+I-1,STR[I],ATTR);
  137.     END;
  138. END;
  139.  
  140. BEGIN
  141.     TEXTCOLOR(LIGHTRED);
  142.     TEXTBACKGROUND(BLACK);
  143.     CLRSCR;
  144.     WRITELN('SCREEN WRITING TIME TEST using QuickPascal v1.0');
  145.     WRITELN;
  146.     WRITELN('Anywhere from 25 to 300 is a good number of repetitions.');
  147.     WRITELN;
  148.     WRITE('ENTER THE NUMBER OF REPETITIONS: ');
  149.     READLN(LIMIT);
  150.     IF LIMIT < 25 THEN LIMIT := 25;  { Anything less is useless! }
  151.     DIRECTVIDEO := FALSE;
  152.     CLRSCR;
  153.     TEXTCOLOR(RED);
  154.     GETTIME(H1,M1,S1,HUN1);
  155.     FOR I := 1 TO LIMIT DO
  156.     BEGIN
  157.         WRITELN('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
  158.     END;
  159.     GETTIME(H2,M2,S2,HUN2);
  160.  
  161.     CLRSCR;
  162.     DIRECTVIDEO := TRUE;
  163.     TEXTCOLOR(LIGHTBLUE);
  164.     GETTIME(H3,M3,S3,HUN3);
  165.     FOR I := 1 TO LIMIT DO
  166.     BEGIN
  167.         WRITELN('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
  168.     END;
  169.     GETTIME(H4,M4,S4,HUN4);
  170.     CLRSCR;
  171.     GETTIME(H5,M5,S5,HUN5);
  172.     FOR I := 1 TO LIMIT DO
  173.     BEGIN
  174.         WRITE_STR((I-1) MOD 25,1,'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',13);
  175.     END;
  176.     GETTIME(H6,M6,S6,HUN6);
  177.     CLRSCR;
  178.     GETTIME(H7,M7,S7,HUN7);
  179.     FOR I := 1 TO LIMIT DO
  180.     BEGIN
  181.         WRITE_STR_2MEM((I-1) MOD 25,1,'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',6);
  182.     END;
  183.     GETTIME(H8,M8,S8,HUN8);
  184.  
  185.     CLRSCR;
  186.     GETTIME(H9,M9,S9,HUN9);
  187.     FOR I := 1 TO LIMIT DO
  188.     BEGIN
  189.         WRITE_PTR_STR((I-1) MOD 25,1,'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',11);
  190.     END;
  191.     GETTIME(H10,M10,S10,HUN10);
  192.  
  193.     CLRSCR;
  194.     TEXTCOLOR(YELLOW);
  195.     WRITELN('--------------------------- STATISTICS ------------------------------');
  196.     TEXTCOLOR(LIGHTRED);
  197.     WRITELN;
  198.     WRITELN('START BIOS   = ',H1:2,':',M1:2,':',S1:2,':',HUN1:2);
  199.     WRITELN('STOP  BIOS   = ',H2:2,':',M2:2,':',S2:2,':',HUN2:2);
  200.     WRITELN;
  201.     WRITELN('START DIRECT = ',H3:2,':',M3:2,':',S3:2,':',HUN3:2);
  202.     WRITELN('STOP  DIRECT = ',H4:2,':',M4:2,':',S4:2,':',HUN4:2);
  203.     WRITELN;
  204.     WRITELN('START MEM[]  = ',H7:2,':',M7:2,':',S7:2,':',HUN7:2);
  205.     WRITELN('STOP  MEM[]  = ',H8:2,':',M8:2,':',S8:2,':',HUN8:2);
  206.     WRITELN;
  207.     WRITELN('START ARRAY  = ',H5:2,':',M5:2,':',S5:2,':',HUN5:2);
  208.     WRITELN('STOP  ARRAY  = ',H6:2,':',M6:2,':',S6:2,':',HUN6:2);
  209.     WRITELN;
  210.     WRITELN('START PTR    = ',H9:2,':',M9:2,':',S9:2,':',HUN9:2);
  211.     WRITELN('STOP  PTR    = ',H10:2,':',M10:2,':',S10:2,':',HUN10:2);
  212.     B := ((M2*6000)+(S2*100)+HUN2)-((M1*6000)+(S1*100)+HUN1);
  213.     D := ((M4*6000)+(S4*100)+HUN4)-((M3*6000)+(S3*100)+HUN3);
  214.     M := ((M6*6000)+(S6*100)+HUN6)-((M5*6000)+(S5*100)+HUN5);
  215.     A := ((M8*6000)+(S8*100)+HUN8)-((M7*6000)+(S7*100)+HUN7);
  216.     P := ((M10*6000)+(S10*100)+HUN10)-((M9*6000)+(S9*100)+HUN9);
  217.     TEXTCOLOR(LIGHTCYAN);
  218.     WRITELN;
  219.     WRITE('BIOS ROUTINE  TOOK  (',B:4,') 1/100s of a second, ');
  220.     WRITELN('Ratio of ',(B/M):4:2);
  221.     WRITE('DIRECTVIDEO   TOOK  (',D:4,') 1/100s of a second, ');
  222.     WRITELN('Ratio of ',(D/M):4:2);
  223.     WRITE('PTR ROUTINE   TOOK  (',P:4,') 1/100s of a second, ');
  224.     WRITELN('Ratio of ',(P/M):4:2);
  225.     WRITE('MEM[] ROUTINE TOOK  (',A:4,') 1/100s of a second, ');
  226.     WRITELN('Ratio of ',(A/M):4:2);
  227.     WRITE('ARRAY ROUTINE TOOK  (',M:4,') 1/100s of a second, ');
  228.     WRITELN('Ratio of ',(M/M):4:2);
  229. END.
  230.  
  231.  
  232.