From fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Wed, 8 Jul 2015 20:46:52 -0400 Subject: Initial commit --- unix/as.vax/zsvjmp.s.ORIG | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 unix/as.vax/zsvjmp.s.ORIG (limited to 'unix/as.vax/zsvjmp.s.ORIG') diff --git a/unix/as.vax/zsvjmp.s.ORIG b/unix/as.vax/zsvjmp.s.ORIG new file mode 100644 index 00000000..59911970 --- /dev/null +++ b/unix/as.vax/zsvjmp.s.ORIG @@ -0,0 +1,55 @@ +# ZSVJMP, ZDOJMP -- Set up a jump (non-local goto) by saving the processor +# registers in the buffer jmpbuf. A subsequent call to ZDOJMP restores +# the registers, effecting a call in the context of the procedure which +# originally called ZSVJMP, but with the new status code. These are Fortran +# callable procedures. + + .globl _zsvjmp_ + .globl _zdojmp_ + + # The following has nothing to do with ZSVJMP, and is included here + # only because this assembler module is loaded with every process. + # This code sets the value of the symbol MEM (the Mem common) to zero, + # setting the origin for IRAF pointers to zero rather than some + # arbitrary value, and ensuring that the MEM common is aligned for + # all datatypes as well as page aligned. A further advantage is that + # references to NULL pointers will cause a memory violation. + + .globl _mem_ + .set _mem_, 0 + + .set JMPBUF, 4 + .set STATUS, 8 + + .align 1 +_zsvjmp_: # set up jump + .word 0x0 + movl JMPBUF(ap), r0 + movl STATUS(ap), (r0)+ # save address of status variable + movq r6, (r0)+ + movq r8, (r0)+ + movq r10, (r0)+ + movq 8(fp), (r0)+ # ap, fp + movab 12(ap), (r0)+ # sp + movl 16(fp), (r0) # saved pc + clrl *STATUS(ap) + clrl r0 + ret + + .align 1 +_zdojmp_: # do jump (return again from zsvjmp) + .word 0x0 + movl JMPBUF(ap), r1 + movl (r1)+, r0 # get address of status variable + movl *STATUS(ap), (r0) # put new status there + movq (r1)+, r6 + movq (r1)+, r8 + movq (r1)+, r10 + movq (r1)+, r12 + movl (r1)+, sp + tstl (r0) # must not return status=0 + bneq L1 + movzbl $1, (r0) +L1: + movl (r0), r0 + jmp *(r1) -- cgit