home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / gendoc / patchit.tzt / PATCHIT.TXT
Text File  |  1987-07-05  |  22KB  |  436 lines

  1. Copyright (C) 1984 Richard D. Ezzard.  Print rights reserved.
  2. This article may be freely reproduced and transmitted electronically.
  3.  
  4.                               PATCH IT UP
  5.          CP/M Patching explained, using WordStar as an example.
  6.  
  7.                           by Richard Drakeford
  8.  
  9. What Is Patching?
  10.  
  11.      To patch an assembled program means to modify the existing program
  12. directly without bothering to completely rewrite and reassemble a "new"
  13. version.  In patching, existing code is overwritten at specific memory
  14. locations to achieve specific effects, such as fixing a tiny bug or
  15. changing a single variable.  To fix up the well known WordStar program,
  16. for example, you have no choice between patching and re-writing/
  17. re-assembling the program since the source code in assembly language
  18. version is proprietary and not available to the public.
  19.  
  20.      Patching, although an expedient and inelegant way to change a
  21. program, is not in any way dishonorable.  In fact, one of the great
  22. advantages of WordStar over some other word processing programs is that
  23. WordStar contains many areas purposefully left to be patched by the user
  24. by use of the INSTALL program, thus permitting a high degree of
  25. customization of features.  And even after it is installed, the WordStar
  26. program is not locked in concrete but is still amenable to continued
  27. patching.
  28.  
  29.      Like other CP/M programs, the assembled WordStar program you
  30. purchased consists of numerous machine language instructions which are
  31. loaded sequentially into your computer's RAM beginning at address 0100h
  32. (where all CP/M COM programs load) and running upwards from there.  To
  33. patch WordStar you load it into memory and go to a particular address in
  34. memory and physically change the instruction or value contained in that
  35. address.  And SAVE the program as modified onto a disk.
  36.  
  37. Hand Patching Byte by Byte.
  38.  
  39.      To correctly install a patch, two things must be known:
  40.  
  41.      1)  the correct address in memory at which to patch.
  42.  
  43.      2)  the exact value to be inserted at that location.
  44.  
  45.      You can access specific locations at known addresses in memory by
  46. using the special program INSTALL.COM which came with your WordStar or
  47. by using the DDT.COM program which is one of the general CP/M utilities.
  48. Either will let you go directly to the location by using its address
  49. number.  Once at the location, both INSTALL and DDT will let you
  50. overwrite the current contents with the new desired value.  Call this
  51. procedure hand patching.
  52.  
  53.      Concerning the practicalities of patching by rote: If you don't
  54. need a deep understanding of what the heck goes on in WordStar when it
  55. is operating, then it is perfectly okay to install patches by rote.
  56. Perhaps you can't afford the time or just don't care to invest the hours
  57. required to gain esoteric knowledge about internal WordStar affairs.
  58. Thus, if some expert has designed a patch and you find out what it is,
  59. i.e., where to install new values and what those values are, and you
  60. desire to achieve the effects that are the result of that patch, patch
  61. away on faith.  The results will be the same for you as for someone who
  62. knows in complete detail what is going on in the bowels of the computer.
  63. You can take two aspirin without knowing all about blood chemistry.  You
  64. can change spark plugs without knowing all the theory behind internal
  65. combustion engines.
  66.  
  67. Labels: A Place By Any Other Name...
  68.  
  69.      Besides going to an address by its numerical (usually a hex number)
  70. designation, there is another method of getting to a place to patch: by
  71. reference to a NAME for the location.  Like a house in a ritzy
  72. neighborhood, an address may be known by a name in addition to a number.
  73. 1411 Seaside Heights could be known alternatively as "Seven Gables."
  74. Many computer programs may have locations identified by names, known
  75. commonly as LABELs.
  76.  
  77.      These labels are shadows remaining from the source code.  Before it
  78. was assembled into a monster collection of machine language code, the
  79. assembly language source WordStar program instruction segments had names
  80. which roughly indicated their function.  During assembly and conversion
  81. to machine language the labels themselves disappeared but the functions
  82. of each label came out to be at specific addresses (somewhat arbitrary,
  83. depending on the assembly process).  If you know where the code doing a
  84. certain function came out to be after assembly, it is often convenient
  85. to refer to that location by its functional label.
  86.  
  87.      In fact, it is so convenient that INSTALL programs (which are used
  88. to modify an assembled program) often have an internal index so they
  89. (the INSTALL programs) know which locations in the assembled program
  90. belong to which labels.  Thus, if you know the label of the function or
  91. variable you want to get to, using such a specially rigged INSTALL
  92. program as a tool you can go to the location by entering the label name
  93. rather than the numerical address.  If you know the label and use the
  94. right INSTALL program which can find the location by label name, you do
  95. not ever need to know the numerical address.
  96.  
  97.      To repeat, labels are a convenient way to refer to the beginning
  98. address of a group of machine language instructions or to refer to a
  99. variable location.  As a specific example, the label "BLDSTR" refers to
  100. a variable location which contains the value which WordStar will use to
  101. determine how many times to make the printer strike the paper when
  102. boldface printing is called for.
  103.  
  104.      Some other examples of the labels used in the WordStar program are:
  105.  
  106.      PALT - the location where you can store the code to be sent to a
  107. printer to start printing in an alternate character size.  WordStar would
  108. refer to this location when it encounters a control character in a file
  109. while printing.
  110.  
  111.      HAVBSY - A location which can be marked to indicate that WordStar
  112. can find out if the printer is ready for information during concurrent
  113. printing and editing.  WordStar will then operate differently than it
  114. would if it couldn't check on the printer.
  115.  
  116.      ERAEOL - where code which gets the screen to instantly erase from
  117. the cursor position to the end of line (varies depending on your system)
  118. can be installed.
  119.  
  120.      There are literally hundreds of labels associated with WordStar.
  121. As you can see, although some can be pretty cryptic, labels do often
  122. have a kind of mnemonic association with their actual function.
  123.  
  124.      Labels for patch locations are also a convenience for humans to use
  125. when talking about patches.  Often you will find references to label
  126. locations published in the human-readable English language as "indexes"
  127. to WordStar in magazine articles and tip sheets, or in text files.  Such
  128. indexes will give a label, its function, the number of its address in
  129. the assembled WordStar program, and a hex value that is recommended for
  130. entry at that location to make WordStar perform in a certain way.
  131.  
  132.      As an example, you might run across a tip phrased like this: "Patch
  133. the value of DEL3 to a higher number such as 1Fh in order to delay the
  134. appearance of prefix menus after you are familiar with most commands."
  135.  
  136.        Conveniently, even though addresses have changed from version to
  137. version, the labels have remained the same for different CP/M versions
  138. of WordStar and if you know a label for a function in WordStar 2.26, you
  139. can use the same label to get to the location of that function in
  140. WordStar 3.0 or 3.3.  MicroPro was quite good about keeping the
  141. continuity of labels from one version of WordStar to another, even
  142. though the addresses necessarily changed as the program was re-written
  143. and reassembled.
  144.  
  145.      To recap, hand patching is direct overwriting at specific locations
  146. in memory after a program has been loaded into memory.  There are several
  147. ways to get to a WordStar patch location:  1) go directly to the
  148. hexadecimal number address if known (you can use DDT.COM or INSTALL.COM)
  149. and 2) refer to a functional label name and go to the label via INSTALL
  150. which knows where the labels are, or 3) look up the label in an English
  151. index to label addresses and then go to the address number by DDT or
  152. INSTALL.  After writing new values directly into various locations, the
  153. program is saved in its modified (patched) form.
  154.  
  155. Batches of Patches
  156.  
  157.      So far we have been talking about patching individual WordStar
  158. locations one by one--hand patching.  The ultimate in patching
  159. proficiency, however, is to accomplish wholesale patches by writing an
  160. assembly language program which, when run, modifies numerous WordStar
  161. locations all at once.  Automatic patching! Programs which modify
  162. WordStar are indeed feasible and in fact many such programs have been
  163. written.  Some are commercial and proprietary but quite a few have been
  164. donated to the public domain by their authors and are free for the
  165. asking.
  166.  
  167.      Although most WordStar users are not ready to write a WordStar
  168. modifying program, many users are capable of running an already written
  169. program which modifies WordStar in some desirable way--say to install
  170. the collection of patches which lets WordStar control a particular
  171. printer.  Such programs may be obtained from other WordStar users, from
  172. user clubs and user group libraries, and often from electronic bulletin
  173. board systems accessible by telephone.  Once you obtain such a program,
  174. it is a simple matter to give the CP/M command which runs the program
  175. and patches a WordStar for you.
  176.  
  177.      As an example of what can be done along this line, there is a
  178. reasonably priced commercial printer installer program which will
  179. automatically modify WordStar to work with your selection from a menu of
  180. any one of a dozen printers.  Plus install other features.  It should be
  181. noted that INSTALL programs also can automatically spray batches of
  182. patches into a program if the correct menu choices are available.
  183. However, no INSTALL can cover every contingency that may arise.
  184.  
  185.      Of course, if you use an automatic WordStar patching program to
  186. install some patches, you will be trusting that the programmer fixed it
  187. so his program goes to the right locations and makes the right
  188. modifications.  Also you may be forced to eat the whole meal the
  189. programmer has prepared whether you like everything on the plate or not.
  190. Another drawback might be that you may want to install features in two
  191. programs but may not be able to because they have been written so that
  192. they conflict with each other.
  193.  
  194.      And since the WordStar feature choices are numerous and there are
  195. many different computer/ printer/ system combinations, there is a good
  196. chance of not finding an existing program which patches WordStar on your
  197. system exactly the way you want it to be patched.  So you may be
  198. interested in another method which allows somewhat more flexibility of
  199. choice.
  200.  
  201. Overlay On MacDuff.
  202.  
  203.      The final method of patching up for discussion is not quite
  204. assembly language programming but does use an assembler to install a
  205. selected batch of patches.  This is the hybrid "overlay" method, which
  206. yields a good compromise between freedom of choice of patches and
  207. automation of the actual installation of new values.  You write a very
  208. simple assembly language program which does nothing more than designate
  209. certain values for certain specific locations, as many or as few as you
  210. like.  Put these in a program file named, for example, PATCH.ASM (the
  211. name can be anything you want but the extension must be .ASM).
  212.  
  213.      Assemble the "program" and save the resulting .HEX type file.  You
  214. load your WordStar COM program into memory with DDT, and then "overlay"
  215. the prepared hex file (by reading in on top of WS.COM) to modify the
  216. designated locations.  Use the DDT -I and -R commands to accomplish
  217. this.  Then save your newly touched up WordStar, perhaps under a new
  218. name such as WSTEST.COM.  (Consult a CP/M tutorial to determine how big
  219. a chunk of memory to save.)
  220.  
  221.      The minimum such patching program would consist of the following:
  222.  
  223.           org nnnnh
  224.           db  0nnh
  225.  
  226. where org gives the hex address of the location to be patched and db
  227. gives the specific hex value to be placed there.  (The leading 0 is
  228. required by the assembler to unambiguously identify the following value
  229. as a number since db's may also include alpha characters.)  Yes, such a
  230. tiny "program" can be assembled using the CP/M assembler, ASM.COM and
  231. the resulting hex file can be overlayed into an existing WordStar
  232. WS.COM.
  233.  
  234.      More than one sequential byte might be indicated, as follows:
  235.  
  236.           org 06CB
  237.            db 002h,01Bh,022h
  238.  
  239. which indicates that the three locations starting at address 06CB are to
  240. be patched with values 02, 1B, and 22 (hexadecimal notation).
  241.  
  242.      Quite likely, the ASM file you make up will consist of several
  243. locations to be patched with several bytes starting at each location.
  244. As follows:
  245.  
  246.           org 06CBh
  247.            db 002h,01Bh,022h
  248.           org 06D3h
  249.            db 002h,01Bh,021h
  250.  
  251.      You may want to include labels and comments to yourself so that you
  252. can easily go back and change things again later.  A heavily commented
  253. PATCH.ASM file which could be used as a "template" to patch several
  254. locations of WordStar Version 2.26 is included as an example -- see
  255. Figure 1.   And a minimum configuration of the same program as it might
  256. appear after filling in is included as Figure 2.
  257.  
  258.      One good reason for doing patches by this overlay method (rather
  259. than modifying byte by byte with INSTALL or DDT) is that you can make
  260. ready all your changes in one file and proof-read for correctness before
  261. actually modifying your working program. Whereas if you type them
  262. directly into the program byte by byte using INSTALL or DDT, you risk
  263. human error that can go undetected until the program is run.
  264.  
  265.      To assure yourself that this kind of minimal assembly language
  266. patching file does assemble properly and that you know how to do it, you
  267. can use the template file for experimentation. Probably you will want to
  268. eliminate the comments and some of the addresses and patch identifiable
  269. "nonsense" values (such as 0FFh) into various addresses.  Use WordStar
  270. in the "N" non-document mode to make up the file.  (There is something
  271. recursively poetic in using WordStar to modify itself.)
  272.  
  273.      Then assemble your PATCH.ASM (at the CP/M A> prompt do
  274. "ASM PATCH").
  275.      Next load your WordStar with DDT ("DDT WS.COM").
  276.      Insert your PATCH.HEX file ("-IPATCH.HEX" followed by "-R").
  277.      Exit DDT (-g0).
  278.      Save your new WordStar ("SAVE 56 WSTEST.COM").
  279.  
  280.      To verify that your patches took place, use DDT again to load the
  281. new WordStar ("DDT WSTEST.COM") and look in the locations you wanted to
  282. change ("-Snnnn" or "-Dnnnn").  If the patching was effective, at the
  283. addresses given in your org statements, your WordStar should now hold
  284. the values you listed in your db statements.
  285.  
  286. Semi-automatic Overlay
  287.  
  288.      With that procedure understood, let it now be known that there is
  289. an even easier way to accomplish the same thing.  There is available in
  290. the public domain, free for anyone's use, a "linking loader" named
  291. MLOAD.COM.  This is the work of Mr. Ronald G. Fowler who has freely
  292. donated his program for the use of the computering public.
  293.  
  294.      MLOAD.COM is available on many telephone RCP/M's and in the disk
  295. libraries of various user's clubs.  The latest version I have seen is
  296. MLOAD21 (version 2.1) and it is often distributed along with the public
  297. domain communications program MEX because MLOAD is handy for combining
  298. overlays for specific computers with the generic MEX.COM.
  299.  
  300.      I find that MLOAD will automatically spray patches into WordStar
  301. addresses after you write (using WordStar of course) a very simple
  302. PATCH.ASM file (just orgs and dbs as previously described) and make a
  303. hex file out of it.
  304.  
  305.      Whole procedure is:
  306.      A>ASM PATCH (previously written ASM of orgs and dbs)
  307.      A>MLOAD WSNEW.COM=WS.COM, PATCH.HEX
  308.  
  309.      The first command assembles your file PATCH.ASM and makes up a
  310. PATCH.HEX file (as well as a PATCH.PRN file, extraneous to our purpose
  311. here, so not discussed).  The second command makes up a new file,
  312. WSNEW.COM by combining your regular WS.COM and the newly conceived
  313. PATCH.HEX.
  314.  
  315.      The same thing can be accomplished with DDT commands and a SAVE as
  316. described earlier, but MLOAD just does it, and fast.  Many people owe
  317. thanks to Ronald G. Fowler for providing this nifty tool to the public
  318. domain.
  319.  
  320.      Modifying a program by this "overlay" or "insert" method simplifies
  321. patching a lot for me, and is a more flexible procedure than using
  322. someone else's pre-canned set of patches which might not be just what
  323. you want.
  324.  
  325. Conclusion.
  326.  
  327.      The foregoing advice and instructions should serve as an
  328. introduction to the idea of patching.  Applying a patch avoids the
  329. bother (or impossible task in the case of proprietary programs) of going
  330. back to the original assembly language source code and making
  331. modifications in assembly language by writing within the entire major
  332. program.  Rather than doing that and then re-assembling the entire
  333. program from scratch, the modifications are applied to the existing COM
  334. file by direct overwrite.
  335.  
  336.      Several methods have been discussed for applying patches.
  337. They are:
  338.      1)  the use of proprietary INSTALL programs, and the use of
  339. DDT.COM to do hand patching, byte by byte.
  340.      2)  the use of canned programs which apply batches of
  341. specific pre-configured patches.
  342.      3)  a simple overlay method where your patches are written
  343. up beforehand and assembled into a HEX file which is overlaid on
  344. the main program.  Either DDT.COM or the more convenient
  345. MLOAD.COM may be used to integrate the overlay patch file with
  346. the main program which gets patched.
  347.  
  348. End of PATCH IT UP article.  Figures follow:
  349. -------------------------------
  350. -------------------------------
  351. FIGURE 1 - Example assembly language program file for positioning
  352. patches:
  353. ;                           PATCH.ASM
  354. ;                   for WordStar Version 2.26
  355. ;This is a "fill in the blanks" template file for patching printer
  356. ;control codes into the WordStar printer control patching areas.
  357. ;Consult printer manual to determine exact values which go into
  358. ;each control code area. First value in each area is the number of
  359. ;following bytes to be sent to the printer when the trigger
  360. ;control code is encountered in file while printing. The
  361. ;subsequent bytes (up to four) are the actual hex codes to be sent
  362. ;to the printer.  For many printers, the first value will be
  363. ;ESCAPE, or hex 1B. With INSERT off, substitute hex values for the
  364. ;'nn' indicators in the following program.  Then replace all unused
  365. ;'nnh' with value 00h before assembly.  Or if a location
  366. ;previously patched and no change desired, delete from this file.
  367. ;
  368. ;Label         Address                  Code which triggers
  369. ;              & values
  370. ;'nn' indicators in the following program. Then replace all unused
  371. ;'nnh' with value 00h before assembly.  OR delete from this file.
  372. ;
  373. ;Label         Address                  Code which triggers
  374. ;              & values
  375. ;
  376.         org    06C9h
  377. USR1    db     0nnh                     ; ^Q
  378.         db     0nnh,0nnh,0nnh,0nnh      ;
  379. ;
  380.         org    06CEh
  381. USR2    db     0nnh                     ; ^W
  382.         db     0nnh,0nnh,0nnh,0nnh      ;
  383. ;
  384.         org     06D3h
  385. USR3    db      0nnh                    ; ^E
  386.         db      0nnh,0nnh,0nnh,0nnh     ;
  387. ;
  388.         org     06D8h
  389. USR4    db      0nnh                    ; ^R
  390.         db      0nnh,0nnh,0nnh,0nnh     ;
  391. ;
  392. END
  393. ;When properly filled in, use CP/M's assembler ASM.COM to assemble this
  394. ;file which can be named anything you want but should have the extension
  395. ;ASM.  After assembly, the resulting HEX file may be used to "overlay" a
  396. ;copy of WordStar version 2.26 and the hex codes you entered at the
  397. ;various "blanks" above will be plugged into the correct WS.COM locations
  398. ;to make the printer function appropriately when the various control
  399. ;codes are entered in a text file.
  400. ;
  401. ;The procedure is:
  402. ;1.  Amend this file with WordStar in the non-document mode.
  403. ;2.  Assemble this file to obtain hex file.
  404. ;3.  Use DDT to load WS.COM (A>DDT WS.COM)
  405. ;4.  Use DDT to overlay hex file on WS.COM
  406. ;        a. -INEWFILE.HEX
  407. ;        b. -R
  408. ;5.  Exit DDT (G0).
  409. ;6.  Use CP/M's SAVE command to preserve modified WS.
  410. ;        (SAVE 56 WSNEW.COM)
  411. ;7.  Test modified WS for correct printer driving operation before
  412. ;replacing original WS.
  413. ;Or, if available, the MLOAD.COM utility may be used to do steps
  414. ;3 through 6 in one simple operation:
  415. ;        MLOAD WSNEW.COM=WS.COM,NEWFILE.HEX
  416. ;End of WordStar Printer Patching File.
  417. -------------------------------
  418. -------------------------------
  419. FIGURE 2 - Minimum assembly language program file "filled in."
  420.  
  421.         org    06C9h
  422. USR1    db     003h                     ; ^Q
  423.         db     01Bh,057h,000h           ;
  424. ;
  425.         org    06CEh
  426. USR2    db     003h                     ; ^W
  427.         db     01Bh,057h,001h           ;
  428. END
  429.  
  430. Comment:  This would patch the eight different locations necessary to
  431. control the double wide printing of an Epson MX-80 printer.  So that
  432. when the control character ^W is encountered when WordStar prints a
  433. file, the correct sequence is sent to the printer in order to turn on
  434. the double-wide character font.  And when ^Q is encountered, double-wide
  435. would be turned off again.
  436.