home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol006 / zxhints.doc < prev    next >
Text File  |  1984-04-29  |  8KB  |  141 lines

  1.  
  2. *****    Notes on ZX65R v 2.1 and ZXLDR v 2.1    9/80    RMK
  3.  
  4.     The ZX65R program and source listings on this disk represent a
  5. substantial improvement over those published in DDJ #47.  The 'R' in the
  6. program names means 'relocatable', and that means that the same ZX65
  7. .COM file will now run on any size CP/M machine (except Heath/Zenith,
  8. TRS80, and any others using odd memory configurations).  This has been
  9. accomplished mainly through a new loader, ZXLDR.  This loader contains
  10. a complete relocation map for ZX65R.  It finds your CBIOS by examining
  11. the warm start vector at 0001H.  It then insinuates ZX65 just below CBIOS,
  12. after first calculating and inserting new values for all non-relocatable
  13. operands in the 'prototype' ZX65R code.  The loader and the main program
  14. appear as two separate source modules which have been concatenated using
  15. a linking loader, resulting in the run-able ZX65.COM file.  To run the
  16. program, transfer ZX65.COM onto a CP/M system disk using PIP.  Boot up
  17. this disk in drive A, and place a blank disk that you want to use for
  18. 6502 programs and data in drive B.  Type 'ZX65'.  Drive B will operate
  19. briefly and the ZX65 prompt will appear on the console.  You are now in
  20. ZX65's command mode.  Refer to the Dobb's article or file ZXTAB1.DOC for
  21. a command summary.
  22.  
  23.     If you compare the source code for ZX65R with that published
  24. in DDJ, you will notice what appear to be substantial differences in the
  25. listing.  The most obvious change is in the header comments and the 'eq-
  26. uates' which set up memory locations for the system. Even though this
  27. looks quite a bit different, it is for the benefit of relocatability and
  28. has no effect on the operation of the program once it is loaded.  If you
  29. will look a little further and compare the actual instructions, you will
  30. see that they are mostly unchanged.  There are two exceptions. The first
  31. involves the code from line 339 to line 428. These are the instruction
  32. processors for JMP, JSR, RTS, and RTI, and the new code corrects for im-
  33. proper stack handling in the original version. The second change is down
  34. near the end of the code in the console I/O handler. A patch there accom-
  35. odates a few BIOS console output routines which do not return with the
  36. output character still in the accumulator.
  37.  
  38.     Notice that the memory locations for the USER subroutine link-
  39. ages shown in Table 3 apply only after loading is complete.  To insert
  40. your own subroutine addresses, the best method is to load ZX65.COM under
  41. DDT. You will then find the USER jump table at the following locations:
  42.  
  43.     USR0        0FCCH *        * The first two locations are
  44.     USR1        0FCFH *        initialized to console I/O and
  45.     USR2        0FD2H         will be relocated during load-
  46.     USR3        0FD5H        ing. The last three will not
  47.     USR4        0FD8H        be relocated.
  48.  
  49. You may also wish to change the 16-bit 'BRK' vector:
  50.  
  51.     BRK VECTOR    0FDBH        Not relocated during loading.
  52.  
  53. Once you have inserted the desired changes under DDT, you may either ex-
  54. ecute the program directly by typing G100, or save it to disk following
  55. warm start with the command 'SAVE 20 ZX65.COM'.
  56.  
  57.  
  58.     CP/M COMPATABILITY: As of this writing, I have not yet succum-
  59. bed to Digital Research's efforts to get me to buy the new CP/M 2. From
  60. what I have been able to figure out, it offers very little to me in the
  61. way of advantages. Suffice it to say that ZX65 was written and debugged
  62. using V 1.4, and I cannot say whether or not it will run under any other
  63. version. (My guess is that it will work with V 1.3, but not v 2.X.) The
  64. main reason for any incompatibility will probably have to do with the
  65. fact that my self-contained mini DOS operates the disks and console dir-
  66. ectly through CBIOS rather than by using calls to BDOS which is the more
  67. conventional method. (There is a good reason for this madness which I
  68. will explain shortly.) In any event, since you have spent your hard-
  69. earned nickels for this copy, I suspect that you are resourceful enough
  70. to overcome such problems and implement any necessary patches. If you
  71. do come up with a running version patched for CP/M 2 or for some other
  72. disk format (i.e. North Star etc.), how about submitting it for possible
  73. publication in Dobb's? (No, I'm not on their payroll, but they are re-
  74. ceptive to this type of material and lots of 'hard core' dedicated
  75. computerists read their mag.)
  76.  
  77.     SOME NITTY-GRITTY: As promised, here is the explanation of why
  78. I have interfaced through CBIOS rather than using BDOS: If you have
  79. done any work at all with the 6502 processor, you will recall that page
  80. zero of memory (0000H to 00FFH) is sacred to it. There are short forms
  81. of many instructions for use on page zero, and the very powerful indirect
  82. indexing modes always use page zero. Now ZX65 by design uses no memory
  83. mapping at all...that is, if your 6502 program is ORG'd at 2000H, that
  84. is exactly where you will load it. (This is in contrast to at least one
  85. TRS80-based simulator that I know of.) Having gone this far, it is only
  86. reasonable to expect that page zero will be totally available to the
  87. 6502 program. As you have probably realized by now, the catch here is
  88. that BDOS also likes page zero, and uses large chunks of it during disk
  89. accesses. With one possible limitation (which I will discuss in a bit)
  90. ZX65 totally removes the host system from page zero...even the vectors
  91. at the bottom of memory need not be saved.  ZX65 is, in fact, confined
  92. to the top 1100H bytes of user memory (more if your CBIOS is longer than
  93. 512 bytes), and ALL space below that is available for 6502 programs and
  94. data. The one possible conflict that I mentioned is system-dependent,
  95. and may or may not apply in your case. CP/M V 1.4 has a reserved 'scr-
  96. atch' area of 16 bytes located from 0040H to 004FH. Some disk controllers
  97. use this area for temporary data storage during all disk transfers, whe-
  98. ther initiated by CP/M or not. If this is true of your controller, then
  99. you have very little choice but to accept the fact that this portion of
  100. page zero will be messed up whenever you do a disk access from ZX65.
  101. There is still one alternative (I know because I did it!): you may be
  102. able to move this scratch area out of page zero into high memory. Even
  103. if you have this conflict, 6502 programs that use page zero only for
  104. temporary data storage will probably run normally unless the 6502 pro-
  105. gram itself accesses the disk. (Yes, it is possible, using the 'system'
  106. subroutine calls.)
  107.  
  108.     ZXDOS COMMENTS: Having destroyed BDOS as described above, I was
  109. obliged to include an embedded disk operating system in ZX65. Now, ZXDOS
  110. will never win any awards for versatility, but it is, I think, adequate
  111. for the application. All internal disk access is confined to drive B (a
  112. two drive system is assumed). ZXDOS files are not CP/M compatible. A dir-
  113. ectory is maintained on track zero, and the remainder of the disk is
  114. available for program/data storage. Each directory entry is 16 bytes long,
  115. and contains the file name (format same as CP/M but file type has no spe-
  116. cial meaning), the load address, the disk location, the number of sectors,
  117. and an active/dead flag byte. During a directory display or search, the
  118. directory is paged through a buffer within ZX65 one sector at a time,
  119. continuing until an 'end of directory' mark is located. Files are stored
  120. sequentially and on sequential sectors (no interleaving). A new file will
  121. normally be appended at the tail end of existing files, unless the entire
  122. file will fit into the space allocated for a dead file. Thus a rudimentary
  123. form of dynamic disk space allocation is used, but a full disk will still
  124. contain quite a few empty slots. Killing a file does not actually erase
  125. anything, but simply resets the active status flag in the directory for
  126. that entry. The 'initialize' command writes a properly formatted empty
  127. directory to the disk.
  128.  
  129.     Finally, it is be possible to use ZX65 with only one drive. To
  130. implement this, load ZX65.COM using DDT, and change the value at address
  131. 484H from '01' to '00'.  Save the modified code back to a system disk
  132. following warm start using a 'SAVE 20 ZX65.COM' command. To operate in
  133. this mode, first start ZX65, then immediately remove the system disk
  134. and insert the ZX65 data disk.  From this point operation will be the
  135. same. This works because once loaded, ZX65 does not itself require any
  136. further disk access.
  137.  
  138.     CONCLUSION: Have fun with ZX65!        -RMK
  139.  
  140.  
  141.