[comp.sources.misc] v05i087: Z80 Assembler/Disassembler part 2 of 3

bownesrm@beowulf.UUCP (Keptin Comrade Dr. Bob) (12/19/88)

Posting-number: Volume 5, Issue 87
Submitted-by: "Keptin Comrade Dr. Bob" <bownesrm@beowulf.UUCP>
Archive-name: z80ad/part02

#!/bin/sh
# this is part 2 of an archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file zmac/zdis.c continued
#
CurArch=2
if test ! -r ._seq_
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < ._seq_ || exit 1
sed 's/^X//' << 'SHAR_EOF' >> zmac/zdis.c
X	undefined,		0,		/* ddf3 */
X	undefined,		0,		/* ddf4 */
X	undefined,		0,		/* ddf5 */
X	undefined,		0,		/* ddf6 */
X	undefined,		0,		/* ddf7 */
X
X	undefined,		0,		/* ddf8 */
X	"ld	sp,ix",		0,		/* ddf9 */
X	undefined,		0,		/* ddfa */
X	undefined,		0,		/* ddfb */
X	undefined,		0,		/* ddfc */
X	undefined,		0,		/* ddfd */
X	undefined,		0,		/* ddfe */
X	undefined,		0,		/* ddff */
X							/* ed */
X	undefined,		0,		/* ed00 */
X	undefined,		0,		/* ed01 */
X	undefined,		0,		/* ed02 */
X	undefined,		0,		/* ed03 */
X	undefined,		0,		/* ed04 */
X	undefined,		0,		/* ed05 */
X	undefined,		0,		/* ed06 */
X	undefined,		0,		/* ed07 */
X
X	undefined,		0,		/* ed08 */
X	undefined,		0,		/* ed09 */
X	undefined,		0,		/* ed0a */
X	undefined,		0,		/* ed0b */
X	undefined,		0,		/* ed0c */
X	undefined,		0,		/* ed0d */
X	undefined,		0,		/* ed0e */
X	undefined,		0,		/* ed0f */
X
X	undefined,		0,		/* ed10 */
X	undefined,		0,		/* ed11 */
X	undefined,		0,		/* ed12 */
X	undefined,		0,		/* ed13 */
X	undefined,		0,		/* ed14 */
X	undefined,		0,		/* ed15 */
X	undefined,		0,		/* ed16 */
X	undefined,		0,		/* ed17 */
X
X	undefined,		0,		/* ed18 */
X	undefined,		0,		/* ed19 */
X	undefined,		0,		/* ed1a */
X	undefined,		0,		/* ed1b */
X	undefined,		0,		/* ed1c */
X	undefined,		0,		/* ed1d */
X	undefined,		0,		/* ed1e */
X	undefined,		0,		/* ed1f */
X
X	undefined,		0,		/* ed20 */
X	undefined,		0,		/* ed21 */
X	undefined,		0,		/* ed22 */
X	undefined,		0,		/* ed23 */
X	undefined,		0,		/* ed24 */
X	undefined,		0,		/* ed25 */
X	undefined,		0,		/* ed26 */
X	undefined,		0,		/* ed27 */
X
X	undefined,		0,		/* ed28 */
X	undefined,		0,		/* ed29 */
X	undefined,		0,		/* ed2a */
X	undefined,		0,		/* ed2b */
X	undefined,		0,		/* ed2c */
X	undefined,		0,		/* ed2d */
X	undefined,		0,		/* ed2e */
X	undefined,		0,		/* ed2f */
X
X	undefined,		0,		/* ed30 */
X	undefined,		0,		/* ed31 */
X	undefined,		0,		/* ed32 */
X	undefined,		0,		/* ed33 */
X	undefined,		0,		/* ed34 */
X	undefined,		0,		/* ed35 */
X	undefined,		0,		/* ed36 */
X	undefined,		0,		/* ed37 */
X
X	undefined,		0,		/* ed38 */
X	undefined,		0,		/* ed39 */
X	undefined,		0,		/* ed3a */
X	undefined,		0,		/* ed3b */
X	undefined,		0,		/* ed3c */
X	undefined,		0,		/* ed3d */
X	undefined,		0,		/* ed3e */
X	undefined,		0,		/* ed3f */
X
X	"in	b,(c)",		0,		/* ed40 */
X	"out	(c),b",		0,		/* ed41 */
X	"sbc	hl,bc",		0,		/* ed42 */
X	"ld	(%02x%02xh),bc",2,		/* ed43 */
X	"neg",			0,		/* ed44 */
X	"retn",			0,		/* ed45 */
X	"im	0",		0,		/* ed46 */
X	"ld	i,a",		0,		/* ed47 */
X	
X	"in	c,(c)",		0,		/* ed48 */
X	"out	(c),c",		0,		/* ed49 */
X	"adc	hl,bc",		0,		/* ed4a */
X	"ld	bc,(%02x%02xh)",2,		/* ed4b */
X	undefined,		0,		/* ed4c */
X	"reti",			0,		/* ed4d */
X	undefined,		0,		/* ed4e */
X	undefined,		0,		/* ed4f */
X
X	"in	d,(c)",		0,		/* ed50 */
X	"out	(c),d",		0,		/* ed51 */
X	"sbc	hl,de",		0,		/* ed52 */
X	"ld	(%02x%02xh),de",2,		/* ed53 */
X	undefined,		0,		/* ed54 */
X	undefined,		0,		/* ed55 */
X	"im	1",		0,		/* ed56 */
X	"ld	a,i",		0,		/* ed57 */
X
X	"in	e,(c)",		0,		/* ed58 */
X	"out	(c),e",		0,		/* ed59 */
X	"adc	hl,de",		0,		/* ed5a */
X	"ld	de,(%02x%02xh)",2,		/* ed5b */
X	undefined,		0,		/* ed5c */
X	undefined,		0,		/* ed5d */
X	"im	2",		0,		/* ed5e */
X	undefined,		0,		/* ed5f */
X
X	"in	h,(c)",		0,		/* ed60 */
X	"out	(c),h",		0,		/* ed61 */
X	"sbc	hl,hl",		0,		/* ed62 */
X	undefined,		0,		/* ed63 */
X	undefined,		0,		/* ed64 */
X	undefined,		0,		/* ed65 */
X	undefined,		0,		/* ed66 */
X	"rrd",			0,		/* ed67 */
X
X	"in	l,(c)",		0,		/* ed68 */
X	"out	(c),l",		0,		/* ed69 */
X	"adc	hl,hl",		0,		/* ed6a */
X	undefined,		0,		/* ed6b */
X	undefined,		0,		/* ed6c */
X	undefined,		0,		/* ed6d */
X	undefined,		0,		/* ed6e */
X	"rld",			0,		/* ed6f */
X	
X	undefined,		0,		/* ed70 */
X	undefined,		0,		/* ed71 */
X	"sbc	hl,sp",		0,		/* ed72 */
X	"ld	(%02x%02xh),sp",2,		/* ed73 */
X	undefined,		0,		/* ed74 */
X	undefined,		0,		/* ed75 */
X	undefined,		0,		/* ed76 */
X	undefined,		0,		/* ed77 */
X
X	"in	a,(c)",		0,		/* ed78 */
X	"out	(c),a",		0,		/* ed79 */
X	"adc	hl,sp",		0,		/* ed7a */
X	"ld	sp,(%02x%02xh)",2,		/* ed7b */
X	undefined,		0,		/* ed7c */
X	undefined,		0,		/* ed7d */
X	undefined,		0,		/* ed7e */
X	undefined,		0,		/* ed7f */
X
X	undefined,		0,		/* ed80 */
X	undefined,		0,		/* ed81 */
X	undefined,		0,		/* ed82 */
X	undefined,		0,		/* ed83 */
X	undefined,		0,		/* ed84 */
X	undefined,		0,		/* ed85 */
X	undefined,		0,		/* ed86 */
X	undefined,		0,		/* ed87 */
X
X	undefined,		0,		/* ed88 */
X	undefined,		0,		/* ed89 */
X	undefined,		0,		/* ed8a */
X	undefined,		0,		/* ed8b */
X	undefined,		0,		/* ed8c */
X	undefined,		0,		/* ed8d */
X	undefined,		0,		/* ed8e */
X	undefined,		0,		/* ed8f */
X
X	undefined,		0,		/* ed90 */
X	undefined,		0,		/* ed91 */
X	undefined,		0,		/* ed92 */
X	undefined,		0,		/* ed93 */
X	undefined,		0,		/* ed94 */
X	undefined,		0,		/* ed95 */
X	undefined,		0,		/* ed96 */
X	undefined,		0,		/* ed97 */
X
X	undefined,		0,		/* ed98 */
X	undefined,		0,		/* ed99 */
X	undefined,		0,		/* ed9a */
X	undefined,		0,		/* ed9b */
X	undefined,		0,		/* ed9c */
X	undefined,		0,		/* ed9d */
X	undefined,		0,		/* ed9e */
X	undefined,		0,		/* ed9f */
X
X	"ldi",			0,		/* eda0 */
X	"cpi",			0,		/* eda1 */
X	"ini",			0,		/* eda2 */
X	"outi",			0,		/* eda3 */
X	undefined,		0,		/* eda4 */
X	undefined,		0,		/* eda5 */
X	undefined,		0,		/* eda6 */
X	undefined,		0,		/* eda7 */
X
X	"ldd",			0,		/* eda8 */
X	"cpd",			0,		/* eda9 */
X	"ind",			0,		/* edaa */
X	"outd",			0,		/* edab */
X	undefined,		0,		/* edac */
X	undefined,		0,		/* edad */
X	undefined,		0,		/* edae */
X	undefined,		0,		/* edaf */
X
X	"ldir",			0,		/* edb0 */
X	"cpir",			0,		/* edb1 */
X	"inir",			0,		/* edb2 */
X	"otir",			0,		/* edb3 */
X	undefined,		0,		/* edb4 */
X	undefined,		0,		/* edb5 */
X	undefined,		0,		/* edb6 */
X	undefined,		0,		/* edb7 */
X
X	"lddr",			0,		/* edb8 */
X	"cpdr",			0,		/* edb9 */
X	"indr",			0,		/* edba */
X	"otdr",			0,		/* edbb */
X	undefined,		0,		/* edbc */
X	undefined,		0,		/* edbd */
X	undefined,		0,		/* edbe */
X	undefined,		0,		/* edbf */
X
X	undefined,		0,		/* edc0 */
X	undefined,		0,		/* edc1 */
X	undefined,		0,		/* edc2 */
X	undefined,		0,		/* edc3 */
X	undefined,		0,		/* edc4 */
X	undefined,		0,		/* edc5 */
X	undefined,		0,		/* edc6 */
X	undefined,		0,		/* edc7 */
X
X	undefined,		0,		/* edc8 */
X	undefined,		0,		/* edc9 */
X	undefined,		0,		/* edca */
X	undefined,		0,		/* edcb */
X	undefined,		0,		/* edcc */
X	undefined,		0,		/* edcd */
X	undefined,		0,		/* edce */
X	undefined,		0,		/* edcf */
X
X	undefined,		0,		/* edd0 */
X	undefined,		0,		/* edd1 */
X	undefined,		0,		/* edd2 */
X	undefined,		0,		/* edd3 */
X	undefined,		0,		/* edd4 */
X	undefined,		0,		/* edd5 */
X	undefined,		0,		/* edd6 */
X	undefined,		0,		/* edd7 */
X
X	undefined,		0,		/* edd8 */
X	undefined,		0,		/* edd9 */
X	undefined,		0,		/* edda */
X	undefined,		0,		/* eddb */
X	undefined,		0,		/* eddc */
X	undefined,		0,		/* eddd */
X	undefined,		0,		/* edde */
X	undefined,		0,		/* eddf */
X
X	undefined,		0,		/* ede0 */
X	undefined,		0,		/* ede1 */
X	undefined,		0,		/* ede2 */
X	undefined,		0,		/* ede3 */
X	undefined,		0,		/* ede4 */
X	undefined,		0,		/* ede5 */
X	undefined,		0,		/* ede6 */
X	undefined,		0,		/* ede7 */
X
X	undefined,		0,		/* ede8 */
X	undefined,		0,		/* ede9 */
X	undefined,		0,		/* edea */
X	undefined,		0,		/* edeb */
X	undefined,		0,		/* edec */
X	undefined,		0,		/* eded */
X	undefined,		0,		/* edee */
X	undefined,		0,		/* edef */
X
X	undefined,		0,		/* edf0 */
X	undefined,		0,		/* edf1 */
X	undefined,		0,		/* edf2 */
X	undefined,		0,		/* edf3 */
X	undefined,		0,		/* edf4 */
X	undefined,		0,		/* edf5 */
X	undefined,		0,		/* edf6 */
X	undefined,		0,		/* edf7 */
X
X	undefined,		0,		/* edf8 */
X	undefined,		0,		/* edf9 */
X	undefined,		0,		/* edfa */
X	undefined,		0,		/* edfb */
X	undefined,		0,		/* edfc */
X	undefined,		0,		/* edfd */
X	undefined,		0,		/* edfe */
X	undefined,		0,		/* edff */
X							/* fd */
X	undefined,		0,		/* fd00 */
X	undefined,		0,		/* fd01 */
X	undefined,		0,		/* fd02 */
X	undefined,		0,		/* fd03 */
X	undefined,		0,		/* fd04 */
X	undefined,		0,		/* fd05 */
X	undefined,		0,		/* fd06 */
X	undefined,		0,		/* fd07 */
X
X	undefined,		0,		/* fd08 */
X	"add	iy,bc",		0,		/* fd09 */
X	undefined,		0,		/* fd0a */
X	undefined,		0,		/* fd0b */
X	undefined,		0,		/* fd0c */
X	undefined,		0,		/* fd0d */
X	undefined,		0,		/* fd0e */
X	undefined,		0,		/* fd0f */
X
X	undefined,		0,		/* fd10 */
X	undefined,		0,		/* fd11 */
X	undefined,		0,		/* fd12 */
X	undefined,		0,		/* fd13 */
X	undefined,		0,		/* fd14 */
X	undefined,		0,		/* fd15 */
X	undefined,		0,		/* fd16 */
X	undefined,		0,		/* fd17 */
X
X	undefined,		0,		/* fd18 */
X	"add	iy,de",		0,		/* fd19 */
X	undefined,		0,		/* fd1a */
X	undefined,		0,		/* fd1b */
X	undefined,		0,		/* fd1c */
X	undefined,		0,		/* fd1d */
X	undefined,		0,		/* fd1e */
X	undefined,		0,		/* fd1f */
X
X	undefined,		0,		/* fd20 */
X	"ld	iy,%02x%02xh",	2,		/* fd21 */
X	"ld	(%02x%02xh),iy",2,		/* fd22 */
X	"inc	iy",		0,		/* fd23 */
X	undefined,		0,		/* fd24 */
X	undefined,		0,		/* fd25 */
X	undefined,		0,		/* fd26 */
X	undefined,		0,		/* fd27 */
X
X	undefined,		0,		/* fd28 */
X	"add	iy,iy",		0,		/* fd29 */
X	"ld	iy,(%02x%02xh)",2,		/* fd2a */
X	"dec	iy",		0,		/* fd2b */
X	undefined,		0,		/* fd2c */
X	undefined,		0,		/* fd2d */
X	undefined,		0,		/* fd2e */
X	undefined,		0,		/* fd2f */
X
X	undefined,		0,		/* fd30 */
X	undefined,		0,		/* fd31 */
X	undefined,		0,		/* fd32 */
X	undefined,		0,		/* fd33 */
X	"inc	(iy+%02xh)",	1,		/* fd34 */
X	"dec	(iy+%02xh)",	1,		/* fd35 */
X	"ld	(iy+%02xh),%02xh",2,		/* fd36 */
X	undefined,		0,		/* fd37 */
X
X	undefined,		0,		/* fd38 */
X	"add	iy,sp",		0,		/* fd39 */
X	undefined,		0,		/* fd3a */
X	undefined,		0,		/* fd3b */
X	undefined,		0,		/* fd3c */
X	undefined,		0,		/* fd3d */
X	undefined,		0,		/* fd3e */
X	undefined,		0,		/* fd3f */
X
X	undefined,		0,		/* fd40 */
X	undefined,		0,		/* fd41 */
X	undefined,		0,		/* fd42 */
X	undefined,		0,		/* fd43 */
X	undefined,		0,		/* fd44 */
X	undefined,		0,		/* fd45 */
X	"ld	b,(iy+%02xh)",	1,		/* fd46 */
X	undefined,		0,		/* fd47 */
X
X	undefined,		0,		/* fd48 */
X	undefined,		0,		/* fd49 */
X	undefined,		0,		/* fd4a */
X	undefined,		0,		/* fd4b */
X	undefined,		0,		/* fd4c */
X	undefined,		0,		/* fd4d */
X	"ld	c,(iy+%02xh)",	1,		/* fd4e */
X	undefined,		0,		/* fd4f */
X	
X	undefined,		0,		/* fd50 */
X	undefined,		0,		/* fd51 */
X	undefined,		0,		/* fd52 */
X	undefined,		0,		/* fd53 */
X	undefined,		0,		/* fd54 */
X	undefined,		0,		/* fd55 */
X	"ld	d,(iy+%02xh)",	1,		/* fd56 */
X	undefined,		0,		/* fd57 */
X
X	undefined,		0,		/* fd58 */
X	undefined,		0,		/* fd59 */
X	undefined,		0,		/* fd5a */
X	undefined,		0,		/* fd5b */
X	undefined,		0,		/* fd5c */
X	undefined,		0,		/* fd5d */
X	"ld	e,(iy+%02xh)",	1,		/* fd5e */
X	undefined,		0,		/* fd5f */
X	
X	undefined,		0,		/* fd60 */
X	undefined,		0,		/* fd61 */
X	undefined,		0,		/* fd62 */
X	undefined,		0,		/* fd63 */
X	undefined,		0,		/* fd64 */
X	undefined,		0,		/* fd65 */
X	"ld	h,(iy+%02xh)",	1,		/* fd66 */
X	undefined,		0,		/* fd67 */
X
X	undefined,		0,		/* fd68 */
X	undefined,		0,		/* fd69 */
X	undefined,		0,		/* fd6a */
X	undefined,		0,		/* fd6b */
X	undefined,		0,		/* fd6c */
X	undefined,		0,		/* fd6d */
X	"ld	l,(iy+%02xh)",	1,		/* fd6e */
X	undefined,		0,		/* fd6f */
X	
X	"ld	(iy+%02xh),b",	1,		/* fd70 */
X	"ld	(iy+%02xh),c",	1,		/* fd71 */
X	"ld	(iy+%02xh),d",	1,		/* fd72 */
X	"ld	(iy+%02xh),e",	1,		/* fd73 */
X	"ld	(iy+%02xh),h",	1,		/* fd74 */
X	"ld	(iy+%02xh),l",	1,		/* fd75 */
X	undefined,		0,		/* fd76 */
X	"ld	(iy+%02xh),a",	1,		/* fd77 */
X
X	undefined,		0,		/* fd78 */
X	undefined,		0,		/* fd79 */
X	undefined,		0,		/* fd7a */
X	undefined,		0,		/* fd7b */
X	undefined,		0,		/* fd7c */
X	undefined,		0,		/* fd7d */
X	"ld	a,(iy+%02xh)",	1,		/* fd7e */
X	undefined,		0,		/* fd7f */
X
X	undefined,		0,		/* fd80 */
X	undefined,		0,		/* fd81 */
X	undefined,		0,		/* fd82 */
X	undefined,		0,		/* fd83 */
X	undefined,		0,		/* fd84 */
X	undefined,		0,		/* fd85 */
X	"add	a,(iy+%02xh)",	1,		/* fd86 */
X	undefined,		0,		/* fd87 */
X
X	undefined,		0,		/* fd88 */
X	undefined,		0,		/* fd89 */
X	undefined,		0,		/* fd8a */
X	undefined,		0,		/* fd8b */
X	undefined,		0,		/* fd8c */
X	undefined,		0,		/* fd8d */
X	"adc	a,(iy+%02xh)",	1,		/* fd8e */
X	undefined,		0,		/* fd8f */
X	
X	undefined,		0,		/* fd90 */
X	undefined,		0,		/* fd91 */
X	undefined,		0,		/* fd92 */
X	undefined,		0,		/* fd93 */
X	undefined,		0,		/* fd94 */
X	undefined,		0,		/* fd95 */
X	"sub	(iy+%02xh)",	1,		/* fd96 */
X	undefined,		0,		/* fd97 */
X
X	undefined,		0,		/* fd98 */
X	undefined,		0,		/* fd99 */
X	undefined,		0,		/* fd9a */
X	undefined,		0,		/* fd9b */
X	undefined,		0,		/* fd9c */
X	undefined,		0,		/* fd9d */
X	"sbc	a,(iy+%02xh)",	1,		/* fd9e */
X	undefined,		0,		/* fd9f */
X	
X	undefined,		0,		/* fda0 */
X	undefined,		0,		/* fda1 */
X	undefined,		0,		/* fda2 */
X	undefined,		0,		/* fda3 */
X	undefined,		0,		/* fda4 */
X	undefined,		0,		/* fda5 */
X	"and	(iy+%02xh)",	1,		/* fda6 */
X	undefined,		0,		/* fda7 */
X
X	undefined,		0,		/* fda8 */
X	undefined,		0,		/* fda9 */
X	undefined,		0,		/* fdaa */
X	undefined,		0,		/* fdab */
X	undefined,		0,		/* fdac */
X	undefined,		0,		/* fdad */
X	"xor	(iy+%02xh)",	1,		/* fdae */
X	undefined,		0,		/* fdaf */
X	
X	undefined,		0,		/* fdb0 */
X	undefined,		0,		/* fdb1 */
X	undefined,		0,		/* fdb2 */
X	undefined,		0,		/* fdb3 */
X	undefined,		0,		/* fdb4 */
X	undefined,		0,		/* fdb5 */
X	"or	(iy+%02xh)",	1,		/* fdb6 */
X	undefined,		0,		/* fdb7 */
X
X	undefined,		0,		/* fdb8 */
X	undefined,		0,		/* fdb9 */
X	undefined,		0,		/* fdba */
X	undefined,		0,		/* fdbb */
X	undefined,		0,		/* fdbc */
X	undefined,		0,		/* fdbd */
X	"cp	(iy+%02xh)",	1,		/* fdbe */
X	undefined,		0,		/* fdbf */
X	
X	undefined,		0,		/* fdc0 */
X	undefined,		0,		/* fdc1 */
X	undefined,		0,		/* fdc2 */
X	undefined,		0,		/* fdc3 */
X	undefined,		0,		/* fdc4 */
X	undefined,		0,		/* fdc5 */
X	undefined,		0,		/* fdc6 */
X	undefined,		0,		/* fdc7 */
X
X	undefined,		0,		/* fdc8 */
X	undefined,		0,		/* fdc9 */
X	undefined,		0,		/* fdca */
X	"fd cb	%02x,%02x",	2,		/* fdcb */
X	undefined,		0,		/* fdcc */
X	undefined,		0,		/* fdcd */
X	undefined,		0,		/* fdce */
X	undefined,		0,		/* fdcf */
X	
X	undefined,		0,		/* fdd0 */
X	undefined,		0,		/* fdd1 */
X	undefined,		0,		/* fdd2 */
X	undefined,		0,		/* fdd3 */
X	undefined,		0,		/* fdd4 */
X	undefined,		0,		/* fdd5 */
X	undefined,		0,		/* fdd6 */
X	undefined,		0,		/* fdd7 */
X
X	undefined,		0,		/* fdd8 */
X	undefined,		0,		/* fdd9 */
X	undefined,		0,		/* fdda */
X	undefined,		0,		/* fddb */
X	undefined,		0,		/* fddc */
X	undefined,		0,		/* fddd */
X	undefined,		0,		/* fdde */
X	undefined,		0,		/* fddf */
X	
X	undefined,		0,		/* fde0 */
X	"pop	iy",		0,		/* fde1 */
X	undefined,		0,		/* fde2 */
X	"ex	(sp),iy",	0,		/* fde3 */
X	undefined,		0,		/* fde4 */
X	"push	iy",		0,		/* fde5 */
X	undefined,		0,		/* fde6 */
X	undefined,		0,		/* fde7 */
X
X	undefined,		0,		/* fde8 */
X	"jp	(iy)",		0,		/* fde9 */
X	undefined,		0,		/* fdea */
X	undefined,		0,		/* fdeb */
X	undefined,		0,		/* fdec */
X	undefined,		0,		/* fded */
X	undefined,		0,		/* fdee */
X	undefined,		0,		/* fdef */
X	
X	undefined,		0,		/* fdf0 */
X	undefined,		0,		/* fdf1 */
X	undefined,		0,		/* fdf2 */
X	undefined,		0,		/* fdf3 */
X	undefined,		0,		/* fdf4 */
X	undefined,		0,		/* fdf5 */
X	undefined,		0,		/* fdf6 */
X	undefined,		0,		/* fdf7 */
X
X	undefined,		0,		/* fdf8 */
X	"ld	sp,iy",		0,		/* fdf9 */
X	undefined,		0,		/* fdfa */
X	undefined,		0,		/* fdfb */
X	undefined,		0,		/* fdfc */
X	undefined,		0,		/* fdfd */
X	undefined,		0,		/* fdfe */
X	undefined,		0,		/* fdff */
X};
X
Xint	curaddr = 0;
X
Xmain ()
X{
X	int	i, j, arg1, arg2;
X	struct opcode	*code;
X	int	addr;
X
X	for (;;) {
X		addr = curaddr;
X		i = gethex();
X		if (!major[i].name) {
X			j = major[i].args;
X			i = gethex();
X			while (!minor[j][i].name) {
X				j = minor[j][i].args;
X				i = gethex ();
X			}
X			code = &minor[j][i];
X		} else
X			code = &major[i];
X		printf ("%04x\t", addr);
X		switch (code->args) {
X		case 2:
X			printf (code->name, gethex(), gethex());
X			break;
X		case 1:
X			printf (code->name, gethex());
X			break;
X		case 0:
X			printf (code->name);
X			break;
X		} 
X		putchar ('\n');
X	}
X}
X
Xint	inline;
Xint	index;
X
Xchar	linebuf[1024];
X
Xint	hexbuf[1024];
X
Xgethex ()
X{
X	if (index == inline) {
X	again:	;
X		if (gets (linebuf) == 0)
X			exit (0);
X		if (strlen (linebuf) < 9)
X			goto again;
X		inline = fromhex (linebuf+1);
X		for (index = 0; index < inline; index++)
X			hexbuf[index] = fromhex (linebuf+9 + 2 * index);
X		index = 0;
X	}
X	++curaddr;
X	return hexbuf[index++];
X}
X
X#define hexval(c)	(('0' <= (c) && (c) <= '9') ? (c) - '0' :\
X			(('a' <= (c) && (c) <= 'f') ? (c) - 'a' + 10 :\
X			(('A' <= (c) && (c) <= 'F') ? (c) - 'A' + 10 :\
X				-1 ))) 
X
Xfromhex (c)
Xchar	*c;
X{
X	return hexval(c[0]) * 16 + hexval(c[1]);
X}
SHAR_EOF
chmod 0755 zmac/zdis.c
sed 's/^X//' << 'SHAR_EOF' > zmac/zmac.1
X.TH ZMAC l 
X.SH NAME
Xzmac \- macro cross-assembler for the Zilog Z80 microprocessor
X.SH SYNOPSIS
Xzmac [-bdefgilLmnopst] infile
X.SH DESCRIPTION
XThe
X.I Zmac
Xassembler is modeled after the Intel 8080 macro cross-assembler
Xfor the Intel 8080 by Ken Borgendale.  The major features are:  Full
Xmacro capabilities, Conditional assembly, A very flexible set of
Xlisting options and pseudo-ops, Symbol table output, Error report,
XElimination of sequential searching, Commenting of source, Facilities
Xfor system definiton files.
X.PP
X.I Zmac
Xassembles the specified input file (default extension .z) and
Xproduces a .hex output file.  The options are:
X.TP 8
X.B b
Xno binary  
X.TP 8
X.B d
Xdebug  
X.TP 8
X.B e
Xerror list only  
X.TP 8
X.B f
Xprint if skipped lines  
X.TP 8
X.B g
Xdo not list extra code  
X.TP 8
X.B i
Xdo not list include files 
X.TP 8
X.B l
Xno list  
X.TP 8
X.B L
Xforce listing of everything 
X.TP 8
X.B m
Xprint macro expansions  
X.TP 8
X.B n
Xput line numbers off 
X.TP 8
X.B o
Xlist to standard output  
X.TP 8
X.B p
Xput out four \\n's for eject 
X.TP 8
X.B s
Xdon't produce a symbol list  
X.TP 8
X.B t
Xdon't know what this option does
X.SH SEE ALSO
Xzdis(l)
X.SH FILES
XSource is in /usr/local/src/zmac directory.
X.SH BUGS
XThe man page is incomplete.  If anyone discovers more information about
Xusing zmac, please consider helping to update the man page.
SHAR_EOF
chmod 0755 zmac/zmac.1
sed 's/^X//' << 'SHAR_EOF' > zmac/zmac.y
X%{
X/*
X *  zmac -- macro cross-assembler for the Zilog Z80 microprocessor
X *
X *  Bruce Norskog	4/78
X *
X *  Last modification  1-18-87 by cdk
X *  This assembler is modeled after the Intel 8080 macro cross-assembler
X *  for the Intel 8080 by Ken Borgendale.  The major features are:
X *	1.  Full macro capabilities
X *	2.  Conditional assembly
X *	3.  A very flexible set of listing options and pseudo-ops
X *	4.  Symbol table output
X *	5.  Error report
X *	6.  Elimination of sequential searching
X *	7.  Commenting of source
X *	8.  Facilities for system definiton files
X *
X * Revision History:
X *
X * jrp	3-8-82	Converted to run on Vax, updated syntax to conform better
X *		to the Zilog standard.
X *
X * jrp	3-15-82	Added underscore as a character type in the lex table
X *		'numpart' (0x5F).
X *
X *		Changed maximum number of characters in a label to 15
X *		from 7. Note that 'putsymtab' uses this value inside
X *		of a quoted string, so we use 15.
X *
X * jrp	2-15-83	Fixed 'getlocal' to return better local labels. It used
X *		to crash after 6 invocations.
X *
X * jrp	6-7-83	Fixed bug in the ADD IX,... instruction.
X *
X * jrp	5-11-84	Added code to print unused labels out with the symbol table
X *		Also sped up the macro processor by using stdio.
X *
X * jrp 5-22-84	Added include files ala ormac
X *
X * jrp 8-27-84	Added PHASE/DEPHASE commands
X *
X * cdk 9-20-86	Converted to run on a Pyramid.  This meant changing yylval
X *		to be a %union, and then putting in the appropriate
X *		typecasts where ints are pointers are used interchangeably.
X *		The current version still probably won't run on machines where
X *		sizeof(int) != sizeof(char *).
X *		Also changed emit() to use varargs, and got rid of the
X *		old style = in front of yacc action code.
X *			-Colin Kelley  vu-vlsi!colin
X *
X * cdk 10-2-86	Added some more typecasts to keep lint a little happier.
X *		Removed several unused variables.  Changed most vars
X *		declared as char to int, since many of them were being
X *		compared with -1!  I still don't know what's going on with
X *		est[][] being malloc'd and free'd everywhere...it looks pretty
X *		fishy...
X *
X * cdk 1-18-87  Added MIO code to emulate 'mfile' using malloc()'d memory.
X *		This was needed to get the code to work when compiled under
X *		MSC 4.0 on a PC, and it's probably faster anyway.
X *
X * cdk 2-5-87	Added 'cmp' as a synonym for 'cp', 'jmp' as a synonym for
X *		'jp', and added tolerance of accumulator specification for arithmetic
X *		and logical instructions.  (For example, 'or a,12' is now accepted,
X *		same as 'or 12'.)
X */
X
X
X#define MIO		/* use emulation routines from mio.c */
X
X#include <stdio.h>
X#ifdef MSDOS
X#include <fcntl.h>
X#else
X#include <sys/file.h>	/* for open() calls */
X#endif
X
X#ifdef vax11c
X#define unlink(filename) delete(filename)
X#endif
X
X#ifdef MIO
XFILE *mfopen();
X#else
X#define mfopen(filename,mode) fopen(filename,mode)
X#define mfclose(filename,mode) fclose(filename,mode) 
X#define mfputc(c,f) putc(c,f)
X#define mfgetc(f) getc(f)
X#define mfseek(f,loc,origin) fseek(f,loc,origin)
X#define mfread(ptr,size,nitems,f) fread(ptr,size,nitems,f)
X#define mfwrite(ptr,size,nitems,f) fread(ptr,size,nitems,f)
X#endif /* MIO */
X
X/*
X * DEBUG turns on pass reporting.
X * Macro debug and Token debug enables.
X#define	DEBUG
X#define	M_DEBUG	
X#define	T_DEBUG
X */
X
X#define ITEMTABLESIZE	2000
X#define TEMPBUFSIZE	200
X#define LINEBUFFERSIZE	200
X#define EMITBUFFERSIZE	200
X#define MAXSYMBOLSIZE	15
X#define IFSTACKSIZE	20
X#define MAXIFS		150
X#define TITLELEN	50
X#define BINPERLINE	16
X#define	PARMMAX		25
X#define MAXEXP		25
X#define SYMMAJIC	07203
X#define	NEST_IN		8
X
X
X#define loop	for(;;)
X
Xyyerror(err)
Xchar *err;
X{}		/* we will do our own error printing */
X
Xstruct	item	{
X	char	*i_string;
X	int	i_value;
X	int	i_token;
X	int	i_uses;
X};
X
XFILE	*fout,
X	*fbuf,
X	*fin[NEST_IN],
X	*now_file ;
X
Xchar *malloc() ;
X
Xint	pass2;	/*set when pass one completed*/
Xint	dollarsign ;	/* location counter */
Xint	olddollar ;	/* kept to put out binary */
X
X/* program counter save for PHASE/DEPHASE */
Xint	phdollar, phbegin, phaseflag ;
X
Xchar	*src_name[NEST_IN] ;
Xint	linein[NEST_IN] ;
Xint	now_in ;
X
X
X
X#define bflag	0	/* balance error */
X#define eflag	1	/* expression error */
X#define fflag	2	/* format error */
X#define iflag	3	/* bad digits */
X#define mflag	4	/* multiply defined */
X#define pflag	5	/* phase error */
X#define uflag	6	/* undeclared used */
X#define vflag	7	/* value out of range */
X#define oflag	8	/* phase/dephase error */
X
X#define FLAGS	9	/* number of flags */
X
Xchar	err[FLAGS];
Xint	keeperr[FLAGS];
Xchar	errlet[]="BEFIMPUVO";
Xchar	*errname[]={
X	"Balance",
X	"Expression",
X	"Format",
X	"Digit",
X	"Mult. def.",
X	"Phase",
X	"Undeclared",
X	"Value",
X	"Phase/Dephase",
X};
X
X
Xchar	linebuf[LINEBUFFERSIZE];
Xchar	*lineptr;
Xchar	*linemax = &linebuf[LINEBUFFERSIZE];
X
Xchar	outbin[BINPERLINE];
Xchar	*outbinp = outbin;
Xchar	*outbinm = &outbin[BINPERLINE];
X
Xchar	emitbuf[EMITBUFFERSIZE];
Xchar	*emitptr;
X
Xchar	ifstack[IFSTACKSIZE];
Xchar	*ifptr;
Xchar	*ifstmax = &ifstack[IFSTACKSIZE-1];
X
X
Xchar	expif[MAXIFS];
Xchar	*expifp;
Xchar	*expifmax = &expif[MAXIFS];
X
Xchar	hexadec[] = "0123456789ABCDEF" ;
Xchar	*expstack[MAXEXP];
Xint	expptr;
X
X
Xint	nitems;
Xint	linecnt;
Xint	nbytes;
Xint	invented;
X
X
Xchar	tempbuf[TEMPBUFSIZE];
Xchar	*tempmax = &tempbuf[TEMPBUFSIZE-1];
X
Xchar	inmlex;
Xchar	arg_flag;
Xchar	quoteflag;
Xint	parm_number;
Xint	exp_number;
Xchar	symlong[] = "Symbol too long";
X
Xint	disp;
X#define FLOC	PARMMAX
X#define TEMPNUM	PARMMAX+1
Xchar	**est;
Xchar	**est2;
X
Xchar	*floc;
Xint	mfptr;
XFILE	*mfile;
X
Xchar	*writesyms;
X
X
Xchar	*title;
Xchar	titlespace[TITLELEN];
Xchar	*timp,*ctime();
Xchar	*sourcef;
Xchar	src[15];
Xchar	bin[15];
Xchar	mtmp[15];
Xchar	listf[15];
X
Xchar	bopt = 1,
X	edef = 1,
X	eopt = 1,
X	fdef = 0,
X	fopt = 0,
X	gdef = 1,
X	gopt = 1,
X	iopt = 0 ,	/* list include files */
X	lstoff = 0,
X	lston = 0,	/* flag to force listing on */
X	lopt = 0,
X	mdef = 0,
X	mopt = 0,
X	nopt = 1 ,	/* line numbers on as default */
X	oopt = 0,
X	popt = 1,	/* form feed as default page eject */
X	sopt = 0,	/* turn on symbol table listing */
X	topt = 1;
X	saveopt;
X
Xchar	xeq_flag = 0;
Xint	xeq;
X
Xlong	now;
Xint	line;
Xint	page = 1;
X
Xstruct stab {
X	char	t_name[MAXSYMBOLSIZE+1];
X	int	t_value;
X	int	t_token;
X};
X
X/*
X *  push back character
X */
Xint	peekc;
X
X
X/*
X *  add a character to the output line buffer
X */
Xaddtoline(ac)
Xint	ac;
X{
X	/* check for EOF from stdio */
X	if (ac == -1)
X		ac = 0 ;
X	if (inmlex)
X		return(ac);
X	if (lineptr >= linemax)
X		error("line buffer overflow");
X	*lineptr++ = ac;
X	return(ac);
X}
X
X#include <varargs.h>
X
X/*
X *  put values in buffer for outputing
X */
X
X/*VARARGS*/
X/*ARGSUSED*/
Xemit(va_alist)
Xva_dcl
X{	
X	register int bytes;
X	va_list ap;
X	va_start(ap);
X
X	bytes = va_arg(ap,int);
X
X	while	(--bytes >= 0)
X		if (emitptr >= &emitbuf[EMITBUFFERSIZE])
X			error("emit buffer overflow");
X		else {
X			*emitptr++ = va_arg(ap,int);
X		}
X	va_end(ap);
X}
X
X
Xemit1(opcode,regvalh,data16,type)
Xint	opcode,regvalh,data16,type;
X{
X	if (regvalh & 0x8000) {
X		if (type & 1 == 0 && (disp > 127 || disp < -128))
X			err[vflag]++;
X		switch(type) {
X		case 0:
X			if (opcode & 0x8000)
X				emit(4, regvalh >> 8, opcode >> 8, disp, opcode);
X			else
X				emit(3, regvalh >> 8, opcode, disp);
X			break;
X		case 1:
X			emit(2, regvalh >> 8, opcode);
X			break;
X		case 2:
X			if (data16 > 255 || data16 < -128)
X				err[vflag]++;
X			emit(4, regvalh >> 8, opcode, disp, data16);
X			break;
X		case 5:
X			emit(4, regvalh >> 8, opcode, data16, data16 >> 8);
X		}
X	} else
X		switch(type) {
X		case 0:
X			if (opcode & 0100000)
X				emit(2, opcode >> 8, opcode);
X			else
X				emit(1, opcode);
X			break;
X		case 1:
X			if (opcode & 0100000)
X				emit(2, opcode >> 8, opcode);
X			else
X				emit(1, opcode);
X			break;
X		case 2:
X			if (data16 > 255 || data16 < -128)
X				err[vflag]++;
X			emit(2, opcode, data16);
X			break;
X		case 3:
X			if (data16 >255 || data16 < -128)
X				err[vflag]++;
X			emit(2, opcode, data16);
X			break;
X		case 5:
X			if (opcode & 0100000)
X				emit(4, opcode >> 8, opcode, data16, data16 >> 8);
X			else
X				emit(3, opcode, data16, data16 >> 8);
X		}
X}
X
X
X
X
Xemitdad(rp1,rp2)
Xint rp1,rp2;
X{
X	if (rp1 & 0x8000)
X		emit(2,rp1 >> 8, rp2 + 9);
X	else
X		emit(1,rp2 + 9);
X}
X
X
Xemitjr(opcode,expr)
Xint	opcode,expr;
X{
X	disp = expr - dollarsign - 2;
X	if (disp > 127 || disp < -128)
X		err[vflag]++;
X	emit(2, opcode, disp);
X}
X
X
X
X
X/*
X *  put out a byte of binary 
X */
Xputbin(v)
X{
X	if(!pass2 || !bopt) return;
X	*outbinp++ = v;
X	if (outbinp >= outbinm) flushbin();
X}
X
X
X
X/*
X *  output one line of binary in INTEL standard form
X */
Xflushbin()
X{
X	register  char *p;
X	register check;
X
X	if (!pass2 || !bopt)
X		return;
X	nbytes += outbinp-outbin;
X	if (check = outbinp-outbin) {
X		putc(':', fbuf);
X		puthex(check, fbuf);
X		puthex(olddollar>>8, fbuf);
X		puthex(olddollar, fbuf);
X		puthex(0, fbuf);
X		check += (olddollar >> 8) + olddollar;
X		olddollar += (outbinp-outbin);
X		for (p=outbin; p<outbinp; p++) {
X			puthex(*p, fbuf);
X			check += *p;
X		}
X		puthex(256-check, fbuf);
X		putc('\n', fbuf);
X		outbinp = outbin;
X	}
X}
X
X
X
X/*
X *  put out one byte of hex
X */
Xputhex(byte, buf)
Xchar	byte;
XFILE	*buf;
X{
X	putc(hexadec[(byte >> 4) & 017], buf);
X	putc(hexadec[byte & 017], buf);
X}
X
X/*
X *  put out a line of output -- also put out binary
X */
Xlist(optarg)
Xint	optarg;
X{
X	register char *	p;
X	register int	i;
X	int  lst;
X
X	if (!expptr)
X		linecnt++;
X	addtoline('\0');
X	if (pass2) {
X		lst = iflist();
X		if (lst) {
X			lineout();
X			if (nopt)
X				fprintf(fout, "%4d:\t", linein[now_in]);
X			puthex(optarg >> 8, fout);
X			puthex(optarg, fout);
X			fputs("  ", fout);
X			for (p = emitbuf; (p < emitptr) && (p - emitbuf < 4); p++) {
X				puthex(*p, fout);
X			}
X			for (i = 4 - (p-emitbuf); i > 0; i--)
X				fputs("  ", fout);
X			putc('\t', fout);
X			fputs(linebuf, fout);
X		}
X
X		if (bopt) {
X			for (p = emitbuf; p < emitptr; p++)
X				putbin(*p);
X		}
X
X
X		p = emitbuf+4;
X		while (lst && gopt && p < emitptr) {
X			lineout();
X			if (nopt) putc('\t', fout);
X			fputs("      ", fout);
X			for (i = 0; (i < 4) && (p < emitptr);i++) {
X				puthex(*p, fout);
X				p++;
X			}
X			putc('\n', fout);
X		}
X
X
X		lsterr2(lst);
X	} else
X		lsterr1();
X	dollarsign += emitptr - emitbuf;
X	emitptr = emitbuf;
X	lineptr = linebuf;
X}
X
X
X
X/*
X *  keep track of line numbers and put out headers as necessary
X */
Xlineout()
X{
X	if (line == 60) {
X		if (popt)
X			putc('\014', fout);	/* send the form feed */
X		else
X			fputs("\n\n\n\n\n", fout);
X		line = 0;
X	}
X	if (line == 0) {
X		fprintf(fout, "\n\n%s %s\t%s\t Page %d\n\n\n",
X			&timp[4], &timp[20], title, page++);
X		line = 4;
X	}
X	line++;
X}
X
X
X/*
X *  cause a page eject
X */
Xeject()
X{
X	if (pass2 && iflist()) {
X		if (popt) {
X			putc('\014', fout);	/* send the form feed */
X		} else {
X			while (line < 65) {
X				line++;
X				putc('\n', fout);
X			}
X		}
X	}
X	line = 0;
X}
X
X
X/*
X *  space n lines on the list file
X */
Xspace(n)
X{
X	int	i ;
X	if (pass2 && iflist())
X		for (i = 0; i<n; i++) {
X			lineout();
X			putc('\n', fout);
X		}
X}
X
X
X/*
X *  Error handling - pass 1
X */
Xlsterr1() {
X	register int i;
X	if (topt)
X		for (i = 0; i <= 4; i++)
X			if (err[i]) {
X				errorprt(i);
X				err[i] = 0;
X			}
X}
X
X
X/*
X *  Error handling - pass 2.
X */
Xlsterr2(lst)
Xint	lst;
X{
X	register int i;
X	for (i=0; i<FLAGS; i++)
X		if (err[i]) {
X			if (lst) {
X				lineout();
X				putc(errlet[i], fout);
X				putc('\n', fout);
X			}
X			err[i] = 0;
X			keeperr[i]++;
X			if (i > 4 && topt)
X				errorprt(i);
X		}
X
X	fflush(fout);	/*to avoid putc(har) mix bug*/
X}
X
X/*
X *  print diagnostic to error terminal
X */
Xerrorprt(errnum)
Xint	errnum;
X{
X	fprintf(stderr,"%d: %s error\n%s\n",
X		linecnt, errname[errnum], linebuf) ;
X	fflush(stderr) ;
X	return ;
X}
X
X
X/*
X *  list without address -- for comments and if skipped lines
X */
Xlist1()
X{
X	int lst;
X
X	addtoline('\0');
X	lineptr = linebuf;
X	if (!expptr) linecnt++;
X	if (pass2)
X		if (lst = iflist()) {
X			lineout();
X			if (nopt)
X				fprintf(fout, "%4d:\t", linein[now_in]);
X			fprintf(fout, "\t\t%s", linebuf);
X			lsterr2(lst);
X		}
X	else
X		lsterr1();
X}
X
X
X/*
X *  see if listing is desired
X */
Xiflist()
X{
X	register  i, j;
X
X	if (lston)
X		return(1) ;
X	if (lopt)
X		return(0);
X	if (*ifptr && !fopt)
X		return(0);
X	if (!lstoff && !expptr)
X		return(1);
X	j = 0;
X	for (i=0; i<FLAGS; i++)
X		if (err[i])
X			j++;
X	if (expptr)
X		return(mopt || j);
X	if (eopt && j)
X		return(1);
X	return(0);
X}
X
X
X%}
X
X%union	{
X	struct item *itemptr;
X	int ival;
X	char *cval;
X	}
X
X%token <cval> STRING
X%token <itemptr> NOOPERAND
X%token <itemptr> ARITHC
X%token ADD
X%token <itemptr> LOGICAL
X%token <itemptr> BIT
X%token CALL
X%token <itemptr> INCDEC
X%token <itemptr> DJNZ
X%token EX
X%token <itemptr> IM
X%token PHASE
X%token DEPHASE
X%token <itemptr> IN
X%token JP
X%token <itemptr> JR
X%token LD
X%token <itemptr> OUT
X%token <itemptr> PUSHPOP
X%token <itemptr> RET
X%token <itemptr> SHIFT
X%token <itemptr> RST
X%token <itemptr> REGNAME
X%token <itemptr> ACC
X%token <itemptr> C
X%token <itemptr> RP
X%token <itemptr> HL
X%token <itemptr> INDEX
X%token <itemptr> AF
X%token <itemptr> SP
X%token <itemptr> MISCREG
X%token F
X%token <itemptr> COND
X%token <itemptr> SPCOND
X%token <ival> NUMBER
X%token <itemptr> UNDECLARED
X%token END
X%token ORG
X%token DEFB
X%token DEFS
X%token DEFW
X%token EQU
X%token DEFL
X%token <itemptr> LABEL
X%token <itemptr> EQUATED
X%token <itemptr> WASEQUATED
X%token <itemptr> DEFLED
X%token <itemptr> MULTDEF
X%token <ival> MOD
X%token <ival> SHL
X%token <ival> SHR
X%token <ival> NOT
X%token IF
X%token ENDIF
X%token <itemptr> ARGPSEUDO
X%token <itemptr> LIST
X%token <itemptr> MINMAX
X%token MACRO
X%token <itemptr> MNAME
X%token <itemptr> OLDMNAME
X%token ARG
X%token ENDM
X%token MPARM
X%token <ival> ONECHAR
X%token <ival> TWOCHAR
X
X%type <itemptr> label.part symbol
X%type <ival> reg evenreg realreg mem pushable bcdesp bcdehlsp mar condition
X%type <ival> spcondition parenexpr expression lxexpression
X
X%left '|' '^'
X%left '&'
X%nonassoc NOT
X%left '+' '-'
X%left '*' '/' MOD SHL SHR
X%left UNARY
X%%
X
X%{
Xchar  *cp;
Xint  i;
X%}
X
Xprogram:
X	statements
X|
X	error	{	error("file bad");	}
X;
X
X
Xstatements:
X	statement
X|
X	statements statement
X|
X	statements error	{
X		fprintf(stderr,"statement error\n");
X		err[fflag]++;
X		quoteflag = 0;
X		while(yychar != '\n' && yychar != '\0') yychar = yylex();
X		list(dollarsign);
X		yyclearin;yyerrok;
X	}
X;
X
X
Xstatement:
X	label.part '\n'	{ 
X		if ($1) list(dollarsign);
X		else  list1();
X	}
X|
X	label.part operation '\n' {
X		list(dollarsign);
X	}
X|
X	symbol EQU expression '\n' {
X		switch($1->i_token) {
X		case UNDECLARED: case WASEQUATED:
X			$1->i_token = EQUATED;
X			$1->i_value = $3;
X			break;
X		default:
X			err[mflag]++;
X			$1->i_token = MULTDEF;
X		}
X		list($3);
X	}
X|
X	symbol DEFL expression '\n' {
X		switch($1->i_token) {
X		case UNDECLARED: case DEFLED:
X			$1->i_token = DEFLED;
X			$1->i_value = $3;
X			break;
X		default:
X			err[mflag]++;
X			$1->i_token = MULTDEF;
X		}
X		list($3);
X	}
X|
X	symbol MINMAX expression ',' expression '\n' {
X		switch ($1->i_token) {
X		case UNDECLARED: case DEFLED:
X			$1->i_token = DEFLED;
X			if ($2->i_value)	/* max */
X				list($1->i_value = ($3 > $5? $3:$5));
X			else list($1->i_value = ($3 < $5? $3:$5));
X			break;
X		default:
X			err[mflag]++;
X			$1->i_token = MULTDEF;
X			list($1->i_value);
X		}
X	}
X|
X	IF expression '\n' {
X		if (ifptr >= ifstmax)
X			error("Too many ifs");
X		else {
X			if (pass2) {
X				*++ifptr = *expifp++;
X				if (*ifptr != !(yypv[2].ival)) err[pflag]++;
X			} else {
X				if (expifp >= expifmax)
X					error("Too many ifs!");
X				*expifp++ = !(yypv[2].ival);
X				*++ifptr = !(yypv[2].ival);
X			}
X		}
X		saveopt = fopt;
X		fopt = 1;
X		list(yypv[2].ival);
X		fopt = saveopt;
X	}
X|
X	ENDIF '\n' {
X		if (ifptr == ifstack) err[bflag]++;
X		else --ifptr;
X		list1();
X	}
X|
X	label.part END '\n' {
X		list(dollarsign);
X		peekc = 0;
X	}
X|
X	label.part END expression '\n' {
X		xeq_flag++;
X		xeq = $3;
X		list($3);
X		peekc = 0;
X	}
X|
X	label.part DEFS expression '\n' {
X		if ($3 < 0) err[vflag]++;
X		list(dollarsign);
X		if ($3) {
X			flushbin();
X			dollarsign += $3;
X			olddollar = dollarsign;
X		}
X	}
X|
X	ARGPSEUDO arg_on ARG  arg_off '\n' {
X		list1();
X		switch ($1->i_value) {
X
X		case 0:		/* title */
X			lineptr = linebuf;
X			cp = tempbuf;
X			title = titlespace;
X			while ((*title++ = *cp++) && (title < &titlespace[TITLELEN]));
X			*title = 0;
X			title = titlespace;
X			break;
X
X		case 1:		/* rsym */
X			if (pass2) break;
X			insymtab(tempbuf);
X			break;
X
X		case 2:		/* wsym */
X			writesyms = malloc(strlen(tempbuf)+1);
X			strcpy(writesyms, tempbuf);
X			break;
X		case 3:		/* include file */
X			next_source(tempbuf) ;
X			break ;
X		}
X	}
X|
X	ARGPSEUDO arg_on '\n' arg_off {
X		fprintf(stderr,"ARGPSEUDO error\n");
X		err[fflag]++;
X		list(dollarsign);
X	}
X|
X	LIST '\n' {
X		if ($1 != (struct item *) -1) $<ival>2 = 1;
X		goto dolopt; }
X|
X	LIST expression '\n' {
X	dolopt:
X		linecnt++;
X		if (pass2) {
X			lineptr = linebuf;
X			switch ($1->i_value) {
X			case 0:	/* list */
X				if ($2 < 0) lstoff = 1;
X				if ($2 > 0) lstoff = 0;
X				break;
X
X			case 1:	/* eject */
X				if ($2) eject();
X				break;
X
X			case 2:	/* space */
X				if ((line + $2) > 60) eject();
X				else space($2);
X				break;
X
X			case 3:	/* elist */
X				eopt = edef;
X				if ($2 < 0) eopt = 0;
X				if ($2 > 0) eopt = 1;
X				break;
X
X			case 4:	/* fopt */
X				fopt = fdef;
X				if ($2 < 0) fopt = 0;
X				if ($2 > 0) fopt = 1;
X				break;
X
X			case 5:	/* gopt */
X				gopt = gdef;
X				if ($2 < 0) gopt = 1;
X				if ($2 > 0) gopt = 0;
X				break;
X
X			case 6: /* mopt */
X				mopt = mdef;
X				if ($2 < 0) mopt = 0;
X				if ($2 > 0) mopt = 1;
X			}
X		}
X	}
X|
X	UNDECLARED MACRO parm.list '\n' {
X		$1->i_token = MNAME;
X		$1->i_value = mfptr;
X		mfseek(mfile, (long)mfptr, 0);
X		list1();
X		mlex() ;
X		parm_number = 0;
X	}
X|
X	OLDMNAME MACRO {
X		$1->i_token = MNAME;
X		while (yychar != ENDM && yychar) {
X			while (yychar != '\n' && yychar)
X				yychar = yylex();
X			list1();
X			yychar = yylex();
X		}
X		while (yychar != '\n' && yychar) yychar = yylex();
X		list1();
X		yychar = yylex();
X	}
X|
X	label.part MNAME al arg.list '\n' {
X	expand:
X		$2->i_uses++ ;
X		arg_flag = 0;
X		parm_number = 0;
X		list(dollarsign);
X		expptr++;
X		est = est2;
X		est[FLOC] = floc;
X		est[TEMPNUM] = (char *)exp_number++;
X		floc = (char *)($2->i_value);
X		mfseek(mfile, (long)floc, 0);
X	}
X;
X
X
Xlabel.part:
X	/*empty*/
X	 {	$$ = NULL;	}
X|
X	symbol ':' {
X		switch($1->i_token) {
X		case UNDECLARED:
X			if (pass2)
X				err[pflag]++;
X			else {
X				$1->i_token = LABEL;
X				$1->i_value = dollarsign;
X			}
X			break;
X		case LABEL:
X			if (!pass2) {
X				$1->i_token = MULTDEF;
X				err[mflag]++;
X			} else if ($1->i_value != dollarsign)
X				err[pflag]++;
X			break;
X		default:
X			err[mflag]++;
X			$1->i_token = MULTDEF;
X		}
X	}
X;
X
X
Xoperation:
X	NOOPERAND
X		{ emit1($1->i_value, 0, 0, 1); }
X|
X	JP expression
X		{ emit(3, 0303, $2, $2 >> 8);	}
X|
X	CALL expression
X		{	emit(3, 0315, $2, $2 >> 8);	}
X|
X	RST	expression
X		{ if ($2 > 7 || $2 < 0)
X			err[vflag]++;
X		emit(1, $1->i_value + (($2 & 7) << 3));
X	}
X|
X	ADD ACC ',' expression
X		{ emit1(0306, 0, $4, 3); }
X|
X	ARITHC ACC ',' expression
X		{ emit1(0306 + ($1->i_value << 3), 0, $4, 3); }
X|
X	LOGICAL expression
X		{ emit1(0306 | ($1->i_value << 3), 0, $2, 3); }
X|
X	LOGICAL ACC ',' expression	/* -cdk */
X		{ emit1(0306 | ($1->i_value << 3), 0, $4, 3); }
X|
X	ADD ACC ',' reg
X		{ emit1(0200 + ($4 & 0377), $4, 0, 0); }
X|
X	ARITHC ACC ',' reg
X		{ emit1(0200 + ($1->i_value << 3) + ($4 & 0377), $4, 0, 0); }
X|
X	LOGICAL reg
X		{ emit1(0200 + ($1->i_value << 3) + ($2 & 0377), $2, 0, 0); }
X|
X	LOGICAL ACC ',' reg		/* -cdk */
X		{ emit1(0200 + ($1->i_value << 3) + ($4 & 0377), $4, 0, 0); }
X|
X	SHIFT reg
X		{ emit1(0145400 + ($1->i_value << 3) + ($2 & 0377), $2, 0, 0); }
X|
X	INCDEC	reg
X		{ emit1($1->i_value + (($2 & 0377) << 3) + 4, $2, 0, 0); }
X|
X	ARITHC HL ',' bcdehlsp
X		{ if ($1->i_value == 1)
X				emit(2,0355,0112+$4);
X			else
X				emit(2,0355,0102+$4);
X		}
X|
X	ADD mar ',' bcdesp
X		{ emitdad($2,$4); }
X|
X	ADD mar ',' mar
X		{
X			if ($2 != $4) {
X				fprintf(stderr,"ADD mar, mar error\n");
X				err[fflag]++;
X			}
X			emitdad($2,$4);
X		}
X|
X	INCDEC evenreg
X		{ emit1(($1->i_value << 3) + ($2 & 0377) + 3, $2, 0, 1); }
X|
X	PUSHPOP pushable
X		{ emit1($1->i_value + ($2 & 0377), $2, 0, 1); }
X|
X	BIT expression ',' reg
X		{
X			if ($2 < 0 || $2 > 7)
X				err[vflag]++;
X			emit1($1->i_value + (($2 & 7) << 3) + ($4 & 0377), $4, 0, 0);
X		}
X|
X	JP condition ',' expression
X		{ emit(3, 0302 + $2, $4, $4 >> 8); }
X|
X	JP '(' mar ')'
X		{ emit1(0351, $3, 0, 1); }
X|
X	CALL condition ',' expression
X		{ emit(3, 0304 + $2, $4, $4 >> 8); }
X|
X	JR expression
X		{ emitjr(030,$2); }
X|
X	JR spcondition ',' expression
X		{ emitjr($1->i_value + $2, $4); }
X|
X	DJNZ expression
X		{ emitjr($1->i_value, $2); }
X|
X	RET
X		{ emit(1, $1->i_value); }
X|
X	RET condition
X		{ emit(1, 0300 + $2); }
X|
X	LD reg ',' reg
X		{
X			if (($2 & 0377) == 6 && ($4 & 0377) == 6) {
X				fprintf(stderr,"LD reg, reg error\n");
X				err[fflag]++;
X			}
X			emit1(0100 + (($2 & 7) << 3) + ($4 & 7),$2 | $4, 0, 0);
X		}
X|
X	LD reg ',' expression
X		{ emit1(6 + (($2 & 0377) << 3), $2, $4, 2); }
X|
X	LD reg ',' '(' RP ')'
X		{	if ($2 != 7) {
X				fprintf(stderr,"LD reg, (RP) error\n");
X				err[fflag]++;
X			}
X			else emit(1, 012 + $5->i_value);
X		}
X|
X	LD reg ',' parenexpr
X		{
X			if ($2 != 7) {
X				fprintf(stderr,"LD reg, (expr) error\n");
X				err[fflag]++;
X			}
X			else emit(3, 072, $4, $4 >> 8);
X		}
X|
X	LD '(' RP ')' ',' ACC
X		{ emit(1, 2 + $3->i_value); }
X|
X	LD parenexpr ',' ACC
X		{ emit(3, 062, $2, $2 >> 8); }
X|
X	LD reg ',' MISCREG
X		{
X			if ($2 != 7) {
X				fprintf(stderr,"LD reg, MISCREG error\n");
X				err[fflag]++;
X			}
X			else emit(2, 0355, 0127 + $4->i_value);
X		}
X|
X	LD MISCREG ',' ACC
X		{ emit(2, 0355, 0107 + $2->i_value); }
X|
X	LD evenreg ',' lxexpression
X		{ emit1(1 + ($2 & 060), $2, $4, 5); }
X|
X	LD evenreg ',' parenexpr
X		{
X			if (($2 & 060) == 040)
X				emit1(052, $2, $4, 5);
X			else
X				emit(4, 0355, 0113 + $2, $4, $4 >> 8);
X		}
X|
X	LD parenexpr ',' evenreg
X		{
X			if (($4 & 060) == 040)
X				emit1(042, $4, $2, 5);
X			else
X				emit(4, 0355, 0103 + $4, $2, $2 >> 8);
X		}
X|
X	LD evenreg ',' mar
X		{
X			if ($2 != 060) {
X				fprintf(stderr,"LD evenreg error\n");
X				err[fflag]++;
X			}
X			else
X				emit1(0371, $4, 0, 1);
X		}
X|
X	EX RP ',' HL
X		{
X			if ($2->i_value != 020) {
X				fprintf(stderr,"EX RP, HL error\n");
X				err[fflag]++;
X			}
X			else
X				emit(1, 0353);
X		}
X|
X	EX AF ',' AF setqf '\'' clrqf
X		{ emit(1, 010); }
X|
X	EX '(' SP ')' ',' mar
X		{ emit1(0343, $6, 0, 1); }
X|
X	IN realreg ',' parenexpr
X		{
X			if ($2 != 7) {
X				fprintf(stderr,"IN reg, (expr) error\n");
X				err[fflag]++;
X			}
X			else	{
X				if ($4 < 0 || $4 > 255)
X					err[vflag]++;
X				emit(2, $1->i_value, $4);
X			}
X		}
X|
X	IN realreg ',' '(' C ')'
X		{ emit(2, 0355, 0100 + ($2 << 3)); }
X|
X	IN F ',' '(' C ')'
X		{ emit(2, 0355, 0160); }
X|
X	OUT parenexpr ',' ACC
X		{
X			if ($2 < 0 || $2 > 255)
X				err[vflag]++;
X			emit(2, $1->i_value, $2);
X		}
X|
X	OUT '(' C ')' ',' realreg
X		{ emit(2, 0355, 0101 + ($6 << 3)); }
X|
X	IM expression
X		{
X			if ($2 > 2 || $2 < 0)
X				err[vflag]++;
X			else
X				emit(2, $1->i_value >> 8, $1->i_value + (($2 + ($2 > 0)) << 3));
X		}
X|
X	PHASE expression
X		{
X			if (phaseflag) {
X				err[oflag]++;
X			} else {
X				phaseflag = 1;
X				phdollar = dollarsign;
X				dollarsign = $2;
X				phbegin = dollarsign;
X			}
X		}
X|
X	DEPHASE
X		{
X			if (!phaseflag) {
X				err[oflag]++;
X			} else {
X				phaseflag = 0;
X				dollarsign = phdollar + dollarsign - phbegin;
X			}
X		}
X|
X	ORG expression
X		{
X			if (phaseflag) {
X				err[oflag]++;
X				dollarsign = phdollar + dollarsign - phbegin;
X				phaseflag = 0;
X			}
X			if ($2-dollarsign) {
X				flushbin();
X				olddollar = $2;
X				dollarsign = $2;
X			}
X		}
X|
X	DEFB db.list
X|
X	DEFW dw.list
X|
X	ENDM
X;
X
X
Xparm.list:
X|
X	parm.element
X|
X	parm.list ',' parm.element
X;
X
X
Xparm.element:
X	UNDECLARED
X		{
X			$1->i_token = MPARM;
X			if (parm_number >= PARMMAX)
X				error("Too many parameters");
X			$1->i_value = parm_number++;
X		}
X;
X
X
Xarg.list:
X	/* empty */
X|
X	arg.element
X|
X	arg.list ',' arg.element
X;
X
X
Xarg.element:
X	ARG
X		{
X			cp = malloc(strlen(tempbuf)+1);
X			est2[parm_number++] = cp;
X			strcpy(cp, tempbuf);
X		}
X;
Xreg:
X	realreg
X|
X	mem
X;
Xrealreg:
X	REGNAME
X		{
X			$$ = $1->i_value;
X		}
X|
X	ACC
X		{
X			$$ = $1->i_value;
X		}
X|
X	C
X		{
X			$$ = $1->i_value;
X		}
X;
Xmem:
X	'(' HL ')'
X		{
X			$$ = 6;
X		}
X|
X	'(' INDEX expression ')'
X		{
X			disp = $3;
X			$$ = ($2->i_value & 0177400) | 6;
X		}
X|
X	'(' INDEX ')'
X		{
X			disp = 0;
X			$$ = ($2->i_value & 0177400) | 6;
X		}
X;
Xevenreg:
X	bcdesp
X|
X	mar
X;
Xpushable:
X	RP
X		{
X			$$ = $1->i_value;
X		}
X|
X	AF
X		{
X			$$ = $1->i_value;
X		}
X|
X	mar
X;
Xbcdesp:
X	RP
X		{
X			$$ = $1->i_value;
X		}
X|
X	SP
X		{
X			$$ = $1->i_value;
X		}
X;
Xbcdehlsp:
X	bcdesp
X|
X	HL
X		{
X			$$ = $1->i_value;
X		}
X;
Xmar:
X	HL
X		{
X			$$ = $1->i_value;
X		}
X|
X	INDEX
X		{
X			$$ = $1->i_value;
X		}
X;
Xcondition:
X	spcondition
X|
X	COND
X		{
X			$$ = $1->i_value;
X		}
X;
Xspcondition:
X	SPCOND
X		{
X			$$ = $1->i_value;
X		}
X|
X	C
X		{	$$ = 030;	}
X;
Xdb.list:
X	db.list.element
X|
X	db.list ',' db.list.element
X;
Xdb.list.element:
X	TWOCHAR
X		{
X			emit(2, $1, $1>>8);
X		}
X|
X	STRING
X		{
X			cp = $1;
X			while (*cp != '\0')
X				emit(1,*cp++);
X		}
X|
X	expression
X		{
X			if ($1 < -128 || $1 > 255)
X					err[vflag]++;
X			emit(1, $1 & 0377);
X		}
X;
X
X
Xdw.list:
X	dw.list.element
X|
X	dw.list ',' dw.list.element
X;
X
X
Xdw.list.element:
X	expression
X		{
X			emit(2, $1, $1>>8);
X		}
X;
X
X
X
Xlxexpression:
X	expression
X|
X	TWOCHAR
X;
X
Xparenexpr:
X	'(' expression ')'
X		{	$$ = $2;	}
X;
X
Xexpression:
X	error
X		{
X			err[eflag]++;
X			$$ = 0;
X		}
X|
X	LABEL
X		{	$$ = $1->i_value; $1->i_uses++ ;	}
X|
X	NUMBER
X|
X	ONECHAR
X|
X	EQUATED
X		{	$$ = $1->i_value;	}
X|
X	WASEQUATED
X		{	$$ = $1->i_value;	}
X|
X	DEFLED
X		{	$$ = $1->i_value;	}
X|
X	'$'
X		{	$$ = dollarsign;	}
X|
X	UNDECLARED
X		{
X			err[uflag]++;
X			$$ = 0;
X		}
X|
X	MULTDEF
X		{	$$ = $1->i_value;	}
X|
X	expression '+' expression
X		{	$$ = $1 + $3;	}
X|
X	expression '-' expression
X		{	$$ = $1 - $3;	}
X|
X	expression '/' expression
X		{	$$ = $1 / $3;	}
X|
X	expression '*' expression
X		{	$$ = $1 * $3;	}
X|
X	expression MOD expression
X		{	$$ = $1 % $3;	}
X|
X	expression '&' expression
X		{	$$ = $1 & $3;	}
X|
X	expression '|' expression
X		{	$$ = $1 | $3;	}
X|
X	expression '^' expression
X		{	$$ = $1 ^ $3;	}
X|
X	expression SHL expression
X		{	$$ = $1 << $3;	}
X|
X	expression SHR expression
X		{	$$ = (($1 >> 1) & 077777) >> ($3 - 1);	}
X|
X	'[' expression ']'
X		{	$$ = $2;	}
X|
X	NOT expression
X		{	$$ = ~$2;	}
X|
X	'+' expression %prec UNARY
X		{	$$ = $2;	}
X|
X	'-' expression %prec UNARY
X		{	$$ = -$2;	}
X;
X
Xsymbol:
X	UNDECLARED
X|
X	LABEL
X|
X	MULTDEF
X|
X	EQUATED
X|
X	WASEQUATED
X|
X	DEFLED
X;
X
X
Xal:
X	{
X		if (expptr >= MAXEXP)
X			error("Macro expansion level");
X		est2 = (char **) malloc((PARMMAX +4) * sizeof(char *));
X		expstack[expptr] = (char *)est2 ;
X		for (i=0; i<PARMMAX; i++)
X			est2[i] = 0;
X		arg_flag++;
X	}
X;
X
X
Xarg_on:
X	{	arg_flag++;	}
X;
X
Xarg_off:
X		{	arg_flag = 0;	}
X;
X
Xsetqf:
X		{	quoteflag++;	}
X;
X
Xclrqf:
X		{	quoteflag = 0;	}
X
X;
X
X%%
X/*extern int	yylval;*/
X
X#define F_END	0
X#define OTHER	1
X#define SPACE	2
X#define DIGIT	3
X#define LETTER	4
X#define STARTER 5
X
X
X/*
X *  This is the table of character classes.  It is used by the lexical
X *  analyser. (yylex())
X */
Xchar	charclass[] = {
X	F_END,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,
X	OTHER,	SPACE,	OTHER,	OTHER,	OTHER,	SPACE,	OTHER,	OTHER,
X	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,
X	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,
X	SPACE,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,
X	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,
X	DIGIT,	DIGIT,	DIGIT,	DIGIT,	DIGIT,	DIGIT,	DIGIT,	DIGIT,
X	DIGIT,	DIGIT,	OTHER,	OTHER,	OTHER,	OTHER,	OTHER,	STARTER,
X	STARTER,LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
X	LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
X	LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
X	LETTER, LETTER, LETTER, OTHER,	OTHER,	OTHER,	OTHER,	LETTER,
X	OTHER,	LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
X	LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
X	LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
X	LETTER, LETTER, LETTER, OTHER,	OTHER,	OTHER,	OTHER,	OTHER,
X};
X
X
X/*
X *  the following table tells which characters are parts of numbers.
X *  The entry is non-zero for characters which can be parts of numbers.
X */
Xchar	numpart[] = {
X	0,	0,	0,	0,	0,	0,	0,	0,
X	0,	0,	0,	0,	0,	0,	0,	0,
X	0,	0,	0,	0,	0,	0,	0,	0,
X	0,	0,	0,	0,	0,	0,	0,	0,
X	0,	0,	0,	0,	0,	0,	0,	0,
X	0,	0,	0,	0,	0,	0,	0,	0,
X	'0',	'1',	'2',	'3',	'4',	'5',	'6',	'7',
SHAR_EOF
echo "3" > ._seq_
-- 
"If I'd known it was harmless, I'd have killed it myself"  Phillip K. Dick
Bob Bownes, aka iii, aka captain comrade doktor bobwrench
3 A Pinehurst Ave,	Albany, New York, 12203, (518)-482-8798 voice 
 bownesrm@beowulf.uucp {uunet!steinmetz,rutgers!brspyr1}!beowulf!bownesrm