aboutsummaryrefslogtreecommitdiff
path: root/unix/portkit/zsvjmp.s.FX
blob: 1f15102ecd1c6979f31c8728dc990882158b7485 (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.
|#
|# (Alliant/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

_zsvjmp_:				|# call zsvjmp (jmpbuf, status)
	movl	a0@(4), sp@-		|# save pointer to status variable
	movl	a0@, sp@-		|# save pointer to jmpbuf

	movl	a0@, sp@-		|# call alliant setcontext proc
	movl	sp, a0
	pea	1
	jsr	_setcontext
	addql	#8, sp

	movl	sp@+, a0		|# A0 = &jmpbuf
	movl	sp@+, a1		|# A1 = &status

	movl	a1, a0@(2240)		|# save &status in jmpbuf
	clrl	a1@			|# set status to zero
	lea	sp@(4), a1
	movl	a1, a0@(68)
	movl	sp@, a0@(74)
	rts

_zdojmp_:
	movl	a0@, a1			|# A1 = &jmpbuf
	movl	a1@(2240), a2		|# A2 = &status
	movl	a0@(4), a3		|# pointer to status value
	movl	a3@, a2@		|# set status value
	jsr	_resetcontext