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 / S / ZPM3N08.ARC / BIOS.TXT < prev    next >
Text File  |  1992-05-27  |  11KB  |  230 lines

  1.           NOTES on your CP/M 3.0 BIOS and ZPM3
  2.           ====================================
  3.                  Last updated 19/4/92
  4.  
  5. ZPM3 will work fine with your current CP/M 3.0 BIOS. This 
  6. document is not meant to tell you how to change your BIOS for 
  7. ZPM3, but rather to point out some interesting and useful facts 
  8. about the way ZPM3 uses the BIOS, and how you should configure 
  9. your BIOS.
  10.  
  11.  
  12.  
  13. XMOVE routine.
  14. ~~~~~~~~~~~~~~
  15. If you have 128 byte physical sectors, or your BIOS does all the 
  16. deblocking so that it appears to the BDOS that you have 128 byte 
  17. physical sectors, XMOVE does not get used at all by ZPM3. Such 
  18. was not the case with CP/M 3.0 which would make redundant calls 
  19. to XMOVE. Make sure XMOVE is implemented and working anyhow as 
  20. applications may attempt to use it.
  21.  
  22. When the BDOS is operating in the system bank (bank 0) and it 
  23. needs to move data in the TPA bank, it switches to the TPA bank 
  24. and does an ordinary LDIR. As such, XMOVE will never get called 
  25. by the BDOS with B=C (source bank and destination bank the same).
  26.  
  27. In the CP/M 3.0 manuals, there are two differing opinions about 
  28. XMOVE as far as whether B is the source or the destination. The 
  29. truth is that C is the source and B is the destination. Anything 
  30. you see to the contrary is a misprint.
  31.  
  32. MOVE routine.
  33. ~~~~~~~~~~~~~
  34. When CP/M 3.0 was released, it was made 8080 compatible simply 
  35. because CP/M 2.2 was 8080 compatible. I have never heard of an 
  36. 8080 machine running CP/M 3.0, and it is likely that there has 
  37. never been one. Digital Research knew that the Z80 was the CPU of 
  38. choice for modern PC's, and while they wrote their code for the 
  39. 8080, they recognised the Z80 with the MOVE routine (which a Z80 
  40. BIOS could implement in just three instructions).
  41.  
  42. ZPM3 uses the MOVE routine much less than CP/M 3.0 does. In fact, 
  43. the only time ZPM3 uses MOVE is with an XMOVE call directly 
  44. preceding it. If you have 128 byte physical sectors (or the BIOS 
  45. does the sector deblocking), MOVE will never get called.
  46.  
  47. Always remember that MOVE must return with HL and DE pointing to 
  48. the end of the moved data. If they don't, you will have trouble.
  49.  
  50.  
  51. TIME routine.
  52. ~~~~~~~~~~~~~
  53. Be aware that the DATE program supplied with CP/M 3.0 will not 
  54. work properly if your BIOS does not update the SCB with 
  55. interrupts. There have been replacements since then that are 
  56. available in the public domain.
  57.  
  58. One common trap for BIOS writers is forgetting that HL and DE 
  59. must be saved by the TIME routine. There is no obvious reason for 
  60. it, and really they should be saved in the BDOS.
  61.  
  62. ZPM3 does not expect HL to be saved. If you have had trouble with 
  63. your CP/M 3.0 clock things might work now. It was decided that 
  64. seeing as TIME was the only routine (apart from MOVE) which 
  65. required HL to be saved, it was too easy to overlook, and a real 
  66. pain to implement (some systems use HL to switch banks on entry 
  67. to the BIOS. MOVE is always accounted for, but TIME sometimes 
  68. isn't (Morrow MD11 owners take note!)).
  69.  
  70. Ideally, there should be no reason to save HL in your BIOS, 
  71. unless you intend to run CP/M 3.0 sometimes (although I can't 
  72. imagine why). Any applications which attempt to use TIME through 
  73. the function 50 are not guaranteed that HL will be saved anyhow.
  74.  
  75. Buffers.
  76. ~~~~~~~~
  77. CP/M 3.0 (and therefore ZPM3) keeps special disk buffers. The 
  78. system is rather complex. The directory is buffered separately 
  79. from the rest of the disk (and in the case of 128 byte sectors 
  80. the rest of the disk isn't buffered anyhow).
  81.  
  82. You decide how many buffers to give to each disk's directory and 
  83. data, and you may choose to have buffers shared by different 
  84. drives. All these choices can make for lots of fun for the 
  85. hacker, but without knowing much about the internal workings of 
  86. the BDOS how do you best set the buffer up?
  87.  
  88. There are many cases to consider depending on how much RAM you 
  89. have available to allocate to buffers. If you have virtually 
  90. unlimited RAM, you might as well allocate as many buffers as 
  91. GENCPM will allow. The only catch to this is that more buffers 
  92. implies the BDOS will take more time to look through them all 
  93. before coming to the decision that a disk read is required. The 
  94. good news is that the ZPM3 searching algorithm is particularly 
  95. fast.  Empty buffers are discovered even faster than buffers 
  96. which are valid but don't match, so large numbers of empty 
  97. buffers pose very little problem. In general, even with the 
  98. maximum number of buffers, the advantages they give outweigh the 
  99. disadvantages.
  100.  
  101. Of course, few people have unlimited RAM. If you have very little 
  102. room available, spend most of it on the directory buffers. These 
  103. buffers act like a cache of the directory, and can save the disk 
  104. heads from moving back to the directory tracks to find out where 
  105. the next block is stored. Even on very fast hard disks, the 
  106. advantages that decent directory buffers give are great.
  107.  
  108. When dividing up directory buffers between a number of drives, 
  109. consider which drive holds the most files and which drive does 
  110. the most work. A drive which holds a lot of files but is rarely 
  111. accessed is not worth wasting buffers on. If you have a system 
  112. with one hard drive and one floppy drive, and you don't intend to 
  113. use the floppy drive very much, give only one buffer to the 
  114. floppy and all the rest to your hard drive. This will penalise 
  115. the floppy's performance somewhat, but the improvement it gives 
  116. to the hard drive will make it worthwhile.
  117.  
  118. Data buffers, like directory buffers, perform two tasks: 
  119. deblocking of physical sectors, and cacheing. For data buffers 
  120. however the cacheing is the less important job, unless you have a 
  121. lot of data buffers available. The reason for this is that the 
  122. buffer algorithms work by taking the least recently used buffer 
  123. and using it for deblocking. If you are working on a file which 
  124. is 8k long, but you only have 4k of buffers, the BDOS will run 
  125. out of buffers before it has read the whole file and will grab 
  126. the least recently used one even though it contains valid data 
  127. from the file which could be required later on. The result is 
  128. that the BDOS does much searching through its 4k of buffers, but 
  129. rarely finds anything which matches and must read from the disk 
  130. anyhow.
  131.  
  132. In practice the system works a little better than that because of 
  133. the way files are used by most programs, so data buffers are 
  134. still worthwhile, but to take real advantage of their cacheing 
  135. ability you must have more room in the data buffers than the size 
  136. of the file you are working with. With word processors such as 
  137. Wordstar and NewWord creating extra files as they work, you 
  138. really need more than twice as much room in the buffers than the 
  139. size of the file.
  140.  
  141. So you can see why data buffers are less important than directory 
  142. buffers. Something else you should be aware of concerns multi- 
  143. sector i/o and the data buffers. When the BDOS is told to read a 
  144. file it searches its buffers and if it can't find the data there 
  145. it reads it from the disk. Normally it deblocks the data one 
  146. record at a time through its data buffers, leaving the data in 
  147. the buffers in case it is required again. However multi-sector 
  148. i/o does not usually need to deblock its data, so the data is 
  149. sent straight to the TPA without going through the data buffers. 
  150. If any of that data is required again, it will not be in the data 
  151. buffers and must be read from the disk. So two reads of the same 
  152. data using multi-sector i/o might actually be slower than reads 
  153. that are done a sector at a time!
  154.  
  155. And the really important thing about all this is that the CCP 
  156. uses multi-sector i/o to load programs. So if you thought that 
  157. implementing large numbers of data buffers would give you faster 
  158. loading of programs, you were wrong. The data buffers won't help 
  159. program loading unless the data can be put into the buffers 
  160. first.
  161.  
  162. If you use ZCCP, you will find there is a facility to prevent the 
  163. data buffers from being bypassed on program loads. It involves 
  164. simply setting the f1' bit of the file. The idea is that you set 
  165. f1' on all the files which are small enough not to clog up your 
  166. buffers, and then they run as if they are on a ram disk, but one 
  167. in which you can never lose data. The system is quite wonderful 
  168. in that the RAM used to hold the files is available to buffer 
  169. other data if required. Unlike a ram disk, the RAM is dynamically 
  170. allocated and the data is completely safe. But you must be using 
  171. ZCCP, and you must have at least 6k of data buffers before it 
  172. does anything useful. If you currently have a ram disk but few 
  173. data buffers, consider taking a chunk of your ram disk for data 
  174. buffers and switching to ZCCP.
  175.  
  176. CPMLDR bug.
  177. ~~~~~~~~~~~
  178. This is closely related to the subject of buffers because you 
  179. will find that if you increase your buffers past a certain point, 
  180. the system will not boot. Almost certainly you will suspect a 
  181. problem with your BIOS code (you normally should), however the 
  182. CPMLDR.REL code supplied by DRI has a bug in it.
  183.  
  184. You may be wondering if everything DRI did with CP/M 3.0 was 
  185. buggy! I must say that what they achieved was terrific, but it 
  186. had its faults as well. Hopefully ZPM3 has addressed them all.
  187.  
  188. The CPMLDR problem occurs when your CPM3.SYS grows from being 16k 
  189. or less, to over 16k (and therefore two logical extents). You may 
  190. not have this problem under certain drive configurations, but if 
  191. you do, the symptom is that described above.
  192.  
  193. There really is no way of patching around this, but if you have 
  194. your loader BIOS, you can certainly use the (somewhat superior) 
  195. ZPM3LDR.REL code instead. This works very similarly to the DRI 
  196. code, except that it works properly. Unlike the DRI code, you 
  197. will find that ZPM3LDR has all its messages at the head of the 
  198. file so that you can patch them and change them if you wish.
  199.  
  200. ZPM3LDR does not clear the screen on boot up (CPMLDR does by 
  201. sending multiple linefeeds), but you could patch this if you 
  202. like. ZPM3LDR.REL will directly replace CPMLDR.REL. ZPM3LDR 
  203. however does not use the MOVE routine that CPMLDR requires 
  204. (although there is nothing much to be gained by removing it from 
  205. your loader bios code).
  206.  
  207.  
  208. GENCPM bugs.
  209. ~~~~~~~~~~~~
  210. GENCPM has bugs in it. If you can, try and set up all your 
  211. buffers manually. That way you'll know where they are and you are 
  212. in complete control.
  213.  
  214. The biggest fault I have found with GENCPM is that it will 
  215. allocate allocation vectors incorrectly. CP/M 3.0 can use double 
  216. bit allocation vectors, but doesn't necessarily. Sometimes (and I 
  217. think it is mainly with big disks), GENCPM will only allocate 
  218. enough room for single bit allocation vectors when double bit 
  219. vectors had been specified. The symptoms of this are varied, but 
  220. often, you can use your A: drive for a while, but as soon as you 
  221. use your B: drive funny things happen. If you only use A: and C: 
  222. drives, things appear to work OK.
  223.  
  224. The first thing to try if you suspect a GENCPM induced problem is 
  225. setting up with only one drive and a single buffer. If that fixes 
  226. it, the problem could well be with GENCPM.
  227.  
  228. Naturally, your BIOS code could still be the problem, so look out 
  229. for that too!
  230.