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
50
51
52
|
/*
* 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.
*
* (ISI/UNIX version for the MC68000)
*/
.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_
.set _mem_, 0
.set JMPBUF, 4
.set STATUS, 8
.set 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[3] = 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 */
|