--- /dev/null
+tail_em.a
+dup.s
+aar.s
+lar.s
+sar.s
+los.s
+rck.s
+csb.s
+csa.s
+exg.s
+sts.s
+gto.s
+cii.s
+cms.s
+mon.s
+cmu.s
+dvu.s
+rmu.s
+cff.s
+cfi.s
+cif.s
+trp.s
+print.s
+prstr.s
+prnl.s
+putchar.s
--- /dev/null
+# $Header$
+install:
+ arch t tail_em.a > LIST
+ ../../install tail_em.a tail_em
+ ../../install end.s tail_em.vend
+
+cmp:
+ -../../compare tail_em.a tail_em
+ -../../compare end.s end_em
+
+clean :
+
+opr :
+ make pr | opr
+
+pr:
+ @arch pv tail_em.a | pr -h `pwd`/tail_em.a
+ @pr `pwd`/end.s
--- /dev/null
+.define .aar
+
+ .text
+
+.aar:
+ movd 8(sp), r7
+ subd 0(4(sp)), r7
+ muld 8(4(sp)), r7
+ addd r7, 12(sp)
+ ret 8
--- /dev/null
+.define .cff
+
+ .text
+
+.cff : cmpd 4(sp), 8(sp)
+ beq 1f
+ cmpd 4, 4(sp)
+ beq 4f
+ cmpd 8, 4(sp)
+ beq 8f
+1:
+ ret 8
+4:
+ movlf 12(sp),16(sp)
+ ret 12
+8:
+ movfl 12(sp), 8(sp)
+ ret 4
--- /dev/null
+.define .cfi
+
+ .text
+
+.cfi: cmpd 4, 8(sp)
+ beq 4f
+ cmpd 8, 8(sp)
+ beq 8f
+ ret 8
+4:
+ roundfd 12(sp),12(sp)
+ ret 8
+8:
+ roundld 12(sp), 16(sp)
+ ret 12
--- /dev/null
+.define .cif
+
+ .text
+
+.cif : cmpd 4, 4(sp)
+ beq 4f
+ cmpd 8, 4(sp)
+ beq 8f
+ ret 8
+4:
+ movdf 12(sp),12(sp)
+ ret 8
+8:
+ movdl 12(sp), 8(sp)
+ ret 4
--- /dev/null
+.define .cii
+
+ .text
+
+!r7 will save return addres
+.cii:
+ movd tos, r7
+ cmpqd 4, tos
+ bne 3f
+ movd tos, r0
+ cmpqd 1, r0
+ beq 1f
+ cmpqd 2, r0
+ beq 2f
+ cmpqd 4, r0
+ beq 4f
+3:
+ movd EILLINS, tos
+ jsr @.trp
+4:
+ movd r7, tos
+ ret 0
+1:
+ movxbd 0(sp), 0(sp)
+ br 4b
+2:
+ movxwd 0(sp), 0(sp)
+ br 4b
--- /dev/null
+.define .cms
+
+ .text
+
+.cms: movd tos, r7 !return addres
+ addr 4(sp), r1
+ movd r1, r2
+ addd 0(sp), r2
+ movd 0(sp), r0
+ muld -2, r0
+ subd 4, r0
+3:
+ cmpd 0(r2), 0(r1)
+ bne 2f
+ addr 4(r1), r1
+ addr 4(r2), r2
+ acbd -4, 0(sp), 3b
+ xord r1, r1
+4:
+ adjspd r0
+ movd r7, tos
+ ret 0
+2:
+ movd 1, r1
+ br 4b
--- /dev/null
+.define .cmu
+
+ .text
+
+.cmu: movd tos, r7 !return addres
+ addr 4(sp), r1
+ movd r1, r2
+ addd 0(sp), r2
+ movd 0(sp), r0
+ muld -2, r0
+ subd 4, r0
+3:
+ cmpd 0(r2), 0(r1)
+ bhi 1f
+ blo 2f
+ addr 4(r1), r1
+ addr 4(r2), r2
+ acbd -4, 0(sp), 3b
+ xord r1, r1
+4:
+ adjspd r0
+ movd r7, tos
+ ret 0
+1:
+ movd 1, r1
+ br 4b
+2:
+ movd -1, r1
+ br 4b
--- /dev/null
+.define .csa
+
+ .text
+
+!r0 contains index
+!r1 contains pointer to csa descriptor
+.csa: movd 4(r1), r2 !get lower bound
+ cmpd r2, r0
+ bgt 1f !index out of range
+ addd 8(r1), r2 !get upper bound
+ cmpd r2, r0
+ blt 1f !index out of range
+ addr 12(r1), r2 !pointer to first pointer
+ subd 4(r1), r0
+ muld 4, r0
+ addd r0,r2 !right pointer
+ cmpqd 0, 0(r2)
+ beq 1f !null pointer
+ movd 0(r2), tos !jump now
+ ret 4
+1: !jump to default pointer
+ cmpqd 0, 0(r1)
+ beq 2f !null pointer
+ movd 0(r1), tos
+ ret 4
+2:
+ movd ECASE, tos
+ jsr @.trp
+ ret 0
--- /dev/null
+.define .csb
+
+ .text
+
+!r0 contains index
+!r1 contains pointer to csb descriptor
+.csb:
+ save[r2,r3]
+ movd 4(r1), r2 !number of entries
+ movd r1, r3
+1:
+ addd 8, r3 !find addres of next index
+ cmpd 0(r3), r0 !compare indices
+ beq 2f
+ acbd -1, r2, 1b
+3: !r1 now contains right pointer
+ cmpqd 0, 0(r1) !test destination addres
+ beq 4f
+ restore[r2,r3]
+ movd 0(r1), tos !jump to destination
+ ret 4
+2:
+ addr 4(r3), r1 !put destination pointer in r1
+ br 3b
+4:
+ movd ECASE, tos
+ jsr @.trp
+ restore[r2,r3]
+ ret 0
--- /dev/null
+.define .dup
+
+ .text
+
+!r2 will save return addres
+.dup:
+ movd tos, r2
+ addr 0(sp), tos
+ movd r0, tos
+ jsr @.los
+ movd r2, tos
+ ret 0
--- /dev/null
+.define .dvu
+
+ .text
+
+.dvu:
+ enter[r1,r2],0
+ movd 1,r2
+ andd 12(fp), r2
+ movd 12(fp), r0
+ lshd -1,r0
+ quod 8(fp), r0
+ lshd 1,r0
+ movd 12(fp), r1
+ lshd -1,r1
+ remd 8(fp), r1
+ lshd 1,r1
+ addd r2, r1
+ quod 8(fp),r1
+ addd r1, r0
+ exit[r1,r2]
+ ret 8
--- /dev/null
+.define endtext,enddata,endbss
+.define _end, _etext, _edata
+
+ .text
+endtext:
+_etext:
+ .align 4
+ .data
+enddata:
+_edata:
+ .align 4
+ .bss
+ .align 4
+endbss:
+_end:
--- /dev/null
+.define .exg
+
+ .text
+
+.exg:
+ save [r2,r3]
+ addr 8(sp), r3
+ movd r3, r2
+ addd r0, r3
+1:
+ movd 0(r2), r1
+ movd 0(r3), 0(r2)
+ movd r1, 0(r3)
+ addr 4(r2), r2
+ addr 4(r3), r3
+ acbd -4, r0, 1b
+ restore[r2,r3]
+ ret 0
--- /dev/null
+.define .gto
+
+ .text
+
+!r0 contains descriptor addres
+.gto:
+ addr 0(sp), r7 !first put future localbase in sp
+ subd 8(r0), r7
+ subd 4, r7
+ adjspd r7 !done
+ movd -4(sp), r1 !save this memory location
+ enter[], 0 !adjust local base
+ movd r1, 0(sp) !restore saved memory location
+ addr 0(sp), r7 !adjust stackpointer now
+ subd 4(r0), r7
+ adjspd r7
+ jump r0 !adjust programcounter
--- /dev/null
+.define .lar
+
+ .text
+
+.lar:
+ movd tos, r2
+ movd 4(sp), r0
+ subd 0(0(sp)), r0
+ muld 8(0(sp)), r0
+ addd r0, 8(sp)
+ movd 8(0(sp)), 4(sp)
+ adjspd -4
+ jsr @.los
+ movd r2, tos
+ ret 0
--- /dev/null
+.define .los
+
+ .text
+
+.los:
+ movd tos, r7
+ movd tos, r0
+ movd tos, r1
+ cmpqd 1, r0
+ beq 1f
+ cmpqd 2, r0
+ beq 2f
+ addd r0, r1
+3:
+ addqd -4, r1
+ movd 0(r1), tos
+ acbd -4, r0, 3b
+4:
+ movd r7, tos
+ ret 0
+1:
+ movzbd 0(r1), tos
+ br 4b
+2:
+ movzwd 0(r1), tos
+ br 4b
--- /dev/null
+.define .mon
+
+ .text
+
+.mon:
+ cmpd 1,4(sp)
+ beq 1f
+ cmpd 3,4(sp)
+ beq 3f
+ cmpd 4,4(sp)
+ beq 4f
+ cmpd 54,4(sp)
+ beq 5f
+
+ movd .add1, tos
+ jsr @.prstr
+ movd 4(sp), tos
+ jsr @.print
+ movd .add2, tos
+ jsr @.prstr
+ ret 4
+
+1: jump @.stop
+
+3: save [r0,r1,r2,r3]
+ movd 3,r0
+ movd 28(sp),r1
+ movd 32(sp),r2
+ movd 0,r3
+ svc
+ movd r2, 32(sp)
+ movd 0,28(sp)
+ restore [r0,r1,r2,r3]
+ ret 8
+
+4: save [r0,r1,r2,r3]
+ movd 4,r0
+ movd 28(sp),r1
+ movd 32(sp),r2
+ movd 0,r3
+ svc
+ movd r2, 32(sp)
+ movd 0,28(sp)
+ restore [r0,r1,r2,r3]
+ ret 8
+
+5: movd 0, 16(sp)
+ ret 12
+
+.data
+.add1: .asciz "monitor call "
+.add2: .asciz " not implemented\n"
+.align
--- /dev/null
+.define .print
+
+ .text
+
+.print:
+ save[r0,r1,r2]
+ movd 16(sp), r0
+ movd 1000000000, r2
+ cmpqd 0, r0
+ ble 4f
+ movb "-", tos
+ jsr @.putchar
+ negd r0, r0
+4:
+! deid r2, r0
+ movd r0, r1
+ divd r2, r1
+ modd r2, r0
+ addb "0", r1
+ movb r1, tos
+ jsr @.putchar
+ divd 10, r2
+ cmpqd 0, r2
+ bne 4b
+ restore[r0,r1,r2]
+ ret 4
--- /dev/null
+.define .prnl
+
+ .text
+
+.prnl: movb "\n", tos
+ jsr @.putchar
+ ret 0
--- /dev/null
+.define .prstr
+
+ .text
+
+!het adres van de af te drukken string staat op de stack.
+.prstr:
+ save [r1]
+ movd 8(sp), r1
+1:
+ cmpqb 0, 0(r1)
+ beq 2f
+ movb 0(r1), tos
+ jsr @.putchar
+ addqd 1, r1
+ br 1b
+2:
+ restore [r1]
+ ret 4
--- /dev/null
+.define .putchar
+
+ .text
+
+.putchar:
+ save [r0, r1, r2, r3]
+ movqd 4, r0
+ addr 20(sp), r1
+ movqd 1, r2
+ xord r3, r3
+ svc
+ restore[r0,r1,r2,r3]
+ ret 1
--- /dev/null
+.define .rck
+
+ .text
+
+.rck:
+ cmpd 0(4(sp)), 8(sp)
+ bgt 1f
+ cmpd 4(4(sp)), 8(sp)
+ bge 2f
+1:
+ movd ERANGE, tos
+ jsr @.trp
+2:
+ ret 4
--- /dev/null
+.define .rmu
+
+ .text
+
+.rmu:
+ enter[r2],0
+ movd 1,r2
+ andd 12(fp),r2
+ movd 12(fp),r0
+ lshd -1,r0
+ remd 8(fp),r0
+ lshd 1,r0
+ addd r2,r0
+ remd 8(fp), r0
+ exit[r2]
+ ret 8
--- /dev/null
+.define .sar
+
+ .text
+
+.sar:
+ movd tos, r2
+ movd 4(sp), r0
+ subd 0(0(sp)), r0
+ muld 8(0(sp)), r0
+ addd r0, 8(sp)
+ movd 8(0(sp)), 4(sp)
+ adjspd -4
+ jsr @.sts
+ movd r2, tos
+ ret 0
--- /dev/null
+.define .sts
+
+ .text
+
+.sts:
+ movd tos, r7
+ movd tos, r0
+ movd tos, r1
+ cmpqd 1, r0
+ beq 1f
+ cmpqd 2, r0
+ beq 2f
+3:
+ movd tos, 0(r1)
+ addqd 4, r1
+ acbd -4, r0, 3b
+4:
+ movd r7, tos
+ ret 0
+1:
+ movb tos, 0(r1)
+ adjspd -3
+ br 4b
+2:
+ movw tos, 0(r1)
+ adjspd -2
+ br 4b
--- /dev/null
+.define .trp
+
+ .text
+
+.trp:
+ save [r0, r1]
+ movd 12(sp), r0 !error number
+ cmpd r0, 16
+ bge 1f
+ sbitd r0, r1
+ andw @.ignmask, r1
+ beq 1f
+ br 3f !do not trap
+1: !do trap
+ movd @.trpreg, r1
+ cmpqd 0, r1
+ beq 2f
+ movqd 0, @.trpreg
+ jsr r1
+3:
+ restore [r0, r1]
+ ret 4
+2:
+ jump @.stop !no trapprocedure supplied