home *** CD-ROM | disk | FTP | other *** search
- Copyright (C) 1984 Richard D. Ezzard. Print rights reserved.
- This article may be freely reproduced and transmitted electronically.
-
- PATCH IT UP
- CP/M Patching explained, using WordStar as an example.
-
- by Richard Drakeford
-
- What Is Patching?
-
- To patch an assembled program means to modify the existing program
- directly without bothering to completely rewrite and reassemble a "new"
- version. In patching, existing code is overwritten at specific memory
- locations to achieve specific effects, such as fixing a tiny bug or
- changing a single variable. To fix up the well known WordStar program,
- for example, you have no choice between patching and re-writing/
- re-assembling the program since the source code in assembly language
- version is proprietary and not available to the public.
-
- Patching, although an expedient and inelegant way to change a
- program, is not in any way dishonorable. In fact, one of the great
- advantages of WordStar over some other word processing programs is that
- WordStar contains many areas purposefully left to be patched by the user
- by use of the INSTALL program, thus permitting a high degree of
- customization of features. And even after it is installed, the WordStar
- program is not locked in concrete but is still amenable to continued
- patching.
-
- Like other CP/M programs, the assembled WordStar program you
- purchased consists of numerous machine language instructions which are
- loaded sequentially into your computer's RAM beginning at address 0100h
- (where all CP/M COM programs load) and running upwards from there. To
- patch WordStar you load it into memory and go to a particular address in
- memory and physically change the instruction or value contained in that
- address. And SAVE the program as modified onto a disk.
-
- Hand Patching Byte by Byte.
-
- To correctly install a patch, two things must be known:
-
- 1) the correct address in memory at which to patch.
-
- 2) the exact value to be inserted at that location.
-
- You can access specific locations at known addresses in memory by
- using the special program INSTALL.COM which came with your WordStar or
- by using the DDT.COM program which is one of the general CP/M utilities.
- Either will let you go directly to the location by using its address
- number. Once at the location, both INSTALL and DDT will let you
- overwrite the current contents with the new desired value. Call this
- procedure hand patching.
-
- Concerning the practicalities of patching by rote: If you don't
- need a deep understanding of what the heck goes on in WordStar when it
- is operating, then it is perfectly okay to install patches by rote.
- Perhaps you can't afford the time or just don't care to invest the hours
- required to gain esoteric knowledge about internal WordStar affairs.
- Thus, if some expert has designed a patch and you find out what it is,
- i.e., where to install new values and what those values are, and you
- desire to achieve the effects that are the result of that patch, patch
- away on faith. The results will be the same for you as for someone who
- knows in complete detail what is going on in the bowels of the computer.
- You can take two aspirin without knowing all about blood chemistry. You
- can change spark plugs without knowing all the theory behind internal
- combustion engines.
-
- Labels: A Place By Any Other Name...
-
- Besides going to an address by its numerical (usually a hex number)
- designation, there is another method of getting to a place to patch: by
- reference to a NAME for the location. Like a house in a ritzy
- neighborhood, an address may be known by a name in addition to a number.
- 1411 Seaside Heights could be known alternatively as "Seven Gables."
- Many computer programs may have locations identified by names, known
- commonly as LABELs.
-
- These labels are shadows remaining from the source code. Before it
- was assembled into a monster collection of machine language code, the
- assembly language source WordStar program instruction segments had names
- which roughly indicated their function. During assembly and conversion
- to machine language the labels themselves disappeared but the functions
- of each label came out to be at specific addresses (somewhat arbitrary,
- depending on the assembly process). If you know where the code doing a
- certain function came out to be after assembly, it is often convenient
- to refer to that location by its functional label.
-
- In fact, it is so convenient that INSTALL programs (which are used
- to modify an assembled program) often have an internal index so they
- (the INSTALL programs) know which locations in the assembled program
- belong to which labels. Thus, if you know the label of the function or
- variable you want to get to, using such a specially rigged INSTALL
- program as a tool you can go to the location by entering the label name
- rather than the numerical address. If you know the label and use the
- right INSTALL program which can find the location by label name, you do
- not ever need to know the numerical address.
-
- To repeat, labels are a convenient way to refer to the beginning
- address of a group of machine language instructions or to refer to a
- variable location. As a specific example, the label "BLDSTR" refers to
- a variable location which contains the value which WordStar will use to
- determine how many times to make the printer strike the paper when
- boldface printing is called for.
-
- Some other examples of the labels used in the WordStar program are:
-
- PALT - the location where you can store the code to be sent to a
- printer to start printing in an alternate character size. WordStar would
- refer to this location when it encounters a control character in a file
- while printing.
-
- HAVBSY - A location which can be marked to indicate that WordStar
- can find out if the printer is ready for information during concurrent
- printing and editing. WordStar will then operate differently than it
- would if it couldn't check on the printer.
-
- ERAEOL - where code which gets the screen to instantly erase from
- the cursor position to the end of line (varies depending on your system)
- can be installed.
-
- There are literally hundreds of labels associated with WordStar.
- As you can see, although some can be pretty cryptic, labels do often
- have a kind of mnemonic association with their actual function.
-
- Labels for patch locations are also a convenience for humans to use
- when talking about patches. Often you will find references to label
- locations published in the human-readable English language as "indexes"
- to WordStar in magazine articles and tip sheets, or in text files. Such
- indexes will give a label, its function, the number of its address in
- the assembled WordStar program, and a hex value that is recommended for
- entry at that location to make WordStar perform in a certain way.
-
- As an example, you might run across a tip phrased like this: "Patch
- the value of DEL3 to a higher number such as 1Fh in order to delay the
- appearance of prefix menus after you are familiar with most commands."
-
- Conveniently, even though addresses have changed from version to
- version, the labels have remained the same for different CP/M versions
- of WordStar and if you know a label for a function in WordStar 2.26, you
- can use the same label to get to the location of that function in
- WordStar 3.0 or 3.3. MicroPro was quite good about keeping the
- continuity of labels from one version of WordStar to another, even
- though the addresses necessarily changed as the program was re-written
- and reassembled.
-
- To recap, hand patching is direct overwriting at specific locations
- in memory after a program has been loaded into memory. There are several
- ways to get to a WordStar patch location: 1) go directly to the
- hexadecimal number address if known (you can use DDT.COM or INSTALL.COM)
- and 2) refer to a functional label name and go to the label via INSTALL
- which knows where the labels are, or 3) look up the label in an English
- index to label addresses and then go to the address number by DDT or
- INSTALL. After writing new values directly into various locations, the
- program is saved in its modified (patched) form.
-
- Batches of Patches
-
- So far we have been talking about patching individual WordStar
- locations one by one--hand patching. The ultimate in patching
- proficiency, however, is to accomplish wholesale patches by writing an
- assembly language program which, when run, modifies numerous WordStar
- locations all at once. Automatic patching! Programs which modify
- WordStar are indeed feasible and in fact many such programs have been
- written. Some are commercial and proprietary but quite a few have been
- donated to the public domain by their authors and are free for the
- asking.
-
- Although most WordStar users are not ready to write a WordStar
- modifying program, many users are capable of running an already written
- program which modifies WordStar in some desirable way--say to install
- the collection of patches which lets WordStar control a particular
- printer. Such programs may be obtained from other WordStar users, from
- user clubs and user group libraries, and often from electronic bulletin
- board systems accessible by telephone. Once you obtain such a program,
- it is a simple matter to give the CP/M command which runs the program
- and patches a WordStar for you.
-
- As an example of what can be done along this line, there is a
- reasonably priced commercial printer installer program which will
- automatically modify WordStar to work with your selection from a menu of
- any one of a dozen printers. Plus install other features. It should be
- noted that INSTALL programs also can automatically spray batches of
- patches into a program if the correct menu choices are available.
- However, no INSTALL can cover every contingency that may arise.
-
- Of course, if you use an automatic WordStar patching program to
- install some patches, you will be trusting that the programmer fixed it
- so his program goes to the right locations and makes the right
- modifications. Also you may be forced to eat the whole meal the
- programmer has prepared whether you like everything on the plate or not.
- Another drawback might be that you may want to install features in two
- programs but may not be able to because they have been written so that
- they conflict with each other.
-
- And since the WordStar feature choices are numerous and there are
- many different computer/ printer/ system combinations, there is a good
- chance of not finding an existing program which patches WordStar on your
- system exactly the way you want it to be patched. So you may be
- interested in another method which allows somewhat more flexibility of
- choice.
-
- Overlay On MacDuff.
-
- The final method of patching up for discussion is not quite
- assembly language programming but does use an assembler to install a
- selected batch of patches. This is the hybrid "overlay" method, which
- yields a good compromise between freedom of choice of patches and
- automation of the actual installation of new values. You write a very
- simple assembly language program which does nothing more than designate
- certain values for certain specific locations, as many or as few as you
- like. Put these in a program file named, for example, PATCH.ASM (the
- name can be anything you want but the extension must be .ASM).
-
- Assemble the "program" and save the resulting .HEX type file. You
- load your WordStar COM program into memory with DDT, and then "overlay"
- the prepared hex file (by reading in on top of WS.COM) to modify the
- designated locations. Use the DDT -I and -R commands to accomplish
- this. Then save your newly touched up WordStar, perhaps under a new
- name such as WSTEST.COM. (Consult a CP/M tutorial to determine how big
- a chunk of memory to save.)
-
- The minimum such patching program would consist of the following:
-
- org nnnnh
- db 0nnh
-
- where org gives the hex address of the location to be patched and db
- gives the specific hex value to be placed there. (The leading 0 is
- required by the assembler to unambiguously identify the following value
- as a number since db's may also include alpha characters.) Yes, such a
- tiny "program" can be assembled using the CP/M assembler, ASM.COM and
- the resulting hex file can be overlayed into an existing WordStar
- WS.COM.
-
- More than one sequential byte might be indicated, as follows:
-
- org 06CB
- db 002h,01Bh,022h
-
- which indicates that the three locations starting at address 06CB are to
- be patched with values 02, 1B, and 22 (hexadecimal notation).
-
- Quite likely, the ASM file you make up will consist of several
- locations to be patched with several bytes starting at each location.
- As follows:
-
- org 06CBh
- db 002h,01Bh,022h
- org 06D3h
- db 002h,01Bh,021h
-
- You may want to include labels and comments to yourself so that you
- can easily go back and change things again later. A heavily commented
- PATCH.ASM file which could be used as a "template" to patch several
- locations of WordStar Version 2.26 is included as an example -- see
- Figure 1. And a minimum configuration of the same program as it might
- appear after filling in is included as Figure 2.
-
- One good reason for doing patches by this overlay method (rather
- than modifying byte by byte with INSTALL or DDT) is that you can make
- ready all your changes in one file and proof-read for correctness before
- actually modifying your working program. Whereas if you type them
- directly into the program byte by byte using INSTALL or DDT, you risk
- human error that can go undetected until the program is run.
-
- To assure yourself that this kind of minimal assembly language
- patching file does assemble properly and that you know how to do it, you
- can use the template file for experimentation. Probably you will want to
- eliminate the comments and some of the addresses and patch identifiable
- "nonsense" values (such as 0FFh) into various addresses. Use WordStar
- in the "N" non-document mode to make up the file. (There is something
- recursively poetic in using WordStar to modify itself.)
-
- Then assemble your PATCH.ASM (at the CP/M A> prompt do
- "ASM PATCH").
- Next load your WordStar with DDT ("DDT WS.COM").
- Insert your PATCH.HEX file ("-IPATCH.HEX" followed by "-R").
- Exit DDT (-g0).
- Save your new WordStar ("SAVE 56 WSTEST.COM").
-
- To verify that your patches took place, use DDT again to load the
- new WordStar ("DDT WSTEST.COM") and look in the locations you wanted to
- change ("-Snnnn" or "-Dnnnn"). If the patching was effective, at the
- addresses given in your org statements, your WordStar should now hold
- the values you listed in your db statements.
-
- Semi-automatic Overlay
-
- With that procedure understood, let it now be known that there is
- an even easier way to accomplish the same thing. There is available in
- the public domain, free for anyone's use, a "linking loader" named
- MLOAD.COM. This is the work of Mr. Ronald G. Fowler who has freely
- donated his program for the use of the computering public.
-
- MLOAD.COM is available on many telephone RCP/M's and in the disk
- libraries of various user's clubs. The latest version I have seen is
- MLOAD21 (version 2.1) and it is often distributed along with the public
- domain communications program MEX because MLOAD is handy for combining
- overlays for specific computers with the generic MEX.COM.
-
- I find that MLOAD will automatically spray patches into WordStar
- addresses after you write (using WordStar of course) a very simple
- PATCH.ASM file (just orgs and dbs as previously described) and make a
- hex file out of it.
-
- Whole procedure is:
- A>ASM PATCH (previously written ASM of orgs and dbs)
- A>MLOAD WSNEW.COM=WS.COM, PATCH.HEX
-
- The first command assembles your file PATCH.ASM and makes up a
- PATCH.HEX file (as well as a PATCH.PRN file, extraneous to our purpose
- here, so not discussed). The second command makes up a new file,
- WSNEW.COM by combining your regular WS.COM and the newly conceived
- PATCH.HEX.
-
- The same thing can be accomplished with DDT commands and a SAVE as
- described earlier, but MLOAD just does it, and fast. Many people owe
- thanks to Ronald G. Fowler for providing this nifty tool to the public
- domain.
-
- Modifying a program by this "overlay" or "insert" method simplifies
- patching a lot for me, and is a more flexible procedure than using
- someone else's pre-canned set of patches which might not be just what
- you want.
-
- Conclusion.
-
- The foregoing advice and instructions should serve as an
- introduction to the idea of patching. Applying a patch avoids the
- bother (or impossible task in the case of proprietary programs) of going
- back to the original assembly language source code and making
- modifications in assembly language by writing within the entire major
- program. Rather than doing that and then re-assembling the entire
- program from scratch, the modifications are applied to the existing COM
- file by direct overwrite.
-
- Several methods have been discussed for applying patches.
- They are:
- 1) the use of proprietary INSTALL programs, and the use of
- DDT.COM to do hand patching, byte by byte.
- 2) the use of canned programs which apply batches of
- specific pre-configured patches.
- 3) a simple overlay method where your patches are written
- up beforehand and assembled into a HEX file which is overlaid on
- the main program. Either DDT.COM or the more convenient
- MLOAD.COM may be used to integrate the overlay patch file with
- the main program which gets patched.
-
- End of PATCH IT UP article. Figures follow:
- -------------------------------
- -------------------------------
- FIGURE 1 - Example assembly language program file for positioning
- patches:
- ; PATCH.ASM
- ; for WordStar Version 2.26
- ;This is a "fill in the blanks" template file for patching printer
- ;control codes into the WordStar printer control patching areas.
- ;Consult printer manual to determine exact values which go into
- ;each control code area. First value in each area is the number of
- ;following bytes to be sent to the printer when the trigger
- ;control code is encountered in file while printing. The
- ;subsequent bytes (up to four) are the actual hex codes to be sent
- ;to the printer. For many printers, the first value will be
- ;ESCAPE, or hex 1B. With INSERT off, substitute hex values for the
- ;'nn' indicators in the following program. Then replace all unused
- ;'nnh' with value 00h before assembly. Or if a location
- ;previously patched and no change desired, delete from this file.
- ;
- ;Label Address Code which triggers
- ; & values
- ;'nn' indicators in the following program. Then replace all unused
- ;'nnh' with value 00h before assembly. OR delete from this file.
- ;
- ;Label Address Code which triggers
- ; & values
- ;
- org 06C9h
- USR1 db 0nnh ; ^Q
- db 0nnh,0nnh,0nnh,0nnh ;
- ;
- org 06CEh
- USR2 db 0nnh ; ^W
- db 0nnh,0nnh,0nnh,0nnh ;
- ;
- org 06D3h
- USR3 db 0nnh ; ^E
- db 0nnh,0nnh,0nnh,0nnh ;
- ;
- org 06D8h
- USR4 db 0nnh ; ^R
- db 0nnh,0nnh,0nnh,0nnh ;
- ;
- END
- ;When properly filled in, use CP/M's assembler ASM.COM to assemble this
- ;file which can be named anything you want but should have the extension
- ;ASM. After assembly, the resulting HEX file may be used to "overlay" a
- ;copy of WordStar version 2.26 and the hex codes you entered at the
- ;various "blanks" above will be plugged into the correct WS.COM locations
- ;to make the printer function appropriately when the various control
- ;codes are entered in a text file.
- ;
- ;The procedure is:
- ;1. Amend this file with WordStar in the non-document mode.
- ;2. Assemble this file to obtain hex file.
- ;3. Use DDT to load WS.COM (A>DDT WS.COM)
- ;4. Use DDT to overlay hex file on WS.COM
- ; a. -INEWFILE.HEX
- ; b. -R
- ;5. Exit DDT (G0).
- ;6. Use CP/M's SAVE command to preserve modified WS.
- ; (SAVE 56 WSNEW.COM)
- ;7. Test modified WS for correct printer driving operation before
- ;replacing original WS.
- ;Or, if available, the MLOAD.COM utility may be used to do steps
- ;3 through 6 in one simple operation:
- ; MLOAD WSNEW.COM=WS.COM,NEWFILE.HEX
- ;End of WordStar Printer Patching File.
- -------------------------------
- -------------------------------
- FIGURE 2 - Minimum assembly language program file "filled in."
-
- org 06C9h
- USR1 db 003h ; ^Q
- db 01Bh,057h,000h ;
- ;
- org 06CEh
- USR2 db 003h ; ^W
- db 01Bh,057h,001h ;
- END
-
- Comment: This would patch the eight different locations necessary to
- control the double wide printing of an Epson MX-80 printer. So that
- when the control character ^W is encountered when WordStar prints a
- file, the correct sequence is sent to the printer in order to turn on
- the double-wide character font. And when ^Q is encountered, double-wide
- would be turned off again.