aboutsummaryrefslogtreecommitdiff
path: root/unix/mc68000/zsvjmp.ISI
blob: 0e7de6099e5146065ce881676b0d063b7053dcc2 (plain) (blame)
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 */