home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 June / PCWorld_1999-06_cd.bin / Hardware / Drivers / tppatch / TPPATCH.ENG < prev    next >
Text File  |  1997-09-13  |  4KB  |  105 lines

  1. TPPATCH does fix a bug appearing in all programs that have
  2. been written using Turbo Pascal when such a program is run on a
  3. Pentium Pro 200MHz or a faster computer.
  4.  
  5. This bug causes a runtime error 200 when the startup code of
  6. Delay() is executed. The bug appears when a DIV instruction is
  7. executed and the result does not fit into the destination
  8. register.
  9.  
  10. With this bugfix you can patch all files that have been compiled with
  11. Turbo Pascal, for example Crosspoint. This procedure does also
  12. work with applications compiled for the protected mode.
  13.  
  14. To patch software without having the source of it, you can
  15. apply better methods, for example replacing Delay() if you have
  16. the runtime sources, and a unit has been posted in some
  17. newsgroups that will circumvent this with various low-level
  18. tricks.
  19.  
  20. With this patch Delay() does run correctly on all slower
  21. machines, likewise on a Pentium Pro with 200MHz. But if there
  22. are even faster processors one day, Delay() will wait a bit to
  23. short on them. But the programs patched with TPPATCH will never
  24. hang again because of the bug.
  25.  
  26. Here comes the explanation:
  27.  
  28. >530B:0087 E83C02         call   02C6
  29. >530B:008A F7D0           not    ax
  30. >530B:008C F7D2           not    dx
  31. >530B:008E B93700         mov    cx,0037
  32. >530B:0091 F7F1           div    cx
  33.                           ^^^^^^^^^
  34. >530B:0093 A35C00         mov    [005C],ax
  35.  
  36. This division on CS:0091 or CS:0099 causes exeption #0, and
  37. this causes a runtime error 200. The first procedure (here it
  38. is on CS:0087) detects how long the cpu can decrease a counter
  39. within a time of 55ms. The following two NOT instructions
  40. negate the value of the counter and divide it then by 55.
  41. (37h=55d)
  42.  
  43. The result is saved in a variable (here [005C]) und is used by
  44. Delay() later to wait exactly one millisecond.
  45.  
  46. I've changed it as follows:
  47.  
  48. >  cs:007E E88501         call   ....
  49. >  cs:0081 F7D0           not    ax
  50. >  cs:0083 F7D2           not    dx
  51. >  cs:0085 B93700         mov    cx,0037
  52. >  cs:0088 3BD1           cmp    dx,cx
  53. >  cs:008A 7205           jb     0091
  54. >  cs:008C B8FFFF         mov    ax,FFFF
  55. >  cs:008F EB02           jmp    0093
  56. >  cs:0091 F7F1           div    cx
  57. >  cs:0093 A35C00         mov    [005C],ax
  58.  
  59. This prevents the result to grow larger than a word. Of course
  60. I had to insert some instructions, so I optimized some laxities
  61. done by the programmers of BP/TP and circumvented the need
  62. to move the code completely.
  63.  
  64. before the changes:
  65.  
  66. >  cs:0062 33C0           xor    ax,ax
  67. >  cs:0064 A25100         mov    [0051],al
  68. >  cs:0067 A26100         mov    [0061],al
  69. >  cs:006A A26200         mov    [0062],al
  70. >  cs:006D 40             inc    ax
  71. >  cs:006E A25000         mov    [0050],al
  72.  
  73. after the changes:
  74.  
  75. >  cs:0062 33C0           xor    ax,ax
  76. >  cs:0064 A36100         mov    [0061],ax
  77. >  cs:0067 40             inc    ax
  78. >  cs:0068 A35000         mov    [0050],ax
  79.  
  80. The program (TPPATCH.EXE) examines the file it is commanded to
  81. patch exactly, so no exe file will be "patched to death". The
  82. position of the variables are scanned automatically, so the
  83. patch should work with *all* versions of TP7/BP7. But I haven't
  84. tested it with TP6. Of course it is possible that it also can
  85. patch those files.
  86.  
  87. Of course, the whole thing is only necessary if the unit CRT
  88. is used in the program.
  89.  
  90. It is possible to make a batch run TPPATCH on all executables
  91. on the hard disk, because TPPATCH does a bunch of tests with
  92. every file, so not a single wrong file will be patched.
  93.  
  94. Of course, compressed files have to be uncompressed before
  95. patching, for example with UNP
  96. (ftp://garbo.uwasa.fi/pc/execomp/unp411.zip).
  97.  
  98. I'm not responsible for any action that is performed by
  99. TPPATCH, nor do I give any waranty about the function of it.
  100. Before you go and patch foreign software you should take a look
  101. into a LICENSE.DOC file or anything similar .
  102.  
  103. Andreas Bauer <andi.tio@hit.handshake.de>
  104.  
  105.