ack/mach/pdp/int/eminform.s
1985-01-07 14:26:46 +00:00

635 lines
12 KiB
ArmAsm
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/
/ (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