Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/libsim/freeze.mac
There are 2 other files named freeze.mac in the archive. Click here to see a list.
COMMENT * freeze, SIMULA specification;
OPTIONS(/E:QUICK,ZYLFRZ);
PROCEDURE freeze(restartcode); NAME restartcode; INTEGER restartcode;
COMMENT Stops the program after preparing it for a SAVE command.
When continued directly (CONTINUE instead of SAVE), restartcode will be zero,
otherwise restartcode = offset + 1, where offset = restart address - .JBSA<RH>.
The offset can be specified in a RUN UUO or implicitly by giving the absolute
starting address in a START command. The limits on offset are:
	0<=offset<=15, implying 0<=restartcode<=16.
Sysin and Sysout, but no other files, may be open when freeze is called.
Sysin and Sysout will be closed and then reopened on continuing or restarting.
Note that Sysin will be read from the start again if it is not a terminal, and
Sysout will be overwritten unless it is a terminal or written in append mode.
;

!*;! MACRO-10 code !*;!

	TITLE	freeze
	ENTRY	ZYLFRZ
	SUBTTL	SIMULA utility, Lars Enderin Mar 1976

;!*** Copyright 1976 by the Swedish Defence Research Institute. ***
;!*** Copying is allowed.					***

	;! Edits: [135,165,277,307]

	sall
	search	simmac,simmcr,simrpa
	macinit

	ENTRY	.ZYLCL,.ZYLOP,.ZYLRJ,.ZYLSJ,.ZYLRT

	IF1,<
	qocti==0
	IFDEF OCTI,<qocti==1>
	>
OPDEF	PORTAL		[JRST	1,]
OPDEF	XEC		[PUSHJ	XPDP,]
OPDEF	LINKBUFF	[XEC	OCIND]
OPDEF	sysclose	[JSR	.ZYLCL]	;! Close Sysin and Sysout
OPDEF	sysopen		[JSR	.ZYLOP]	;! Open again
OPDEF	jobsave		[JSR	.ZYLSJ]	;! Save job status
OPDEF	jobrestore	[JSR	.ZYLRJ]	;! Restore it

	DEFINE	acsave<
	LI	s0
	BLT	s0+x17
	>
	DEFINE	acrestore<
	MOVSI	x17,s0
	BLT	x17,x17
	>

	DEFINE	type(t)<
	OUTSTR	[ASCIZ\
t
\]
>
	;! Local definitions ;!
	xfil==XWAC1

	.JBREL==44
	.JBHRL==115
	.JBSA==	120
	.JBOPC==130
	.JBCOR==133
	.JBFF== 121
	.JBDDT==74
	.JBSDD==114
	.JB41==41
	.JBS41==122
	.JBREN==124
	.JBAPR==125


	X17==17
	XHRL==X14
	XJBSA==X13
	XST0==X12
	XJBREN==X11

	rmax==	^D16	;! Max restartcode value
ZYLFRZ:	PROC
	IFONA	ZFLVTD(XWAC1)
	 RTSERR	100	;! Assignment illegal if value, not address
	LOWADR
	STD	XWAC1,YOBJAD(XLOW)	;! Save parameter
	LOOP	;! Check for open files
		SETOFF	SDSCLO(XLOW)	;! Do not close Sysin and Sysout now
		EXEC	IOCLA
	AS	;! Long as open files do exist
		JUMPE	FALSE
		type	(?ZYLFRZ Files open on call to FREEZE)
		RTSERR	QDSCON,214
		GOTO	TRUE
	SA
	SETZ
	EXEC	SAGC	;! Collect garbage

	jobsave
	MOVSI	X1,1	;! Eliminate hiseg
	CORE	X1,
	NOP
	LI	restart
	HRLM	.ZYLRS
	type	([ZYLFRZ  FREEZE called. Do: SAVE <filename> or CONTINUE])
	type	([Continue after SAVE with START command.])
	EXIT	1,
	type	([Job continued])
	SETZM	.ZYLRS
restart:
	jobrestore
	SETZB	XWAC1,XWAC2
	EXCH	XWAC1,YOBJAD(XLOW)
	EXCH	XWAC2,YOBJAD+1(XLOW)
	LF	X1,ZFLZBI(,XWAC1)
	ADDI	X1,(XWAC2)
	HRRE	.ZYLRS
	ST	(X1)
	CALLOW
	RETURN
	EPROC

.ZYLRS::Z	;! Restart address, returncode
	PORTAL	.+1+rmax	;! Offset=-1 from RUN ends up here
.ZYLRT:	REPEAT	rmax,<PORTAL	.+rmax+1>
	REPEAT	rmax+1,<SOS	.ZYLRS>
	MOVS	X1,.ZYLRS
	BRANCH	(X1)

	IFE	qocti,<
OCTI:	PROC	;! (re)initialize for interrupts and UUO:s
	LI	OCTR
	ST	.JBAPR
	LI	AP.ILM!AP.NXM!AP.FOV!AP.AOV!AP.REN
	JRSTF	@[004000,,.+1]
	APRENB	
	L	[PUSHJ	XPDP,OCUU]
	ST	.JB41
	RETURN
	EPROC
>
	SUBTTL	jobsave

.ZYLSJ:	PROC
	Z		;! Return address by JSR
	CFORBID
	edit(307)	;! Save info only if not done before
	SKIPE yhnam	;! [307]
	 GOTO L2	;! [307]
	edit(277)	;! Save info to GETSEG hiseg
	MOVSI	YOCGSB(XLOW)
	HRRI	ydev
	BLT	yppn
	L	[-2,,.GTPRG]	;! Hiseg name
	GETTAB
	 SETO
	HRROI	X1,.GTPRG	;! Program name
	GETTAB	X1,
	 SETZ	X1,
	IF	;! Hiseg from same file as lowseg
		JUMPE	TRUE
		CAME	X1
		 GOTO	FALSE
	THEN	;! Note where program came from
		ST	X1,yhnam
		HRROI	.GTRDV	;! Run device
		GETTAB
		 SETZ
		SKIPN
		 MOVSI 'DSK'
		ST	ydev
		HRROI	.GTRDI	;! Run directory
		GETTAB
		 SETZ
		ST	yppn
	FI
L2():!	sysclose
	SETZ	XST0,
	IF	;! Channel 0 active
		DEVCHR	XST0,
		JUMPE	XST0,FALSE
	THEN	;! Save status in XST0, then release channel
		GETSTS	XST0
		HRROS	XST0	;! Make sure XST0=/=0
		CLRBFI		;! Get rid of type-ahead
		RELEASE
	FI
	L	XJBSA,.JBSA	;! Save old .JBSA
	HRL	.JBREL		;! Lowseg end
	HRRI	.ZYLRT		;! Start address
	ST	.JBSA
	LI	^D17		;! Counter, initial
	HRRM	.ZYLRS
	L	XHRL,.JBHRL
	JSP	.+1		;! Save PC flags
	HRR	.ZYLRT		;! Continue address
	ST	.JBOPC
	LI	XJBREN,ree1	;! .JBREN value
	EXCH	XJBREN,.JBREN
	SETZM	yjbren
	acsave
	L	.JBREL
	TRO	777
	HRL
	ST	.JBCOR
	L	.JBDDT
	ST	.JBSDD
	SETZM	.JBHRL
	SETZM	.JBAPR
	SETZM	.JB41
	BRANCH	@.ZYLSJ
	EPROC


yjbren:	Z
ree1:	ST	yjbren
	HRRZ	.JBOPC
	IF	;! No valid address
		CAIE	-1
		GOTO	FALSE
	THEN	;! Substitute one
		HRRZ	.JBSA
		HRRM	.JBOPC
	FI
	EXCH	yjbren
	type	<[ZYLRJ REENTER deferred]>
	BRANCH	@.JBOPC
	SUBTTL	jobrestore

.ZYLRJ:	PROC
	Z	;! Call by JSR
	LOWADR
	acrestore
	ST	XJBSA,.JBSA
	;! Restore hiseg
	MOVSI	X1,1
		edit(165)
	HLR	X1,.JBCOR	;! [165] May be higher than .JBREL
	CORE	X1,	;! Eliminate any hiseg
	 HALT		;! [165] Not enough
	L	.JBREL	;! [165]
	ST	.JBFF	;! [165]
		edit(277)
	LI	X1,ydev
	GETSEG	X1,
	 HALT
	LOWADR
	IF	;! Not restarted directly
		SKIPN	.ZYLRS
		GOTO	FALSE
	THEN	;! Reset elapsed time, cpu time etc
		SETZ	X1,
		RUNTIM	X1,
		ST	X1,YRUNTM(XLOW)
		ST	X1,YSATIM(XLOW)	;! Last G.C. considered to be here
		SETZM	YSAGCN(XLOW)	;! Number of GC's
		SETZM	YSAGCT(XLOW)	;! Accumulated GC time
		MSTIME	X1,
		ST	X1,YDAYTM(XLOW)
		PJOB	X1,
		ST	X1,YJOBNO(XLOW)
	FI
	acrestore
	IF	;! Channel 0 was active
		JUMPE	XST0,FALSE
	THEN	;! Restore it
		L	x4,YOCBST(XLOW)
		IF	;! Really active
			JUMPE	x4,FALSE
		THEN	;! Do it
			LI	X1,(XST0)
			MOVSI	X2,'TTY'
			HRRI	x3,1(x4)
			HRLI	x3,52+1(x4)
			OPEN	0,X1
			HALT
			LI	x6,23
			LI	x7,2
			HRRI	X1,-1(x3)
			LINKBUFF
			HLRZ	X1,x3
			HRRI	X1,-1(X1)
			LINKBUFF
	FI	FI
	EXEC	OCTI
	sysopen
	EXCH	XJBREN,.JBREN
	IF	;! REENTER was done since job was saved
		SKIPN	yjbren
		GOTO	FALSE
	THEN	;! Let it work now
		JSP	.+1
		HRR	.ZYLRJ
		ST	.JBOPC
		L	.JBREN
		HRRM	.ZYLRJ
	FI
	CALLOW
	BRANCH	@.ZYLRJ
	EPROC
	SUBTTL	sysopen

.ZYLOP:	PROC
	Z	;! Call by JSR
	IF	;! Sysin was open
		HRRZ	xfil,yinout
		JUMPE	xfil,FALSE
	THEN	;! Reopen
		LD	XWAC2,imagei
		LF	X1,ZFICHN(xfil)
		IF	;! On channel 0
			JUMPN	X1,FALSE
		THEN	;! Restore channel table entry
			HRRM	xfil,YIOCHT(XLOW)
		FI
		EXEC	IOOP
	FI
	IF	;! Sysout was open
		HLRZ	xfil,yinout
		JUMPE	xfil,FALSE
	THEN	;! Reopen
		LD	XWAC2,imageo
		LF	X1,ZFICHN(xfil)
		IF	;! On channel 0
			JUMPN	X1,FALSE
		THEN	;! Restore channel table entry
			HRLM	xfil,YIOCHT(XLOW)
		FI
		EXEC	IOOP
			edit(135)
		IF	;![135] Sysout is actually a Printfile
			IFOFF	ZFIPF(xfil)
			GOTO	FALSE
		THEN	;! Restore old LINESPERPAGE, SPACING
			L	ylpsp
			WSF	,ZPFLP(xfil)
		FI
	FI
	BRANCH	@.ZYLOP
	EPROC
	SUBTTL	sysclose

.ZYLCL:	PROC
	Z
	;! Close Sysin and Sysout if open
	SETZM	yinout
	L	xfil,YSYSIN(XLOW)
	IF	;! Open
		IFOFF	ZFIOPN(xfil)
		GOTO	FALSE
	THEN	;! Save address, then close
		LD	OFFSET(ZFIIMG)(xfil)
		STD	imagei
		HRRM	xfil,yinout
		EXEC	IOCL
	FI
	L	xfil,YSYSOUT(XLOW)
	IF	;! Sysout is open
		IFOFF	ZFIOPN(xfil)
		GOTO	FALSE
	THEN	;! Save address, close
		LD	OFFSET(ZFIIMG)(xfil)
		STD	imageo
		HRLM	xfil,yinout
			edit(135)
		IF	;![135] Sysout is actually a Printfile
			IFOFF	ZFIPF(xfil)
			GOTO	FALSE
		THEN	;! Save LINESPERPAGE, SPACING
			WLF	,ZPFLP(xfil)
			ST	ylpsp
		FI
		EXEC	IOCL
	FI
	BRANCH	@.ZYLCL
	EPROC
s0:	BLOCK	^D16	;! Ac save area
imagei:	BLOCK	2
imageo:	BLOCK	2
yinout:	BLOCK	1
			edit(135)
ylpsp:	BLOCK	1	;![135] Saves ZPFLP, ZPFSP (Linesperpage, Spacing)
			edit(277)
ydev:	BLOCK	1	;! GETSEG device
yhnam:	BLOCK	1	;! HISEG name
	BLOCK	2
yppn:	BLOCK	1	;! Directory of hiseg
	Z
	LIT
	END;