scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit 76ede86072629766d376b19c979622158782dfec
parent 97827a05e1b575147df7d92852dae371837ecb51
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri, 19 Jan 2018 14:35:39 +0000

[as] Change the filesystem tree

The file organization was very confusing and was common to
have related files in different directories. This new
structure is simple and have all the benefits and none
of the problems of the old one.

Diffstat:
Mas/Makefile | 2+-
Mas/gendep.sh | 2+-
Ras/target/gen.awk -> as/gentbl.awk | 0
Aas/gentbl.sh | 33+++++++++++++++++++++++++++++++++
Aas/target/amd64.mk | 9+++++++++
Das/target/amd64/ins.c | 7-------
Das/target/amd64/proc.c | 16----------------
Das/target/amd64/target.mk | 15---------------
Aas/target/i386.mk | 9+++++++++
Das/target/i386/ins.c | 7-------
Das/target/i386/proc.c | 130-------------------------------------------------------------------------------
Das/target/i386/target.mk | 15---------------
Mas/target/x80/ins.c | 136++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Ras/target/z80/test.s -> as/target/x80/z80-test.s | 0
Aas/target/x80/z80.c | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aas/target/x86/amd64.c | 12++++++++++++
Aas/target/x86/i386.c | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aas/target/x86/ins.c | 38++++++++++++++++++++++++++++++++++++++
Aas/target/z80.mk | 9+++++++++
Das/target/z80/ins.c | 7-------
Das/target/z80/proc.c | 195-------------------------------------------------------------------------------
Das/target/z80/target.mk | 15---------------
22 files changed, 411 insertions(+), 410 deletions(-)

diff --git a/as/Makefile b/as/Makefile @@ -26,7 +26,7 @@ dep: clean: rm -f *.o rm -f target/*/*.o - rm -f target/*/instbl.c + rm -f target/*/*tbl.c rm -f as-* distclean: clean diff --git a/as/gendep.sh b/as/gendep.sh @@ -15,7 +15,7 @@ sort -u | while read i do cat <<EOF -include target/$i/target.mk +include target/$i.mk \$(OBJ-$i): \$(HDR) all: as-$i diff --git a/as/target/gen.awk b/as/gentbl.awk diff --git a/as/gentbl.sh b/as/gentbl.sh @@ -0,0 +1,33 @@ +#!/bin/sh + + +set -e + +while test $# -gt 0 +do + case $1 in + -c) + cpu=$2 + shift + ;; + -f) + family=$2 + shift + ;; + *) + echo gen.sh:incorrect parameter:$1 >&2 + exit 1 + ;; + esac + shift +done + +echo cpu=${cpu:=z80} family=${family:=x80} + +rm -f $$.c target/$family/${cpu}tbl.c +trap "rm -f $$.c" 0 2 3 + +awk '!/^$/ {print $1,NR,$2,$3,$4,$5,$6}' target/$family/$family.dat | +sort -k1 -k2n | +awk -v cpu=`echo $cpu | tr a-z A-Z` -v family=$family -f gentbl.awk > $$.c && +mv $$.c target/$family/${cpu}tbl.c diff --git a/as/target/amd64.mk b/as/target/amd64.mk @@ -0,0 +1,9 @@ + +amd64_LST = target/x86/amd64tbl.o target/x86/amd64.o target/x86/ins.o + +$(amd64_LST): target/x86/proc.h + +target/x86/amd64tbl.c: gentbl.awk target/x86/x86.dat target/x86/rules.dat + ./gentbl.sh -f x86 -c amd64 + +OBJ-amd64 = $(OBJ) $(amd64_LST) diff --git a/as/target/amd64/ins.c b/as/target/amd64/ins.c @@ -1,7 +0,0 @@ -static char sccsid[] = "@(#) ./as/target/amd64/ins.c"; - -#include "../../../inc/scc.h" -#include "../../as.h" - -TUINT maxaddr = 0xFFFFFFFFFFFFFFFF; -int endian = LITTLE_ENDIAN; diff --git a/as/target/amd64/proc.c b/as/target/amd64/proc.c @@ -1,16 +0,0 @@ -static char sccsid[] = "@(#) ./as/target/amd64/proc.c"; - -#include "../../../inc/scc.h" -#include "../../as.h" - - -void -iarch(void) -{ -} - -int -match(Op *op, Node **args) -{ - return 1; -} diff --git a/as/target/amd64/target.mk b/as/target/amd64/target.mk @@ -1,15 +0,0 @@ - -AMD64_LST = target/amd64/instbl.o target/amd64/ins.o target/amd64/proc.o - -$(AMD64_LST): target/x86/proc.h - -target/amd64/instbl.c: target/gen.awk target/x86/x86.dat target/x86/rules.dat - set -e ;\ - rm -f $@;\ - trap "rm -f $$$$.c" 0 2 3; \ - awk '!/^$$/ {print $$1,NR,$$2,$$3,$$4,$$5,$$6}' target/x86/x86.dat | \ - sort -k1 -k2n | \ - awk -v cpu=BITS64 -v family=x86 \ - -f target/gen.awk > $$$$.c && mv $$$$.c $@ - -OBJ-amd64 = $(OBJ) $(AMD64_LST) diff --git a/as/target/i386.mk b/as/target/i386.mk @@ -0,0 +1,9 @@ + +i386_LST = target/x86/i386tbl.o target/x86/i386.o target/x86/ins.o + +$(i386_LST): target/x86/proc.h + +target/x86/i386tbl.c: gentbl.awk target/x86/x86.dat target/x86/rules.dat + ./gentbl.sh -f x86 -c i386 + +OBJ-i386 = $(OBJ) $(i386_LST) diff --git a/as/target/i386/ins.c b/as/target/i386/ins.c @@ -1,7 +0,0 @@ -static char sccsid[] = "@(#) ./as/target/i386/ins.c"; - -#include "../../../inc/scc.h" -#include "../../as.h" - -TUINT maxaddr = 0xFFFFFFFF; -int endian = LITTLE_ENDIAN; diff --git a/as/target/i386/proc.c b/as/target/i386/proc.c @@ -1,130 +0,0 @@ -static char sccsid[] = "@(#) ./as/target/i386/proc.c"; - -#include <stdlib.h> - -#include "../../../inc/scc.h" -#include "../../as.h" -#include "../x86/proc.h" - -void -iarch(void) -{ - static struct { - char *name; - char type; - } regs[] = { - "CS", AREG_CS, - "DS", AREG_DS, - "SS", AREG_SS, - "ES", AREG_ES, - "FS", AREG_FS, - "GS", AREG_GS, - - "AX", AREG_AX, - "AL", AREG_AL, - "AH", AREG_AH, - "EAX", AREG_EAX, - - "BC", AREG_BX, - "BL", AREG_BL, - "BH", AREG_BH, - "EBX", AREG_EBX, - - "CX", AREG_CX, - "CL", AREG_CL, - "CH", AREG_CH, - "ECX", AREG_ECX, - - "DX", AREG_DX, - "DL", AREG_DL, - "DH", AREG_DH, - "EDX", AREG_EDX, - - "SI", AREG_SI, - "ESI", AREG_ESI, - "DI", AREG_DI, - "EDI", AREG_EDI, - - "SP", AREG_SP, - "ESP", AREG_ESP, - - "BP", AREG_BP, - "EBP", AREG_EBP, - - "R0", AREG_R0, - "MM0", AREG_MM0, - "R1", AREG_R1, - "MM1", AREG_MM1, - "R2", AREG_R2, - "MM2", AREG_MM2, - "R3", AREG_R3, - "MM3", AREG_MM3, - "R4", AREG_R4, - "MM4", AREG_MM4, - "R5", AREG_R5, - "MM5", AREG_MM5, - "R6", AREG_R6, - "MM6", AREG_MM6, - "R7", AREG_R7, - "MM7", AREG_MM7, - - "XMM0", AREG_XMM0, - "XMM1", AREG_XMM1, - "XMM2", AREG_XMM2, - "XMM3", AREG_XMM3, - "XMM4", AREG_XMM4, - "XMM5", AREG_XMM5, - "XMM6", AREG_XMM6, - "XMM7", AREG_XMM7, - - "YMM0", AREG_YMM0, - "YMM1", AREG_YMM1, - "YMM2", AREG_YMM2, - "YMM3", AREG_YMM3, - "YMM4", AREG_YMM4, - "YMM5", AREG_YMM5, - "YMM6", AREG_YMM6, - "YMM7", AREG_YMM7, - - "MXCSR", AREG_MXCSR, - - NULL - }, *bp; - - for (bp = regs; bp->name; ++bp) { - Symbol *sym = lookup(bp->name); - sym->flags = FREG; - sym->value = bp->type; - } -} - -int -match(Op *op, Node **args) -{ - unsigned char *p; - int a, olda; - - if (!op->args) - return args == NULL; - - for (p = op->args; *p; ++p) { - if (*p != AREP) - a = *p; - else - --p; - - switch (a) { - case AIMM8: - case AIMM16: - case AIMM32: - case AIMM64: - case AREG_AL: - case AREG_AH: - case AREG_AX: - case AREG_EAX: - default: - abort(); - } - } - return 1; -} diff --git a/as/target/i386/target.mk b/as/target/i386/target.mk @@ -1,15 +0,0 @@ - -I386_LST = target/i386/instbl.o target/i386/ins.o target/i386/proc.o - -$(I386_LST): target/x86/proc.h - -target/i386/instbl.c: target/gen.awk target/x86/x86.dat - set -e ;\ - rm -f $@;\ - trap "rm -f $$$$.c" 0 2 3; \ - awk '!/^$$/ {print $$1,NR,$$2,$$3,$$4,$$5,$$6}' target/x86/x86.dat | \ - sort -k1 -k2n | \ - awk -v cpu=BITS32 -v family=x86 \ - -f target/gen.awk > $$$$.c && mv $$$$.c $@ - -OBJ-i386 = $(OBJ) $(I386_LST) diff --git a/as/target/x80/ins.c b/as/target/x80/ins.c @@ -1,4 +1,4 @@ -static char sccsid[] = "@(#) ./as/target/z80/ins.c"; +static char sccsid[] = "@(#) ./as/target/x80/ins.c"; #include <stdlib.h> #include <string.h> @@ -15,6 +15,140 @@ static char sccsid[] = "@(#) ./as/target/z80/ins.c"; */ int +match(Op *op, Node **args) +{ + unsigned char *p; + int arg, class; + Node *np; + + if (!op->args) + return args == NULL; + + for (p = op->args; arg = *p; ++p) { + if (arg & AREP) + --p; + if ((np = *args++) == NULL) + return (arg & (AREP|AOPT)) != 0; + + arg &= ~(AREP|AOPT); + switch (arg) { + case AINDER_C: + arg = AREG_C; + goto indirect; + case AINDER_HL: + arg = AREG_HL; + goto indirect; + case AINDER_DE: + arg = AREG_DE; + goto indirect; + case AINDER_BC: + arg = AREG_BC; + goto indirect; + case AINDER_IX: + arg = AREG_IX; + goto indirect; + case AINDER_IY: + arg = AREG_IY; + goto indirect; + case AINDER_SP: + arg = AREG_SP; + indirect: + if (np->addr != AINDIR) + return 0; + np = np->left; + case AREG_A: + case AREG_I: + case AREG_R: + case AREG_F: + case AREG_HL: + case AREG_BC: + case AREG_DE: + case AREG_IY: + case AREG_IX: + case AREG_SP: + case AREG_AF: + case AREG_AF_: + if (np->addr != AREG || np->sym->value != arg) + return 0; + break; + case AREG_RCLASS: + class = RCLASS; + goto check_class; + case AREG_PCLASS: + class = PCLASS; + goto check_class; + case AREG_QCLASS: + class = QCLASS; + goto check_class; + case AREG_QQCLASS: + class = QQCLASS; + goto check_class; + case AREG_PPCLASS: + class = PPCLASS; + goto check_class; + case AREG_RRCLASS: + class = RRCLASS; + goto check_class; + case AREG_CCCLASS: + class = CCCLASS; + goto check_class; + case AREG_SSCLASS: + class = SSCLASS; + goto check_class; + case AREG_DDCLASS: + class = DDCLASS; + check_class: + if ((getclass(np) & class) == 0) + return 0; + break; + case AINDEX_IY: + arg = AREG_IY; + goto index_address; + case AINDEX_IX: + arg = AREG_IX; + index_address: + if (np->addr != AINDEX) + return 0; + if (np->left->left->sym->value != arg) + return 0; + if (toobig(np, arg)) + error("overflow in index"); + break; + case ARST: + if (np->addr != AIMM) + return 0; + if ((np->sym->value & ~0x38) != 0) + return 0; + break; + case AZERO: + case AIMM3: + case AIMM8: + case AIMM16: + case AIMM32: + case AIMM64: + if (np->addr != AIMM) + return 0; + if (toobig(np, arg)) + error("overflow in immediate operand"); + break; + case ASYM: + if (np->addr != AIMM || np->op != IDEN) + return 0; + break; + case ADIRECT: + case ASTR: + if (np->addr != arg) + return 0; + break; + default: + abort(); + } + } + + return *args == NULL; +} + +int getclass(Node *np) { if (np->addr != AREG) diff --git a/as/target/z80/test.s b/as/target/x80/z80-test.s diff --git a/as/target/x80/z80.c b/as/target/x80/z80.c @@ -0,0 +1,64 @@ +static char sccsid[] = "@(#) ./as/target/x80/z80.c"; + +#include <stdlib.h> + +#include "../../../inc/scc.h" +#include "../../as.h" +#include "../x80/proc.h" + +TUINT maxaddr = 0xFFFFFFFF; +int endian = LITTLE_ENDIAN; + +void +iarch(void) +{ + static struct { + char *name; + char type; + } regs[] = { + "AF", AREG_AF, + "A", AREG_A, + "F", AREG_F, + + "BC", AREG_BC, + "B", AREG_B, + "C", AREG_C, + + "HL", AREG_HL, + "H", AREG_H, + "L", AREG_L, + + "DE", AREG_DE, + "D", AREG_D, + "E", AREG_E, + + "IX", AREG_IX, + "IXL", AREG_IXL, + "IXH", AREG_IXH, + + "IY", AREG_IY, + "IYL", AREG_IYL, + "IYH", AREG_IYH, + + "R", AREG_R, + "I", AREG_I, + "AF'", AREG_AF_, + "SP", AREG_SP, + + "NZ", AREG_NZ, + "Z", AREG_Z, + "NC", AREG_NC, + "PO", AREG_PO, + "PE", AREG_PE, + "P", AREG_P, + "M", AREG_M, + + NULL, + }, *bp; + + for (bp = regs; bp->name; ++bp) { + Symbol *sym = lookup(bp->name); + sym->flags = FREG; + sym->value = bp->type; + } +} diff --git a/as/target/x86/amd64.c b/as/target/x86/amd64.c @@ -0,0 +1,12 @@ +static char sccsid[] = "@(#) ./as/target/x86/amd64.c"; + +#include "../../../inc/scc.h" +#include "../../as.h" + +TUINT maxaddr = 0xFFFFFFFFFFFFFFFF; +int endian = LITTLE_ENDIAN; + +void +iarch(void) +{ +} diff --git a/as/target/x86/i386.c b/as/target/x86/i386.c @@ -0,0 +1,100 @@ +static char sccsid[] = "@(#) ./as/target/x86/i386.c"; + +#include "../../../inc/scc.h" +#include "../../as.h" +#include "../x86/proc.h" + +TUINT maxaddr = 0xFFFFFFFF; +int endian = LITTLE_ENDIAN; + +void +iarch(void) +{ + static struct { + char *name; + char type; + } regs[] = { + "CS", AREG_CS, + "DS", AREG_DS, + "SS", AREG_SS, + "ES", AREG_ES, + "FS", AREG_FS, + "GS", AREG_GS, + + "AX", AREG_AX, + "AL", AREG_AL, + "AH", AREG_AH, + "EAX", AREG_EAX, + + "BC", AREG_BX, + "BL", AREG_BL, + "BH", AREG_BH, + "EBX", AREG_EBX, + + "CX", AREG_CX, + "CL", AREG_CL, + "CH", AREG_CH, + "ECX", AREG_ECX, + + "DX", AREG_DX, + "DL", AREG_DL, + "DH", AREG_DH, + "EDX", AREG_EDX, + + "SI", AREG_SI, + "ESI", AREG_ESI, + "DI", AREG_DI, + "EDI", AREG_EDI, + + "SP", AREG_SP, + "ESP", AREG_ESP, + + "BP", AREG_BP, + "EBP", AREG_EBP, + + "R0", AREG_R0, + "MM0", AREG_MM0, + "R1", AREG_R1, + "MM1", AREG_MM1, + "R2", AREG_R2, + "MM2", AREG_MM2, + "R3", AREG_R3, + "MM3", AREG_MM3, + "R4", AREG_R4, + "MM4", AREG_MM4, + "R5", AREG_R5, + "MM5", AREG_MM5, + "R6", AREG_R6, + "MM6", AREG_MM6, + "R7", AREG_R7, + "MM7", AREG_MM7, + + "XMM0", AREG_XMM0, + "XMM1", AREG_XMM1, + "XMM2", AREG_XMM2, + "XMM3", AREG_XMM3, + "XMM4", AREG_XMM4, + "XMM5", AREG_XMM5, + "XMM6", AREG_XMM6, + "XMM7", AREG_XMM7, + + "YMM0", AREG_YMM0, + "YMM1", AREG_YMM1, + "YMM2", AREG_YMM2, + "YMM3", AREG_YMM3, + "YMM4", AREG_YMM4, + "YMM5", AREG_YMM5, + "YMM6", AREG_YMM6, + "YMM7", AREG_YMM7, + + "MXCSR", AREG_MXCSR, + + NULL + }, *bp; + + for (bp = regs; bp->name; ++bp) { + Symbol *sym = lookup(bp->name); + sym->flags = FREG; + sym->value = bp->type; + } +} diff --git a/as/target/x86/ins.c b/as/target/x86/ins.c @@ -0,0 +1,38 @@ +static char sccsid[] = "@(#) ./as/target/x86/ins.c"; + +#include <stdlib.h> + +#include "../../../inc/scc.h" +#include "../../as.h" +#include "proc.h" + +int +match(Op *op, Node **args) +{ + unsigned char *p; + int a, olda; + + if (!op->args) + return args == NULL; + + for (p = op->args; *p; ++p) { + if (*p != AREP) + a = *p; + else + --p; + + switch (a) { + case AIMM8: + case AIMM16: + case AIMM32: + case AIMM64: + case AREG_AL: + case AREG_AH: + case AREG_AX: + case AREG_EAX: + default: + abort(); + } + } + return 1; +} diff --git a/as/target/z80.mk b/as/target/z80.mk @@ -0,0 +1,9 @@ + +Z80_LST = target/x80/z80tbl.o target/x80/z80.o target/x80/ins.o + +$(Z80_LST): target/x80/proc.h + +target/x80/z80tbl.c: gentbl.awk target/x80/x80.dat target/x80/rules.dat + ./gentbl.sh -f x80 -c z80 + +OBJ-z80 = $(OBJ) $(Z80_LST) diff --git a/as/target/z80/ins.c b/as/target/z80/ins.c @@ -1,7 +0,0 @@ -static char sccsid[] = "@(#) ./as/target/z80/ins.c"; - -#include "../../../inc/scc.h" -#include "../../as.h" - -TUINT maxaddr = 0xFFFFFFFF; -int endian = LITTLE_ENDIAN; diff --git a/as/target/z80/proc.c b/as/target/z80/proc.c @@ -1,195 +0,0 @@ -static char sccsid[] = "@(#) ./as/target/i386/proc.c"; - -#include <stdlib.h> - -#include "../../../inc/scc.h" -#include "../../as.h" -#include "../x80/proc.h" - -void -iarch(void) -{ - static struct { - char *name; - char type; - } regs[] = { - "AF", AREG_AF, - "A", AREG_A, - "F", AREG_F, - - "BC", AREG_BC, - "B", AREG_B, - "C", AREG_C, - - "HL", AREG_HL, - "H", AREG_H, - "L", AREG_L, - - "DE", AREG_DE, - "D", AREG_D, - "E", AREG_E, - - "IX", AREG_IX, - "IXL", AREG_IXL, - "IXH", AREG_IXH, - - "IY", AREG_IY, - "IYL", AREG_IYL, - "IYH", AREG_IYH, - - "R", AREG_R, - "I", AREG_I, - "AF'", AREG_AF_, - "SP", AREG_SP, - - "NZ", AREG_NZ, - "Z", AREG_Z, - "NC", AREG_NC, - "PO", AREG_PO, - "PE", AREG_PE, - "P", AREG_P, - "M", AREG_M, - - NULL, - }, *bp; - - for (bp = regs; bp->name; ++bp) { - Symbol *sym = lookup(bp->name); - sym->flags = FREG; - sym->value = bp->type; - } -} - -int -match(Op *op, Node **args) -{ - unsigned char *p; - int arg, class; - Node *np; - - if (!op->args) - return args == NULL; - - for (p = op->args; arg = *p; ++p) { - if (arg & AREP) - --p; - if ((np = *args++) == NULL) - return (arg & (AREP|AOPT)) != 0; - - arg &= ~(AREP|AOPT); - switch (arg) { - case AINDER_C: - arg = AREG_C; - goto indirect; - case AINDER_HL: - arg = AREG_HL; - goto indirect; - case AINDER_DE: - arg = AREG_DE; - goto indirect; - case AINDER_BC: - arg = AREG_BC; - goto indirect; - case AINDER_IX: - arg = AREG_IX; - goto indirect; - case AINDER_IY: - arg = AREG_IY; - goto indirect; - case AINDER_SP: - arg = AREG_SP; - indirect: - if (np->addr != AINDIR) - return 0; - np = np->left; - case AREG_A: - case AREG_I: - case AREG_R: - case AREG_F: - case AREG_HL: - case AREG_BC: - case AREG_DE: - case AREG_IY: - case AREG_IX: - case AREG_SP: - case AREG_AF: - case AREG_AF_: - if (np->addr != AREG || np->sym->value != arg) - return 0; - break; - case AREG_RCLASS: - class = RCLASS; - goto check_class; - case AREG_PCLASS: - class = PCLASS; - goto check_class; - case AREG_QCLASS: - class = QCLASS; - goto check_class; - case AREG_QQCLASS: - class = QQCLASS; - goto check_class; - case AREG_PPCLASS: - class = PPCLASS; - goto check_class; - case AREG_RRCLASS: - class = RRCLASS; - goto check_class; - case AREG_CCCLASS: - class = CCCLASS; - goto check_class; - case AREG_SSCLASS: - class = SSCLASS; - goto check_class; - case AREG_DDCLASS: - class = DDCLASS; - check_class: - if ((getclass(np) & class) == 0) - return 0; - break; - case AINDEX_IY: - arg = AREG_IY; - goto index_address; - case AINDEX_IX: - arg = AREG_IX; - index_address: - if (np->addr != AINDEX) - return 0; - if (np->left->left->sym->value != arg) - return 0; - if (toobig(np, arg)) - error("overflow in index"); - break; - case ARST: - if (np->addr != AIMM) - return 0; - if ((np->sym->value & ~0x38) != 0) - return 0; - break; - case AZERO: - case AIMM3: - case AIMM8: - case AIMM16: - case AIMM32: - case AIMM64: - if (np->addr != AIMM) - return 0; - if (toobig(np, arg)) - error("overflow in immediate operand"); - break; - case ASYM: - if (np->addr != AIMM || np->op != IDEN) - return 0; - break; - case ADIRECT: - case ASTR: - if (np->addr != arg) - return 0; - break; - default: - abort(); - } - } - - return *args == NULL; -} diff --git a/as/target/z80/target.mk b/as/target/z80/target.mk @@ -1,15 +0,0 @@ - -Z80_LST = target/z80/instbl.o target/z80/ins.o target/z80/proc.o target/x80/ins.o - -$(Z80_LST): target/x80/proc.h - -target/z80/instbl.c: target/gen.awk target/x80/x80.dat target/x80/rules.dat - set -e ;\ - rm -f $@;\ - trap "rm -f $$$$.c" 0 2 3; \ - awk '!/^$$/ {print $$1,NR,$$2,$$3,$$4,$$5,$$6}' target/x80/x80.dat | \ - sort -k1 -k2n | \ - awk -v cpu=Z80 -v family=x80 \ - -f target/gen.awk > $$$$.c && mv $$$$.c $@ - -OBJ-z80 = $(OBJ) $(Z80_LST)