/ 
/  (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
/ 
/           This product is part of the Amsterdam Compiler Kit.
/ 
/  Permission to use, sell, duplicate or disclose this software must be
/  obtained in writing. Requests for such permissions may be sent to
/ 
/       Dr. Andrew S. Tanenbaum
/       Wiskundig Seminarium
/       Vrije Universiteit
/       Postbox 7161
/       1007 MC Amsterdam
/       The Netherlands
/ 
/  
/------------------------------------------------------------------------------
/
	indir	= 0
	exit	= 1
	fork	= 2
	read	= 3
	write	= 4
	open	= 5
	close	= 6
	creat	= 8.
	unlink	= 10.
	break	= 17.
	alarm	= 27.
	pause	= 29.
	sleep	= 35.
	signal	= 48.

	iot	=	4
/------------------------------------------------------------------------------
/	External references
/------------------------------------------------------------------------------

	.globl	_end

/
/------------------------------------------------------------------------------
/	Now the	real program starts
/------------------------------------------------------------------------------

startoff:
	mov	sp,memlim
	mov	$ldfail,r5
	mov	$emfile,forward+2
	sys	indir;forward
	jes	badruninf;
	mov	r0,saver0;
	mov	$rhfail,r5;
	sys	read;header;34.
	jes	badruninf;
	cmp	$34.,r0
	jne	badruninf
	mov	$rtfail,r5
	mov	$_end,loadstart
	mov	option,r1
	bit	$17774,r1
	bne	1f
	mov	tblmax,globmax
1:
	bit	$1,r1
	beq	1f
	mov	saver0,r0
	sys	read;lasttab;98.
	jes	badruninf;

1:	bit	$2,r1
	beq	1f
	mov	saver0,r0
	sys	read;opfrb;512.
	jes	badruninf
	mov	saver0,r0
	sys	read;opfra;512.
	jes	badruninf
	mov	saver0,r0
	sys	read;opfrc;640.
	jes	badruninf
1:	bit	$4,r1
	beq	1f
	mov	saver0,r0
	sys	read;lcount;4
	jes	badruninf
1:	bit	$8.,r1
	beq	1f
	mov	saver0,r0
	sys	read;lflow;4
	jes	badruninf
1:	bit	$16.,r1
	beq	1f
	mov	saver0,r0
	sys	read;ltime;4
	jes	badruninf
1:
	mov	tblmax,r3
	sub	pd,r3
	sub	ml,r3
	mov	$_end,sybreak+2
	add	r3,sybreak+2;
	sys	indir;sybreak
	mov	r3,lblread+4
	mov	$_end,lblread+2;
	mov	saver0,r0
	sys	indir;lblread;
	jes	badruninf
	mov	saver0,r0
	sys	close
	sys	unlink;emfile
lbladj:
	add	$header,linused
	sub	header,linused

	mov	pd,filext
	sub	loadstart,filext
	mov	filext,filarg
	add	ml,filarg
	sub	tblmax,filarg
lbllast:
	bit	$1,option	/test for last
	beq	2f		/ no last table	jump
	sys	creat;emlast;666
	bcs	2f
	cmp	linused,$lasttab
	bhis	3f
	mov	$yetmsg,lblwri+2
	mov	$40.,lblwri+4
	sys	indir;lblwri
	br	2f
3:	mov	r0,saver0
	cmp	linused-2,$-1
	bne	6f
	mov	$linused-2,linused
	clr	linused-2
6:	jsr	pc,slilast
	inc	r2
	jsr	pc,nexttab
	tst	(r5)
	beq	3f
	sub	$2,linused
	cmp	eb,(r5)
	blo	3f
7:	cmp	r2,$lnend
	blt	1f
	jsr	pc,slnlast
1:	jsr	pc,lnrnxt
	bne	7b
3:	jsr	pc,sfllast
	bne	6b
	mov	saver0,r0
	sys	close
2:

lblopfreq:
	bit	$2,option
	beq	9f
	sys	creat;emopf;666
	bcs	9f
	mov	r0,saver0
	mov	$opcode,r3
	mov	$104.,r4
	mov	$counttab,r5
0:	mov	$lnlast,r2
	mov	$8.,r0
2:	movb	(r3)+,(r2)+
	sob	r0,2b
	add	$8,r2
	mov	r2,-(sp)
	jsr	pc,ltoa
	mov	(sp)+,r2
	add	$5,r2
	mov	$8.,r0
2:	movb	(r3)+,(r2)+
	sob	r0,2b
	add	$8,r2
	mov	r2,-(sp)
	jsr	pc,ltoa
	mov	(sp)+,r2
	add	$5,r2
	mov	$8.,r0
2:	movb	(r3)+,(r2)+
	sob	r0,2b
	add	$8,r2
	mov	r2,-(sp)
	jsr	pc,ltoa
	mov	(sp)+,r2
	add	$5,r2
	mov	$8.,r0
2:	movb	(r3)+,(r2)+
	sob	r0,2b
	add	$8,r2
	mov	r2,-(sp)
	jsr	pc,ltoa
	mov	(sp)+,r2
	mov	r3,-(sp)
	jsr	pc,slnlast
	mov	(sp)+,r3
	sob	r4,0b
	mov	saver0,r0
	sys	close
9:
lblcount:
	clr	filb
	bit	$4,option
	beq	9f
	sys	creat;emcount;666
	bcs	9f
	mov	r0,saver0
	mov	lcount,r5
	add	$4,r5
	sub	filext,r5
	jsr	pc,procrun
	mov	saver0,r0
	sys	close
9:
lblprof:
	bit	$16.,option
	beq	9f
	sys	creat;emprof;666
	bcs	9f
	mov	r0,saver0
	mov	ltime,r5
	sub	filext,r5
	mov	$profmsg,lblwri+2
	mov	$29,lblwri+4
	mov	$profmsg+27,r2
	jsr	pc,ltoa
	mov	saver0,r0
	sys	indir;lblwri
	jsr	pc,procrun
	mov	saver0,r0
	sys	close
9:
lblflow:
	mov	$1,filb
	bit	$8.,option
	beq	9f
	sys	creat;emflow;666
	bcs	9f
	mov	lflow,r5
	mov	$-1,flowsiz
	sub	filext,r5
	jsr	pc,procrun
	mov	saver0,r0
	sys	close
9:
	clr	r0
	sys	exit

badruninf:
	mov	$0f,lblwri+2
	mov	$21.,lblwri+4
	mov	$2,r0
	sys	indir;lblwri
	mov	r5,lblwri+2
	mov	$23.,lblwri+4
	mov	$2,r0
	sys	indir;lblwri
	iot			/force core dump
.data
lblwri:
        sys     write;0;0
forward:
        sys     open;0;0
sybreak:
        sys     break;0;
lblread:
        sys     read;0;0
0:      <em_runinf load error,\0>
ldfail: < open runinf failed   \n\0>
rhfail: < read header failed   \n\0>
rtfail: < read tables failed   \n\0>
msgto:  <to>
emlast: <em_last\0>
emcount:<em_count\0>
emfile: <em_runinf\0>
emopf:  <em_opfreq\0>
emprof: <em_profile\0>
emflow: <em_flow\0>
yetmsg: <no line or file message processed yet \n\n\0>
unknown:<with unknown filename\0>
lilast: <\nlines               \0>
lnlast: <                              >
        <                              >
lnend:  <                                  \0>
fllast: <    of file                       >
        <                                  \0>
profmsg:<\ninitialization             \n\0>
sep:    <\n\0>
/----------------------------------------------------------------------------
opcode:
<loc.0   loc.1   loc.2   loc.3   loc.4   loc.5   loc.6   loc.7   >
<loc.8   loc.9   loc.10  loc.11  loc.12  loc.13  loc.14  loc.15  >
<loc.16  loc.17  loc.18  loc.19  loc.20  loc.21  loc.22  loc.23  >
<loc.24  loc.25  loc.26  loc.27  loc.28  loc.29  loc.30  loc.31  >
<loc.32  loc.33  aar.1W  adf.s0  adi.1W  adi.2W  adp.l   adp.1   >
<adp.2   adp.s0  adp.s_1 ads.1W  and.1W  asp.1W  asp.2W  asp.3W  >
<asp.4W  asp.5W  asp.w0  beq.l   beq.s0  bge.s0  bgt.s0  ble.s0  >
<blm.s0  blt.s0  bne.s0  bra.l   bra.s_1 bra.s_2 bra.s0  bra.s1  >
<cal.1   cal.2   cal.3   cal.4   cal.5   cal.6   cal.7   cal.8   >
<cal.9   cal.10  cal.11  cal.12  cal.13  cal.14  cal.15  cal.16  >
<cal.17  cal.18  cal.19  cal.20  cal.21  cal.22  cal.23  cal.24  >
<cal.25  cal.26  cal.27  cal.28  cal.s0  cff.z   cif.z   cii.z   >
<cmf.s0  cmi.1W  cmi.2W  cmp.z   cms.s0  csa.1W  csb.1W  dec.z   >
<dee.w0  del.w_1 dup.1W  dvf.s0  dvi.1W  fil.l   inc.z   ine.lw  >
<ine.w0  inl._1W inl._2W inl._3W inl.w_1 inn.s0  ior.1W  ior.s0  >
<lae.l   lae.w0  lae.w1  lae.w2  lae.w3  lae.w4  lae.w5  lae.w6  >

<lal.p   lal.n   lal.0   lal._1  lal.w0  lal.w_1 lal.w_2 lar.1W  >
<ldc.0   lde.lw  lde.w0  ldl.0   ldl.w_1 lfr.1W  lfr.2W  lfr.s0  >
<lil.w_1 lil.w0  lil.0   lil.1W  lin.l   lin.s0  lni.z   loc.l   >
<loc._1  loc.s0  loc.s_1 loe.lw  loe.w0  loe.w1  loe.w2  loe.w3  >
<loe.w4  lof.l   lof.1W  lof.2W  lof.3W  lof.4W  lof.s0  loi.l   >
<loi.1   loi.1W  loi.2W  loi.3W  loi.4W  loi.s0  lol.pw  lol.nw  >
<lol.0   lol.1W  lol.2W  lol.3W  lol._1W lol._2W lol._3W lol._4W >
<lol._5W lol._6W lol._7W lol._8W lol.w0  lol.w_1 lxa.1   lxl.1   >
<lxl.2   mlf.s0  mli.1W  mli.2W  rck.1W  ret.0   ret.1W  ret.s0  >
<rmi.1W  sar.1W  sbf.s0  sbi.1W  sbi.2W  sdl.w_1 set.s0  sil.w_1 >
<sil.w0  sli.1W  ste.lw  ste.w0  ste.w1  ste.w2  stf.l   stf.1W  >
<stf.2W  stf.s0  sti.1   sti.1W  sti.2W  sti.3W  sti.4W  sti.s0  >
<stl.pw  stl.nw  stl.0   stl.1W  stl._1W stl._2W stl._3W stl._4W >
<stl._5W stl.w_1 teq.z   tgt.z   tlt.z   tne.z   zeq.l   zeq.s0  >
<zeq.s1  zer.s0  zge.s0  zgt.s0  zle.s0  zlt.s0  zne.s0  zne.s_1 >
<zre.lw  zre.w0  zrl._1W zrl._2W zrl.w_1 zrl.nw  escape1 escape2 >

<aar.l   aar.z   adf.l   adf.z   adi.l   adi.z   ads.l   ads.z   >
<adu.l   adu.z   and.l   and.z   asp.lw  ass.l   ass.z   bge.l   >
<bgt.l   ble.l   blm.l   bls.l   bls.z   blt.l   bne.l   cai.z   >
<cal.l   cfi.z   cfu.z   ciu.z   cmf.l   cmf.z   cmi.l   cmi.z   >
<cms.l   cms.z   cmu.l   cmu.z   com.l   com.z   csa.l   csa.z   >
<csb.l   csb.z   cuf.z   cui.z   cuu.z   dee.lw  del.pw  del.nw  >
<dup.l   dus.l   dus.z   dvf.l   dvf.z   dvi.l   dvi.z   dvu.l   >
<dvu.z   fef.l   fef.z   fif.l   fif.z   inl.pw  inl.nw  inn.l   >
<inn.z   ior.l   ior.z   lar.l   lar.z   ldc.l   ldf.l   ldl.pw  >
<ldl.nw  lfr.l   lil.pw  lil.nw  lim.z   los.l   los.z   lor.s0  >
<lpi.l   lxa.l   lxl.l   mlf.l   mlf.z   mli.l   mli.z   mlu.l   >
<mlu.z   mon.z   ngf.l   ngf.z   ngi.l   ngi.z   nop.z   rck.l   >
<rck.z   ret.l   rmi.l   rmi.z   rmu.l   rmu.z   rol.l   rol.z   >
<ror.l   ror.z   rtt.z   sar.l   sar.z   sbf.l   sbf.z   sbi.l   >
<sbi.z   sbs.l   sbs.z   sbu.l   sbu.z   sde.l   sdf.l   sdl.pw  >
<sdl.nw  set.l   set.z   sig.z   sil.pw  sil.nw  sim.z   sli.l   >

<sli.z   slu.l   slu.z   sri.l   sri.z   sru.l   sru.z   sti.l   >
<sts.l   sts.z   str.s0  tge.z   tle.z   trp.z   xor.l   xor.z   >
<zer.l   zer.z   zge.l   zgt.l   zle.l   zlt.l   zne.l   zrf.l   >
<zrf.z   zrl.pw  dch.z   exg.s0  exg.l   exg.z   lpb.z   gto.l   \0\0>
	.even
	.text
/------------------------------------------------------------------------------
/	General	subroutines
/------------------------------------------------------------------------------

wrdoff:	movb	(r3)+,r0       /get first byte
	swab	r0		/put it	in high	byte
	clrb	r0		/clear low byte	of r0
	bisb	(r3)+,r0       /"or" second byte in
	rts	pc		/done

/------------------------------------------------------------------------------


nexttab: mov	linused,r5;
	add	$2,r5		/ increment lasttab
	cmp	r5,$linused	/ top of table reached?
	blo	1f
	sub	$96.,r5
1:	mov	r5,linused
	rts	pc

slilast: mov	$lnlast,r2
	mov	$6,r0
	mov	$lilast,r3
2:	movb	(r3)+,(r2)+
	sob	r0,2b
	rts	pc

slnlast: mov	$lnlast,lblwri+2
	mov	r2,r3
	sub	$lnlast,r3
	beq	3f
	inc	r3
	movb	sep,(r2)
1:	mov	r3,lblwri+4
	mov	saver0,r0
	sys	indir; lblwri
	mov	$lnlast,r2
2:	movb	$' ,(r2)+
	sob	r3,2b
3:	mov	$lnlast,r2
	rts	pc

lnrnxt:	jsr	pc,nexttab
	tst	(r5)
	ble	0f
	mov	(r5),r1
	clr	(r5)
	add	$6,r2
	mov	r2,r0
	jsr	pc,itoa
0:	rts	pc

sfllast:jsr	pc,nexttab
	tst	(r5)
	bne	0f
	clr	linused
	mov	eb,-(sp)
	sub	filext,(sp)
	add	$4,(sp)
	mov	*(sp),(sp)
	mov	(sp)+,(r5)
0:	jsr	pc,slnlast
	jsr	pc,filadj
	mov	$14.,r3
	mov	$fllast+14.,r2
	mov	(r5),r0
3:	inc	r3
	movb	(r0)+,(r2)+
	bne	3b
	movb	sep,-(r2)
	mov	$fllast,lblwri+2
	mov	r3,lblwri+4
	mov	saver0,r0
	sys	indir;lblwri
	mov	$fllast+14.,r2
	sub	$10.,r3
2:	movb	$' ,(r2)+
	sob	r3,2b
	clr	(r5)
	tst	linused
	beq	2f
	jsr	pc,slilast
2:	rts	pc

filadj:
	cmp	ml,(r5)
	bhi	8f
	sub	filarg,(r5)
	br	7f
8:	cmp	eb,(r5)
	bhi	7f
	sub	filext,(r5)
7:	rts	pc

procrun:
	mov	firstp,r4
	sub	filext,r4
0:
	tst	4(r4)
	beq	8f
	jsr	pc,msgfile
	mov	r4,-(sp)
	mov	countsiz,r4
7:	cmp	r2,$lnend+10
	blo	6f
	jsr	pc,slnlast
	mov	$lnlast,r2
6:	tst	filb
	bne	3f
	add	$11.,r2
	mov	r2,-(sp)
	jsr	pc,ltoa
	mov	(sp)+,r2
	br	4f
3:
	jsr	pc,bittoa
	add	$4,r2
4:	sob	r4,7b
	jsr	pc,slnlast
	mov	(sp)+,r4
8:	mov	8.(r4),r4
	beq	8f
	sub	filext,r4
	br	0b
	mov	r0,saver0
	sys	write;sep;1
8:	rts	pc


msgfile:
	jsr	pc,slilast
	add	$6,r2
	mov	6(r4),r1
	mov	r2,r0
	jsr	pc,itoa
	add	$4,r2
	movb	 msgto,(r2)+
	movb	msgto+1,(r2)+
	add	$6,r2
	mov	8.(r4),r1
3:	bne	1f
	mov	maxcount,r1
	br	2f
1:	sub	filext,r1
	tst	4(r1)
	beq	1f
	mov	4(r1),r1
	br	2f
1:	mov	8.(r1),r1
	br	3b
2:	sub	4(r4),r1
	mov	r1,countsiz
	dec	r1		/ is this a bug?
	add	6(r4),r1
	mov	r2,r0
	jsr	pc,itoa
	mov	$fllast,r3
	mov	$14,r1
2:	movb	(r3)+,(r2)+
	sob	r1,2b
	mov	10.(r4),r3
	bne	6f
	mov	$unknown,r3
	br	5f
6:	cmp	ml,r3
	bhi	4f
	sub	filarg,r3
	br	5f
4:	cmp	eb,r3
	bhi	5f
	sub	filext,r3
5:
lblmsgf:
2:	movb	(r3)+,(r2)+
	bne	2b
	jsr	pc,slnlast
	rts	pc

itoa:

	mov	r5,-(sp)
	mov	r0,r5
1:	clr	r0
	div	$10.,r0
	add	$'0,r1
	movb	r1,-(r5)
	mov	r0,r1
	bne	1b
	mov	r5,r0
	mov	(sp)+,r5
	rts	pc

	rts	pc
ltoa:
0:	mov	(r5),r1
	clr	r0
	div	$10.,r0
	mov	r0,(r5)
	swab	r1
	clr	r0
	bisb	3(r5),r1
	div	$10.,r0
	movb	r0,3(r5)
	clr	r0
	swab	r1
	bisb	2(r5),r1
	div	$10.,r0
	add	$'0,r1
	movb	r1,-(r2)
	movb	r0,2(r5)
	bne	0b
	tst	(r5)
	bne	0b
	add	$4,r5
	rts	pc

bittoa:
	mov	(r5),r1
	mov	flowsiz,r0
	ash	r0,r1
	bit	$1,r1
	beq	0f
	movb	$'1,(r2)
	br	1f
0:	movb	$'0,(r2)
1:	dec	r0
	cmp	$-16.,r0
	beq	2f
	mov	r0,flowsiz
	br	3f
2:	clr	flowsiz
	add	$2,r5
3:	rts	pc

/------------------------------------------------------------------------------
/	Leftover data
/------------------------------------------------------------------------------




	.bss
filb:	.=.+2
loadstart:	.=.+2
saver0:		.=.+2
filarg:		.=.+2
filext:		.=.+2
memlim:		.=.+2
header:
bstrt:	txtsiz:	.=.+2
bend:	ndatad:	.=.+2
	nprocs:	.=.+2
option:	entry.:	.=.+2
	nlines:	.=.+2
	szdata:	.=.+2
	firstp:	.=.+2
	maxcount: .=.+2
argc:	.=.+2
argv:	.=.+2
environ:
	.=.+2
pb:	.=.+2
pd:	.=.+2
eb:	.=.+2
globmax: .=.+2
tblmax:	.=.+2
ml:	.=.+2
lasttab:.=.+96.	       / 16 descriptors	of integers + index at the end
linused:.=.+2

counttab:
opfra:	.=.+512.
opfrb:	.=.+512.
opfrc:	.=.+640.

lcount:	.=.+2
countsiz:.=.+2

lflow:	.=.+2
flowsiz:.=.+2

ltime:	.=.+2
profsiz:.=.+2