aboutsummaryrefslogtreecommitdiff
path: root/unix/mc68000/zsvjmp.SUN
blob: 4789d0537f8c6b3f594635784d3afdca53448336 (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
|# 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