.TITLE *** REMOVE MCR FUNCTION ***
/
/ COPYRIGHT (C) 1975
/ DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/ THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
/ ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
/ THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS
/ SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO-
/ VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON
/ EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO
/ THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE
/ SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
/
/ THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
/ WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM-
/ MITMENT BY DIGITAL EQUIPMENT CORPORATION.
/
/ DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
/ OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY
/ DEC.
/
	.EJECT
/ EDIT #14
/
/
/ MCR FUNCTION -- REMOVE	26 SEP 71	R. MCLEAN
/					6/3/72	D. MCMILLAN
/					4/5/73	M. HEBENSTREIT
/					6/3/75	M. HEBENSTREIT
/
/ TASK NAME  "...REM"   TO REMOVE A TASK FROM THE SYSTEM TASK LIST.
/
/ THE FIRST LINE OF THE COMMAND INPUT FOR ANY MCR
/ FUNCTION IS READ BY THE RESIDENT MCR TASK ("...MCR").
/ FOR THE "REMOVE" FUNCTION, THERE IS ONLY ONE LINE OF
/ COMMAND INPUT, AND IT'S SYNTAX IS AS FOLLOWS:
/
/	SYNTAX = 'REM'$<NBC><BREAK CHARACTER><TASK NAME>
/		(<CR>/<AM>)
/	<BREAK CHAR> = " "/","
/	<TASK NAME> = 1-6 ALPHANUMERIC CHARACTERS
/	<CR> = CAR RTN
/	<AM> = ALTMODE
/	<NBC> = NON BREAK CHARACTER
/	$ -- " ANY NUMBER OF "INCLUDING ZERO "
/
/	THE RESIDENT MCR READS A LINE, FETCHES THE
/	FIRST THREE CHARACTERS TO FORM THE MCR FUNCTION TASK
/	NAME ("...REM"), FLUSHES CHARACTERS THRU THE FIRST
/	BREAK CHARACTER, REQUESTS "...REM", AND EXITS
/	THE TASK "...REM " PROCESSES THE REMAINDER OF THE LINE
/	AND IF THE REQUEST IS VALID, ISSUES AN APPROPRIATE "REMOVE"
/	DIRECTIVE.
/
/	IF THE COMMAND INPUT LINE IS TERMINATED BY A CAR RTN,
/	THE RESIDENT MCR TASK IS REQUESTED, AND THE FUNCTION TASK
/	EXITS.
/
/	IF THE COMMAND INPUT LINE IS TERMINATED BY AN ALTMODE, THE
/	FUNCTION TASK EXITS WITHOUT REQUESTING "...MCR". A ^C TYPEIN
/	IS THEN NECESSARY TO RE-ESTABLISH MCR DIALOGUE.
 .TITLE *** MCR FUNCTION 'REMOVE'
/
MCRRI=171
FAC=174
SNAM=123
.ENB=705521
.INH=705522
POOL=240
NADD=107
NDEL=112
R1=101
R2=102
STKL=242
X10=10
P.TC=47
REMBLK=311
IDX=ISZ
ECLA=641000
/
REM	LAW	-7	/SET UP TO FETCH TASK NAME AND STORE
	DAC	CNT	/SIX CHARACTERS (ZERO RIGHT FILL) 
	LAC*	(REMCTA+3	/IS A REM BLK ALLOCATED?
	SAD	(400
	JMP	.+3
	LAC	(MES7	/NO -- ERROR
	JMP	DSKERR+1
	LAC	(REMNAM+1)
	DAC*	(X10)
/
REMN1	JMS*	(FAC)	/FETCH A CHARACTER
	SAD	(054)	/ IS IT A COMMA?
	JMP	ERR1	/YES -- ERROR IN SYNTAX
	SAD	(040)	/NO -- BLANK?
	JMP	ERR1	/YES -- ERROR IN SYNTAX
	SAD	(015)	/NO -- CAR RTN?
	JMP	ENDCRA	/YES-- END OF REQUEST
	SAD	(175)	/NO -- ALTMODE?
	JMP	ENDCRA	/YES-- END OF REQUEST
	DAC*	X10	/NO -- STORE CHARACTER
	ISZ	CNT	/LAST CHARACTER OF TASK NAME?
	JMP	REMN1	/NO -- GET NEXT CHARACTER
ERR1	LAC	(MES2)	/GET MESSAGE ADDRESS SYNTAX ERROR
	DAC	TYPCPB+4	/PUT IN TYPE REQUEST
	JMP	ERRTY	/REQUEST MCR AND RETURN
/
ENDCRA	DAC	SVBKCH	/SAVE CAR RTN OR ALTMODE
REMN2	DZM*	X10	/FILL REMAINING CHARACTERS WITH ZERO
	ISZ	CNT
	JMP	REMN2
/
	LAC	REMNAM+4	/FORM FIRST HALF OF TASK NAME
	LRS	6
	LAC	REMNAM+3
	LRS	6
	LAC	REMNAM+2
	SNA		/IS THIS A NULL NAME?
	JMP	ERR1	/YES EXIT WITH ERROR
	LLS	14
	DAC	REMNAM+2	/STORE FIRST HALF OF WORD IN REMNAM
	LAC	REMNAM+7	/FORM SECOND HALF OF TASK NAME
	LRS	6
	LAC	REMNAM+6
	LRS	6
	LAC	REMNAM+5
	LLS	14
	DAC	REMNAM+3
	LAC	(REMNAM+2)	/PICK UP POINTER TO TASK NAME
	DAC*	(R2)	/SAVE IT IN R2 FOR SNAM
	LAC	(STKL)	/PICK UP POINTER TO SYSTEM TASK LIST HEAD
	DAC*	(R1)	/SAVE IT ALSO
	JMS*	(SNAM)	/LOOK FOR PROGRAM IN SYSTEM TASK LIST
	JMP	ERTTYA	/TASK NOT IN SYSTEM ERROR
	DAC	STLNOD	/SAVE STKL NODE ADDRESS
	AAC	4	/ADD 4 TO PICK UP FLAGS
	DAC	FLAGS	/SAVE POINTER TO FLAGS
	IAC
	DAC	PARBA	/PARTITION BLOCK ADDRESS
	IAC
	DAC	CNT	/SAVE DISK ADDRESS POINTER
	LAC	(400002)	/RAISE TO LEVEL 6 TO PREVENT EXIT
	ISA		/DURING CANCEL
	.INH		/INHIBIT INTERRUPTS WHILE MODIFYING FLAGS
	LAC*	FLAGS	/PICK UP FLAGS
////////////////////////////////////////////////////////////////
//
//  DELETE ON EXIT NOT IMPLEMENTED SO EXIT WITH ERROR
//    IF TASK ACTIVE
//
////////////////////////////////////////////////////////////////
	SPA
	JMP	ACTIVE
	AND	(577777)	/MASK OFF DISARM AND REMOVE ON EXIT BITS
	XOR	(200000)	/YES SET REMOVE ON EXIT FLAGS
	.ENB		/ENABLE INTERRUPTS
	DAC*	FLAGS	/RESTORE FLAGS
	AND	(040000)	/MASK OFF FIXED IN CORE BITS
	SNA		/IS IT FIXED IN CORE?
	JMP	NOTFIX	/NO DON'T FREE PARTITION
	LAC*	PARBA	/PICK UP THE PARTITION BLOCK POINTER
	AAC	P.TC	/MOVE POINTER TO THE PARTITION BUSY FLAG
	DAC	PARBA
	LAC*	PARBA	/PICK UP THE FLAGS WORD
	AAC	-1	/FREE PARTITION
	DAC*	PARBA
NOTFIX	CAL	REMNAM	/ISSUE CANCEL DIRECTIVE
	LAC	STLNOD	/NO -- DELETE NODE FROM STKL
	DAC*	(R1)
	JMS*	(NDEL)	/DELETE NODE
	LAC*	FLAGS	/IS TASK BUFY
	DBK
/////////
//    CHECK FOR TASK ACTIVE GOES HERE
/////////
	LAC*	CNT	/PICK UP DISK ADDRESS
	ADD	(400\777777)	/SUBTRACT 400 IN ONE'S COMP. ARITHMETIC
	AND	(000377)	/MASK OFF UNIT NUMBER
	DAC	CNTRLU	/SAVE IT IN CPB
	LAC*	CNT	/PICK UP DISK ADDRESS AGAIN
	ADD	(400\777777)	/SUBTRACT AGAIN
	AND	(777400)	/MASK OFF ADDRESS
	DAC	CNTRLA	/SAVE IT IN CPB FOR DEALLOCATE
	CAL	GETSIZ	/PICK UP THE SIZE OF THE STORAGE
	CAL	WAITEV
	LAC	EV	/CHECK TO SEE IF OK
	SPA
	JMP	DSKERR	/NOT OK DISK ERROR
	CAL	DEALOC	/DEALLOCATE DISK SPACE
	CAL	WAITEV	/WAIT FOR DEALLOCATE TO COMPLETE
	LAC	EV	/CHECK TO SEE IF OK
	SPA
	JMP	DSKERR	/NO OK DISK ERRROR
	LAC*	(REMBLK
	LMQ
	LLSS!ECLA 10
	DAC	REMCTA
	LACQ
	DAC	REMCTA+1
	CAL	GETREM	/GET THE REMOVE BLOCK
	CAL	WAITEV
	LAC	EV	/WERE THERE ANY ERRORS?
	SPA
	JMP	DSKERR	/YES
REM1	LAC	BUFF+376	/NO -- IS THERE ROOM IN THIS BLOCK?
	SAD	(376
	JMP	GETSOM	/NO -- ALLOCATE ANOTHER BLOCK
	TAD	(BUFF	/YES
	DAC	TEMP
	LAC	REMNAM+2	/ENTER NAME INTO BLOCK
	DAC*	TEMP
	IDX	TEMP
	LAC	REMNAM+3
	DAC*	TEMP
	IDX	BUFF+376
	IDX	BUFF+376
	CAL	PUTREM
	CAL	WAITEV	/THE BLOCK HAS BEEN WRITTEN OUT
	LAC	EV
	SPA
	JMP	DSKERR	/THER WAS AN ERROR ON THE DISK PUT
	JMP	REMNOD	/NO ERROR -- GO REMOVE THE NODE
GETSOM	CAL	ALLO	/ALLOCATE A BLOCK
	CAL	WAITEV
	LAC	EV	/WERE THERE ANY ERRORS?
	SPA
	JMP	FILERR	/YES
	LAC	ALLCTA+2	/NO -- WHATS THE BLOCK NUMBER
	LMQ
	LAC	ALLCTA+1
	AND	(7777
	LRSS	10
	LACQ
	DAC	BUFF+377	/SAVE THE NEXT BLOCK NUMBER
	CAL	PUTREM	/WRITE OUT THE BLOCK
	CAL	WAITEV
	LAC	EV	/ANY ERRORS?
	SPA
	JMP	DSKERR	/YES
	LAC	(BUFF-1	/NO -- ZERO THE BLOCK
	DAC*	(X10
	DZM*	X10
	LAC*	(X10
	SAD	(BUFF+376
	SKP
	JMP	.-4
	LAW	-1
	DAC	BUFF+377
	LAC	ALLCTA+2
	DAC	REMCTA+1
	LAC	ALLCTA+1
	DAC	REMCTA
	JMP	REM1
REMNOD	LAC	STLNOD	/ADD NODE TO EMPTY POOL
	DAC*	(R2)
	LAC	(POOL)
	DAC*	(R1)
	JMS*	(NADD)	/ADD NODE TO EMPTY POOL
	JMP	EXT1A	/EXIT
ERTTYA	LAC	(MES3)
	DAC	TYPCPB+4	/PRINT TASK NOT IN SYSTEM ERROR
ERRTY	CAL	TYPCPB	/MAKE TYPE CPB REQUEST
	CAL	WAITEV	/WAIT FOR ERROR MESSAGE TO BE PRINTED
	JMP	EXT2	/FINISHED EXIT
/
DSKERR	LAC	(MES4)
	DAC	TYPCPB+4	/PUT MESSAGE IN BUFFER POINTER
	JMP	ERRTY	/AND TYPE  MESSAGE
/
FILERR	LAC	(MES6
	DAC	TYPCPB+4
	CAL	TYPCPB
	CAL	WAITEV
	JMP	REMNOD
/ 
///////
ACTIVE	.ENB		/ENABLE INTERRUPTS
	DBK		/DEBREAK FROM LEVEL 6
	LAC	(MES1)
	DAC	TYPCPB+4	/PUT MESAGE IN BUFFER
	JMP	ERRTY
/////////
EXT1A	LAC	SVBKCH	/GET TERMINATION CHARACTER
	SAD	(15)	/SKIP IF ALTMODE
EXT2	CAL	REQMCR	/REQUEST MCR TASK
	SAD	(175)	/IF ALTMODE DON'T CLEAR MCRRI
	DZM*	(MCRRI)	/CLEAR ^C SWITCH
	CAL	(10)	/RETURN
/
REQMCR	1		/CALL MCR DIRECTIVE
	0
	.SIXBT	"..."
	.SIXBT	"MCR"
	0
REMNAM	4	/CANCEL DIRECTIVE
	EV	/EVENT VARIABLE ADDRESS
	0	/TASK NAME (FIRST HALF)
	0	/TASK NAME (SECOND HALF)
	.BLOCK	3
FLAGS	0
PARBA	0
STLNOD	0
/
DEALOC	1600	/DEALLOCATE CPB
	EV	/EVENT VARIABLE ADDRESS
	1	/LOGICAL UNIT NUMBER
	CNTRLT	/CONTROL TABLE ADDRESS
/
GETSIZ	3000	/GET A WORD FROM THE DISK
	EV	/EVENT VARIABLE ADDRESS
	1	/LUN NUMBER
	CNTRLU	/CONTROL TABLE ADDRESS
/
GETREM	3000
	EV
	1
	REMCTA
/ 
PUTREM	3100
	EV
	1
	REMCTA
/ 
REMCTA	0
	0
	BUFF
	400
/
ALLO	1500
	EV
	1
	ALLCTA
/
ALLCTA	400
	0
	0
/
CNTRLT	0	/NUMBER OF WORDS TO BE DELETED
CNTRLU	0	/UNIT NUMBER
CNTRLA	0	/DISK ADDRESS
CNTCD	CNTRLT	/CORE ADDRESS FOR GET
	1	/WORD COUNT FOR GET
/
TYPCPB	2700
	EV
	3
	2
	MES3
EV	0
/
WAITEV	20	/WAIT FOR
	EV	/EVENT VARIABLE ADDRESS
/
MES1	MES2-MES1/2*1000+2
	0
	.ASCII	"REM-TASK ACTIVE"<15>
MES2	MES3-MES2/2*1000+2
	0
	.ASCII	"REM-SYNTAX ERR"<15>
MES3	MES4-MES3/2*1000+2
	0
	.ASCII	"REM-TASK NOT IN SYSTEM"<15>
MES4	MES6-MES4/2*1000+2
	0
	.ASCII	'REM-DISK ERR'<15>
MES6	MES7-MES6/2*1000
	0
	.ASCII "ALLOCATE ERROR"<15>
MES7=.
/
/
/
SVBKCH	0
CNT	0
TEMP	0
BUFF	.BLOCK 400
	.END	REM