aboutsummaryrefslogtreecommitdiff
path: root/unix/portkit/zsvjmp.s.68000
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /unix/portkit/zsvjmp.s.68000
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'unix/portkit/zsvjmp.s.68000')
-rw-r--r--unix/portkit/zsvjmp.s.6800037
1 files changed, 37 insertions, 0 deletions
diff --git a/unix/portkit/zsvjmp.s.68000 b/unix/portkit/zsvjmp.s.68000
new file mode 100644
index 00000000..efebe43e
--- /dev/null
+++ b/unix/portkit/zsvjmp.s.68000
@@ -0,0 +1,37 @@
+|# 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 MC68xxx version)
+
+ .text
+ .globl _zsvjmp_
+
+ |# 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_
+ _mem_ = 0
+
+ JMPBUF = 4
+ STATUS = 8
+
+ |# The strategy here is to build on the services provided by the C
+ |# setjmp/longjmp. Note that we cannot do this by writing a C function
+ |# which calls setjmp, because the procedure which calls setjmp cannot
+ |# return before the longjmp is executed.
+
+_zsvjmp_: |# CALL ZSVJMP (JMPBUF, STATUS)
+ movl sp@(JMPBUF),a0 |# set A0 to point to jmp_buf
+ movl sp@(STATUS),a1 |# A1 = status variable
+ movl a1,a0@ |# JB[0] = addr of status variable
+ clrl a1@ |# return zero status
+ addql #4,sp@(JMPBUF) |# skip first cell of jmp_buf
+ jmp _setjmp |# let setjmp do the rest.