BSD 3 development
[unix-history] / usr / src / cmd / lisp / reset.s
# C library -- reset, setexit
# reset(x)
# will generate a "return" from
# the last call to
# setexit()
# by restoring r6 - r12, ap, fp
# and doing a return.
# The returned value is x; on the original
# call the returned value is 0.
#
# useful for going back to the main loop
# after a horrible error in a lowlevel
# routine.
.globl _setexit
.globl _getexit
.globl _reset
.globl _resexit
.globl _setsav
.globl _svkludg
_setexit:
.word 0x0000
movab _setsav,r0
movq r6,(r0)+
movq r8,(r0)+
movq r10,(r0)+
movq 8(fp),(r0)+ # ap, fp
movab 4(ap),(r0)+ # sp
movl 16(fp),(r0) # pc
clrl r0
ret
_reset:
.word 0x0000
movl 4(ap),r0 # returned value
movab _setsav,r1
movq (r1)+,r6
movq (r1)+,r8
movq (r1)+,r10
movq (r1)+,r12
movl (r1)+,sp
jmp *(r1)
_resexit:
.word 0x0000
movc3 $40,*4(ap),_setsav
ret
_svkludg:
movl (sp)+,out
movq r0,myregs
movq r2,myregs+8
movq r4,myregs+16
subl2 $40,sp
movc3 $40,_setsav,(sp)
movq myregs,r0
movq myregs+8,r2
movq myregs+16,r4
jmp *out
_getexit:
.word 0x0000
movc3 $40,_setsav,*4(ap)
ret
.data
_setsav:.space 10*4
out: .space 4
myregs: .space 6*4