home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug016.arc / WORDBEE.WBF < prev    next >
Text File  |  1979-12-31  |  20KB  |  287 lines

  1.   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                              **        I M P R O V E M E N T S   T O    W O R D B E E        **                       by  PHIL  WILKIN                       ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *     I purchased my 16K 'Bee some three and a half years ago and acquired  an  Alpha-80 printer (same as the A.T.  unit)  shortly afterwards.  The 'Bee now has a 32K series 3  coreboard.  During this  time,  ROM  based Wordbee has been used extensively for  a variety  of  documents/letters and its frustrating  deficiencies have resulted in various modifications being made to the program to  expand  its  use.   This  article  examines  some  of  those shortcomings and suggests solutions.     Early  mods  included  changing the  default  printer  from serial to parallel and doing a warm start when jumping to basic. However these variations are insignificant when compared to what can be achieved.      You  can't  really  expect much in an  8K  word  processing program  yet Wordbee performs effectively.  It would be nice  to have  auto paragraph numbering,  sub-paragraph indenting  and  a screen   formatted   like  the  printed  version,   but  it   is nevertheless fairly comprehensive.     The  main  deficiency and the area covered  in  depth  here concerns printer codes.    With standard Wordbee, if you wish to underline,  and  detest those silly little dashes invoked by the  .ULx command, you would include in your file: .ES                    printer code sequence follows 27 45 1                as per printer manualfollow this with the part to be underlined, then: .ES 27 45 0to cancel the underlining.  To underline a word in the middle of a  line  you  also need to suppress line feeds with  a  .ZN  and carefully  space out to the required column for  the  underlined word, and so on.     Similar  messing  about is necessary for any of  the  other attributes  one  is likely to want in the text such as  italics, emphasised,  double strike,  enlarged, condensed, superscript or subscript.   The solution is to modify Wordbee to recognise mid-line  signals which cause the appropriate code to be  output  to the printer.     Before we look at implementing these in Wordbee, let's have a  look  at the program (version 1.2) for some space to put  our code.    There  are 128 bytes containing FF or 00 from  DF67  to DFE6.  You  might  think  this is a bit out of the way  and  too restricted  in  size  but  your  printer  will  never  know  the difference and it's worth keeping in mind.    A point to note is that the early version (1.0) has 426 free bytes from DE40  which is sufficient for a number of printer codes.     When  you  initialise Wordbee,  you briefly  see  "Checking WORDBEE  program"  on  the  main menu page.  If  any  bytes  are different you will next see "EPROM ERROR press ESC to continue". If you modify Wordbee,  this message will always come up.   Once you  have your modified version up and running in an  EPROM,  it won't  change,  so it does not need to checked  each  time.  The checking  routine is from C017 to C056 so if C017 reads JP C057, you then have from C01A to C056.  As a bonus,  you also get DF22 to DF53 where the messages were coded.     When  you  have finished with a file  and   type   (at  the  main   menu level) 'KIL' you do not want to be asked by your Bee 'Are  you sure ?' if you know what you are  doing.  Surely  your fingers  could not be that accidental!!  The same thing  happens when  you  exit to Basic but if you change that to a warm  start Basic,  an accidental 'E' will not crash your file. The 'Are you sure' routine is at C140 and the Basic exit starts at C132  with CD  40 C1 which if you change to CD 28 C9  C3 21 80 (CALL a  CLS and  JP 8021 to Basic) will give you from C138 to C152 which  is 27 more bytes for printer codes.  Of course you must also delete from  the KIL routine the call to the 'Are you sure' subroutine: change C18F from CD 40 C1 C0 to 4 NOPs.     To  find more space,  you need to critically look at  those existing facilities which you have no need for.  There seemed to be no good reason to send nulls or wait for x seconds or to .ULx or  switch  the  printer on/off  so  all  these,  when  deleted, provided spaces in the program for printer codes.     The  next problem is to decide exactly what new  attributes we  wish  to  add to the program.  I had a need  for  continuous underlining,  italic  and super- script printing with  enlarged, condensed  and emphasised on the 'nice to have' list and it  was not  too difficult to add subscript and double printing  at  the same time.    A new .FF command was also added to provide a form feed at the end of a letter.     Now  we need to look at just how and where to add our code. 
  2. We  have  made spaces in the original program and these  can  be 
  3. used for output code but we still need to put a 'trip' into  the 
  4. program  to  test  for our signal and then jump  to  the  output 
  5. routine if the result is positive.  If we are to simply add more 
  6. dot  commands we can use the spaces in the test routine left  by 
  7. removal of .SN#xx, .WT#xx, .XY and .ULx.
  8.  
  9.      The  dot test routine starts at CBA4 which is called at the 
  10. start of each line.    If the first character is not a full stop 
  11. (2E  hex)  the test returns 'non-zero'.  If it  is  a  dot,  the 
  12. routine  then tests the fourth character for a <CR> (0Dh)  - for 
  13. two-letter  commands such as .JY;  or tests it for a '#' (23h) - 
  14. for commands such as .LM#10.  The final test here is for a  .ULx 
  15. type of command which we will not need.
  16.  
  17.      The  method  I employed was to use one letter for each  new 
  18. facility  followed  by a 'Y' for switching it on or  a  'N'  for 
  19. switching it off.  For example .IY would switch the printer over 
  20. to italic mode and a .IN would revert it to normal.   Similarly, 
  21. 'C'  can  be used for condensed printing,  'B' for  big/enlarged 
  22. characters (E is reserved for .ES),  'M' for emphasised, 'U' for 
  23. underlining,  and  'D' for double print.  As super and subscript 
  24. are so closely related, it was decided to implement these as .SB 
  25. for  sub,  .SP  for super and .SN for  cancelling  either  (same 
  26. code).
  27.  
  28.      The  lines which checked for those attributes which are  no 
  29. longer  required can now be altered to test for a new  attribute 
  30. such  as italics.  However,  to check for each of the eight  new 
  31. facilities  we  are  adding,  we  run out  of  space  here.  The 
  32. assembler listing shows a jump to C039 where the tests  continue 
  33. (in  the area left vacant by deletion of the 'Checking  WORDBEE' 
  34. routine).  The  listing has been commented to show what the code 
  35. does and if you have your printer manual open at Appendix B  you 
  36. should  be able to verify the signals being sent to the  printer 
  37. for  each attribute.  Apart from the routines jumping around  to 
  38. the various spaces created earlier, you will note that different 
  39. attributes  require  codes sent to the printer to vary from  one 
  40. character (condensed:  0F for on, 12 for off) to four characters 
  41. (to turn off sub or superscript: ESC H and ESC T).
  42.  
  43.      This  method  works  quite  well  but,  it  still  has  the 
  44. disadvantage that you need a new line to invoke any of these new 
  45. facilities  with  its own dot command and another  new  line  to 
  46. cancel  it.  If  you wish to print one word in the middle  of  a 
  47. paragraph in italics to highlight it, you must put a <CR> at the 
  48. end  of the previous line,  suppress line feeds with a .ZN line, 
  49. type out the line to the preceding word, another <CR>, switch on 
  50. italic mode with a .IY line,  type the italic  word,  <CR>,  re-
  51. invoke line feeds with a  .ZY, space out to the next word and go 
  52. on  typing.    It  has the advantages that it only requires  one 
  53. line  instead of two and you do not need to refer to a  list  of 
  54. the number codes for each facility.
  55.  
  56.      An improvement, however, is to use a special character as a 
  57. mid-line  trigger to jump to a test routine to ascertain whether 
  58. the  following  character is to switch an attribute on  or  off.   
  59. This method has also been used with the slosh (or backslash) '\' 
  60. character  being  employed  as  the  trigger.    Following  this 
  61. character  with  the appropriate letter for  each  facility  can 
  62. toggle the facility on or off. 
  63.  
  64. In \Ithis\I example, the word 'this' would be printed in italics 
  65. as:
  66.  
  67. In this example, etc.
  68.  
  69. You  should  now  be  able  to follow the  screen  dump  of  the 
  70. 'PARALLEL PRINTER COMMAND MENU'.
  71.  
  72.      This all sounds interesting, you say, but how do we operate 
  73. this 'switch'?    Well, the original .ULx command uses a scratch 
  74. pad  at  memory location 0547h to store the character  the  user 
  75. selects  as  a trigger  for  underlining.    On  initialisation, 
  76. Wordbee  sets  that scratchpad to zero and as we  have  scrubbed 
  77.  .ULx,  we  can  use  that location.  If each of  our  eight  new 
  78. attributes is allocated one bit of that byte, we then have eight 
  79. separate switches.    Also,  the original program used a routine 
  80. at  CA96  to  check  if the character allocated by  a  .ULx  was 
  81. present and, if so, act accordingly.   
  82.  
  83.      We  simply replace that routine with our own  which  checks 
  84. for a slosh character,  continuing on to the usual print routine 
  85. if  not found.    If there is a slosh,  our routine ensures  the 
  86. next  character is upper case and then jumps to another  routine 
  87. we  put at DF28 which sets the switches and outputs the  signals 
  88. to  the  printer.  A few little points to  note.  Subscript  and 
  89. superscript  required  new identifying characters:  ']' and  '^' 
  90. have been used.  The word "PAGE x" which was located at DF5F and 
  91. addressed  by  location  CB1D has been moved to  DF22  and  CB1D 
  92. amended  accordingly.  The second assembler listing shows how  a 
  93. software switch is used.
  94.  
  95.      One of the problems of using a mid-line switch is adjusting 
  96. the  line  length  to compensate.  This  problem  has  not  been 
  97. entirely  overcome  and  using this facility  upsets  the  right 
  98. justification mode. Perhaps one of the members out there has the 
  99. time  and inclination to delve into the .JY routine and come  up 
  100. with the solution? Well, with these changes to Wordbee, you will 
  101. find  it  much more convenient to use those  special  attributes 
  102. your  printer  can  so  readily  provide.  However,  we  haven't 
  103. entirely  finished  with improvements and you may  consider  the 
  104. following suggestions or perhaps design your own.
  105.  
  106.      The  Telcom  monitor  works  the same way  as  the  Wordbee 
  107. monitor  but is more comprehensive and readily  allows  swapping 
  108. around between the PAK locations which, if done from the Wordbee 
  109. monitor,  will result in an immediate crash.   Having the Telcom 
  110. monitor  thus  makes  the  Wordbee monitor  obsolete  and  could 
  111. provide us with a substantial chunk of spare memory if we delete 
  112. it.    The Wordbee monitor starts at D061 and you can enter  the 
  113. Telcom  monitor  at  E024.    Just a point to watch  before  you 
  114. delete the monitor,  there are two routines called from the rest 
  115. of Wordbee so follow these steps:
  116.  
  117.         1.   Amend D061 to read -
  118.              D061  CD 28 C9     CALL    C928    ; clear screen
  119.              D064  C3 24 E0     JP      E024    ; Telcom mon
  120.  
  121.         2.   Move D468 - D486  to  D067 - D085  (1F bytes)
  122.              Change CF31 from 68 D4 to 67 D0
  123.  
  124.         3.   Move D515 - D540  to  D086 - D0B1  (2C bytes)
  125.              Change CE6C from 15 D5 to 86 D0
  126.  
  127.         4.   Delete D0B2 to D555
  128.  
  129. This gives us 1188 bytes (4A4 h) to play with !!
  130. 
  131. SETTING DEFAULTS 
  132. 
  133.      Do  you  find that each time you start a  letter  or  other 
  134. document  that  you  always commence with  the  same  formatting 
  135. parameters? In my case, most files started with the following:
  136.  
  137.  .ES
  138.  27 64          ; printer initialise to set top of form and
  139.                 ; ensure normal text
  140.  .LM#5          ; letters look better with a good sized margin
  141.  .LL#64         ; its a handy length for letters and the
  142.                 ; screen resembles the final print
  143.  .PG#0          ; single sheets are often used
  144.  
  145.      It  was  decided  to automatically start files  with  these 
  146. parameters  after a 'KIL'.  If not needed,  they can  easily  be 
  147. deleted with ^Y. Here is my method of doing this.
  148.  
  149.      The  'KIL' routine ends with a jump to C060 near the  start 
  150. of Wordbee. The routine from C060 to C068 clears the scratchpads 
  151. after putting a '55' into location 500, and from C069 to C07C it 
  152. clears  RAM  from  0901  on.  If  we  duplicate  these  routines 
  153. elsewhere,  follow  up  with  a routine which  block  moves  our 
  154. initial  file into RAM,  adjusts the end-of-file pointer at 051D 
  155. and  then  jumps  to the warm start address  at  C07D,  we  will 
  156. achieve our aim.    Do not forget to change the jump address  at 
  157. C19F  from  C3  60  C0 (JP C060) to point  to  the  new  routine 
  158. location - probably where you have just cleared out the monitor.   
  159. Just  in  case  you  are not sure how to  do  this  block  move, 
  160. assemble this:
  161.         LD      HL,START        ; address of 'file'
  162.         LD      DE,0901h        ; where Wordbee files start
  163.         LD      BC,LENGTH       ; of file - the above example
  164.                                   is 1D long
  165.         LDIR
  166.         LD      (051Dh),DE      ; end of file pointer
  167.         JP      0C07Dh          ; warm start
  168.      One  way  to get your 'file' is to KIL any data in  memory, 
  169. write  your starting parameters as a file,  jump to the  monitor 
  170. and  move  it somewhere safe (away from EDASM source  codes  you 
  171. might perhaps be doing next).  Alter natively, you can enter it 
  172. directly with the Telcom monitor in text mode.
  173.  
  174.      Should  you  always want  your  standard  parameters,  just 
  175. change  the  instruction at C07A to CALL your new routine  which 
  176. will start with the replaced "LD (0513),HL" and follow with  the 
  177. block move routine, ending with a RET in lieu of JP 0C07Dh.
  178.  
  179.      Having  made  a big hole where the monitor used to  be,  we 
  180. might  as well do something worthwhile with it.  I have a  small 
  181. family company and I have designed a four line letterhead  using 
  182. bit  image  graphics  to print the company name in  large  fancy 
  183. writing. Perhaps readers might want to put their family crest on 
  184. letters  or maybe just the house name in stylish print  followed 
  185. by the address.
  186.  
  187.      The  problem was that the Wordbee file for  the  letterhead 
  188. consisted  of around one thousand items of data,  each being two 
  189. to four bytes long.  Not only was it time consuming to load  all 
  190. the  data  and  to scroll through it before  even  starting  the 
  191. letter, but also when saving the letter to tape.
  192.  
  193.      A  new  command .LH was introduced to dump the data to  the 
  194. printer.  Instead of being part of a Wordbee file,  the data  is 
  195. now  stored in hex,  filling most of that big hole.  To  arrange 
  196. this,  put a branch loop in the dot command look-up table. Refer 
  197. to listing one,  line 210.  Amend the address from 'LINE' (CC6E) 
  198. to  'LHEAD'  which will be wherever you put the  following  code 
  199. (example is at D0F5):
  200.  
  201. ;       LETTERHEAD ROUTINE
  202. ;
  203.         ORG     0D0F5     ; or where it suits you
  204. PRINT   EQU     0CD54     ; usual print routine
  205. START   EQU     0D110     ; or where your letterhead data starts
  206. LENGTH   EQU      3DC       ;  change to the number of bytes  in 
  207.  your  data
  208. LINE    EQU     0CC6E     ; original .LS#xx test location
  209. ;
  210. LHEAD   LD      A,(IY+2)  ; get the next character
  211.         CP      'H'       ; is the command .LH ?
  212.         JP      NZ,LINE   ; if not, revert to original test
  213. ; to get here it must have been a .LH command
  214.         LD      HL,START  ; location of your data
  215.         LD      DE,START  ; first piece of data
  216.         LD      BC,LENGTH ; of data string
  217. OUTPUT  LD      A,(DE)    ; ready to print contents of A reg
  218.         CALL    PRINT     ; to printer
  219.         LDI               ; to next byte
  220.         JP      PE,OUTPUT ; print next if not finished
  221.         RET               ; all done
  222.         END               ; to keep EDASM happy !
  223.  
  224.      It would be easy to modify this routine to give a choice of 
  225. letter heads  or perhaps a signature.    Just remember  that  the 
  226. fourth  character (IY+3) MUST be a <CR> or a '#',  so you  would 
  227. need to test for .L1, .L2, etc or maybe .LH#1.
  228.  
  229.      And now to the last modification of substance. Having tried 
  230. this modified Wordbee with a PC, a conflict occurred when trying 
  231. to  move  to the top of the file with ^T.  This is  because  the 
  232. Shell  at PAK 5 which controls the whole show acts on a ^T doing 
  233. a  text  dump  to the printer!  The solution is  to  change  the 
  234. command  to ^W which is achieved by changing D02F from 14 to  17 
  235. and changing D58A from 54 to 57.
  236.  
  237.      The  rest of the changes are cosmetic and include  changing 
  238. the  main  menu choice of "Net" to "Telcom" and  re-wording  the 
  239. printer help page to reflect the new commands.
  240.  
  241.      That's  about the extent of changes implemented so  far.  I 
  242. cannot  sell  you  a copy of his  modified  Wordbee  because  of 
  243. copyright  on the original program,  but if you bring along your 
  244. originally  purchased  copy of Wordbee and a spare  2764  EPROM, 
  245. your  copy  can be modified as outlined above for  say  $10  and 
  246. burnt into the EPROM.
  247.  
  248.      One  last  point  to help you with your  mods.  Rod  Irving 
  249. Electronics has been selling 6264(8K RAM) chips for $7 and these 
  250. are  pin compatible with 2764's.  They won't work just  anywhere 
  251. though,  only in place of the BASIC ROM's and/or PAK 0, and only 
  252. if  the  link  is made between "16" and "17" near  IC10  on  the 
  253. coreboard  and the other links are set for  2764's.   What  this 
  254. means is that you can set up your modified Wordbee in a RAM chip 
  255. located  at  PAK  0 and test run it before burning  it  into  an 
  256. EPROM.  What you can't do is throw out your Basic ROM's and plug 
  257. in  RAM to provide more memory for Wordbee because Wordbee makes 
  258. some ROM calls into Basic.
  259.  
  260.      Perhaps  some readers have other modifications  which  club 
  261. members may be interested in,  or maybe someone will rewrite all 
  262. this  unstructured (thrown together) code into some semblance of 
  263. order. I can be contacted after hours on 29 7785.
  264.  
  265.          THIS IS A SCREEN DUMP OF THE PRINTER HELP PAGE 
  266.  
  267.                 PARALLEL  PRINTER  COMMAND  MENU 
  268.  
  269.      "\*" = mid-line on/off switch
  270.      ".*Y" or ".*N" = start of line on/off command
  271. For "*" use:        I = italics    D = double     B = enlarged
  272.                     U = underline  M = embossed   C = condensed
  273. "\": \^  = superscript   \]  = subscript
  274. ".":  .SP  = superscript   .SB = subscript   .SN = turns  either 
  275. off
  276. DOT commands only:  J = justify    Z = L/F's with C/R's
  277.      NP = new page  HE = page header follows      FF = form feed
  278.      ES = send next line/para as sequence to printer
  279.  .LL#xx = line length    .LM#xx = left margin     .LS#xx =  line 
  280. spacing
  281.  .PG#xx  = crease gap (0 = single sheet)           .PN#xx = page 
  282. number
  283.  .PL#xx  =  page  length  (lines)                      .LH     = 
  284. letterhead
  285.  
  286.                         <RETURN> to menu
  287.                Tape load: *=any @=force \=append