home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / gendoc / toadbios.dqc / TOADBIOS.DOC
Text File  |  1985-02-09  |  26KB  |  529 lines

  1.           The Latest Version of Toad Hall's TOADCPM.COM
  2.                     (Version 2.2, 10 Dec 83)
  3.  
  4.  
  5.      Using various patches (credit given below), I've patched CPM 
  6. 2.2 to add some things I've found very useful:
  7.  
  8.  
  9. PRINTER:   In  Version  2.1,  it's  configured for  a  9600  baud 
  10. printer,  using  the Data Ready protocol (donno if it's the  best 
  11. for  my Mannesman Tally,  but it works!).   Version 2.2  now  has 
  12. XON/XOFF,  which  works just fine using exactly the same cabling.  
  13. Seems to cause a bit less delay when simultaneously printing  and 
  14. making  keyboard  entries  during  UNSPOOL  or  WordStar's  PRINT 
  15. utility.   [Note:   As of 10 Dec I went back to Xon/Xoff, just to 
  16. see if there was a difference.  None, really.]
  17.  
  18.  
  19. ASSEMBLY SETTINGS:  (Look at the TOADBIOS.ASM listing for details 
  20. -- it's for the XON/XOFF, 19200 baud Version 2.2, but all changes 
  21. are  fully  documented.)  You'll see it's for a 64K  system  with 
  22. DEBUG set to ON to give me various sizes and locations during MAC 
  23. assembly, and NONSTANDARD set to 1 (donno why; I thought Morrow's 
  24. BIOS  was conventional,  but I'm just following the advice of  my 
  25. vendor/-confidant  Jack  Long at Cost Plus Computers -- and  he's 
  26. batting a thousand so far!).   The original CBIOS&.ASM had at one 
  27. point a value set to DECISION I I/O instead of Mult/IO; suspecting 
  28. this  might  be giving me some problems in  using  the  clock,  I 
  29. changed it to Mult/IO, which is exactly what's in my Decision I.
  30.  
  31.  
  32. DUPLICATE *.COM  FILES:   I  dislike  having  to  duplicate  .COM 
  33. programs  (utilities and other files) in different User Areas and 
  34. disks when my trusty 5 Meg hard disk is just sitting there as the 
  35. default A disk most of the time.
  36.  
  37.     I've  used DUPUSR.COM (a program to put a kind of pointer  in 
  38. each User area directory so you get the name of a program or file 
  39. in that directory, but not the actual file.  This means no actual 
  40. disk  storage  space  used.),  but  DUPUSR  has  one  SEVERE  AND 
  41. DANGEROUS problem:   if you erase a DUPUSR-created file name  and 
  42. don't  hit  CTRL  C right after the erasure,  you can  have  some 
  43. SEVERE directory damage!   About the third time I trashed my hard 
  44. disk  directory through carelessness like this,  I decided  there 
  45. had to be a better way!
  46.  
  47.      I  read an article out in Netland by Neil Maron that gave  a 
  48. patch to make the system look on drive A: if your .COM file isn't 
  49. on the logged in drive.   Additionally,  if it isn't on A: in the 
  50. same  User Area,  it'll look to User Area 0 for that file  before 
  51. giving  up.   This means I can keep all the common utilities  and 
  52. .COM files in User Area 0 on my hard disk,  configure my CP/M  to 
  53. always use the hard disk as A:, and I'm in business.  
  54.  
  55.      There are only a couple of places where this fails me.
  56.  
  57.     a.   WordStar:   You can have WS.COM on disk A,  User Area 0, 
  58. all  right,  BUT  you  must have the *.OVR files it uses  in  the 
  59. default disk (A for me) and the User Area you're working in!   WS 
  60. can  be  installed or patched to look to a default disk  for  its 
  61. .OVR files,  but it does NOT know how to look to User Area 0!  No 
  62. problem,  really  -- this  is  where I take the  chance  and  use 
  63. DUPUSR.   I  DUPUSR the .OVR files to all appropriate User  Areas 
  64. where  I might want to run WS.COM.   I naturally use STAT to make 
  65. the  .OVR  files Read/Only and $SYS so they don't clutter  up  my 
  66. directory  and I won't erase them by accident.   I  don't  bother 
  67. copying  WS or the .OVR files to other disks,  but instead depend 
  68. on the default disk (A).
  69.  
  70.      b.  MBASIC (Microsoft BASIC v.  5.1) doesn't seem to want to 
  71. accept  a  compound command line like MBASIC STARTREK  if  MBASIC 
  72. isn't actually on that disk or in that User Area.   (I think it's 
  73. a function of Neil's patch only looking at the .COM file name and 
  74. not handling the STARTREK extension properly.)  No big problem -- 
  75. I  have  two options:   (1)  RUN MBASIC (which works  just  fine, 
  76. reaching  out to A:  and then if necessary User Area 0 on  A:  to 
  77. find  MBASIC)  and then when in MBASIC,  LOAD or RUN  whatever  I 
  78. want; or (2) DUPUSR MBASIC into necessary User Areas so I'll know 
  79. it's there.  (Again protect it with R/O and $SYS.)
  80.  
  81.     c.  SUBMIT may give some problems.  So far I've had none, but 
  82. there are lots of fancy applications,  modified SUBMITs, etc. out 
  83. there  where  this may hang up.   If there's a problem  with  any 
  84. SUBMIT applications,  just DUPUSR it into the User Area requiring 
  85. SUBMIT applications and forget about it.
  86.  
  87.     d.   My library is a bit limited,  but if you have any  other 
  88. fancy  programs  that  do lots of overlaying,  calling  in  other 
  89. programs,  etc.,  you'd better not depend on this A:  User Area 0 
  90. patch working correctly.   I suspect Visicalc, DBaseII, and those 
  91. kinds of application programs won't take kindly to it!
  92.  
  93.      One  thing -- if you DON'T have your hard disk set up as  A, 
  94. then you need to change those JMPs around.   Make CP/M first look 
  95. to User Area 0 on the present disk,  and then to Drive  A.   That 
  96. way,  if  you're working in your hard disk,  it'll check out User 
  97. Area  0  there  first before running off to  look  at  some  poor 
  98. innocent floppy.  
  99.  
  100.  
  101. USER AREA WITH > PROMPT:   I HATE not knowing which User Area I'm 
  102. in,  and  I've had some real problems.   Examples:   You get  the 
  103. infamous  BDOS ERR ON d:  error message;  you get kicked back  to 
  104. User  Area  0 automatically;  you don't know or remember  it  and 
  105. erase or do something to a file;  and successfully trash the very 
  106. special,  unique,  and  wonderful file in User Area 0 you had  NO 
  107. intention of messing with!
  108.  
  109.     In any case,  it's a pain having to go back to the right User 
  110. Area  again.   The  original  code was written by  Bruce  Kendall 
  111. (address unknown)  7-12-80,  and  tightened up  by  Bruce  Ratoff
  112. 11-17-80.  I made all the Morrow Decision CP/M-specific stuff.
  113.      Basically, it patches a little CALL into the portion of your 
  114. CCP  that prints the > prompt,  reaches out to a wee little patch 
  115. that was poked into an area of NOPs in the CCP that gets the User 
  116. Area and then displays current disk,  user area (in hex  -- sorry 
  117. abot that -- had to keep it small),  and > prompt, and goes right 
  118. on about its business!   Real simple.  [Note:  I grabbed a little 
  119. routine  from another program (donno where),  and made this patch 
  120. now print the User Area in decimal after the disk.   Couldn't  do 
  121. this  with  a  "hot patch" in the actual BIOS;  had to do  it  in 
  122. assembler in the source code.  If you HAVE source code, great!]
  123.  
  124.     The  TOADCPM.COM  on this disk (assuming you have  the  disk) 
  125. includes that patch.   The code is at the end of this article  if 
  126. you  want  to  implement  it yourself in  your  own  BIOS.   It's 
  127. definitely nice to have,  and not at all hard to implement.  Note 
  128. that  I  did NOT make this a stand-alone little  program  that'll 
  129. reach out and patch your CP/M in memory.   You'll have to use DDT 
  130. for this,  and if you aren't sure of the procedures,  a  step-by-
  131. step  (hopefully eminently logical and easy to follow)  procedure 
  132. is  outlined right after the source code.
  133.  
  134.     The  memory locations given are for Morrow Design's CP/M  for 
  135. their Decision I (where the CCP starts at 0B00H in the DDT image, 
  136. and at D400H in real memory).  If your CCP starts somewhere else, 
  137. you'll  have to figure out your own locations for  COUT  (console 
  138. out), GTCMD (Get Command), PATCH (my patch in the NOP area of the 
  139. CCP),  etc.   Not  very hard -- you can use the H tool in DDT  to 
  140. figure  out some offsets.   (If you're doing these hacks in  your 
  141. own CCP and BIOS,  it's time for you to figure out DDT,  offsets, 
  142. DDT images, real images, etc. anyway!)
  143.  
  144.  
  145. AUTOSTART:   There  have  been several articles around on how  to 
  146. make   a  "turn-key"  system  with  CP/M  and   its   "Autostart" 
  147. capability.   Basically,  they  involve making a version of  CP/M 
  148. that has a .COM file name already in the CCP where CP/M looks for 
  149. a  program  name  to execute.   When you boot up (cold  or  warm, 
  150. depending),  that program will run.  One article fully explaining 
  151. it is "'Turn-Key' CP/M Systems" by James J.  Frantz, published in 
  152. Creative Computing,  December 1979.   (It's for CP/M Version 1.4, 
  153. but not to worry - that part still is the same in Ver 2.2.)
  154.  
  155.     One little problem with this,  though!  Morrow's CBIOS& has a 
  156. kind of switch (variable name AUTOST) in the source code that you 
  157. have to turn on for Autostart to work!  You have several options:  
  158. Never, only on cold boot, only on warm boot, and on both cold and 
  159. warm boot.   This version is engaged for warm and cold boot.  The 
  160. default command "AUTO" is plugged in at the front of the CCP, but 
  161. will  have  absolutely  no  effect so long as you  don't  have  a 
  162. AUTO.COM file in User Area 0!  If you do ... it'll run!  (You can 
  163. get  rid of this with DDT by replacing from 0B07H (DDT image)  up 
  164. to the remaining 20's with 20, and then SAVE 48 TOADCPM.COM. 
  165.  
  166.      If  you're  hacking  up  a special  CP/M  for  an  Autostart 
  167. program,  the warm boot and cold boot commands can be entered  as 
  168. DB's  right  around  page  12 of Morrow's CBIOS  Revision  E  for 
  169. Version  2.2  (Mar 4 1982) as provided with my  Decision  I.   In 
  170. memory,  if you want to poke it into your CCP,  it's right at the 
  171. very  start  of your CCP (0B00H in the DDT image  on  my  system) 
  172. where you can see the Digital Research copyright.
  173.  
  174.      I'm not going to give that full procedure here -- plenty  of 
  175. other references out there already published.  But you can put it 
  176. right in your CBIOS while editing it a lot easier than looking up 
  177. hex and poking into memory.   Remember,  though -- just poking in 
  178. the  Autostart command (with its accompanying requirements,  like 
  179. length of command in CCP+7, and a NOP or 00 after the command) is 
  180. NOT sufficient with Morrow's CBIOS!   You HAVE to turn that Auto-
  181. start switch on!  (Drove me crazy for a while until I figured out 
  182. that was the problem!)
  183.  
  184.  
  185. COLDBOOT  TO  YOUR HARD DISK:   My system originally used  an  8" 
  186. floppy  to cold-boot,  and then I had to run "BOOTMW" to make  my 
  187. hard disk A:.  This was a bit of bother, and I accidentally found 
  188. the  answer:   Load the Hard Disk version of CP/M on the  floppy!  
  189.  
  190.      Morrow  supplied me with MOVCPM-5 to create a CP/M for my  5 
  191. Meg hard disk,  and that's what I used (SYSGENing it to the  hard 
  192. disk,  etc.).   Fine  and  dandy -- saved a nice CPM-HD on  file.  
  193. Then  I accidentally used DDT to do some patches on THAT  version 
  194. of CP/M,  saved it,  and SYSGENed it onto an 8"  floppy!   (Never 
  195. would  have  done  it on purpose -- obviously a  hard  disk  CP/M 
  196. shouldn't  be on a floppy!)  Damned if it didn't work just  fine!  
  197. I put in the floppy, do a reset, she boots, and bingo -- the cold 
  198. boot message comes on, showing the HDCMA hard disk as A:, and the 
  199. 8"  as  B:.   And in fact,  that's what's happened -- not just  a 
  200. bogus message.  Works fine, and I've had no problems whatsoever.
  201.  
  202.     One  little  thing:   You  need the new  improved  CP/M  with 
  203. improved  TDBIOS on your hard disk too,  else the warm boot  just 
  204. boots up the old normal CP/M.  So SYSGEN TOADCPM (or your version 
  205. of your hard disk CP/M with TOADBIOS.ASM) onto both your floppies 
  206. and  your  hard disk.   Works - guaranteed.   (Keep a  couple  of 
  207. floppies around with a normal (i.e., A: is a floppy) just in case 
  208. your hard disk goes down some day!)
  209.  
  210.  
  211. TERMINAL/SERIAL BAUD UPGRADE:   Version 2.2 relies on a different 
  212. approach.   Jack  Long  at  Cost-Plus said he tried  to  set  the 
  213. switches  on the CPU board to have the Decision I do a cold  boot 
  214. from the hard disk.   Worked,  OK,  but then refused to recognize 
  215. any  other  disks!   This put me off for a while,  but  found  my 
  216. technique of booting from a floppy and switching over to the hard 
  217. disk  was giving me problems when I tried to upgrade my I/O board 
  218. and terminal to 19,200 baud.
  219.  
  220.      The Mult/IO board has no baud rate switches at all, and will 
  221. initialize at 9600 baud.  On a cold boot, the Morrow Designs CP/M 
  222. bots from the floppy, loads the monitor (the FFFF: business), and 
  223. then  expects some sort of monitor command.   ("B" is all  that's 
  224. necessary  to tell it to boot off the PROM.)   Unfortunately,  if 
  225. the  Mult/IO board is running at a default 9600  baud,  and  your 
  226. terminal  is set to 19200,  the doggoned monitor can't read  that 
  227. "B",  and you never WILL get booted!  Real hassle, that -- and if 
  228. you  cold boot with everything set at 9600,  then you have to use 
  229. Morrow Design's BAUD.COM to kick up the CPU board and Mult/IO  to 
  230. 19200,  physically  kick  up the terminal to 19200 (can't send  a 
  231. command to it,  you know -- not if the serial port's putting  out 
  232. twice as fast as the terminal can read!) ... a real pain!
  233.  
  234.      Finally  got it working by setting the console default  baud 
  235. rate  to  19200,  setting  the terminal switches  to  19200,  and 
  236. setting  Switch 6 on the Morrow CPU board to ON (engages  a  cold 
  237. boot from the floppy,  skips the monitor, and boots right up with 
  238. no  terminal  input required.   The CBIOS initializes the  serial 
  239. port to 19200,  using that default baud rate, before the terminal 
  240. ever comes into play.
  241.  
  242.      One little side effect I STILL haven't figured out:   every-
  243. thing  boots  up  fine (provided you gave the  hard  disk  a  few 
  244. seconds  to  come up to speed before hitting that reset  button), 
  245. but  after  the cold boot message and A0> prompt,  I  get  a  ^Q!  
  246. Donno  why  - think I'm overflowing the buffer with my cold  boot 
  247. message.  No big thing; hope to fix it soon.
  248.  
  249.      I  have  not yet tried to cold boot from the hard  disk  (by 
  250. setting switches 1 through 5 to ON ON ON ON ON.   I don't  really 
  251. like  the  idea since it demands a lot of a barely  running  hard 
  252. disk that MIGHT not be up to speed yet!  
  253.  
  254. [Note:   I've now added modem port (serial port 3) initialization 
  255. to 1200 baud on cold boot and port  initializations.   Sorry,  no 
  256. code  here  since it's quite Morrow-specific;  will add  to  this 
  257. document later.]
  258.  
  259. COMPANY  CREDIT LINE ON COLD BOOT:   You can see the little "Toad 
  260. Hall" logo come on,  plus some patch comments,  on the cold  boot 
  261. message.   Easy  - just added it into the CBIOS when editing  it.  
  262. That's on page 76 of Morrow's CBIOS& listing, way toward the end.  
  263. Just add in whatever you want (well,  keep it reasonable -- don't 
  264. want  to make this CBIOS TOO big,  you know!)  Don't forget  ACRs 
  265. and ALFs (carriage returns and line feeds) where appropriate.   I 
  266. mentioned above that ^Q problem after a cold boot.   I suspect it 
  267. comes  from an excessive cold boot message,  so be  warned!   [It 
  268. didn't!   Still don't know the answer.  Suspect just some garbage 
  269. left  around  the  Multi I/O board that wasn't  purged  correctly 
  270. after  initialization  that shows when running  the  terminal  at 
  271. 19200 baud!]
  272.  
  273.  
  274. MISCELLANEOUS LOCATIONS:  If you MAC TOADBIOS.ASM, you'll get most 
  275. of these as a DEBUG message.  However, just for your information:
  276.  
  277.      OFFSETC        3700           Offset in CP/M when R'ing
  278.                                    TOADBIOS.HEX on top of your
  279.                                    CPM64.COM in DDT.
  280.      CCP            D400           Start of CCP in real memory
  281.      CCP            0B00           Start of CCP in DDT image
  282.      BDOS           DC00           Start of BDOS in real memory
  283.      BIOS           EA00           Start of TOADBIOS in real memory
  284.      BIOSLN         16             Length of TOADBIOS in pages.
  285.      BIOSHEXLN      0F00           Length of TOADBIOS in hex.
  286.      CCPLEN         800            Length of CCP in hex.
  287.  
  288.      USRPTCH1       0E8D           Actual location in DDT image
  289.                                    of first User Area Patch.
  290.      USRPTCH2       20F0           Beginning of second User Area
  291.                                    patch in NOP area of DDT image
  292.                                    of CCP.
  293.                     CAD3           First patch in CCP to 
  294.                                    jump to second patch in CCP
  295.                                    for A: User Area 0 default.
  296.                     1DB3           Location in DDT image of
  297.                                    first patch.
  298.      PATCH          12F2           DDT image location of larger
  299.                                    patch in CCP for default A:.
  300.      PATCH1         EC50           Real memory location in 
  301.                                    TOADBIOS of default code.
  302.  
  303.                     - - - - - - - -
  304.  
  305. USER AREA DISPLAY CODE:
  306.  
  307. DDT IMAGE      INSTRS & REAL MEMORY LOCATIONS
  308.  
  309. 0E82      LXI  SP,DBAB        ;original code
  310. 0E85      CALL D498           ;    "    ", flush
  311. 0E88      CALL D5D0           ;    "    ", get drive
  312. 0E8B      ADI  41             ;    "    ", 'A'
  313. - - - - - and here's the patch - - - - -
  314. 0E8D      CALL E9F0           ;patch - was CALL D48C, console out
  315. - - - - - end of patch - - - - -
  316.           MVI  A,3E           ;original code - '>'
  317.           CALL D48C           ;    "    ", console out
  318.           CALL D539           ;    "    ", get cmd
  319.  
  320.  
  321. ext patch is in an area of NOPs in the CCP - check to be sure!
  322. (And  don't  get  too  low in  that  area:   I  think  it's  disk 
  323. parameters  or something!   Go too low with your patch and  it'll 
  324. get  overlaid  and eaten up!)  If something's  there,  just  find 
  325. about  1 1/2 lines of NOPs somewhere in your CCP where this  will 
  326. fit  (maybe  just  before the BDOS where there's  sometimes  some 
  327. room).   Use DDT's A (for Assembly) instruction to stick in  this 
  328. stuff just like you see it.   If your CCP does NOT start at D400, 
  329. then you'll have to figure out an offset.  Best place to do this, 
  330. of  course,  is  in your CBIOS in assembly -- makes it  all  much 
  331. easier to squeeze.
  332.  
  333. DDT LOC   REAL MEMORY LOCATIONS
  334.  
  335. 20F0      CALL D48C           ;console out routine
  336.           CALL D513           ;get user routine
  337.           ADI  90H            ;routine to convert to number
  338.           DAA
  339.           ACI  40H
  340.           DAA
  341.           JMP  D48C           ;console out again, which returns
  342.                               ;us automatically to right after
  343.                               ;the first patch at 0E8D where
  344.                               ;things continue like normal.
  345. [Note:   above  was per the original patch.   My patch NOW  reads 
  346. like this to produce the decimal user area:
  347.  
  348. USRPTCH:
  349.           CALL 0D48CH         ; Console Out routine.
  350.           CALL 0D513H         ; Get User routine.
  351.           CPI  10             ; If User # >9, print leading 1.
  352.           JC   DUX
  353.           PUSH PSW            ; Save A w/User #.
  354.           MVI  A,'1'          ; Load the 10 digit for Conout
  355.           CALL 0D48CH         ; Conout.
  356.           POP  PSW            ; Get A w/User # back.
  357.           SUI  10
  358. DUX:      ADI  '0'
  359.           ORA  A              ; Clear flags.
  360.           JMP  0D48CH         ; Print second digit.
  361. ; End of patch
  362.                               
  363. I include the original code below,  just for reference.   It has 
  364. the original locations, plus my patched Morrow locations.
  365.  
  366. ;  --- PATCH TO CP/M 2.X TO LIST USER # IN DRIVE PROMPT ---
  367. ;        ( VALID FOR CP/M 2.0, 2.1, AND 2.2)
  368. ;        BY BRUCE KENDALL (TKI)
  369. ;              7/12/80
  370. ;        TIGHTENED UP BY BRUCE RATOFF
  371. ;             11/17/80
  372. ;
  373. ;    IF YOU HAVE TRIED PLAYING WITH THE  'USER' COMMAND
  374. ;    IN CP/M 2.X, YOU MAY HAVE BECOME ANNOYED THAT THERE
  375. ;    WAS NO WAY OF TELLING WHAT USER AREA YOU WERE IN.  THIS
  376. ;    PATCH SOLVES THIS PROBLEM BY DISPLAYING THE USER NUMBER
  377. ;    IN HEX ( A SINGLE CHARACTER SINCE USER # : 0-15 ARE VALID)
  378. ;    BETWEEN THE DRIVE NAME LETTER AND THE '>'. THAT IS, A USER
  379. ;    LOGGED INTO USER AREA #4 WOULD SEE THE STANDARD CP/M 
  380. ;    PROMPT (MODIFIED BY THIS PATCH) AS:
  381. ;        A4>       ( INSTEAD OF JUST A>)
  382. ;
  383. MSIZE    EQU    64    ; CP/M SYSTEM SIZE IN KB
  384. ;
  385. DELTA    EQU    1000H    ; OFFSET FROM STD CP/M SIZE
  386.             ; THIS WOULD BE SET TO 400H IF
  387.             ; THE 20K CP/M WAS ACTUALLY A 19K
  388.             ; CP/M (WHEN COMPARED TO THE STD
  389.             ; 20K CP/M DESCRIBED IN THE CP/M
  390.             ; MANUALS FROM DIGITAL RESEARCH).
  391. ;
  392. BIAS    EQU    (MSIZE-20)*1024-DELTA ; OFFSET FROM 20K CP/M
  393. CCP    EQU    3400H+BIAS
  394. ;
  395. OFFSET    EQU    980H-CCP ; OFFSET USED WITH  DDT IN 
  396.             ; SYSTEM CONFIGURATION (ASSUMES
  397.             ; THAT 'CCP' OCCURES AT 980H IN THE
  398.             ; SYSGEN MEMORY IMAGE).
  399. ;
  400. COUT    EQU    CCP+8CH ; CCP CONSOLE OUTPUT ROUTINE
  401. GTUSR    EQU    CCP+113H ; CCP GET USER # ROUTINE
  402. ;
  403.     ORG    CCP+38DH
  404. ;
  405.     CALL    PATCH    ; THIS WAS A   CALL  COUT
  406. ;
  407. ; -----------------------------------------------
  408. ; NOTE THE CODE IN THE NEIGHBORHOOD OF THIS PATCH WAS
  409. ; USED TO PRINT OUT THE 'A>' PROMPT:
  410. ;
  411. ; CCP+382H:
  412. ;    LXI SP,----
  413. ;    CALL    FLUSH    ; RESET BUFFERS
  414. ;    CALL    GTDRV    ; GET DRIVE #
  415. ;    ADI    'A'    ; ADD IN ASCII BIAS
  416. ;    CALL    COUT    ; <--- MAKE PATCH HERE
  417. ;    MVI    A,'>'    ; GET '>'
  418. ;    CALL    COUT    ; PRINT IT OUT
  419. ;    CALL    GTCOMD    ; GET CONSOLE COMMAND
  420. ;      .
  421. ;      .
  422. ; -------------------------------------------------
  423. ;
  424.     ORG    CCP+15F0H    ; PATCH AREA AT END OF BDOS
  425. ;
  426. PATCH:    CALL    COUT    ; OUTPUT CHAR. IN ACC TO CONSOLE
  427.     CALL    GTUSR    ; GET USER #
  428.     ADI    90H    ; USE INTEL HEX/ASCII TRICK
  429.     DAA
  430.     ACI    40H
  431.     DAA
  432.     JMP    COUT    ; PRINT OUT AND RETURN
  433. ;
  434. ; ------------------------------------------------------
  435. ; NOTE: THE 'GTUSR' COMMAND IS JUST A SHORT ROUTINE:
  436. ;
  437. ;GTUSR:    MVI    E,0FFH
  438. ;    MVI    C,32
  439. ;    JMP    05
  440. ; ------------------------------------------------------
  441. ;
  442.     END
  443.                          - - - - - -
  444.  
  445.  
  446. DEFAULT TO A: 0 CODE
  447.  
  448. I  gave you CCP+n locations this time so you can offset from  your 
  449. DDT  image  of  the start of your CCP.   You still  have  my  own 
  450. values, given my real memory CCP at D400 and BIOS at EA00.
  451.  
  452.                               REAL MEMORY LOCATIONS
  453.                               IN MY SYSTEM
  454.  
  455. CCP       EQU  0D400          D400      ;start of CCP
  456. GTUSR     EQU  CCP+113H       D513      ;Get user number routine
  457. STUSR     EQU  CCP+115H       D515      ;Set user number
  458. CCPMFCB   EQU  CCP+0D0H       D4D0      ;Open file at CPMFCB$
  459. CPMTYPE$  EQU  CCP+7D6H       DBD6      ;type field in CPMFCB$
  460. CMDSK$    EQU  CCP+7F0H       DBF0      ;loc of disk given in cmd
  461. CMDERR    EQU  CCP+76BH       DB6B      ;loc to type error in cmd
  462. WIN       EQU  CCP+6DEH       DADE      ;go here if we get file open
  463.  
  464. DDT IMAGE      INSTRS & REAL MEMORY LOCATIONS
  465.  
  466. 11DB      JZ   CCP+6DBH       DADB      ;replaces JZ DB6B in my
  467.                                         ;system.  Loc of cmd err
  468. 12F2      PATCH:              DDF2      ;replaces an unused area
  469.                                         ;of NOPs - check!!
  470.           LXI  H,CMDSK$       DBF0      ;get drive from curr cmd
  471.           ORA  M                        ;A=0 on entry, so fetches
  472.                                         ;drive
  473. ;in next line, if explicit drive given go try User 0
  474. ;(this will be escape even if we force A: in our cmd line
  475.           JNZ  PATCH1         EC50      ;Wherever you put that
  476.                                         ;new code in your CBIOS.
  477.                                         ;I put it here -- you can
  478.                                         ;find it by looking up
  479.                                         ;PATCH1 in the SYM table
  480.                                         ;generated by MAC
  481.           INR  M                        ;force explicit reference
  482.                                         ;to drive A
  483.           LXI  D,CPMTYPE$     DBD6      ;need DE set up to this
  484.                                         ;on entry to CCP
  485.           JMP  CCP+6CDH       DACD      ;Now to reenter CCP
  486.  
  487. The  following  code must be patched into a blank  area  of  your 
  488. CBIOS  or entered into CBIOS&.ASM prior to assembly.   Be sure to 
  489. call it PATCH1 or something distinctive (and NOT like anything in 
  490. CBIOS&  or you'll have problems!) so you can find it in  the  SYM 
  491. table.
  492.  
  493. Arrive here because explicit drive set or can't find file on A:
  494.  
  495.      PATCH1:                  EC50      ;in my TOADBIOS version
  496.           CALL GTUSR          D513      ;get user code
  497.           ORA  A                        ;set flags
  498.           JZ   CMDERR         DB6B      ;already user 0 so we
  499.                                         ;fail - .COM file isn't
  500.                                         ;anywhere!
  501.           MOV  E,A                      ;get old value into E
  502.                                         ;for later
  503.           PUSH D                        ;save it
  504.           MVI  E,0                      ;set USER=0
  505.           CALL STUSR          D515
  506.           CALL OCPMFCB        D4D0      ;try Open again
  507.           POP  D                        ;get old user code back
  508.                                         ;before we save flags
  509.           PUSH PSW                      ;now save flags from call
  510.           CALL STUSR          D515      ;now go set back to old
  511.                                         ;user number
  512.           POP  PSW                      ;get flags back from
  513.                                         ;OPEN call
  514.           JNZ  WIN            DADE      ;we found it!
  515.           JMP  CMDERR         DB6B      ;nope, nowhere!
  516.                          - - - - - - - -
  517.  
  518. That's  the code.   Hopefully you can make it work.   I'm only  a 
  519. novice Assembler programmer, and managed just fine!  Kind of fun, 
  520. too!  (Kind of nice at parties -- "What, you don't read hex?  And 
  521. don't work in Assembler either?")
  522.  
  523.                        David P Kirschbaum
  524.                           SGM, US Army
  525.                             Toad Hall
  526.                        7573 Jennings Lane
  527.                      Fayetteville NC  28303
  528.   
  529.