home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / F / KEYS-128.ARK / KEY128-3.DOC next >
Text File  |  1989-09-27  |  15KB  |  295 lines

  1.  
  2.  
  3.  
  4.                        SAVEKEY and LOADKEY
  5.                       For the Commodore 128
  6.                            Version 3.0
  7.  
  8.                           Gene Pizzetta
  9.                         January 16, 1988
  10.  
  11.  
  12. Commodore includs a very nice utility program, KEYFIG, with C128 
  13. CP/M.  It allows you to assign strings to your function keys (or 
  14. any other key) or to completely redefine your keyboard.  You 
  15. could easily create a Dvorak keyboard if you wanted.
  16.  
  17. The problem is that it's not so easy to change the key 
  18. assignments if you'd like to have one set of function keys set up 
  19. for NewWord or WordStar, another set for SuperCalc, a third for 
  20. dBase II, a fourth for COMAL, and a fifth (default) set for 
  21. general uses like taking disk directories.  You've got to call up 
  22. KEYFIG and change each key individually before loading your 
  23. application program, or you've got to have several boot disks-- 
  24. one for each set of function key assignments.
  25.  
  26. No More!  SAVEKEY will save the current key assignments at any 
  27. time to a small 1K file so you never have to recreate that set of 
  28. assignments again.  LOADKEY will load any file of key assignments 
  29. into your CP/M BIOS within a couple of seconds after you enter a 
  30. two-word command at the CP/M prompt.
  31.  
  32.  
  33. USAGE:
  34.  
  35.      SAVEKEY {{d:}<fn>}
  36.  
  37.      LOADKEY {{d:}<fn>}
  38.  
  39. SAVEKEY will save the currently active key assignments to disk 
  40. under the given filename (<fn>) on the given disk drive (d:).  If 
  41. you don't give a drive designation, the key file will be written 
  42. to the current (default) disk.  If you don't enter a filename on 
  43. the command line, it will be requested by the program.  It is not 
  44. necessary to enter a filetype (extension) and if you do it will 
  45. be ignored.  All key files are created with a .KEY extension.  If 
  46. a file with the same name exists on the destination drive, 
  47. SAVEKEY will ask if you want to overwrite it and, if you don't 
  48. answer "y", request a new filename.  Any other error will abort 
  49. the program and send a "failure" code to the BDOS.
  50.  
  51. LOADKEY will load the key assignments in the given file (<fn>) on 
  52. the designated drive (d:) into the CP/M system.  If a filename is 
  53. not given, it will be requested by the program.  Unlike SAVEKEY, 
  54. if a drive is not given, the current drive will not be assumed.  
  55. Instead, LOADKEY will check the drive search chain in the System 
  56. Control Block and follow that chain looking for the file.  The 
  57. default drive will be checked only if it is part of the search 
  58. chain.  If a drive is specified, only that drive will be checked. 
  59. Any filetype you enter will be ignored; the key table file must 
  60. have a .KEY filetype and must have been written by the SAVEKEY 
  61. program.  LOADKEY checks to make sure the key file is exactly 8 
  62. sectors long before moving it to the BIOS.  But be warned that 
  63. any 8-sector file with a .KEY filetype can be loaded by LOADKEY 
  64. and, if it is not a file written by SAVEKEY, it will crash your 
  65. system.  If no file by that name is found or if any other error 
  66. is encountered, LOADKEY will complain and return you to the CCP 
  67. after sending a "failure" code to the BDOS.
  68.  
  69.  
  70. CREATING CUSTOM FUNCTION KEYS:  KEYFIG is very easy to use.  It 
  71. is self-prompting and includes its own help file, so I won't 
  72. waste time and space explaining it's operation here.  The 
  73. keyboard can be set up just the way you want it and the new 
  74. configuration can be saved to your boot disk so it comes up your 
  75. way everytime you boot the system.
  76.  
  77. Custom key configurations for applications programs shouldn't be 
  78. saved that way, though, because you don't want them in effect 
  79. except when you're using the program.  So, after setting up the 
  80. keys for a particular program, choose the option to save the key 
  81. assignments as "current definitions", exit KEYFIG, and save them 
  82. to a file with SAVEKEY.
  83.  
  84. The four function keys give you 12 possible key assignments as 
  85. the unshifted, shifted, and control values.  The caps-lock value 
  86. for your function keys should probably be the same as the 
  87. unshifted value for function keys or you won't have access to 
  88. them when you have toggled on caps-lock by pressing the Commodore 
  89. key.
  90.  
  91. Good candidates for assignment to function keys are application 
  92. program commands that are used often and require you to enter two 
  93. or more characters.  For WordStar, for instance, you might want 
  94. to assign such commands as ^P^B for boldface, ^K^B and ^K^K for 
  95. marking a block, and ^O^G for temporary indent.  Then you only 
  96. have to press one key for those functions.  You might even want 
  97. to make the shifted or control values of your left and right 
  98. cursor keys issue ^A and ^F to move forward and backward a word 
  99. at a time.  After you get the keys the way you want them, exit 
  100. KEYFIG (after saving the new assignments as the current 
  101. definitions), and type
  102.      A>savekey ws
  103. to save the key configuration for WordStar on drive A as WS.KEY.  
  104. Whenever you want to use WordStar, just load the definitions and 
  105. call the program:
  106.      A>loadkey ws
  107.      A>ws sample.doc
  108. You can even do it all in one line:
  109.      A>loadkey ws!ws sample.doc
  110. because CP/M Plus allows multiple commands in a single line, 
  111. separated by an exclamation point.
  112.  
  113. It would be a good idea to keep a copy of your default key 
  114. definitions on each applications program disk along with the 
  115. special key definitions so you can quickly change back to the 
  116. normal definitions when you exit the program.  I call my normal 
  117. key definition file CPM.KEY.  Whenever I exit WordStar or dBase, 
  118. I immediately issue the command:
  119.      A>loadkey cpm
  120.  
  121. The logical color table for character and background colors is 
  122. saved to the file along with the key definitions.  Loading a new 
  123. color table has no immediate effect, however.  The change only 
  124. comes after a color change request is made via the correct escape 
  125. sequences, so this feature seems to have limited usefulness.
  126.  
  127.  
  128. SETTING UP A DRIVE SEARCH CHAIN:  When you call a program by 
  129. typing its name at the CP/M prompt, the CCP searches only the 
  130. current default drive (or whatever drive you designate) for the 
  131. program.  You can, however, use the SETDEF command to set up a 
  132. search chain the the CCP will follow to try to find the program.
  133.  
  134. If you have more than one drive or a RAM expansion unit, you 
  135. should have a SETDEF command in your PROFILE.SUB so it will be 
  136. executed everytime you boot the system.  SETDEF is very easy to 
  137. use; just type "SETDEF" at the system prompt, followed by a 
  138. series of drive letters (up to four).
  139.  
  140. For instance, I have a RAM expansion unit and four other drives.  
  141. I always have some often-used utilities in the RAM expansion 
  142. (drive M), so I want the CCP to check there first.  My drive D is 
  143. a 1581, where I keep a disk containing another 700K or so of 
  144. handy utilities, like NULU, CRUNCH, UNARC, etc., so I want it to 
  145. check there second.  Drive A is where I run most of my 
  146. applications, so that drive should also be checked for a command. 
  147. Lastly, if the file is not found on any of those drives, I want 
  148. the CCP to look on drive B or C, if either is the current default 
  149. drive.  The following command will set up that search chain:
  150.      A>setdef m:,d:,a:,*
  151. The asterisk tells the CCP to check the default drive.  You don't 
  152. have to enter four drives.  If you only have one drive and a RAM 
  153. expansion, you would use:
  154.      A>setdef m:,a:
  155.  
  156. If you have a RAM disk, you should probably also include a second 
  157. switch on the command line:
  158.      A>setdef m:,d:,a:,* [temporary=m:]
  159. That switch causes SUBMIT to create its temporary files on the 
  160. RAM disk and your SUBMIT batch jobs will execute like lightning.  
  161. (Without the above SETDEF switch, SUBMIT defaults to drive A.)
  162.  
  163. SETDEF doesn't change the CCP in any way.  I just puts the drive 
  164. search chain in a data structure called the System Control Block, 
  165. where the CCP (and LOADKEY) can find it.
  166.  
  167.  
  168. PROGRAM NOTES:  Although Commodore's KEYFIG program allows 
  169. extremely flexible use of the keyboard, I never made use of the 
  170. function keys with applications programs because of the time it 
  171. took to change them and then change them back when I was through. 
  172. I dreamed of having a program to save definitions to disk so I 
  173. could change the function keys quickly.  After waiting for a year 
  174. and a half for one to appear, I decided I was going to have to 
  175. write it myself.  The result was SAVEKEY and LOADKEY versions 1.0 
  176. released February 25, 1987.
  177.  
  178. These two utilities are very small, so they load fast and work 
  179. fast.  SAVEKEY takes a little more time to open and write a file, 
  180. but LOADKEY can load itself and a keyboard definition in about 
  181. two seconds.  To keep them small there is minimal error trapping; 
  182. most errors during the disk read or write will abort the programs 
  183. with a BDOS error.  Still both programs make checks for illegal 
  184. characters in the filename and SAVEKEY checks for problems like a 
  185. full directory or full disk during the file write.
  186.  
  187. The BIOS MOVE and XMOVE routines are used to move the key table 
  188. between banks 0 and 1.  The routines are called more or less 
  189. directly by offsetting to the BIOS jump table.  I tried to make 
  190. these BIOS calls the "right" way by calling them indirectly 
  191. through BDOS function 50.  In fact, I tried repeatedly to get 
  192. that method to work through three versions now.  I couldn't.  I 
  193. don't know whether the problem is in the BDOS, in the BIOS, or in 
  194. my methods, so if anybody finds the solution I wish they would 
  195. let me know what it is.  In earlier versions I used direct 
  196. addressing into the BIOS, which worked with Commodore BIOS's, but 
  197. did not work with a modified public domain BIOS I ran across.  
  198. The offset method now used should work with any C128 BIOS, no 
  199. matter how extensively it is modified, as long as the key table 
  200. remains at 1000h in bank 0.
  201.  
  202. I put the drive chain search in this version because I sometimes 
  203. forgot to put a drive specification in the command line and 
  204. watched LOADKEY bomb with a "file not found" message.  I have 
  205. four drives and sometimes I wasn't sure which drive the file was 
  206. on, anyway.  The search chain shows what would be possible for 
  207. many commercial programs with overlays, such as WordStar or dBase 
  208. II, if they had been written for CP/M Plus.  Nevertheless, we can 
  209. use this method for programs we write that require overlays or 
  210. other special files.  The SEARCH subroutine in the LOADKEY source 
  211. code is relatively short and easy to understand.  It receives the 
  212. address of the File Control Block in HL and, if it finds the 
  213. file, it returns with the file already open for reading and the 
  214. FCB updated to the correct drive.  If the file is not found 
  215. anywhere in the chain, it returns with the zero flag set.
  216.  
  217. The search pattern is modelled on the one followed by the CCP in 
  218. that the chain is not followed if a drive specification is given 
  219. for the file.  The only difference is that the CCP checks the 
  220. current user area and then checks user 0, while the SEARCH 
  221. subroutine only checks the current user area on each drive.  I 
  222. don't believe that many Commodore owners are using user areas, so 
  223. I didn't include that feature.  It would be easy to add, however, 
  224. so if I'm wrong please let me know.
  225.  
  226. ZCPR3 uses a similar but incompatible technique to search for 
  227. files.  I would be nice if a few of you would try converting some 
  228. of ZCPR's more useful utilities, such VFILER, to CP/M Plus.  The 
  229. source code is available from most Z-Nodes and from SIG/M.
  230.  
  231. In my public domain DISKNUM program, I used another technique 
  232. which allowed the program to determine which drive it was loaded 
  233. from.  Like the drive search chain, it's easy under CP/M Plus, 
  234. but not available under earlier versions of CP/M.
  235.  
  236.  
  237. HISTORY:  Version 1 was released February 25, 1987.  I haven't 
  238. been notified of any bugs and I haven't discovered any myself.  
  239. However, if you have a file with a .KEY filetype that isn't a key 
  240. definition file saved with SAVEKEY and you tell LOADKEY to use 
  241. it, LOADKEY will promptly load it, or the first eight sectors of 
  242. it if it's a long file, and crash your system.
  243.  
  244. Version 2 was released May 23, 1987.  The most noticeable change 
  245. is that my name is no longer displayed in the screen sign-on 
  246. message.  I decided that was an ego trip I should no longer 
  247. inflict on the rest of you.  I also converted some of the opcodes 
  248. to Intel Z80 macros available in Z80.LIB.
  249.  
  250. The most important change in version 2 is for sophisticated batch 
  251. users.  If the .KEY file is not found, or any other error occurs, 
  252. a failure return code is sent to the BDOS for use during 
  253. conditional batch jobs.  For instance, if you have a .KEY file 
  254. you use with WordStar, you could issue the following command line:
  255.      A>loadkey ws!:ws sample.doc
  256. Notice the colon before the second command.  If LOADKEY does not 
  257. find WS.KEY on a drive in the drive chain, it issues a "File Not 
  258. Found" message, sends a failure code to the BDOS, and the CCP 
  259. does not execute the second command to load and run WordStar.  
  260. Without the colon WordStar would be loaded anyway.  This same 
  261. procedure will also work in SUBMIT files.
  262.  
  263. Version 3, released January 16, 1988, adds a good deal of error 
  264. trapping, including an attempt to verify the validity of the .KEY 
  265. file before it is moved to the BIOS, detection of illegal 
  266. characters and wildcards in the filename, full directory, etc.  
  267. LOADKEY also adds a SCB drive chain search if a drive 
  268. specification is not given for the key table file.
  269.  
  270.  
  271. RE-ASSEMBLY:  Although I use SLRMAC for assembly language 
  272. programming, both these programs can be re-assembled with MAC if 
  273. you change the filetype from .MAC to .ASM.  In addition, you must 
  274. have Z80.LIB on the default drive or use the $Ld switch (where d 
  275. is the drive) to tell MAC where it can find Z80.LIB.  Z80.LIB is 
  276. included with the additional utilities from Commodore you got by 
  277. sending in that card in your manual.  If you didn't send the card 
  278. in, you won't have MAC and HEXCOM, so you won't be able to re- 
  279. assemble these programs anyway.
  280.  
  281.  
  282. If you have any problems with either of these programs, or if you 
  283. have any suggestions for improvements, please let me know by 
  284. letter, telephone, or through one of the bulletin boards below.  
  285. Happy computing!
  286.  
  287.                                    Eugene L. Pizzetta
  288.                                    481 Revere Street
  289.                                    Revere, MA  02151
  290.  
  291.                                    Voice:  (617) 284-0891
  292.                                    CompuServe:  72060,505
  293.                                    Q-Link:  GeneP
  294.                                    GEnie:  E.Pizzetta
  295.