home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol010 / rez.doc < prev    next >
Text File  |  1984-04-29  |  26KB  |  780 lines

  1.         REZ
  2.  
  3.     A disassembler for 8080 programs
  4.     by Ward Christensen as modified for Z-80
  5.     with TDL mnemonics by William Earnest
  6.     with Zilog mnemonics by Hank Kee
  7.  
  8.     CP/M U.G. 1/80
  9.  
  10. Suggestions?  Call me eve's at (312) 849-6279
  11.     W. Earnest is at (215) 398-1634
  12.         ----------------
  13. REZ commands are inconsistent at best. - REZ is a 
  14. kludge based on years of disassembler experience and hacking, 
  15. and was never "planned" - just coded sitting at a tube, and
  16. modified over 2 years before being contributed to the CP/M UG.
  17.  
  18. For example, to kill a symbol: k.label   but to kill a 
  19. control value: caddr,k and to kill a comment: ;addr,
  20. but REZ does the job like no other I have seen.
  21.         ----------------
  22. N-O-T-E: Pardon the editorial, but I feel hardware without
  23. good software is useless to 99% of us.  Most good software
  24. has to be paid for.  I strongly support the legitimate purchase
  25. of licensed software.  I do not regularly use any programs
  26. which I have not purchased.  (Yes, I do occasionally "try"
  27. one, but then buy it if I plan on using it).  I have been
  28. asked by software businesses to NOT distribute REZ -
  29. because of it's ability to produce good .asm source quickly.
  30. But, there are so many disassemblers out, why not a good, 
  31. conversational one?   Please use it in the spirit in which it 
  32. was contributed: to enlarge your understanding of the micro-
  33. computer world around you, and to allow you to customize 
  34. programs which you legitimately own, for your own use.
  35.  
  36.     "Semper non rippus offus"
  37. ----
  38. NOTE: any command taking a hex address (Dnnnn, etc)
  39. may take a value in the form .label but arithmetic
  40. may not be performed.  (i.e. d.start is ok, but d.start+8 not)
  41.         ----------------
  42.     Overall structure of REZ:  It is a .COM file,
  43. which runs at 100H.  It goes thru 1B00 or so, then the stack.
  44. At 1C00 is a 512 entry table for control commands.  Each is
  45. 3 bytes long, and controls the format of the re-sourced list,
  46. i.e. is it .BYTE, .WORD, .BLKB instructions, etc.
  47.     At 2200 is the start of the symbol table.  It has no
  48. defined length as such.  If it is not used, it occupies only
  49. 2 bytes.
  50.     If you want to re-source something which is in memory,
  51. such as a PROM, a program previously loaded in high memory,
  52. "CP/M itself", or whatever, you can just do so.
  53.     However, typically you want to disassemble a program
  54. which runs at 100H, which is were REZ runs.   Bob
  55. Van Valzah would have solved that by making resource
  56. relocatable and moving itself up under BDOS.  I wasn't that
  57. industrious.
  58.     Instead, REZ uses the concept of an "invisible"
  59. OFFSET.  After all, what do you care where it is as long
  60. as it LOOKS like it's at 100h?
  61.     So, you set an offset.  O2F00 sets it to 2F00 Hex.
  62. Reading a .COM file (RFOO.COM) causes it to come into 3000 on.
  63. If you say D100 or L100 it dumps or lists what LOOKS like your
  64. program.  Internally, REZ is adding the offset to the
  65. D and L addresses.
  66.     What should you set the offset to?  Well, that depends
  67. upon how many symbols you will use.  O2400 will load the
  68. program at 2400, thus allowing only 2200-23FF for symbols,
  69. i.e. 512 bytes or about 50-60 labels.  If you didn't leave
  70. enough space, then used B to build a default symbol table,
  71. the table could run into and clobber your .com file!  (easy
  72. recovery, however: just change the offset to being higher,
  73. and read in the .COM file again)  Each entry takes 3 bytes
  74. + the symbol length, and if you like 7 byte labels like I
  75. do, that means 10 bytes/label.  An offset of 3300 should
  76. be adequate.
  77.     If you want to put comments into the disassembled
  78. program, you will have to designate an area to Use for the
  79. comments.  The U command (e.g. U4000) specifies what area
  80. is to be used.
  81.     Before issuing the O (offset) command, do:
  82.     L5 7
  83. which will show the JMP to BDOS, which is the highest memory
  84. you may use.  (Note if you have, for example, an empty 4K
  85. memory board in high memory, you can Use THAT for comments).
  86.     Let's take an example:  You have an 8K file, FOO.COM
  87. which you want to disassemble.  It will have about 300 labels.
  88. 300 x 10 is 3000, or call it 4K (what's a K unless your
  89. tight).  The symbol table starts at 2200.  4K more is 3200.
  90. Let's load the .COM at 3200, so since it normally starts
  91. at 100H, the offset is 3100.  O3100 is the command.
  92. We then RFOO.COM to read it in.  It says 5200 2100 which
  93. means it came into actual memory to 5200, but 2100 if we
  94. are talking with respect to loading at 100.
  95.     Thus, we could set our comments table up after
  96. the .COM program - say at 5400:  U5400
  97.     The ? command shows the memory utilization for
  98. control, symbol, and comments entries.  (no, I never put
  99. in anything to keep track of the .COM - you'll just have
  100. to do that yourself).
  101.     If you ever want to dump real memory, you'll have
  102. to reset the offset to 0: O0  but then set it back.
  103. If you are not sure what it is, typing O will tell the
  104. current offset.
  105.  
  106.     Hoo, boy!  Hope this kludge of documentation
  107. is enough to get you going - hmmm, better give you
  108. some of the gotcha's I've discovered...
  109.  
  110.         ---- WATCH FOR ----
  111.  
  112. *    Symbols overflowing into the .COM.
  113.     (Use ? command to see how full symbol table is)
  114.  
  115. *    Control entries overflowing into .SYM (altho I
  116.     can't believe anyone will have a program with
  117.     more than 512 control entries!!!)
  118.  
  119. *    Comments overflowing into BDOS (ug!!)
  120.  
  121. *    Using an offset which is not in free memory
  122.     and overlaying BDOS or whatever.
  123.  
  124. *    The B(uild) command gobbling up too much when building
  125.     a .BYTE:  "B" will take a .BYTE 'GOBBELDY GOOK' followed
  126.     by LXI H,FOO and take the LXI as a '!' (21H) so
  127.     you'll have to manually stick a new "I" control
  128.     entry in at the address of the LXI.  You might
  129.     also delete the incorrect "I" entry which REZ
  130.     stuck in (typically at the second byte of the LXI)
  131.  
  132. *    Trying to dump real memory without setting the
  133.     offset back to 0.  (then forgetting to set it back
  134.     to its proper value)
  135.  
  136. *    Forgetting how big the .COM file you are disassembling
  137.     was.
  138.  
  139. *    Using REZ to rip off software (yes, I know, you
  140.     heard that before, but only 3 in 100 needed to be 
  141.     told, and 2 in 100 needs to be told again, and 1 in
  142.     100 doesn't give a rat's fuzzy behind anyway!!)
  143.  
  144. *    Forgetting to take checkpoints when disassembling
  145.     large files.  You may even want to rotate the names
  146.     under which things are saved:
  147.  
  148.     STEMP1.SYM
  149.     STEMP1.CTL
  150.     STEMP1.DOC
  151.  
  152. *    Missing a label:  Suppose you have a control entry
  153.     for a .WORD, resulting in:
  154.     
  155.     DFLT:        ;172C
  156.         .WORD    100H
  157.  
  158.     but somewhere in the program, the following exists:
  159.  
  160.         LDA     172DH
  161.  
  162.     Even if you did a B and have a label L172D, it won't
  163.     show up since it's in the middle of a .WORD.  Instead,
  164.     do this:
  165.  
  166.     K.l172d        kill the old label
  167.     e172d,.dflt+1    put in the new label as a displacement
  168.             off the beginning.
  169.  
  170. *    improperly disassembling .WORD's (see previous item).
  171.     You might be tempted to make DFLT a .BYTE so that
  172.  
  173.     DFLT:        ;172C
  174.         .BYTE    0
  175.     L172D:        ;172D
  176.         .BYTE    1
  177.  
  178.     Note that while this disassembles and reassembles
  179.     properly, it is not "as correct" as the technique
  180.     used in the previous item.
  181.  
  182. *    Having the "B" command overlay your "E" control entry.
  183.     What?  Well, "B"uild is pretty dumb.  If he finds 8
  184.     .BYTE type characters in a row, he fires off a .BYTE from
  185.     then on until he runs out of those characters.  Suppose
  186.     your program was 200 long (ended at 3FF), and you
  187.     had zeroed (aha!  Nice .BYTE candidates) memory there
  188.     (there meaning at your offset address + whatever).
  189.  
  190.     Then you QB100,400 and viola!!  REZ overlaid
  191.     your "E" control with a "B".  
  192.         ----------------
  193.  
  194.     REZ is relatively complete.  (well, actually,
  195.     the phrase "rampant featureitis" has been "mentioned").
  196.     ...But there's always another day, and another K...
  197.  
  198.         SO... Here's my "wish list"
  199.  
  200.     ..it might save you telling me YOU think such-and-such
  201.     would be nice...
  202.  
  203. *    Targets of LHLD, SHLD should automatically be flagged
  204.     as type .WORD in the control table.  Ditto LDA and STA
  205.     as .BYTE or as second half of .WORD.  Ditto targets of LXI
  206.     as .BYTE (?).
  207.  
  208. *        E5C,.FCB
  209.     followed by
  210.         E6C,.FCB+
  211.     should automatically calculate the appropriate
  212.     displacement, and put it in the symbol table.
  213.  
  214. *    The comments facility should be enhanced to allow
  215.     total SUBSTITUTION of entire line(s) of the code,
  216.     i.e. at address such-and-such, replace the next 3
  217.     bytes with the following arbitrary line.  This
  218.     would help those "how do I explain what was being
  219.     done" cases such as:    LXI    H,BUFFER AND 0FF00H
  220.  
  221. *    Add the ability to, in one instruction, rename
  222.     a default (LXXXX) label to a meaningful name.
  223.  
  224.         ----------------
  225. REZ types an "*" prompt when it is loaded.  You may
  226. then enter any of the following commands.  Each command
  227. is a single letter followed by operands.  Commas are shown
  228. as the delimiter, but a space will also work.
  229.  
  230.         ----------------
  231.         ----------------
  232. ;    Put comments into the program.
  233.     (must execute 'u' command first, to assign area
  234.     for comments to be placed)
  235.  
  236.     ;addr,comment    enter a comment
  237.     ;addr        lists existing comment
  238.     ;        lists entire comments table
  239.     ;addr,        deletes existing comment
  240.  
  241.     note that '\' is treated as a new line, i.e.
  242.     \test\ will be formatted:
  243.  
  244.     ;
  245.     ;TEST
  246.     ;
  247.         ----------------
  248. Attempt to find .BYTE's while listing the program.
  249. -    This command works just like 'L', but attempts
  250.     to find .BYTE's of 8 chars or longer.
  251.  
  252.     (see 'L' command for operand formats)
  253.         ----------------
  254. Build default sym tbl (LXXXX) labels for each
  255. -    2 byte operand encountered.  Note 'B' is
  256.     identical to 'L' except labels are built.
  257.  
  258.     (see 'L' command for operand formats)
  259.         ----------------
  260. Control table usage:
  261. -    c        dump ctl tbl
  262.     cnnnn        dump from starting
  263.     cnnnn,x        define format from nnnn
  264.             to next entry.  values of x:
  265.  
  266.             B = .BYTE (attempts .ASCII if
  267.                 printable, 0DH, 0AH)
  268.             W = .WORD (attempts label)
  269.             S = .BLKB to next ctl entry
  270.             I = instructions
  271.             K = kill this ctl entry
  272.             E = end of disassembly
  273.  
  274.     NOTE every control entry causes a "control break"
  275.     (NO, REZ was NOT written in RPG) which means
  276.     a new line will be started.  Thus if you have a
  277.     string in memory which disassembles as:
  278.  
  279.     .BYTE    'Invalid operand',0DH
  280.     .BYTE    0AH
  281.  
  282.     You might want to change it putting the 0DH,0AH
  283.     together on the second line - just enter a "B"
  284.     control entry for the address of the 0DH.
  285.  
  286.     The same technique could be used to make
  287.  
  288.     .ASCII    'TYPESAVEDIR ERA REN '
  289.  
  290.     appear as
  291.  
  292.     .ASCII    'TYPE'
  293.     .ASCII    'SAVE'
  294.     .ASCII    'DIR '
  295.     .ASCII    'ERA '
  296.     .ASCII    'REN '
  297.  
  298.         ----------------
  299. dump:
  300. -    dxxxx        Dumps 80H from xxxx on
  301.     daaaa,bbbb    Dumps from aaaa thru bbbb
  302.     d,bbbb        Continues, thru bbbb
  303.     d        Continues, 100H more
  304.  
  305.     NOTE 100H is the default dump length.  If you have
  306.     a larger display, you can change the default via:
  307.  
  308.     d=nn        nn is the HEX new default.
  309.  
  310.     For example, a 16 line tube could display 80H:
  311.  
  312.     d=80        or..
  313.     d=80,200    Defaults to 80, dumps 200-27f
  314.  
  315.         ----------------
  316. enter symbol:
  317. -    ennnn,.symbol     symbol may be of any length,
  318.             and contain any char A-Z or 0-9,
  319.             or "+" or "-".  This allows:
  320.             E5D,.FCB+1.  Note the "+" is not
  321.             checked, i.e. E5D,.FCB+2 would be
  322.             wrong (assuming FCB is at 5C) but
  323.             would be allowed to be entered.
  324.  
  325.     Note if you enter two symbols for the same address,
  326.     whichever one is first alphabetically will show up
  327.     on the disassembled listing.  If you have a label
  328.     which has the wrong address, you need not explicitly
  329.     kill the old one before entering the new.  A label
  330.     which is spelled exactly the same as an existing one
  331.     will replace the existing one even if the addresses
  332.     are different.
  333.         ----------------
  334. Find occurrence of address or label.  Note this function
  335. -    runs until interrupted (press any key).
  336.     fnnnn,ssss    find address nnnn in memory.  Start
  337.             the search at ssss.  Runs forever.
  338.             Press any key to stop.
  339.     f        continue previous find command
  340.       fnnnn        find nnnn starting at address you last
  341.             stopped at in the f command
  342.         ----------------
  343. kill symbol from table
  344. -    k.symbol
  345.         ----------------
  346. list (disassemble).  This command is used to list the
  347. -    file, or to list it to disk after enabling
  348.     the .ASM file save via 'SFILENAME.ASM' command
  349.  
  350.     l        lists 23 lines from prev pc
  351.     lssss,eeee    lists from ssss to eeee
  352.     l,eeee        lists from current pc to eeee
  353.     lssss        lists 23 lines at ssss
  354.  
  355.     Note that if you have a control 'e' entry, then the
  356.     list will stop when that address is found.  This allows
  357.     you to 'lstart,ffff'. 
  358.  
  359.     The 23 line default may be changed via:
  360.  
  361.     L=nn        where nn is a HEX line count, e.g.
  362.     L=0f        set to 15 lines/screen
  363.  
  364.     You can change the default and list, e.g.
  365.  
  366.     L=9,100        Dflt to 9 lines, list at 100.
  367.  
  368.     NOTE when using L to list the .ASM program to disk,
  369.     you should either list the entire program at once
  370.     using: Lssss,eeee or, you can list small pieces
  371.     at a time.  As long as you list again without
  372.     specifying a starting address, (L or L,nnnn) then
  373.     the output file will continue uninterrupted.
  374.  
  375.     You may do dump commands, and others, without
  376.     affecting what is being written to disk.
  377.         ----------------
  378. offset for disassembly
  379. -    o        print current offset
  380.     onnnn        establish new offset
  381.  
  382.     (note the offset is always added to any 
  383.     address specified in an a, b, d, or l command.
  384.     to dump real memory, the offset must be reset to
  385.     0 (O0) before the dump.)
  386.         ----------------
  387. prolog generation - this routine generates an
  388. -    .LOC instruction, and equates for any label
  389.     outside of a given low-hi address pair.
  390.     (the start and end addresses of your program).
  391.     e.g. if disassembling from 100 to 3ff, it will
  392.     generate 'fcb = 5ch' if FCB is in the symbol
  393.     table.  In typical use, you would 'sfilename.asm'
  394.     then use the P command to write the prolog, then
  395.     the L command to write the program itself.
  396.  
  397.     Pstart addr,end addr
  398.     
  399. quiet command: any command which is preceeded by a q
  400. -    will be done 'quietly'.  For example, to save
  401.     a .asm program, you could just do:
  402.  
  403.     ql100,3ff    or    ql100,ffff if you have
  404.     set the 'e' control in the control table.
  405.  
  406.     Another use is to build a default symbol table
  407.     by taking a pass thru the program: QB100,xxxx
  408.         ----------------
  409. read .com, .ctl, .sym, or .doc file
  410. -    rfilename.com    reads in at offset+100h
  411.     rfilename.ctl    loads the ctl table
  412.     rfilename.sym    loads the sym file
  413.     rfilename.doc    loads the comments table (note
  414.             'u' command must have been issued)
  415.         ----------------
  416. save .asm, .ctl, .sym, or .doc file
  417. -    sfilename.asm    use 'l' command to write, z to end
  418.     sfilename.CTL    saves the CTL table
  419.     stablename.sym    saves the sym file
  420.     sfilename.doc    saves the comments table
  421.         ----------------
  422. use area of memory for comments table
  423. -    unnnn        such as ud000 if you had an
  424.             open board at 0d000h
  425.         ----------------
  426. purge sym tbl and CTL tbl
  427.     x
  428.     -
  429.         ----------------
  430. close .asm file (note that a preferred way to close the
  431.     .asm file is to have specified a control entry
  432.     for the end address (e.g. c1ff,e))
  433.     z
  434.     -
  435. --------------------------------------------
  436. --------------------------------------------
  437. Here is a sample of the REZ usage.
  438.  
  439. Given:    a COM file (lets say test.com) which runs at 100
  440.     (as any good COM file should), and goes thru 2FF.
  441.  
  442. lines preceeded with ---> are typed by you.
  443.  
  444. ---> REZ
  445. ---> o2600    set the offset to 2600, which means the
  446.         program will read into 2600 + 100 = 2700.
  447.  
  448. ---> rtest.com    reads the com file into memory. system says:
  449.         2900 0300 which is the actual hi load addr,
  450.         (2900) and the original hi load addr (300)
  451.  
  452.         REMEMBER this address (300) because you might
  453.         want to put a "E" (end of assembly) control
  454.         entry there.
  455.  
  456. <<<<note>>>> that all 'L' (disassembly list) and 'D' (dump)
  457.     commands work with the offset added.  Thus, you
  458.     should learn to forget that the disassembler is
  459.     in memory, and think of it as if your program were
  460.     actually at 100.  D100 will dump your program.
  461.     
  462.     also note:  if the program being "REZd" will
  463.     have a fairly large symbol table, then you will
  464.     have to set the offset higher: o3300 or some such.
  465.     (the ? command will show symbol table usage: if your
  466.     symbol table is nearing the .com file, then just
  467.     set a new offset (higher) and re-load the .com)
  468.  
  469.     if you want to dump r-e-a-l memory, you would have
  470.     to reset the offset to 0: o0  (but don't forget to
  471.     reset it to 1f00 before continuing with your program.)
  472.  
  473. If you are disassembling something which is in memory at
  474. it's correct address (such as looking at ccp) then don't
  475. set the offset.  It defaults to 0 when dis is first loaded.
  476.  
  477. --->    l100    list your program - lists "about" 10 lines.
  478.  
  479. --->    d100    do a dump of your program.
  480.  
  481. NOTE that typically here are the steps to disassembling
  482.     a program which has just been read into memory:
  483.  
  484. Use the dump command to find the .ASCII areas.
  485.  
  486. Note that the 'a' command may be used to automatically
  487. find the .BYTE's, but you must then check them to insure
  488. that they don't extend too far.  All printable characters,
  489. 0dh, 0ah are considered candidates for .ASCII .
  490.  
  491. At least 8 characters in a row must be found to make sure
  492. that long sequences of mov instructions won't be taken
  493. as .BYTE's.
  494.  
  495. Use the cnnnn,k command to kill erronious entries put
  496. in the control table by the a command, but then immediately
  497. put in the right address, such as via cnnnn,i
  498.  
  499. if you wanted to scan the program for .ASCIIs yourself,
  500. use the 'c' (control) command to set the beginning and
  501.     end of ascii areas.  For example, a program
  502.     which starts out:
  503. 0100        jmp    start
  504. 0103        .ASCII    'copyright .....'
  505. 0117    start    .....
  506.  
  507. would show up in the dump as:
  508.  
  509. 0100  c3170144 4f50xxxx  xxxxxxxx xxxxxxxx  *...copyr ight....*
  510. 0110  xxxxxxxx xxxxxxxx  xxxxxxxx xxxxxxxx  *xxxxxxxx ........*
  511.  
  512.  
  513. thus you would want to instruct the disassembler to switch
  514. to .ASCII mode at 103, and back to instruction mode at 117, thus:
  515.     c103,b
  516.     c117,i
  517.  
  518. Continue doing this, bracketing every .ascii which is in
  519. the middle of instructions, by a b control instruction
  520. and an i control instruction.  Note that multiple db's in
  521. a row need not have separate cnnnn,b instructions, but that
  522. these do cause a 'line break', i.e. if you have a table
  523. of ascii commands, for example:
  524.  
  525. 02e5    .ASCII    'load'
  526. 02e9    .ASCII    'save'
  527.  
  528. the disassembler would disassemble these as:
  529. 02e4    .ASCII    'loadsave'
  530.  
  531. you could put in an additional control entry: c2e9,b, which
  532. would cause the disassembler to generate:
  533.  
  534. 02e4    .ASCII    'load'
  535. 02e8    .ASCII    'save'
  536.  
  537. which is much more readable and realistic.
  538.  
  539. Note that before generating each byte of a db, a symbol
  540. table lookup is done to determine if there is a label
  541. at that location, and if so, a new line is started.
  542.  
  543. Thus if 'loadlit' and 'savelit' were in the symbol table,
  544. as the labels on the 'load' and 'save' above, no separate
  545. 'b' control instruction would be required as the label
  546. would cause the break.
  547.  
  548. <<<<NOTE>>>> that at this time the automatic label checking
  549. is n-o-t done for .BLKB instructions.  Make sure that each
  550. ds instrucion references only up to the next label.  This
  551. means that multiple .BLKB's in a row must each be explicitly
  552. entered into the control table.  Presence of a label is
  553. not sufficient.
  554.             ----
  555. steps, continued:
  556.  
  557. After building the control entries with cnnnn,b and cnnnn,i
  558. put in a control entry cnnnn,e which defines the address of
  559. the end of your program.  The l command will then automatically
  560. stop there, and in addition, if you are in 'save xxx.asm'
  561. mode, the output .asm file will be closed.  If you do
  562. mot define a control 'e' entry, then you will have to use
  563. the break facility to stop the l command (don't use control-c
  564. as that will re-boot cp/m).  If you were writing an .asm
  565. file, you would have to user the z command to close the
  566. file.
  567.  
  568. Next, you would list your program to determine how it looks.
  569. when you recognize a routine by it's function, insert a label.
  570.  
  571. For example, if you saw that location 7ef was a character
  572. out routine (type) then enter a label into the symbol table:
  573.     E7EF,.TYPE
  574.  
  575. NOTE that all symbols start with a '.', so as to be dis-
  576. tinguished from hex data.
  577.  
  578. NOTE that if you want the disassembler to make default labels
  579. for you, use b (for build labels) instead of l (for list
  580. program).  The b commands causes lnnnn default labels to
  581. be inserted in the symbol table for every 2 byte operand
  582. encountered (LXI, SHLD, JMP, etc).  It will undoubtedly
  583. make some you don't want, such as L0000.  You will have to:
  584.  
  585.     K.L0000        kill label L0000 from the table.
  586.  
  587. When you encounter data reference instructions, try
  588. to determine what type of area the instruction points to.
  589. Typically,, LXI instructions may point to a work area
  590. which should be defined as a .BLKB, or to an ASCII string,
  591. in which case we will have already made it a 'b' control
  592. instruction.  Operands of LHLD and SHLD instructions
  593. should be made .WORD instructions.  For example if you
  594. encounter LHLD 0534H, then issue a control instruction:
  595.  
  596.     C534,W
  597.  
  598. NOTE that whatever mode you are last in will remain in
  599. effect.  Therefore if 534,w is the last entry in the
  600. control table, all data from there on will be taken to be
  601. .WORD's.
  602.  
  603. Suppose that you determine that address 7cf is a 128 byte
  604. buffer for disk I/O.  You want it to disassemble to:
  605.  
  606. DKBUF        ;07CF
  607.     .BLKB    80H
  608.  
  609. You do this as follows:
  610.  
  611.     C7CF,S        to start the .BLKB
  612.     C84F,B        to define it's end, and
  613.     E7CF,.DKBUF    to put the symbol in the table.
  614.  
  615. Continue, iteratively using the 'l' command and the 'c'
  616. and 'e' commands until you have the listing in a nice
  617. format.  You will then probably want to save the control
  618. symbol, and comments tables.  Or, you could have been 
  619. saving them at checkpoint times (so if you make a 
  620. major mistake you could go back to a previous one).
  621.  
  622. To save a control file:
  623.     sfilename.CTL    (any filename, may include a: or b:)
  624.  
  625. To save a symbol file:
  626.     sfilename.sym
  627.  
  628. To save a comments file:  
  629.     sfilename.doc    (not ".com" of course)
  630.  
  631. NOTE that the filetypes must be used as shown, but
  632. that any legal filename (or disk:filename such as b:xxxx.CTL)
  633. may be used.
  634.  
  635. You could now control-c to return to CP/M, and come back
  636. later to resume your disassembly:
  637.  
  638.     REZ
  639.     o2200
  640.     rtemp.com
  641.     rtemp.sym
  642.     rtemp.ctl
  643.     uxxxx        (such as u4000)
  644.     rtemp.doc
  645.  
  646. This will take you back exactly where you left off.
  647.  
  648. If you want to save a .asm file out to disk, do the following:
  649.  
  650. Make sure that there is a control entry defining the end
  651. of the program (such as c200,e) or else you will have to 
  652. specify the ending address and manually type a z command to 
  653. close the file. 
  654.  
  655.     sfilename.asm
  656.  
  657. A message will indicate that the file is opened.  Any
  658. subsequent a, b, or l command will have whatever is listed
  659. written to disk.  Encountering a 'e' control, or typing a z
  660. command will then close the .asm file.  The listing may
  661. be interrupted, and continued.  Since the l command types
  662. only 23 lines, use laddr,ffff to list thru the end of the
  663. assembly.
  664.  
  665. If this is the 'final' save of the .asm file, you will
  666. probably want to put an 'org' at the beginning of the
  667. output file, as well as generate equ instructions for
  668. any references outside of the program.  For example, a
  669. typical cp/m program will have references to:
  670.     bdos    at 5
  671.     fcb    at 5ch
  672.     tbuff    at 80h
  673.  
  674. the 'p' (for prologue) command generates the org, then
  675. scans the symbol table and generates equates:
  676.     BDOS    =    05H
  677.     FCB    =    05CH    (etc.)
  678.  
  679.  
  680. If you have a "e" control entry in your file, you can
  681. list as follows:  laddr,ffff - the listing will continue
  682. until the "e" control entry is found
  683.  
  684.  
  685. additional commands:
  686.  
  687. if you entered a label in the symbol table but now want
  688. to get rid of it:
  689.     k.symbol
  690.  
  691. note to rename a symbol, such as when you had a system-
  692. assigned lnnnn label but now want to make it meaningful:
  693.  
  694.     k.l0334
  695.     e334,.type
  696.  
  697. you could even:
  698.     e.l0334,.type
  699.     k.l0334
  700.  
  701. but that takes more typing.
  702.  
  703.  
  704.  
  705. here are some more commands:
  706.  
  707. ?        prints statistics on symbol and control table
  708.         usage, etc.
  709.  
  710. c        prints the entire control table
  711.  
  712. cnnnn        prints the control table starting
  713.         at address nnnn
  714.  
  715. ds        dumps the symbol table.  Interrupt it
  716.         by typing any key.
  717.  
  718. ds.symbol    starts dumping at the specified symbol,
  719.         or the nearest symbol.  thus "ds.f" starts
  720.         the dump at the first label starting
  721.         with the letter 'f'.
  722.  
  723. t        Toggles format mode such that labels are
  724.         placed on the same line with the next
  725.         instruction, or are on their own line.
  726.  
  727. ....have fun, and let me know of any problems or
  728.     suggested improvements
  729.     ------------------------
  730.  
  731.         REZ
  732.     "Quick" command summary
  733.  
  734. Any address may be replaced by .symbol i.e. D.START
  735.  
  736. ;addr,comment        Enter a comment
  737. ;addr            Lists existing comment
  738. ;            Lists entire comments table
  739. ;addr,            Deletes existing comment
  740. A(see "L" for operands)    Attempt to find .BYTE's
  741. B(see "L" for operands)    Build default sym tbl (Lxxxx)
  742. C            Dump ctl tbl
  743. Cnnnn            Dump ctl starting at nnnn
  744. Cnnnn,x            Define format from nnnn (B,E,I,S,W)
  745. Dxxxx            Dumps 80H from xxxx on
  746. Daaaa,bbbb        Dumps from aaaa thru bbbb
  747. D,bbbb            Dump thru bbbb
  748. D            Dump 100H more
  749. D=nn            nn= Hex dump size default.
  750. Ds            Dumps the symbol table.
  751. Ds.symbol        Sym dump starting at .symbol
  752. Ennnn,.symbol        Enter symbol into table
  753. Fnnnn,ssss        Find address nnnn starting at ssss
  754. F            Continue previous find command
  755. Fnnnn            Find nnnn
  756. K.symbol        Kill symbol from symbol table
  757. L            Lists 23 lines from prev pc
  758. Lssss,eeee        Lists from ssss to eeee
  759. L,eeee            Lists from current pc to eeee
  760. Lssss            Lists 23 lines at ssss
  761. L=nn            nn is hex list default # of lines
  762. O            Print current offset
  763. Onnnn            Establish new offset
  764. Pstart addr,end addr    Generate program prolog
  765. Q            Before any command suppresses
  766.             console output: QB100,200
  767. Rfilename.COM        Reads in at offset+100h
  768. Rfilename.CTL        Loads the ctl table
  769. Rfilename.SYM        Loads the sym file
  770. Rfilename.DOC        Loads the comments table (note
  771. Sfilename.ASM        Save .ASM file.  Write w/L, Z to end
  772. Sfilename.CTL        Saves the CTL table
  773. Sfilename.SYM        Saves the sym file
  774. Sfilename.DOS        Saves the comments table
  775. T            Toggles trimmed format mode
  776. Unnnn            Use nnnn for comments table
  777. X            Purge all symbols and control
  778. Z            Write eof to .ASM file (
  779. ?            Prints statistics (sym, ctl, comments)
  780.