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