home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / CONCUR.ZIP / VERSION.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1986-12-16  |  5.6 KB  |  264 lines

  1. program version;
  2.  
  3. (***********************************************
  4.  
  5.   VERSION.PAS  : FIND COMPILER VERSION SPECIFIC
  6.                    LIBRARY LOCATIONS.
  7.  
  8.   AUTHOR       : J.F.J. PASSANT
  9.   VERSION      : 1.00
  10.   DATE         : 16-DEC-86
  11.  
  12. ************************************************)
  13.  
  14. {$i libdec.pas}
  15.  
  16.  
  17. type hexstring = string [79];
  18.  
  19. {$v-}
  20. function hex1 (b : byte) : char;
  21. begin
  22.   if b > 9 then b := b + 7;
  23.   hex1 := chr (b + ord ('0'));
  24. end;
  25.  
  26. function hex2 (b : integer) : hexstring;
  27. begin
  28.   hex2 := hex1 (b div 16) + hex1 (b mod 16);
  29. end;
  30.  
  31. function hex4 (b : integer) : hexstring;
  32. var mask, shft, i, a : integer;
  33.     s : hexstring;
  34. begin
  35.   mask := $f000;
  36.   shft := 12;
  37.   s [0] := #0;
  38.   for i := 1 to 4 do
  39.     begin
  40.       a := (b and mask) shr shft;
  41.       s := s + hex1 (a);
  42.       mask := mask shr 4;
  43.       shft := shft - 4;
  44.     end;
  45.   hex4 := s;
  46. end;
  47.  
  48. {$v+}
  49.  
  50.  
  51. type  addrptr  = ^integer;
  52.       byteptr  = ^byte;
  53.       vstring  = string [79];
  54.  
  55.  
  56. var addrnormvideo  : integer;
  57.     addrlowvideo   : integer;
  58.     addrappend     : integer;
  59.     addrreadln     : integer;
  60.     addrioresult   : integer;
  61.     changeflag     : boolean;
  62.  
  63.  
  64.  
  65. procedure dummy;
  66. {Declares standard procedures to find their addresses}
  67. var dummyf : text;
  68.     dummyi : integer;
  69.  
  70. begin
  71.   normvideo;
  72.   lowvideo;
  73.   append (dummyf);
  74.   readln;
  75.   dummyi := ioresult;
  76. end;
  77.  
  78.  
  79. procedure findaddresses;
  80. {Finds the addresses of the procedures declared in <dummy>}
  81. var addrdummy : integer;
  82.     p         : addrptr;
  83.  
  84. begin
  85.   addrdummy := ofs (dummy);
  86.   p := ptr (cseg, addrdummy+12);
  87.   addrnormvideo := p^ + addrdummy+14;
  88.   p := ptr (cseg, addrdummy+15);
  89.   addrlowvideo  := p^ + addrdummy+17;
  90.   p := ptr (cseg, addrdummy+26);
  91.   addrappend    := p^ + addrdummy+28;
  92.   p := ptr (cseg, addrdummy+32);
  93.   addrreadln    := p^ + addrdummy+34;
  94.   p := ptr (cseg, addrdummy+38);
  95.   addrioresult  := p^ + addrdummy+40;
  96. end;
  97.  
  98.  
  99.  
  100. procedure change (id : vstring; addr : integer);
  101. {Gives a change notification}
  102. begin
  103.   writeln ('Change constant value of "', id:11, '" to $', hex4 (addr));
  104.   changeflag := true;
  105. end;
  106.  
  107.  
  108. procedure finderror (id : vstring);
  109. {Gives an error message}
  110. begin
  111.   writeln ('Cannot find address for ', id);
  112.   changeflag := true;
  113. end;
  114.  
  115.  
  116. procedure checkattr;
  117. {Finds address of attribute bytes in library data segment}
  118. var p : addrptr;
  119.  
  120. begin
  121.   p := ptr (cseg, addrnormvideo + 2);
  122.   if p^ <> normattr then change ('normattr', p^);
  123.   p := ptr (cseg, addrlowvideo + 2);
  124.   if p^ <> lowattr then change ('lowattr', p^);
  125. end;
  126.  
  127.  
  128. procedure checkscreen;
  129. {Checks wheter the screen layout variables can be found}
  130. var row, col : integer;
  131.  
  132. begin
  133.   col := nrofcols;
  134.   row := nrofrows;
  135.   if col mod 20 <> 0 then writeln ('Address for "nrofcols" incorrect');
  136.   if (row <> 24) and (row <> 25) then
  137.     writeln ('Address for "nrofrows" incorrect');
  138. end;
  139.  
  140.  
  141. procedure checkctrlcjump;
  142. {Checks control-c jump address}
  143. var pb : byteptr;
  144.     pa : integer;
  145.  
  146. begin
  147.   pa := addrioresult - 5;
  148.   pb := ptr (cseg, pa);
  149.   if pb^ <> $BA
  150.     then finderror ('ctrlcjump')
  151.     else if pa <> ctrlcjump then change ('ctrlcjump', pa);
  152. end;
  153.  
  154.  
  155. procedure checkinitialstack;
  156. {Checks the initial SP variable address}
  157. var pb : byteptr;
  158.     pa : addrptr;
  159.     a  : integer;
  160.  
  161. begin
  162.   pa := ptr (cseg, $101);    {Find program init start address}
  163.   a  := pa^ + $103;
  164.   pa := ptr (cseg, a+1);     {Find call to init code}
  165.   a  := pa^ + a+3;
  166.   pb := ptr (cseg, a+$55);   {Pointer to 'initialstack' reference}
  167.   pa := ptr (cseg, a+$56);
  168.   if pb^ <> $A3
  169.     then finderror ('initialstack')
  170.     else if pa^ <> initialstack then change ('initialstack', pa^);
  171. end;
  172.  
  173.  
  174. procedure checkliberror;
  175. {Checks the library error variable location}
  176. var pb : byteptr;
  177.     pa : addrptr;
  178.  
  179. begin
  180.   pb := ptr (cseg, addrioresult + 2);
  181.   pa := ptr (cseg, addrioresult + 4);
  182.   if pb^ <> $86
  183.     then finderror ('liberror')
  184.     else if pa^ <> liberror then change ('liberror', pa^);
  185. end;
  186.  
  187.  
  188. procedure checkconinvar;
  189. {Checks the variable locations used by conin}
  190. var pb : byteptr;
  191.     pa : addrptr;
  192.  
  193. begin
  194.   pb := ptr (cseg, coninptr);
  195.   pa := ptr (cseg, coninptr+1);
  196.   if pb^ <> $A0
  197.     then finderror ('secondchar')
  198.     else if pa^ <> secondchar then change ('secondchar', pa^);
  199.   pb := ptr (cseg, coninptr + $20);
  200.   pa := ptr (cseg, coninptr + $22);
  201.   if pb^ <> $80
  202.     then finderror ('ctrlcflag')
  203.     else if pa^ <> ctrlcflag then change ('ctrlcflag', pa^);
  204. end;
  205.  
  206.  
  207. procedure checkretaddr;
  208. {Checks the location of retaddr}
  209. var pb : byteptr;
  210.     pa : addrptr;
  211.  
  212. begin
  213.   pb := ptr (cseg, addrioresult - 10);
  214.   pa := ptr (cseg, addrioresult - 8);
  215.   if pb^ <> $83
  216.     then finderror ('retaddr')
  217.     else if pa^ <> retaddr then change ('retaddr', pa^);
  218. end;
  219.  
  220.  
  221. procedure checkfileptr;
  222. {Checks the location of the default file pointer}
  223. var pb : byteptr;
  224.     pa : addrptr;
  225.  
  226. begin
  227.   pb := ptr (cseg, addrreadln + 10);
  228.   pa := ptr (cseg, addrreadln + 12);
  229.   if pb^ <> $C7
  230.     then finderror ('fileptr')
  231.     else if pa^ <> fileptr then change ('fileptr', pa^);
  232. end;
  233.  
  234.  
  235. procedure checkfilescratch;
  236. {Checks the location of the filescratch variable}
  237. var pb : byteptr;
  238.     pa : addrptr;
  239.  
  240. begin
  241.   pb := ptr (cseg, addrappend + 2);
  242.   pa := ptr (cseg, addrappend + 3);
  243.   if pb^ <> $A2
  244.     then finderror ('filescratch')
  245.     else if pa^ <> filescratch then change ('filescratch', pa^);
  246. end;
  247.  
  248.  
  249.  
  250. begin
  251.   findaddresses;
  252.   changeflag := false;
  253.   checkattr;
  254.   checkscreen;
  255.   checkctrlcjump;
  256.   checkinitialstack;
  257.   checkliberror;
  258.   checkconinvar;
  259.   checkretaddr;
  260.   checkfileptr;
  261.   checkfilescratch;
  262.   if not changeflag then writeln ('No changes needed !!');
  263. end.
  264.