IMD 1.16: 29/05/2007 11:53:20 FOGCPM.004 --FOGCPM004DIFF COM+DIFF DOC FINREP21COM FINREP DOCh INDEX11 COM} !"#$%&'()INDEX DOC%*+,-.INDEX11 IDXF/01234567INDEX11 PAS89:;INDEX 1 <=INDEX 2 V>?@ABCDEFGHINDEX 3 #IJKLMOUTLINE COM NOOUTLINE DOCHPQRSTUVWXWS3330 DOCYZ[\]^_`abcdefghWS3330 DOCijk-10-00 85 WSBIBLE DOClmnopqrstuvwxyz{WSBIBLE DOC|}~WSBIBLE DOCp-CPM004 DOCWSEXPAT4ASM9This is the disk name. p@ chdir) )ĝ@ >2/=Y+2/=Y$@NAMES DIRZCPR2@w,U Z "* ", 22 x23 y24 !~#o|g6 ~#£~ʇ/ʇ7  . Invalid Disk or User -- Abortingx:3 <=25 y?:4 26 ~,)!8 ^  ͊:3 2[ :4 2\ i#]  :^ ?J!8 ^  ͊xT:3 <=2[ yc?f:4 2\ ~Mv>22 !7 !] 3:2 Il. Change Disks if Desired and Type ^C or A to Abort or to Continue - ͬ0A (Il7 `] `20 !". ͏:0 U. NO Differences Noted in Filesrr:2 ‚. File Not Found --  U~# ~+3. DIFF is used to display all relative differences between two files DIFF is invoked by a command like: DIFF dir:file1.typ,dir:file2.typ M where: "file1.typ" must be specified and is unambiguous "dir:" is an optional named directory (or DU:) "file2.typ" is optional and set equal to "file1.typ" if omitted "M" is optional and allows Multiple Runs if given Examples: Command Files Compared DIFF T.COM,A1: $$:T.COM, A1:T.COM DIFF A:T.COM A$:T.COM, $$:T.COM DIFF A:T.COM,ROOT: A$:T.COM, ROOT:T.COM DIFF A:T.COM,B:S.COM A$:T.COM, B$:S.COM# ?~#3r . Ambiguous File Name not Allowed .DIFF Version 1.6. Source File 1 -- !5 7  . Source File 2 -- ![ ]  ** 7 ͹: 2 *, ] ͹: G: J*. #". #¼: =2 : =2 : º: G: ʏ: 21. Source File yͽ. has terminated before the other -- DIFF Aborting:0 :1 . DIFF Pause -- Type to Continue or ^C or A to Abort - ͬ0Aʯ. DIFF Aborting>20 =21 r*. ͌ͪͪͪ͢> ͽ~͇͇ͪͪͪͪͪ. Rel Offset !5 7  ͪͪͱ![ ]  . Hex Dec Hex Dec Asc Hex Dec Asc>21 ͪͱͪ+ͪʥ ҽ>.ý> ͽ> ͽɯ2 $w#: <2 ½:5 G:6 O:[ G:\ O~Aͽ#~+.: # >.ͽ ~#ͽ 2|2>:f3)0R3>)30R3=363D>3E>3 >0f3xG3x0:R3 f30O:f3>0f3y*{3w+"{36 *{32Ow+ ʏ3 3~3w+ ~3Ô2ʢ3w+22322{=*F=+~ 6 6 ʵ3õ3!=͍ 3#6 +>1&3:>1!  4>1!4r ?Stack overflow, :_ !NO  ͊:MO*K>Ϳ :^ʒ :HC*I?:Yʩ *:¦ !;:Zʺ :*0G " x   ͊x@ y2 ! @NAMES DIRr:5H=͈:3 "Q >2S 2T $* ~:A M #1 >K N *Q ~:Z # ƒ .ʃ  >?j :S y ͝ ~.— #͝ p ͽ p ʽ *¯ >?ñ # #õ > ½ "` "b  dN  >: G!U ͢ ; :W 7 *` U ~#~#~  & >  *|= "`  V*b >"` * }ʗ #~ʗ G#*`  ʍ € # l Ó  d ×  €  dN  >: G!U ͢ d µ VN V~2S #~2T *` @ # ~0A AS 2S #~:@ ? 2T #~:@ N G~#:7 0S S OxG x S 2T :T O:S G>ɯ:3 7* @4 "b ## *` ʖ O~0Š ʊ #p *b  > Š *b J½ Aw# J½ w#° ~0! =_.:;,<>ɾ(2 (22:_(:_ (Y (X(>2K"L"N"Q2P!KSS$@1*L~#fo:Kկ 2T2V  2U2W*Nxʓ <~:P~¤:T<=2V_ #~G:Px:U2W_ # <ʓ>:T_:V(:U_:W (:VG:WO((<8=` *Qo|g~O#~G>b5bÊbb+bwbÔ@4* @#2@4}_|W:=̓ :> 2=xx2=*=T9"=:=2=@ !!@Ns#Frͦ9ͯ9q#p*@^#V+*@##^#V+*!@}9ͯ9"!@9*@ "@*)@͍ I;*?%:?͍ I;*@T9ͦ9*%@{_{:s#r#>w#wͯ9%:s#r*:"#@*#@ͦ9s#r{_*%@{̺9*@w{W:a:"%@{_ͯ9zʺ9*@}‚:}o~r:{qrs;!^#Vbk$w#***!*>*~O>*f>q>**s#r*6*6*~ʤ>*ʺ>**s#r*6*6*~>*|&~2#*s#r*5**s#r*6*6#6:>2*~?>*:w#*s#r*5o**s#r*6>:*6M5m<:>wZ!3=2>+*~ʯ+ß*6*>:w @(>(((!(4~#ʈ r  _ ddh99 9y9 9yG>GO> ͽ~9|}2ë>2'd }0ͽ}o|g }o|gy:> ͽɯ2y0ͽ; 7ͽ0ͽ2F2>2FdG G0ͽ'Q Iyf:Ff> ͽɯ2Fy0ͽ> ͽ> ͽ ҽʽʽʽ ʽ ʽ>^ͽ@ͽ*. O*. x2y2:_(:_ (Y (X(( (OGa{_HIWjH_Wjr# xj͊H ͓ H͓|ڳ¤}ڳ~# x¤ ~+ x¹î!"O*yO}o|g|g}!o"*! $.͓|ڳ¤}ڳ~# x¤ ~+ x¹î!"O*yO}o|g|g}!o"M5m<:>wZ!3=2>+*~ʯ+ß*6*>:w @(>(((!(4~#ʈ r  _ ddh99 9y9 9yG>GO> ͽ~9|}2ë>2'd }0ͽ}o|g }o|gy:> ͽɯ2y0ͽ; 7ͽ0ͽ2F2>2FdG G0ͽ'Q Iyf:Ff> ͽɯ2Fy0ͽ> ͽ> ͽ ҽʽʽʽ ʽ ʽ>^ͽ@ͽ*. O*. x2y2:_(:_ (DIFF.COM is a simple file difference detector. No [.DOC] file is needed; simply type DIFF for instructions. Its action is not too sophisticated as it can't deal with file insertions that merely offset the contents. On the other hand, the display it gives is very clear to understand compared to some other difference detector programs I've seen in the public domain. It appears to support named directories, which I believe are found used in the CP/M world only by the followers of ZCPR3. :2# 2/24_ !~(s 1 1{ !  ! G>/##( #~W >22S=JB >2l ?Q 2 go"""C(O >2 H >222C >22(/(#~  #~ ("( #(~ ( #~"(y2 !n "Fn H!n #2| :| : 2 x(N #l~ ("( #(~ ( #~"(y2 !s "F HKs x:n W!n ~(#(Sm !n # " : 2 !e>?(# :l <!]>?(#Î:m (/\2 <=Ɓo&[  S ! 4< : 2 : <2 ! " * ] " !L  !] !\  ͙!=  : =(52 -!" $," " !$N"I !$"K : 2\2@ 2P 2` 2|! "j : &o0 !  :m (/ !\ !l@ : 2` * 2a \<@ [ Km * !n !n "} !u "z : 2 (,(Sb  (, 4x(7, *b #"b ݾ #(,:m O~: ʹ*z F#"z ! 5*} #N"} x<(, A#,A# (~(*b "d Sf ~VA[-\ѷV:` !#K* .:c !a 2c :e 2e :g 2g  @ !. ! F#~"(&?|>^(3!(I,( #(Z##~"(i#~, ͤ˯@s#7?~ͤ!(˯A[?sͨy?+|*F4: 7*F~#"F! 4~((#7 ~?(* :u : 2  18 :00O#(*z q#"z O:  G(2 :v *F~wwËA8[0*F4~͚G ( +~͚y +0:007?~_A?[,ͯS! \: A *d "b K %*b Km xo0$Ku  >2:t % *d R|(:t (o0$:s [b (Oy(0: $>*2! Ku :s (Oy( ̀* #" Km xG:t (0T_8+T_0! :t O[d y(*f RMDV_A[,~A[~a{˯# A[~a8{0˯# *>wSh [ @ !Kh B8"@ <(_:I $ F!\P :l < \#!\l >B!AK"vl\@ ! "j * $ !  @ ! !a !q  ! ! !  !;  ::| G!n ~A8[8#! ~O! # @ d@  @ }0[j ɯR0[j !80Sj !e  FINREP v2.1 (c) Eric Gans 07/15/85 finrep [d:]afn [ufn] /[sw]/ oldstr [newstr] B=noBak C=Case H=Hibit O=Obj Q=?Srch W=noWd Ascii="str" Hex=ch,ch Ctl=^ch Caps=!str! ?[n|*]=WCSrch |=BreakReplString =abort $N$Can't open fileImproper stringUse "C" switch to search capsNo space to write fileSwitch syntax error /[sw]/No second filename with wildcardsWildcard in filetype: use B flag255-file maximum exceededESCAPE typed: ++ ABORTED ++Now processing : u n Strings replaced:  Files processed:  [~a8{0˯# *>wSh [ @ !Kh B8"@ <(_:I $ F!\P :l < \#!\l >B!AK"vl\@ ! "j * $ !  @ ! !a !q  ! ! !  !;  ::| G!;;07-02-85 FINREP.DOC Version 2.1 07/15/85 Eric Gans French Department, UCLA Los Angeles, CA 90024 Version 2.1 Fixed bug that treated wildcard filetypes as single files. Added a couple of clarifications to DOC file. Version 2.0: Allows wildcard searches (various options), wildcard filetypes. Easier entry of caps (!string! instead of !s!t!r!i!n!g). Allows control characters other than letters (e.g., ^[,^@). Version 1.1: Fix: Didn't find a string immediately following a found string. Failed to signal bad file write. Enhancements: Allows wildcard filenames (NOT filetypes). Better error checking. Abort from console with . A few clarifications in the DOC file. ***** FINREP is a search/replace program that remedies most of the deficiencies of Wordstar's ^QA and other similar commands. Aside from being faster, it has important additional features: - allows wildcards in search string (v2.0) - allows wildcard filename (find/replace in groups of files) - command-line entry allows batch processing by SUBMIT, etc. - allows entry of control or hex characters (0-FF) - can be used with object files (e.g., COM files) - sets capitalization (first letter or whole word) and high bit of the last character according to the old string This last feature means that, for example, if you are writing a scenario where the characters' names appear sometimes in CAPS and sometimes just Capitalized, you don't need two search/replaces to replace one name with another: JOE will be replaced by HARRY, Joe by Harry, and even joe by harry. ***** Format: finrep [d:]fn [newfn] /[switches]/ oldstring [newstring] (Enter "finrep" alone for a brief command summary.) If a second filename is given, the changes will be placed in that file; if not, the old filename will hold the changes and the original file will be changed from fn.ft to fn.BAK (unless the "B" switch is used). Wildcards (*,?) may be used anywhere in the filename; if there are wildcards in the filetype (after the ".") the B switch must be used to suppress creation of BAK files. If wildcards are used, a second filename cannot be entered. If you enter: A>finrep urk*.doc // "blurk" "zap" the files urk01.doc, urk33.doc, urktty.doc would be modified as expected and files urk01.bak, urk33.bak etc. would be created. The characters "//" must be entered even if no switches are used. The switches are as follows: B = no BAK file. This switch disables making a BAK file; the original file will be lost. (Use only if you did not enter a second filename.) Q = allow wildcards in search string. (The program runs faster if this switch is not used.) The various options for this command are described below. O = Object file. If this switch is used, the program will ignore end-of-file markers (1AH), as in PIP's "o" command. Use for search/replace in non-text files. WARNING: if you don't use "O" with a non-text file it will be cut off after the first 1AH. That's why FINREP makes BAK files! H = keep High bit. With this switch, all bytes are searched exactly as they are; letters with the high bit set will not be identified with their standard ASCII counterparts. W = no Whole-word search. This switch is used to search a string whether or not it is a whole word; with it, a search for "the" will find "other", "their" etc. NB - The program defines a "word" as anything preceded and followed by something other than a letter (space, punctuation mark, number, control character, beginning or end of file). Thus this switch is not needed if the search string is a series of words, a word preceded by a control character that is not continguous to another word, etc. C = respect case. This switch allows you to distinguish capital from lower-case letters: in a search for "the", "The" will not be found/replaced. (NB: Upper case letters cannot be entered within quotes; see below.) In normal operation (with no switches), the search will include whole words only; it will ignore case and high bits, but will set the new string to correspond to the old in this respect, capitalizing the first letter or the whole string and setting the high bit of the last as required. This last feature is only useful if the replacement string is one word long; if it contains more than one word, you may set the high bits when you enter the string, or let your word-processor (e.g. Wordstar) do it. If you include capitals in your replacement string, they will be respected even if the find string is not capitalized. NB: If you want to search for a capitalized word, you must use the "C" switch (or the "H" or "O" switch); FINREP will give you an error message if you don't. The last four switches are in the relation O > H > C > W ; the "higher" switch includes the smaller. Thus if the "H" switch is used, capitals and lower case will be distinguished, and the search will not be limited to whole words. ***************************************************************** String entry: The find and replace strings must be separated by a space from the switch entry and from each other. Strings should be entered as follows: ASCII - in quotes: "blurk", "54%**90er @" The following characters must NOT be placed between quotes: HEX - separate by commas: d,1A,cd,10,ff,3 CAPITALS - between !!: !A!,!hello! [NEW IN V2.0] CONTROL CHARACTERS - preceded by ^: ^M,^m^j,^c,^C,^[,^^ WILDCARDS - ????, ?n (1 <= n <= 9) or ?* (indeterminate) The "|" character is used to display a break in the replace string (see below). NB: All ascii letters entered within quotes will be treated as LOWER CASE. If you want to search upper case letters with the "C" switch, or to put upper case letters in the replace string, you must surround them with "!!", unless you enter them as hex characters: (A = 41, B = 42 ...). Sorry about this, but the CP/M command line cannot distinguish upper from lower case. Any combination of characters is valid; for clarity, groups should be separated by commas, although this is only necessary for individual hex characters: !h!"ello",^m^j,e5,?7,32,!blurk!,^q Quotes and !..! must be closed. To search/replace the quotation mark, enter it as a hex character ("=22h). You can search for "!" if you keep it between quotes. The length of the find/replace strings is limited to 30 bytes; this length applies to the strings themselves and not to the keyboard entry, which cannot exceed 127 bytes in all (blame CP/M for this). Thus ^j,cd,ff,3d is 4 bytes long. In the case of indeterminate wildcards, up to 255 bytes are allowed, but the limit of 30 still stands for the find/replace strings themselves. If you do not enter a replace string, the searched-for string will be replaced by nothing, i.e., deleted. WILDCARDS (V2.0) The wildcard search has a great deal of flexibility. For obvious reasons, wildcards cannot appear at either the beginning or the end of the search string. The options are as follows: 1. Simple wildcard search: all bytes of the search string will be replaced. finrep zz.txt /q/ "d"?2"e" "xxyz" will replace all words like "done", "dare", "dove" etc. by "xxyz" A maximum of four wildcard groups are allowed in this form: thus "a"?"cd"?4"ijk"??"nopq"?"s" is a permissible search string 2. Simple wildcard search with break. Only one wildcard group is allowed; the replace string is divided in two, with the first part replacing what precedes the wildcards and the second what follows; the intermediate bytes are left alone. The break CAN appear at the beginning or end of the replace string to indicate that the corresponding part of the find string is to be deleted. A blank replace string (entered simply as: | ) will delete both. finrep xx.txt /qw/ "d"?2"e" "xx"|"yzz" will replace the "d" in this pattern with "xx" and the "e" with "yzz"; "done" becomes "xxonyyz", "madame" -> "maxxamyxx", etc. (This last example only works if the "W" switch is used.) 3. Indeterminate wildcard search/replace. The indeterminate wildcard "?*" must be the only wildcard in the search string. In this option the whole string from the beginning to end is replaced. A maximum of 255 characters will be allowed in the search string; longer strings will not be found. finrep blurk.let /qw/ "xy"?*"zq" "garbage" will replace all strings beginning and ending with the indicated letters: "xyrwerwerzq", "xyuu is the nbrzq", "xy ^C^Yzq" will all be replaced by "garbage" 4. Indeterminate wildcard with break. This is a very powerful option that allows you, for example to replace PerfectWriter "fences" with WordStar control toggles (& vice versa). Here again only one wildcard group is allowed in the search string; the intermediate bytes are left unchanged. finrep zap.kkk /qw/ "123"?*"45" "6"|"789" will replace "zz123blurk blurk xxxc oo45rr" by "zz6blurk blurk xxxc oo789rr"; finrep perf.wri /qwc/ "@"!ux!"{"?*"}" ^s|^s will replace the PW underline fence @UX{ ... } by WS's ^S ... ^S Note that the "C" flag is used here to search for caps; if l.c. as well as caps are acceptable, it could be omitted and the search string written "@ux{"?*"}". You can delete the fences altogether by replacing the ^s|^s by | in the last example. One user thought the word "break" was misleading and should be replaced by "save," since the "|" in the replace string means that you preserve the wildcard part of the search string. In other words: finrep zap.txt /qw/ "<<"?*">>" will kill everything between the "<<..>>" whereas: finrep zap.txt /qw/ "<<"?*">>" | will just kill the "<<>>" and "save" their contents. FINREP can be aborted at any time by typing (=1B HEX). I preferred this to ^C since an extra ^C will be read by CP/M as a Warm Boot. The only screen output is the number of strings replaced and, if you use wildcards, the names & total number of files processed. If you want to see the replacement procedure in action, use a word-processor! Notes: 1. FINREP will modify files of any length; it uses the entire memory below the CCP as its buffer, and writes to disk whenever the buffer fills up. Since it doesn't overwrite the CCP, it doesn't have to end with a Warm Boot. 2. There is no intrinsic limit on the number of files allowed under the wildcard filename option; for sanity's sake, you will get an error message if there are more than 255. 3. If you want to create a version of FINREP with some of the switches preset, run the program without a filename: finrep /[sw1][sw2]../ After it returns to the CP/M prompt, save 11 finrep1.com will keep the switches as you like them. This procedure is NOT REVERSIBLE, so keep your original FINREP unchanged. 4. In deciding whether to capitalize a whole word/string, FINREP looks at the first two letters. If the find string has only one letter, only the first letter of the replacement string will be capitalized. If the word to be replaced has unusual captalization (e.g. BBrrOOOmm), use the "C" switch and/or enter separate replacement strings for different variants. 5. In using indeterminate wildcards, you should usually use the "W" switch, since without it BOTH HALVES of the search string must begin and end on word boundaries. This is only likely if you are replacing whole words. 6. Re speed, FINREP is somewhat faster than Wordstar's ^QA command. But  if all you want to do is replace a string, it is over three times faster, since its time includes loading and saving the file. Measured on a long (84 K) file, FINREP took 27 seconds and WS 34 for a typical search/replace. But WS needs at least 10 seconds to load and a good minute to save the file and exit. With a little practice, the command line can be entered as fast as WS's, and it can be included in SUBMIT files or reproduced by programs like SYNONYM or my SYN.COM. ***** FINREP was written at the request of John-Mark Stensvaag of Vanderbilt University. At first I couldn't see the use for it, but he convinced me (he is a professor of Law). The wildcard features added in v1.1 and v2.0 were also his idea. I would appreciate hearing from you about (a) bugs and (b) suggestions for further enhancements.  ͫCopyright (C) 1985 BORLAND IncB Osborne 1al SelectedP)(= EE RT(1)1~7#~= oͦkԄ!!"~#(}:$= +*!5!*!!:(2!5:(>2!!!:O::O:!*! !45(! +/ 0y0( d!k5!{5__o&  :(͠|(  *"x2y( >28!"9!! og2"">~22 9/4*9 Co&ͦͣ} [ (!e{ͦA8Q0G: x@!\w# (͂ ?(*( .( w^. ^!h6# (?( *( ͂( w#>?> w#ͦ 8 !ɿ .,;:=?*[]<>{}a{ |ʹ}ͽƐ'@'7||}>2ͯ*Bڨ  "og"2>2! ""*B"[Ru*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#Eͺw}8' RB0 >' RqRR!+ Ͱ R!+ Ͱ r!+ Ͱ r!+ Ͱ r!# Ͱ r!+ Ͱ T]KB!z> S>))0 = | |̀̀DMgo>jB0 7?= H͒<z5a)a<z {0Gɯgo||~}||/g}/o#}o&K[xAJSJDM!b"!6J"DM'd } ) W _}8(8J`9{T]=o`9y ) >' ́ ͬ͗ }>' xˆ }} ˸T}ٕ(0D=z ,= ( ͒ 0%{ , 7 ?(8ͬ x ͆ - r 8˸x ͏  ,-xG}r }مM 9r .>#n0͒ { = - nx ͇ ,-(-˸G,-r }ٕ?M 9.> 8ͬ ?= u+-(>͆ 0ͬ ͆ 8 ?x ͇ , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨ xx( ?}ٽ }ցr <(r 7{ = |٤g{٣_z٢Wy١Ox٠G{ ͬ ́ }x>' ͬ}ƀ/ƀo -́ }0͎-́ ͎,}l˸ 8 4 ͗ x( - 8́ - 8,́ }l8;*!͗ ! >4ͬ͗ ͗ ͬ--- ́ ,,,-xGg?+2n*8t z~,->' x' ͘}. ͆́ , ! >4,͢- o&0%,͗ }gr }؉}颋.:}8c~I$I~L*͢ٷx˸ }0G,<},-(-́ !>I0 ͗͘ o8 ͆ >' m.`1pF,t6|!wS<.z}[|%FXc~ur1}͆ٯx(<˸ 8 !~J 0.O!>s 8 =  n s͗ ͆ .n 0 ͎-́ OT0 j oD,:j !I}袋.}8c~I$I~L! >ͬ͗ I× nn ͗ = ͆ nf^VNF!DLT\I!!53!r1!͒!> x #-= o˸x͆(- }(x>8(z ,z `iÃ!>' |r |̀>)=|(DMbo˸88x(0 8> ̀x(>-{(ay( z(>. ( {>E>+|(|Dg>-|/ 0:p# ~# +>0w#,-  60#} ˸}րogM| .(z = ~> x0w#xG%͇ %͇ ZJDM%͇ = _~65+~hìx-Sx9?+{Η@}|z z gZJDM0{ ,7}o˸? #yO!@9i&?  #?w#?/w#?w#!9! E9!!9~(+Fͺ!"9!(#>2*"| >"2:( Ͷ *w*6 !\$![ (ͦ( #:~CONTRMKBDLSTCAUXUSR>2i:*ˮ~0:*:(@q##pZ* :(  ~* < >26"!"""~>2""v>2>"!"ˮ(!~8>~O6~*"w(6(2(-()(6 (8 0 :(* y(~#+ (( 66 #6 #"*: y~o p .##~ͺ(.6w4._~ =*##55= *[R8*~#"= ͣ}== ͯ}͵}*#w+#~+>*~('k!0(ˮ]k!8ˮ!]~-#8~>27kˮw>O$6̃s #r$ͣ6̏ k ( (ˮ qk(ˮ ( k ˮ*O:~ ##~._q4((=ʦ==ʩ=ʬò*:4^q*##~6ͺ>2}*|(̓|( ̓6-#[RM8( G> A~#*'C! !TRUEFALSE!9N#Y~#( G~#> >    "~(kѻ(( !0 (ˮ!!>2Sz:0:*6##ww#w$w#w:  ##N#F*B>2w#w#[s#r> "~ͮ*-w#ww##> ͮÁ""~>2:ZR0 *4#4>2:ZR> *4 #4(> >22*f(/˦:G(##~++ :O x yC!ͺ Q*:G(##~._.͚f<\=<͚*##w ͮ +4 #4x >>2:G("ͮ"*nˮ*0 SZѷR8@* N#F#s#r, 0})jS\*##w+ N#FB ͮr+s>2!T]>)j)0 0= ]R!#]*^#V#N#F#^#V>2Ͱ:0:*6 #-Nw#Fwq#p#6#w#w#w"~Á>">!DM!":*B:!>(>2>">!"2"~ʰ*w#wx(9* :O *-4 #4!*4 #4 *-N#Fq#pV+^Bq#pSZѷR&* s#r$ s#rL <?*L!\  <( !\$>2>2L:>!(* \$\<(!3: [1ð\!(7"~> 2"S"Ns#FrB(Z#\: \<(?*"}K\! !*}#"}! x \* *>) 2""{_!"*nf}(HR0nf" ^VMDnfutqp*s#r*s#r"* uKB!0>' ~#fo{_"*R0RnfR0KqputsrNF( ^VNF^V*SutKqp R*R(~w~wnf ut"6#K*K*!""*NFy(* "*B0Cnf* [R*"*RS[s#r^#V""6#>O"w2x2*"!F"" &y*"*>2"*"!F"""!\*: Nr!~6go(\R*s#r_2x( s x(T]DMx(R0 U(͝O/o&9q# (!>F0#( ~ ( #]( ~ ( (#}(  i&T-a%â}ͦo*!~6o&|:2 2}:__zѯ2*|KB " z ^C User break+=  I/O Run-time error {ʹ, PC=*ͯNot enough memory Program aborted :ʎ'1!d!?ۙ>;BH!!:ͣ!Es!!.e.!:Ͳ"*!͒Eb!!*!:ͣ!:!!M!!:!!"!*n&́!0!9͛O}oE!*!E!!*!:ͣ!!*!"*#"*!:ͣEʜ!!:ͣ!E_"!:!!*!EV"*"\"!"e"!"*!}2Ы!}2*!R"*ҫ&Eʖ"*ի"*!EX#!*!R+)^#V:!*+)^#V:͍E7#!}2Ы!*!R+)^#V^#V!*+)^#V^#VE-#!}24#*+">#*+"*&*!}oEʦ"*&}2*&!!!:ͣfzʹ#}2y!*y&!*y&n&s*y&#Ä#!:!!: !Y!y!"O!y*On&!Y ]O}oE $!y*O!'$*O#"O*O!y:ͣE#!y:!y!y:>** *!R*!R"۫!1!}21!1:g#!1M.FI!1:Ͳ́!!͛OM{$I !1:Ͳ́!!͛O}oEʛ%!}2A!1!!!1:́ !A!Z͛!a!z͛!0!9͛!.͑!:͑#!1!!1:o !!͒Eʛ%!}2A͛ͺ Not able to open included file!" ͙!!.e.!1:Ͳ́!͑!͑OE+'M.PA!1:Ͳ́!!͛OE%*ݫ#"ݫ*߫#"߫!"M..INDEX!1:Ͳ́!!͛OE:&!}2ԫM!M.PN!1:Ͳ́!!͛OEʂ&!1:͊!!͒Eʂ&!1:͊!"߫M.PO!1:Ͳ́!!͛OEʺ&!1:͊!"!*!"٫M.MT!1:Ͳ́!!͛OE&!1:͊!"!Y$M.MB!1:Ͳ́!!͛OE$'!1:͊!"!Y$!}21*1&!)!!):ͣfzʶ(}2 !)* &n&́!)͑!(͑![͑!]͑! ͑!,͑! ͑! ͑!!͑!;͑OE'!)* &! s!)* &n&́!.͑!:͑OEW(* &!):ͣE(!)* &! sW(!)* &!n&́! ͑! ͑! ͑OEW(!)* &! s*ҫ&Eʫ(!)* &n&́!A!Z͛!0!9͛!_͑O}oEʫ(!)* &! s* &#N'!):!)!):*A&!}oE(!}2AM!*A&E)!ͩ!D =)! ͩ!D *B&E=)!pͺ*&" *&!|g}o}2*&! ͒Eʀ)!:*&e.=!!:ͣ!Eʝ)! }2!:ͣ!*&! }oE)*E&}o*D&}o}oE)! }2*A&E)!}2 *! }2*&! *&}oE(!:! ! :!"!}2ҫ!}2BY$!}2F!}2E!}2D!}2C!"?!!!"!"!"߫!"!"ݫ!}2A! }o*ԫ&}o}oE0(!*ӫ&E**#"*#"!:r$!͒E0!:1'!*ӫ&}oE/+*#"*#"**۫ES+*ݫ#"ݫ*߫#"߫!"!!:ͣfz0"=!*=n&}2!!͛ͺ)Enter file to be INDEXED < > !:ͣ!͒Eʱ;!!!!!!:͛!ͪ !!!:ͣ!E;!:!;!͎ M!!:ͣ!͒EN!!͛ͺCondenced print (Y/N) < > !}2!!͠Em=!ͩ!D *&}2*&!͒Eʙ=*&͛" *&́!Y͑!N͑!͑OEE=*&!E= ?*&!YE>! "!!f"!!"!! "!!X" !}2ӫ!}2ѫ͛ ͛ ͛ͺ reading input file  V$B23͛ͺ Writing Index to disk 5!pi ! i !!: !M.BAK=o !͓!E>!i ! !: !M.BAK=ͥ !p!: !M.$$$=o !p!:ͥ !M.BAK=o !͓!E!i ! !: !M.BAK=ͥ !p!: !M.$$$=o !pEʱ;!!!!!!:͛!ͪ !!!:ͣ!E;!:!;!͎ M!!:ͣ!͒EN will index name.ext INDEX will ask the user for the program name During operation, the number of lines which have been processed, is displayed, as well as the most reciently found word or phrase which has been added. To conserve space, a word is added to the index only if it is not allready on the page. The sorting routine is a copy of the sort which is in the original index program by T Jennings. It is slow but after all, at this price what do you expect. It is better that doing it by hand. As the sort is progressing, the number of passes through the sort is displayed. This keeps anxious typers from getting worried. The number of passes will be about 90% of the number of words added to the index, which can be used to judge about how much time the sort will take. The entire process of reading, sorting and writing the index takes about 4 minutes for a 55 page engineering document Words are marked with a ^K character and phrases use a ^P surrounding the phrase both character and "surrounding the phrase" will be found in the index of this program. Since this was written in pascal, I included the pascal include command {$I filename.ext} as well as the .FI command to mark the included text. In addition, if .pas extension is used, the program will ask if you will use a compressed format for printing. If you answer "Y" then 70 lines per page and 132 columns per line are assumed. In addition, the index marks the line number rather than page number when it adds the item to the index list. When these programs are printed with my lister23 program (already contributed) the index is printed at the end of the program (right where it belongs) Turbo users NOTE: When re-compiling this program, be sure to set the END address $1000 less than the default. This allows the program to be executed from within wordstar. It does however reduce the number of indexes allowed. I used $C000 on m y OS-1 .pa ******** revision 1 ********** Changed the program so that the program (pascal) variables need only be flaged once for the program to index all such words. The entire source file is re-read, looking for any words which match the existing index list. If a variable match is found, and the line on which the variable exists is not matched, then the variable is added to the index. The bubble sort routine was replaced with a shell sort which increases the sort speed tremendously. The number of passes through the sort should be 10 or less. The heap space, which is used to store the indexed words, was changed so that only the space actually used by the word is used. Each time a word is added, the heap is adjusted with the mark and release standard procedures to reset the heap pointer to the next available space. The output of this program was changed so as to not enlarge the source program. An output file is created with the name , to which all of the index is placed. Then a .FI command is inserted at the end of the source file, so that this file is included at print time. The pointer system was expanded from 1000 max to 2500. Lastly, A disk reset command is issued prior to looking for the file specified, either from the command line, or as entered from the program. This eliminates the Bdos R/O error. ******** revision 1 ********** I hope this is useful to some of you.. JSL *) ch is used to store the indexed words, was changed so that only the space actually used by the word is used. Each time a word is added, the heap is adjusted with the mark and release standard procedures to reset the heap pointer to the next available space. The output of this program was changed so as to not enlarge the source program. An output file is created  I N D E X  - A - ALLOWED . . . . . . . . . . 128, 252, 259 APPEND . . . . . . . . . . 276, 380, 399, 539 AT_TEMP . . . . . . . . . . 216, 220, 230, 236, 237 AT_X . . . . . . . . . . 215, 221, 223, 226, 229, 232, 235, 236  - C - C . . . . . . . . . . 1, 30, 279, 433, 435, 462, 470, 478, 512, 513, 515, 516, 524 CH . . . . . . . . . . 59, 523, 524, 752, 755, 756, 757, 758, 759, 760, 761 CHANGING . . . . . . . . . . 572, 620 CHARACTER . . . . . . . . . . 105, 108 CHAR_COUNT . . . . . . . . . . 31, 405, 434, 548 COLUMN . . . . . . . . . . 642, 682, 688, 693, 695, 700, 702 COUNT . . . . . . . . . . 575, 598, 626, 627 CURRENT_LINE . . . . . . . . . . 53 CURRENT_PAGE . . . . . . . . . . 52  - D - DATAPTR . . . . . . . . . . 7, 28 DEF_BMARGIN . . . . . . . . . . 24, 285, 336, 766 DEF_LMARGIN . . . . . . . . . . 21, 326, 327, 648, 763 DEF_RMARGIN . . . . . . . . . . 22, 649, 662, 764 DEF_TMARGIN . . . . . . . . . . 23, 285, 331, 765 DOTS . . . . . . . . . . 640, 681 DUMP_LINE . . . . . . . . . . 643, 647, 672, 679, 691  - E - ENDD . . . . . . . . . . 25, 28, 445, 489, 617, 619 END_OF_PRIMARY_LIST . . . . . . . . . . 41, 223, 538 ENTRIES . . . . . . . . . . 35, 221, 224, 226, 229, 236, 397, 440, 442, 444, 445, 447, 449, 467, 468, 470, 472, 474, 484, 486, 488, 489, 491, 492, 499, 500, 502, 504, 511, 515, 538, 549, 560, 604, 609, 666  - F - F1 . . . . . . . . . . 49, 379, 390, 409, 535, 733, 734, 787, 793 F2 . . . . . . . . . . 49, 381, 650, 652, 653, 655, 656, 657, 658, 659, 661, 663, 664, 665, 671, 675, 677, 678, 681, 690, 692, 694, 699, 706, 739, 740, 786, 794, 795 F3 . . . . . . . . . . 49, 299, 300, 371, 376, 389, 788, 789, 791 FIRST . . . . . . . . . . 573, 580, 586, 587, 589, 591, 612, 613, 614, 615, 617, 618, 621, 622 FL_X . . . . . . . . . . 345, 348, 350, 351, 352, 353, 354, 356, 357, 359, 360 FOUND_INDEX . . . . . . . . . . 43, 318, 409, 540, 651, 711 FUNCTION ALREADY_THERE . . . . . . . . 213 FUNCTION COMP .  . . . . . . . . . 580 FUNCTION FILTER . . . . . . . . . . 252 FUNCTION FILTER_LINE . . . . . . . . . 343 FUNCTION GET_NUMBER . . . . . . . . . . 185 FUNCTION ROOT . . . . . . . . . . 171 FUNCTION SCAN_LINE . . . . . . . . . . 288 FUNCTION STRUPPER . . . . . . . . . . 242 F_LINE . . . . . . . . . . 252, 259, 260, 263, 264, 343, 348, 350, 351, 352, 353, 354, 356, 357, 359, 360, 362 F_X . . . . . . . . . . 254, 257, 259, 260, 262, 263  - G - GL_CH . . . . . . . . . . 367, 376, 379, 381, 383, 384, 385, 386, 388, 391 GL_LINE . . . . . . . . . . 368, 373, 384, 385, 386, 392 GN_LINE . . . . . . . . . . 185, 193, 195, 197, 200, 201, 203 GN_TEMP . . . . . . . . . . 188, 203, 205 GN_X . . . . . . . . . . 187, 191, 193, 194, 195, 197, 199, 200, 203, 204 GOTPHRASE  . . . . . . . . . . 274, 387, 403, 482, 485, 498, 510 GOTWORD . . . . . . . . . . 273, 387, 403, 438, 441, 462, 466, 510  - I - INCLUDE . . . . . . . . . . 112, 277, 296, 303, 371, 372, 375, 389, 408, 529 INNAME . . . . . . . . . . 50, 655, 658, 724, 726, 728, 733, 736, 737, 739, 747, 788, 793, 794, 795 INWORD . . . . . . . . . . 272, 402, 437, 455, 457  - J - J . . . . . . . . . . 278, 350, 356, 384, 385, 388, 391, 431, 433, 519, 577, 610, 612 J2 . . . . . . . . . . 577, 609, 610 J6 . . . . . . . . . . 578, 604, 606, 607, 609, 613, 621, 629  - K - K . . . . . . . . . . 16, 105, 278, 404  - L - LAST . . . . . . . . . . 573, 580, 586, 587, 589, 591, 613, 614, 615, 618, 619 LASTCOL . . . . . . . . . . 19 LAST_CHAR_BLANK . . . . . . . . . . 275, 404, 513, 516 LINE . . . . . . . . . . 57, 116, 117, 138, 162, 319, 411, 417, 419, 431, 433 LINE_COUNT . . . . . . . . . . 33, 406, 414, 422, 472, 502, 529, 530 LMARGIN . . . . . . . . . . 39, 327, 648, 682, 693  - P - PAGE_LEN . . . . . . . . . . 20, 285, 767 PAGE_SIZE . . . . . . . . . . 38, 285, 425 PASS2 . . . . . . . . . . 45, 222, 358, 398, 445, 462, 469, 537 PAS_FILE . . . . . . . . . . 44, 412, 420, 471, 501, 676, 712, 768 PHRASE_MARK . . . . . . . . . . 17, 478 PROCEDURE CLEANUP . . . . . . . . . . 555 PROCEDURE DETERMIN_PAGE_SIZE . . . . . 282 PROCEDURE DUMP . . . . . . . . . . 638 PROCEDURE INDEX . . . . . . . . . . 268 PROCEDURE SORT . . . . . . . . . . 568 PROGRAM INDEX . . . . . . . . . . 2  - R - READ_PAGE . . . . . . . . . . 37, 312, 408, 427, 547 RLINE . . . . . . . . . . 171, 174, 176, 178, 179 RMARGIN . . . . . . . . . . 40, 649, 688  - S - SC_LINE . . . . . . . . . . 288, 292, 293, 294, 297, 298, 299, 308, 310, 316, 321, 322, 323, 324, 326, 329, 331, 334, 336 SEARCH_TWICE . . . . . . . . . . 46, 533, 536, 710, 769 SOC . . . . . . . . . . 13, 252 STOPP . . . . . . . . . . 369, 389, 390, 391 STRDATA . . . . . . . . . . 7, 9 STRPTR . . . . . . . . . . 28, 226, 229, 236, 442, 444, 449, 467, 468, 470, 472, 474, 486, 488, 492, 499, 500, 502, 504, 511, 515, 562, 563, 564, 614, 615, 617, 618, 619, 646, 668, 670, 673, 678, 681, 686, 694, 699, 701, 702 SURROUNDING THE PHRASE . . . . . . . . 106 SU_LINE . . . . . . . . . . 242, 247, 248, 249 SU_X . . . . . . . . . . 244, 247, 248 SX . . . . . . . . . . 576, 614, 615  - T - TEMP . . . . . . . . . . 574 THIS_LINE . . . . . . . . . . 34, 314, 407, 415, 423, 425, 429 THIS_PAGE . . . . . . . . . . 36, 313, 323, 407, 428, 474, 504 TOTAL_LINE . . . . . . . . . . 54 TRAILER . . . . . . . . . . 56, 716, 718, 719, 723, 724, 727 TTT . . . . . . . . . . 280, 443, 450, 487, 493  - W - WORD_COUNT . . . . . . . . . . 32, 405, 448, 458, 546 WORD_FOUND  . . . . . . . . . . 47, 219, 228, 445 WORD_LEN . . . . . . . . . . 18, 511 WORD_MARK . . . . . . . . . . 16, 462  - X - X . . . . . . . . . . 55, 176, 177, 178, 557, 560, 562, 563, 564, 646, 664, 666, 668, 670, 673, 678, 681, 685, 686, 694, 699, 701, 702, 730, 732  - Y - Y . . . . . . . . . . 55, 115, 750, 759, 761  - Z - Z . . . . . . . . . . 55, 298, 359, 462 , 115, 750, 759, 761  - Z - Z . . . . . . . . . . . . . . . . . . . . 56, 716, 718, 719, 723, 724, 727 TTT . . . . . . . . . . 280, 443, 450, 487, 493  - W - WORD_COUNT . . . . . . . . . . 32, 405, 448, 458, 546 WORD_FOUND {$C-} Program Index; type Str255 = string[255]; str39 = string[39]; dataptr = ^strdata; strdata = record pg : integer; data : str39; end; soc = set of char; const word_mark = $0b; {^K} Phrase_mark = $10; {^P} Word_len = 39; LastCol = 40; Page_len : integer = 66; Def_LMargin : integer = 8; Def_RMargin : integer = 72; Def_TMargin : integer = 3; Def_BMargin : integer = 8; endd = 2500; var strptr : array [1..endd] of dataptr; c : char; Char_count : real; Word_count, Line_count, This_line, entries, This_page, Read_page, Page_size, Lmargin, RMargin, End_of_Primary_List : integer; Found_index, PAS_file, pass2, Search_twice, Word_Found : boolean;  F1, F2, F3 : text; InName : string[14]; var Current_Page, Current_line, Total_line, x, y, z : integer; Trailer : string[$7F] absolute $80; line : string[255]; ch : char; {.pa} {$I index.doc} {.pa} {$I INDEX.1 } {.pa} {$I INDEX.2 } {.pa} {$I INDEX.3 } {.pa} begin Search_Twice := false; Found_index := false; PAS_file := false; clrscr; gotoxy (1,4); write ('Enter file to be INDEXED < >'); if length(Trailer) <> 0 then begin delete (trailer,1,1); gotoxy (27,4); write (trailer); end; repeat gotoxy (27,4); if length(trailer) > 0 then InName := Trailer else readln (InName); Trailer := ''; if length(InName) <> 0 then begin x := bdos($19); { get loged drive } bdos ($0D,$00); { reset disk system } bdos ($0E,x); { Select logged drive again } Assign (F1,InName); {$I-} reset (F1); {$I+} end; until (ioresult = 0) or (length(InName) = 0); if length(InName) = 0 then exit; assign (F2,root(InName)+'.$$$'); {$I-} rewrite (F2); {$I+} if ioresult <> 0 then begin writeln (' Trouble opening output file'); exit; end; writeln; if pos('.PAS',StrUpper(InName)) <>0 then begin gotoxy (1,6); write ('Condenced print (Y/N) < >'); repeat ch := ^@; gotoxy (25,6); if keypressed then read (kbd,ch); ch := upcase(ch); if ch <> ^@ then write (ch); until ch in ['Y','N',^[]; if Ch = ^[ then exit; if ch = 'Y' then begin Def_LMargin := 11; Def_RMargin := 102; Def_TMargin := 6; Def_BMargin := 12; Page_len := 88; PAS_file := true; Search_Twice := True; end; end; writeln; {.pa} { Now read file looking for marked words } writeln; writeln (' reading input file '); index; cleanup; sort; writeln (' Writing Index to disk'); dump; Close (F2); Close (F1); assign (F3,root(InName) + '.BAK'); {$I-} erase (F3); {$I+} if ioresult = 0 then close (F3); rename (F1,root(InName) + '.BAK'); assign (F2,root(InName)+'.$$$'); rename (F2,InName); end. ..Index .pa .FI index11.IDX root(InName) + '.BAK'); assign (F2,root(InName)+'.$$$'); rename (F2,InName); end. ..Inoxy (25,6); if keypressed then read (kbd,ch); ch := upcase(ch); if ch <> ^@ then write (ch); until ch in ['Y','N',^[]; if Ch = ^[ then exit; if ch = 'Y' then begin Def_LMargin := 11; Def_RMargin := 102; Def_TMargin := 6; Def_BMargin := 12; Page_len := 88; PAS_file := true; Search_Twice := True; end; end; writeln; {.pa} { Now read fileFunction Root( Rline :str255) : str255; begin if length(Rline) > 0 then begin x := pos('.',Rline); if x <> 0 then delete(Rline,x,length(Rline)); root := Rline; end else root := ''; end; Function Get_Number( GN_line :str255) : integer; var GN_x, GN_temp : integer; begin GN_x := 1; repeat if not(GN_line[GN_x] in ['0'..'9']) then if GN_x > 1 then delete (GN_line,GN_x,length(GN_line)) else delete (GN_line,GN_x,1) else GN_x := succ(GN_x); until (GN_x > length(GN_line)); if length(GN_line) > 0 then begin val (GN_line,GN_temp,GN_x); if GN_x = 0 then Get_number := GN_temp else Get_number := 0; end else Get_number := 0; end; Function Already_there : boolean; var AT_x : integer; AT_temp : boolean;  begin Word_found := false; AT_temp := false; AT_x := entries -2; if Pass2 then AT_x := End_of_Primary_List; if entries > 2 then repeat if Strptr[entries -1]^.data = Strptr[AT_x]^.data then begin Word_found := true; if Strptr[entries -1]^.pg = Strptr[AT_x]^.pg then AT_temp := true else AT_x := pred(AT_x) end else AT_x := pred(AT_x); until AT_temp (* or (strptr[AT_x]^.pg <> strptr[entries-1]^.pg) *) or (AT_x < 1); Already_there := AT_temp; end; x = 0 then Get_number := GN_temp else Get_number := 0; end else Get_number := 0; end; Function Already_there : boolean; var AT_x : integer; AT_temp : boolean; function strUpper( SU_line :str255):str255; var SU_x : byte; begin for SU_x := 1 to length(SU_line) do SU_line[SU_x] := upcase(SU_line[SU_x]); strUpper := SU_line; end; Function Filter ( F_Line : str255; allowed : soc) : str255; var F_x : integer; begin F_x := 1; repeat if not(F_Line[F_x] in allowed) then delete (F_Line,F_x,1) else F_x := succ(F_x); until F_x > length(F_Line); filter := F_Line; end; {.pa} Procedure index; label again; var inword, gotword, gotphrase, last_char_blank, append, Include : boolean; k, j : integer; c : char; ttt : ^integer; Procedure Determin_page_size; begin Page_size := page_len - Def_TMargin - Def_BMargin; end; function scan_line( SC_line :str255) :boolean; begin scan_line := false; SC_line := strupper(SC_line); if (pos ('.FI',SC_line) in [1..5]) or (pos ('{$I ',SC_line) in [1..5]) then begin include := true; delete (SC_line,1,3); SC_line := filter(SC_line,['A'..'Z','a'..'z','0'..'9','.',':']); assign (F3,SC_line); {$I-} reset (F3); {$I+} if ioresult <> 0 then begin include := false; write (' Not able to open included file',^G); clreol; delay(1000); end; end; if pos('.',SC_line) in [1,2] then begin if pos('.PA',SC_line) in [1..5] then begin Read_page := succ(Read_page); This_page := succ(This_page); This_line := 1; end; if pos('..INDEX',SC_line) in [1..5] then begin found_index := true; line := ''; end; if pos('.PN',SC_line) in [1..5] then if get_number(SC_line) <> 0 then This_page := get_number(SC_line); if pos('.PO',SC_line) in [1..5] then begin Def_LMargin := get_number(SC_line); LMargin := Def_LMargin; end; if pos('.MT',SC_line) in [1..5] then begin Def_TMargin := get_number(SC_line); Determin_page_size; end; if pos('.MB',SC_line) in [1..5] then begin Def_BMargin := get_number(SC_line); Determin_page_size; end; scan_line := true; end; end; Function filter_line ( F_line :str255) :str255; var FL_x : byte; begin for FL_x := 1 to length(F_line) do  begin if F_line[FL_x] in [')','(','[',']',' ',',',^m,^j,'!',';'] then F_line[FL_x] := ' '; if F_line[FL_x] in ['.',':'] then if FL_x = length(F_line) then F_line[FL_x] := ' ' else if F_line[FL_x+1] in [' ',^m,^j] then F_line[FL_x] := ' '; if pass2 then if not(F_line[FL_x] in ['A'..'Z','0'..'9','_']) then F_line[FL_x] := ' '; end; Filter_line := F_line; end; Function Get_line : str255; var GL_ch : char; GL_line : str255; stopp : boolean; begin if include and eof(F3) then include := false; GL_line := ''; repeat if include then read (F3,GL_ch) else begin read (F1,GL_ch); if Append then write (F2,GL_ch); end; GL_ch := upcase(chr(ord(GL_ch) and $7F)); if GL_ch <> ^j then GL_line := GL_line + GL_ch; if length(GL_line) > 250 then GL_ch := ^j; if (length(GL_line) > 200) and (GL_ch = ' ') then if not(gotword) and not(gotphrase) then GL_ch := ^j; if include then stopp := eof(F3) else stopp := eof(F1); until (GL_ch = ^j) or stopp; get_line := GL_line; end; begin entries := 1; Pass2 := false; Append := true; Determin_page_size; Again: inword := false; gotword := false; gotphrase := false; last_char_blank := false; k := 0; Char_count := 0.0; Word_count := 0; Line_count := 0; This_page := 1; This_line := 1; Read_page := 1; Include := false; while not(eof(F1)) and not(found_index) do begin line := get_line; if PAS_file then begin Line_count := succ(Line_count); This_line := succ (This_line); end; if Scan_line(line) <> true then begin line := filter_line (line); if not(PAS_file) then begin Line_count := succ(Line_count); This_line := succ (This_line); end; if This_line > Page_size then begin Read_page := succ(Read_page); This_page := succ(This_page); This_line := 1; end; for j := 1 to length(line) do begin c := line[j]; Char_count := Char_count + 1.0; if c = ' ' then begin inword := false; if gotword then begin  entries := succ(entries); gotword := false; heapPtr := ord(strptr[entries-1]) + 3+ length(strptr[entries-1]^.data); mark(ttt); release(ttt); gotoxy (1,15); write (strptr[entries-1]^.data); clreol; if Already_there or (pass2 and not(word_found)) or (entries = endd) then begin entries := pred(entries); word_count := pred(word_count); heapPtr := ord(strptr[entries]); mark(ttt); release(ttt); end; end; end else if not(inword) then begin inword := true; Word_count := succ(Word_count); end; {.pa} if (c = chr(word_mark)) or ((c in ['A'..'Z']) and pass2 and not(gotword)) then begin if memavail > 200 then begin gotword := true; new (strptr[entries]); strptr[entries]^.data := ''; if pass2 then strptr[entries]^.data := c; if PAS_file then strptr[entries]^.pg := Line_count else strptr[entries]^.pg := This_page; end; end else if c = chr(phrase_mark) then begin if memavail > 200 then begin if gotphrase then begin entries := succ(entries); gotphrase := false; heapPtr := ord(strptr[entries-1]) + 3 + length(strptr[entries-1]^.data); mark(ttt); release(ttt); gotoxy (1,15); write (strptr[entries-1]^.data); clreol; if already_there or (entries = endd) then begin entries := pred(entries); heapPtr := ord(strptr[entries]); mark(ttt); release(ttt); end end else begin gotphrase := true; new (strptr[entries]); strptr[entries]^.data := ''; if PAS_file then strptr[entries]^.pg := Line_count else strptr[entries]^.pg := This_page;  end; end; end else begin if (gotword or gotphrase) and (length(strptr[entries]^.data) < word_len) and (c >= ' ') and (c <> '.') and not(last_char_blank and (c = ' ')) then begin strptr[entries]^.data := strptr[entries]^.data+c; last_char_blank := c = ' '; end; end; end; { for j := } end; { if scan_line } if keypressed then begin read (kbd,ch); if ch = ^C then halt; delay (1000); end; gotoxy (1,9); if include then writeln ('I ',line_count :5,' lines processed') else writeln (' ',line_count :5,' lines processed'); write (memavail:7,' heap space remaining'); end; { while not(eof) } if Search_Twice then begin reset (F1); Search_twice := false; Pass2 := true; End_of_Primary_List := entries - 1; Append := false; Found_index := false; gotoxy (1,20); write ('Re-reading the Pascal source file'); goto Again; end; gotoxy (1,10); writeln (Word_count :7,' words were counted'); clreol; writeln (Read_page :7,' pages were counted'); clreol; writeln (Char_count :7:0,' characters were counted'); writeln (entries -1 :7,' words or phrases were put into the index'); end; { of procedure } ch); if ch = ^C then halt; delay (1000); end; gotoxy (1,9); if include then writeln ('I ',line_count :5,' lines processed') else writeln (' ',line_count :5,' linprocedure cleanup; var x : integer; begin for x := 1 to entries -1 do begin while (strptr[x]^.data[1] = ' ') and (length(strptr[x]^.data) > 1) do delete(strptr[x]^.data,1,1); strptr[x]^.data[1] := upcase(strptr[x]^.data[1]); end; end; Procedure sort; label next; var changing : boolean; first, last : integer; temp : ^integer; count, Sx : integer; J, J2, J6 : integer; function comp (first,last :str255):integer; var i : integer; begin i := 1; while (first[i] = last[i]) and (i < length(first)) and (i < length(last)) do I := succ(i); i := ord(first[i])-ord(last[i]); if i = 0 then comp := length(first) - length(last) else comp := i; end; {.pa} begin count := 0; gotoxy (1,17); write ('sorting ...'); { Shell sort } j6 := entries -1; repeat j6 := (j6 div 2); if j6 > 0 then begin j2 := entries -1 -j6; for j := 1 to j2 do begin first := j; next: last := first + j6; Sx := comp (strptr[first]^.data,strptr[last]^.data); if (Sx > 0) or ((Sx = 0) and (strptr[first]^.pg > strptr[last]^.pg)) then begin strptr[endd] := strptr[first]; strptr[first] := strptr[last]; strptr[last] := strptr[endd]; changing := true; first := first - j6; if first > 0 then goto next; end; end; gotoxy (13,17); count := succ(count); write (count :5,' Passes'); end; until j6 = 0; { end of Shell sort } writeln; end; {.pa} Procedure dump; const dots : string[40] = ' . . . . . . . . . . .'; var column : integer; Dump_line : integer; begin writeln (strptr[x]^.data); Dump_line := 4; LMargin := Def_Lmargin; RMargin := Def_RMargin; writeln(F2,' '); if not(found_index) then writeln (F2,'..Index'); writeln (F2,'.pa'); writeln (F2,'.FI '+root(InName) + '.IDX'); writeln (F2,' '); Close (F2); Assign (F2,root(InName)+'.IDX'); rewrite (F2); writeln (F2,' '); if Def_RMargin > 80 then write (F2,' '); writeln (F2,' I N D E X'); writeln (F2,' '); for x := 1 to entries -1 do begin if (x = 1) or (strptr[x]^.data <> strptr[x -1]^.data) then begin writeln (strptr[x]^.data); clreol; writeln (F2,' '); Dump_line := succ(Dump_line); if strptr[x]^.data[1] <> strptr[x-1]^.data[1] then begin  writeln (F2,' '); if not(PAS_file) then writeln (F2,'.CP 6'); writeln (F2,' '+^d+' - ',strptr[x]^.data[1],' -'+^d); Dump_line := Dump_line + 2; end; write (F2,strptr[x]^.data +' '+ copy(dots,length(strptr[x]^.data)+2,40) :40,strptr[x]^.pg :5); column := 45 + LMargin; end else if x <> 1 then if strptr[x]^.pg <> strptr[x-1]^.pg then begin if column > RMargin - 4 then begin writeln (F2,','); Dump_line := succ(Dump_line); write (F2,'' :41); Column := 40 + LMargin; write (F2,strptr[x]^.pg :5); column := column + 6; end else begin  write (F2,', ',strptr[x]^.pg :0); column := column + 3; if strptr[x]^.pg >= 10 then column := column + trunc(ln(strptr[x]^.pg)/ln (10)); end; end; end; writeln (F2,' '); end;  column := 45 + LMargin; end else if x <> 1 then if strptr[x]^.pg <> strptr[x-1]^.pg then begin if column > RMargin - 4 then begin writeln (F2,','); Dump_line := succ(Dump_line); write (F2,'' :41); Column := 40 + LMargin; write (F2,strptr[x]^.pg :5); column := column + 6; end else begin :2=272<>!~(s1 ={!j$z22x(4G>/##(* #(#~ (L 9B >2M(:m (/ !\ !l: 2!2\<: (k,˾~@(08 02G_(GW: :O}0%o{z2:<2Ozc> w#{!G=o0$4>(#6= ~X((J(((((z Z.z*Z6)+6(+6)+6(+R# 0w+0w+{{0w+z0w+(/ 86X+6I+# 6V+6I+(06I+=  6V+{(/ 86C+6X+# 6L+6X+(06X+=  6L+z6C+= #6.#6 #6 #k,˾~ ( ( (((1 Ê k!˿ (+w:x (G~ #~ 66 #6 #Kx(>w#d0d 0 5\ѷ€:!OK!. !o S!KB81 >N<(Y:$ F!\:< \#!\l >B!AK"vl\!!-! !!!V!| ~O;##~0 _zWW !DOUTLINE 1.0 (c) Eric Gans 06/13/85 OUTLINE src [dst] [/sws] Switches: B=NoBak Mn=RtMarg->n (50w#d0d 0 5\ѷ€:!OK!. !o S!KB81 >N<(Y:$ F!\:< \#!\l >B!AK"vl\!!-! !OUTLINE.COM is a very fast and compact (1.5K!) "outline processor" that converts a WordStar document in which you have previously embedded its simple outlining command characters into another WordStar document that is indented and section-numbered in accordance with your embedded commands. The resulting document can then be cleaned up with WordStar for final publication. It performs some of the functions of ReportStar, and of course the price is right. Up to 8 hierarchical levels of headings are allowed as well as a "plain text" level, and up to 255 consecutive entries at each level. -- ALAN CHATTAWAY OUTLINE.DOC v1.0 [06/13/85] ============================ Introduction ------------ In these days of such "outline processor" programs as KAMAS and the public-domain program TOUR, a friend showed Eric Gans of UCLA an older program called OUTLINE which has no elaborate command structure, but because of this is all the easier to use. Instead of attempting to be its own word processor, OUTLINE processes WordStar files (of any length) in which you have embedded simple outlining commands which anybody who already uses WordStar can learn in about 30 seconds. The result of running OUTLINE is the creation of a new WordStar document file containing the text of the first document, rearranged to conform to more-or-less standard rules for laying out documents that have an outline; for example, successive levels of the document are progressively indented, and succesive entries at the same level are sequentially numbered. OUTLINE does some of the same things that ReportStar does, though on a more modest scale (and free!) Background and History ---------------------- The original OUTLINE program shown to Eric Gans by his friend is a great little program, but it has a couple of drawbacks: 1. It allows only four outline levels, with no "0" (zero) level for ordinary text which is not part of the outline. 2. It allows only a limited number of outline entries at each level (39 for level 1, 26 for level 2, etc.) 3. The right margin setting cannot be wider than 80 characters. 4. The file takes up 16K of disk space, and, although not slow, could be a lot faster. Eric's own OUTLINE program, for which this is the documentation, is a completely new Z80 version, with the following improvements: 1. It allows 8 outline levels, plus a "zero" level for straight text that does not belong in the outline. 2. It allows the right margin setting to be anywhere from 50 to 255 characters. 3. It creates a [.BAK] file from your source, if you use the same name for both the source and destination files; but this can be disabled with a "switch" parameter on the command line. 4.  It occupies only 12 sectors (1.5K) of disk space, and is quite fast: 30 seconds to outline an 80K source file! Command Structure of OUTLINE ---------------------------- The outline levels (0-8) are entered in the source document preceeded by an "@" character. They may appear at any point in the text, although it is simpler to put them in the left margin. The destination file keeps the text in the same order it appears in the source file, but indented and numbered according to the level, as follows: @0 = Plain text, printed with a flush left margin @1 = Roman capital numerals from I to CCLV (= 255) @2 = Capitals from A to Z. The 27th occurence of @2 will produce the letter A again, and it will continue to wrap around until 255 letters have been reached. @3 = Ordinary numbers from 1 to 255 @4 = Lower case letters from a to z, wrapping as in @2 above @5 = Roman lower case numerals from i to cclv as in @1 above @6 = Capitals from (A) to (Z), wrapping as in @2 above @7 = Numbers from (1) to (255), as in @3 above @8 = Lower case letters from (a) to (z), as in @5 above Thus, the following source file: @1 OUTLINE.COM @2 ease of operation @3 small size @3 simple command structure @4 single format @4 follows text order @3 speed @2 flexibility @3 allows direct entry using WordStar @3 allows files of any length @3 margins 50-255 - produces the following destination file (using the /L switch on the command line, as described later): I. OUTLINE.COM A. ease of operation 1. small size 2. simple command structure a. single format b. follows text order 3. speed B. flexibility 1. allows direct entry using WordStar 2. allows files of any length 3. margins 50-255 (this example was actually produced by OUTLINE itself) Invoking OUTLINE.COM -------------------- OUTLINE is invoked from the CP/M command line as follows: A>OUTLINE sourcefile.name [destinationfile.name] [/switches] The parameters inside square brackets are optional, and may be omitted if they are not required by your application. If no destination file name is given, the source file name will be used for the destination file, and the original source file will be renamed as a [.BAK] file, unless the B switch is also used. The following "switch" parameters may optionally be added at the end of the command line: B = no [.BAK] file. Use this only when you did not specify a destination file name and you don't need to keep the original source file. L = don't leave "extra" blank lines in the destination file between headings. The default is to leave one blank line before headings at levels 2 through 8, and two blank lines before headings at levels zero and 1. With the L switch, you get one blank line before headings at levels zero and 1, and no blank lines before headings at the other levels. M## = Set the right margin to ##, which can be any number between 50 and 255 (inclusive). The default right margin setting is 65, just as in WordStar. These switches can be combined together in any order; for example, either /BML100 or /m100bl is acceptable, and produces the same result. Miscellaneous Notes ------------------- To produce the character "@" itself, enter "@@" in the source file. A single "@" character followed by anything else other than 0-9 will be skipped. No space is necessary after the @# entry, although the use of spaces will makes the source file more readable. "Extra" blank spaces and carriage returns in the source file are "squeezed" out of the destination file. "Soft" hyphen characters in the source file will be disregarded. If you want to edit the destination file with WordStar, you should reset the right margin with ^OR if you used the "M" switch. OUTLINE does nothing about page breaks, since WordStar creates its own as it goes along while editing or printing the file. Actually, WordStar does mark the page breaks that exist at the time the file is saved to disk (by setting the high bit on a line feed character), but as this disappears as soon as the file is edited again, and is ignored when WordStar prints the file, it has little relevance. OUTLINE gives you total freedom in changing levels; you can mix them in any order, although of course the traditional format moves downward 1 level at a time and never permits an isolated entry at any level (e.g., no "A" without a "B"). It seemed counterproductive to Eric to enlarge the program to check for "standard" usage, when it might just prove useful in some application to be able to jump directly from level 1 to level 5. In any case, the program is simple enough that you will have no difficulty in applying these constraints yourself. Since this is version 1.0 of Eric's Z80 version of OUTLINE, he would appreciate suggestions for additional features and/or corrections, and will do his best to include them in future versions. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [ ] [ Eric Gans ] [ French Department, UCLA ] [ Los Angeles, CA 90024 ] [ ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .po1 WS3330.DOC--User Patch Points for WordStar 3.3 and 3.0 KAYPRO WORDSTAR 3.3 WS 3.3 WS 3.0 ORIGINAL LABEL ADDR ADDR DESCRIPTION SETTINGS WSVER 0110 0110 WordStar version COPRIT 0112 0117 copyright notice SIGNON 014E 0153 WordStar sign-on message 0179 017F serial number IDTEX 018A 018F terminal id text PIDTEX 01AE 01B3 printer id text PROTTX 01D2 01D7 printer protocol text PDRVTX 01F6 01FD port driver text 021B 0220 various flags and holders for internal . use by WordStar . . HITE 0232 0248 screen height in lines (24) 18 WID 0233 0249 screen width in columns (80) 50 CLEAD1 0234 024A cursor positioning: lead-in string 02 1B 3D 00 00 00 00 00 00 CLEAD2 023D 0253 crsr pos: string between row/column 00 00 00 00 00 CTRAIL 0242 0258 crsr pos: ending string 00 00 00 00 00 CB4LFG 0247 025D crsr pos: 00 = row/col, FF = col/row 00 LINOFF 0248 025E crsr pos: row offset 20 COLOFF 0249 025F crsr pos: column offset 20 ASCUR 024A 0260 crsr pos: 00 = binary row & col numbers 00 UCRPOS 024B 0264 jmp to user crsr pos routine 00 00 C9 00 00 ERAEOL 0250 026D terminal erase to end of line string 01 18 00 00 00 00 00 LINDEL 0257 0274 terminal delete line string 00 00 00 00 00 00 00 LININS 025E 027B terminal insert line string 00 00 00 00 00 00 00 00 00 IVON 0267 0284 turn on highlighting string 06 1B 42 30 1B 42 31 IVOFF 026E 028B turn off highlighting string 06 1B 43 30 1B 43 31 TRMINI 0275 0292 terminal initialization string 01 1A 00 00 00 00 00 00 00 TRMUNI 027E 029B terminal uninitialization string 00 00 00 00 00 00 00 00 00 INISUB 0287 02A4 jmp to user term init routine 00 00 C9 UNISUB 028A 02A7 jmp to user term uninit routine 00 00 C9 USELST 028D 02AA FF = can use last row w/o scrolling 00 DELCUS 028E 02AE delay after cursor positioning 0A DELMIS 028F 02AF delay after misc other functions 05 MEMAPV 0290 02B0 FF = memory-mapped video display 00 MEMADR 0291 02B1 address of home pos in mm video 00 00 HIBIV 0293 02B3 FF = highlighting by setting high bit 00 HIBCUR 0294 02B4 FF = show crsr by setting high bit 00 CRBLIV 0295 02B5 FF = WS blink crsr in iv, term or mmv 00 ZAFCIN 0296 02B6 fix for backspace on delete 00 00 RUBFXF 0298 02B8 FF = use RFIXER 00 RFIXER 0299 02B9 fix for backspace on delete 00 UCNSTA 029A 02BA jmp to user con stat routine 00 00 C9 UCONI 029D 02BD jmp to user con input routine 00 00 C9 UCONO 02A0 02C0 jmp to user con output routine 00 00 C9 SWIN 02A3 02C3 routine or jmp before char out to con 00 00 C9 00 00 00 SWOUT 02A9 02C9 routine or jmp after char out to con 00 00 C9 00 00 00 DEL1 02AF 02CF short delay - highlight crsr blink on 03 DEL2 02B0 02D0 short delay - highlight crsr blink off 09 DEL3 02B1 02D1 medium delay - time to prefix menus 19 DEL4 02B2 02D2 long delay - time for msg displays 40 DEL5 02B3 02D3 delay until screen redisplay/refresh 09 TRSCRS 02B4 02D4 for TRS-80 only 00 TRSCIF 02B5 02D5 for TRS-80 only 00 HETHBS 02B6 02D6 for Lifeboat CP/M - Heath 89 00 APLFLG 02B7 02D7 for Apple only 00 MPMFLG 02B8 MP/M flag 00 NMOFUS 02D8 number of users on system 01 TCKFLG 02DA for MP/M only 00 RSTFLG 02DB FF = no disk resets by WordStar 00 DEFDSK 02B9 02DC drive for OVR files after logged drive 01 SCRLSZ 02BA 02DD columns for horizontal scroll 14 CNVTBL 02BB ?? 00 00 00 00 00 . . . MORPAT 02CB 02E0 space for user-added routines CD 8A 02 C3 AB (with mysterious 12 bytes of code) 24 CD A0 3E C3 87 02 00 00 00 00 00 00 00 00 . . . PBGMEM 034B 035C pointer to beg of memory (i.e. text) 60 84 ITHELP 034D 0360 initial help level 03 NITHLF 034E 0361 00 = display spec msg if ITHELP 1 or 2 FF ITITOG 034F 0362 FF = insert mode on, 00 = off FF ITDSDR 0350 0363 FF = no-file dir on, 00 = off FF INITPF 0351 0366 initial page format: line height 1/48s 08 0352 0367 paper length (.pl) in lines (66) 42 0353 0368 paper length in 1/48s 10 02 0355 036A line height in 1/48s again 08 0356 036B margin at top (.mt) in lines 03 0357 036C margin at top in 1/48s 18 00 0359 036E line height again 08 035A 036F heading margin (.hm) in lines 02 035B 0370 heading margin in 1/48s 10 00 035D 0372 line height again 08 035E 0373 bottom margin (.mb) in lines 08 035F 0374 bottom margin in 1/48s 40 00 0361 0376 line height again 08 0362 0377 footing margin (.fm) in lines 02 0363 0378 footing margin in 1/48s 10 00 0365 037A line height again 08 0366 037B 00 for standard character width 00 0367 037C std char width in 1/120s 0C 0368 037D alt char width in 1/120s 0A 0369 037E page offset in characters 08 INITLM 036A 037F initial left margin less 1 00 INITRM 036B 0380 init right mar less 1, up to WID - 4 40 INITSR 036C 0381 initial sub/superscript roll in 1/48s 03 INITWF 036D 0385 word wrap (^OW), 00 = off, FF = on FF 036E 0386 justification (^OJ), 00 = off, FF = on FF 036F 0387 variable tabs (^OV), 00 = off, FF = on FF 0370 0388 soft hyphens (^OE), 00 = off, FF = on 00 0371 0389 hyphen help (^OH), 00 = off, FF = on FF 0372 038A show ctrl char (^OD), 00 = off, FF = on FF 0373 038B show ruler line, 00 = off, FF = on FF 0374 038C figure page breaks, 00 = off, FF = on FF 0375 038D show page breaks, 00 = off, FF = on FF 0376 038E line spacing 01 0377 038F (^KN) 00 = block move, FF = column 00 NONDOC 0378 0392 direct entry, 00 = doc, FF = nondoc 00 DOTSON 0379 0397 dot cmds during edit, 00 = disable FF DECCHR 037A 0393 decimal point character 2E DOTCHR 037B 0395 character to begin dot cmds 2E BLNCHR 0386 0396 non-break space char (^O) 0F CMTCHR 0387 comment char (;) 3B ENDEXP 0388 47 RVELIM 0389 03D8 MailMerge delimiter for data values 2C RVQUOT 038A 03D9 MM delimiter for enclosed values 22 00 TXBACK 038C 2F 42 VARCH1 038E 03DB MM delimiter to introduce variables 26 VARCH2 038F 03DC MM delimiter to terminate variables 26 VAROPC 0390 03DE char after name before option letters 2F 0391 03DF opt ltr for omit line if variable null 4F . . . COMPOP 0396 table of MM comparison operators 3C 3E 00 FD 3E . . . LOGICP 03B7 table of MM logical operators 2E 41 4E 44 2E . . . HZONE 03C9 039A hyphenation zone at end of line 04 03CA 039B pointer to non-consonant table D3 03 03CC 039D pointer to vowel table CE 03 VOWTAB 03CE 039F table of vowels 59 5B 5D 7B 7D NONCON 03D3 03A4 table of non-consonants 41 45 49 4F 55 00 00 00 00 00 BOFCHR 03DD 03AE beginning of file flag char 3A CONCHR 03DE 03AF line cont past screen edge flag char 2B EOFCHR 03DF 03AD end of file flag char 2E FDTCHR 03E0 03B5 merge-print command flag char 4D HARDCR 03E1 03B4 hard cr flag char 3C LFCHR 03E2 03B1 line ends in lf w/o cr flag char 4A OVPCHR 03E3 03B0 overprint line flag char 2D PAGCHR 03E4 03B2 end of page flag char 50 SOFTCR 03E5 03B3 soft cr flag char 20 SOFHYC 03E7 03B8 character used for soft hyphens AD PAGFIL 03E8 03B9 character used for page breaks 2D MARKS 03E9 03BA character used for start of blocks 42 03EA 03BB character used for end of blocks 4B 03EE 03BF characters (0-9) used for place markers 30 31 32 33 34 35 36 37 38 39 PODBLK 03F8 03CA disk file output, 00 = no, FF = yes 00 03F9 03CB use form feeds, 00 = no, FF = yes 00 03FA 03CC suppress page format, 00 = no, FF = yes 00 03FB 03CD pause between pages, 00 = no, FF = yes 00 NOUFF 03FC 03D1 FF = suppress form feed question above 00 ITPOPN 03FD 03D3 print page numbers, 00 = on, FF = off 00 ITMIJ 03FE 03D4 microjustification, FF = on, 00 = off FF ITBIP 03FF 03D5 bi-directional print, FF = on, 00 = off FF FNWSCM 0400 03E6 name of main WordStar program WS COM DSKTNA 040C 03F2 name of message file WSMSGS OVR FNOVLY 0418 03FE name of overlay file WSOVLY1 OVR FNMRGP 0424 040A name of merge-print overlay MAILMRGEOVR AUTOBS 0430 0422 table of auto-backspace characters 00 00 00 00 00 00 00 00 00 00 00 BSCHR 043B 042D char to use after autobs, usually ^H 08 NOFTAB 043C 0430 no-file command table 04 00 00 01 (each entry 4 bytes, first two are . cmd chars, next two are address of . routine) . VTAB 0489 0481 file editing command table 11 FF 12 00 (same format as NOFTAB) 0B FF 16 00 0F FF 1E 00 0A FF 22 00 0499 0491 set help level ^JH 0A 08 04 01 049D 0495 cursor left ^S . 04A1 0499 backspace ^H . 04A5 049D cursor right ^D . 04A9 04A1 cursor left ^A 04AD 04A5 cursor right word ^F 04B1 04A9 cursor down ^X 04B5 04AD cursor up ^E 04B9 04B1 cursor to left margin ^QS 04BD 04B5 cursor to end of line ^QD 04C1 04B9 cursor to bottom of screen ^QX 04C5 04BD cursor to top of screen ^QE 04C9 04C1 cursor to block begin ^QB 04CD 04C5 cursor to block end ^QK 04D1 04C9 cursor to previous position ^QP 04D5 04CD crsr to source of search, move ^QV 04D9 04D1 cursor to marker 0 ^Q0 04DD 04D5 " " " 1 ^Q1 04E1 04D9 " " " 2 ^Q2 04E5 04DD " " " 3 ^Q3 04E9 04E1 " " " 4 ^Q4 04ED 04E5 " " " 5 ^Q5 04F1 04E9 " " " 6 ^Q6 04F5 04ED " " " 7 ^Q7 04F9 04F1 " " " 8 ^Q8 04FD 04F5 " " " 9 ^Q9 0501 04F9 cursor to begin file ^QR 0505 04FD cursor to end file ^QC 0509 0501 find ^QF 050D 0505 find & replace ^QA 0511 0509 set left margin ^QL 0515 0511 scroll back continuously ^QW 0519 0515 scroll forward continuously ^QZ 051D 0539 delete to begin line ^Q 0521 053D " " " " ^Q_ 0525 0541 delete to end line ^QY 0529 0551 repeat nest command ^QQ 052D 050D repeat last ^QF or ^QA ^L 0531 0519 scroll forward one line ^Z 0535 051D scroll back one line ^W 0539 0521 scroll back one screen ^R 053D 0525 scroll forward one screen ^C 0541 0529 delete character left 0545 052D " " " ^_ 0549 0531 delete char under cursor ^G 054D 0535 delete line ^Y 0551 0545 delete word right ^T 0555 0549 toggle insert mode on/off ^V 0559 054D reformat to end paragraph ^B 055D 0555 insert line ^N 0561 0559 tab ^I 0565 055D carriage returnRN ^M 0569 0561 put nxt char in txt as ctrl char ^P 056D 0565 toggle display of marked block ^KH 0571 0569 mark/hide block begin ^KB 0575 056D mark/hide block end ^KK 0579 0571 set/hide marker 0 ^K0 057D 0575 " " 1 ^K1 0581 0579 " " 2 ^K2 0585 057D " " 3 ^K3 0589 0581 " " 4 ^K4 058D 0585 " " 5 ^K5 0591 0589 " " 6 ^K6 0595 058D " " 7 ^K7 0599 0591 " " 8 ^K8 059D 0595 " " 9 ^K9 05A1 0599 move block ^KV 05A5 059D copy block ^KC 05A9 05A1 delete block ^KY 05AD 05A5 toggle column mode on/off ^KN 05B1 05A9 ^KZ 05B5 05AD interrupt command in progress ^U 05B9 05B1 save file and exit ^KX 05BD 05B5 save file and return to menu ^KD 05C1 05B9 save file and continue ^KS 05C5 05BD abandon file and return to menu ^KQ 05C9 05C1 read file into text ^KR 05CD 05C5 write block to another file ^KW 05D1 05C9 delete file ^KJ 05D5 05CD toggle directory on/off ^KF 05D9 05D1 print file ^KP 05DD 05D5 change logged disk ^KL 05E1 05D9 copy file ^KO 05E5 05DD rename file ^KE 05E9 05E1 set left margin ^OL 05ED 05E5 set right margin ^OR 05F1 05E9 set tab ^OI 05F5 05ED clear tab ^ON 05F9 05F1 set mar/tabs frm new ruler line ^OF 05FD 05F5 toggle word wrap on/off ^OW 0601 05F9 " justification on/off ^OJ 0605 05FD " variable tab on/off ^OV 0609 0601 " dot cmd interp on/off ^OD 060D 0605 " ruler display on/off ^OT 0611 0609 " page break display on/off ^OP 0615 060D " soft hyphen on/off ^OE 0619 0611 " hyphen help on/off ^OH  061D 0615 paragraph tab ^OG 0621 0619 margin release ^OX 0625 061D center line ^OC 0629 0621 set line spacing ^OS 062D 0625 help for dot commands ^JD 0631 0629 " " status line ^JS 0635 062D " " flags ^JF 0639 0631 " " place markers ^JP 063D 0635 " " paragraph reform ^JB 0641 0639 " " tabs and margins ^JM 0645 063D command index ^JI 0649 0641 help for moving text ^JV . 064B 0645 " " ruler line ^JR . 0651 ^JA . XTAB 0655 0649 expansion space for edit cmd table 00 00 00 00 . . . FPTAB 067A 066E merge-print cmd table 10 00 28 43 (2 byte cmd char + 2 byte address) . . . 00 PNFTAB 068B 067F pointer to no-file cmd table 3C 04 PVTAB 068D 0681 pointer to edit cmd table 89 04 PFPTAB 068F 0683 pointer to merge-print table 7A 06 (following are spec chars used at prompts) CLCHR 0691 0686 cursor left char 13 CRCHR 0692 0687 cursor right char 04 LITCHR 0693 0688 prefix to take next char as literal 10 DIRCH 0694 0689 directory on/off 06 scroll dir up 1A scroll dir down 17 STPCHR 0697 068C must match interrupt char above 15 ERELCH 0698 068D error release char for interrupt 1B POSMTH 0699 0690 type of printer FF FF = teletype, no backspace 00 = teletype w/backspace 01 = daisywheel 03, 04 = special oem printers BLDSTR 069A 0691 number of strikes for boldface 03 DBLSTR 069B 0692 number of strikes for double-strike 02 (Next 8 labels active only if POSMTH = FF or 00) PSCRLF 069C 0696 string to do CR and LF 02 0D 0A 0D 0A 0A 00 00 00 00 00 PSCR 06A7 06A1 string to do CR only 02 0D 00 00 00 00 00 PSHALF 06AE 06A8 string to do CR and half-LF 00 0D 0A 00 00 00 00 PBACKS 06B5 06AF string to do backspace 00 08 00 00 00 00 PALT 06BB 06B5 string to set alt char width ^PA 00 1B 45 00 00 PSTD 06C0 06BA string to set std char width ^PN 00 1B 4E 00 00 ROLUP 06C5 06BF str to roll carr up part line ^PT 00 00 00 00 00 ROLDOW 06CA 06C4 str to roll carr down part line ^PV 00 00 00 00 00 USR1 06CF 06C9 string for user function 1 ^PQ 00 00 00 00 00 USR2 06D4 06CE " " " " 2 ^PW 00 00 00 00 00 USR3 06D9 06D3 " " " " 3 ^PE 00 00 00 00 00 USR4 06DE 06D8 " " " " 4 ^PR 00 00 00 00 00 RIBBON 06E3 06DD string to set alt ribbon color ^PY 00 00 00 00 00 RIBOFF 06E8 06E2 string to set std ribbon color ^PY 00 00 00 00 00 PSINIT 06ED 06E7 string to initialize printer 01 0D 54 31 32 00 00 00 00 00 00 00 00 00 00 00 00 PSFINI 06FE 06F8 string to uninitialize printer 00 1B 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 SOCHR 070F 070B character for strikeout 2D ULCHR 0710 070C character for underline 5F PRINIT 0711 070D jmp to user printer init routine 00 00 C9 PRFINI 0714 0710 jmp to user printer uninit routine 00 00 C9 CSWTCH 0717 0717 switch to select printer driver 00 (00 = primary list device) (01 = WordStar's port driver) (02 = user printer driver) (03 = oem driver) (04 = alternate console driver) HAVBSY 0718 0718 have printer busy rtn? FF = yes 00 (If CSWTCH = 00, next 3 active) LIBSY 0719 071A jmp to user busy test routine 00 B7 C9 LISEND 071C 071D routine send character to list device 5F 0E 05 CD 05 00 B7 C9 LISINP 0724 0725 jmp to user char input rtn 00 37 C9 (if using XON/XOFF or ETX/ACK) (If CSWTCH = 01, next 11 active) POBSY 0727 0728 port driver output status entry DB POSTAT 0728 0729 output status port address 05 00 E6 POMASK 072B 072C bit mask for transmit ready 01 EE POOM 072D 072E bits that change 01 37 C0 B7 C9 POSEND 0732 0733 port driver send char entry D3 POOP 0733 0734 output data port address 04 00 C9 POINP 0736 0737 port driver input status entry DB PISTAT 0737 0738 input status port address 05 00 E6 POINSK 073A 073B bit mask for receive ready 02 EE POIM 073C 073D bits that change 02 37 C0 DB POIP 0740 0741 input data port address 04 00 B7 C9 (If CSWTCH = 02, next 3 active) PUBSY 0744 074C jmp to user printer busy test routine 00 B7 C9 PUSEND 0747 074F jmp to user char output routine 00 00 C9 PUINP 074A 0752 jmp to user char input routine 00 37 C9 (If CSWTCH = 04, next 7 active) ACBSY 074D 0758 jmp to user alt con busy test 00 B7 C9 ACSEND 0750 075B send char to alt con CD 6C 07 CD F0 20 C3 63 07 ACINP 0759 0764 input char from alt con CD 6C 07 CD 55 1D C4 6C 1D 57 ACFIN 0763 076E exit routine start 78 ACSTA1 076F 076F set/reset iobyte 32 03 00 7A B7 C0 37 C9 ACSTAR 076C 0777 entry routine start 57 3A 03 00 47 E6 FC F6 CONFIE 0774 077F alt con device assignment 01 (00 = TTY:, 01 = CRT:) . . . PROTCL 0778 0786 printer protocol type 00 (00 = none) (01 = ETX/ACK) (02 = XON/XOFF) EAKBSZ 0779 0787 ETX/ACK msg buffer size 7F (Most of the following are for daisywheels only) DVMILE 077A 0790 vertical motion index leadin string 00 1B 1E 00 00 DVMITR 077F ?? 00 1B 02 00 00 DVMMIN 0784 0795 ?? FF FF DVMRNG 0786 0797 ?? FF FF DHMILE 0788 0779 horizontal motion index leadin string 00 1B 1F 00 00 DHMIFG 078D 079E ?? 00 DHMIN 078E 079F ?? FF FF DHRNG 0790 07A1 ?? FF FF DFWD 0792 07A3 string to set forward print 00 1B 35 00 00 DBAK 0797 07A8 string to set backward print 00 1B 36 00 00 DSP 079C 07AD forward space 00 20 00 00 00 DBS 07A1 07B2 backward space 00 08 00 00 00 DLF 07A6 07B7 line feed vmi 00 0A 00 00 00 DRLF 07AB 07BC reverse line feed 00 1B 0A 00 00 DPHSPC 07B0 07C1 print phantom space 00 1B 59 00 DPHRUB 07B4 07C5 print phantom rubout 00 1B 5A 00 DNPROS 07B8 07D3 suppress proportional spacing 00 (00 = on, FF = off) DMJWB 07B9 07D5 use alt microjustification algorithm 00 (00 = no, FF = yes) PSTAB 07BA 07D8 proportional spacing table . (righthand digit of each byte is . the one involved in the totally . unsupported proportional spacing command ^P^P) 083A 083A END OF USER PATCHING AREA  FF FF DHMILE 0788 0779 horizontal motion index leadin string 00 1B 1F 00 00 DHMIFG 078D 079E ?? 00 DHMIN 078E 079F ?? FF FF DHRNG 0790 07A1 ?? FF FF DFWD 0792 07A3 string to set forward print 00 1B 35 00 00 DBAK 0797 07A8 string to set backward print 00 1B 36 00 00 DSP 079C 07AD forward space 00 20 00 00 00 DBS 07A1 07B2 backward space 00 08 00 00 00 DLF 07A6 07B7 line feed vmi 00 0A 00 00 00 DRLF 07AB 07BC reverse line feed 00 1B 0A 00 00 DPHSPC 07B0 07C1 print phantom space 00 1B 59 00 DPHRUB 07B4 07C5 print phantom rubout 00 1B 5A 00 DNPROS 07B8 07D3 suppress proportional spacing 00 (00 = on, FF = off) DMJWB 07B9 07D5 use alt microjustification algorithm 00 (00 = no, FF = yes) PSTAB 07BA 07D8 pWSBIBLE.DOC ..WSBIBLE.DOC RULER #1 (Put cursor on line and hit ^OF to create new ruler) ---------------------------------------------------------------------------- The "Bible" on WordStar(r) Patching (ver 2.26, 3.0 & 3.3) A. F. REMICH Thi fil i listin o al th know W (v3.0 label an patc addresse tha hav bee abl t verify I yo kno o an no liste here pleas contac m s tha thi lis ca b update fo th benefi o all (Speakin hi WSCUSTOM.COM whic i include an update i thi WSBIBLE.DOC) Milton HICKS (Updated by Guy Gamble 222 Pacific Avenue address unknown) Long Beach, CA 90802 Evenings: (213) 924-6429 [...transformed into WSCUSTOM.DOC]: Cleane up squeezed W v3. item adde an collate wit othe WSPATCH fro Tamp Ba U.G. an fro th end o WS.IN (fo 3.3 and INSTALL.COM (v 3.0) by: Th. R. Hofmann Other contributors: University of Toyama Bob Bloom Gofuku, Toyama, JAPAN 930 bbloom@BRL (TECOM) [...now called WSBIBLE.DOC, more in desperation than boastfulness]: New WS.COM v3.0 and v3.3 items were added and some old items corrected, the W.COM v2.2 item and WSMSGS.OVR menu patching info were also added. I crossreference everythin with 1 note fro WSPATCH b G Dah an Mik Schwab 2 numerou article fro th bes CP/M user group magazine FOGHORN, 3) a fantastic artlcle (and WS3330.DOC) by Ted Silveira in Jul/Aug 85 issue of PROFILES, and 4) great article on patching WS.COM b Richar Drakefor i Issu #1 o USER' GUID (yo d subscrib t thi great pub don't you?). I also added tips collected in my notebook over the past year. WordStar' patc location fo printe contro sequence ar labele ROLUP ROLDOW USER1 USER2 USER3 USER4 RIBBON RIBOF an ar invoked by ^PT ^PV ^PQ ^PW ^PE ^PR ^P an ^PY respectively The name an their description i the manual onl sugges som possibl uses s don' fee constrained The onl ti comman entere on the keyboar t sequenc i th W tex fil tha wil b eventuall sen t th printe t caus prin operatio - no just printe character Incidentally i yo nee mor spac fo give printe contro sequence "steal spac fro th followin use are (but you'll loos furthe us o tha comman an use area (e.g a long string in USR [^PE] ca exten int USR4). muc faste versio o WordSta ca b mad o system whic suppor inser an delet lin (NO th sam a eras line delet erase lin an the scroll u th followin line o th screen) Also lowerin th dela value (o eliminatin the entirel whe possible wil als spee u scree updat tim an improv keyboar response Yo ca eve eliminat th W log an "legalese o th start-up( bu keep the SN # and version ID information - next page). So, xperiment with the fixes and delays you want. novic shoul no fee thi i al beyon him Mak ne dis wit WS.CO v3.3 WS.IN an WINSTALL.CO (o INSTALL.CO fo WS.CO v2.26) Loa WINSTALL cal u W an an tel i t sav th modifie versio a WSNEW Afte yo hav mad al change possibl fro th mai installatio men an sub-menu, an befor exitin fro th mai menu ente " (instea o choice (A/B/C/D/E/F/X to ente th "Twiligh Zone o Wordsta patching. (In WS.CO v2.2, answe N t th las questio: "Ar all modification completed?") Eithe th label o he addresse ca b entered to get to the spot you want (Note i W.COM v3. th labe mus b PRECEDE b ":"(n spac - :HITE) and i W.COM v2.6 th labe mus b FOLLOWE b ":"(n spac - HITE: Al number ar hex bu th "h i 6F i NO entered. No tes, an TES som more Later i yo wan t renam WSNEW.COM yo mus us WINSTALL.CO (o INSTALL.COM).  You will also be introduced to very useful technique of "auto-patching" that should make whole process easier, faster and comparitively effortless to repeat when the only working copy of your customized WS.COM dies on you. Look for a copy of WSAUTPAT.ASM to make to whole matter clearer and easier. ON SPECIA CAUTIO abou usin som o th label shown Label show wit numeri suffi (suc a INITPF+4 INITPF+C PODBLK+3 ar ONL useabl fo "hand patchin WS.CO wit WINSTALL.CO (o INSTALL.COM) The CANNO use i ASM.CO an th "autopatching techniqu presente a th en an als i WSAUTPAT.ASM Label ar no necessar anyway jus convenience Simpl omi the an charg on Thi i wher th fu begins. But first,here is my favorite fix ..... Yo sa yo wan t ge ri o WordStar's lengthy log an licens agreemen that litters WS.COM v3.30 sign-on (an stil be able see th ID infrmation during start-up? Because patch points for these fixes cannot be reached with WINSTALL.COM, you will need to use use DDT.COM or DU.COM to: 1. Change the data bit at 3CF4 to 00H (to remove the logo). 2. Change the data bit at 3F1D to 00H (to remove the legalese). 3. Exit DDT.COM and enter: SAV 6 WSNEW.COM. .........have fun with WordStar(r) !!! Tony Remich 711 Shepard Court Gurnee IL 60031 [ ] ....... standard WS char < My comments > xx or 00 .... number in hex (00/00 is a big number or open space) * ........... conflict in label and address - use the address (probably due to label name changes by WS) #xx/ or ## .. filled or unfilled) leading data byte (DB) in a string which tells how many bytes of data follow ..WSBIBLE.DOC RULER #2 (Put cursor on line and hit ^OF to create new ruler) ..------!---!---!----!----------------------------------!---!--------------- WS.COM PATCH POINTS accessible by WINSTALL.COM (or INSTALL.COM) [must be between 100h and 83Ah] (presente i v3. numeri orde wit '8 Kaypr standar value shown) LOCATION version WS LABEL 2.26 3.0 3.3 OPERATION CTRL SETTINGS ----- ---- --- --- ------------- ---- -------- 100 100 100 CHARACTER INPUT ROUTINE C3 FC 2C C3 F0 2C OUTCHR 106 106 106 CHARACTER OUTPUT ROUTINE C3 CD 20 C3 09 2D PATVER 10C 10C 10C 00 00 (varies) MSGVER 10E 10E 10E 00 00 " WSVER 110 110 110 00 00 " COPRIT 117 117 112 COPYRIGHT NOTICE 00 Copyright ... SIGNON 153 153 14E WS INFO 00 MicroPro ... 174 174 16F SERIAL NUMBER 00 Serial # ... IDTEX 18F 18F 18A TERMINAL ID TEXT 00 Kaypro ... PIDTEX *1B3 1B3 1AE PRINTER ID TEXT 00 Standard ... PROTTX 1D7 1D7 1D2 PRINTER PROTOCOL TEXT 00 No commun ... PDRVTX 1FB 1FB 1FC PORT DRIVER TEXT 00 CP/M List ... 220 220 21B FLAGS AND HOLDERS FOR USE BY WORDSTAR 00/00 HITE 248 248 232 SCREEN HEIGHT (24 lines) 18 WID 249 249 233 SCREEN WIDTH (80 columns) 50 CLEAD1 24A 24A 234 CURSOR POS - LEAD-IN STR #02/1B 3D 00 00 00 00 00 00 CLEAD2 253 253 23D " " - STR BETWEEN COL/LINE ## 00 00 00 00 CTRAIL 258 258 242 " " - TRAILING STR ## 00 00 00 00 CB4LFG 25D 25D 247 " " FLAG (00=LN/COL; FF=COL/LN) 00 LINOFF 25E 25E 248 " " - LINE OFFSET 20 COLOFF 25F 25F 249 " " - COLUMN OFFSET  20 ASCUR 260 260 24A " " DATA (00=BINARY, 02=DIGIT) 00 261 261 n/a 00 00 00 UCRPOS 264 264 24B " " - JMP TO USER CURSOR RTN 00 00 C9 267 267 24E " " - ADDRESS OF BYTE OUTPUT 00 00 267 269 n/a 00/00 ERAEOL 26D 26D 250 ERASE TO END OF LINE ^QY#01/18 00 00 00 00 00 LINDEL 274 274 257 DELETE LINE ^Y ## 00 00 00 00 LININS 27B 27B 25E INSERT LINE ^N ## 00 00 00 00 IVON 284 284 267 TURN ON HIGHLIGHTING (INVSERSE VIDEO,#06/1B 42 30 1B HALF INTENSITY, AND/OR UNDERLINING) 42 31 IVOFF 28B 28B 26E TURN OFF HIGHLIGHTING #05/1B 43 30 1B TRMINI 292 292 275 TERMINAL INITIALIZATION STRING #01/1A 00 00 00 00 00 00 00 TRMUNI 29B 29B 27E TERMINAL UNINITIALIZATION STRING ## 00 00 00 00 INISUB 2A4 2A4 287 NOP or JMP TO USER TERM INIT SUB 00 00 C9 UNISUB 2A7 2A7 28A NOP or JMP TO USER TERM UNINIT SUB 00 00 C9 USELST 2AA 2AA 28D FF = CAN USE LAST LINE ON CRT FLAG  00 DELCUS 2AE 2AE 28E DEL IN CURSOR ADDRESSING 00 to 0F msec 0A DELMIS 2AF 2AF 28F DEL IN OTHER MISC FUNCT, 00 to 0F msec 05 MEMAPV 2B0 2B0 290 FF = MEMORY-MAPPED DISPLAY TERMINAL 00 MEMADR 2B1 2B1 291 ADDRESS OF CURSOR HOME POS ON MM VIDEO 00 00 HIBIV 2B3 2B3 293 FF = HI LITE/INV VIDEO BY HI ORDER BIT 00 HIBCUR 2B4 2B4 294 FF = DISPLAY CURSOR BY HI ORDER BIT 00 CRBLIV 2B5 2B5 295 FF = BLINK CURSOR ON MM VIDEO 00 ZAFCIN 2B6 2B6 296 FIX FOR BACKSPACE ON DELETE 00 00 RUBFXF 2B8 2B8 298 FF = USE RFIXER 00 RFIXER 2B9 2B9 299 FIX FOR BACKSPACE ON DELETE 00 UCNSTA 2BA 2BA 29A NOP OR JMP TO USER CONSOLE STAT RTN 00 00 C9 UCONI 2BD 2BD 29A " " " " " INPUT " 00 00 C9 UCONO 2C0 2C0 2A0 " " " " " OUTPUT " 00 00 C9 SWIN 2C3 2C3 2A3 JMP OR RTN BEFORE CHAR SENT TO CONS 00 00 C9 2C6 2C6 2A6 00 00 00 SWOUT 2C9 2C9 2A9 " " " AFTER " " " " 00 00 C9 2CC 2CC 2AC 00 00 00 DEL1 2CF 2CF 2AF SHORT DEL - CURSOR BLINK (ON) 03 DEL2 2D0 2D0 2B0 MED-SHORT DEL- CURSOR BLINK (OFF) 09 DEL3 2D1 2D1 2B1 MED-LONG DEL - TIME TIL SUB-MENUS SHOW 19 DEL4 2D2 2D2 2B2 LONG DEL - MESSAGES AND SIGN-ONS 40 DEL5 n/a 2D3 2B3 DEL- SCREEN REDISPLAY/REFRESH 09 TRSCRS 2D3 2D4 2B4 For TRS-80 ONLY 00 TRSCIF 2D4 2D5 2B5 For TRS-80 ONLY  00 HETHBS n/a 2D6 2B6 For LIFEBOAT CP/M FOR HEATH-89 00 APLFLG n/a 2D7 2B7 For APPLE ONLY 00 MPMFLG *2D5 n/a 2B8 MP/M FLAG 00 NMOFUS *2D6 2D8 n/a NUMBER OF USERS ON SYSTEM 01 TCKFLG n/a 2DA n/a FOR MP/M ONLY 00 RSTFLG n/a 2DB n/a 00 = NO DISK RESETS BY WS 00 DEFDSK *2D7 2DC 2B9 FIND.OVR FILES ON DRV (AFT DEFALT DRV) 01 SCRLSZ n/a 2DD 2BA HORIZONTAL SCROLL (20 column) 14 CNVTBL n/a n/a 2BB 00 2D8 2DE 2BC 00/00 MORPAT 2E0 2E0 2CB USER MORE PATCH AREA (128 BYTES AVAIL) 00/00 (varies) INITIAL Edit Set-up Default ----------------------  --------- PBGMEM 35C 35C 34B POINTER TO BEGINNING OF MEMORY (TEXT) 6D 84 ITHELP 360 360 34D HELP LEVEL ^JH 03 NITHLF 361 361 34E MAX HLP MSG IF ITHELP 1 OR 2 FF (FF = on) ITITOG 362 362 34F INSERT MODE ^V FF ITDSDR 363 363 350 FILE DIRECTORY DISPLAY ^KF FF 364 364 n/a 00 00 INITIAL Page Format Default ------------------------ ---------- INITPF 366 366 351 LINE HEIGHT, 1/48'S .LH 08 +1 367 367 352 PAPER LENGTH (66 lines) .PL 42 +2 368 368 353 PAPER LENGTH IN 1/48'S (.LH *.PL) 10 +3 369 369 354 second byte - PAPER LENGTH 02 +4 36A 36A 355 LINE HEIGHT AGAIN .LH 08 +5 36B 36B 356 MARGIN AT TOP (lines) .MT 03 +6 36C 36C 357 MARGIN AT TOP IN 1/48'S (.LH *.MT) 18 +7 369 369 354 second byte - MARGIN AT TOP 00 +8 36E 36E 359 LINE HEIGHT AGAIN .LH 08 +9 36F 36F 35A HEADING MARGIN (lines) .HM 02 +A 370 370 35B HEADING MARGIN IN 1/48'S(.LH *.HM) 10 +B 369 369 35C second byte - HEADING MARGIN 00 +C 372 372 35D LINE HEIGHT AGAIN .LH 08 +D 373 373 35E BOTTOM MARGIN (lines) .BM 08 +E 374 374 35F BOTTOM MARGIN IN 1/48'S (.LH *.BM) 40 +F 375 375 360 second byte - BOTTOM MARGIN 00 +10 376 376 361 LINE HEIGHT AGAIN .LH 08 +11 377 377 362 FOOTING MARGIN (lines) .FM 02 +12 378 378 363 FOOTING MARGIN IN 1/48'S(.LH *.FM) 10 +13 379 379 364 second byte - FOOTING MARGIN 00 +14 37A 37A 365 LINE HEIGHT AGAIN .LH 08 +15 37B 37B 366 00 = STANDARD CHAR WIDTH 00 +16 37C 37C 367 STD CHAR WIDTH IN 1/120'S ^N 0C +17 37D 37D 368 ALT CHAR WIDTH IN 1/120'S ^A 0A +18 37E 37E 369 PAGE OFFSET IN CHARS .PO 08 INITLM 37F 37F 36A LEFT MARGIN (00 = COL 1 on CRT) ^OL 00 INITRM 380 380 36B RIGHT MARGIN (LESS 1, UP TO WID-4) ^OR 40 INITSR 381 381 36C SUB/SUPER SCRIPT ROLL IN 1/48'S .SR 03 382 382 n/a 00 00 00 INITIAL Edit Set-up Default --------------------- --------- INITWF 385 385 36D WORD WRAP TOGGLE ^OW FF (FF=on) +1 386 386 36E JUSTIFY " ^OJ FF +2 387 387 36F VARIABLE TABS " ^OV FF +3 388 388 370 SOFT HYPHEN " ^OE 00 +4 389 389 371 HYPEN-HELP " ^OH FF +5 38A 38A 372 CTRL CHARS & SFT HYPN DISP " ^OD FF +6 38B 38B 373 RULER LINE DISPLAY " ^OT FF +7 38C 38C 374 PAGE BREAK DETERMINATION " FF +8 38D 38D 375 PAGE BREAK DISPLAY " ^OP FF +9 38E 38E 376 LINE SPACING ^OS 01 +A 38F 38F 377 FF = COL MODE; 00 = BLK MODE ^KN 00 +B 390 390 n/a 00 00 NONDOC 391 392 378 DIRECT ENTRY 00=DOC/ FF=NON-DOC 00 DOTSON 396 397 379 ENABLE DOT COMMANDS (00=DISABLE) FF DECCHR 392 393 37A DECIMAL POINT CHARACTER [.] 2E 393 394 n/a 00 DOTCHR 394 395 37B CHAR TO BEGIN DOT COMMANDS [.] 2E 37C [B] 42 37D " [U] 55 37E " [G] 47 37F " [N] 4E 380 " [W] 57 381 " [B] 42 382 " [D] 44 383 MM CONDITIONAL CHAR [IF] 46 49 385 [S] 53 BLNCHR 395 396 386 NON-BREAK SPACE CHAR ^O 0F 397 398 n/a 00/00 CMTCHR n/a n/a 387 COMMENT CHAR [;] 3B ENDEXP n/a n/a 388 MM CHAR FOR GOTO CMD [G] 47 RVELIM 3D8 3D8 389 MM " " DATA DELIMITER [,] 2C RVQUOT 3D9 3D9 38A MM " TO DELIMIT ENCLOSED VALUES ["] 22 3DA 38B 00 TXBACK n/a 38C " [/] 2F n/a 38D " [B] 42 VARCH1 3DB 3DB 38E MM " " START KEYWORD [&] 26 VARCH2 3DC 3DC 38F MM " " END " [&] 26 3DD 3DD n/a MM " " OMIT BLANK LINES [*] 2A VAROPC 3DE 3DE 390 MM " " SEP VAR NAM & OMIT CHAR [/] 2F 3DF 3DF 391 MM " " OMIT LINE IF VAR IS NUL [O] 4F n/a n/a 392 ADDRESS OF MM COMPARISON OPERATORS 96 03 n/a n/a 394 " " MM LOGICAL " B7 03 COMPOP n/a n/a 396 MM COMPARISON OPERATORS 3C 3E 00 FD <>..><..<=..=<..>=..=>..<..>..=.. 3E 3C 00 FD 3C 3D 00 FC  3D 3C 00 FC 3E 3D 00 FB 3D 3E 00 FB 3C 00 FA 3E 00 F9 3D 00 FE LOGICP n/a n/a 3B7 MM LOGICAL OPERATORS 2E 41 4E 44 2E .AND./TRUE/FALSE/.OR 0 F 2 4 52 2E 00 FE 00 00 00 00 HZONE 399 39A 3C9 HYPHENATION ZONE (letters overhang) 04 39A 39B 3CA ADDRESS OF VOWEL TABLE D3 03 39C 39D 3CC ADDRESS OF NOT-CONSONANT TABLE CE 03 VOWTAB *39E 39F 3CE TABLE OF VOWELS 59 5B 5D 7B 7D Y,[,],{,} NONCON *3A3 3A4 3D3 TABLE OF NON-CONSONANT LETTERS 41 45 49 4F 55 A,E,I,O,U 00 00 00 00 Screen Right Line-end Flags ----------------------------- BOFCHR 3AD 3AE 3DD BEFORE START OF WS FILE FLAG [:] 3A CONCHR 3AE 3AF 3DE LINE CONTINUES BEYOND " [+] 2B EOFCHR 3AC 3AD 3DF AFTER END OF WS FILE " [.] 2E FDTCHR 3B4 3B5 3E0 LINE HAS MAILGERGE COMMAND " [M] 4D HARDCR 3B3 3B4 3E1 HARD CARRAIGE RETURN " [<] 3C LFCHR 3B0 3B1 3E2 LINE ENDS IN LF W/O CR " [J] 4A OVPCHR 3AF 3B0 3E3 NEXT LINE OVERPRINTS THIS LN" [-] 2D PAGCHR 3B1 3B2 3E4 PAGE BREAK (goes with -----)" [P] 50 SOFTCR 3B2 3B3 3E5 END OF LIN W/WRDWRP,SOFT CR " [ ] 20 n/a n/a 3E6 [I] 49 3B5 3B6 n/a 00 00 Other Characters ------------------ SOFHYC 3B7 3B8 3E7 SOFT HYPHEN CHAR [-] AD PAGFIL 3B8 3B9 3E8 PAGE BREAK CHAR [-] 2D MARKS 3B9 3BA 3E9 START OF BLOCK CHAR 42 3BA 3BB 3EA END OF BLOCK CHAR 4B 3BB 3BC 3EB 00 00 00 3BE 3BF 3EE PLACE MARKERS <1>,<2>,etc 30 31 32 33 34 35 36 37 38 39 00 Printing Defaults 00 = No; FF = Yes ------------------- ------------------ PODBLK 3CA 3CA 3F8 PRINT OUTPUT TO A DISK FILE 00 +1 3CB 3CB 3F9 USE FORMFEED AT TOF & END OF EACH PAGE 00 +2 3CC 3CC 3FA SUPPRESS PAGE FORMATTING 00 +3 3CD 3CD 3FB PAUSE BETWEEN PAGES 00 3CE 3CE n/a  00 00 00 NOUFF 3D1 3D1 3FC FF = SUPPRESS FORMFEED QUESTION ABOVE 00 3D2 3D2 n/a 00 ITPOPN 3D3 3D3 3FD OMIT PAGE NUMBERS (00 = PRINTS THEM) 00 ITMIJ 3D4 3D4 3FE MICROJUSTIFICATION FF ITBIP 3D5 3D5 3FF BI-DIRECTIONAL PRINT FF 3D6 3D6 n/a 00/00 FNWSCM 3E7 3E7 400 FILENAME OF WORDSTAR PROGAM [00 WS COM] DSKTNA 3F3 3F3 40C " " MESSAGES [00 WSMSGS OVR] FNOVLY 3FE 3FE 418 " " OVERLAYS [00 WSOVLY1 OVR] FNMRGP 40A 40A 424 " MERGEPRINT/MAILMERGE [00 MAILMRGEOVR] AUTOBS 422 422 430 AUTO BACKSPACE TABLE 00 00 00 00 00 BSCHR 42D 42D 43B BACKSPACE CHARACTER ^H 08 NOFTAB - No file Command Table ------------------------------------ NOFTAB 430 430 43C ^D 04 00 00 01 434 440 " ^N 0E 02 02 01 438 444 " ^H 08 00 04 01 43C 448 " ^X 18 00 2D 2D 440 44C " ^J 10 00 06 01 444 450 " ^M 0D 00 08 01 448 454 " ^Y 19 00 0A 01 44C 458 " ^F 06 00 80 29 450 45C "  ^Z 1A 00 C1 29 454 460 " ^W 17 00 C1 29 458 464 " ^L 0C 00 16 01 45C 468 " ^R 12 00 0C 01 460 46C " ^O 0F 00 12 01 464 470 " ^E 05 00 14 01 468 474 " ^V 16 00 9A 30 n/a 478 " ^S 13 00 0E 01 46C 47C " 00 00 00 00 470 480 " 00 00 00 00 474 484 " 00 00 00 00 478 n/a " 00 00 00 00 46C 484 EOF 00 VTAB - Various Tables --------------------------  VTAB 47D 489 QUICK MENU ^Q 11 FF xx/xx 481 48D BLOCK " ^K 0B FF xx/xx 485 491 ONSCREEN " ^O 0F FF xx/xx 489 495 HELP " ^J OA FF xx/xx 48D 491 499 SET HELP LEVEL ^JH 0A 08 xx/xx 491 495 49D MOVE CURSOR TO LEFT ^S 13 00 xx/xx 495 499 4A1 BACKSPACE ^H 08 00 xx/xx 499 49D 4A5 CURSOR TO RIGHT ^D 04 00 xx/xx 49D 4A1 4A9 " LEFT WORD ^A 01 00 xx/xx 4A1 4A5 4AD " RIGHT WORD ^F 06 00 xx/xx 4A5 4A9 4B1 " NEXT LINE ^X 18 00 xx/xx 4A9 4AD 4B5 " ABOVE LINE ^E 05 00 xx/xx 4AD 4B1 4B9 " LEFT MARGIN ^QS 11 13 xx/xx 4B1 4B5 4BD " RIGHT END OF LINE ^QD 11 04 xx/xx 4B5 4B9 4C1 " BOTTOM OF SCREEN ^QX 11 18 xx/xx 4B9 4BD 4C5 " HOME (TOP LFT OF SCRN) ^QE 11 05 xx/xx 4BD 4C1 4C9 " START OF BLOCK SCREEN ^QB 11 42 xx/xx 4C1 4C5 4CD " END OF BLOCK ^QK 11 4B xx/xx 4C5 4C9 4D1 " PLACE BEFORE LAST CMD ^QP 11 50 xx/xx 4C9 4CD 4D5 " SOURCE OF MOVE, ETC. ^QV 11 56 xx/xx 4CD 4D1 4D9 " MARKER 0 ^Q0 11 30 xx/xx 4D1 4D5 4DD " " 1 ^Q1 11 31 xx/xx 4D5 4D9 4E1 " " 2 ^Q2 11 32 xx/xx 4D9 4DD 4E5 " " 3 ^Q3 11 33 xx/xx 4DD 4E1 4E9 " " 4 ^Q4 11 34 xx/xx 4E1 4E5 4ED " " 5 ^Q5 11 35 xx/xx 4E5 4E9 4F1 " " 6 ^Q6 11 36 xx/xx 4E9 4ED 4F5 " " 7 ^Q7 11 37 xx/xx 4ED 4F1 4F9 " " 8 ^Q8 11 38 xx/xx 4F1 4F5 4FD " " 9 ^Q9 11 39 xx/xx 4F5 4F9 501 " TOP OF FILE ^QR 11 12 xx/xx 4F9 4FD 505 " END OF FILE ^QC 11 03 xx/xx 4FD 501 509 FIND  ^QF 11 06 xx/xx 501 505 50D FIND & REPLACE ^QA 11 01 xx/xx n/a 509 511 FIND MARKED SPELLING ^QL 11 0C xx/xx 509 511 515 SCROLL DOWN CONTINUOUSLY ^QW 11 17 xx/xx 50D 515 519 " UP " ^QZ 11 1A xx/xx 531 539 51D DELETE TO BEGINNING OF LINE ^Qdel 11 7F xx/xx 535 53D 521 " " " " " ^Q_ 11 1F xx/xx 539 541 525 " TO RIGHT END OF LINE ^QY 11 19 xx/xx 549 551 529 REPEAT NEXT COMMAND ^QQ 11 11 xx/xx 505 50D 52D " LAST " ^L 0C 00 xx/xx 511 519 531 SCROLL DOWN 1 LINE ^Z 1A 00 xx/xx 515 51D 535 " UP 1 " ^W 17 00 xx/xx 519 521 539 " DOWN 1 SCREEN ^R 12 00 xx/xx 51D 525 53D " UP 1 " ^C 03 00 xx/xx 521 529 541 DELETE CHARACTER LEFT DEL 7F 00 xx/xx 525 52D 545 " " " ^_ 1F 00 xx/xx 529 531 549 " " UNDER CURSOR  ^G 07 00 xx/xx 52D 535 54D " LINE ^Y 19 00 xx/xx 53D 545 551 " WORD TO RIGHT ^T 14 00 xx/xx 541 549 555 INSERT MODE ON/OFF ^V 16 00 xx/xx 545 54D 559 REFORMAT TO END OF PARAGRAPH ^B 02 00 xx/xx 54D 555 55D INSERT LINE ^N 0E 00 xx/xx 551 559 561 TAB ^I 09 00 xx/xx 555 55D 565 CARRIAGE RETURN ^M 0D 00 xx/xx 559 561 569 INSERT PRINT CTRL CHAR ^P 10 00 xx/xx 55D 565 56D HIDE/DISPLAY MARKED BLOCK ^KH 0B 08 xx/xx 561 569 571 MARK BLOCK BEGINNING ^KB 0B 42 xx/xx 565 56D 575 " " END ^KK 0B 4B xx/xx 569 571 579 SET/HIDE MARKER 0 ^K0 0B 30 xx/xx 56D 575 57D " " " 1 ^K1 0B 31 xx/xx 571 579 581 " " " 2 ^K2 0B 32 xx/xx 575 57D 585 " " " 3 ^K3 0B 33 xx/xx 779 581 589 " " " 4  ^K4 0B 34 xx/xx 57D 585 58D " " " 5 ^K5 0B 35 xx/xx 581 589 591 " " " 6 ^K6 0B 36 xx/xx 585 58D 595 " " " 7 ^K7 0B 37 xx/xx 589 591 599 " " " 8 ^K8 0B 38 xx/xx 58D 595 59D " " " 9 ^K9 0B 39 xx/xx n/a 599 n/a 591 59D 5A1 MOVE A BLOCK TO HERE ^KV 0B 16 xx/xx 595 5A1 5A5 COPY " " " ^KC 0B 03 xx/xx 599 5A5 5A9 DELETE " ^KY 0B 19 xx/xx n/a n/a 5AD BLOCK/COLUMN MODE TOGGLE ^KN 0B 0E xx/xx 59D 5A9 5B1 ^KZ 0B 1A xx/xx 5A1 5AD 5B5 INTERRUPT COMMAND IN PROGRESS ^U 15 00 xx/xx 5A5 5B1 5B9 SAVE & EXIT WS ^KX 0B 18 xx/xx 5A9 5B5 5BD " & QUIT EDIT ^KD 0B 04 xx/xx 5AD 5B9 5C1 " & CONTINUE EDIT ^KS 0B 13 xx/xx 5B1 5BD 5C5 QUIT - NO SAVE ^KQ 0B 11 xx/xx 5B5 5C1 5C9 READ FILE FROM DISK TO HERE ^KR 0B 12 xx/xx 5B9 5C5 5CD WRITE MARKED BLOCK ONTO DISK FILE ^KW 0B 17 xx/xx 5BD 5C9 5D1 DELETE FILE ON DISK ^KJ 0B 0A xx/xx 5C1 5CD 5D5 FILE DIRECTORY ON/OFF ^KF 0B 06 xx/xx 5C5 5D1 5D9 PRINT FILE FROM DISK ^KP 0B 10 xx/xx 5C9 5D5 5DD CHANGED LOGGED DISK DRIVE ^KL 0B 0C xx/xx 5CD 5D9 5E1 COPY FILE ^KO 0B 0F xx/xx 5D1 5DD 5E5 RENAME FILE ^KE 0B 05 xx/xx 5D5 5E1 5E9 SET LEFT MARGIN ^OL 0F 0C xx/xx 5D9 5E5 5ED " RIGHT " ^OR 0F 12 xx/xx 5DD 5E9 5F1 " TABS ^OI 0F 09 xx/xx 5E1 5ED 5F5 CLEAR TABS ^ON 0F 0E xx/xx 5E5 5F1 5F9 SET MARGIN & TABS FROM FILE LINE ^OF 0F 06 xx/xx 5E9 5F5 5FD WORD WRAP TOGGLE ^OW 0F 17 xx/xx 5ED 5F9 601 JUSTIFICATION " ^OJ 0F 0A xx/xx 5F1 5FD 605 VARIABLE TABBING " ^OV 0F 16 xx/xx 5F5 601 609 DISPLAY OF PRINT CONTROLS " ^OD 0F 04 xx/xx 5F9 605 60D " " RULER " ^OT 0F 14 xx/xx 5FD 609 611 " " PAGE BREAK " ^OP 0F 10 xx/xx 601 60D 615 SOFT HYPHEN ENTRY " ^OE 0F 05 xx/xx 605 611 619 HYPHEN HELP " ^OH 0F 08 xx/xx 609 615 61D PARAGRAPH TAB ^OG 0F 07 xx/xx 60D 619 621 MARGIN RELEASE ^OX 0F 18 xx/xx 611 61D 625 CENTER LINE ON PAGE ^OC 0F 03 xx/xx 615 621 629 LINE SPACE SETTING ^OS 0F 13 xx/xx 619 625 62D EXPLAIN PRINT COMMANDS ^JD 0A 04 xx/xx 61D 62 631 " STATU LINE ^J 0 1 xx/xx 621 62D 635 " FLAGS ^JF 0A 06 xx/xx 625 631 639 " PLACE MARKERS ^JP 0A 10 xx/xx 629 635 63D " RE-FORMMING A PARAGRAPH ^JC 0B 02 xx/xx 62D 639 641 " TABS & MARGINS ^JM 0A 0D xx/xx 631 63D 645 " COMMAND ^JI 0A 09 xx/xx 635 641 649 " TEXT MOVEMENT ^JV 0A 16 xx/xx 639 645 64D " RULER-LINE ^JR 0A 12 xx/xx n/a 651 ^JA OA 01 xx/xx XTAB 63D 655 EXPANSION SPACE FOR EDIT CMD TABLE 00/00 FPTAB 662 67A FILE PRINT COMMAND TABLE 10 00 28 43 A1 00 BA 29 17 00 C1 29 16 00 9A 03 00 PNFTAB 677 67F 68B POINTER TO NOFTAB 3C 04 PVTAB 679 681 68D " " VTAB 89 04 PFPTAB 67B 683 68F " " FPTAB 7A 06 Special Edit command on the "D" Screen ------------------------------------------ CLCHR 67E 691 ERASES ONE CHAR TO LEFT ^S 13 CRCHR 67F 692 RESTORES ONE (ERASED) CHAR TO RIGHT ^D 04 LITCHR 680 693 PREFEX TO TAKE NEXT CHAR LITERALLY ^P 10 DIRCHR n/a 694 DISPLAYS FILE DIRECTORY ^F 06 n/a 695 MOVES (SCROLLS) FILE DIRECTORY DOWN ^Z 1A ERELCH 685 696 MOVES (SCROLLS) FILE DIRECTORY UP ^W 17 STPCHR 684 697 EMERGENCY STOP CHAR ^U 15 685 68D 698 CHAR TO START OPNS AFT EMERG STOP Esc 1B 686 68E n/a 00/00 Printer Interface Parameters ------------------------------ POSMTH 690 690 699 TYPE OF PRINTER FF BLDSTR 691 691 69A NUMBER OF STRIKES FOR BOLDFACE ^B 02 DBLSTR 692 692 69B " " FOR DBL-STRIKE ^D 02 693 693 n/a 00 00 00 -------------------------------------------------- PSCRLF 696 696 69C STR TO DO CR & LF ^M #02/0D 0A 00 00 00 PSCR 6A1 6A1 6A7 STR TO DO CR ONLY CR #02/0D 00 00 00 00 00 PSHALF 6A8 6A8 6AE STR TO DO CR & HALF LF #00/0D 0A 00 00 00 00 PBACKS 6AF 6AF 6B5 PRINT BACKSPACE ^H #01/08 00 00 00 00 PALT 6B5 6B5 6BB SET ALT CHAR FONT ^PA ## 00 00 00 00 PSTD 6BA 6BA 6C0 RESET STD CHAR FONT ^PN ## 00 00 00 00 ROLUP 6BF 6BF 6C5 ROLL CARR UP PARTIAL LINE ^PT ## 00 00 00 00 ROLDOW 6C4 6C4 6CA ROLL CARR DN PARTIAL LINE ^PV ## 00 00 00 00 USR1 6C9 6C9 6CF USER FUNCTION #I ^PQ ## 00 00 00 00 USR2 6CE 6CE 6D4 " #2 ^PW ## 00 00 00 00 USR3 6DE 6D3 6D9 " #3 ^PE ## 00 00 00 00 USR4 6D8 6D8 6DE " #4 ^PR ## 00 00 00 00 RIBBON 6DD 6DD 663 CHANGE TO red ribbon toggle 1st ^PY ## 00 00 00 00 RIBOFF 6D2 6E2 6E8 " black " " 2nd ^PY ## 00 00 00 00 ******************************************************************** * Keep in mind that the labels only suggest some uses; so if * * your printer only has one black ribbon, you can patch RIBBON * * & RIBOFF to permit you to use ^PY toggle to serve your needs. * * * *Again need mor spac fo give printe contro string? * *Yo ca "steal spac fro th next use are (an loos * *furthe us o tha WordSta comman an any remaining space * * in that use area e.g USR ca exten int USR4). * ******************************************************************** PSINIT 6E7 6E7 6ED STR TO INITIALIZE PRINTER #01/0D 00 00 00 <"lead-in string"; end with ; 00 00 00 00 00 try 06,1B,40,1B,41,06,0D to start 00 00 00 00 00 up Epsons with half LFs & full LFs 00 00 - See PSCRLF & PSHALF> PSFINI 6F8 6F8 6FE STR TO TERMINATE PRINTING ## 00 00 00 00 <"trail-out string" 00 00 00 00 00 try 02,1B,40 on Epsons> 00 00 00 00 00 00 00 SOCHR 70B 70B 70F STRIKEOUT CHAR try 2F(/) or 58(X) [-] 2D ULCHR 70C 70C 710 UNDERLINING CHAR [_] 5F PRINIT 70D 70D 711 NOP or JMP STR TO INIT CUSTOM PNTR 00 00 C9 PRFINI 710 710 714 " " " " TERM " " 00 00 C9 713 713 n/a 00 00 00 00 CSWTCH 717 717 717 SWITCH TO SELECT PRINTER DRIVER 00 <00=primay list dev; 01=WS' port drvr 02=user prntr drvr; 03=OEM drvr 04=alt console drvr> HAVBSY 718 718 718 SWTCH TO TELL IF PRINTER BUSY, FF=YES 00 719 719 --- 00 ------------------------------- LIBSY 71A 71A 719 JMP TO BSY TST RTN; CSWTCH=00,OUTPUT 00 B7 C9 LISEND 71D 71D 71C ROUTINE TO SEND CHAR TO LST DEV 5F 0E 05 CD 05 00 B7 C9 LISINP 725 725 724 JMP TO USER CHAR INPUT ROUTINE 00 37 C9 -------------------------------- POBSY 728 728 727 PORT DRIVER BUSY STATUS ENTRY DB POSTAT 729 729 728 " " STATUS ADDRESS 05 00 E6 POMASK 72C 72C 72B " " OUTPUT BIT OF INTEREST 01 EE POOM 72E 72E 72D " " OUTPUT BITS THAT CHANGE 01 37 0 B7 C 9 POSEND 733 733 732 " " SEND CHAR ENTRY D3 POOP 734 734 733 " " OUTPUT DATA PORT ADDRESS 04 00 C9 POINP 736 737 736 " " INPUT CHAR ENTRY DB PISTAT 738 738 737 " " INPUT STATUS PORT ADDRESS 05 00 E6 POINSK 73B 73B 73A " " INPUT BIT OF INTEREST 02 EE POIM *73D 73D 73C " " INPUT BITS THAT CHANGE 02 37 C0 DB POIP 741 741 740 " " INPUT DATA PORT ADDRESS 04 00 B7 C9 ------------------------------- PUBSY 74C 74C 744 JMP TO USER PRINTER BUSY TEST ROUTINE 00 B7 C9 PUSEND 74F 74F 747 JMP TO USER CHAR OUTPUT ROUTINE 00 00 C9 PUINP 752 752 74A JMP TO USER CHAR INPUT ROUTINE 00 37 C9 ------------------------------- ACBSY 758 758 74D JMP TO USER ALT CONS BUSY TEST RTN 00 B7 C9 ACSEND 75B 75B 750 SEND A CHAR TO ALT CONS CD 6C 07 CD F0  20 C3 63 07 ACINP 764 764 759 INPUT CHAR RTN CD 6C 07 CD 55 1D C4 6C 1D 57 ACFIN 76E 76E 763 EXIT ROUTINE 78 ACSTA1 76F 76F 764 SET/RESET IOBYTE 32 03 00 7A B7 C0 37 C9 ACSTAR 777 777 76C ENTRY ROUTINE START 57 3A 03 00 47 E6 FC F6 CONFIE 77F 77F 774 ALT CON DEVICE ASSIGNMENT 01 C3 64 07 <00 = TTY; 01 = CRT> PROTCL 786 786 778 PRINTER PROTOCOL TYPE 00 <00=none; 01=ETX/ACK; 02=XON/XOFF> EAKBSZ 787 787 779 ETX/ACK MSG BUFFER SIZE 7F 788 788 n/a 00 00 < Most of the following are only used by daisywheel printers> ----------------------------------------------------------------- DVMILE *790 n/a 790 77A VERT MOTION INDEX LEADIN STR #02/1B 1E 00 00 DVMITR n/a n/a 77F VERT MOTION INDEX TRAILING STR #02/1B 02 00 00 DVMMIN n/a 795 784 MAXIMUM DVMILE 01 00 DVMRNG n/a 797 786 MINIMUM DVMILE 7E 00 DHMILE 799 779 788 HORIZONTAL MOTION INDEX LEADIN STR #02/1B 1F 00 00 DHMIFG 79E 79E 78D 00 DHMIN 79F 79F 78E MAXIMUM DHMILE 01 00 DHRNG 7A1 7A1 790 MINIMUM DHMILE FE 00 DFWD 7A3 7A3 792 SET FORWARD PRINT #02/1B 35 00 00 DBAK 78A 7A8 797 SET BACKWARD PRINT #02/1B 36 00 00 DSP 7AD 7AD 79C FORWARD SPACE #01/20 00 00 00 DBS 7B2 7B2 7A1 BACKWARD SPACE #01/08 00 00 00 DLF 7B7 7B7 7A6 LINE FEED VMI #01/0A 00 00 00 DRLF 7BC 7BC 7AB REVERSE LINE FEED #02/1B 0A 00 00 DPHSPC 7C1 7C1 7B0 PRN PHANTOM CHAR try Esc Y=cents ^PF#02/1B 59 00 DPHRUB 7C5 7C5 7B4 PRN PHANTOM RUBOUT try Esc Z=b bar ^PG#02/1B 5A 00 7C9 7C9 n/a 00/00 DNPROS 7DE 7D3 7B8 SUPPRESS PROPORTIONAL SPACING: 00=On 00 DMJWB 7D4 7D5 7B9 ALT MICROJUSTIFY ALGORITHM: 00=N0 00 PSTAB 7D8 7D8 7BA PROPORTIONAL SPACING TABLE 00/00 **************************************************************************** 83A 83A 83A END OF USER PATCHING ACCESSABLE AREA ..WSBIBLE.DOC RULER #3 (Put cursor on line and hit ^OF to create new ruler) ..-----!-------!-----------------------!----!----------------------!---- WSMSGS.OVR V3.30 PATCHING by A. F. Remich No tha yo hav see th inne working o WS.COM yo migh wan t kno ho t patc th WSMSGS.OV prin men scree t remin yo (an you ne secretary?) jus wha change yo mad i th variou printe patc areas Her ar th location o th variou item tha ar intende t cu th use an som example o ne entries  STRUCTURE OF EACH LINE IN WSMSGS.OVR's PRINT MENU: .po0 | | | <-----17 col---->|<------20 col------>|<-------21 col------>|<-----17 col---->x | | | .po4 ENTRIES IN EACH DATA FIELD: (NOTE spac "0E a en o line) CTRL CTRL LOCATION CURRENT ENTRY CHAR SAMPLE NEW ENTRY CHAR ---- --------------------- ---- --------------------- ---- 1A8A < Start of PRINT MENU> 1B51 .A.Alternate.pitch...| ^PA .A.Compressed begin..| ^PA ---- 1B7A .B.Bold.D.Double.| ^PB/^PD 1B8C .H.Overprint.char...| ^PH 1BA1 .N.Standard.pitch....| ^PN ! 1BB7 ^J.Help..^K.Block.x ---- 1BCA ..S.Underscore...| ^PS 1BCC .O.Non-break.space..| ^PO 1BF1 .C.Printing pause....| ^PC 1C07 ^Q.Quick.^P.Print..x ---- 1C1A ..X.Strikeout....| ^PX 1C2C .F.Phantom.space....| ^PF .E.wide.print.End...| ^PE 1C41 .Y.Other.ribbon.color| ^PY .Y.Italics.begin/end.| ^PY 1C57 ^O.Onscreen.....x ---- 1C6A ..V.Subscript....| ^PV 1C7C .G.Phantom.rubout...| ^PG .R.Emph/Dbl.prn.end.| ^PR 1C91 .....................| --- .W.Wide.print.begin..| ^PW ---- 1CBA ..T.Superscript..| ^PT 1CCC .RET.Overprint.line.| ^PRET.Q.Sub/Superscpt end| ^PQ 1CE1 .Q(1).W(2).E(3).R(4).| --- .RET.Overprint.line..| ^PRET Yo wil hav t mak an desire change usin DDT.CO (o on o th friendlie program availabl i th publi domain) Yo ca eve us th "auto-patching techniqu presente later Then save: A>SAV 11 WSMSGS.OVRPIP MYPATCH#.ASM=MYPATCH.ASM[Z] 6. Assemble your version of MYPATCH&.ASM to get MYPATCH&.HEX file. A>AS MYPATCH (n .AS extensio discar .PR file) 7. Use DDT.COM to load WS.COM into memory A>DDT WS.COM 8. Use DDT.COM to overlay the .HEX file onto WS.COM -IMYPATCH#.HEX -R 9. Exit DDT.COM and save your new version of WordStar -G0 A>SAVE 69 WSNEW.COM (for v3.30), or A>SAVE 62 WSNEW.COM (for v3.0), or A>SAVE 52 WSNEW.COM (for v2.26) 10. Use DDT.COM to inspect WSNEW.COM to be sure the patches are in place A>DDT WSNEW.COM -Snnnn or -Dnnnn 11. Run WSNEW.COM to test each of the new features !!! (Like them ???) 12. If you want to, rename WSNEW.COM - but use WINSTALL.COM * NOTE: The PD utility MLOAD.COM does steps 7 thru 10 in just one step A>MLOAD WSNEW.COM=WS.COM,PATCH.HEX ***** No yo ar read fo th bi tim Writ me INDEX DOC *INDEX11 IDX /#INDEX11 PAS 8INDEX 1 <INDEX 2 >+INDEX 3 IOUTLINE COM NOUTLINE DOC P$WS3330 DOC YIS3330 DOC i INDEX .2 06 EB 11008 86 INDEX .3 A9 C5 4480 35 OUTLINE .COM F3 5D 1536 12 OUTLINE .DOC 9B E1 9216 72 WS3330 .DOC 8E 99 18688 146 WSBIBLE .DOC A3 DB 47104 368 WSEXPAT4.ASM FF 8B 7296 57  Fog Library Disk FOG-CPM.004 Copyright (1985) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. WordStar patches and programs for expanding on WordStar. Filename Description -10-00 .85 This is the release date of the disk. -CPM004 .DOC This is the description of the disk contents. DIFF .COM 6BE2 6K [DIFF 1 of 2] Compare text files. DIFF .DOC C32D 1K [DIFF 2 of 2] FINREP21.COM 35C1 3K ver. 2.1 [Find & Replace 1 of 2] Fabulous find and replace utility for text files. FINREP .DOC D3F1 13K ver. 2.1 [Find & Replace 2 of 2] INDEX11 .COM C20B 16K ver. 1.1 [WS Index 1 of 7] Build an index to references in your WordStar files. INDEX .DOC 9BA9 5K ver. 1.1 [WS Index 2 of 7] INDEX11 .IDX 3056 9K ver. 1.1 [WS Index 3 of 7] INDEX11 .PAS C317 4K ver. 1.1 [WS Index 4 of 7] INDEX .1 9133 2K ver. 1.1 [WS Index 5 of 7] INDEX .2 06EB 11K ver. 1.1 [WS Index 6 of 7] INDEX .3 A9C5 5K ver. 1.1 [WS Index 7 of 7] OUTLINE .COM F35D 2K [Outline Processor 1 of 2] Outline processor for WordStar. OUTLINE .DOC 9BE1 9K [Outline Processor 2 o$f 2] WS3330 .DOC 8E99 19K Patch points for WordStar 3.0 and 3.3 WSBIBLE .DOC A3DB 46K Complete listing of patch points in WordStar vers. 2.26, 3.0, and 3.3 -- all you need to know to modify WordStar WSEXPAT4.ASM FF8B 8K Patch WordStar for the memory mapped video of the Osborne Executive. S Index 7 of 7] OUTLINE .COM F35D 2K [Outline Processor 1 of 2] Outline processor for WordStar. OUTLINE .DOC 9BE1 9K [Outline Processor 2 oC 8E99 19K Patch points for WordStar 3.0 and 3.3 WSBIBLE .DOC A3DB 46K Complete listing of patch points in WordStar vers. 2.26, 3.0, and 3.3 -- all you need to know to modify WordStar WSEXPAT4.ASM FF8B 8K Patch WordStar for the memory mapped video of the Osborne Executive. * * * * * * * Environment section CLEAR DO WHILE .NOT. EOF() STOR diskno TO mdiskno,mft CLEAR @ 10, 1 SAY "When you have the disk &dfile..&mdiskno in drive &diskf, ; press the