Google
 

Trailing-Edge - PDP-10 Archives - dec-10-omona-u-mc9 - inflib.mac
There are 5 other files named inflib.mac in the archive. Click here to see a list.
	TITLE	COMMON SUB ROUTINE LIBRARY
	SUBTTL	T KORTEWEG 17-FEB-74

VWHO==0
VINFL==0
VMINOR==0
VEDIT=113
;COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION MAYNARD MASS.

;EDIT HISTORY
;1 RUNNUM HAS BEEN UPDATED TO ALLOW AN INCREASE IN THE RUN NUMBER
;  WITHOUT A CHECK OF PASSWORD AND THE LAST TIME CALLED.THIS ENTRY
;  WAS MADE FOR DUMPR,WHICH ALLOWS DUMPS TO BE WRITTEN,TODIAGNOSE
;  PROBLEMS

;2 SCRASH HAS BEEN CHANGED SO AS NO LONGER TO DESTROY REGISTER 
;  V INTHE SAVED AREA MOREOVER ALLREGISTERS ARE RESTORED

;3 DUMPR HAS BEEN ADDED TO ALLOW THE WRITING FROM ANY LOCATION
;  OF A XPN FILE
	SEARCH	INFSYM
	;SAVER SAVES ALL ALL REGISTERS WITH THE EXCEPTION OF THE 
	;PUSHDOWN LIST ON THE STACK.(NOTE: IT IS ASSUMED THAT THE SYMBOL P
	;DEFINES THE PUSHDOWN LIST POINTER.).ONDOING THIS IT ASSUMES
	;THAT THE CALLERS RETURN ADDRESS SITS ON THE STACK TOP
	;ALL EXITS UP TO A 3 DOUBLE RETURN WILL BE PROPERLY
	;HANDLED
	;CALL WITH:
	;	CALL	SAVER
	;RETURN HERE
	;	RETURN		WILL ACTIVATE THE RESTORATION OF
	;			ALL REGISTERS

	ENTRY	SAVER

SAVER:	EXCH	0,(P)		;GET CALLERS PC+1
	SAVE	(ALL)		;SAVE ALL EXCEPT P AND REGISTER ZERO
	SAVEI	SAVRR		;SAVERS REURN
	SAVE	0		;SET RETURN TO CALLER
	RETURN			;AND GO
SAVRR:	JSP	T1,SVRRR	;(0) NON SKIP RETURN
	JSP	T1,SVRRR	;(1) SKIP RETURN
	JSP	T1,SVRRR	;(2) DOUBLE SKIP RETURN
	JSP	T1,SVRRR	;(3) DOUBLE + SKIP
SVRRR:	HRRZS	T1		;CLEAR FLAGS
	SUBI	T1,SAVRR+1	;GET THE SKIP VALUE
	HRRZ	T2,-20(P)	;GET THE CALLERS RETURN ADDRESS
	ADD	T2,T1		;AND ADD THE INCREMENT
	HRRM	T2,-20(P)	;AND SET THE UPDATED RETURN
	RESTORE	(ALL)		;RESTORE THE CONTEXT P AND 0 NOT!!
	RESTORE			;GET R0 BACK
	RETURN			;AND EXIT
	ENDMOD
	SEARCH	INFSYM

	ENTRY	GETCOR
;GETCOR GETS T1 WORDS OF CORE AND RETURNS THE ADDRESS IN V
;ANY FAILLURE TO GET CORE MAKES A NORMAL RETURN
;SUCCESFULL OPERATION IS FLAGGED BY A SKIP RETURN

	EXTERN	.JBFF,.JBREL,TPOPJ1,TPOPJ

GETCOR:	MOVE	V,.JBFF		;GET START OF FREE CORE
	SAVE	T1		;SAVE THE AMOUNT REQUESTED
	ADDB	T1,.JBFF	;ADD THE SIZE WISHED TO IT
	CAMG	T1,.JBREL	;IS THERE ENOUGH CORE
	JRST	TPOPJ1		;YES DO NOT ASK FOR MORE
	CORE	T1,		;GET IT
	JRST	TPOPJ		;GIVE A NON SKIP RETURN
	JRST	TPOPJ1	;RESTORE T1 AND SKIP RETURN
	ENDMOD
	SUBTTL	LIST OPERATIONS
;THE LIST IS CONTOLLED BY A 2 WORD BLOCK,WHICH HAS THE
;FOLLOWING FORMAT:
;1 WORD 0 POINTER TO FIRST ENTRY,,POINTER TO LAST ENTRY
;2 WORD 1 NUMBER OF ENTRIES IN Q
;EACH PRIMITIVE IS CALLED WITH THE ADDRESS OF THE LISTCONTROL 
;BLOCK IN L AND THE ADDRESS OF AN ENTRY IN V
;THE FOLLOWING PRIMITIVES ARE AVAILABLE:
;1 APPEND  ARGUMENT V TO LIST
;2 REMOVT REMOVE TOP ELEMENT FROM LIST RETURN ADDRESS INV
;3 REMOVE REMOVE ENTRY V FROM LIST
;4 SREMOV SEARCH .V IN LIST AND REMOVE IT
;  2 RETURNS (NORAML) V NOT IN LIST (SKIP) V REMOVED

	SEARCH	INFSYM

	ENTRY	APPEND,REMOVT,REMOVE,SREMOV
	EXTERN	CPOPJ,CPOPJ1

LI.LNK=0		;LINK TO NEXT ELEMENT
LI.NUM=1		;NUMBER OF ENTRIES IN LIST

;NOTE: THE FIRST WORD OF THE LIST LINKS TO THE REST OF THE LIST
; WITH A FORWARD AND BACKWARD POINTER
;ZERO=NIL TERMINATOR
APPEND:	SKIPE	LI.NUM(L)	;FIRST ELEMENT
	JRST	APPEN0		;NO REALLY APPENDING
	MOVE	T1,V		;POINT TO THE
	HRL	T1,V		;THE CURRENT
	MOVEM	T1,LI.LNK(L)	;SLOT
	MOVEI	T1,LI.LNK(L)	;AND GET LINK VALUE
	JRST	APPEN1
APPEN0:	HRRZ	T1,LI.LNK(L)	;GET PREVIOUS ELEMENT
	HRRM	V,LI.LNK(L)	;NOW WE ARE OLDEST MEMBER
	HRLM	V,LI.LNK(T1)	;UPDATE LIST MEMBER
APPEN1:	MOVEM	T1,LI.LNK(V)	;SET LINK IN LAST ELEMENT
	AOS	LI.NUM(L)	;ONE MORE IN LIST
	RETURN

;REMOVE TOP ELEMENT

REMOVT:	HLRZ	V,LI.LNK(L)	;GET TOP ELEMENT

;REMOVE GIVEN ELEMENT .V

REMOVE:	SOSGE	LI.NUM(L)	;ANY MORE IN LIST
	JRST	REMOV0		;RAP LINK
	HRRZ	T1,LI.LNK(V)	;PREVIOUS ONE
	HLRZ	T2,LI.LNK(V)	;RESET ONE
	HRLM	T2,LI.LNK(T1)	;UPDATE ANCHOR OR BUCKET
	SKIPN	T2		;IF LIST IS TERMINATED THEN ELSE
	MOVE	T2,L		;ELSE CHANGE THE LAST MEBER
	HRRM	T1,LI.LNK(T2)	;UPDATE BACKWARD POINTER
	RETURN
REMOV0:	SETZM	LI.NUM(L)	;THE LIST IS EMPTY
	SETZM	LI.LNK(L)	;RAP BACKWARD
	RETURN

;SEARCH .V IN LIST AND REMOVE IT IF PRESENT

SREMOV:	JUMPE	V,CPOPJ
	MOVE	T1,L		;COPY THE LIST ADDRESS
SREMO0:	HLRZ	T1,LI.LNK(T1)
	JUMPE	T1,CPOPJ
	CAME	T1,V
	JRST	SREMO0
	MOVE	V,T1
	CALL	REMOVE
	JRST	CPOPJ1
	ENDMOD
	SUBTTL	FREE LIST MANAGEMENT
	COMMENT	&
GETBLK	GETS A FREE BLOCK IN V AND GIVES A SKIP RETURN
	A NORMAL RETURN IS GIVEN WHEN NO MORE CORE IS AVAILABLE
	CORE IS ALLOCATED IN PAGES OR KAYS OF CORE.
NOTE:	1.  THAT GETBLK IS SELF INITIALIZING, THE INITIALIZATION
	    CODE ONLY SETS PAGE OR KAY DATA.
	2.  VARIABLE LOADED TRIES TO INFLUENCE THE BEHAVIOUR
	    OF SYS:INFO BY STOPPING THE ACCEPTANCE OF MESSAGES
RETBLK	RETURNS THE BLOCK IN V TO THE FREE LIST
INIBLK	DOES THE FIRST THINGS AS LITTLE AS POSSIBLE!!
	&

KAYSIZ=1777			;NUMBER OF WORDS PER KAY
PAGSIZ=0777			;NUMBER OF WORDS PERPAGE

		SEARCH	C,INFSYM

	ENTRY	BLKINI,GETBLK,GETTWO
	ENTRY	RETBLK,RETTWO

	EXTERN	GETCOR,CPOPJ1

	ND	FTDEBUG,0
	ND	FTFLOW,0

LI.SLN=1		;SUBLINK FOR TWIN BLOCKS
;V CONTAINS SIZE OF SLOTS IN LIST STRUCTURE

BLKINI:	MOVEM	V,LISIZ	;SAVE THE SIZE OF THE BUCKETS
	SETZM	FRELNK		;INITIALIZE CONTROL
	SETZM	FRENUM		;BLOCK
	MOVEI	T1,KAYSIZ	;AND INITIALIZE
	JUMPPT	T2,,BLKIN0	;EXPANSION DATA
	MOVEI	T1,PAGSIZ	;ACCORDING TO PROCESSOR
BLKIN0:	IDIVI	T1,(V)		;DIVIDE BY SIZE OF SLOTS
	MOVEM	T1,BCKPKP	;AS PAGES ARE BETTER
	IMULI	T1,(V)		;THEN KAYS TO EXPAND
	MOVEM	T1,BCKPKS
	RETURN
GETBLK:	SOSL	V,FRENUM	;ARE ANY BUCKETS AROUND
	JRST	GETBL2		;YES TAKE ONE
	IFN	FTFLOW,<
	SAVE	V
	MOVEI	V,CORMS1	;GET TEXT TO PRINT
	CALL	TYPOPB##	;TYPE THE TEXT
	JFCL			;AND IGNORE FAILLURE
	RESTORE	V
	JRST	NCOR1		;SKIP THE TEXT
CORMS1:	ASCIZ	/MORE CORE WAS REQUESTED]
/
NCOR1:
>
	MOVE	T1,BCKPKS	;CHUNK
	CALL	GETCOR		;GET T1 WORDS
	RETURN			;HAND THE PROBLEM TO THE CALLER
	MOVE	T2,V		;GET POINTER TO NEW CHUNK
	EXCH	T2,FRELNK	;SET ANCHOR ADDRESS TO IT
	MOVE	T3,BCKPKP	;# OF BUCKETS PER PAGE OR K
GETBL1:	MOVE	T4,V		;LET T4 POINT TO OLD SLOT
	ADD	V,LISIZ		;ADDRESS OF NEXT SLOT
	SOSG	T3		;IF LAST BUCKET IN NEW CHUNK THEN
	MOVE	V,T2		;TAKE OLD ANCHOR CONTENT
	MOVEM	V,(T4)		;POINT TO SUCCESSOR
	JUMPG	T3,GETBL1	;DO THIS FOR ALL BUCKETS
	MOVE	V,BCKPKP	;GET THE NUMBER OBTAINED
	ADDB	V,FRENUM	;AND SET THE NUMBER IN THE LIST
	IFN	FTDEBUG,<
	WARN	DO,<THERE ARE: >
	MOVE	T3,FRENUM
	CALL	PROC0
	WARN	DO,< (OCTAL) FREE ELEMENTS .THEY ARE:
>
	SAVE	<T1,T2,T3,T4>
	MOVE	T1,FRELNK		;FIRST FREE SLOT
TT..:	WARN	DO,<
>
	MOVEI	T2,5		;5 PER LINE
	SAVE	T2
TT0..:	MOVE	T2,T1	;PRINT IT
	CALL	PROCT
	MOVE	T1,(T1)
	JUMPE	T1,TT1..
	SOSE	(P)		;COUNT ON THE STACK
	JRST	TT2..
	RESTORE	T2
	JRST	TT..
TT2..:	WARN	DO,<    >
	JRST	TT0..
TT1..:	WARN	DO,<
>
	RESTORE	T1
	RESTORE	<T4,T3,T2,T1>
	WARN	DO,<
>>	;END OF IFN FTDEBUG
GETBL2:	MOVE	V,FRELNK	;GET THE FIRST FREE BUCKET
	MOVE	T1,(V)		;AND ITS SUCCESSOR
	MOVEM	T1,FRELNK	;GOES TO THE ANCHOR
	HRL	T1,V		;MAKE A
	HRRI	T1,1(V)		;BLT POINTER
	SETZM	(V)		;TO ZAP SLOT
	MOVE	T2,V		;START OF FREE SLOT
	ADD	T2,LISIZ	;ONE TOO FAR!!
	BLT	T1,-1(T2)	;SO NO HISTORY IS PASSED
	JRST	CPOPJ1
	SUBTTL	GET A PAIR OF FREE BLOCKS

GETTWO:	CALL	GETBLK		;GET ONE BLOCK
	RETURN			;NO ONE THERE
	SAVE	V		;DO NOT LOOSE IT
	CALL	GETBLK		;AND GET A SECOND ONE
	JRST	GETTW0		;JUST A FAILLURE
	HRLZ	T1,(P)		;GET THE FIRST BLOCK'S ADDRESS
	MOVEM	T1,LI.SLN(V)	;AND LINK THE BLOCKS
	RESTORE	W		;GET THE PAIRED REGISTER
	JRST	CPOPJ1		;ALL IS THERE
GETTW0:	RESTORE	V		;GET THE FIRST BLOCK BACK
	CALL	RETBLK		;RETURN THE BLOCK
	RETURN
	SUBTTL	RETURN FREE CORE

;CALLED WITH THE ADDRESS OF THE BLOCK
;TO BE RETURNED IN V

RETBLK:
	IFN	FTDEBUG,<
	CALL	TRACKV		;TRACE CALS AND V VALUE
	SKIPE	V		;RETURNING  AZERO LINK
	JRST	..RET0		;NO
	WARN	DO,<A ZERO BLOCK IS RETURNED>
	HALT
>
..RET0:
	IFN	FTDEBUG,<
	MOVEI	T1,L.FREE	;GET POINTER TO FRE LIST
..RET3:	CAME	T1,V		;MAKING THE LIST CIRCULAR
	JRST	..RET4		;NOT YET
	WARN	DO,<FREE LIST IS BEING MADE CIRCULAR>
	HALT
..RET4:	SKIPE	T1,(T1)
	JRST	..RET3		;THERE IS MORE ON THE LIST
>
	MOVE	T1,FRELNK	;GET CURRENT TOP OF LIST
	MOVEM	V,FRELNK	;REPLACE TOP ADDRESS
	MOVEM	T1,(V)	;MAKE RETURNED BLOCK THE TOP ONE
	AOS	T1,FRENUM	;ONE MORE FREE
	IFN	FTDEBUG,<
;INSPECT THE FREE LIST
	SAVE <T1,T2,T3>
	MOVE	T1,FRENUM	;THE NUMBER OF FREE ELEMENTS
	MOVEI	T2,L.FREE	;THE FREE LIST
	SETZM	T3		;ZAP T3
..RET1:	SKIPE	T2,(T2)		;LAST ONE
	AOJA	T3,..RET1	;NO COUNT IT
	CAMN	T3,T1		;IDENTICAL?
	JRST	..RET2		;YES FORGET IT
	WARN	DO,<DISCREPANCY BETWEEN ACTAUL FREE AND ACCOUNTED AS FREE>
	HALT
..RET2:	RESTORE	<T3,T2,T1>
>
	RETURN

;RETTWO IS THE INVERSE FUNCTION OF GETTWO
;THE ADDRESS OF THE TWIN BLOCK IS IN V

RETTWO:	SAVE	V		;SAVE THE BASE ADDRESS
	HLRZ	V,LI.SLN(V)	;GET THE BROTHER
	IFN	FTDEBUG,<
	SKIPN	V		;IS IT OKAY OR
	CALL	WRNBLN		;IT IS MESSED UP
>
	CALL	RETBLK		;AND DELETE HIM
	RESTORE	V		;GET THE OTHER BROTHER
	PJRST	RETBLK		;AND RETURN HIM TOO

FRELNK:	EXP	0		;FIRST FREE ELEMENT
FRENUM:	EXP	0		;NUMBER OF FREE ELEMENTS
LISIZ:	EXP	0		;NUMBER OF FREE ELEMENTS
BCKPKP:	EXP	0		;NUMBER OF BUCKETS PER PAGE
BCKPKS:	EXP	0		;SIZE OF AN EXTENSION OF THE LIST
	ENDMOD
	SUBTTL PRINTERS

	SEARCH	INFSYM
	ENTRY	PRDEC,PRDECH,PROCT,PROCTH



;PRDEC PRINTS THE CONTENT OF V IN DECIMAL SUPPRESSING LEADIND NULS
;PRDECH PRINTS THE RIGHT HAND SIDE OF V IN DECIMAL
;PROCT PRINT THE CONTENT OF V IN OCTAL (L,,R FORMAT)
;PROCTH PRINTS THE RIGHT HAND SIDE OF V IN OCTAL

PRDEC:	SKIPA	T1,V		;COMPLETE V WILL BE PRINTED
PRDECH:	HRRZ	T1,V		;ONLY THE RIGHT HAND SIDE
	MOVEI	T3,^D10		;RADIX IS DECIMAL
	JRST	PRANY		;PRINT ANY RADIX
PROCT:	HLRZ	T1,V		;GET THE LEFT HAND SIDE
	CALL	PROC0		;PRINT IT
	MOVEI	T1,.CHCOM	;A COMMA SEPERATES
	WARNCH	DO,T1		;PRINT ONE
	WARNCH	DO,T1		;AND ANOTHER ONE
PROCTH:	HRRZ	T1,V		;PRINT ONLY THE RIGHT HAND SIDE
PROC0:	MOVEI	T3,^D8		;PRINT IN OCTAL
;AND FALL INTO PRANY
PRANY:	IDIVI	T1,(T3)		;GET A DIGIT
	SAVE	T2		;SAVE THE DIGIT
	SKIPE	T1		;ALL DONE??
	CALL	PRANY		;NO PRINT MORE
	RESTORE	T2		;GET THE DIGIT BACK
	ADDI	T2,.CHZRO	;MAKE IT ASCII
	WARNCH	DO,T2		;TYPE THE CHARACTER
	RETURN
	ENDMOD
	SEARCH	INFSYM
	ENTRY	PR6BIT

;A SIXBIT PRINTER 
;PRINT THE VALUE IN V INSIXBIT

SIXBAS=40

PR6BIT:	MOVE	T1,V		;COPY THE VALUE
PR6BI0:	SETZ	T2,		;ZERO BIT GENERATOR:
	ROTC	T1,6		;GET FIRST BYTE
	ADDI	T2,SIXBAS	;MAKE IT PRINT TABLE
	TTCALL	1,T2		;PRINT IT
	JUMPN	T1,PR6BI0	;PRINT NEXT BYTE
	RETURN
	ENDMOD
	TITLE	CRASH
	SEARCH	C,INFSYM
	EXTERN	CPOPJ1,CPOPJ
	ENTRY	CRASH,STCRSH,DUMPR

;STCRSH PREPARE DATA FOR ENTERING A CRASH FILE
;CALLED WITH ADDRESS OF CRASH FILE NAME IN V
;THIS CALL ENABLES CRASH CALLS

STCRSH:	JUMPE	V,CPOPJ		;DON'T FOOL ME
	MOVEM	V,CRSHNM	;REMEMBER THE NAME
	JRST	CPOPJ1		;AND EXIT

;CRASH CAN BE CALLED FROM ANY PLACE AND WILL DUMP
;THE CURRENT CORE IMAGE UP TO .(.JBFF) (SEE HOW BAD ARE DOTS BLIS-10)
;HAIL ALGOL-68 WITH REF
;THE DUMP WILL RELEASE CHANNEL 0.THE NAME GIVEN TO THE DUMP FILE
;WILL BE DETERMINED BY THE ENTER BLOCK WHOSE ADDRESS IS PASSED BY
;THE CALLER IN REGISTER V.
;THE FILE WILL BE WRITTEN ON GENERIC DSK IN MODE 17
;WHAT EVER THE DEVICE IS . THE DEVSIZ UUO WILL BE USED TO FIGURE 
;OUT THE DEVICE BUFFER SIZE.THE REGISTERS ON ENTRY ARE
;STORED IN AREA STARTING AT CRSH0
;NOTE THAT ONLY T REGISTERS ARE BLOWN

CRASH::	SKIPN	CRSHNM	;IS THERE A NAME??
	RETURN			;(NO) DO NOT DUMP
	MOVEM	.CRSH0		;CRASH ACC 0
	MOVEI	.CRSH1		;HERE IT GOES
	HRLI	1		;STARTING WITH REGISTER 1
	BLT	.CRS17		;ALL ACCS
	MOVE	V,CRSHNM	;NAME OF CRASH BLOCK
	HRLZ	T1,.JBFF##	;SAVE THE LOW PART OF CORE
	HRRZ	T2,.JBFF	;SEE IF WE HAVE ENOUGH CORE
	SETZ	T4,		;MODE 0 FOR DEVSIZ
	MOVSI	T5,(SIXBIT /DSK/)	;DISK IS OUR DEVICE
	MOVEI	T3,T4		;GET ADDRESS OF ARGUMENT LIST
	DEVSIZ	T3,		;TRY TO GET DEVSIZ
	RETURN			;TO BAD YOU LOOSE
	MOVEI	T3,-3(T3)	;SUBTRACT HEADER
	MOVN	T4,T3		;GET LENGTH MINUS
	MOVE	T5,T3		;AND COPY BLOCK LENGTH
	ADD	T2,T3		;THIS MUCH WE NEED
	CAMG	T2,.JBREL##	;IS THERE ENOUGH CORE??
	JRST	COROK		;NO PROBLEM
	CORE	T2,		;ASK FOR MORE
	HALT			;WHAT TO DO ELSE?? LATER
COROK:	HRRZ	T2,.JBFF		;START OF FREE AREA
	SETZM	(T2)		;ZAP THE START
	HRRI	T1,1(T2)	;TARGET ADDRESS
	ADDI	T3,-1(T2)	;POINT TO END OF AREA
	BLT	T1,(T3)		;ZAP
	HRLI	T1,.JBPFI##+1	;START OF UNPROTECTED AREA
	HRRI	T1,.JBPFI+1(T2)	;START IN TARGET AREA
	BLT	T1,(T3)		;COPY NON PROTECTED DATA
	RELEASE	0		;NO MATTER WHAT IS GOING ON THERE
	OPEN	0,(V)		;OPEN USER'S DEVICE
	RETURN			;SORRY YOU LOOSE
	ENTER	0,3(V)		;USE CALLERS BLOCK
	RETURN			;LOOSER AGAIN
	HRL	T1,T4		;GET MINUS BLOCK LENGTH
	SETZM	T2		;ZAP END OF IOWD LIST
	HRR	T1,.JBFF	;START OF IOWD AREA
	SUBI	T1,1		;ONE WORD BEFORE START
	OUTPUT	T1		;WRITE PART WITH DATA <JOBPFI
	HRRZ	T1,.JBFF	;GET FIRST FREE LOCATION
	ADD	T1,T4		;SUBTRACT BLOCK SIZE
	JUMPL	T1,CRSML	;A VERY SMALL CRASH ONLY
	MOVNS	T1		;MINUS NUMBER OF WORDS STILL TO GO
	HRLS	T1		;MAKE A NEW IOWD
	HRRI	T1,-1(T5)	;START AFTER FIRST BLOCK
	OUTPUT	T1		;AND WRITE LAST PART OF CORE IMAGE
CRSML:	RELEASE	0,		;WRITE EOF
RESTAC:	MOVSI	17,.CRSH0	;GET SOURCE TARGET POINTER
	BLT	17,16		;LAST ONNE RESTORED IS 16
	MOVE	17,.CRS17	;AND GET REGISTER 17 BACK
	JRST	CPOPJ1		;HAPPY CALLER

;DUMPR USED TO DUMP THE CURRRENT CORE IMAGE

DUMPR:	SETOM	DMPFLG		;FLAG WE ARE DOING THE DUMP
	CALL	CRASH		;JUST USE CRASH TO SAVE STUFF
	RETURN			;FAILLURE EXIT
	SETZB	V,DMPFLG	;ZAP V
	CALL	RUNNUM##	;UPDATE THE RUN NUMBER
	JRST	RESTAC		;IGNORE THE PROBLEM
	MOVE	V,CRSHNM	;GET ADDRES OF NAME BLOCK
	HRRM	T1,3(V)		;AND UPDATE THE NAME
	CALL	SIXNUM##	;CONVERT TO SIXBIT
	JRST	RESTAC		;RESTORE ACCS AND RETURN

DMPFLG:	Z			;-1 WHEN  DUMPER DUMP
;AREA TO SAVE ACC'S ON A CRASH

CRSHNM:	Z			;ADDRESS OF CRASH FILE NAME
.CRSH0:	Z			;SAVE ACC 0 HERE
.CRSH1:	Z			;SAVE ACC 1 HERE
	BLOCK	15		;SAVE ACC2 TILL ACC 16 HERE
.CRS17:	Z		;SAVE ACC 17 HERE

	ENDMOD
	TITLE	TYPOPR
	SEARCH	C,INFSYM
	ENTRY	TYPOPR,SETOPR,SETUDX,TYPOP0,TYPOPB
;SETOPR ALLOWS OUTPUT TO ANY TERMINAL VIA TRMOP OPRATIONS
;FIRST CALL SETOPR WITH THE FOLLOWING PARAMETERS:
;.T1 TTY YOU WANT E.G. TTY10(IN SIXBIT)
;.V  ZERO OR ADDRESS OF ASCIZ TEXT TO START EVERY OUTPUT
;IN CASE YOU KNOW THE UDX OF THE TERMINAL CALL SETUDX
;WITH UDX IN T1
;RETURNS FALSE AND TRUE

SETOPR::CALLI	T1,127		;WAIT FOR BETTER C FILE
;	IONDX.	T1,		;TRY TO GET IT
	RETURN			;YOU LOOSE
SETUDX::MOVEM	T1,.TXTX	;STORE THE INDEX
	MOVEM	V,.TXTH		;REMEMBER PREFIX
	JRST	CPOPJ1##	;LUCKY YOU

;TYPOPR TYPES ON THE CTY PROVIDED THE FACT THAT YOU
;HAVE THE PRIVILIGE TO DO SO.
;TYPOPB TOO TYPOPR PRECEDES TEXT BY ?? AND OPB BY]]
;CALL TYPOPR WITH THE ADDRESS OF THE STRING TO BE TYPED
;IN REGISTER V. THIS FUNCTION IS AN EMERGENCY FOR SYSTEM
;PROGRAMS,WHICH ARE IN PAIN AND ARE SO UNLUCKY TO BE
;TO BE DETACHED. TO WAKE SLEEPY OR TOO BUSY OPERATORS
;YOY MIGHT ADD SOME BELLS.
;IF YOU LOOSE A NORMAL RETURN ELSE THE HAPPY TRUE EXIT

TYPOPB::	SKIPN	.TXTX		;HAS I/O INDEX BEEN SET UP
	RETURN		;NO FORGET IT
	MOVEI	T1,LFTSQB		;LEFT SQUARE BRACKETS
	JRST	TYPOP1			;TYPE THEM

TYPOPR::	SKIPN	.TXTX		;HAS I/O INDEX BEEN SET UP
	RETURN			;YOU LOOSE
	MOVEI	T1,QUESTM	;GET ?? TEXT
TYPOP1:	MOVEM T1,.TXTA		;SET UP FOR PRINTING
	MOVE	T1,.TXT0	;GET TRMOP CTL BLOCK
	TRMOP.	T1,		;PRINT IT
	RETURN			;YOU ARE BAD
	SKIPN	T1,.TXTH	;ANY PREFIX FOR SENTENCE?
	JRST	NOPREF		;NONE SO DON'T PRINT
	MOVEM	T1,.TXTA	;YES LET IT GO FIRST
	MOVE	T1,.TXT0	;GET TRMOP CTL BLOCK
	TRMOP.	T1,		;TRY TO GET MESSAGE ACROSS
	RETURN			;NO YOU ARE A BAD GUY
TYPOP0::
NOPREF:	MOVEM	V,.TXTA		;TEXT ADDRESS
	MOVE	T1,.TXT0	;GET TRMOP CTL BLOCK
	TRMOP.	T1,		;TRY TO GET IT ACROSS
	RETURN			;HE DID NOT GET IT
	JRST	CPOPJ1##	;HAPPY ME

.TXT0:	3,,.TXT		;NO LITERAL PROBLEMS
.TXT:	EXP	.TOOUS		;WRITE
.TXTX:	Z			;I/O INDEX COMES HERE
.TXTA:	Z			;ADDRESS OF ASCIZ STRING COMES HERE
.TXTH:	Z		;ADDRSS OF MESSAGE PREFIXES
LFTSQB:	ASCIZ	/[/		;INNOCENT TEXTS
QUESTM:	ASCIZ	/??/		;PROBLEM REPORTERS
	ENDMOD
	TITLE	SETSTA
	SEARCH	C,INFSYM
	ENTRY	SETSTA,RESTAR

;SETSTA AND RESTAR ARE CONJUGATE ROUTINES
;THIS MEANS SETSTA PREPARES THE RESTART OF A PROGRAM
;AND RESTAR RERUNS THE PROGRAM.
;TO ENABLE RESTARTING CALL SETSTA IMMEDIATELY
;AFTER SETTING UP A STACK AND NOT USING A RUN ACCU
;AS A STACK POINTER PLEASE.THIS WILL ENABLE RESTAR
;CALING RESTAR CAN RESULT IN:
;1 A RETURN IF THE RESTAR LOOSES 
;2 NO RETURN WHEN THE PROGRAM WAS RESTARTED
;NOTE: THAT THE JOB WILL ATTACH TO THE CTY WHENEVER THE CONTROLLING
;LINE NUMBER HAS CHANGED , THIS IS TO GET DAEMON BACK ON THE AIR

SETSTA::0			;NO STACK PROBLEMS PLEASE
	SETOM	.RESTF		;SET THE BOOLEAN TO ENABLE RESTART
	MOVEM	.SGNAM,RUNNAM	;REMEMBER THE NAME
	MOVEM	.SGPPN,RUNPPN	;AND PPN 
	MOVEM	.SGDEV,RUNDEV	;AND DEVICE 
	MOVEM	.SGLOW,RUNEXT	;AND EXTENSION
	JRST	@SETSTA		;RETURN

RESTAR::SKIPL	.RESTF		;ARE WE ENABLED
	RETURN			;NO FORGET IT
	MOVEI	T1,RUNDEV	;RUN DEVICE
	HRLI	T1,2		;IDENTIFY THE RESTART
	RUN	T1,		;MAYBE YOU GO
	MOVE	T1,[SIXBIT /DAEMON/]	;CHANGE NAME IF TRUE
	CAME	T1,RUNNAM		;ELSE EXITS DO NOT WORK
	RETURN
	HLLZS	T1			;GET DAE NAME
	SETNAM	T1,			;SET THE NAME
	RETURN

.RESTF:	Z			;IMPURE RESTART FLAG
RUNDEV:	Z			;NAME OF RUN DEVICE
RUNNAM:	Z			;NAME OF RUN DEVICE
RUNEXT:	Z			;NAME OF EXTENSION
	Z
RUNPPN:	Z			;OWNERS PPN
	Z			;NO CORE ARGUMENT
	ENDMOD
	SEARCH	C,INFSYM
	DOINT	(ILU)		;SET ILLEGAL USER TRAP
	SEARCH	C,INFSYM
	DOINT	(ILM)		;SET ILLEGAL MEMORY TRAP
	SEARCH	C,INFSYM
	DOINT	(ADC)		;SET ADDRESS CHECK TRAP
	SEARCH	C,INFSYM
	DOINT	(PDL)		;PUSH DOWN LIST TRAP
	SEARCH	C,INFSYM
	DOINT	(NXM)		;NONEXISTING MEMORY TRAP
	SEARCH	C,INFSYM
	DOINT	(EJE)		;EXTERNAL JOB ERROR
	TITLE	RUNNUM
	ENTRY	RUNNUM,ZAPRUN
	SEARCH	C,INFSYM
	EXTERN	TPOPJ,CPOPJ1,SIXNUM,CPOPJ

;RUNNUM IS CALLED TO FIGURE IT HOW MANY TIMES
;A PROGRAM HAS BEEN RUN AND TO INCREASE THE RUN NUMBER
;THERE ARE 2 CALLS:
;1 A CALL TO JUST UPDATE THE RUN NUMBER (.V EQL 0)
;2 A CALL TO UPDATE THE NUMBER AND CHECK THE LEGALALITY
;  OF THE USER AND VERIFY WHTHER THE RERUN WAS 'TOO SOON'
;THIS IS DONE BY WRITING A TEMP FILE WITH THE NAME
;XXX'XXX.TMP XXX=JOB NUMBER IN 6 BIT
;AND CHECKING A PROGRAM PASSWORD
;TO PREVENT AN INFINITE LOOP THE CURRENT TIME HAS TO EXCEED
;A USER SPECIFIED MARGIN IN MILLISECONDSZERO VALUES WILL BE
;REJECTED.
;TO USE THIS FACILITY (2) THE USER MUST CALL RUNNUM WITH
;THE ADDRESS OF A PARAMETER BLOCK IN V,
;THE LAY OUT OF THIS PARAMETER BLOCK IS:
;WORD 0	THIS WILL BE USED TO CHECK THE TMP FILE(PASSWORD)
;WORD 1 THIS WILL BE SET TO THE START NUMBER OF THE RUN
;WORD 2 CONTAINS THE MINIMUM TIME DELTA BETWEEN SUCCESSIVE RUNS

RUNNUM:	SAVE	V		;PARAMETER BLOCK
	PJOB	V,		;GET JOB NUMBER
	CALL	SIXNUM		;CONVERT IT
	JRST	TPOPJ		;GO BACK WRONG!
	RESTORE	V		;GET PARAMETER BLOCK ADDRESS BACK
	HRLZM	T1,NAME		;STORE NAME PART
	MOVEI	T1,NAME		;POINT TO ARG BLOCK
	HRLI	T1,.TCRRF	;READ FUNCTION
	TMPCOR	T1,		;GET RESULT INT2,T3,TT4,T5
	JRST	NEW		;FIRST RUN
	SKIPN	V		;VERIFICATION REQUIRED?
	AOJA	T3,WRFILE	;NO WRITE THE FILE AGAIN
	CAME	T2,(V)		;IS PASSWORD OKAY?
	JRST	NEW		;(NO) MUST BE NEW
;THIS IS CLEARLY A RESTART
	ADDI	T3,1		;INCREASE SEQ NUMBER
	DATE	T1,		;GET THE DATE
	CAMN	T1,T4		;THE SAME DAY??
	JRST	SAMED		;(YES) CHECK TIME
	MOVE	T4,T1		;RESET DAY
	MSTIME	T5,		;GET TIME
	JRST	WRFILE		;WRITE THE NEW FILE
SAMED:	MOVE	T1,2(V)		;GET THE ALLOWABLE DIFFERENCE
	JUMPE	T1,CPOPJ	;THERE MUST BE A DIFFRENCE
	ADD	T1,T5		;GET OLD TIME
	MSTIME	T5,		;GET THE CURRENT TIME
	CAMGE	T5,T1		;IS INTERVAL PERMISSIBLE??
	RETURN			;CRASH DIFFERENCE IS TOO SMALL
	JRST	WRFILE		;WRITE IT AGAIN
NEW:	MOVE	T2,(V)		;GET PASSWORD
	SETZ	T3,		;ZAP SEQ #
	DATE	T4,		;GET THE DATE
	MSTIME	T5,		;AND TIME
WRFILE:	MOVSI	T1,.TCRWF	;WRITE THE FILE
	HRRI	T1,NAME
	TMPCOR	T1,		;DELETE PREVIOOUS VERSION
	RETURN			;TOO BAD 
	SKIPN	V		;VERIFICATION CALL?
	SKIPA	V,T3		;NO RETURN RUN VALUE
	MOVEM	T3,1(V)		;STORE THE SEQUENCE NUMBER
	JRST	CPOPJ1		;THAT'S ALL

;ZAPRUN ZAPS THE TMPCOR FILE
;THEREBY MAKING REFINDING OF OLD RUN DATA IMPOSSIBLE

ZAPRUN:	PJOB	V,		;GET JOB NUMBER
	CALL	SIXNUM		;GET THE JOB NUMBER IN 6 BIT
	RETURN			;YOU HAD A BAD NUMBER BOY
	HRLZM	T1,NAME		;SET NAME FIELD
	HRRI	T1,NAME		;POINT TO ARG BLOCK
	HRLI	T1,.TCRDF	;READ AAND DELETE FILE
	TMPCOR	T1,		;ZAP IT
	RETURN
	JRST	CPOPJ1		;ALL SET SIR

NAME:	Z			;NAME,,0 FOR TMPCOR UUO
	IOWD	4,T2		;READ INTO ACCUS
	ENDMOD
	TITLE	SIXNUM
	ENTRY	SIXNUM
	SEARCH	INFSYM

;CONVERT THE BINARY IN ACCU V IN A STRING OF ALPHANUMERICS
;THE NUMBER IS HAS LESS THAN 6 DIGITS!!
;THE STRING IS RETURNED IN T1
;THE ERROR RETURN IS GIVEN IF THE NUMBER HAS MORE THAN 6 DIGITS
;THE STRING IS RIGHT ADJUSTED WITH LEADING SIBIT ZERO

SIXNUM:	TLNE	V,-1		;AN ILLEGAL NUMBER??
	RETURN			;(YES) GIVE THE FALSE RETURN
	MOVE	T2,[POINT 6,T1]	;GET POINTER TO T1
	MOVE	T3,[POINT 3,V,17]	;GET POINTER TO BINARY
SIXNU0:	ILDB	T4,T3		;GET A DIGIT
	ADDI	T4,20		;MAKE IT 6 BIT
	IDPB	T4,T2		;STORE THE CHARACTER
	TLNE	T2,770000	;FILLED THE WORD??
	JRST	SIXNU0		;NO FILL MORE
	JRST	CPOPJ1##	;SKIP RETURN
	ENDMOD
	SEARCH	INFSYM

	ENTRY	CPOPJ2,CPOPJ
	ENTRY	TPOPJ2,TPOPJ1,TPOPJ
	ENTRY	VPOPJ

TPOPJ2:	POP	P,T1
CPOPJ2:	AOSA	(P)
TPOPJ1:	POP	P,T1
	AOSA	(P)
TPOPJ:	POP	P,T1
CPOPJ:	POPJ	P,

VPOPJ:	POP	P,V		;RESORE V
	RETURN			;AND RETURN
	ENDMOD
	TITLE	CPOPJ1
	ENTRY	CPOPJ1
	SEARCH	INFSYM

;PREVENT GLOBAL CONFLICT WITH SCANER

CPOPJ1:	AOS	(P)	;RETURN +1
	RETURN
	ENDMOD
	TITLE	ERROR
	ENTRY	ECOD7,ECOD6,ECOD5,ECOD4,ECOD3,ECOD2,ECOD1,ECOD0
	SEARCH	INFSYM

;GIVE ERROR VALUES BACK IN REGISTER T1,THIS PRESERVES V!

ECOD7:	JSP	T1,ECO0		;ZERO BASE
ECOD6:	JSP	T1,ECO0
ECOD5:	JSP	T1,ECO0
ECOD4:	JSP	T1,ECO0
ECOD3:	JSP	T1,ECO0
ECOD2:	JSP	T1,ECO0
ECOD1:	JSP	T1,ECO0
ECOD0:	JSP	T1,ECO0
ECO0:	HRRZS	T1		;ZAP PROCESSOR FLAGS
	SUBI	T1,ECO0		;REDUCE THE PC
	RETURN
	ENDMOD
	END