home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / debug / jmon100.lbr / JMON.DZC / JMON.DOC
Text File  |  1988-02-16  |  10KB  |  256 lines

  1. JMON-monitor for banked BIOS
  2. Vers 1.00 88Jan22 by Julian Loke
  3.  
  4.      This is a simple Z80 breakpoint debugger which I use to
  5. trace  through  my CP/M banked BIOS.   During the  bootstrap
  6. procedure,  as many as five bank swaps are made.  This means
  7. that I can't use a standard debugger or even my ROM  monitor
  8. since there is no fixed stack segment.   This self-modifying
  9. debugger  code  lives in common memory (in my system  COLOUR
  10. RAM at 0F800h).
  11.  
  12.      The  ZASM source code is supplied,  and overlays for  a
  13. MicroBee 56 are included.   These include keyboard scan code
  14. and  code for a hardware scroll VDU driver using  the  6545.
  15. As is, the code can be shoehorned into just under 4k.
  16.  
  17. Introduction
  18.  
  19.      After  I piggy-backed the second 56k bank of RAM on  my
  20. Z80  MicroBee computer,  I felt it was rather a waste to use
  21. it all as a RAM disk.   I had a terrible sinking feeling  in
  22. the pit of my stomach when I realized I would write a banked
  23. memory  BIOS.   I didn't feel any better when I had to debug
  24. the beast.
  25.  
  26.      This  is  one of the more useful tools I  developed  to
  27. help  me trace through my XBIOS,  which sits in a  different
  28. bank from the TPA.
  29.  
  30.      The design criteria were simple:
  31.           Z80 breakpoint debugger with multiple breakpoints
  32.           Memory monitor
  33.           Port monitor
  34.           Keyboard and VDU routines independent of ROM
  35.           MUST fit in common memory (2k)
  36.           Transparent to XBIOS (i.e. no shared memory)
  37.  
  38. The Monitor
  39.  
  40.      Those of you familiar with DDT will feel right at home.
  41. Single  letter  commands are typed on a short command  line.
  42. Parameters follow, and are separated by commas.  There is NO
  43. help facility.
  44.  
  45.      Being  only  a  tiny  monitor,   JMON  does  not  allow
  46. disassembly.   You will need to manually trace through  your
  47. code,  armed  with a list of Z80 opcodes and mnemonics,  and
  48. with a printed listing of your .PRN file.
  49.  
  50.      I  found  this  quite adequate  for  my  purposes.   Of
  51. course,  if  you  insist on being able  to  disassemble  and
  52. trace,  I'd be very grateful if you could add the code to do
  53. this.
  54.  
  55. Assembling JMON
  56.  
  57.      This  program  is  NOT an example of  elegant  assembly
  58. language programming.   As is,  it is intended for use  with
  59. ZASM  and LOAD via a .HEX file.   It produces a file for use
  60. with a MicroBee.
  61.  
  62.      The  keyboard and VDU I/O routines (see below) for  the
  63. MicroBee are rather large.  Consequently, there was not much
  64. left for a decent monitor unless I used self-modifying code.
  65.  
  66.      A  major stumbling block (which still remains)  is  the
  67. lack  of a PHASE directive in ZASM.   Being an ASM user from
  68. way  back,  I used offsets at EVERY ABSOLUTE  address.   So,
  69. instead of:
  70.  
  71.         ld      sp,stk          ;new stack
  72.         ld      a,(lbl5)        ;absolute address
  73.         jr      nz,lbl1         ;relative address
  74.  
  75. I have to put
  76.  
  77.         ld      sp,stk+poff     ;new stack + offset
  78.         ld      a,(lbl5+poff)   ;absolute address + offset
  79.         jr      nz,lbl1         ;relative address
  80.  
  81. where poff is defined earlier in the program.   Look through
  82. the source code for more examples.
  83.  
  84.      If your assembler has a PHASE directive,  put that into
  85. the file, and EQUate poff to zero.
  86.         poff    equ     0       ;offset for patch
  87.  
  88. I/O interfacing
  89.  
  90.      To assemble JMON for a non-MicroBee system, you MUST to
  91. provide TWO include files:
  92.  
  93.        file    entry point  function
  94.      JVDU.Z80     wr$a      write  ASCII char in register  A
  95.                             to  VDU.   Preserves  all  other
  96.                             registers.
  97.  
  98.      JKBDST.Z80   kbdst     Keyboard  status/input  routine.
  99.                             Return ASCII key in register  A,
  100.                             and  NZ  flag.   If no keys  are
  101.                             pressed, return A=0, Z status.
  102.  
  103.      Beware!   See the section above on producing PHASE code
  104. with an assembler without a PHASE directive.   You MUST  get
  105. this correct, or you will wind up in terrible trouble!
  106.  
  107. Using JMON
  108.  
  109.      There  is  a  small loader supplied with  JMON.Z80  for
  110. loading  the  program into the correct  address.   I  put  a
  111. couple of options for my system,  but this may or may not be
  112. suitable for you.
  113.  
  114.      A>JMON         load and install JMON in the COLOUR RAM
  115.                     at 0F800h.  Return to CP/M, ready for
  116.                     JUMP 0F800 from ZCPR, or following DDT.
  117.      A>JMON X       load, install, then run JMON
  118.      A>JMON X.1     as above, but stores JMON in the PCG RAM
  119.                     instead of the colour RAM.
  120.  
  121. Command         Short Description
  122.  
  123. B               display all breakpoints
  124. Bxxxx           toggle breakpoint at xxxx
  125.  
  126. C               clear all breakpoints
  127.  
  128. D               dump 128 bytes from current pointer
  129. Dxxxx           dump 128 bytes from xxxx
  130. Dxxxx,yyyy      dump from xxxx to yyyy
  131. D,yyyy          dump from last addr to yyyy
  132.  
  133. Fxxxx,yyyy      fill from xxxx to yyyy with 00
  134. Fxxxx,yyyy,nn   fill from xxxx to yyyy with nn
  135.  
  136. G               go to PC
  137. Gxxxx           go to xxxx
  138. Gxxxx,yyyy      go to PC, temporary breakpoint at yyyy
  139.  
  140. Hxxxx,yyyy      display sum and difference (hexadecimal)
  141.  
  142. Inn             input from port nn
  143. Inn,oo          input from port nn, put oo on A8..A15
  144.  
  145. Mxxxx,yyyy,zzzz move memory from xxxx..yyyy to zzzz
  146.  
  147. Onn,oo          output value oo to port nn
  148.  
  149. Q               quit to ROM monitor
  150. Qxxxx           quit to address xxxx
  151.  
  152. R               display registers
  153. Rrxxxx          set register r to xxxxx, r in [ABDHXYSPZ]
  154. RFfff           set flag(s) in flag register, f in [SZHPNC]
  155.  
  156. S               substitute memory contents from last address
  157. Sxxxx           substitute memory contents at xxxx
  158.  
  159. Z               display current PAGE register
  160. Zxxxx           set PAGE register to xxxx
  161.  
  162. Notes on commands
  163.  field description     example notes
  164.  
  165.   nn   hex number      I0      input from port 00h
  166.  
  167.   xxxx hex number      G,0DF3  go with temp brkpt at 0DF3h
  168.        or PC spec      D.      dump from PC onwards
  169.        or PC relative  B.r     brkpt assuming PC at JR
  170.        or PC absolute  B.a     brkpt e.g. with PC at CALL
  171.  
  172.   rr   register name   RA38    set A to 38h
  173.                        RH1234  set HL to 1234h
  174.  
  175.   ffff flag name       RFZPS   set FLAGS Z P and S
  176.  
  177.      The  S  command  allows you to  put  several  bytes  in
  178. sequence  (separated  by commas) on the same line.   If  you
  179. start  with a comma,  the rest of the line is stored  as  an
  180. ASCII string verbatim.
  181.  
  182. How I use JMON
  183.  
  184.      Let's  say  I am debugging the SELECT DISK XBIOS  CODE.
  185. This lives in a bank separate from the TPA,  which can  only
  186. be accessed when the stack has been set to common memory.
  187.  
  188.      I  have  a printed listing of the region of code  under
  189. test, and select a suitable location for a breakpoint.
  190.  
  191.      Using JMON, I can change banks using the Z command, and
  192. examine  memory with the D dump command.   I usually  change
  193. some memory with the S command, then issue a GO command with
  194. temporary breakpoint.   The registers are displayed, and may
  195. be redisplayed and modified with the R command.
  196.  
  197.      In this way I can successfully trace through my  XBIOS.
  198. Many  a  bug,  hidden stealthily in obscure source code  has
  199. been revealed to me by this method.
  200.  
  201. Sample JMON run                 with comments
  202.  
  203.      A>JMON X                   invoke jmon
  204.      JMON v1.00 by J.Loke 88Jan22
  205.      $z1                        select XBIOS bank
  206.      $dc84e                     dump memory in bank 1,C84E
  207.      01:C84E  7A 2E...
  208.      01:C85E  5F 73...
  209.      ...
  210.      $bc84e                     set a permanent breakpoint
  211.      $b                         display all breakpoints
  212.      $z2                        select TPA bank
  213.      $g0                        start, breakpoints active
  214.      A>dir b:                   invoke test function
  215.      ...                        XBIOS breakpoint reached
  216.                                 registers are displayed
  217.      c                          clear all breakpoints
  218.      $d.                        dump at PC
  219.      $g,c854                    go with temporary brkpnt
  220.      ...                        breakpoint reached
  221.                                 registers are displayed
  222.      $rfz                       set ZERO flag
  223.      $ra0                       set accumulator zero
  224.      $h.,5                      display PC+5,PC-5
  225.      $g,.r                      trace past relative jump
  226.      $d.                        dump instruction LD HL,LBL
  227.      $d.a                       dump LBL
  228.                                 EUREKA I found the error!
  229.      $z2                        select TPA bank
  230.      $q0                        quit with a warm boot
  231.  
  232. Any more?
  233.  
  234.      JMON  is not a fully featured monitor.   It is not even
  235. the  debugger I use within CP/M.   I only use  JMON  because
  236. there is nothing else that could handle the banked memory in
  237. my computer.
  238.  
  239.      Think of it as a kludge, and you won't be disappointed.
  240. You  might even be pleasantly surprised how useful JMON  can
  241. be.
  242.  
  243.      For more extensive documentation, or to return comments
  244. or criticisms,  please  get in contact with  me on  EASTWOOD
  245. R/ZSYS (03)  870 4623,  or  after your  International access
  246. code, 61-3-870-4623. V22 or Bell 212.
  247.  
  248. Copyright
  249.  
  250.      Released to the public domain to be freely  distributed.
  251. May not be sold or included in a package which is sold.
  252.  
  253. Julian Loke
  254. Melbourne,  Australia.
  255. 1988 Jan 22
  256.