RESOURCE Disassembler
Overall structure
Sample of RESOURCE usage
Disassembly steps
Description of commands
Watch for... (tips)
Quick command summary
ZESOURCE: Extension of RESOURCE
:		   RESOURCE: disassembler for 8080 programs
		      by Ward Christensen (312) 849-6279

RESOURCE commands are inconsistent at best.   - RESOURCE is a kludge based  on
years of disassembler experience and hacking,  and was never "planned" -  just
coded sitting at a tube, and modified over 2 years before being contributed to
the CP/M UG  (1/80).  For example,  to kill a  symbol: k.label but  to kill  a
control value:	caddr,k and  to kill a comment:  ;addr, but RESOURCE does  the
job like no other I have seen.

N-O-T-E: Pardon the editorial,	but I feel hardware  without good software  is
useless to 99%	of us.	Most  good software has  to be paid  for.  I  strongly
support the legitimate purchase of licensed software.  I do not regularly  use
any programs which I have not  purchased.  (Yes, I do occasionally "try"  one,
but then  buy it  if I	plan on  using it).   I have  been asked  by  software
businesses to NOT  distribute RESOURCE -  because of it's  ability to  produce
good .asm source quickly.  But, there are so many disassemblers out, why not a
good, conversational  one?   Please use  it  in the  spirit  in which  it  was
contributed:  to  enlarge  your understanding  of  the micro-  computer  world
around you, and to allow you to customize programs which you legitimately own,
for your own use.

			  "Semper non rippus offus"
:Overall structure of RESOURCE

    It is a .COM file which runs at  100H.  It goes thru 1700 or so, then  the
stack.	At 1800 is a  512 entry table for control  commands.  Each is 3  bytes
long, and controls the format of the  re-sourced list, i.e. is it DB, DS,  DW,
instructions, etc.  At	1E00 is  the start  of the  symbol table.   It has  no
defined length as such.  If it is not used, it occupies only 2 bytes.

    If you want to re-source something which  is in memory, such as a PROM,  a
program previously loaded in high memory, "CP/M itself", or whatever, you  can
just do so.  However, typically you  want to disassemble a program which  runs
at 100H, which is were RESOURCE runs.	Bob Van Valzah would have solved  that
by making resource relocatable and moving itself up under BDOS.  I wasn't that
industrious.  Instead, RESOURCE  uses the  concept of  an "invisible"  OFFSET.
After all, what do you care where it is as long as it LOOKS like it's at 100h?

    So, you set an offset.   O2F00 sets it to 2F00  Hex.  Reading a .COM  file
(RFOO.COM) causes it to come into 3000 on.   If you say D100 or L100 it  dumps
or lists what  LOOKS like your	program.  Internally, RESOURCE	is adding  the
offset to the D and  L addresses.  What should you  set the offset to?	 Well,
that depends upon how many symbols you will use.  O1F00 will load the  program
at 2000, thus allowing	only 1E00-1FFF for symbols,  i.e.  512 bytes or  about
50-60 labels.	If you	didn't leave  enough space,  then used	B to  build  a
default symbol table,  the table could	run into and  clobber your .com  file!
(easy recovery, however: just change the  offset to being higher, and read  in
the .COM file again) Each entry takes 3 bytes + the symbol length, and if  you
like 7 byte labels like  I do, that means 10  bytes/label.  An offset of  2F00
should be adequate.

    If you want to put comments  into the disassembled program, you will  have
to designate an area  to Use for  the comments.  The  U command (e.g.	U4000)
specifies what area is to be used.

    Before issuing the O (offset) command, do:	 L5 7 which will show the  JMP
to BDOS, which	is the highest	memory you may	use.  (Note if	you have,  for
example, an  empty 4K  memory  board in  high memory,  you  can Use  THAT  for
comments).  Let's take	an example:  You  have an 8K  file, FOO.COM which  you
want to disassemble.  It  will have about  300 labels.	300 x  10 is 3000,  or
call it 4K (what's a K unless  your tight).  The symbol table starts at  1E00.
4K more is 2E00.  Let's load the .COM at 2E00, so since it normally starts  at
100H, the offset is 2D00.  O2D00 is the command.  We then RFOO.COM to read  it
in.  It says 4E00  2100 which means  it came into actual  memory to 4E00,  but
2100 if we are talking with respect to loading at 100.	Thus, we could set our
comments table up after the .COM program - say at 5000:  U5000

    The ?  command  shows the  memory  utilization for	control,  symbol,  and
comments entries.  (no, I never  put in anything to keep  track of the .COM  -
you'll just have to do that yourself).

    If you ever want to dump real  memory, you'll have to reset the offset  to
0: O0 but then set  it back.  If you  are not sure what  it is, typing O  will
tell the current offset.
:Here is a sample of the RESOURCE usage.

    Given:  a COM file (lets say test.com) which runs at 100 (as any good  COM
file should), and goes thru 2FF.  Lines preceded with ---> are typed by you.

---> RESOURCE
---> o2200     Set the offset to 2200, which means the program will read into
	       2200 + 100 = 2300.
---> rtest.com Reads the com file  into memory. system says:  2500 0300  which
	       is the actual  hi load addr,  (2500) and the  original hi  load
	       addr (300).  REMEMBER this address (300) because you might want
	       to put a "E" (end of assembly) control entry there.

<<<<note>>>> that all 'L' (disassembly list) and 'D' (dump) commands work with
the offset added.  Thus, you should  learn to forget that the disassembler  is
in memory, and think of it as if your program were actually at 100.  D100 will
dump your program.

Also note:  if the program being  "RESOURCEd" will have a fairly large	symbol
table, then you will have to set the offset higher: o2f00 or some such.   (the
? command will show symbol  table usage: if your  symbol table is nearing  the
.com file, then just set a new offset (higher) and re-load the .com)

If you want to dump r-e-a-l memory, you  would have to reset the offset to  0:
o0 (but don't forget to reset it to 1f00 before continuing with your program.)
If you are disassembling something which is in memory at it's correct  address
(such as looking at ccp) then don't set the offset.  It defaults to 0 when dis
is first loaded.

---> l100	list your program - lists "about" 10 lines.

---> d100	do a dump of your program.

:Disassembly steps

Use the dump command to  find the ASCII DB areas.   Note that the 'a'  command
may be used to automatically  find the db's, but you  must then check them  to
insure that they don't	extend too far.  All  printable characters, 0dh,  0ah,
and 00h are considered candidates for ascii db's.  At least 8 characters in  a
row must be found to make sure	that long sequences of mov instructions  won't
be taken as db's.

Use the cnnnn,k command to kill erronious entries put in the control table  by
the a command,	but then immediately  put in  the right address,  such as  via
cnnnn,i

If you	wanted to  scan  the program  for ascii  db's  yourself, use  the  'c'
(control) command to set the beginning and end of ascii areas.	For example, a
program which starts out:

	0100	    jmp start
	0103	    db	'copyright .....'
	0117 start .....

would show up in the dump as:

	0100  c3170144 4f50xxxx  xxxxxxxx xxxxxxxx  *...copyr ight....*
	0110  xxxxxxxx xxxxxxxx  xxxxxxxx xxxxxxxx  *xxxxxxxx ........*

thus you would want to instruct the disassembler to switch to db mode at  103,
and back to instruction mode at 117, thus:

	c103,b
	c117,i

Continue doing	this, bracketing  every ascii  db which  is in	the middle  of
instructions, by a b control instruction  and an i control instruction.   Note
that multiple db's in a row  need not have separate cnnnn,b instructions,  but
that these  do cause  a  'line break',	i.e.  if you  have  a table  of  ascii
commands, for example:

	02e5	db	'load'
	02e9	db	'save'

the disassembler would disassemble these as:

	02e4	db	'loadsave'

you could put in  an additional control entry:	c2e9,b, which would cause  the
disassembler to generate:

	02e4	db	'load'
	02e8	db	'save'

which is much more readable and realistic.

Note that before generating each byte of  a db, a symbol table lookup is  done
to determine if there is a  label at that location, and  if so, a new line  is
started.  Thus if  'loadlit' and 'savelit'  were in the  symbol table, as  the
labels on the  'load' and 'save'  above, no separate  'b' control  instruction
would be required as the label would cause the break.

<<<<NOTE>>>> that at this time the automatic label checking is n-o-t done  for
ds instructions.  Make sure that each ds instrucion references only up to  the
next label.  This means that  multiple ds's in a  row must each be  explicitly
entered into the control table.  Presence of a label is not sufficient.

After building the control entries with  cnnnn,b and cnnnn,i put in a  control
entry cnnnn,e which defines  the address of  the end of  your program.	The  l
command will then  automatically stop there,  and in addition,	if you are  in
'save xxx.asm' mode,  the output  .asm file  will be  closed.  If  you do  mot
define a control 'e' entry,  then you will have to  use the break facility  to
stop the l command (don't  use control-c as that  will re-boot cp/m).  If  you
were writing an .asm file, you would have  to user the z command to close  the
file.

Next, you  would  list your  program  to determine  how  it looks.   when  you
recognize a routine by it's function, insert a label.
For example, if you saw that location  7ef was a character out routine	(type)
then enter a label into the symbol table:

	E7EF,.TYPE

NOTE that all symbols start with a '.',  so as to be dis- tinguished from  hex
data.

NOTE that if you want the disassembler	to make default labels for you, use  b
(for build labels)  instead of l  (for list program).	The b commands	causes
lnnnn default labels  to be  inserted in  the symbol  table for  every 2  byte
operand encountered (LXI, SHLD, JMP, etc).  It will undoubtedly make some  you
don't want, such as L0000.  You will have to:

	K.L0000		kill label L0000 from the table.

When you encounter data reference instructions, try to determine what type  of
area the instruction points to.  Typically,,  LXI instructions may point to  a
work area which should	be defined as a  DS, or to an  ASCII string, in  which
case we will have already made it a 'b' control instruction.  Operands of LHLD
and SHLD instructions  should be  made DW  instructions.  For  example if  you
encounter LHLD 0534H, then issue a control instruction:

	C534,W

NOTE that whatever mode you are last  in will remain in effect.  Therefore  if
534,w is the last entry in the control	table, all data from there on will  be
taken to be DW's.

Suppose that you determine that address 7cf is a 128 byte buffer for disk I/O.
You want it to disassemble to:

DKBUF		;07CF
	DS	80H

You do this as follows:

	C7CF,S		to start the DS
	C84F,B		to define it's end, and
	E7CF,.DKBUF	to put the symbol in the table.

Continue, iteratively using the 'l' command and the 'c' and 'e' commands until
you have the listing in  a nice format.  You will  then probably want to  save
the control symbol, and comments tables.  Or, you could have been saving  them
at checkpoint times (so  if you make a	major mistake you could  go back to  a
previous one).

To save a control file: sfilename.CTL	(any filename, may include a: or b:)

To save a symbol file:	sfilename.sym

To save a comments file: sfilename.doc	(not ".com" of course)

NOTE that the filetypes must be used as shown, but that any legal filename (or
disk:filename such as b:xxxx.CTL) may be used.

You could now control-c to return to CP/M, and come back later to resume  your
disassembly:

	RESOURCE
	o2200
	rtemp.com
	rtemp.sym
	rtemp.ctl
	uxxxx		(such as u4000)
	rtemp.doc

This will take you back exactly where you left off.

If you want to save a .asm file out to disk, do the following:

Make sure that there is a control entry defining the end of the program  (such
as c200,e) or else you	will have to specify  the ending address and  manually
type a z command to close the file.

	sfilename.asm

A message will indicate that  the file is opened.  Any	subsequent a, b, or  l
command will have  whatever is	listed written	to disk.   Encountering a  'e'
control, or typing a z command will then close the .asm file.  The listing may
be interrupted, and continued.	Since the  l command types only 10 lines,  use
laddr,ffff to list thru the end of the assembly.

If this is the 'final' save of the .asm file, you will probably want to put an
'org'  at  the	beginning  of  the  output  file,  as  well  as  generate  equ
instructions for  any  references outside  of  the program.   For  example,  a
typical cp/m program will have references to:

	bdos	at 5
	fcb	at 5ch
	tbuff	at 80h

the 'p' (for prologue) command generates the org, then scans the symbol  table
and generates equates:

	BDOS	EQU	05H
	FCB	EQU	05CH	(etc.)

If you	have a	"e" control  entry  in your  file, you	can list  as  follows:
laddr,ffff - the listing will continue until the "e" control entry is found
:Commands

RESOURCE types an "*" prompt when it is loaded.  You may then enter any of the
following commands.  Each  command is  a single letter	followed by  operands.
Commas are shown

NOTE: any command taking a  hex address (Dnnnn, etc) may  take a value in  the
form .label but  arithmetic may not  be performed.  (i.e.  d.start is ok,  but
d.start+8 not) as the delimiter, but a space will also work.

; Put comments into the program.   (must execute 'u' command first, to	assign
  area for comments to be placed)

	;addr,comment	enter a comment
	;addr		lists existing comment
	;		lists entire comments table
	;addr,		deletes existing comment

	note that '\' is treated as a new line, i.e. \test\ will be formatted:

	;
	;TEST
	;

A Attempt to  find DB's while  listing the program.   This command works  just
  like 'L', but attempts to find DB's of 8 chars or longer.  (see 'L'  command
  for operand formats)

B Build default sym  tbl (LXXXX) labels for  each 2 byte operand  encountered.
  Note 'B' is identical to 'L' except labels are built.  (see 'L' command  for
  operand formats)

C Control table usage:
	c		dump ctl tbl
	cnnnn		dump from starting
	cnnnn,x		define format from nnnn
			to next entry.	values of x:

			B = DB (attempts ASCII
				printable, 0DH, 0AH, 0)
			W = DW (attempts label)
			S = DW to next ctl entry
			I = instructions
			K = kill this ctl entry
			E = end of disassembly

  NOTE every control  entry causes  a "control	break" (NO,  RESOURCE was  NOT
  written in RPG) which means a new line will be started.  Thus if you have  a
  string in memory which disassembles as:

	DB	'Invalid operand',0DH
	DB	0AH

  You might want to change it putting the 0DH,0AH together on the second  line
  - just enter	a "B"  control entry  for the address  of the  0DH.  The  same
  technique could be used to make

	DB	'TYPESAVEDIR ERA REN '

  appear as

	DB	'TYPE'
	DB	'SAVE'
	DB	'DIR '
	DB	'ERA '
	DB	'REN '

D Dump:
	dxxxx		Dumps 80H from xxxx on
	daaaa,bbbb	Dumps from aaaa thru bbbb
	d,bbbb		Continues, thru bbbb
	d		Continues, 80H more

  NOTE 80H is the default dump length.	If you have a larger display, you  can
  change the default via:

	d=nn		nn is the HEX new default.

  For example, a 24 line tube could display 100H:

	d=100		or..
	d=100,200	Defaults to 100, dumps 200-2ff


  Other dumps:
	ds		dumps the symbol table.  Interrupt it by typing any key.
	ds.symbol	starts dumping at the specified symbol,
			or the nearest	symbol.  thus  "ds.f" starts the  dump
			at  the first  label   starting with the letter 'f'.

E Enter symbol:
	ennnn,.symbol	symbol may be of any length,
			and contain any char A-Z or 0-9,
			or "+" or "-".	This allows:
			E5D,.FCB+1.  Note the "+" is not
			checked, i.e. E5D,.FCB+2 would be
			wrong (assuming FCB is at 5C) but
			would be allowed to be entered.

  Note if you enter two symbols for  the same address, whichever one is  first
  alphabetically will show  up on  the disassembled  listing.  If  you have  a
  label which has the wrong address, you need not explicitly kill the old  one
  before entering the new.  A  label which is spelled  exactly the same as  an
  existing one	will  replace the  existing  one  even if  the	addresses  are
  different.

F Find	occurrence  of	address  or label.   Note  this  function  runs  until
  interrupted (press any key).
	fnnnn,ssss	find address nnnn in memory.  Start
			the search at ssss.  Runs forever.
			Press any key to stop.
	f		continue previous find command
	fnnnn		find nnnn starting at address you last
			stopped at in the f command

K Kill symbol from table
	k.symbol

  Note to rename a symbol,  such as when you had a system assigned lnnnn label
  but now want to make it meaningful:

	k.l0334
	e334,.type

  you could even:

	e.l0334,.type
	k.l0334

  but that takes more typing.

L List (disassemble).  This command is used to list the file, or to list it to
  disk after enabling the .ASM file save via 'SFILENAME.ASM' command

	l		lists 10 lines from prev pc
	lssss,eeee	lists from ssss to eeee
	l,eeee		lists from current pc to eeee
	lssss		lists 10 lines at ssss

  Note that if you have a control 'e' entry, then the list will stop when that
  address is found.  This allows you to 'lstart,ffff'.

  The 10 line default may be changed via:

	L=nn		where nn is a HEX line count, e.g.
	L=14		set to 20 lines/screen

  You can change the default and list, e.g.

	L=9,100		Dflt to 9 lines, list at 100.

  NOTE when using L to list the  .ASM program to disk, you should either  list
  the entire program at once using:  Lssss,eeee or, you can list small	pieces
  at a time.  As long as you list again without specifying a starting address,
  (L or L,nnnn) then the output file will continue uninterrupted.

  You may  do dump  commands,  and others,  without  affecting what  is  being
  written to disk.

O Offset for disassembly
	o		print current offset
	onnnn		establish new offset

  (note the offset is always added to any address specified in an a, b, d,  or
  l command.  to dump real memory, the	offset must be reset to 0 (O0)	before
  the dump.)

P Prolog generation - this routine  generates an ORG instruction, and  equates
  for any label outside of  a given low-hi address  pair.  (the start and  end
  addresses of your program).  e.g. if disassembling from 100 to 3ff, it  will
  generate 'fcb equ 5ch' if FCB is  in the symbol table.  In typical use,  you
  would 'sfilename.asm' then use the P command to write the prolog, then the L
  command to write the program itself.

	Pstart addr,end addr

Q Quiet command: any command which is preceeded by a q will be done 'quietly'.
  For example, to save a .asm program, you could just do:

	ql100,3ff	or	ql100,ffff if you have
			set the 'e' control in the control table.

  Another use is to  build a default  symbol table by taking  a pass thru  the
  program: QB100,xxxx

R Read .com, .ctl, .sym, or .doc file
	rfilename.com	reads in at offset+100h
	rfilename.ctl	loads the ctl table
	rfilename.sym	loads the sym file
	rfilename.doc	loads comments table (note 'u' must have been issued)

S Save .asm, .ctl, .sym, or .doc file
	sfilename.asm	use 'l' command to write, z to end
	sfilename.CTL	saves the CTL table
	stablename.sym	saves the sym file
	sfilename.doc	saves the comments table

U Use area of memory for comments table
	unnnn		such as ud000 if you had an open board at 0d000h

X purge sym tbl and CTL tbl

Z close .asm file (note that a preferred way to close the .asm file is to have
  specified a control entry for the end address (e.g. c1ff,e))

? prints statistics on symbol and control table usage, etc.
:WATCH FOR ----

Hoo, boy!  Hope  this kludge of  documentation is  enough to get  you going.
hmmm, better give you some of the gotcha's I've discovered...

* Symbols overflowing into the	.COM.  (Use ? command  to see how full	symbol
  table is)

* Control entries  overflowing into .SYM  (altho I can't  believe anyone  will
  have a program with more than 512 control entries!!!)

* Comments overflowing into BDOS (ug!!)

* Using an offset which is not in free memory and overlaying BDOS or whatever.

* The B(uild) command gobbling up too much when building a DB:	"B" will  take
  a DB 'GOBBELDY GOOK' followed by LXI H,FOO  and take the LXI as a '!'  (21H)
  so you'll have to manually stick a  new "I" control entry in at the  address
  of the LXI.  You  might also delete the  incorrect "I" entry which  RESOURCE
  stuck in (typically at the second byte of the LXI)

* Trying to  dump real memory  without setting	the offset back  to 0.	 (then
  forgetting to set it back to its proper value)

* Forgetting how big the .COM file you are disassembling was.

* Using RESOURCE to rip off software (yes, I know, you heard that before,  but
  only 3 in 100 needed to be told, and 2 in 100 needs to be told again, and  1
  in 100 doesn't give a rat's fuzzy behind anyway!!)

* Forgetting to take checkpoints when disassembling large files.  You may even
  want to rotate the names under which things are saved:

	STEMP1.SYM
	STEMP1.CTL
	STEMP1.DOC

* Missing a label:  Suppose you have a control entry for a DW, resulting in:

	DFLT:		;172C
		DW	100H

  but somewhere in the program, the following exists:

		LDA	 172DH

  Even if you did a B and have a label L172D, it won't show up since it's  in
  the	middle of a DW.  Instead, do this:

	K.l172d		kill the old label
	e172d,.dflt+1	put in the new label as a displacement
			off the beginning.

* improperly disassembling DW's (see previous item).  You might be tempted  to
  make DFLT a DB so that

	DFLT:		;172C
		DB	0
	L172D:		;172D
		DB	1

  Note that while  this disassembles  and reassembles  properly, it is not "as
  correct" as the technique used in the previous item.

* Having the "B" command overlay your "E" control entry.  What?  Well, "B"uild
  is pretty dumb.  If he finds 8 DB  type characters in a row, he fires off  a
  DB from then on until he runs out of those characters.  Suppose your program
  was 200 long (ended at 3FF), and  you had zeroed (aha!  Nice DB  candidates)
  memory there (there meaning at your offset address + whatever).

  Then you QB100,400 and viola! RESOURCE overlaid your "E" control with a "B".

	RESOURCE is relatively complete.  (well, actually,
	the phrase "rampant featureitis" has been "mentioned").
	...But there's always another day, and another K...

		SO... Here's my "wish list"

	..it might save you telling me YOU think such-and-such
	would be nice...

* Targets of  LHLD, SHLD should  automatically be  flagged as type  DW in  the
  control table.  Ditto  LDA and STA  as DB or	as second half	of DW.	 Ditto
  targets of LXI as DB (?).

*		E5C,.FCB
  followed by
		E6C,.FCB+
  should automatically calculate the appropriate displacement,	and put it in
  the symbol table.

* The comments	facility should  be enhanced  to allow	total SUBSTITUTION  of
  entire line(s) of the code, i.e. at address such-and-such, replace the  next
  3 bytes with the following arbitrary line.  This would help those "how do  I
  explain what was being done" cases such as:  LXI H,BUFFER AND 0FF00H

* Add the ability to, in one instruction, rename a default (LXXXX) label to  a
  meaningful name.

:			   "Quick" command summary

Any address may be replaced by .symbol i.e. D.START

;addr,comment		Enter a comment
;addr			Lists existing comment
;			Lists entire comments table
;addr,			Deletes existing comment
A(see "L" for operands) Attempt to find DB's
B(see "L" for operands) Build default sym tbl (Lxxxx)
C			Dump ctl tbl
Cnnnn			Dump ctl starting at nnnn
Cnnnn,x			Define format from nnnn (B,E,I,S,W)
Dxxxx			Dumps 80H from xxxx on
Daaaa,bbbb		Dumps from aaaa thru bbbb
D,bbbb			Dump thru bbbb
D			Dump 80H more
D=nn			nn= Hex dump size default.
Ds			Dumps the symbol table.
Ds.symbol		Sym dump starting at .symbol
Ennnn,.symbol		Enter symbol into table
Fnnnn,ssss		Find address nnnn starting at ssss
F			Continue previous find command
Fnnnn			Find nnnn
K.symbol		Kill symbol from symbol table
L			Lists 10 lines from prev pc
Lssss,eeee		Lists from ssss to eeee
L,eeee			Lists from current pc to eeee
Lssss			Lists 10 lines at ssss
L=nn			nn is hex list default # of lines
O			Print current offset
Onnnn			Establish new offset
Pstart addr,end addr	Generate program prolog
Q			Before any command suppresses
			console output: QB100,200
Rfilename.COM		Reads in at offset+100h
Rfilename.CTL		Loads the ctl table
Rfilename.SYM		Loads the sym file
Rfilename.DOC		Loads the comments table (note
Sfilename.ASM		Save .ASM file.  Write w/L, Z to end
Sfilename.CTL		Saves the CTL table
Sfilename.SYM		Saves the sym file
Sfilename.DOS		Saves the comments table
Unnnn			Use nnnn for comments table
X			Purge all symbols and control
Z			Write eof to .ASM file (
?			Prints statistics (sym, ctl, comments)
:				 ZESOURCE
		      disassembler for Z-80 programs
			Version 2.0 by Dave Barker

Let me open  this file with  a note  of appreciation to  Ward Christensen  who
wrote RESOURCE	for  8080 programs.   ZESOURCE	is a  modification  to	Ward's
original program (CPMUG vol.  42) to  give it the capability of  disassembling
Z80 object into TDL mnemonic  source files.  Thanks to	Ward this must be  the
most powerful  disassembler available  for 8080/Z-80  code.  (Note:   ZESOURCE
still runs on an 8080 machine)

A file	called Z80TEST.COM  was used  to test  ZSOURCE.  When  Z80TEST.COM  is
disassembled it will result in what would  be an alphabetic listing of all  of
the Z-80 opcodes if the mnemonics were Zilog's instead of TDL's.  This	object
file should agree exactly with the listings that Zilog has in their 'Z-80  CPU
Programming Reference  Card'  and  in  the back  of  'Z-80  Assembly  Language
Programming Manual'.

It should be pointed out that  ZSOURCE will generate TDL opcode mnemonics  but
not TDL pseudo-op mnemonics.   The pseudo-op mnemonics are  the same as  those
generated by RESOURCE (ORG, DB, DW, DS, and EQU).  If one is using a TDL  type
of assembler it is a simple matter to  use .OPSYN to equate ORG with .LOC,  DB
with .BYTE, etc.

The primary documentation for ZESOURCE	is Ward's RESOURCE.DOC (CPMUG  42.19).
Listed below is a description of the enhancements added to ZESOURCE.COM:

1. Disassembly to TDL mnemonics

2. Typing  'Rfilename.ALL' will cause the .DOC, .SYM, and .CTL files to all be
   read in for 'filename'.  If one of  the files is missing from the disk  the
   read operation will abort.  Note also  that the 'Uxxxx' command must  still
   be used prior to using 'R'.

3. Typing 'Sfilename.ALL' will cause all  three of the files mentioned	 above
   to be saved.

4. When the 'E' command is used to create a new symbol the existing symbol  at
   that address (if there is one) will be automatically killed with a  message
   sent to the console so stating.  If	there is more than one symbol at  that
   address (impossible if the .SYM file  was created under ZESOURCE) only  the
   first in the table will be killed.

5. Use of 'L' command in the format 'L=xx,addr' causes the new default length,
   xx, to take effect immediately (this is a bug in CPMUG 42.18).

As time and ambition are available it is planned to modify ZESOURCE to
produce Zilog mnemonics.

Any questions, suggestions, or (ugh!) bugs?  If so:

     Dave Barker/2293 Ralston Ave./Simi Valley, CA 93063/(805)526-2438

Or leave a message on CP/M-Net (tm) at (805)-527-9321.