1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
|# 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_
.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_
_mem_ = 0
JMPBUF = 4
STATUS = 8
REGMASK = 0xfcfc |# D2-D7,A2-A5,A6,A7=sp
_zsvjmp_:
movl sp@(JMPBUF),a0 |# set A0 to point to jmpbuf
movl sp@(STATUS),a1 |# A1 = status variable
movl a1,a0@ |# JB[1] = addr of status variable
clrl a1@ |# status = 0
movl sp@+,a1 |# A1 = return address
movl a1,a0@(4) |# JB[2] = return address for longjmp
moveml #REGMASK,a0@(8) |# save register
jmp a1@ |# return from subroutine
_zdojmp_:
movl sp@(STATUS),a0
movl a0@,d0 |# D0 = status value
bne L1 |# branch if not equal to zero
moveq #1,d0 |# status must be nonzero
L1:
movl sp@(JMPBUF),a0 |# set A0 to point to jmpbuf
movl a0@,a1 |# get addr of zsvjmp status variable
movl d0,a1@ |# set the status value
moveml a0@(8),#REGMASK |# restore registers
movl a0@(4),a1 |# get return address of zsvjmp
jmp a1@ |# return from zsvjmp
|