diff options
Diffstat (limited to 'unix/as.ssol/zsvjmp.s.OLD')
-rw-r--r-- | unix/as.ssol/zsvjmp.s.OLD | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/unix/as.ssol/zsvjmp.s.OLD b/unix/as.ssol/zsvjmp.s.OLD new file mode 100644 index 00000000..7f6bb7eb --- /dev/null +++ b/unix/as.ssol/zsvjmp.s.OLD @@ -0,0 +1,59 @@ +!# 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. +!# +!# (SUN/UNIX sparc version) + + .seg "text" + .global _zsvjmp_ + .global _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. + + .global _mem_ + _mem_ = 0 + + !# The following requires a jmpbuf of length at least 6 ints. + .proc 0 +_zsvjmp_: + save %sp, -0x60, %sp + call _sigblock + clr %o0 + st %o0, [%i0 + 0x8] + st %i1, [%i0 + 0x14] + clr %o0 + st %o0, [%i1] + st %i7, [%i0] + st %fp, [%i0 + 0x4] + add %i0, 0xc, %o1 + call _sigstack + clr %o0 + ret + restore %g0, 0x0, %o0 + + .proc 0 +_zdojmp_: + save %sp, -0x40, %sp + ta 0x3 + ld [%i0 + 0x4], %fp + sub %fp, 0x60, %sp + call _sigsetmask + ld [%i0 + 0x8], %o0 + add %i0, 0xc, %o0 + call _sigstack + clr %o1 + ld [%i0 + 0x14], %o0 + ld [%i1], %i1 + st %i1, [%o0] + ld [%i0], %i7 + ret + restore %i1, 0x0, %o0 + .seg "data" |