aboutsummaryrefslogtreecommitdiff
path: root/unix/as.vax/zsvjmp.s.ORIG
blob: 599119706a81838969ff658f300590ad4e4ee301 (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
53
54
55
# 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.

	.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

	.align	1
_zsvjmp_:				# set up jump
	.word	0x0
	movl	JMPBUF(ap), r0
	movl	STATUS(ap), (r0)+	# save address of status variable
	movq	r6, (r0)+
	movq	r8, (r0)+
	movq	r10, (r0)+
	movq	8(fp), (r0)+		# ap, fp
	movab	12(ap), (r0)+		# sp
	movl	16(fp), (r0)		# saved pc
	clrl	*STATUS(ap)
	clrl	r0
	ret

	.align	1
_zdojmp_:				# do jump (return again from zsvjmp)
	.word	0x0
	movl	JMPBUF(ap), r1
	movl	(r1)+, r0		# get address of status variable
	movl	*STATUS(ap), (r0)	# put new status there
	movq	(r1)+, r6
	movq	(r1)+, r8
	movq	(r1)+, r10
	movq	(r1)+, r12
	movl	(r1)+, sp
	tstl	(r0)			# must not return status=0
	bneq	L1
	movzbl	$1, (r0)
L1:
	movl	(r0), r0
	jmp	*(r1)