*** empty log message ***
authorkeie <none@none>
Fri, 12 Apr 1985 16:56:43 +0000 (16:56 +0000)
committerkeie <none@none>
Fri, 12 Apr 1985 16:56:43 +0000 (16:56 +0000)
26 files changed:
mach/6500/as/Makefile [new file with mode: 0644]
mach/6800/as/Makefile [new file with mode: 0644]
mach/6805/as/Makefile [new file with mode: 0644]
mach/6809/as/Makefile [new file with mode: 0644]
mach/arm/as/Makefile [new file with mode: 0644]
mach/i386/as/Makefile [new file with mode: 0644]
mach/i80/as/Makefile [new file with mode: 0644]
mach/i86/as/Makefile [new file with mode: 0644]
mach/m68020/as/Makefile [new file with mode: 0644]
mach/m68k2/as/Makefile [new file with mode: 0644]
mach/ns/as/Makefile [new file with mode: 0644]
mach/pdp/as/Makefile [new file with mode: 0644]
mach/proto/as/Makefile [new file with mode: 0644]
mach/proto/as/comm0.h [new file with mode: 0644]
mach/proto/as/comm1.h [new file with mode: 0644]
mach/proto/as/comm2.y [new file with mode: 0644]
mach/proto/as/comm3.c [new file with mode: 0644]
mach/proto/as/comm4.c [new file with mode: 0644]
mach/proto/as/comm5.c [new file with mode: 0644]
mach/proto/as/comm6.c [new file with mode: 0644]
mach/proto/as/comm7.c [new file with mode: 0644]
mach/proto/as/comm8.c [new file with mode: 0644]
mach/s2650/as/Makefile [new file with mode: 0644]
mach/vax4/as/Makefile [new file with mode: 0644]
mach/z80/as/Makefile [new file with mode: 0644]
mach/z8000/as/Makefile [new file with mode: 0644]

diff --git a/mach/6500/as/Makefile b/mach/6500/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/6800/as/Makefile b/mach/6800/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/6805/as/Makefile b/mach/6805/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/6809/as/Makefile b/mach/6809/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/arm/as/Makefile b/mach/arm/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/i386/as/Makefile b/mach/i386/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/i80/as/Makefile b/mach/i80/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/i86/as/Makefile b/mach/i86/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/m68020/as/Makefile b/mach/m68020/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/m68k2/as/Makefile b/mach/m68k2/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/ns/as/Makefile b/mach/ns/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/pdp/as/Makefile b/mach/pdp/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/proto/as/Makefile b/mach/proto/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/proto/as/comm0.h b/mach/proto/as/comm0.h
new file mode 100644 (file)
index 0000000..7d05690
--- /dev/null
@@ -0,0 +1,252 @@
+/* @(#)comm0.h 1.8 */
+/*
+ * All preprocessor based options/constants/functions
+ */
+
+/* ========== ON/OFF options (use #define in mach0.c) ========== */
+
+/*
+ * The following options are available, to be set/removed in "mach0.c":
+ *     THREE_PASS:     three passes needed for branch optimization
+ *     BYTES_REVERSED: lowest target address for word high-order byte
+ *     WORDS_REVERSED: lowest target address for long high-order byte
+ *     LISTING:        include listing facilities
+ *     RELOCATION:     relocatable code generated
+ *     DEBUG:          for debugging purposes only
+ *     TMPDIR:         directory for temporary files
+ *     ASLD:           combined assembler/linker
+ *     AOUTSEEK:       seek on a.out instead of multiple opens
+ */
+
+/* ========== constants (use #undef, #define in mach0.c) ========== */
+
+/* table sizes */
+#define        STRINGMAX       200     /* <= 256 */
+#define        BITMAX          2000    /* for short or long branches */
+#define        SECTMAX         64
+#define        NAMEMAX         80
+#define        MEMINCR         2048
+
+/* Some character constants for parsing */
+#define        ASC_LPAR        '['
+#define        ASC_RPAR        ']'
+#define        ASC_SQUO        '\''
+#define        ASC_DQUO        '"'
+#define        ASC_COMM        '!'
+#define        ISALPHA(c)      (isalpha(c) || (c) == '_' || (c) == '.')
+#define        ISALNUM(c)      (isalnum(c) || (c) == '_')
+
+#define        GENLAB          "I"             /* compiler generated labels */
+
+#define        ushort          unsigned short
+
+#define        valu_t          short           /* type of expression values */
+#define        addr_t          ushort          /* type of dot */
+#define        word_t          short           /* type of keyword value */
+/*
+ * NOTE: word_t is introduced to reduce the tokenfile size for machines
+ * with large expressions but smaller opcodes (68000)
+ */
+
+#define        ALIGNWORD       1
+#define        ALIGNSECT       1
+
+#define        machstart(x)    /* nothing */
+#define        machfinish(x)   /* nothing */
+
+#define        SETBASE(sp)     ((long)(sp)->s_base)
+
+#define        VALWIDTH        4
+
+/* ========== Machine dependent option/constant settings ========== */
+
+#include       "mach0.c"
+
+/* ========== default option setting ========== */
+
+#ifndef NOLD
+#define        ASLD            /* default ON */
+#endif
+
+#ifndef ASLD
+#ifndef RELOCATION
+separate linker only possible if relocation info produced
+#endif RELOCATION
+#endif ASLD
+
+#ifndef DEBUG
+#define        DEBUG   1
+#endif
+
+/* ========== Machine independent type declarations ========== */
+
+#ifdef _include
+_include       <stdio.h>
+_include       <ctype.h>
+_include       <signal.h>
+#else
+#include       <stdio.h>
+#include       <ctype.h>
+#include       <signal.h>
+#endif
+
+#ifdef ASLD
+#include       "aar.h"
+#endif
+#include       "out.h"
+
+#if DEBUG == 0
+#define        assert(ex)      /* nothing */
+#endif
+
+#if DEBUG == 1
+#define        assert(ex)      {if (!(ex)) assert1();}
+#endif
+
+#if DEBUG == 2
+#define        assert(ex)      {if (!(ex)) assert2(__FILE__, __LINE__);}
+#endif
+
+#define        CTRL(x)         ((x) & 037)
+
+#define        lowb(z)         ((int)(z) & 0xFF)
+#define        loww(z)         ((int)(z) & 0xFFFF)
+
+#define        fitb(x)         ((((x) + 0x80) & ~0xFF) == 0)
+#define        fitw(x)         ((((x) + 0x8000) & ~0xFFFF) == 0)
+
+#define        fit(x)          if (!(x)) nofit()
+
+#define        PASS_1          0
+#define        PASS_2          1
+#define        PASS_3          2
+
+#ifdef THREE_PASS
+#define        PASS_SYMB       (pass != PASS_1)
+#define        PASS_RELO       (pass != PASS_1)
+#else
+#define        PASS_SYMB       1
+#define        PASS_RELO       1
+#endif THREE_PASS
+
+#ifdef ASLD
+#define        RELOMOVE(a,b)   /* empty */
+#else
+#define        RELOMOVE(a,b)   {a = b; b = 0;}
+#endif
+
+/* symbol table management */
+#define        H_SIZE          256             /* hash size */
+#define        H_KEY           (0*H_SIZE)      /* key symbol headers */
+#define        H_LOCAL         (1*H_SIZE)      /* module symbol headers */
+#ifdef ASLD
+#define        H_GLOBAL        (2*H_SIZE)      /* external symbol headers */
+#define        H_TOTAL         (3*H_SIZE)
+#else
+#define        H_TOTAL         (2*H_SIZE)
+#endif
+
+/* numeric label table management */
+#define        FB_SIZE         10
+#define        FB_HEAD         (0*FB_SIZE)
+#define        FB_TAIL         (1*FB_SIZE)
+#define        FB_BACK         (2*FB_SIZE)
+#define        FB_FORW         (3*FB_SIZE)
+
+/* miscellaneous */
+#define        KEYDEFINE       0
+#define        DOTGAIN         DOTSCT->s_gain
+
+/* ========== type declarations ========== */
+
+struct expr_t {
+       short   typ;
+       valu_t  val;
+};
+
+typedef        struct expr_t   expr_t;
+
+struct item_t {
+       struct item_t *
+               i_next; /* linked lists with same hash value */
+       short   i_type;
+       /*
+        * the i_type field is used for two different purposes:
+        *      - the token type for keywords, returned by yylex()
+        *      - the symbol type for IDENT and FBSYM tokens
+        */
+       valu_t  i_valu;         /* symbol value */
+       char    *i_name;        /* symbol name */
+};
+
+typedef        struct item_t   item_t;
+
+struct sect_t {
+       short   s_flag;         /* some flag bits */
+       addr_t  s_base;         /* section base */
+       addr_t  s_size;         /* section size */
+       addr_t  s_comm;         /* length of commons */
+       addr_t  s_zero;         /* delayed emit1(0) */
+       addr_t  s_lign;         /* section alignment */
+       long    s_foff;         /* section file offset */
+       item_t  *s_item;        /* points to section name */
+#ifdef THREE_PASS
+       addr_t  s_gain;         /* gain in PASS_2 */
+#endif
+};
+
+typedef        struct sect_t   sect_t;
+
+/* ========== flag field bits ========== */
+
+/* s_flag bits: */
+#define        BASED           1       /* at fixed position */
+
+/* sflag bits: */
+#define        SYM_EXT         001     /* external symbols */
+#define        SYM_LOC         002     /* local symbols */
+#define        SYM_LAB         004     /* local, compiler-generated labels */
+#define        SYM_SMB         010     /* .symb symbols */
+#define        SYM_LIN         020     /* .line and .file */
+#define        SYM_SCT         040     /* section names */
+#define        SYM_DEF         073     /* default value */
+
+/*
+ * extra type bits out of S_ETC, internal use only
+#ifndef DUK
+ * S_COM:
+ *  - symbols declared by .comm
+#endif DUK
+ * S_VAR:
+ *  - type not known at end of PASS_1 (S_VAR|S_UND)
+ *  - value not known at end of PASS_2 (S_VAR|S_ABS)
+ * S_DOT:
+ *  - dot expression
+ */
+#ifndef DUK
+#define        S_COM           0x0100
+#endif DUK
+#define        S_VAR           0x0200
+#define        S_DOT           0x0400
+/* should be tested by preprocessor
+ * due to error in preprocessor it cannot
+ * test performed at runtime now
+ * #if (S_ETC|S_COM|S_VAR|S_DOT) != S_ETC
+ * incorrect type bits
+ * #endif
+ */
+
+/* parts of the a.out file */
+#define        PARTEMIT        0
+#define        PARTRELO        1
+#define        PARTNAME        2
+#define        PARTCHAR        3
+#define        PARTS           4
+
+#ifdef AOUTSEEK
+#define        AOUTPART(p)     if(aoutpart!=p){aoutpart=p;fseek(aoutfile,aoutseek[p],0);}
+#define        AOUTPUTC(c,p)   {putc(c,aoutfile);aoutseek[p]++;if(ferror(aoutfile))werror();}
+#else
+#define        AOUTPART(p)     /* empty */
+#define        AOUTPUTC(c,p)   {putc(c,aoutfile[p]);if(ferror(aoutfile[p]))werror();}
+#endif
diff --git a/mach/proto/as/comm1.h b/mach/proto/as/comm1.h
new file mode 100644 (file)
index 0000000..ca43331
--- /dev/null
@@ -0,0 +1,122 @@
+/* @(#)comm1.h 1.5 */
+/*
+ * variable declarations
+ */
+
+#ifdef extern
+#define        INIT(x)         = x
+#else
+#define        INIT(x)         /* empty */
+#endif
+
+extern short   pass INIT(PASS_1);
+                               /* PASS 1, 2 or 3 */
+extern short   peekc;          /* push back symbol (PASS_1) */
+extern short   unresolved;     /* number of unresolved references */
+extern short   lineno;         /* input line number */
+extern short   hllino;         /* high-level language line number */
+extern short   nerrors;        /* terminate at end of pass if set */
+extern short   sflag INIT(SYM_DEF);
+                               /* -s option (symbol table info) */
+extern char    *progname;      /* for error messages */
+extern char    *modulename;    /* for error messages */
+
+#ifdef ASLD
+extern short   archmode;       /* scanning archives */
+extern long    archsize;       /* size of individual archive entries */
+#else
+extern short   uflag;          /* if 1 make undefineds extern */
+                               /* symbol table index for last S_UND */
+#endif
+
+#ifdef LISTING
+extern short   dflag;          /* -d option (list mode) */
+#endif
+
+#ifdef ASLD
+#ifdef RELOCATION
+extern short   rflag;          /* -r option (relocation info) */
+#endif RELOCATION
+#else
+#define        rflag   1
+extern valu_t  relonami;
+#endif ASLD
+
+#ifdef THREE_PASS
+extern short   bflag;          /* -b option (no optimizations) */
+#endif
+
+extern char    *aoutpath INIT("a.out");
+extern char    temppath[50];
+
+extern FILE    *input;
+extern FILE    *tempfile;
+
+#ifdef AOUTSEEK
+extern FILE    *aoutfile;
+extern int     aoutpart INIT(-1);
+extern long    aoutseek[PARTS];
+#else
+extern FILE    *aoutfile[PARTS];
+#endif
+
+extern char    stringbuf[STRINGMAX];
+                               /* contains last string value */
+
+extern sect_t  sect[SECTMAX];
+
+/*
+ * specials for the location counter
+ */
+extern sect_t  *DOTSCT;        /* &sect[DOTTYP-S_MIN] or NULL */
+extern addr_t  DOTVAL;         /* DOTSCT->s_size + DOTSCT->s_base */
+extern short   DOTTYP;         /* S_MIN..S_MAX or S_UND */
+
+extern item_t  *hashtab[H_TOTAL];
+extern short   hashindex;      /* see item_search() */
+
+extern item_t  *fb_ptr[4*FB_SIZE];
+
+#ifdef THREE_PASS
+extern char    bittab[BITMAX>>3];
+                               /* one bit per small-large decision */
+extern short   nbits;          /* number of decisions so far */
+#endif
+
+#ifdef LISTING
+extern short   listmode;       /* -d option for current pass */
+extern short   listtemp;       /* listmode if .list seen */
+extern short   listflag;       /* copied from listtemp at '\n' */
+extern short   listcolm;       /* column on output */
+extern short   listeoln INIT(1);
+                               /* set by endline, tested by emit1 */
+extern FILE    *listfile;      /* copy of source text */
+extern char    listpath[50];
+#endif
+
+#ifndef extern
+extern item_t          keytab[];
+extern struct outhead  outhead;
+#endif
+
+/* forward function declarations */
+extern char    *libname();
+extern char    *readident();
+extern char    *remember();
+extern item_t  *fb_shift();
+extern item_t  *fb_alloc();
+extern item_t  *item_alloc();
+extern item_t  *item_search();
+extern valu_t  load();
+extern FILE    *ffcreat();
+extern FILE    *fftemp();
+
+/* some library functions used */
+extern long    atol();
+extern char    *mktemp();
+extern char    *sbrk();
+extern char    *getenv();
+
+/* ========== Machine dependent C declarations ========== */
+
+#include       "mach1.c"
diff --git a/mach/proto/as/comm2.y b/mach/proto/as/comm2.y
new file mode 100644 (file)
index 0000000..0e5c37c
--- /dev/null
@@ -0,0 +1,424 @@
+/* @(#)comm2.y 1.7 */
+
+/*
+ * delay inclusion of machine dependent stuff (see comm0.h)
+ */
+#define        _include        #include
+
+%{
+#include       "comm0.h"
+#include       "comm1.h"
+%}
+
+/* ========== Machine independent Yacc definitions ========== */
+
+%union {
+       word_t  y_word;
+       valu_t  y_valu;
+       expr_t  y_expr;
+       item_t  *y_item;
+#ifdef ASLD
+       char    *y_strp;
+#endif
+};
+
+#ifdef ASLD
+%token <y_strp> MODULE
+#endif
+%token STRING
+%token <y_item> IDENT
+%token <y_item> FBSYM
+%token <y_valu> CODE1
+%token <y_valu> CODE2
+%token <y_valu> CODE4
+%token NUMBER0         /* keep NUMBER* in this order */
+%token NUMBER1
+%token NUMBER2
+%token NUMBER3
+%token <y_valu> NUMBER
+%token DOT
+%token EXTERN
+%token <y_word> DATA
+%token <y_word> ASCII
+%token SECTION
+%token COMMON
+%token BASE
+%token SYMB
+%token ALIGN
+%token ASSERT
+%token SPACE
+%token <y_word> LINE
+%token FILe
+%token <y_word> LIST
+%token OP_EQ
+%token OP_NE
+%token OP_LE
+%token OP_GE
+%token OP_LL
+%token OP_RR
+%token OP_OO
+%token OP_AA
+
+%left OP_OO
+%left OP_AA
+%left '|'
+%left '^'
+%left '&'
+%left OP_EQ OP_NE
+%left '<' '>' OP_LE OP_GE
+%left OP_LL OP_RR
+%left '+' '-'
+%left '*' '/' '%' 
+%nonassoc '~'
+
+%type <y_valu> absexp optabs1 optabs2
+%type <y_expr> expr
+%type <y_item> id_fb
+
+/* ========== Machine dependent Yacc definitions ========== */
+
+#include       "mach2.c"
+
+%%
+
+/* ========== Machine independent rules ========== */
+
+#ifdef LISTING
+#define        LISTLINE(n)     listline(n)
+#else
+#define        LISTLINE(n)     /* empty */
+#endif LISTING
+
+#ifdef ASLD
+#define        RELODONE        /* empty */
+#else
+#define        RELODONE        assert(relonami == 0)
+#endif
+
+program        :       /* empty */
+#ifdef ASLD
+       |       program MODULE /* not in PASS_1 */
+                       {       newmodule($2);}
+#endif
+       |       program IDENT ':'
+                       {       newident($2, DOTTYP); newlabel($2);}
+       |       program NUMBER ':'
+                       {       if ($2 < 0 || $2 > 9) {
+                                       serror("bad f/b label");
+                                       $2 = 0;
+                               }
+                               newlabel(fb_shift((int)$2));
+                       }
+       |       program CODE1
+                       {       emit1((char)$2); LISTLINE(0);}
+       |       program CODE2
+                       {       emit2((short)$2); LISTLINE(0);}
+       |       program CODE4
+                       {       emit4((long)$2); LISTLINE(0);}
+       |       program operation ';'
+       |       program operation '\n'
+                       {       lineno++; LISTLINE(1); RELODONE;}
+       |       program '#' NUMBER STRING '\n'
+                       {       lineno++; LISTLINE(1); RELODONE;}
+       |       program error '\n'
+                       {       serror("syntax error"); yyerrok;
+                               lineno++; LISTLINE(1); RELODONE;
+                       }
+       ;
+#undef LISTLINE
+#undef RELODONE
+operation
+       :       /* empty */
+       |       IDENT '=' expr
+                       {
+#ifdef LISTING
+                               if (listflag & 1)
+                                       listcolm += printx(VALWIDTH, $3.val);
+#endif
+                               newequate($1, $3.typ);
+                               store($1, $3.val);
+                       }
+#ifdef LISTING
+       |       LIST
+                       {       if ($1)
+                                       listtemp = listmode;
+                               else if ((dflag & 01000) == 0)
+                                       listtemp = 0;
+                       }
+#endif
+       |       SECTION IDENT
+                       {       newsect($2);}
+       |       COMMON IDENT ',' absexp
+                       {       newcomm($2, $4);}
+       |       BASE absexp
+                       {       if (pass == PASS_1) newbase($2);}
+       |       ASSERT expr
+                       {       if ($2.val == 0 && pass == PASS_3)
+                                       warning("assertion failed");
+                       }
+       |       SYMB STRING ',' expr optabs2 optabs2
+                       {       if ((sflag & SYM_SMB) && PASS_SYMB) {
+#ifndef ASLD
+                                       if (
+                                               pass == PASS_3
+                                               &&
+                                               ($4.typ & S_TYP) == S_UND
+                                          ) {
+                                               serror("expression undefined");
+                                               relonami = -1;
+                                       }
+#endif
+                                       newsymb(
+                                               stringbuf+1,
+                                               (short)(
+                                                       ($4.typ & (S_EXT|S_TYP))
+                                                       |
+                                                       ((ushort)$5<<8)
+                                               ),
+                                               (short)$6,
+                                               $4.val
+                                       );
+                               }
+                       }
+       |       LINE optabs1
+                       {       if ((sflag & SYM_LIN) && PASS_SYMB) {
+                                       if ($2)
+                                               hllino = (short)$2;
+                                       else
+                                               hllino++;
+                                       newsymb(
+                                               (char *)0,
+                                               (short)(DOTTYP | S_LIN),
+                                               (short)hllino,
+                                               (valu_t)DOTVAL
+                                       );
+                               }
+                       }
+       |       FILe STRING
+                       {       if ((sflag & SYM_LIN) && PASS_SYMB) {
+                                       hllino = 0;
+                                       newsymb(
+                                               stringbuf+1,
+                                               (short)(DOTTYP | S_FIL),
+                                               (short)0,
+                                               (valu_t)DOTVAL
+                                       );
+                               }
+                       }
+       |       EXTERN externlist
+       |       ALIGN optabs1
+                       {       align($2);}
+       |       SPACE absexp
+                       {       if (DOTSCT == NULL)
+                                       nosect();
+                               DOTVAL += $2;
+                               DOTSCT->s_zero += $2;
+                       }
+       |       DATA datalist
+       |       ASCII STRING
+                       {       emitstr($1);}
+       ;
+externlist
+       :       IDENT
+                       {       $1->i_type |= S_EXT;}
+       |       externlist ',' IDENT
+                       {       $3->i_type |= S_EXT;}
+       ;
+datalist
+       :       expr
+                       {
+#ifdef RELOCATION
+                               if (rflag != 0 && PASS_RELO)
+#ifdef DUK
+#ifdef BYTES_REVERSED
+#ifdef WORDS_REVERSED
+                                       newrelo($1.typ,
+                                               (int)$<y_word>0 | RELBR | RELWR
+                                       );
+#else WORDS_REVERSED
+                                       newrelo($1.typ, (int)$<y_word>0|RELBR);
+#endif WORDS_REVERSED
+#else BYTES_REVERSED
+#ifdef WORDS_REVERSED
+                                       newrelo($1.typ, (int)$<y_word>0|RELWR);
+#else WORDS_REVERSED
+                                       newrelo($1.typ, (int)$<y_word>0);
+#endif WORDS_REVERSED
+#endif BYTES_REVERSED
+#else DUK
+                                       newrelo($1.typ, (int)$<y_word>0);
+#endif DUK
+#endif
+                               emitx($1.val, (int)$<y_word>0);
+                       }
+       |       datalist ',' expr
+                       {
+#ifdef RELOCATION
+                               if (rflag != 0 && PASS_RELO)
+#ifdef DUK
+#ifdef BYTES_REVERSED
+#ifdef WORDS_REVERSED
+                                       newrelo($3.typ,
+                                               (int)$<y_word>0 | RELBR | RELWR
+                                       );
+#else WORDS_REVERSED
+                                       newrelo($3.typ, (int)$<y_word>0|RELBR);
+#endif WORDS_REVERSED
+#else BYTES_REVERSED
+#ifdef WORDS_REVERSED
+                                       newrelo($3.typ, (int)$<y_word>0|RELWR);
+#else WORDS_REVERSED
+                                       newrelo($3.typ, (int)$<y_word>0);
+#endif WORDS_REVERSED
+#endif BYTES_REVERSED
+#else DUK
+                                       newrelo($3.typ, (int)$<y_word>0);
+#endif DUK
+#endif
+                               emitx($3.val, (int)$<y_word>0);
+                       }
+       ;
+expr   :       error
+                       {       serror("expr syntax err");
+                               $$.val = 0; $$.typ = S_UND;
+                       }
+       |       NUMBER
+                       {       $$.val = $1; $$.typ = S_ABS;}
+       |       id_fb
+                       {       $$.val = load($1); 
+                               $$.typ = $1->i_type & ~S_EXT;
+                       }
+       |       STRING
+                       {       if (stringbuf[0] != 1)
+                                       serror("too many chars");
+                               $$.val = stringbuf[1];
+                               $$.typ = S_ABS;
+                       }
+       |       ASC_LPAR expr ASC_RPAR
+                       {       $$ = $2;}
+       |       expr OP_OO expr
+                       {       $$.val = ($1.val || $3.val);
+                               $$.typ = combine($1.typ, $3.typ, 0);
+                       }
+       |       expr OP_AA expr
+                       {       $$.val = ($1.val && $3.val);
+                               $$.typ = combine($1.typ, $3.typ, 0);
+                       }
+       |       expr '|' expr
+                       {       $$.val = ($1.val | $3.val);
+                               $$.typ = combine($1.typ, $3.typ, 0);
+                       }
+       |       expr '^' expr
+                       {       $$.val = ($1.val ^ $3.val);
+                               $$.typ = combine($1.typ, $3.typ, 0);
+                       }
+       |       expr '&' expr
+                       {       $$.val = ($1.val & $3.val);
+                               $$.typ = combine($1.typ, $3.typ, 0);
+                       }
+       |       expr OP_EQ expr
+                       {       $$.val = ($1.val == $3.val);
+                               $$.typ = combine($1.typ, $3.typ, '>');
+                       }
+       |       expr OP_NE expr
+                       {       $$.val = ($1.val != $3.val);
+                               $$.typ = combine($1.typ, $3.typ, '>');
+                       }
+       |       expr '<' expr
+                       {       $$.val = ($1.val < $3.val);
+                               $$.typ = combine($1.typ, $3.typ, '>');
+                       }
+       |       expr '>' expr
+                       {       $$.val = ($1.val > $3.val);
+                               $$.typ = combine($1.typ, $3.typ, '>');
+                       }
+       |       expr OP_LE expr
+                       {       $$.val = ($1.val <= $3.val);
+                               $$.typ = combine($1.typ, $3.typ, '>');
+                       }
+       |       expr OP_GE expr
+                       {       $$.val = ($1.val >= $3.val);
+                               $$.typ = combine($1.typ, $3.typ, '>');
+                       }
+       |       expr OP_RR expr
+                       {       $$.val = ($1.val >> $3.val);
+                               $$.typ = combine($1.typ, $3.typ, 0);
+                       }
+       |       expr OP_LL expr
+                       {       $$.val = ($1.val << $3.val);
+                               $$.typ = combine($1.typ, $3.typ, 0);
+                       }
+       |       expr '+' expr
+                       {       $$.val = ($1.val + $3.val);
+                               $$.typ = combine($1.typ, $3.typ, '+');
+                       }
+       |       expr '-' expr
+                       {       $$.val = ($1.val - $3.val);
+                               $$.typ = combine($1.typ, $3.typ, '-');
+                       }
+       |       expr '*' expr
+                       {       $$.val = ($1.val * $3.val);
+                               $$.typ = combine($1.typ, $3.typ, 0);
+                       }
+       |       expr '/' expr
+                       {       if ($3.val == 0) {
+                                       if (pass == PASS_3)
+                                               serror("divide by zero");
+                                       $$.val = 0;
+                               } else
+                                       $$.val = ($1.val / $3.val);
+                               $$.typ = combine($1.typ, $3.typ, 0);
+                       }
+       |       expr '%' expr
+                       {       if ($3.val == 0) {
+                                       if (pass == PASS_3)
+                                               serror("divide by zero");
+                                       $$.val = 0;
+                               } else
+                                       $$.val = ($1.val % $3.val);
+                               $$.typ = combine($1.typ, $3.typ, 0);
+                       }
+       |       '+' expr %prec '*'
+                       {       $$.val = $2.val;
+                               $$.typ = combine(S_ABS, $2.typ, 0);
+                       }
+       |       '-' expr %prec '*'
+                       {       $$.val = -$2.val;
+                               $$.typ = combine(S_ABS, $2.typ, 0);
+                       }
+       |       '~' expr
+                       {       $$.val = ~$2.val;
+                               $$.typ = combine(S_ABS, $2.typ, 0);
+                       }
+       |       DOT
+                       {       $$.val = DOTVAL;
+                               $$.typ = DOTTYP|S_DOT;
+                       }
+       ;
+id_fb  :       IDENT
+       |       FBSYM
+       ;
+absexp :       expr
+                       {       if (($1.typ & ~S_EXT) != S_ABS)
+                                       serror("must be absolute");
+                               $$ = $1.val;
+                       }
+       ;
+optabs1
+       :       /* empty */
+                       {       $$ = 0;}
+       |       absexp
+                       {       $$ = $1;}
+       ;
+optabs2
+       :       /* empty */
+                       {       $$ = 0;}
+       |       ',' absexp
+                       {       $$ = $2;}
+       ;
+
+/* ========== Machine dependent rules ========== */
+
+#include       "mach4.c"
+
+%%
diff --git a/mach/proto/as/comm3.c b/mach/proto/as/comm3.c
new file mode 100644 (file)
index 0000000..937114e
--- /dev/null
@@ -0,0 +1,50 @@
+/* @(#)comm3.c 1.1 */
+/*
+ * storage allocation for variables
+ */
+
+#include       "comm0.h"
+
+#define        extern  /* empty, to force storage allocation */
+
+#include       "comm1.h"
+
+struct outhead outhead = {
+       O_MAGIC, O_STAMP, 0
+#ifndef DUK
+#ifdef BYTES_REVERSED
+       | HF_BREV
+#endif
+#ifdef WORDS_REVERSED
+       | HF_WREV
+#endif
+#endif DUK
+};
+
+#include       "y.tab.h"
+
+item_t keytab[] = {
+       0,      EXTERN,         0,              ".define",
+       0,      EXTERN,         0,              ".extern",
+       0,      DOT,            0,              ".",
+       0,      DATA,           1,              ".data1",
+       0,      DATA,           2,              ".data2",
+       0,      DATA,           4,              ".data4",
+       0,      ASCII,          0,              ".ascii",
+       0,      ASCII,          1,              ".asciz",
+       0,      ALIGN,          0,              ".align",
+       0,      ASSERT,         0,              ".assert",
+       0,      SPACE,          0,              ".space",
+       0,      COMMON,         0,              ".comm",
+       0,      SECTION,        0,              ".sect",
+       0,      BASE,           0,              ".base",
+       0,      SYMB,           0,              ".symb",
+       0,      LINE,           0,              ".line",
+       0,      FILe,           0,              ".file",
+#ifdef LISTING
+       0,      LIST,           0,              ".nolist",
+       0,      LIST,           1,              ".list",
+#endif
+#include       "mach3.c"
+       0,      0,              0,              0
+};
diff --git a/mach/proto/as/comm4.c b/mach/proto/as/comm4.c
new file mode 100644 (file)
index 0000000..14a1093
--- /dev/null
@@ -0,0 +1,539 @@
+/* @(#)comm4.c 1.6 */
+/*
+ * Micro processor assembler framework written by
+ *     Johan Stevenson, Vrije Universiteit, Amsterdam
+ * modified by
+ *     Johan Stevenson, Han Schaminee and Hans de Vries
+ *             Philips S&I, T&M, PMDS, Eindhoven
+ */
+
+#include       "comm0.h"
+#include       "comm1.h"
+#include       "y.tab.h"
+
+extern YYSTYPE yylval;
+
+/* ========== Machine independent C routines ========== */
+
+stop() {
+#if DEBUG < 2
+       unlink(temppath);
+#ifdef LISTING
+       unlink(listpath);
+#endif
+#endif
+       exit(nerrors != 0);
+}
+
+main(argc, argv)
+char **argv;
+{
+       register char *p;
+       register i;
+       static char sigs[] = {
+               SIGHUP, SIGINT, SIGQUIT, SIGTERM, 0
+       };
+
+       /* this test should be performed by the
+        * preprocessor, but it cannot
+        */
+       if ((S_ETC|S_COM|S_VAR|S_DOT) != S_ETC)
+               fatal("incorrect type bits");
+
+       progname = *argv++; argc--;
+       for (p = sigs; i = *p++; )
+               if (signal(i, SIG_IGN) != SIG_IGN)
+                       signal(i, stop);
+       for (i = 0; i < argc; i++) {
+               p = argv[i];
+               if (*p++ != '-')
+                       continue;
+               switch (*p++) {
+               case 'o':
+                       if (*p != NULL) {
+                               aoutpath = p;
+                               break;
+                       }
+                       argv[i] = 0;
+                       if (++i >= argc)
+                               fatal("-o needs filename");
+                       aoutpath = argv[i];
+                       break;
+               case 'd':
+#ifdef LISTING
+                       dflag = 0;
+                       while (*p >= '0' && *p <= '7')
+                               dflag = (dflag << 3) + *p++ - '0';
+                       if ((dflag & 0777) == 0)
+                               dflag |= 0700;
+                       dflag &= ~4;
+#endif
+                       break;
+               case 's':
+                       sflag = 0;
+                       while (*p >= '0' && *p <= '7')
+                               sflag = (sflag << 3) + *p++ - '0';
+                       break;
+               case 'r':
+#ifdef RELOCATION
+#ifdef ASLD
+                       rflag = 1;
+#endif ASLD
+#endif RELOCATION
+                       break;
+               case 'b':
+#ifdef THREE_PASS
+                       bflag = 1;
+#endif
+                       break;
+#ifndef ASLD
+               case 'u':
+               case '\0':
+                       uflag = 1;
+                       break;
+#endif
+               default:
+                       continue;
+               }
+               argv[i] = 0;
+       }
+#ifdef RELOCATION
+       if (rflag)
+               sflag |= SYM_SCT;
+#endif RELOCATION
+       pass_1(argc, argv);
+#ifdef THREE_PASS
+       pass_23(PASS_2);
+#endif
+       pass_23(PASS_3);
+       stop();
+}
+
+/* ---------- pass 1: arguments, modules, archives ---------- */
+
+pass_1(argc, argv)
+char **argv;
+{
+       register i;
+       register char *p;
+       register item_t *ip;
+#ifdef ASLD
+       char armagic[SZMAGIC];
+#else
+       register nfile = 0;
+#endif
+
+       tempfile = fftemp(temppath, "asTXXXXXX");
+#ifdef LISTING
+       listmode = dflag;
+       if (listmode & 0440)
+               listfile = fftemp(listpath, "asLXXXXXX");
+#endif
+       for (ip = keytab; ip->i_type; ip++)
+               item_insert(ip, H_KEY+hash(ip->i_name));
+       machstart(PASS_1);
+       while (--argc >= 0) {
+               p = *argv++;
+               if (p == 0)
+                       continue;
+#ifdef ASLD
+               if (p[0] == '-' && p[1] == '\0') {
+                       input = stdin;
+                       parse("STDIN");
+                       continue;
+               }
+#else
+               if (nfile != 0)
+                       fatal("second source file %s", p);
+               nfile++;
+#endif
+               if ((input = fopen(p, "r")) == NULL)
+                       fatal("can't open %s", p);
+#ifdef ASLD
+               if (
+                       fread(armagic, SZMAGIC, 1, input) == 1
+                       &&
+                       strncmp(armagic, ARMAGIC, SZMAGIC) == 0
+               ) {
+                       archive();
+                       fclose(input);
+                       continue;
+               }
+               rewind(input);
+#endif
+               parse(p);
+               fclose(input);
+       }
+       commfinish();
+       machfinish(PASS_1);
+#ifdef ASLD
+       if (unresolved) {
+               nerrors++;
+               fflush(stdout);
+               fprintf(stderr, "unresolved references:\n");
+               for (i = 0; i < H_SIZE; i++) {
+                       ip = hashtab[H_GLOBAL+i];
+                       while (ip != 0) {
+                               if ((ip->i_type & (S_EXT|S_TYP)) == (S_EXT|S_UND))
+                                       fprintf(stderr, "\t%s\n", ip->i_name);
+                               ip = ip->i_next;
+                       }
+               }
+       }
+#else
+       if (unresolved)
+               outhead.oh_flags |= HF_LINK;
+       if (nfile == 0)
+               fatal("no source file");
+#endif
+}
+
+#ifdef ASLD
+archive()
+{
+       register long offset;
+       register i;
+       register long modsize;
+       char modhead[SZMHEAD];
+
+       archmode++;
+       offset = SZMAGIC;
+       for (;;) {
+               if (unresolved == 0)
+                       break;
+               fseek(input, offset, 0);
+               if (fread(modhead, SZMHEAD, 1, input) != 1)
+                       break;
+               if (
+                       strncmp(&modhead[OFF_BEG], STR_BEG, LEN_BEG)
+                       ||
+                       strncmp(&modhead[OFF_END], STR_END, LEN_END)
+               )
+                       fatal("bad archive");
+               offset += SZMHEAD;
+               modsize = atol(&modhead[OFF_SIZ]);
+               archsize = modsize;
+               if (needed()) {
+                       fseek(input, offset, 0);
+                       archsize = modsize;
+                       for (i = 0; i < LEN_NAM; i++)
+                               if (modhead[OFF_NAM+i] == ' ')
+                                       break;
+                       modhead[OFF_NAM+i] = '\0';
+                       parse(remember(&modhead[OFF_NAM]));
+               }
+               offset += modsize;
+       }
+       archmode = 0;
+}
+
+needed()
+{
+       register c, first;
+       register item_t *ip;
+       register need;
+
+#ifdef LISTING
+       register save;
+
+       save = listflag; listflag = 0;
+#endif
+       need = 0;
+       peekc = -1;
+       first = 1;
+       for (;;) {
+               c = nextchar();
+               if (c == '\n') {
+                       first = 1;
+                       continue;
+               }
+               if (c == ' ' || c == '\t' || c == ',')
+                       continue;
+               if (ISALPHA(c) == 0)
+                       break;
+               if ((ip = item_search(readident(c))) == 0) {
+                       if (first)
+                               break;
+                       continue;
+               }
+               if (first) {
+                       if (ip != &keytab[KEYDEFINE])
+                               break;
+                       first = 0;
+               }
+               if ((ip->i_type & S_TYP) == S_UND) {
+                       need++;
+                       break;
+               }
+       }
+#ifdef LISTING
+       listflag = save;
+#endif
+       return(need);
+}
+#endif ASLD
+
+parse(s)
+char *s;
+{
+       register i;
+       register item_t *ip;
+       register char *p;
+
+       for (p = s; *p; )
+               if (*p++ == '/')
+                       s = p;
+#ifdef ASLD
+       yylval.y_strp = s;
+       putval(MODULE);
+#endif
+       for (i = 0; i < FB_SIZE; i++)
+               fb_ptr[FB_BACK+i] = 0;
+       newmodule(s);
+       peekc = -1;
+       yyparse();
+       /*
+        * Check for undefined symbols
+        */
+#ifdef ASLD
+       for (i = 0; i < H_SIZE; i++) {
+               while (ip = hashtab[H_LOCAL+i]) {
+                       /*
+                        * cleanup local queue
+                        */
+                       hashtab[H_LOCAL+i] = ip->i_next;
+                       /*
+                        * make undefined references extern
+                        */
+                       if ((ip->i_type & (S_VAR|S_TYP)) == S_UND) 
+                               ip->i_type |= S_EXT;
+                       /*
+                        * relink externals in global queue
+                        */
+                       if (ip->i_type & S_EXT)
+                               item_insert(ip, H_GLOBAL+i);
+               }
+       }
+#else
+       for (i = 0; i < H_SIZE; i++) {
+               for (ip = hashtab[H_LOCAL+i]; ip; ip = ip->i_next) {
+                       if (ip->i_type & S_EXT)
+                               continue;
+                       if (ip->i_type != S_UND)
+                               continue;
+                       if (uflag == 0)
+                               serror("undefined symbol %s", ip->i_name);
+                       ip->i_type |= S_EXT;
+               }
+       }
+#endif
+       /*
+        * Check for undefined numeric labels
+        */
+       for (i = 0; i < FB_SIZE; i++) {
+               if ((ip = fb_ptr[FB_FORW+i]) == 0)
+                       continue;
+               serror("undefined label %d", i);
+               fb_ptr[FB_FORW+i] = 0;
+       }
+}
+
+pass_23(n)
+{
+       register i;
+#ifdef ASLD
+       register addr_t base = 0;
+#endif
+       register sect_t *sp;
+
+       if (nerrors)
+               stop();
+       pass = n;
+#ifdef LISTING
+       listmode >>= 3;
+       if (listmode & 4)
+               ffreopen(listpath, listfile);
+       listeoln = 1;
+#endif
+#ifdef THREE_PASS
+       nbits = 0;
+#endif
+       for (i = 0; i < FB_SIZE; i++)
+               fb_ptr[FB_FORW+i] = fb_ptr[FB_HEAD+i];
+       outhead.oh_nemit = 0;
+       for (sp = sect; sp < &sect[outhead.oh_nsect]; sp++) {
+#ifdef ASLD
+               if (sp->s_flag & BASED) {
+                       base = sp->s_base;
+                       if (base % sp->s_lign)
+                               fatal("base not aligned");
+               } else {
+                       base += (sp->s_lign - 1);
+                       base -= (base % sp->s_lign);
+                       sp->s_base = base;
+               }
+               base += sp->s_size;
+               base += sp->s_comm;
+#endif
+               outhead.oh_nemit += sp->s_size - sp->s_zero;
+       }
+       if (pass == PASS_3) 
+               setupoutput();
+       for (sp = sect; sp < &sect[outhead.oh_nsect]; sp++) {
+               sp->s_size = 0;
+               sp->s_zero = 0;
+#ifdef THREE_PASS
+               sp->s_gain = 0;
+#endif
+       }
+       machstart(n);
+#ifndef ASLD
+       newmodule(modulename);
+#endif ASLD
+       ffreopen(temppath, tempfile);
+       yyparse();
+       commfinish();
+       machfinish(n);
+}
+
+newmodule(s)
+char *s;
+{
+       switchsect(S_UND);
+       modulename = s;
+       lineno = 1;
+       if ((sflag & (SYM_EXT|SYM_LOC|SYM_LAB)) && PASS_SYMB)
+               newsymb(s, S_MOD, (short)0, (valu_t)0);
+#ifdef LISTING
+       listtemp = 0;
+       if (dflag & 01000)
+               listtemp = listmode;
+       listflag = listtemp;
+#endif
+}
+
+setupoutput()
+{
+       register sect_t *sp;
+       register long off;
+       struct outsect outsect;
+
+#ifdef AOUTSEEK
+#define AOUTseek(p,o)  {aoutseek[p]=o;}
+       aoutfile = ffcreat(aoutpath);
+#else
+#define        AOUTseek(p,o)   {fseek(aoutfile[p],o,0);}
+       aoutfile[PARTEMIT]=ffcreat(aoutpath);
+#ifdef RELOCATION
+       aoutfile[PARTRELO]=ffcreat(aoutpath);
+#endif
+       aoutfile[PARTNAME]=ffcreat(aoutpath);
+       aoutfile[PARTCHAR]=ffcreat(aoutpath);
+#endif
+       /*
+        * header generation
+        */
+       AOUTseek(PARTEMIT, 0);
+       putofmt((char *)&outhead, SF_HEAD, PARTEMIT);
+       /*
+        * section table generation
+        */
+       off = SZ_HEAD;
+       off += (long)outhead.oh_nsect * SZ_SECT;
+       for (sp = sect; sp < &sect[outhead.oh_nsect]; sp++) {
+               sp->s_foff = off;
+               outsect.os_base = SETBASE(sp);
+               outsect.os_size = sp->s_size + sp->s_comm;
+               outsect.os_foff = sp->s_foff;
+               outsect.os_flen = sp->s_size - sp->s_zero;
+               outsect.os_lign = sp->s_lign;
+               off += outsect.os_flen;
+               putofmt((char *)&outsect, SF_SECT, PARTEMIT);
+       }
+#ifdef RELOCATION
+       AOUTseek(PARTRELO, off);
+       off += (long)outhead.oh_nrelo * SZ_RELO;
+#endif
+       if (sflag == 0)
+               return;
+       AOUTseek(PARTNAME, off);
+       off += (long)outhead.oh_nname * SZ_NAME;
+       AOUTseek(PARTCHAR, off);
+       outhead.oh_nchar = off; /* see newsymb() */
+#undef AOUTseek
+}
+
+commfinish()
+{
+       register i;
+       register item_t *ip;
+       register sect_t *sp;
+       register valu_t addr;
+
+       switchsect(S_UND);
+#ifdef ASLD
+       /*
+        * assign .comm labels and produce .comm symbol table entries
+        */
+       for (i = 0; i<H_SIZE; i++)
+               for (ip = hashtab[H_GLOBAL+i]; ip; ip = ip->i_next) {
+                       if ((ip->i_type & S_COM) == 0)
+                               continue;
+                       sp = &sect[(ip->i_type & S_TYP) - S_MIN];
+                       if (pass == PASS_1) {
+                               addr = sp->s_size + sp->s_comm;
+                               sp->s_comm += ip->i_valu;
+                               ip->i_valu = addr;
+                       }
+#ifdef THREE_PASS
+                       if (pass == PASS_2)
+                               ip->i_valu -= sp->s_gain;
+#endif
+                       if ((sflag & SYM_EXT) && PASS_SYMB)
+                               newsymb(
+                                       ip->i_name,
+                                       ip->i_type & (S_EXT|S_TYP),
+                                       (short)0,
+                                       load(ip)
+                               );
+               }
+#endif
+       if (PASS_SYMB == 0)
+               return;
+#ifndef ASLD
+       /*
+        * produce symbol table entries for undefined's
+        */
+       for (i = 0; i<H_SIZE; i++)
+               for (ip = hashtab[H_LOCAL+i]; ip; ip = ip->i_next) {
+                       if (ip->i_type != (S_EXT|S_UND))
+                               continue;
+                       if (pass != PASS_3)
+                               /*
+                                * save symbol table index
+                                * for possible relocation
+                                */
+                               ip->i_valu = outhead.oh_nname;
+                       if (sflag & SYM_SCT)
+                               newsymb(
+                                       ip->i_name,
+                                       S_EXT|S_UND,
+                                       (short)0,
+                                       (valu_t)0
+                               );
+               }
+#endif ASLD
+       /*
+        * produce symbol table entries for sections
+        */
+       if (sflag & SYM_SCT)
+               for (sp = sect; sp < &sect[outhead.oh_nsect]; sp++) {
+                       ip = sp->s_item;
+                       newsymb(
+                               ip->i_name,
+                               (short)(ip->i_type | S_SCT),
+                               (short)0,
+                               load(ip)
+                       );
+               }
+}
diff --git a/mach/proto/as/comm5.c b/mach/proto/as/comm5.c
new file mode 100644 (file)
index 0000000..09a00d2
--- /dev/null
@@ -0,0 +1,528 @@
+/* @(#)comm5.c 1.1 */
+
+#include       "comm0.h"
+#include       "comm1.h"
+#include       "y.tab.h"
+
+extern YYSTYPE yylval;
+
+yylex()
+{
+       register c;
+
+       if (pass == PASS_1) {
+               /* scan the input file */
+               do
+                       c = nextchar();
+               while (isspace(c) && c != '\n');
+               if (ISALPHA(c))
+                       c = inident(c);
+               else if (isdigit(c))
+                       c = innumber(c);
+               else switch (c) {
+               case '=':
+               case '<':
+               case '>':
+               case '|':
+               case '&':
+                       c = induo(c); break;
+               case ASC_SQUO:
+               case ASC_DQUO:
+                       c = instring(c); break;
+               case ASC_COMM:
+                       do
+                               c = nextchar();
+                       while (c != '\n' && c != '\0');
+                       break;
+               case CTRL('A'):
+                       c = CODE1; readcode(1); break;
+               case CTRL('B'):
+                       c = CODE2; readcode(2); break;
+               case CTRL('C'):
+                       c = CODE4; readcode(4); break;
+               }
+
+               /* produce the intermediate token file */
+               if (c <= 0)
+                       return(0);
+               if (c <= 127)
+                       putc(c, tempfile);
+               else
+                       putval(c);
+       } else {
+               /* read from intermediate token file */
+               c = getc(tempfile);
+               if (c == EOF)
+                       return(0);
+               if (c > 127) {
+                       c += 128;
+                       c = getval(c);
+               }
+       }
+       return(c);
+}
+
+putval(c)
+{
+       register valu_t v;
+       register n;
+       register char *p;
+
+       assert(c >= 256 && c < 256+128);
+       switch (c) {
+       case CODE1:
+               n = 1; goto putnum;
+       case CODE2:
+               n = 2; goto putnum;
+       case CODE4:
+               n = 4; goto putnum;
+       case NUMBER:
+               v = yylval.y_valu;
+               for (n = 0; n < sizeof(v); n++) {
+                       if (v == 0)
+                               break;
+                       v >>= 8;
+               }
+               c = NUMBER0 + n;
+       putnum:
+               putc(c-128, tempfile);
+               v = yylval.y_valu;
+               while (--n >= 0)
+                       putc(v >> (n*8), tempfile);
+               return;
+       case IDENT:
+       case FBSYM:
+               n = sizeof(item_t *);
+               p = (char *) &yylval.y_item; break;
+#ifdef ASLD
+       case MODULE:
+               n = sizeof(char *);
+               p = (char *) &yylval.y_strp; break;
+#endif
+       case STRING:
+               p = stringbuf;
+               n = (*p & 0377) + 1; break;
+       case OP_EQ:
+       case OP_NE:
+       case OP_LE:
+       case OP_GE:
+       case OP_LL:
+       case OP_RR:
+       case OP_OO:
+       case OP_AA:
+               n = 0; break;
+       default:
+               n = sizeof(word_t);
+               p = (char *) &yylval.y_word; break;
+       }
+       putc(c-128, tempfile);
+       while (--n >= 0)
+               putc(*p++, tempfile);
+}
+
+getval(c)
+{
+       register n;
+       register valu_t v;
+       register char *p;
+
+       switch (c) {
+       case CODE1:
+               n = 1; goto getnum;
+       case CODE2:
+               n = 2; goto getnum;
+       case CODE4:
+               n = 4; goto getnum;
+       case NUMBER0:
+               n = 0; c = NUMBER; goto getnum;
+       case NUMBER1:
+               n = 1; c = NUMBER; goto getnum;
+       case NUMBER2:
+               n = 2; c = NUMBER; goto getnum;
+       case NUMBER3:
+               n = 3; c = NUMBER; goto getnum;
+       case NUMBER:
+               n = 4;
+       getnum:
+               v = 0;
+               while (--n >= 0) {
+                       v <<= 8;
+                       v |= getc(tempfile);
+               }
+               yylval.y_valu = v;
+               return(c);
+       case IDENT:
+       case FBSYM:
+               n = sizeof(item_t *);
+               p = (char *) &yylval.y_item; break;
+#ifdef ASLD
+       case MODULE:
+               n = sizeof(char *);
+               p = (char *) &yylval.y_strp; break;
+#endif
+       case STRING:
+               p = stringbuf;
+#ifdef DUK
+               *p++ = n = getc(tempfile);
+               p[n] = '\0';
+               break;
+#else DUK
+               *p++ = n = getc(tempfile); break;
+#endif DUK
+       case OP_EQ:
+       case OP_NE:
+       case OP_LE:
+       case OP_GE:
+       case OP_LL:
+       case OP_RR:
+       case OP_OO:
+       case OP_AA:
+               n = 0; break;
+       default:
+               n = sizeof(word_t);
+               p = (char *) &yylval.y_word; break;
+       }
+       while (--n >= 0)
+               *p++ = getc(tempfile);
+       return(c);
+}
+
+/* ---------- lexical scan in pass 1 ---------- */
+
+nextchar()
+{
+       register c;
+
+       if (peekc != -1) {
+               c = peekc;
+               peekc = -1;
+               return(c);
+       }
+#ifdef ASLD
+       if (archmode && --archsize < 0)
+               return(0);
+#endif
+       if ((c = getc(input)) == EOF)
+               return(0);
+       if (isascii(c) == 0)
+               fatal("non-ascii character");
+#ifdef LISTING
+       if (listflag & 0440)
+               putc(c, listfile);
+#endif
+       return(c);
+}
+
+readcode(n)
+{
+       register c;
+
+       yylval.y_valu = 0;
+       do {
+               if (
+#ifdef ASLD
+                       (archmode && --archsize < 0)
+                       ||
+#endif
+                       (c = getc(input)) == EOF
+               )
+                       fatal("unexpected EOF in compact input");
+               yylval.y_valu <<= 8;
+               yylval.y_valu |= c;
+       } while (--n);
+}
+
+induo(c)
+register c;
+{
+       static short duo[] = {
+               ('='<<8) | '=', OP_EQ,
+               ('<'<<8) | '>', OP_NE,
+               ('<'<<8) | '=', OP_LE,
+               ('>'<<8) | '=', OP_GE,
+               ('<'<<8) | '<', OP_LL,
+               ('>'<<8) | '>', OP_RR,
+               ('|'<<8) | '|', OP_OO,
+               ('&'<<8) | '&', OP_AA,
+       };
+       register short *p;
+
+       c = (c<<8) | nextchar();
+       for (p = duo; *p; p++)
+               if (*p++ == c)
+                       return(*p++);
+       peekc = c & 0377;
+       return(c>>8);
+}
+
+inident(c)
+char c;
+{
+       register char *p;
+       register item_t *ip;
+
+       p = readident(c);
+       ip = item_search(p);
+       if (ip == 0) {
+               ip = item_alloc(S_UND);
+               ip->i_name = remember(p);
+               /* printf("ident %s %o\n", ip->i_name, ip); */
+               unresolved++;
+               item_insert(ip, H_LOCAL + (hashindex%H_SIZE));
+       } else if (hashindex < H_SIZE) {
+               assert(H_KEY == 0);
+               yylval.y_word = (word_t) ip->i_valu;
+               return(ip->i_type);
+       }
+       yylval.y_item = ip;
+       return(IDENT);
+}
+
+char *
+readident(c)
+register c;
+{
+       static char name[NAMEMAX+1];
+       register n = NAMEMAX;
+       register char *p = name;
+
+       do {
+               if (--n >= 0)
+                       *p++ = c;
+               c = nextchar();
+       } while (ISALNUM(c));
+       *p++ = '\0';
+       peekc = c;
+       return(name);
+}
+
+innumber(c)
+register c;
+{
+       register char *p;
+       register radix;
+       static char num[20+1];
+
+       p = num;
+       radix = 20;
+       do {
+               if (--radix < 0)
+                       fatal("number too long");
+               if (isupper(c))
+                       c += ('a' - 'A');
+               *p++ = c;
+               c = nextchar();
+       } while (ISALNUM(c));
+       peekc = c;
+       *p = '\0';
+       c = *--p;
+       p = num;
+       radix = 10;
+       if (*p == '0') {
+               radix = 8;
+               p++;
+               if (*p == 'x') {
+                       radix = 16;
+                       p++;
+               } else if (*p == 'b') {
+                       radix = 2;
+                       p++;
+               }
+       }
+       if (radix != 16 && (c == 'f' || c == 'b'))
+               return(infbsym(num));
+       yylval.y_valu = 0;
+       while (c = *p++) {
+               if (c > '9')
+                       c -= ('a' - '9' - 1);
+               c -= '0';
+               if (c >= radix)
+                       serror("digit exceeds radix");
+               yylval.y_valu = yylval.y_valu * radix + c;
+       }
+       return(NUMBER);
+}
+
+instring(termc)
+{
+       register char *p;
+       register c;
+
+       p = stringbuf+1;
+       for (;;) {
+               c = nextchar();
+               if (c == '\n' || c == '\0') {
+                       peekc = c;
+                       serror("non-terminated string");
+                       break;
+               }
+               if (c == termc)
+                       break;
+               if (c == '\\')
+                       c = inescape();
+#ifdef DUK
+               if (p >= &stringbuf[STRINGMAX - 1])
+#else DUK
+               if (p >= &stringbuf[STRINGMAX])
+#endif DUK
+                       fatal("string buffer overflow");
+               *p++ = c;
+       }
+       stringbuf[0] = p - stringbuf - 1;
+#ifdef DUK
+       *p = '\0';
+#endif DUK
+       return(STRING);
+}
+
+inescape()
+{
+       register c, j, r;
+
+       c = nextchar();
+       if (c >= '0' && c <= '7') {
+               r = c - '0';
+               for (j = 0; j < 2; j++) {
+                       c = nextchar();
+                       if (c < '0' || c > '7') {
+                               peekc = c;
+                               return(r);
+                       }
+                       r <<= 3;
+                       r += (c - '0');
+               }
+               return(r);
+       }
+       switch (c) {
+       case 'b':       return('\b');
+       case 'f':       return('\f');
+       case 'n':       return('\n');
+       case 'r':       return('\r');
+       case 't':       return('\t');
+       case '\'':      return('\'');
+       case '"':       return('"');
+       }
+       return(c);
+}
+
+infbsym(p)
+register char *p;
+{
+       register lab;
+       register item_t *ip;
+
+       lab = *p++ - '0';
+       if ((unsigned)lab < 10) {
+               if (*p++ == 'f') {
+                       ip = fb_ptr[FB_FORW+lab];
+                       if (ip == 0) {
+                               ip = fb_alloc(lab);
+                               fb_ptr[FB_FORW+lab] = ip;
+                       }
+                       goto ok;
+               }
+               ip = fb_ptr[FB_BACK+lab];
+               if (ip != 0 && *p == 0)
+                       goto ok;
+       }
+       serror("bad numeric label");
+       ip = fb_alloc(0);
+ok:
+       yylval.y_item = ip;
+       return(FBSYM);
+}
+
+hash(p)
+register char *p;
+{
+       register unsigned h;
+       register c;
+
+       h = 0;
+       while (c = *p++) {
+               h <<= 2;
+               h += c;
+       }
+       return(h % H_SIZE);
+}
+
+item_t *
+item_search(p)
+register char *p;
+{
+       register h;
+       register item_t *ip;
+
+       for (h = hash(p); h < H_TOTAL; h += H_SIZE) {
+               ip = hashtab[h];
+               while (ip != 0) {
+                       if (strcmp(p, ip->i_name) == 0)
+                               goto done;
+                       ip = ip->i_next;
+               }
+       }
+done:
+       hashindex = h;
+       return(ip);
+}
+
+item_insert(ip, h)
+item_t *ip;
+{
+       ip->i_next = hashtab[h];
+       hashtab[h] = ip;
+}
+
+item_t *
+item_alloc(typ)
+{
+       register item_t *ip;
+       static nleft = 0;
+       static item_t *next;
+
+       if (--nleft < 0) {
+               next = (item_t *) sbrk(MEMINCR);
+               if ((int) next == -1)
+                       fatal("out of memory");
+               nleft += (MEMINCR / sizeof(item_t));
+       }
+       ip = next++;
+       ip->i_next = 0;
+       ip->i_type = typ;
+       ip->i_name = 0;
+       ip->i_valu = 0;
+       return(ip);
+}
+
+item_t *
+fb_alloc(lab)
+register lab;
+{
+       register item_t *ip, *p;
+
+       ip = item_alloc(S_UND);
+       p = fb_ptr[FB_TAIL+lab];
+       if (p == 0)
+               fb_ptr[FB_HEAD+lab] = ip;
+       else
+               p->i_next = ip;
+       fb_ptr[FB_TAIL+lab] = ip;
+       return(ip);
+}
+
+item_t *
+fb_shift(lab)
+register lab;
+{
+       register item_t *ip;
+
+       ip = fb_ptr[FB_FORW+lab];
+       if (ip == 0)
+               if (pass == PASS_1)
+                       ip = fb_alloc(lab);
+               else
+                       ip = fb_ptr[FB_HEAD+lab];
+       fb_ptr[FB_BACK+lab] = ip;
+       fb_ptr[FB_FORW+lab] = ip->i_next;
+       return(ip);
+}
diff --git a/mach/proto/as/comm6.c b/mach/proto/as/comm6.c
new file mode 100644 (file)
index 0000000..624b143
--- /dev/null
@@ -0,0 +1,362 @@
+/* @(#)comm6.c 1.7 */
+/*
+ * implement pseudo instructions
+ */
+
+#include       "comm0.h"
+#include       "comm1.h"
+#include       "y.tab.h"
+
+newequate(ip, typ)
+register item_t *ip;
+register short typ;
+{
+       typ &= ~S_EXT;
+       if (typ & S_COM)
+               typ = S_UND;
+       else if ((typ & S_VAR) && (typ & S_TYP) != S_ABS)
+               typ = S_UND;
+#ifdef THREE_PASS
+       else if (pass == PASS_1 && typ == S_UND)
+               typ = S_VAR;
+       else if (pass == PASS_2 && (ip->i_type & S_TYP) == S_UND)
+               ip->i_type |= typ;
+#endif THREE_PASS
+       if (typ == S_UND)
+               serror("illegal equate");
+       if (pass == PASS_3)
+               assert((ip->i_type & S_TYP) == (typ & S_TYP));
+       newident(ip, typ);
+}
+
+newident(ip, typ)
+register item_t *ip;
+{
+       register flag;
+#ifdef GENLAB
+       static char genlab[] = GENLAB;
+#endif GENLAB
+
+       if (pass == PASS_1) {
+               /* printf("declare %s: %o\n", ip->i_name, typ); */
+               if (ip->i_type & ~S_EXT)
+                       serror("multiple declared");
+               else
+                       --unresolved;
+               ip->i_type |= typ;
+       }
+       if (PASS_SYMB == 0)
+               return;
+#ifdef THREE_PASS
+       if (ip->i_type & S_EXT)
+               flag = SYM_EXT;
+       else
+               flag = SYM_LOC;
+#else
+       flag = SYM_EXT|SYM_LOC; /* S_EXT not stable in PASS_1 */
+#endif THREE_PASS
+#ifdef GENLAB
+       if (strncmp(ip->i_name, genlab, sizeof(genlab)-1) == 0)
+               flag = SYM_LAB;
+#endif GENLAB
+       if (sflag & flag)
+               newsymb(
+                       ip->i_name,
+                       ip->i_type & (S_EXT|S_TYP),
+                       (short)0,
+                       load(ip)
+               );
+}
+
+newlabel(ip)
+register item_t *ip;
+{
+#ifdef THREE_PASS
+       register addr_t oldval = ip->i_valu;
+#endif
+
+       if (DOTSCT == NULL)
+               nosect();
+       ip->i_type &= ~S_TYP;
+       ip->i_type |= DOTTYP;
+       if (store(ip, (valu_t) DOTVAL) == 0)
+               return;
+#ifdef THREE_PASS
+       assert(pass != PASS_2 || oldval - ip->i_valu == DOTGAIN);
+#endif
+}
+
+newsect(ip)
+register item_t *ip;
+{
+       register ushort typ;
+       register sect_t *sp = NULL;
+
+       typ = ip->i_type & S_TYP;
+       if (typ == S_UND) {
+               /*
+                * new section
+                */
+               assert(pass == PASS_1);
+               --unresolved;
+               typ = outhead.oh_nsect + S_MIN;
+               outhead.oh_nsect++;
+               if (outhead.oh_nsect > SECTMAX || typ > S_MAX)
+                       fatal("too many sections");
+               sp = &sect[typ - S_MIN];
+               sp->s_item = ip;
+               sp->s_lign = ALIGNSECT;
+#ifdef DUK
+               ip->i_type = typ;
+#else DUK
+               ip->i_type = typ | S_EXT;
+#endif DUK
+               ip->i_valu = 0;
+       } else if (typ >= S_MIN) {
+               sp = &sect[typ - S_MIN];
+               if (sp->s_item != ip)
+                       sp = NULL;
+       }
+       if (sp == NULL)
+               serror("multiple declared");
+       else
+               switchsect(typ);
+}
+
+newbase(base)
+valu_t base;
+{
+#ifdef ASLD
+       register sect_t *sp;
+       
+       if ((sp = DOTSCT) == NULL)
+               nosect();
+       if (sp->s_flag & BASED)
+               serror("already based");
+       sp->s_base = base;
+       sp->s_flag |= BASED;
+       DOTVAL += base;
+#else
+       warning(".base ignored");
+#endif
+}
+
+/*
+ * NOTE: A rather different solution is used for ASLD and NOLD:
+ * ASLD:
+ *   - maximum length of .comm is recorded in i_valu during PASS_1
+ *   - address of .comm is recorded in i_valu in later passes:
+ *     assigned at end of PASS_1, corrected for s_gain at end of PASS_2
+ *   - symbol table entries are produced in commfinish()
+ * NOLD:
+ *   - i_valu cannot be used since it is needed for relocation info
+ *   - only one .comm with a particular symbol is allowed per module
+ *   - symbol table entries are produced in newcomm()
+ */
+newcomm(ip, val)
+register item_t *ip;
+valu_t val;
+{
+       if (pass == PASS_1) {
+               if (DOTSCT == NULL)
+                       nosect();
+               if (val == 0)
+                       serror("bad size");
+               /* printf("declare %s: %o\n", ip->i_name, DOTTYP); */
+               if ((ip->i_type & ~S_EXT) == S_UND) {
+                       --unresolved;
+                       ip->i_type = S_COM|S_EXT|DOTTYP;
+#ifdef ASLD
+                       ip->i_valu = val;
+               } else if (ip->i_type == (S_COM|S_EXT|DOTTYP)) {
+                       if (ip->i_valu < val)
+                               ip->i_valu = val;
+#endif
+               } else
+                       serror("multiple declared");
+       }
+#ifndef ASLD
+       if (PASS_SYMB == 0)
+               return;
+       if (pass != PASS_3)
+               /*
+                * save symbol table index
+                * for possible relocation
+                */
+               ip->i_valu = outhead.oh_nname;
+#ifdef DUK
+       newsymb(ip->i_name, S_COM|S_EXT|DOTTYP, (short)0, val);
+#else DUK
+       newsymb(ip->i_name, S_EXT|DOTTYP, (short)0, val);
+#endif DUK
+#endif
+}
+
+switchsect(newtyp)
+short newtyp;
+{
+       register sect_t *sp;
+       
+       if (sp = DOTSCT)
+               sp->s_size = DOTVAL - sp->s_base;
+       if (newtyp == S_UND) {
+               DOTSCT = NULL;
+               DOTTYP = newtyp;
+               return;
+       }
+       assert(newtyp >= S_MIN);
+       sp = &sect[newtyp - S_MIN];
+       if (pass == PASS_3) {
+#ifdef AOUTSEEK
+               aoutpart = -1;
+               aoutseek[PARTEMIT] = sp->s_foff + sp->s_size - sp->s_zero;
+#else
+               fseek(aoutfile[PARTEMIT], sp->s_foff + sp->s_size - sp->s_zero, 0);
+#endif
+       }
+       DOTVAL = sp->s_size + sp->s_base;
+       DOTSCT = sp;
+       DOTTYP = newtyp;
+}
+
+align(bytes)
+valu_t bytes;
+{
+       register valu_t gap;
+       register sect_t *sp;
+
+       if ((sp = DOTSCT) == NULL)
+               nosect();
+       if (bytes == 0)
+               bytes = ALIGNWORD;
+       if (sp->s_lign % bytes)
+               if (bytes % sp->s_lign)
+                       serror("illegal alignment");
+               else
+                       sp->s_lign = bytes;
+       if (pass == PASS_1)
+               /*
+                * be pessimistic: biggest gap possible
+                */
+               gap = bytes - 1;
+       else {
+               /*
+                * calculate gap correctly;
+                * will be the same in PASS_2 and PASS_3
+                */
+               if ((gap = DOTVAL % bytes) != 0)
+                       gap = bytes - gap;
+#ifdef THREE_PASS
+               if (pass == PASS_2)
+                       /*
+                        * keep track of gain with respect to PASS_1
+                        */
+                       DOTGAIN += (bytes - 1) - gap;
+#endif
+       }
+       DOTVAL += gap;
+       sp->s_zero += gap;
+}
+
+#ifdef RELOCATION
+newrelo(s, n)
+short s;
+{
+       struct outrelo outrelo;
+#ifdef DUK
+       int     iscomm;
+#endif DUK
+
+       if (rflag == 0)
+               return;
+       if (PASS_RELO == 0)
+               return;
+       s &= ~S_DOT;
+       assert((s & ~(S_COM|S_VAR|S_TYP)) == 0);
+#ifndef THREE_PASS
+       if (s == S_UND)
+               serror("bad relocation");
+#endif
+       /*
+        * always relocation info if S_VAR to solve problems with:
+        *      move    b,d0
+        *      b=a
+        *  a:  .data2  0
+        */
+#ifdef DUK
+       iscomm = s & S_COM;
+#endif DUK
+       s &= ~S_COM;
+       if ((n & RELPC) == 0 && s == S_ABS)
+               return;
+       if ((n & RELPC) != 0 && s == DOTTYP)
+               return;
+       if (pass != PASS_3) {
+               outhead.oh_nrelo++;
+               return;
+       }
+       s &= ~S_VAR;
+       outrelo.or_type = (char)n;
+       outrelo.or_sect = (char)DOTTYP;
+#ifndef ASLD
+#ifdef DUK
+       if (s == S_UND || iscomm) {
+#else DUK
+       if (s == S_UND) {
+#endif DUK
+               assert(relonami != 0);
+               outrelo.or_nami = relonami-1;
+               relonami = 0;
+       } else
+#endif
+       if (s < S_MIN) {
+               assert(s == S_ABS);
+               /*
+                * use first non existing entry (argh)
+                */
+               outrelo.or_nami = outhead.oh_nname;
+       } else {
+               /*
+                * section symbols are at the end
+                */
+               outrelo.or_nami = outhead.oh_nname
+                               - outhead.oh_nsect
+                               + (s - S_MIN)
+                               ;
+       }
+       outrelo.or_addr = (long)DOTVAL;
+       putofmt((char *)&outrelo, SF_RELO, PARTRELO);
+}
+#endif
+
+newsymb(name, type, desc, valu)
+register char *name;
+short type;
+short desc;
+valu_t valu;
+{
+       struct outname outname;
+
+       if (name && *name == 0)
+               name = 0;
+       assert(PASS_SYMB);
+       if (pass != PASS_3) {
+               if (name)
+                       outhead.oh_nchar += strlen(name)+1;
+               outhead.oh_nname++;
+               return;
+       }
+       if (name) {
+               AOUTPART(PARTCHAR);
+               outname.on_foff = outhead.oh_nchar;
+               do {
+                       AOUTPUTC(*name, PARTCHAR);
+                       outhead.oh_nchar++;
+               } while (*name++);
+       } else
+               outname.on_foff = 0;
+       outname.on_type = type;
+       outname.on_desc = desc;
+       outname.on_valu = valu & ~((0xFFFFFFFF)<<(8*sizeof(valu_t)));
+       putofmt((char *)&outname, SF_NAME, PARTNAME);
+}
diff --git a/mach/proto/as/comm7.c b/mach/proto/as/comm7.c
new file mode 100644 (file)
index 0000000..38612b7
--- /dev/null
@@ -0,0 +1,430 @@
+/* @(#)comm7.c 1.10 */
+/*
+ * miscellaneous
+ */
+
+#include       "comm0.h"
+#include       "comm1.h"
+#include       "y.tab.h"
+
+valu_t
+load(ip)
+register item_t *ip;
+{
+#ifdef ASLD
+       register short typ;
+
+       typ = ip->i_type & S_TYP;
+       if ((typ -= S_MIN) < 0)         /* S_UND or S_ABS */
+               return(ip->i_valu);
+       return(ip->i_valu + sect[typ].s_base);
+#else
+#ifdef DUK
+       if ((ip->i_type & S_TYP) == S_UND || (ip->i_type & S_COM)) {
+#else DUK
+       if ((ip->i_type & S_TYP) == S_UND) {
+#endif DUK
+               if (pass == PASS_3) {
+                       if (relonami != 0)
+                               serror("relocation error");
+                       relonami = ip->i_valu+1;
+               }
+               return(0);
+       }
+       return(ip->i_valu);
+#endif
+}
+
+store(ip, val)
+register item_t *ip;
+valu_t val;
+{
+#ifdef ASLD
+       register short typ;
+
+       typ = ip->i_type & S_TYP;
+       if ((typ -= S_MIN) >= 0)
+               val -= sect[typ].s_base;
+#else
+       if ((ip->i_type & S_TYP) == S_UND)
+               return(0);
+#endif
+       assert(pass != PASS_3 || (ip->i_type & S_VAR) || ip->i_valu == val);
+       ip->i_valu = val;
+       return(1);
+}
+
+char *
+remember(s)
+register char *s;
+{
+       register char *p;
+       register n;
+       static nleft = 0;
+       static char *next;
+
+       p = s;
+       n = 0;
+       do
+               n++;
+       while (*p++);
+       if ((nleft -= n) < 0) {
+               next = sbrk(MEMINCR);
+               if ((int) next == -1)
+                       fatal("out of memory");
+               nleft = (MEMINCR / sizeof(char)) - n;
+               assert(nleft >= 0);
+       }
+       p = next;
+       while (*p++ = *s++)
+               ;
+       s = next;
+       next = p;
+       return(s);
+}
+
+combine(typ1, typ2, op)
+register typ1, typ2;
+{
+       switch (op) {
+       case '+':
+               if (typ1 == S_ABS)
+                       return(typ2);
+               if (typ2 == S_ABS)
+                       return(typ1);
+               break;
+       case '-':
+               if (typ2 == S_ABS)
+                       return(typ1);
+               if ((typ1 & ~S_DOT) == (typ2 & ~S_DOT) && typ1 != S_UND)
+                       return(S_ABS|S_VAR);
+               break;
+       case '>':
+               if (typ1 == S_ABS && typ2 == S_ABS)
+                       return(S_ABS);
+               if (
+                   ((typ1 & ~S_DOT) == (typ2 & ~S_DOT) && typ1 != S_UND)
+                   || (typ1 == S_ABS)
+                   || (typ2 == S_ABS)
+                  )
+                       return(S_ABS|S_VAR);
+               break;
+       default:
+               if (typ1 == S_ABS && typ2 == S_ABS)
+                       return(S_ABS);
+               break;
+       }
+       if (pass != PASS_1)
+               serror("illegal operator");
+       return(S_UND);
+}
+
+#ifdef LISTING
+printx(ndig, val)
+valu_t val;
+{
+       static char buf[8];
+       register char *p;
+       register c, n;
+
+       p = buf; n = ndig;
+       do {
+               *p++ = (int) val & 017;
+               val >>= 4;
+       } while (--n);
+       do {
+               c = "0123456789ABCDEF"[*--p];
+               putchar(c);
+       } while (p > buf);
+       return(ndig);
+}
+#endif
+
+#ifdef LISTING
+listline(textline)
+{
+       register c;
+
+       if ((listflag & 4) && (c = getc(listfile)) != '\n' && textline) {
+               if (listcolm >= 24)
+                       printf(" \\\n\t\t\t");
+               else
+                       do {
+                               putchar('\t');
+                               listcolm += 8;
+                       } while (listcolm < 24);
+               do {
+                       assert(c != EOF);
+                       putchar(c);
+               } while ((c = getc(listfile)) != '\n');
+       }
+       if (listflag & 7)
+               putchar('\n');
+       listeoln = 1;
+       listcolm = 0;
+       listflag = listtemp;
+}
+#endif LISTING
+
+/* ---------- code optimization ---------- */
+
+#ifdef THREE_PASS
+small(fitsmall, gain)
+{
+       register bit;
+       register char *p;
+
+       if (DOTSCT == NULL)
+               nosect();
+       if (bflag)
+               return(0);
+       if ((bit = nbits++) >= BITMAX) {
+               if (bit != BITMAX)
+                       nbits--;        /* prevent wraparound */
+               else if (pass == PASS_1)
+                       warning("bit table overflow");
+               return(0);
+       }
+       p = &bittab[bit>>3];
+       bit = 1 << (bit&7);
+       switch (pass) {
+       case PASS_1:
+               return(0);
+       case PASS_2:
+               if (fitsmall) {
+                       DOTGAIN += gain;
+                       *p |= bit;
+               }
+               return(fitsmall);
+       case PASS_3:
+               assert(fitsmall || (*p & bit) == 0);
+               return(*p & bit);
+       }
+}
+#endif
+
+/* ---------- output ---------- */
+
+emit1(arg)
+char arg;
+{
+#ifdef LISTING
+       if (listeoln) {
+               if (listflag & 1) {
+                       listcolm += printx(VALWIDTH, DOTVAL);
+                       listcolm++;
+                       putchar(' ');
+               }
+               listeoln = 0;
+       }
+       if (listflag & 2)
+               listcolm += printx(2, (valu_t) arg);
+#endif
+       switch (pass) {
+       case PASS_1:
+               if (DOTSCT == NULL)
+                       nosect();
+               /* no break */
+       case PASS_2:
+               DOTSCT->s_zero = 0;
+               break;
+       case PASS_3:
+               AOUTPART(PARTEMIT);
+               while (DOTSCT->s_zero) {
+                       AOUTPUTC(0, PARTEMIT);
+                       DOTSCT->s_zero--;
+               }
+               AOUTPUTC(arg, PARTEMIT);
+               break;
+       }
+       DOTVAL++;
+}
+
+emit2(arg)
+short arg;
+{
+#ifdef BYTES_REVERSED
+       emit1((char)(arg>>8)); emit1((char)arg);
+#else
+       emit1((char)arg); emit1((char)(arg>>8));
+#endif
+}
+
+emit4(arg)
+long arg;
+{
+#ifdef WORDS_REVERSED
+       emit2((short)(arg>>16)); emit2((short)(arg));
+#else
+       emit2((short)(arg)); emit2((short)(arg>>16));
+#endif
+}
+
+emitx(val, n)
+valu_t val;
+register n;
+{
+       switch (n) {
+       case 1:
+               emit1((char)val); break;
+       case 2:
+               emit2((short)val); break;
+       case 4:
+               emit4((long)val); break;
+       default:
+               assert(0);
+       }
+}
+
+emitstr(zero)
+{
+       register i;
+       register char *p;
+
+       p = stringbuf;
+       i = *p++ & 0377;
+       while (--i >= 0)
+               emit1(*p++);
+       if (zero)
+               emit1(0);
+}
+
+/* ---------- Error checked file I/O  ---------- */
+
+ffreopen(s, f)
+char *s;
+FILE *f;
+{
+       if (freopen(s, "r", f) == NULL)
+               fatal("can't reopen %s", s);
+}
+
+FILE *
+ffcreat(s)
+char *s;
+{
+       FILE *f;
+
+       if ((f = fopen(s, "w")) == NULL)
+               fatal("can't create %s", s);
+       return(f);
+}
+
+FILE *
+fftemp(path, tail)
+char *path;
+{
+       register char *dir;
+
+       if ((dir = getenv("TMPDIR")) == NULL)
+#ifdef TMPDIR
+               dir = TMPDIR;
+#else
+               dir = "/tmp";
+#endif
+       sprintf(path, "%s/%s", dir, tail);
+       return(ffcreat(mktemp(path)));
+}
+
+putofmt(p, s, part)
+register char  *p;
+register char  *s;
+{
+       register i;
+       register long l;
+
+       AOUTPART(part);
+       while (i = *s++) {
+               switch (i -= '0') {
+/*             case 0: p++; break; */
+               case 1:
+                       l = (long) *((char  *)p); p += sizeof(char );
+                       break;
+               case 2:
+                       l = (long) *((short *)p); p += sizeof(short);
+                       break;
+               case 4:
+                       l = (long) *((long  *)p); p += sizeof(long );
+                       break;
+               default:
+                       assert(0);
+               }
+               while (--i >= 0) {
+                       AOUTPUTC((int)l, part);
+                       l >>= 8;
+               }
+       }
+}
+
+/* ---------- Error handling ---------- */
+
+yyerror(){}            /* we will do our own error printing */
+
+nosect()
+{
+       fatal("no sections");
+}
+
+werror()
+{
+       fatal("write error");
+}
+
+/* VARARGS1 */
+fatal(s, a1, a2, a3, a4)
+char *s;
+{
+       nerrors++;
+       diag(" (fatal)\n", s, a1, a2, a3, a4);
+       stop();
+}
+
+#if DEBUG == 2
+assert2(file, line)
+char *file;
+{
+       fatal("assertion failed (%s, %d)", file, line);
+}
+#endif
+
+#if DEBUG == 1
+assert1()
+{
+       diag(" (fatal)\n", "assertion failed");
+       abort();
+}
+#endif
+
+/* VARARGS1 */
+serror(s, a1, a2, a3, a4)
+char *s;
+{
+       nerrors++;
+       diag("\n", s, a1, a2, a3, a4);
+}
+
+/* VARARGS1 */
+warning(s, a1, a2, a3, a4)
+char *s;
+{
+       diag(" (warning)\n", s, a1, a2, a3, a4);
+}
+
+/* VARARGS1 */
+diag(tail, s, a1, a2, a3, a4)
+char *tail, *s;
+{
+       fflush(stdout);
+       if (modulename)
+               fprintf(stderr, "\"%s\", line %d: ", modulename, lineno);
+       else
+               fprintf(stderr, "%s: ", progname);
+       fprintf(stderr, s, a1, a2, a3, a4);
+       fprintf(stderr, tail);
+}
+
+nofit()
+{
+       if (pass == PASS_3)
+               warning("too big");
+}
diff --git a/mach/proto/as/comm8.c b/mach/proto/as/comm8.c
new file mode 100644 (file)
index 0000000..9575a9c
--- /dev/null
@@ -0,0 +1,9 @@
+/* @(#)comm8.c 1.1 */
+
+#include       "comm0.h"
+#include       "comm1.h"
+#include       "y.tab.h"
+
+/* ========== Machine dependent C routines ========== */
+
+#include       "mach5.c"
diff --git a/mach/s2650/as/Makefile b/mach/s2650/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/vax4/as/Makefile b/mach/vax4/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/z80/as/Makefile b/mach/z80/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c
diff --git a/mach/z8000/as/Makefile b/mach/z8000/as/Makefile
new file mode 100644 (file)
index 0000000..012b038
--- /dev/null
@@ -0,0 +1,53 @@
+# $Header$
+EM     = ../../..
+h      = $(EM)/h
+CDIR   = $(EM)/mach/proto/nas
+CPP    = $(EM)/lib/cpp
+DEF    =
+
+FFLAG  =
+CFLAGS = $(FFLAG) -O -I$h $(DEF)
+YFLAGS = -d
+LDFLAGS        = $(FFLAG) -i
+
+CSRC   = $(CDIR)/comm3.c $(CDIR)/comm4.c $(CDIR)/comm5.c \
+         $(CDIR)/comm6.c $(CDIR)/comm7.c $(CDIR)/comm8.c
+COBJ   = $(CDIR)/comm3.o $(CDIR)/comm4.o $(CDIR)/comm5.o \
+         $(CDIR)/comm6.o $(CDIR)/comm7.o $(CDIR)/comm8.o
+MACH   = mach0.c mach1.c mach2.c mach3.c mach4.c mach5.c
+COMM   = $(CDIR)/comm0.h $(CDIR)/comm1.h $(CDIR)/comm2.y $(CSRC)
+
+all:   as
+
+install:all
+       ../../install as
+
+cmp:
+       -../../compare as
+
+clean:
+       rm -f *.o as as.[cy] y.tab.h
+
+pr:    $(MACH)
+       @pr -n $(MACH)
+
+opr:
+       make pr | opr
+as:    $(COBJ) as.o
+       $(CC) $(LDFLAGS) $(COBJ) as.o -o as
+
+as.y:  $(CDIR)/comm2.y
+       $(CPP) -P -I$h $(DEF) $(CDIR)/comm2.y >as.y
+       @echo "expect 1 shift/reduce conflict"
+
+lint:   $(CSRC) as.c
+       lint $(CSRC) as.c
+
+y.tab.h:       as.c
+$(COBJ):       y.tab.h
+$(COBJ) as.y:  $(CDIR)/comm0.h mach0.c
+$(COBJ) as.y:  $(CDIR)/comm1.h mach1.c
+as.y:          mach2.c
+comm3.o:       mach3.c
+as.y:          mach4.c
+comm8.o:       mach5.c