	.TITLE *** AN OCTAL DEBUGGER FOR RSX ***
/
/ 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 #13      DEC. 31, 1975      M. HEBENSTREIT
/
/ THIS PROGRAM IS AN ODT FOR RSX 
/
/ THE NAME OF THIS TASK IS ARBITRARY.  THERE CAN BE MULTIPLE
/ COPIES OF IT IN CORE SIMULTANEOUSLY, PROVIDED THAT EACH
/ COPY HAS A UNIQUE NAME AND PARTITION, AND EACH ACCESSES
/ DIFFERENT LUNS.  THROUGHOUT THE DESCRIPTION OF THIS TASK
/ IT WILL BE REFERRED TO AS RSXODT.
/
/	THE COMMANDS HONORED BY THIS PROGRAM ARE:
/
/			OPEN A MEMORY LOCATION OR REGISTER
/			START THE PROGRAM TO BE DEBUGGED
/			EXIT AND ABORT THE TASK
/			DEFINE A SYMBOL
/			SET A BREAKPOINT AT SOME LOCATION
/			REMOVE A BREAKPOINT
/			CONTINUE AFTER A BREAKPOINT HAS BEEN REACHED
/			RESTART THE TASK AT SOME LOCATION
/			RELOAD THE TASK KEEPING SYMBOL DEFS AND BRKPTS
/
/			IF THE ASSEMBLY PARAMETER ONEPLS IS DEFINED THE
/			FOLLOWING COMMANDS ARE ALSO HONORED:
/
/			DUMP THE TASK'S PARTITION INTO A CREATED FILE
/			DECODE THE LOCATIONS PRINTED BY OPEN
/			REGISTERS PRINTS THE AC,MQ,LR,XR, AND LINK
/
/	THE SYNTAX OF THESE COMMANDS AND THEIR RESTRICTIONS CAN BE FOUND
/	AT THE BEGINNING OF THE APPROPRIATE SECTION OF CODE.
/
/	TO USE RSXODT TO DEBUG A TASK, INSTALL BOTH THE PROGRAM BEING
/	DEBUGGED AND RSXODT, REASSIGN THE APPROPRIATE LUNS, THEN
/	REQUEST RSXODT FROM EITHER THE MCR OR TDV TERMINAL.
/
/	RSXODT WILL ALWAYS RUN AS AN EXEC MODE TASK IN A PARTITION
/	DISTINCT FROM THAT OF THE TASK TO BE DEBUGGED.
/
/
	.TITLE *** EXPLANATION OF BREAKPOINT HANDLING ***
/
/		WHEN THE 1ST BREAK POINT IS SET, ODT SETS UP A BREAK POINT
/		TRAP TABLE AS FOLLOWS:
/
/			WORD0	XX
/			WORD1	JMS	.+1
/			WORD2	0
/			WORD3	JMP	.
/
/		THIS TABLE IS POSITIONED IN WORDS 0-3 OF THE TASK'S PAR-
/		TITION. ONCE THIS TABLE IS SET UP FOR THE 1ST BREAK POINT
/		THE PROCESS OF SETTING BREAK POINTS PROCEEDS AS FOLLOWS.
/		THE ADDRESS OF THE BREAKPOINT IS SAVED IN THE BREAKPOINT
/		ADDRESS TABLE. (THE ADDRESSES ARE RELATIVE TO THE PARTITIONS BASE.)
/		THE CONTENTS OF THE BREAK POINT LOCATION IS SAVED IN THE 
/		BREAK POINT INSTRUCTION TABLE. THEN THE CONTENTS OF THE
/		BREAK POINT IS CHANGED TO AN XCT* X17 INSTRUCTION.
/		FINALLY X17 IS SET TO POINT TO WORD0 OF THE BREAK POINT
/		TRAP TABLE. WHEN THE TASK REACHES THE BREAK POINT IT EXECUTES
/		THE JMS .+1 INSTRUCTION IN THE BREAK POINT TRAP TABLE.
/		SINCE THE XCT* X17 INSTRUCTION DOES NOT CHANGE THE PC,
/		THE ADDRESS OF THE BREAK POINT CAN BE DETERMINED FROM THE
/		SUBROUTINE HEADER WORD IN THE BREAK POINT TRAP TABLE.
/		THE TASK THEN HANGS IN AN INFINITE LOOP AT THE JMP .
/		INSTRUCTION IN THE BREAK POINT TRAP TABLE. THE MONITOR
/		ROUTINE IN ODT CHECKS PERIODICALLY TO SEE IF THE TASK HAS
/		GOTTEN A CHANCE TO RUN AND IF IT IS HUNG UP AT THE JMP .
/		INSTRUCTION. IF BOTH THESE CONDITIONS ARE MET THEN THE
/		MONITOR ROUTINE SETS THE TASK'S STATUS TO 6 SO LOW
/		PRIORITY TASKS WILL GET A CHANCE TO RUN. THEN ODT
/		INFORMS THE USER THAT THE TASK IS AT SOME SPECIFIED BREAK
/		POINT. IF BOTH CONDITIONS ARE NOT MET, ODT ASSUMES THE TASK
/		IS STILL RUNNING AND CONTINUES TO PERIODICALLY CHECK ON
/		THE STATUS OF THE TASK.IF, AFTER A BREAK POINT IS REACHED,
/		THE USER INDICATES THAT THE TASK SHOULD CONTINUE, ODT PROCEEDS
/		AS FOLLOWS. THE FORMER CONTENTS OF THE LOCATION OF THE
/		BREAK POINT IS ENTERED INTO WORD0 OF THE BREAK POINT TRAP
/		TABLE. THEN WORD 17 (X17) OF THE PARTITION IS SET TO POINT
/		TO LOCATION WORD0-1. THE RESTART ADDRESS IN THE TASK'S PBDL
/		NODE  IS SET SO THE NEXT INSTRUCTION THE TASK WILL EXECUTE
/		IS THE XCT* X17 INSTRUCTION AT THE BREAK POINT LOCATION.
/		FINALLY ODT CHANGES THE TASK'S STATUS FORM 6 TO 5. AT THIS
/		TIME THE TASK CAN CONTINUE AS FOLLOWS. WHEN ITS REGISTERS
/		ARE RESTORED, THE TASK EXECUTES THE XCT* X17 INSTRUCTION
/		CAUSING THE INITIAL CONTENTS OF THE BREAK POINT LOCATION
/		TO BE EXECUTED. AFTERWARDS THE TASK CAN PROCEED NORMAL-
/		LY UNTIL ANOTHER BREAK POINT IS REACHED OR THE TASK EXITS.
/		
/		THE FOLLOWING RESTRICITONS APPLY TO TASKS TO BE DEBUGGED
/		WITH THIS ODT:
/
/		1.) NO TASK CAN MODIFY THE CONTENTS OF VIRTUAL LOC. 17
/		2.) NO TASK CAN MODIFY THE CODE AT A BREAK POINT
/		3.) NO TASK CAN MODIFY VIRTUAL LOCS. 0-3
/		4.) NO TASK CAN HAVE OVERLAYS
/		5.) A BREAK POINT CANNOT BE SET ON AN XCT INSTRUCTION
/		6.) ONLY NORMAL MODE TASKS CAN BE DEBUGGED WITH THIS PROGRAM
/
/		NOTE: BECAUSE THE AUTOINCREMENT REGISTERS FOR NORMAL MODE
/		TASKS ARE LOCATED IN WORDS 10-17 OF THE TASK'S PARTITION,
/		THESE REGISTERS ARE NEVER DESTROYED WHEN THE TASK ISSUES
/		A CAL. HENCE, RSXODT CAN USE X17 FOR BREAKPOINT HANDLING.
/		THIS IS NOT TRUE FOR EXEC MODE TASKS!
/
	.TITLE *** ODT CONSTANTS AND IOT'S ***
/
/ *** ODT CONSTANTS AND IOTS
/
	.IFUND ONEPLS
NO.CMD=11		/NUMBER OF COMMANDS HONORED
	.ENDC
	.IFDEF ONEPLS
NO.CMD=14
	.ENDC
	.IFUND SYMSIZ
SYMSIZ=20		/SYMBOL TABLE SIZE
	.ENDC
	.IFUND BRKSIZ
BRKSIZ=10		/BREAK POINT TABLE SIZE
	.ENDC
REGSIZ=14
	.IFUND LUN
	.DEC
LUN=40			/ODT I/0 LUN
	.OCT
	.ENDC
	.IFUND FILLUN
	.DEC
FILLUN=41		/ODT CREATED FILE LUN (MUST BE A DISK)
	.OCT
	.ENDC
	.IFUND	TIME
TIME=10			/NUMBER OF TIMES MONITOR ROUTINE SHOULD MARK TIME
			/BEFORE ASKING IF THE TASK SHOULD BE ABORTED.
			/EACH MARK TIME REQUEST SUSPENDS RSXODT FOR 1 SEC.
	.ENDC
ATL=244			/LISTHEAD FOR THE ATL
STL=242			/LISTHEAD FOR THE STL
SNAM=123		/ADDRESS OF FIND A NAME REENTRANT SUBROUTINE
R1=101			/REENTRANT REGISTER 1
R2=102			/REENTRANT REGISTER 2
CURTSK=135		/POINTER TO ATL NODE OF CURRENT TASK
X10=10			/AUTOINCREMENT REGISTER 10
X11=11			/AUTOINCREMENT REGISTER 11
X12=12			/AUTOINCREMENT REGISTER 12
.INH=705522		/INHIBIT INTERRUPTS IOT
.ENB=705521		/ENABLE INTERRUPTS IOT
IDX=ISZ			/USED IF INTENT IS TO INCREMENT BUT NOT TO SKP
	.TITLE *** ODT INITIALIZATION ***
/
/ *** ODT INITIALIZATION
/
/
/ GET THE XR ADJUSTMENT FACTOR
/
BEGIN	LAC	(BEGIN		/GET THIS ADDRESS
	AND	(70000		/SAVE ONLY THE HIGH BITS
	TCA			/NEGATE
	DAC	XRADJ		/STORE THE XR ADJUSTMENT FACTOR
/
/ GET THE NAME OF THIS TASK
/
	CAL	TSKNAM		/ISSUE THE TASK NAME DIRECTIVE
	LAC	(14		/CONVERT THE TSKNAM DIRECTIVE'S CPB
	DAC	REQODT		/INTO A SYNC CPB FOR THIS TASK
/
/ PRINT THE ODT HEADER
/
LOCB	JMS	ATTACH		/ATTACH THE OUTPUT DEVICE
	LAC	(MSGBL		/PRINT A BLANK LINE
	JMS	PRINT
	LAC	(MSGBL		/PRINT A BLANK LINE
	JMS	PRINT
	LAC	(MSGHDR		/PRINT THE HEADER
	JMS	PRINT
	LAC	(MSGBL		/PRINT A BLANK LINE
	JMS	PRINT
/
/ GET THE TASK NAME
/
	LAC	(MSGNAM		/PRINT THE QUESTION ASKING FOR TASK NAME
	JMS	PRINT
	JMS	READ		/READ A LINE
	JMS	IFAC		/INIT. FAC VARIABLES
	INBUFF			/BUFFER ADDRESS
	CLA			/CLEAR AC TO DENOTE NO CHAR IS IN IT
	JMS	GETNAM		/GET THE TASK NAME
	NAME1			/TASK NAME BUFFER
	JMP	ERRNAM		/RETURN HERE ON ERROR
	JMS	CR		/RETURN HERE IF OK -- CHECK THE LINE TERM.
	JMP	ERRNAM		/RETURN HERE IF IT'S NOT A TERM. -- ERROR
/
/ FIX THE TASK IN CORE
/
LOCA	JMS	DETACH		/REURN HERE IF OK -- DETACH THE I/O DEVICE
	LAC	(ATL		/SET UP TO SCAN ATL FOR ODT
	DAC*	(R1		/SET R1 TO ATL LISTHEAD
	LAC	(REQODT+2
	DAC*	(R2		/SET R2 TO POINT AT RSXODT'S NAME
	JMS*	(SNAM		/SCAN THE ATL
	JMP	ERREX		/RETURN HERE IF NOT FOUND -- IMPOSSIBLE
	JMS	SETXR		/RETURN HERE IF FOUND -- SET UP TO ACCESS ODT'S ATL NODE
	LAC	4,X		/GET ODT'S PRIORITY
	IAC			/SET UP TO REQUEST TASK AT PRIO PLUS 1
	DAC	PRIOR		/SAVE PRIORITY IN REQUEST CPB
	LAC	NAME1		/SET UP THE REQUIRED CPB'S - GET TASK NAME
	DAC	UNFIX+2		/SAVE 1ST 1/2 OF TASK NAME IN UNFIX CPB
	DAC	REQTSK+2	/SAVE THIS IN REQUEST CPB
	.IFDEF ONEPLS
	DAC	CRECTA+0	/SAVE 1ST 1/2 OF NAME IN CREATE CONTROL TABLE
	DAC	DELETE+3	/AND IN DELETE CPB
	.ENDC
	LAC	NAME2		/GET 2ND 1/2 OF TASK NAME
	DAC	UNFIX+3		/SAVE THIS IN UNFIX CPB
	DAC	REQTSK+3	/AND IN REQUEST CPB
	.IFDEF ONEPLS
	DAC	CRECTA+1	/SAVE 2ND 1/2 OF NAME IN CREATE CONTROL TABLE
	DAC	DELETE+4	/AND IN DELETE CPB
	.ENDC
	CAL	FIX		/FIX THE TASK
	CAL	WAIT		/WAIT FOR COMPLETION
	LAC	EV		/WHERE THERE ANY ERRORS?
	SPA
	JMP	ERRFIX		/YES
/
/ INITIALIZE VARIOUS DATA ITEMS FOR THIS TASK
/
	LAC	(STL		/NO -- SET UP TO SCAN STL FOR THIS TASK
	DAC*	(R1		/SET R1 TO STL LISTHEAD
	LAC	(NAME1
	DAC*	(R2		/SET R2 TO POINT AT TASK NAME
	JMS*	(SNAM		/SCAN THE STL
	JMP	ERRSYS		/RETURN HERE IF TASK NOT IN STL -- SYSTEM ERROR!
	JMS	SETXR		/RETURN HERE IF IN STL -- PREPARE TO ACCESS STL NODE
	LAC	11,X		/GET THE START ADDR AND FLAGS
	AND	(100000		/AND OFF EVERYTHING BUT THE NRM/EXM FLAG
	SNA			/IS THE TASK NORMAL MODE?
	JMP	ERREXM		/NO -- ERROR
	LAC	5,X		/YES -- GET THE PBDL NODE ADDR.
	DAC	PBADR		/SAVE IT
	JMS	SETXR		/PREPARE TO ACCESS PBDL NODE
	LAC	4,X		/GET BASE OF PARTITION
	DAC	PBASE		/SAVE IT
	.TITLE *** ODT COMMAND DISPATCH ROUTINE ***
/
/ *** GET AND DISPATCH A COMMAND
/
LOC0	JMS	ATTACH		/ATTACH THE I/O DEVICE
	DZM	CMD		/ZERO THE COMMAND WORDS
	DZM	CMD+1
	LAC	(MSGBL
	JMS	PRINT
	LAC	(MSGQUE		/PRINT THE COMMAND PROMPTER
	JMS	PRINT
	JMS	READ		/READ A LINE
	JMS	IFAC		/INIT. FAC VARIABLES
	INBUFF			/BUFFER ADDRESS
	CLA			/CLEAR AC TO DENOTE NO CHAR THERE
	JMS	GETNAM		/STORE THE COMMAND
	CMD			/COMMAND BUFFER
	JMP	ERRCMD		/RETURN HERE ON ERROR
LOC5	SAD	(40		/RETURN HERE IF OK -- IS BREAK CHAR A SPACE?
	JMP	LOC4		/YES
	SAD	(15		/NO -- A CR?
	JMP	LOC4		/YES
	SAD	(175		/NO -- ALTMODE?
	JMP	LOC4		/YES
	JMS	FAC57		/NO -- READ ANOTHER CHAR 
	JMP	LOC5		/GO SEE IF IT'S A BREAK CHAR
LOC4	DAC	TERM		/YES -- SAVE THE COMMAND TERMINATOR
	LAC	(CMDTBL-1	/SET UP TO SCAN LEGAL COMMAND TABLE
	DAC*	(X10		/INIT. X10 TO POINT TO COMMAND TABLE
	LAW	-NO.CMD		/SET UP A COMMAND COUNTER (-# CMD'S)
	DAC	TEMP		/SAVE COUNTER IN TEMP
	LAC	CMD		/GET THE SIXBT REP. FOR THIS COMMAND
LOC1	SAD*	X10		/DOES THE COMMAND MATCH TABLE ENTRY?
	JMP	LOC2		/YES -- PREPARE TO DISPATCH
	ISZ	TEMP		/NO -- ARE WE AT THE END OF THE TABLE?
	JMP	LOC1		/NO -- GO CONSIDER NEXT TABLE ENTRY
	JMP	ERRCMD		/YES -- ERROR - ILLEGAL COMMAND
/
/ *** COMMAND TRANSFER ROUTINE
/
LOC2	LAC	TEMP		/GET COMMAND COUNT INTO AC (<0)
	AAC	NO.CMD+1	/ADD DISPATCH TABLE OFFSET (# CMD'S +1)
	TAD	(JMP	LOC3	/ADD "JMP LOC3" INSTRUCTION
	DAC	LOC3		/SAVE RESULT IN NEXT LOCATION
LOC3	XX			/THIS INSTRUCTION IS MODIFIED TO JMP .+N
/
/ COMMAND DISPATCH VECTOR
/
	JMP	START
	JMP	OPEN
	JMP	SET
	JMP	CONTIN
	JMP	REMOVE
	JMP	DEFINE
	JMP	EXIT
	JMP	RESTAR
	JMP	RELOAD
	.IFDEF ONEPLS
	JMP	DUMP
	JMP	DECODE
	JMP	REGIST
	.ENDC
	.TITLE *** ODT START COMMAND ***
/
/ START COMMAND -- FORMAT: >STA(RT)
/
/			THIS COMMAND CAN BE USED ONLY IF THE TASK
/			HAS NOT ALREADY BEEN STARTED.
/
START	LAC	STFLAG		/HAS THE TASK ALREADY BEEN STARTED?
	SZA
	JMP	ERRST		/YES -- ERROR
	CLA!IAC			/NO -- SET THE 'STARTED' FLAG
	DAC	STFLAG
	CAL	REQTSK		/REQUEST THE TASK
	CAL	WAIT		/WAIT FOR THE 'REQUEST' DIRECTIVE
	LAC	EV		/PICK UP EV
	SPA			/WHERE THERE ANY ERRORS?
	JMP	ERRREQ		/YES
	JMS	DETACH		/NO -- DETACH THE DEVICE
	JMP	MONITOR		/GO MONITOR THE TASK'S PROGRESS
	.TITLE *** ODT DEFINE A SYMBOLIC ADDRESS COMMAND ***
/
/ DEFINE COMMAND -- FORMAT: >DEF(INE) XXX=NNNNNN
/
/			WHERE XXX IS A 1-3 CHARACTER SYMBOL AND
/			NNNNNN IS ANY OCTAL NUMBER. AFTER THE
/			FIRST THREE CHARACTERS OF A SYMBOL THE
/			SUBSEQUENT CHARACTERS ARE IGNORED.
/
/			NOTE: UNLIKE OTHER COMMANDS NNNNNN CANNOT BE A SYMBOL
/
/			THIS COMMAND IS LEGAL ANYTIME.
/
DEFINE	CLA			/CLEAR AC TO DENOTE THERE'S NO CHAR THERE
	JMS	GETNAM		/GET THE SYMBOL
	SYMBOL			/SYMBOL BUFFER ADDRESS
	JMP	ERRNUM		/RETURN HERE ON ERROR
DEF2	SAD	(75		/RETURN HERE IF OK -- IS BREAK CHAR AN = ?
	SKP
	JMP	ERRNUM		/NO -- ERROR
	CLA			/YES -- CLEAR AC TO DENOTE NO CHAR THERE
	JMS	GETNUM		/GET THE VALUE
	JMP	ERRNUM		/RETURN HERE ON AN ERROR
	DAC	TEMP		/RETURN HERE IF OK -- SAVE NUMBER
	LACQ			/CHECK THE LINE TERM -- RETRIEVE FROM MQ
	JMS	CR		/GO CHECK IT
	JMP	ERRNUM		/IT'S NOT A CR OR ALT -- ERROR
	LAW	-SYMSIZ		/CHAR IS TERM -- SCAN THE SYMBOL TABLE FOR THIS SYMBOL
	DAC	TEMP1		/SET TEMP1 TO BE COUNTER OF SYMBOL TAB ENTRIES
	LAC	(SYMTAB-1	/SET UP X10 TO POINT TO SYMBOL TAB
	DAC*	(X10
	LAC	SYMBOL		/GET THE SYMBOL NAME INTO AC
DEF3	SAD*	X10		/DOES THIS SYMBOL MATCH THE ONE ALREADY IN TAB.?
	JMP	DEF4		/YES
	ISZ	TEMP1		/NO -- END OF TABLE?
	JMP	DEF3		/NO -- LOOK AT NEXT TABLE ENTRY
	JMP	DEF1		/YES -- PREPARE TO ENTER A NEW SYMBOL
/
/ THE NAME OF THIS SYMBOL IS ALREADY IN THE TABLE. REPLACE IT'S OLD VALUE
/
DEF4	LAC*	(X10		/SET A NEW VALUE IN TABLE FOR SYMBOL
	TAD	(SYMSIZ-1	/MAKE X10 POINT TO VALUE TABLE
	DAC*	(X10
	LAC	TEMP		/GET THE NEW VALUE
	DAC*	X10		/SAVE IT IN THE VALUE TABLE
	JMS	DETACH		/DETACH THE I/O DEVICE
	JMP	LOC0		/GO PROCESS A NEW COMMAND
/
/ ENTER A NEW SYMBOL AND VALUE INTO THE TABLES
/
DEF1	ISZ	SYMCNT		/IS THERE ANY MORE ROOM IN SYMBOL TABLE?
	SKP			/YES
	JMP	ERRTAB		/NO -- ERROR
	LAC	TEMP		/SET VALUE INTO VALUE TABLE
	DAC*	VALPTR		/STORE VALUE IN VALUE TABLE
	IDX	VALPTR		/INCREMENT POINTER TO VALUE TABLE
	LAC	SYMBOL		/GET THE SYMBOL NAME
	DAC*	SYMPTR		/STORE IT IN THE SYMBOL TABLE
	IDX	SYMPTR		/INCREMENT POINTER TO SYMBOL TABLE
	JMS	DETACH		/DETACH THE I/O DEVICE
	JMP	LOC0		/GO PROCESS A NEW COMMAND
	.TITLE *** ODT RESTART COMMAND ***
/
/ RESTART COMMAND -- FORMAT: >RES(TAR) NNNNNN
/
/			WHERE NNNNNN IS AN ADDRESS RELATIVE TO THE
/			BASE OF THE TASK'S PARTITION PLUS 20 OCTAL.
/
/			NOTE: NNNNNN COULD BE A SYMBOL 
/
/			THIS COMMAND IS LEGAL ONLY IF THE TASK IS AT A BRKPT
/
RESTAR	LAC	BRKPT		/IS THE TASK AT A BRKPT?
	SNA
	JMP	ERRCON		/NO -- ERROR
	CLA			/YES -- CLEAR AC TO DENOTE NO CHAR THERE
	JMS	GETNUM		/GO GET THE RESTART ADDR
	JMS	GETSYM		/RETURN HERE ON ERROR -- MAYBE SYMBOL
	AAC	20		/RETURN HERE IF OK -- ADD 20
	DAC	TEMP		/SAVE THE ADDRESS
	LACQ			/GET THE LINE TERM FROM MQ
	JMS	CR		/GO CHECK THAT IT'S A CR OR ALT.
	JMP	ERRNUM		/RETURN HERE ON ERROR
	JMS	ADRCHK		/RETURN HERE IF OK -- CHECK THE ADDRESS
	LAC	PBASE		/RESET X17 SO NEXT BREAKPOINT WILL WORK OK
	JMS	SETXR		/SET UP XR TO ACCESS PART. BASE
	CLA			/ZERO X17
	DAC	17,X
	JMP	CONT3		/GO ENTER RESTART ADDRESS INTO PBDL
				/AND SET UP TASK STATUS SO TASK CAN RUN
	.TITLE *** ODT RELOAD COMMAND ***
/
/ RELOAD COMMAND -- FORMAT: >REL(OAD)
/
/			THIS COMMAND WILL CAUSE THE TASK TO BE ABORTED
/			AND SUBSEQUENTLY RELOADED WITH BREAKPOINTS.
/			SYMBOL DEFINITIONS WILL BE RETAINED.
/
/			THIS COMMAND IS LEGAL ANYTIME.
/
RELOAD	DZM	STFLAG		/CLEAR THE START FLAG
	DZM	RBPFLG		/CLEAR THE REMOVED BRKPT FLAG
	DZM	BRKPT		/CLEAR THE BREAKPOINT FLAG
	CAL	UNFIX		/UNFIX THE TASK
	CAL	WAIT		/WAIT FOR COMPLETION
	JMS	ATLSCN		/SCAN ATL FOR THE TASK
	JMP	REL3		/RETURN HERE IF NOT FOUND
	JMS	SETXR		/RETURN HERE IF FOUND -- SET UP XR
	LAC	(4		/SET TASK TO STATUS 4
	DAC	7,X
	LAC	(300		/SET RESTART TO 300
	DAC	10,X
/
/ WAIT FOR THE TASK TO ABORT
/
REL2	.ENB			/ENABLE INTERRUPTS
	CAL	MARK		/MARK TIME TO ALLOW TASK TO ABORT
	CAL	WAIT		/WAIT FOR COMPLETION
	JMS	ATLSCN		/SCAN THE ATL TO BE SURE TASK ABORTED
	SKP			/RETURN HERE IF NOT FOUND -- GOOD
	JMP	REL2		/RETURN HERE IF FOUND -- NOT SO GOOD
/
/ RE-INITIALIZE THE TASK COMPLETE WITH BREAK POINTS
/
REL3	.ENB			/ENABLE INTERRUPTS
	CAL	FIX		/FIX THE TASK
	CAL	WAIT		/WAIT FOR COMPLETION
	LAC	EV		/WERE THERE ANY ERRORS?
	SPA
	JMP	ERRFIX		/YES
				/THE FIX DIRECTIVE HAS PUT THE TASK INTO
				/STATUS 2 AND SET THE FIX BITS BUT AS YET
				/THE TASK HAS NOT BEEN LOADED INTO ITS PART.
				/THE TASK WILL NOT BE LOADED UNTIL HIGHER
				/PRIORITY TASKS RELINQUISH CONTROL. AS SOON
				/AS PROPER THE TASK WILL LOAD INTO CORE AND
				/THEN IT WILL EXIT VIA AN ABORT SEQUENCE.
				/THIS IS THE STANDARD WAY TASKS GET FIXED.
				/HENCE RSXODT MUST WAIT FOR THE TASK TO EXIT
				/FROM THE FIX-ABORT SEQUENCE, I.E. RSXODT
				/MUST WAIT UNTIL THE ATL NODE FOR THE TASK
				/GETS REMOVED FROM THE ATL.
REL8	JMS	ATLSCN		/SCAN THE ATL FOR THE TASK
	JMP	REL9		/RETURN HERE IF NOT FOUND -- GOOD
	.ENB			/RETURN HERE IF FOUND -- NOT SO GOOD
	CAL	MARK		/MARK TIME TO ALLOW TASK TO ABORT
	CAL	WAIT		/WAIT FOR COMPLETION
	JMP	REL8		/GO SCAN THE ATL -- MAYBE THE TASK HAS ABORTED
REL9	.ENB			/ENABLE INTERRUPTS AND PROCEED
/
/ SET UP THE BREAKPOINT TRAP TABLE
/
	LAC	PBASE		/SET UP BREAKPOINT TRAP TABLE
	AAC	-1
	DAC*	(X10		/USE X10 AS A POINTER TO BASE OF PART
	LAC	(740040		/0: XX
	DAC*	X10
	LAC	(100002		/1: JMS 2
	DAC*	X10
	DZM*	X10		/2: 0
	LAC	(600003		/3: JMP .
	DAC*	X10
	CLA!IAC			/SET THE BRKPT SET FLAG
	DAC	SETFLG
	LAW	-BRKSIZ		/USE TEMP1 AS A COUNTER FOR BRKPT
	DAC	TEMP1		/TABLE ENTRIES
	LAC	(BRKTAB-1	/USE X10 AS A POINTER TO BRKPT ADDR TAB
	DAC*	(X10
	AAC	BRKSIZ		/USE X11 AS A POINTER TO BRKPT INST TAB
	DAC*	(X11
/
/ TRY TO RESET THE BREAK POINTS, IF A BRKPT IS SET ON AN XQT INST
/ THEN IGNORE THE BRKPT AND ZERO TABLE ENTRIES.
/
REL4	LAC*	X10		/GET A BRKPT ADDR
	SNA			/IS IT ZERO?
	JMP	REL5		/YES -- IGNORE THIS TABLE ENTRY
	TAD	PBASE		/NO -- PREPARE TO CHANGE INSTRUCTIONS
	JMS	SETXR		/SET UP XR TO ACCESS BRKPT LOC.
	LAC	0,X		/GET THE INST AT THE BRKPT
	DAC*	X11		/SAVE IN THE BRKPT INST TABLE
	AND	(740000		/IS INST AN XQT?
	SAD	(400000
	JMP	REL6		/YES -- PREPARE TO IGNORE THE POINT
	LAC	(420017		/NO -- REPLACE INST WITH XQT* X17
	DAC	0,X		/REPLACE IT
	JMP	REL7		/GO TEST FOR END OF TABLE
/
/ THE TABLE ENTRY IS ZERO SO INCREMENT X11 AND GO TEST FOR END OF TABLE
/
REL5	IDX*	(X11		/INCR. X11 SO IT CORRESPONDS TO X10
	JMP	REL7		/GO TEST FOR END OF TABLE
/
/ THE INST AT THE BRKPT IS AN XQT SO UNSET THIS BREAKPOINT
/
REL6	LAC*	(X10		/DECREMENT X10 SO ENTRY CAN BE ZEROED
	AAC	-1
	DAC*	(X10
	DZM*	X10		/ZERO THE TABLE ENTRY
/
/ TEST FOR END OF TABLE
/
REL7	ISZ	TEMP1		/DONE WITH TABLE?
	JMP	REL4		/NO -- GO LOOK AT NEXT ENTRY
				/YES -- END OF TABLE
/
/ SET UP X17 TO IT POINTS TO WORD0 OF THE BRKPT TRAP TABLE (X17=0)
/
	LAC	PBASE		/PREPARE TO ACCESS PARTITION'S BASE
	JMS	SETXR		/SET UP THE XR
	CLA			/PREPARE TO ZERO X17
	DAC	17,X		/ZERO IT
	JMS	DETACH		/DETACH THE OUTPUT DEVICE
	JMP	LOC0		/GO GET ANOTHER COMMAND
	.TITLE *** ODT EXIT COMMAND ***
/
/ EXIT COMMAND -- FORMAT: >EXI(T)
/
/			IF THE LINE TERMINATOR IS A CARRIAGE RETURN
/			ODT WILL BE RE-REQUESTED, BUT IF THE TERMINATOR
/			IS AN ALTMODE ODT WILL SIMPLY EXIT.
/
/			NOTE: THE EXIT COMMAND WILL CAUSE THE TASK TO ABORT
/
/			THIS COMMAND IS LEGAL ANYTIME
/
EXIT	JMS	DETACH		/DETACH THE OUTPUT DEVICE
/
/ ABORT THE TASK
/
EXIT3	JMS	ATLSCN		/SCAN THE ATL FOR THE TASK
	JMP	EXIT2		/RETURN HERE IF TASK NOT IN ATL
	JMS	SETXR		/RETURN HERE IF FOUND -- SET UP XR
	LAC	(4		/SET STATUS TO 4 SO TASK CAN BE ABORTED
	DAC	7,X
	LAC	(300		/SET THE RESTART ADDRESS TO 300
	DAC	10,X
/ 
/ UNFIX THE TASK FROM IT'S PARTITION
/
EXIT2	.ENB			/ENABLE INTERRUPTS
	CAL	UNFIX		/UNFIX THE TASK
	CAL	WAIT		/WAIT FOR COMPETION
	LAC	TERM		/EXIT ACCORDING TO TERMINATOR
/
/ EXIT ACCORDING TO TERMINATOR
/
EXIT1	SAD	(15		/IS IT A CR?
	JMP	EXITCR		/YES
	SAD	(175		/NO -- ALTMODE?
	JMP	EXITAL		/YES
	JMS	FAC57		/NO -- GET NEXT CHAR AND 
	JMP	EXIT1		/GO CHECK IT
EXITCR	CAL	REQODT		/RE-REQUEST RSXODT
EXITAL	LAC	(MSGBL		/PRINT A BLANK LINE
	JMS	PRINT
	CAL	(10		/EXIT
	.TITLE *** ODT SET A BREAKPOINT COMMAND ***
/
/ SET COMMAND -- FORMAT: >SET NNNNNN
/
/			WHERE NNNNNN IS AN ADDRESS RELATIVE TO THE
/			BASE OF THE TASK'S PARTITION.
/
/			NOTE: NNNNNN COULD BE A SYMBOL 
/
/			THIS COMMAND IS LEGAL ANYTIME.
/
SET	CLA			/CLEAR AC TO DENOTE NO CHAR. IS THERE
	JMS	GETNUM		/GET THE BREAK POINT LOCATION
	JMS	GETSYM		/RETURN HERE IF ERROR -- MAYBE SYMBOL 
	AAC	20		/RETURN HER IF OK (AC=VALUE) -- ADD 20
	DAC	TEMP		/SAVE IT
	LACQ			/CHECK THE LINE TERM - PUT TERM IN AC
	JMS	CR		/GO CHECK IT
	JMP	ERRNUM		/TERM ISN'T CR OR ALT -- ERROR
	JMS	ADRCHK		/TERM IS OK -- GO CHECK THE ADDRESS
	LAC	SETFLG		/RETURN HERE IF OK
	SZA			/HAS A BREAK POINT BEEN SET?
	JMP	SET1		/YES
/
/ CONTRUCT THE BREAK POINT TRAP TABLE
/
	LAC	PBASE		/NO -- SET UP A TRAP TABLE
	AAC	-1
	DAC*	(X10
	LAC	(740040		/0: XX
	DAC*	X10
	LAC	(100002		/1: JMS 2
	DAC*	X10
	DZM*	X10		/2: 0
	LAC	(600003		/3: JMP 3
	DAC*	X10
/
/ TRY TO ENTER THE BREAKPOINT IN THE TABLE
/
SET1	CLA!IAC			/SET THE SET BREAK POINT FLAG
	DAC	SETFLG
	LAW	-BRKSIZ		/IS THIS BREAK PT IN TABLE ALREADY?
	DAC	TEMP1		/USE TEMP1 AS A COUNTER OF BRKPT TAB ENTRIES
	LAC	(BRKTAB-1	/USE X10 AS A POINTER TO TABLE
	DAC*	(X10
	LAC	TEMP		/GET THE ADDRESS SPECIFIED
SET5	SAD*	X10		/DOES ADDR MATCH ONE IN TABLE?
	JMP	ERRBRK		/YES -- ERROR
	ISZ	TEMP1		/NO -- DONE WITH TABLE?
	JMP	SET5		/NO -- LOOK AT NEXT ENTRY
	LAC	(BRKTAB-1	/YES -- SCAN TABLE FOR FREE ENTRY
	DAC*	(X10		/USE X10 AS POINTER TO TABLE
	LAW	-BRKSIZ		/SET UP TEMP1 AS A COUNTER
	DAC	TEMP1		/OF TABLE ENTRIES
SET6	LAC*	X10		/GET NEXT TABLE ENTRY
	SNA			/IS IT ZERO?
	JMP	SET2		/YES -- A FREE ENTRY HAS BEEN FOUND
	ISZ	TEMP1		/NO -- DONE WITH TABLE?
	JMP	SET6		/NO -- GO LOOK AT NEXT ENTRY
	JMP	ERRTAB		/YES -- CAN'T FIND FREE ENTRY -- ERROR
/
/ ENTER THE BREAKPOINT
/
SET2	LAC*	(X10		/WE'VE FOUND A SPOT IN THE TABLE
	AAC	-1		/SET UP X10 AND X11 TO ACCESS
	DAC*	(X10		/FREE TABLE ENTRIES
	AAC	BRKSIZ
	DAC*	(X11
	LAC	TEMP		/STORE THE ADDR IN BRKTAB
	DAC*	X10
SET7	LAC	PBASE		/STORE THE CONTENTS OF ADDR IN INSTAB
	TAD	TEMP
SET8	JMS	SETXR		/SET UP TO ACCESS INSTRUCTION
	LAC	0,X		/PICK UP THE INST. AT THE BREAK
	DAC*	X11		/SAVE IT IN THE TABLE
	AND	(740000		/IS INSTRUCTION AN XCT?
	SAD	(400000
	JMP	SETERR		/YES -- PREPARE TO DECLARE AN ERROR
	LAC	(420017		/NO -- REPLACE THE INST. WITH XCT*  X17
	DAC	0,X
	LAC	PBASE		/PREPARE TO ACCESS PARTITION BASE ADDR
	JMS	SETXR
	CLA			/MAKE X17 POINT TO 0
SET4	DAC	17,X
	JMS	DETACH		/DETACH THE I/O DEVICE
	JMP	LOC0		/GO GET NEXT COMMAND
/
/ THE BREAK POINT HAS BEEN SET ON AN XQT INSTRUCTION. THIS IS ILLEGAL SO
/ UNSET THE BREAK POINT AND DECLARE AN ERROR
/
SETERR	LAC*	(X10		/PREPARE TO ZERO THE TABLE ENTRY JUST MADE
	AAC	-1
	DAC*	(X10		/X10 IS NOW RESET SO THE ENTRY CAN BE ZEROED
	DZM*	X10		/ZERO THE ENTRY
	JMP	ERRXQT		/DECLARE ERROR -- BRKPT CAN'T BE SET ON XQT
	.TITLE *** ODT CONTINUE AFTER A BREAKPOINT COMMAND ***
/
/ CONTINUE COMMAND -- FORMAT: >CON(T)
/
/			THIS COMMAND IS LEGAL ONLY IF THE TASK IS AT A BREAK PT.
/
CONTIN	LAC	BRKPT		/ARE WE AT A BREAK?
	SNA
	JMP	ERRCON		/NO -- ERROR
	DAC	TEMP		/YES -- SAVE THE BRK PT ADDRESS
	LAC	RBPFLG		/HAVE WE REMOVED THE BREAK ?
	SZA
	JMP	CONT4		/YES -- THEN JUST SET TASK STATUS TO 5
	LAC	PBASE		/NO -- PREPARE TO ACCESS TRAP TABLE
	JMS	SETXR		/SET UP THE XR
CONT2	JMS	SEARCH		/SEARCH BRK PT TABLE FOR BRK LOCATION
	JMP	ERRSEA		/RETURN HERE IF NOT FOUND
	LAC*	X11		/GET THE INST. FROM THE INST. TABLE
	DAC	0,X		/PUT IT INTO TRAP TABLE
	LAW	-1		/SET UP X17 TO POINT TO WORD0-1
	DAC	17,X
/
/ SET UP TASKS RESTART ADDRESS AND PREPARE TO RESUME TASK
/ (RESTART ROUTINE ENTERS HERE ALSO)
/
CONT3	LAC	PBADR		/SET XR UP TO ACCESS PBDL NODE
	JMS	SETXR		/SET UP THE XR
	LAC	14,X		/GET THE MODE BITS INTO MQ
	AND	(700000		/AND OFF THE START ADDR
	LMQ			/SAVE RESULT IN MQ (FLAG BITS)
	LAC	TEMP		/GET. THE RESTART ADDR (ADDR OF XCT* X17)
	OMQ			/OR THE MODE BITS AND RESTART ADDR
	DAC	14,X		/SET UP THE RESTART ADDR
/
/ CHANGE THE TASK'S STATUS FROM 6 TO 5
/
CONT4	JMS	ATLSCN		/SCAN THE ATL FOR THE TASK
	JMP	CONERR		/RETURN HERE IF NOT FOUND
	JMS	SETXR		/RETURN HERE IF FOUND -- SET UP XR
	LAC	(5		/SET THE TASK'S STATUS BACK TO 5
	DAC	7,X
	.ENB			/ENABLE INTERRUPTS
	JMS	DETACH		/DETACH THE I/O DEVICE
	JMS	MONITOR		/GO MONITOR THE TASK'S PROGRESS
/
/ TASK IS NOT IN ATL, DECLARE AN ERROR
/
CONERR	.ENB			/ENABLE INTERRUPTS
	JMP	ERREX		/DECLARE THE ERROR
	.TITLE *** ODT REMOVE A BREAKPOINT COMMAND ***
/
/ REMOVE COMMAND -- FORMAT: >REM(OVE) NNNNNN
/
/			WHERE NNNNNN IS AN ADDRESS RELATIVE TO THE
/			BASE OF THE TASK'S PARTITION PLUS 20 OCTAL.
/
/			NOTE: NNNNNN COULD BE A SYMBOL 
/
/			THIS COMMAND IS LEGAL ANYTIME.
/
REMOVE	CLA			/CLEAR AC TO DENOTE NO CHAR. THERE
	JMS	GETNUM		/GET THE ADDR. OF THE BREAKPOINT
	JMS	GETSYM		/RETURN HERE IF ERROR -- MAYBE SYMBOL
	AAC	20		/RETURN HERE IF OK (AC=VALUE)
	DAC	TEMP		/SAVE THE ADDRESS
	LACQ			/CHECK THE LINE TERM - GET IT FROM MQ
	JMS	CR		/GO CHECK IT
	JMP	ERRNUM		/RETURN HERE IF IT'S NOT A CR OR ALT -- ERROR
REM2	LAC	BRKPT		/RETURN HERE IF TERM OK -- ARE WE AT A BREAK POINT?
	SNA
	JMP	REM3		/NO
	SAD	TEMP		/YES -- IS THIS THE BRK PT WE'RE AT?
	SKP
	JMP	REM3		/NO
/
/ REMOVE THE BREAKPOINT TASK IS AT RIGHT NOW
/
	JMS	SEARCH		/YES -- SCAN THE TABLE
	JMP	ERRSEA		/RETURN HERE IF POINT NOT FOUND
	IDX	RBPFLG		/SET REMOVED BRK PT FLAG
	LAC	PBASE		/PREPARE TO RESET X17
	JMS	SETXR		/SET UP THE XR
	CLA			/SET X17 TO 0
	DAC	17,X
	LAC	PBADR		/PREPARE TO ACCESS PARTITION BLOCK
	JMS	SETXR		/SET UP THE XR
	LAC	14,X		/GET THE MODE BITS
	AND	(700000		/AND OFF THE ADDRESS
	LMQ			/SAVE RESULT IN MQ
	LAC	TEMP		/GET THE BRK PT ADDR
	OMQ			/CONSTRUCT THE RESTART ADDRESS
	DAC	14,X		/SET UP THE RESTART ADDR
	JMP	REM4		/GO CLEAR OUT TABLE ENTRIES
/
/ REMOVE BREAKPOINT WITHOUT COMPLICATIONS
/
REM3	JMS	SEARCH		/SEARCH THE BRKPT TABLE
	JMP	ERRSEA		/RETURN HERE IF NOT FOUND -- ERROR
/
/ CLEAR OUT THE ENTRY IN THE BREAKPOINT TABLE
/
REM4	LAC*	(X11		/USE X11 POINT TO BREAKPOINT INST TABLE
	TAD	(-BRKSIZ	/AND USE X10 TO POINT TO BREAKPOINT
	DAC*	(X10		/ADDRESS TABLE
	DZM*	X10		/ZERO BRK PT. ADDR. TABLE ENTRY
	LAC	PBASE		/PREPARE TO ACCESS PARTITION BASE
	TAD	TEMP		/PLUS BRKPT LOCATION
	JMS	SETXR		/SET UP THE XR
	LAC*	X11		/RESTORE THE CONTENTS OF BRK PT LOC.
	DAC	0,X		/DEPOSIT FORMER CONTENTS OF INST
	JMS	DETACH		/DETACH THE I/O DEVICE
	JMP	LOC0		/GO GET NEXT COMMAND
	.TITLE *** ODT OPEN A REGISTER OR LOCATION COMMAND ***
/
/ OPEN COMMAND -- FORMAT: >OPE(N) NNNNNN
/
/			WHERE NNNNNN IS AN ADDRESS RELATIVE TO THE BASE
/			OF THE TASK'S PARTITION PLUS 20 OCTAL.
/
/			NOTE: NNNNNN COULD BE A SYMBOL OR ONE OF THE FOLLOWING
/			REGISTERS - $AC,$MQ,$XR,$LR,$LINK,$X10,...,$X16 .
/
/			ODT WILL PRINT THE CONTENTS OF THE LOCATION OR REGISTER
/			AND WAIT FOR A RESPONSE. IF A VALUE(OCTAL ONLY) IS
/			GIVEN THAT VALUE WILL REPLACE THE FORMER CONTENTS
/			IF ONLY A TERMINATOR IS TYPED, ODT WILL PROCESS
/			IT. IN EITHER CASE IF THE RESPONSE IS ENDED WITH ALTM.
/			A BRAND NEW COMMAND WILL BE REQUESTED. IF, HOWEVER, THE
/			LINE IS TERMINATED BY A CR, THE NEXT LOCATION
/			WILL BE OPENED (UNLESS A REGISTER WAS SPECIFIED)
/			IF A NEW VALUE IS ENTERED FOR THE LINK ONLY BIT 0
/			IS RELAVANT.
/
/			THIS COMMAND IS LEGAL ANYTIME, BUT REGISTERS CAN
/			BE OPENED ONLY IF THE TASK IS AT A BREAKPOINT.
/
OPEN	CLA			/CLEAR AC TO DENOTE NO CHAR THERE
	DZM	OPEBPT		/CLEAR THE 'THIS IS A BRK PT' FLAG
	DZM	OPEREG		/CLEAR THE 'THIS IS A REGISTER' FLAG
	DZM	OPELNK		/CLEAR THE 'THIS IS THE LINK' FLAG
	JMS	GETNUM		/GET A NUMBER (LOCATION)
	JMP	OPEN1		/RETURN HERE IF POSSIBLE ERROR
	AAC	20		/RETURN HERE IF OK -- ADD 20 TO ADDR
/
/ OPEN A MEMORY LOCATION
/
OPEN3	DAC	TEMP		/SAVE THE LOCATION
	LACQ			/CHECK THE LINE TERM - GET CHAR FROM MQ
	JMS	CR		/GO CHECK IT
	JMP	ERRNUM		/ERROR -- NOT A TERM
	JMS	ADRCHK		/GO CHECK THE ADDRESS
	LAC	TEMP		/GET ACTUAL ADDR
	TAD	PBASE		/ADD BASE OF PARTITION
	JMS	SETXR		/SET UP XR TO ACCESS THAT LOCATION
	PXA			/SAVE THE XR
	DAC	TEMP1		/IN TEMP1
	JMS	SEARCH		/SCAN BRK PT TABLE TO SEE IF ADDR IS IN IT
	JMP	OPEN5		/ADDRESS IS NOT A BREAK
/
/ OPEN MEMORY LOC. AT A BREAKPOINT
/
	LAC*	X11		/ADDRESS IS A BREAK -- GET CONTENTS
	IDX	OPEBPT		/SET THE 'THIS IS A BRK PT' FLAG
	JMP	OPEN6		/GO PRINT THE CONTENTS
/
/ OPEN A MEMORY LOC NOT AT A BREAKPOINT
/
OPEN5	LAC	TEMP1		/SET UP TO GET THE CONTENTS
	PAX			/RESTORE XR
	LAC	0,X		/GET THE CONTENTS OF THE ADDR
/
/ PRINT THE CONTENTS OF THE MEMORY LOC OR REGISTER AND GET THE
/ NEW VALUE IF ONE WAS SPECIFIED.
/
	.IFUND ONEPLS
OPEN6	JMS	NUMOUT		/PRINT THE CONTENTS
	LAC	(MSGCOL		/PRINT A COLON
	.ENDC
	.IFDEF ONEPLS
/
/ IF THE FLAG SYMFLG IS SET, AND A LOCATION HAS BEEN OPENED, DECODE
/ THE OP. CODE OF THIS INSTRUCTION FOR THE USER.
/
OPEN6	DAC	OPEWRD		/SAVE CONTENTS OF THE LOCATION
	JMS	NUMOUT		/PRINT THE CONTENTS
	LAC	SYMFLG		/SHOULD THE CONTENTS BE DECODED?
	SNA
	JMP	OPECOL		/NO -- PREPARE TO GET NEW CONTENTS
	LAC	OPEREG		/MAYBE -- IS THIS A REGISTER?
	SZA
	JMP	OPECOL		/YES -- DON'T DECODE REGISTERS
OPESYM	LAC	OPEWRD		/NO -- DECODE THE WORD
	AND	(770000		/GET THE OP. CODE (6 BITS FOR SPECIAL CASES)
	SAD	(710000		/IS IT FPP?
	JMP	OPEFPP		/YES
	SAD	(720000		/NO -- IND?
	JMP	OPEIND		/YES
	AND	(740000		/NO -- MASK TO 4 BITS FOR NORMAL CASES
	SNA			/IS IT A CAL?
	JMP	OPECAL		/YES
	SAD	(040000		/NO -- DAC?
	JMP	OPEDAC		/YES
	SAD	(100000		/NO -- JMS?
	JMP	OPEJMS		/YES
	SAD	(140000		/NO -- DZM?
	JMP	OPEDZM		/YES
	SAD	(200000		/NO -- LAC?
	JMP	OPELAC		/YES
	SAD	(240000		/NO -- XOR?
	JMP	OPEXOR		/YES
	SAD	(300000		/NO -- ADD?
	JMP	OPEADD		/YES
	SAD	(340000		/NO -- TAD?
	JMP	OPETAD		/YES
	SAD	(400000		/NO -- XCT?
	JMP	OPEXCT		/YES
	SAD	(440000		/NO -- ISZ?
	JMP	OPEISZ		/YES
	SAD	(500000		/NO -- AND?
	JMP	OPEAND		/YES
	SAD	(540000		/NO -- SAD?
	JMP	OPESAD		/YES
	SAD	(600000		/NO -- JMP?
	JMP	OPEJMP		/YES
	SAD	(640000		/NO -- EAE?
	JMP	OPEEAE		/YES
	SAD	(700000		/NO -- IOT?
	JMP	OPEIOT		/YES
OPEOPR	LAC	(MSGOPR		/NO -- MUST BE AND OPR
	JMP	OPEPS		/GO PRINT THE SYMBOLIC REPRESENTATION
OPECAL	LAC	(MSGCAL		/GET CAL MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEDAC	LAC	(MSGDAC		/GET DAC MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEJMS	LAC	(MSGJMS		/GET JMS MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEDZM	LAC	(MSGDZM		/GET DZM MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPELAC	LAC	(MSGLAC		/GET LAC MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEXOR	LAC	(MSGXOR		/GET XOR MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEADD	LAC	(MSGADD		/GET ADD MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPETAD	LAC	(MSGTAD		/GET TAD MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEXCT	LAC	(MSGXCT		/GET XCT MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEISZ	LAC	(MSGISZ		/GET ISZ MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEAND	LAC	(MSGAND		/GET AND MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPESAD	LAC	(MSGSAD		/GET SAD MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEJMP	LAC	(MSGJMP		/GET JMP MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEEAE	LAC	(MSGEAE		/GET EAE MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEIOT	LAC	(MSGIOT		/GET IOT MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEFPP	LAC	(MSGFPP		/GET FPP MESSAGE
	JMP	OPEPS		/GO PRINT IT
OPEIND	LAC	(MSGIND		/GET IND MESSAGE
OPEPS	JMS	PRINT		/PRINT THE MESSAGE
OPECOL	LAC	(MSGCOL		/GET THE COLON MESSAGE
	.ENDC
	JMS	PRINT		/GO PRINT THE COLON
	JMS	READ		/READ A LINE
	JMS	IFAC		/INIT. FAC VARIABLES
	INBUFF			/INPUT BUFFER
	CLA			/CLEAR AC TO DENOTE NO CHAR THERE
	JMS	GETNUM		/TRY TO GET A NUMBER
	JMP	OPEN9		/RET. HERE ON POSSIBLE ERROR -- COULD BE TERM.
	PAL			/SAVE THE NUMBER IN LR
	LACQ			/GET THE BREAK CHAR
	JMS	CR		/IS IT A TERM?
	JMP	ERRNUM		/NO -- ERROR
	LAC	OPEBPT		/YES -- IS THIS ADDRESS A BREAK POINT?
	SNA
	JMP	OPEN8		/NO
/
/ CHANGE THE MEMORY LOCATION (AT A BREAKPOINT)
/
	LAC*	(X11		/YES -- RESET X11
	AAC	-1		/SO IT POINTS TO PROPER ENTRY
	DAC*	(X11		/IN BRKPT INST TABLE
	PLA			/GET NEW CONTENTS
	AND	(740000
	SAD	(400000		/IS IT AN XQT INST?
	JMP	ERRXQT		/YES -- ERROR
	PLA			/NO -- RESTORE NEW CONTENTS TO AC
	DAC*	X11		/PUT IT IN BREAK PT. TABLE
	JMP	OPEN9		/GO CHECK LINE TERM
/
/ CHANGE REGISTER OR MEMROY LOC (NOT AT A BREAKPOINT)
/
OPEN8	LAC	TEMP1		/NOT A BREAK PT. RESET XR
	PAX			/RESTORE XR
	LAC	OPELNK		/HAS THE LINK BEEN OPENED?
	SZA
	JMP	OPEN17		/YES
/
/ CHANGE REGISTER (EXECPT LINK) OR MEMROY LOC. (NOT AT A BREAKPOINT)
/
	PLA			/NO -- GET NEW CONTENTS
	DAC	0,X		/PUT NEW CONTENTS IN ADDR.
	JMP	OPEN9		/GO CHECK LINE TERM
/
/ CHANGE THE LINK (ONLY BIT 0 IS RELEVANT)
/
OPEN17	LAC	0,X		/PICK UP THE WORD WITH THE LINK
	AND	(377777		/KEEP EVERYTHING BUT THE LINK
	DAC	TEMP1		/SAVE THIS TEMPORARILY
	PLA			/GET NEW LINK CONTENTS
	AND	(400000		/KEEP ONLY THE SIGNIFICANT BIT
	XOR	TEMP1		/ENTER THE REST OF THE WORD
	DAC	0,X		/STORE THE RESULT
/
/ CHECK THE LINE TERM FOR A POSSIBLE ERROR
/
OPEN9	LACQ			/WHAT KIND OF TERM WAS IT?
	JMS	CR		/GO CHECK IT
	JMP	ERRNUM		/NOT A CR OR ALT -- ERROR
/
/ CHECK TO SEE IF THE NEXT MEMORY LOC SHOULD BE OPENED
/
OPEN13	SAD	(175		/ALTMODE?
	JMP	OPEN10		/YES -- GO GET NEXT COMMAND
	LAC	OPEREG		/NO -- WAS THIS A REG?
	SZA
	JMP	OPN10A		/YES -- GO GET NEXT COMMAND
	LAC	(15		/SET TERM = CR
	LMQ			/SAVE IN MQ
	LAC	TEMP		/BUMP THE ADDRESS
	IAC
	JMP	OPEN3		/OPEN THE NEXT ADDRESS
/
/ PRINT A BLANK LINE TO RETURN CARRIAGE AND GO GET NEXT COMMAND
/
OPEN10	LAC	(MSGBL		/PRINT A BLANK LINE
	JMS	PRINT
OPN10A	JMS	DETACH		/DETACH THE I/O DEVICE
	JMP	LOC0		/GO GET NEXT COMMAND
/
/ OPEN A REGISTER OR MEMORY LOC DEFINED BY A SYMBOL
/
OPEN1	LACQ			/GET THE BREAK CHAR
	SAD	(44		/"$"?
	JMP	OPEN2		/YES -- OPEN A REGISTER MAYBE
	JMS	GETSYM		/NO -- GET A SYMBOL
	AAC	20		/ADD 20 TO THE ADDRESS
	JMP	OPEN3		/OPEN THE LOCATION AS USUAL
/
/ OPEN A REGISTER
/
OPEN2	PAL			/SAVE THE CHAR
	LAC	BRKPT		/ARE WE AT A BREAK POINT?
	SNA
	JMP	ERROPR		/NO -- ERROR (ILLEGAL TO OPEN REGISTERS)
	PLA			/YES -- RESTORE THE CHAR
	JMS	GETNAM		/GET A 'NAME' (IT'S REALLY A REGISTER)
	CMD			/REGISTER NAME BUFFER
	JMP	ERRNUM		/RETURN HERE ON AN ERROR
	LAC	(REGTB1-1	/PREPARE TO SCAN REGISTER TABLES
	DAC*	(X10		/USE X10 AS A POINTER TO TABLE
	LAW	-REGSIZ		/SET UP REG TABLE COUNTER
	DAC	TEMP2		/IN TEMP2
OPEN11	LAC	CMD		/SCAN THE 1ST TABLE
/
/ SCAN THE 1ST REGISTER NAME TABLE
/
	SAD*	X10		/MATCH?
	JMP	OPEN12		/YES -- CHECK 2ND HALF OF REGISTER NAME
	ISZ	TEMP2		/NO -- END OF 1ST TABLE?
	JMP	OPEN11		/NO -- CHECK NEXT TABLE ENTRY
	JMP	ERRNUM		/YES -- ERROR
/
/ CHECK THE 2ND HALF OF THE REGISTER'S NAME
/
OPEN12	LAC*	(X10		/CHECK TABLE 2
	AAC	REGSIZ		/USE TEMP1 AS A POINTER
	DAC	TEMP1		/TO 2ND REG TABLE
	LAC*	TEMP1		/GET 2ND HALF OF REG NAME
	SAD	CMD+1		/MATCH ON SECOND HALF OF REG. NAME?
	SKP			/YES
	JMP	OPEN11		/NO -- CONTINUE SCANNING TABLE 1
	LAC	TEMP1		/PREPARE TO GET REG. VALUE FROM PBDL
	AAC	REGSIZ		/USE TEMP1 AS POINTER 
	DAC	TEMP1		/TO BIAS TABLE ENTRY
	LAC*	TEMP1		/WE'VE GO THE BIAS --DOES BIAS REFER TO PBDL?
	SPA
	JMP	OPEN14		/NO -- BIAS REFERS TO PARTITION (X10-X16)
/
/ GET REGISTER CONTENTS FROM PBDL
/
	TAD	PBADR		/YES -- PREPARE TO ACCESS PBDL
/
/ PREPARE TO PRINT REGISTER CONTENTS
/
OPEN15	JMS	SETXR		/SET UP TO ACCESS PBDL
	PXA			/SAVE THE XR
	DAC	TEMP1		/IN TEMP1
	LAC	0,X		/GET THE VALUE OF THE REG
	IDX	OPEREG		/SET THE OPEN REGISTER FLAG
	PAL			/SAVE THE VALUE TEMPORIRIALY
	LAC	CMD		/GET THE 1ST HALF OF REGISTER NAME
	SAD	(441411		/DOES IT SHOW "$LI" FOR $LINK?
	JMP	OPEN16		/YES
	PLA			/NO -- RESTORE THE VALUE
	JMP	OPEN6		/GO PRINT CONTENTS OF THE REGISTER
/
/ GET REGISTER CONTENTS FORM VIRTUAL ADDRESSES 10-16 (X10-X16)
/
OPEN14	AND	(077777		/AND OFF BIT 0 THE FLAG BIT
	TAD	PBASE		/ADD BASE OF PARTITION
	JMP	OPEN15		/GO GET THE VALUE
/
/ GET THE CONTENTS OF THE LINK
/
OPEN16	PLA			/RESTORE THE VALUE
	AND	(400000		/SAVE ONLY THE SIGNIFICANT PART
	IDX	OPELNK		/SET THE 'OPEN LINK' FLAG
	JMP	OPEN6		/GO PRINT THE CONTENTS
/
/ LOCAL VARIABLES FOR OPEN
/
OPEREG	0			/SET 1 IF OPENING A REG, 0 IF NOT
OPEBPT	0			/SET 1 IF OPENING A BRKPT, 0 IF NOT
OPELNK	0			/SET 1 IF OPENING LINK, 0 IF NOT
	.IFDEF ONEPLS
OPEWRD	0			/USED TO SAVE A LOCATION'S CONTENTS
	.ENDC
	.TITLE *** ODT DUMP THE TASK COMMAND ***
/
/ DUMP COMMAND -- FORMAT: >DUM(P)
/
/			THE TASK IMAGE NOW IN CORE WILL BE DUMPED INTO
/			AN RSX CREATED FILE NAMED: 'TSKNAM DMP'.
/			BEFORE DUMPING THE FILE, RSXODT WILL REPLACE
/			THE CONTENTS OF BREAKPOINT LOCATIONS WITH
/			THEIR FORMER CONTENTS.  THESE LOCATIONS WILL
/			LATER BE RESTORED WHEN THIS FUNCTION IS DONE.
/
/			THIS COMMAND IS LEGAL ANYTIME.
/
	.IFDEF ONEPLS
DUMP	CAL	HINF		/GET HANDLER INFO ON 'FILLUN' LUN
	CAL	WAIT		/WAIT FOR COMPLETION
	LAC	EV		/WERE THERE ERRORS?
	SPA
	JMP	ERRHIN		/YES
	AND	(77		/NO -- AND OFF EVERYTHING BUT DEVICE CODE
	SAD	(2		/IS DEVICE RF DISK?
	SKP			/YES -- OK
	SAD	(3		/NO -- RP DISK?
	SKP			/YES -- OK
	SAD	(24		/NO -- RK DISK?
	SKP			/YES -- OK
	JMP	ERRHIN		/NO -- ERROR (NOT A DISK)
/
/ SET UP THE CREATE AND PUT CPB'S AND CONTROL TABLES
/
	DAC	PUT+4		/SAVE DEVICE CODE IN PUT CPB
	LAC	PBADR		/PREPARE TO ACCESS PBDL NODE
	JMS	SETXR		/SET UP THE XR
	LAC	PBASE		/GET THE BASE ADDRESS
	DAC	PUTCTA+2	/SAVE IT IN THE PUT CONTROL TABLE
	LAC	5,X		/GET THE SIZE
	DAC	PUTCTA+3	/SAVE IT IN THE CONTROL TABLE
	CLL			/SET UP LINK FOR A SHIFT
	LRS	10		/CONVERT WORDS TO BLOCKS
	DAC	CRECTA+3	/SAVE NO. OF BLOCKS IN CREATE C.T.
/
/ CREATE THE FILE AND WRITE THE TASK IMAGE INTO IT
/
	CAL	CREATE		/CREATE THE FILE
	CAL	WAIT		/WAIT FOR COMPLETION
	LAC	EV		/ANY ERRORS?
	SPA
	JMP	ERRCRE		/YES
	LAC	CRECTA+7	/NO -- GET THE UNIT AND PLATTER
	DAC	PUTCTA+0	/STORE IN PUT CONTROL TABLE
	LAC	CRECTA+10	/GET THE DISK ADDRESS
	DAC	PUTCTA+1	/STORE IN PUT CONTROL TABLE
	JMS	REMRES		/RESTORE CONTENTS OF BRKPTS
	LAC*	X11		/WORD XCT'D BY SUBROUTINE REMRES
	CAL	PUT		/RETURN HERE -- PUT THE TASK TO DISK
	CAL	WAIT		/WAIT FOR COMPLETION
	LAC	EV		/ANY ERRORS?
	SPA
	JMP	DUMERR		/YES -- GO RESTORE BRKPTS AND TELL USER
	JMS	REMRES		/NO -- GO RESTORE BRKPTS
	LAC	(420017		/WORD XCT'D BY SUBROUTINE REMRES
	JMS	DETACH		/RETURN HERE -- DETACH I/O DEVICE
	JMP	LOC0		/GO GET NEXT COMMAND
/
/ A PUT ERROR OCCURRED SO RESTORE THE BREAKPOINTS, DELETE THE FILE
/ AND DECLARE THE ERROR
/
DUMERR	CAL	DELETE		/DELETE THE CREATED FILE
	CAL	WAIT		/WAIT FOR COMPLETION
	JMS	REMRES		/RESTORE BRKPTS
	LAC	(420017		/WORD XCT'D BY SUBROUTINE REMRES
	JMP	ERRPUT		/RETURN HERE -- GO DECLARE ERROR
	.ENDC
	.TITLE *** ODT DECODE COMMAND ***
/
/ DECODE COMMAND -- FORMAT: >DEC(ODE) STRING
/
/			WHERE STRING IS EITHER 'ON' OR 'OFF'.
/
/			THIS COMMAND SETS (ON) OR CLEARS (OFF) A FLAG
/			WHICH TELLS OPEN WHETHER OR NOT TO DECODE
/			THE OP. CODE OF THE INSTRUCTIONS IN A TASK'S
/			PARTITION.
/
/			THIS COMMAND IS LEGAL ANYTIME.
/
	.IFDEF ONEPLS
DECODE	CLA			/CLEAR AC TO DENOTE NO CHAR THERE
	JMS	GETNAM		/GET THE STRING
	SYMBOL			/PLACE TO STORE THE STRING
	JMP	ERRNUM		/RETURN HERE ON ERROR
	LAC	SYMBOL		/RETURN HERE IF OK -- GET STRING
	SAD	(170606		/IS IT OFF?
	JMP	DECOFF		/YES
	SAD	(171600		/NO -- IS IT ON?
	JMP	DECON		/YES
	JMP	ERRNUM		/NO -- ERROR
/
/ THE STRING IS OFF SO CLEAR THE FLAG
/
DECOFF	DZM	SYMFLG		/ZERO THE FLAG
	JMP	DECEX		/PREPARE TO EXIT
/
/ THE STRING IS ON SO SET THE FLAG
/
DECON	CLA!IAC			/SET THE FLAG
	DAC	SYMFLG
DECEX	JMS	DETACH		/DETACH I/O DEVICE
	JMP	LOC0		/GO GET NEXT COMMAND
	.ENDC
	.TITLE *** ODT REGISTERS COMMAND ***
/
/ REGISTERS COMMAND -- FORMAT: >REG(IST)
/
/			THIS COMMAND PRINTS THE CONTENTS OF THE AC,
/			MQ,XR,LR, AND LINK.
/
/			THIS COMMAND IS LEGAL ONLY IF TASK AT A BRKPT.
/
	.IFDEF ONEPLS
REGIST	LAC	BRKPT		/IS TASK AT A BRKPT?
	SNA
	JMP	ERRCON		/NO -- ERROR
/
/ PRINT CONTENTS OF AC
/
	LAC	(MSGAC		/YES -- GET MESSAGE FOR AC
	JMS	PRINT		/PRINT IT
	LAC	PBADR		/PREPARE TO ACCESS PBDL
	JMS	SETXR		/SET UP XR
	LAC	17,X		/GET AC'S VALUE
	JMS	NUMOUT		/PRINT IT
	LAC	(MSGBL		/PRINT BLANK LINE
	JMS	PRINT
/
/ PRINT CONTENTS OF XR
/
	LAC	(MSGXR		/GET MESSAGE FOR XR
	JMS	PRINT		/PRINT IT
	LAC	PBADR		/PREPARE TO ACCESS PBDL
	JMS	SETXR		/SET UP XR
	LAC	20,X		/GET XR'S VALUE
	JMS	NUMOUT		/PRINT IT
	LAC	(MSGBL		/PRINT BLANK LINE
	JMS	PRINT
/
/ PRINT CONTENTS OF MQ
/
	LAC	(MSGMQ		/GET MESSAGE FOR MQ
	JMS	PRINT		/PRINT IT
	LAC	PBADR		/PREPARE TO ACCESS PBDL
	JMS	SETXR		/SET UP XR
	LAC	22,X		/GET MQ'S VALUE
	JMS	NUMOUT		/PRINT IT
	LAC	(MSGBL		/PRINT BLANK LINE
	JMS	PRINT
/
/ PRINT CONTENTS OF LR
/
	LAC	(MSGLR		/GET MESSAGE FOR LR
	JMS	PRINT		/PRINT IT
	LAC	PBADR		/PREPARE TO ACCESS PBDL
	JMS	SETXR		/SET UP XR
	LAC	21,X		/GET LR'S VALUE
	JMS	NUMOUT		/PRINT IT
	LAC	(MSGBL		/PRINT BLANK LINE
	JMS	PRINT
/
/ PRINT CONTENTS OF LINK
/
	LAC	(MSGLNK		/GET MESSAGE FOR LINK
	JMS	PRINT		/PRINT IT
	LAC	PBADR		/PREPARE TO ACCESS PBDL
	JMS	SETXR		/SET UP XR
	LAC	14,X		/GET LINK AND RESTART ADDR.
	AND	(400000		/KEEP ONLY LINK
	JMS	NUMOUT		/PRINT IT
	LAC	(MSGBL		/PRINT BLANK LINE
	JMS	PRINT
	JMS	DETACH		/DETACH I/O DEVICE
	JMP	LOC0		/GO GET NEXT COMMAND
	.ENDC
	.TITLE *** ODT MONITOR ROUTINE ***
/
/ *** MONITOR ROUTINE -- WAIT FOR THE TASK TO HANG UP AT A BREAK OR EXIT
/
MONITOR	LAW	-TIME		/SET UP THE TIME COUNTER
	DAC	TIMER		/SAVE IT IN TIMER
MON2	CAL	MARK		/MARK SOME TIME
	DZM	RBPFLG		/ZERO REMOVED BRK PT FLAG
	DZM	BRKPT		/ZERO FLAG SO IT SHOWS WE'RE NOT AT A BRK YET
	CAL	WAIT		/WAIT FOR MARK TIME REQUEST
	JMS	ATLSCN		/SCAN THE ATL FOR THE TASK
	JMP	MONDON		/RETURN HERE IF NOT FOUND -- TASK NOT IN ATL
	.ENB			/RETURN HERE IF FOUND -- ENABLE INTERRUPTS
	JMS	SETXR		/SET UP THE XR TO ACCESS ATL
	LAC	7,X		/GET THE TASK STATUS
	DAC	MONTMP		/SAVE IT FOR POSSIBLE PRINTING
	SAD	(5		/INTERRUPTED BY EXEC?
	SKP
	JMP	MON100		/NO
	PXA			/YES -- SAVE THE XR IN MQ
	LMQ
	LAC	PBADR		/SET UP TO ACCESS PBDL
	JMS	SETXR		/SET UP XR
	LAC	14,X		/GET RESTART ADDRESS
	AND	(077777		/KEEP ONLY THE ADDRESS
	DAC	TEMP		/SAVE THIS
	SAD	(3		/IS THE TASK HUNG UP AT THE JMP .?
	SKP
	JMP	MON100		/NO -- GO MARK SOME TIME
	LAC	PBASE		/YES -- SET UP TO GET ADDR OF BRK PT +1
	JMS	SETXR		/SET UP XR TO ACCESS TRAP TABLE
	LAC	2,X		/GET ADDR OF BRK PT +1
	AND	(077777		/AND OFF EVERYTHING BUT THE ADDRESS
	AAC	-1		/GET ADDR OF BRK PT
	DAC	TEMP		/SAVE THE ADDR OF ALLEGED BRK PT
MON1	JMS	SEARCH		/SEARCH THE TABLE FOR THIS ADDR
	JMP	MON100		/NOT FOUND
	LACQ			/RESTORE THE XR TO POINT TO THE ATL NODE
	PAX
	LAC	(6		/TASK AT BRK - SET THE TASK'S STATUS TO 6
	DAC	7,X
	LAC	(MSGBRK		/PRINT THE MESSAGE
	JMS	PRINT
	LAC	TEMP		/GET THE BRK PT ADDR
	DAC	BRKPT		/SAVE ADDR OF BREAK POINT
	AAC	-20		/SUBTRACT 20 SO ADDRESS PRINTED AT THIS
				/BREAKPOINT MATCHES THAT OF A DEFINED SYMBOL
	JMS	NUMOUT		/PRINT THE ADDR
	LAC	(MSGBL		/PRINT A BLANK LINE TO RETURN CARRIAGE
	JMS	PRINT
	JMP	LOC0		/GO GET A COMMAND
/
/ ENABLE INTERRUPTS AND GO MONITOR TASK'S PROGRESS
/ UNLESS ITS TIME TO SEE IF THE TASK SHOULD BE ABORTED
/
MON100	ISZ	TIMER		/TIME TO SEE IF TASK SHOULD BE ABORTED?
	JMP	MON2		/NO -- GO MONITOR THE TASK'S PROGRESS
/
/ DETERMINE IF THE TASK HAS RUN LONG ENOUGH AND SHOULD BE ABORTED
/
MON3	JMS	ATTACH		/YES -- ATTACH THE DEVICE
	LAC	(MSGSTA		/GET TASK STATUS MESSAGE
	JMS	PRINT		/PRINT IT
	LAC	MONTMP		/GET TASK STATUS
	JMS	NUMOUT		/PRINT IT
	LAC	(MSGABO		/PRINT THE ABORT QUESTION
	JMS	PRINT
	JMS	READ		/READ THE RESPONSE
	JMS	DETACH		/DETACH THE I/O DEVICE
	JMS	IFAC		/INIT. FAC VARIABLE
	INBUFF			/BUFFER ADDRESS
	JMS	FAC57		/GET A CHAR
	SAD	(116		/IS IT A "N"?
	JMP	MONITOR		/YES -- GO MONITOR
	JMP	RELOAD		/NO -- ABORT AND RELOAD THE TASK
/
/ TASK HAS EXITTED -- GO TELL THE USER
/
MONDON	.ENB			/ENABLE INTERRUPTS
	LAC	(MEDON		/GET THE MESSAGE ADDR
	JMS	ERPRNT		/PRINT THE MESSAGE
	JMP	RELOAD		/GO RELOAD THE TASK
/
/ MONITOR ROUTINE'S LOCAL VARIABLE
/
MONTMP	0			/SET TO TASK'S STATUS
	.TITLE *** ODT SUBROUTINES ***
/
/
/ *** SUBROUTINES
/
/ SUBROUTINE PRINT -- PRINT LINE WHOSE ADDR IS IN AC
/
/		RETURN AT JMS+1 UNCONDITIONALLY
/
/		ALL REGISTERS ARE MODIFIED
/
PRINT	0
	DAC	WRITE+4		/SAVE THE MESSAGE ADDR IN CPB
	CAL	WRITE		/PRINT THE MESSAGE
	CAL	WAIT		/WAIT FOR COMPLETION
	JMP*	PRINT		/RETURN
/
/ SUBROUTINE ATLSCN -- SCAN ATL FOR TASK NAMED BY NAME1 AND NAME2
/
/		RETURN AT JMS+1 IF NOT FOUND
/		RETURN AT JMS+2 IF FOUND WITH ATL NODE ADDR IN AC
/		ON RETURN INTERRUPTS WILL BE INHIBITTED IN EITHER CASE
/
/		AC,XR, AND X12 ARE MODIFIED
/
ATLSCN	0
	LAC	(NAME1		/SET UP TO ACCESS THE TASK NAME
	JMS	SETXR		/USE XR AS A POINTER TO THE NAME
	LAC*	(CURTSK		/SET UP TO SCAN ATL STARTING WITH RSXODT
	DAC	ATLTMP		/SAVE ADDR. OF RSXODT'S ATL NODE
	LAC*	ATLTMP		/GET POINTER TO NEXT NODE IN ATL
ATL1	.INH			/INHIBIT INTERRUPTS
	SAD	(ATL		/IS THIS THE END OF THE ATL?
	JMP*	ATLSCN		/YES -- TASK NOT FOUND RET. AT JMS+1
	DAC	ATLTMP		/NO -- SAVE THE ADDR OF THIS NODE
	IAC			/SET UP X12 TO POINT TO TASK NAME
	DAC*	(X12
	LAC*	X12		/GET 1ST 1/2 OF TASK NAME FROM ATL NODE
	SAD	0,X		/DOES IT MATCH THE NAME WE SEEK?
	SKP			/YES -- GO EXAMINE 2ND 1/2 OF NAME
	JMP	ATL2		/NO -- PREPARE TO LOOK AT NEXT NODE
	LAC*	X12		/GET THE 2ND HALF OF THE NAME IN ATL NODE
	SAD	1,X		/DOES 2ND 1/2 OF NAME MATCH?
	JMP	ATL3		/YES -- ATL NODE HAS BEEN FOUND
ATL2	.ENB			/NO -- ENABLE INTERRUPTS
	LAC*	ATLTMP		/PREPARE TO ACCESS NEXT NODE -- GET THE
	JMP	ATL1		/POINTER TO NEXT NODE AND GO CHECK IT
ATL3	LAC	ATLTMP		/GET THE ADDR. OF THIS NODE
	IDX	ATLSCN		/PREPARE TO RETURN AT JMS+2
	JMP*	ATLSCN		/RETURN
/
/ LOCAL VARIABLE FOR ATLSCN
/
ATLTMP	0			/ADDRESS OF ATL NODE
/
/ SUBROUTINE ATTACH -- ATTACH THE I/O DEVICE
/
/		RETURN AT JMS+1 IF ATTACH IS OK
/
/		ALL REGISTERS ARE MODIFIED
/ 
ATTACH	0
	CAL	ATT		/ISSUE ATTACH DIRECTIVE
	CAL	WAIT		/WAIT FOR COMPLETION
	LAC	EV		/CHECK EV -- OK?
	SMA
	JMP*	ATTACH		/YES -- RETURN
	JMP	ERRATT		/NO -- DECLARE ERROR
/
/ SUBROUTINE REMRES -- RESTORE LOCATION CONTENTS OR BRKPT
/
/		JMS+1 CONTAINS EITHER LAC* X11 OR LAC (420017
/		TO EITHER RESTORE CONTENTS OR BRKPT 
/
/		RETURN AT JMS+2 UNCONDITIONALLY
/
/		AC, XR, X10, X11, AND TEMP1 ARE ALTERED
/
	.IFDEF ONEPLS
REMRES	0
	LAW	-BRKSIZ		/USE TEMP1 AS A COUNTER OF TABLE ENTRIES
	DAC	TEMP1
	LAC	(BRKTAB-1	/USE X10 AS POINTER TO BRKPT ADDR TABLE
	DAC*	(X10
	AAC	BRKSIZ		/USE X11 AS POINTER TO BRKPT INST TABLE
	DAC*	(X11
REMRE1	LAC*	X10		/GET 1ST ADDR
	SNA			/IS IT ZERO?
	JMP	REMRE2		/YES -- IGNORE ENTRY
	TAD	PBASE		/NO -- PREPARE TO ACCESS LOCATION
	JMS	SETXR		/SET UP XR
	XCT*	REMRES		/XCT WORD AT JMS+1
	DAC	0,X		/STORE IT IN TASK
	SKP			/PREPARE TO TEST FOR END OF TABLE
REMRE2	LAC*	X11		/INCREMENT X11 (VALUE IS MEANINGLESS)
	ISZ	TEMP1		/END OF TABLE?
	JMP	REMRE1		/NO -- GO CHECK NEXT ENTRY
	IDX	REMRES		/YES -- PREPARE TO RETURN AT JMS+2
	JMP*	REMRES		/RETURN
	.ENDC
/
/ SUBROUTINE SETXR -- ADJUST THE XR
/
/ 		RETURN AT JMS+1 UNCONDITIONALLY
/
/		AC AND XR ARE MODIFIED
/
SETXR	0
	TAD	XRADJ		/ADD XR ADJUST. TO AC
	PAX			/STICK RESULT IN XR
	JMP*	SETXR		/RETURN
/
/ SUBROUTINE DETACH -- DETACH THE I/O DEVICE
/
/		RETURN AT JMS+1 UNCONDITIONALLY
/
/		ALL REGISTERS ARE MODIFIED
/
DETACH	0
	CAL	DET		/ISSUE DETACH DIRECTIVE
	CAL	WAIT		/WAIT FOR COMPLETION
	JMP*	DETACH		/RETURN
/
/ SUBROUTINE READ -- READ A COMMAND OR NAME LINE
/
/ 		RETURN AT JMS+1 IF NO ERRORS ARE FOUND
/
/		ALL REGISTERS ARE MODIFIED
/
READ	0
	CAL	READIT		/READ A LINE
	CAL	WAIT		/WAIT FOR COMPLETION
	LAC	EV		/CHECK EV -- OK?
	SMA
	JMP*	READ		/YES -- RETURN
	JMP	ERRREA		/NO -- DECLARE ERROR
/
/ SUBROUTINE ADRCHK -- CHECK ADDR. LEGALITY FOR NRM MODE TASKS
/
/		RETURN AT JMS+1 IF ADDR. IS OK
/		JUMP TO ERRADR IF ADDRESS IS ILLEGAL FOR THIS TASK
/
/		AC AND XR ARE ALTERED
/
ADRCHK	0
	LAC	PBADR		/PREPARE TO ACCESS PBDL NODE
	JMS	SETXR
	LAC	TEMP		/GET THE ADDRESS
	TCA			/NEGATE
	TAD	6,X		/ADD SIZE OF TASK
	SPA			/ADDR<=SIZE OF PART?
	JMP	ERRADR		/NO -- ERROR
	JMP*	ADRCHK		/YES -- RETURN
	.EJECT
/
/ SUBROUTINE GETNUM -- GET AN OCTAL NUMBER
/
/		RETURN AT JMS+2 IF OK WITH TERM IN MQ AND NUMBER IN AC
/		RETURN AT JMS+1 IF ERROR WITH THE CHAR IN MQ
/
/		AC AND MQ ARE MODIFIED
/
GETNUM	0
	DAC	NTEMP		/SAVE THE CHAR
	LAW	-6		/SET DIGIT COUNTER
	DAC	NCOUNT		/IN NCOUNT
	DZM	NUM		/ZERO PREVIOUS RESULTS
	DZM	NUMFLG		/CLEAR FLAG TO SHOW NOW DIGIT YET
	LAC	NTEMP		/PICK UP THE CHAR AGAIN
	SNA			/USE THIS IF NON-ZERO
NUM1	JMS	FAC57		/GET A CHARACTER
	SAD	(40		/SPACE?
	JMP	NUMSPC		/YES
	IDX	NUMFLG		/NO -- SET FLAG TO SHOW A DIGIT WAS READ
	DAC	NUMT		/SAVE IT TEMPORARILY
	AAC	-60		/IS IT A DIGIT?
	SPA
	JMP	NUM2		/NO -- EITHER A BREAK OR AN ERROR
	DAC	NCHAR		/MAYBE -- SAVE THE POTENTIAL DIGIT
	AAC	-10
	SMA
	JMP	NUM2		/NO -- EITHER A BREAK OR AN ERROR
	LAC	NUM		/YES -- PICK UP THE REAL NUMBER
				/THAT HAS ALREADY BEEN CONSTRUCTED
	CLL
	ALS	3		/SHIFT THE CONTENTS
	TAD	NCHAR		/ADD THE DIGIT JUST READ
	DAC	NUM		/SAVE THE RESULTING DECIMAL NUMBER
	ISZ	NCOUNT		/HAVE 6 DIGITS BEEN READ?
	JMP	NUM1		/NO -- READ SOME MORE
	JMS	FAC57		/YES -- READ A BREAK CHARACTER
NUM3	LMQ			/SAVE THE TERMINATOR
NUM5	LAC	NUM		/GET THE NUMBER
	IDX	GETNUM		/PREPARE TO RETURN AT JMS+2
	JMP*	GETNUM		/RETURN
/
/ CHAR IS EITHER A BREAK OR ERROR
/
NUM2	LAC	NUMT		/PUT OFFENDING CHAR IN MQ
NUM6	LMQ
	LAW	-6		/CHARACTER IS EITHER A BREAK OR ERROR
	SAD	NCOUNT		/IF THIS WAS THE 1ST CHARACTER READ
				/ITS AN ERROR. OTHERWIZE ITS A BREAK.
	JMP*	GETNUM		/ERROR -- RETURN AT JMS+1
	JMP	NUM5		/BREAK CHAR -- PREPARE TO RETURN
/
/ CHAR IS A SPACE -- IS THIS A BREAK OR SHOULD IT BE IGNORED?
/
NUMSPC	LAC	NUMFLG		/HAS A DIGIT BEEN READ?
	SNA
	JMP	NUM1		/NO -- IGNORE THE CHAR
	LAC	(40		/YES -- RETRIEV THE BREAK CHAR (A SPACE)
	JMP	NUM6		/GO SEE IF THIS IS A REAL BREAK OR AN ERROR
/
/ LOCAL VARIABLES FOR GETNUM
/
NTEMP	0			/BUFFER FOR AC ON ENTRY
NCHAR	0			/POTENTIAL DIGIT BUFFER
NUM	0			/NUMBER BUFFER
NUMT	0			/CHARACTER SAVE BUFFER
NCOUNT	0			/DIGIT COUNTER
NUMFLG	0			/FLAG: 0 IF NOT DIGIT READ, 1 OR MORE OTHERWISE
	.EJECT
/
/
/ SUBROUTINE GETNAM -- GET AN ASCII NAME FROM TTY LINE AND ENTER
/                      THE SIXBT VERSION OF THE NAME INTO THE  
/                      LOCATIONS SPECIFIED AT JMS+1
/			RETURN AT JMS+2 ON ERRORS
/			RETURN AT JMS+3 ON OK
/
/			AC ON ENTRY HAS 1 CHAR OR 0
/			AC ON RETURN HAS BREAK CHAR
/
/			AC AND MQ ARE MODIFIED
/
GETNAM	0
	DAC	GNTEMP		/SAVE THE CHAR
	LAC*	GETNAM		/GET A POINTER TO THE NAME BUFFER
	DAC	GNCNT		/SAVE THE POINTER TEMPOR ARILY
	DZM*	GNCNT		/ZERO 1ST HALF OF NAME
	IDX	GNCNT		/INCREMENT THE POINTER
	DZM*	GNCNT		/ZERO 2ND HALF OF NAME
	LAW	-6		/SET THE CHAR. COUNT TO 6 CHARS.
	DAC	GNCNT		/SAVE IN GNCNT
	LAC	GNTEMP		/PICK UP FORMER CONTENTS OF AC
	SNA			/SKIP IF AC IS A CHAR.
GNLOC2	JMS	FAC57		/GET NEXT CHAR
	SAD	(40		/IS IT A SPACE?
	JMP	GNLOC3		/YES
	SAD	(15		/NO -- CARRIAGE RETURN?
	JMP	GNLOC3		/YES
	SAD	(175		/NO -- ALTMODE?
	JMP	GNLOC3		/YES
	SAD	(75		/NO -- EQUAL SIGN?
	JMP	GNLOC3		/YES
	AND	(77		/NO -- MASK TO 6 BITS
	DAC	GNTEMP		/SAVE THE SIXBT CHAR
	LAC	GNCNT		/DETERMINE IF THIS IS 1ST OR 2ND WORD STORE
	AAC	3
	SPA
	JMP	GNLOC5		/1ST WORD STORE
	LAC*	GETNAM		/2ND WORD STORE -- GET POINTER
	IAC			/(INCREMENT IT)
GNLOC6	DAC	GNPTR		/PTR NOW HAS ADDR OF 2ND WORD OF NAME
	LAC*	GNPTR		/PICK UP THE NAME
	CLL			/SET UP LINK FOR SHIFT
	ALS	6		/MAKE ROOM FOR NEXT CHAR
	TAD	GNTEMP		/INSERT NEXT CHAR
	DAC*	GNPTR		/STORE NAME
	ISZ	GNCNT		/HAVE SIX CHARS BEEN PROCESSED?
	JMP	GNLOC2		/NO -- GO GET THE NEXT CHAR
	JMS	FAC57		/YES -- GET THE BREAK CHAR
/
/ PREPARE TO RETURN
/
GNLOC4	IDX	GETNAM		/PREPARE TO RETURN AT JMS+2
	IDX	GETNAM
	JMP*	GETNAM		/RETURN
/
/ PREPARE TO CONSTRUCT 1ST 1/2 OF NAME
/
GNLOC5	LAC*	GETNAM		/1ST WORD STORE
	JMP	GNLOC6
/
/ A BREAK CHAR HAS BEEN READ, SO SHIFT NAME BUFFER WORDS TO SHOW
/ THAT THERE ARE NULLS ON THE END OF THE WORD
/
GNLOC3	DAC	GNTEMP		/SAVE THE BREAK
	LAW	-6		/IS THERE A CHAR IN THE NAME?
	SAD	GNCNT
	JMP	GNERR		/NO -- ERROR
	LAC	GNCNT		/YES -- SHIFT THE WORDS
	AAC	3		/CHECK IF THE 1ST OR 2ND WORD WAS PROCESSED
	SMA!CLA
	IAC			/2ND WORD SO ADD 1 TO POINTER
	TAD*	GETNAM		/SET UP A POINTER TO NAME WORD
	DAC	GNPTR		/SAVE THE POINTER
/
/ FIND OUT WHERE LAST CHAR WAS PUT AND SHIFT AS APPROPRIATE
/
	LAC	GNCNT		/GET THE CHAR COUNT
	SAD	(-5		/WAS 1 CHAR READ?
	JMP	GNLOC9		/YES -- GO SHIFT
	SAD	(-2		/NO -- WERE 4 CHARS READ?
	JMP	GNLOC9		/YES -- GO SHIFT
	SAD	(-4		/NO -- WERE 2 CHARS READ?
	JMP	GNLOC8		/YES -- GO SHIFT
	SAD	(-1		/NO -- WERE 5 CHARS READ?
	JMP	GNLOC8		/YES -- GO SHIFT
	JMP	GNLOC7		/NO -- NO SHIFT REQUIRED
/
/ SHIFT TO SHOW 2 NULLS IN NAME
/
GNLOC9	LAC*	GNPTR		/GET THE NAME WORD
	CLL			/SET UP FOR SHIFT
	ALS	14		/SHIFT IN 2 NULLS
	JMP	GNLOC0		/GO STORE RESULT
/
/ SHIFT TO SHOW 1 NULL IN NAME
/
GNLOC8	LAC*	GNPTR		/GET THE NAME WORD
	CLL			/SET UP FOR SHIFT
	ALS	6		/SHIFT IN 1 NULL
GNLOC0	DAC*	GNPTR		/STORE THE RESULT
GNLOC7	LAC	GNTEMP		/GET THE BREAK CHAR
	JMP	GNLOC4		/PREPARE TO RETURN
/
/ AN ERROR WAS FOUND -- RETURN AT JMS+1
/
GNERR	IDX	GETNAM		/PREPARE TO RETURN AT JMS+1
	JMP*	GETNAM		/RETURN
/
/ LOCAL VARIABLES FOR GETNAM
/
GNCNT	0			/CHAR COUNTER
GNTEMP	0			/TEMP STORE FOR CHAR
GNPTR	0			/POINTER TO NAME BUFFER
	.EJECT
/
/ SUBROUTINE NUMOUT -- PRINT THE CONTENTS OF AC AS AN OCTAL NUMBER
/
/			RETURN AT JMS+1 UNCONDITIONALLY
/
/			ALL REGISTERS ARE MODIFIED 
/
NUMOUT	0
	LMQ			/SAVE THE NUMBER TO BE PRINTED IN MQ
	LAW	-6		/SET UP DIGIT COUNTER
	DAC	NUMTMP		/IN NUMTMP
	DZM	OUTBUF+1	/ZERO CHECKSUM WORD IN BUFFER
	CLL			/PREPARE TO SHIFT
	LAC	(OUTBUF+1	/INIT. X10 TO OUTPUT BUFFER
	DAC*	(X10
NUMO1	CLA			/CLEAR OUT OLD RESULTS
	LLS	3		/SHIFT IN A DIGIT
	TAD	(60		/MAKE IT INTO ASCII
	DAC*	X10		/STORE IT IN BUFFER
	ISZ	NUMTMP		/HAVE WE DONE 6 DIGITS?
	JMP	NUMO1		/NO
	CAL	WRT		/YES -- WRITE OUT THE BUFFER
	CAL	WAIT		/WAIT FOR COMPLETION
	JMP*	NUMOUT		/RETURN
/
/ LOCAL VARIABLE FOR NUMOUT
/
NUMTMP	0			/DIGIT COUNTER
/
/
/ SUBROUTINE SEARCH -- SEARCH BREAK POINT TABLE FOR ADDRESS IN TEMP
/
/			RETURN AT JMS+1 IF ADDRESS NOT IN TABLE
/			RETURN AT JMS+2 IF ADDRESS FOUND WITH X11
/			SET UP TO FETCH INSTRUCTION.
/			ON ENTRY TO THIS SUBROUTINE TEMP HAS THE ADDRESS
/
/			AC AND X11 ARE MODIFIED
/
SEARCH	0
	LAC	(BRKTAB-1	/INIT X11 TO POINT TO TABLE
	DAC*	(X11
	LAW	-BRKSIZ		/SET UP THE TABLE LENGTH COUNTER
	DAC	SEAR3		/IN SEAR3
	LAC	TEMP		/SCAN DOWN THE TABLE
SEAR2	SAD*	X11		/DOES THE ADDRESS MATCH?
	JMP	SEAR1		/YES
	ISZ	SEAR3		/NO -- ARE WE AT THE END OF THE TABLE?
	JMP	SEAR2		/NO
	JMP*	SEARCH		/YES -- RETURN AT JMS+1
SEAR1	IDX	SEARCH		/PREPARE TO RETURN AT JMS+2
	LAC*	(X11		/SET UP X11 SO THE INST. CAN BE FETCHED
	TAD	(BRKSIZ-1
	DAC*	(X11
	JMP*	SEARCH		/RETURN AT JMS+2
/
/ LOCAL VARIABLE FOR SEARCH
/
SEAR3	0			/USED AS A TABLE ENTRY COUNTER
	.EJECT
/
/ SUBROUTINE GETSYM -- SEARCH SYMBOL TABLE FOR A SYMBOL AND RETURN WITH VALUE
/
/			RETURN AT JMS+1 WITH VALUE IN AC IF OK
/			AND MQ CONTAINING BREAK CHAR.
/			ON ENTRY MQ HAS 1ST CHAR OF SYMBOL
/
/			X10,MQ AND AC ARE MODIFIED
/
GETSYM	0
	DZM	GETSY1		/ZERO OLD SYMBOL NAME
	LACQ			/GET THE 1ST CHAR
	SAD	(44		/IS IT A "$"?
	JMP	ERRNUM		/YES -- THAT'S A RESERVED CHARACTER
	JMS	CR		/IS IT A TERM?
	SKP
	JMP	ERRNUM		/YES -- ERROR
	AND	(77		/NO -- MASK TO 6 BITS
	CLL			/STORE 1ST CHAR
	ALS	14		/IN BITS 0-5
	DAC	GETSY1		/OF GETSY1
	JMS	FAC57		/GET NEXT CHAR
	JMS	CR		/IS IT A TERM?
	SKP
	JMP	GETSY5		/YES -- END OF SYMBOL
	AND	(77		/NO -- MASK TO 6 BITS
	CLL
	ALS	6		/STORE 2ND CHAR.
	TAD	GETSY1		/IN BITS 6-11
	DAC	GETSY1		/OF GETSY1
	JMS	FAC57		/GET THE NEXT CHAR
	JMS	CR		/IS IT A TERM?
	SKP
	JMP	GETSY5		/YES -- END OF SYMBOL
	AND	(77		/NO -- MASK TO 6 BITS
	TAD	GETSY1		/STORE 3RD AND FINAL CHAR
	DAC	GETSY1		/IN BITS 12-17 OF GETSY1
	JMS	FAC57		/GET THE BREAK CHAR
GETSY5	LMQ			/SAVE IT IN THE MQ FOR THE RETURN
	LAC	(SYMTAB-1	/INIT X10 TO ACCESS TABLE
	DAC*	(X10
	LAW	-SYMSIZ		/SET UP THE TABLE SIZE COUNTER
	DAC	GETSY4
	LAC	GETSY1		/SEARCH THE TABLE
GETSY2	SAD*	X10		/IS IT A MATCH?
	JMP	GETSY3		/YES
	ISZ	GETSY4		/NO -- END OF TABLE?
	JMP	GETSY2		/NO
	JMP	ERRNUM		/YES -- SYMBOL NOT FOUND -- ERROR
GETSY3	LAC*	(X10		/PREPARE TO GET THE VALUE
	TAD	(SYMSIZ-1	/USE X10 AS A POINTER
	DAC*	(X10		/TO VALUE TABLE
	LAC*	X10		/PICK UP THE VALUE
	JMP*	GETSYM		/RETURN
/
/ LOCAL VARIABLES FOR GETSYM
/
GETSY1	0			/SYMBOL NAME BUFFER
GETSY4	0			/TABLE ENTRY COUNTER
/
/ SUBROUTINE ERPRNT -- PRINT ERROR MESSAGE
/
/			RETURN AT JMS+1 UNCONDITIONALLY
/
/			ON ENTRY AC HAS ADDRESS OF MESSAGE BUFFER
/
/			ALL REGISTERS ARE MODIFIED
/
ERPRNT	0
	DAC	TEMP		/SAVE THE MESSAGE BUFFER ADDR
ERPRN1	JMS	FAC57		/GET A CHAR FROM LINE BUFF
	SAD	(15		/IS IT A CR?
	JMP	ERPRN2		/YES -- PRINT ONLY MESSAGE
	SAD	(175		/NO -- ALTMODE?
	SKP
	JMP	ERPRN1		/NO -- GO LOOK FOR THE LINE TERM
	LAC	(MSGBL		/YES -- PRINT A BLANK LINE TO RET. CARRIAGE
	JMS	PRINT
ERPRN2	LAC	TEMP		/PRINT ERROR MESSAGE
	JMS	PRINT
	JMP*	ERPRNT		/RETURN
	.EJECT
/
/ SUBROUTINE CR -- TEST CHAR FOR A TERMINATOR
/
/			RETURN AT JMS+2 IF TERM
/			RETURN AT JMS+1 IF CHAR IS NOT A TERM
/
/			NO REGISTERS ARE MODIFIED
/
CR	0
	SAD	(15		/IS CHAR IN AC A CR?
	JMP	CR1		/YES -- PREPARE TO RETURN AT JMS+2
	SAD	(175		/NO -- ALTMODE?
	JMP	CR1		/YES -- PREPARE TO RETURN AT JMS+2
	SKP			/NO -- PREPARE TO RETURN AT JMS+1
CR1	IDX	CR		/INCREMENT RETURN ADDRESS
	JMP*	CR		/RETURN
	.EJECT
/
/	FAC57 IS A SET OF TWO SUBROUTINES TO GET CHARACTERS
/		FROM A LINE BUFFER IN 5/7 FORMAT AND RETURN
/		THEM TO THE CALLER.
/
/	SUBROUTINE IFAC
/
/		JMS	IFAC
/		+	LINE BUFFER ADDRESS
/
/	THIS ROUTINE MUST BE CALLED FIRST TO DEFINE THE
/	LINE BUFFER TO BE PROCESSED
/
/
/	SUBROUTINE FAC57
/
/		JMS	FAC57
/
/
/
/	THIS ROUTINE IS CALLED TO GET ONE CHARACTER
/	IT RETURNS WITH THE CHARACTER IN 7 BIT FORMAT
/	RIGHT JUSTIFIED IN THE AC.
/
/	IF A TERMINATOR IS SENSED ( 015,175) IT
/	WILL BE RETURNED ON EVERY SUBSEQUENT CALL TO FAC57
/
//////////////////////////////////////////////////////////////////////
/
/		THE AC IS MODIFIED
/
IFAC	0
	LAC*	IFAC		/GET LINE BUFFER ADDRESS(HEADER)
	AAC	2		/BUMP POINTER PAST BUFFER HEADER
	DAC	FACLBX		/SAVE RESULT 
	LAC	(FACCB+5)	/STARTS WITH END OF BUFFER
	DAC	FACCBX		/SETUP POINTERS
	ISZ	IFAC		/PREPARE TO RETURN AT JMS+2
	JMP*	IFAC		/RETURN
	.EJECT
/		
/	SUBROUTINE FAC57-- FETCH A CHARACTER FROM THE 5/7 ASCII 
/	LINE BUFFER 'FACLB' DESCRIBED BY THE POINTERS FACLBX
/	AND FACCBX.
/	CHARACTERS ARE NOT FETCHED BEYOND THE TERMINAL CHARACTER.
/
/	AC AND MQ ARE MODIFIED
/
/
FAC57	0
	LAC*	FACCBX		/FETCH THE NEXT UNPACKED CHAR
	SMA			/WAS THE CHARBUFFER EMPTY
	JMP	FAC2		/NO-- TEST FOR A TERMINAL CHARACTER
	LAC	(FACCB-1)	/YES -- REFILL FACLB FROM THE INPUT LINE
	DAC	FACCBX
	LAC*	FACLBX		/FIRST HALF OF A WORD PAIR
	ISZ	FACLBX
	LMQ
	CLA!CLL
	JMS	FACUPS		/FIRST CHAR
	JMS	FACUPS		/SECOND CHAR
	JMS	FACUPS		/FIRST 4 BITS OF THIRD CHAR
	LAC*	FACLBX		/SECOND HALF OF WORD PAIR
	ISZ	FACLBX
	LRS	17		/LAST 3 BITS OF THIRD CHAR
	XOR*	FACCBX
	DAC*	FACCBX
	CLA
	JMS	FACUPS		/FORTH CHAR
	JMS	FACUPS		/FIFTH CHAR
	LAC	(FACCB)		/RESET THE CHARACTER BUFFER INDEX
	DAC	FACCBX
	LAC*	FACCBX		/FETCH THE FIRST CHAR FROM TH BUFFER
				/OF CHARACTERS JUST FILLED
FAC2	SAD	(015)		/IF IT IS A TERMINAL CHARACTER, CARRIAGE
	JMP*	FAC57		/RETURN OR ALTMODE, RETURN WITH THE  CHAR
	SAD	(175)		/IN THE AC, BUT DO NO ALTER THE CHAR BUF INDEX
	JMP*	FAC57		/THUS REPEATED CALLS WILL GET THE SAME CHAR
	ISZ	FACCBX		/ELSE INCREMENT SAID INDEX
	JMP*	FAC57		/RETURN TO CALLER WITH CHAR IN AC
	.EJECT
/
/	SUBROUTINE FACUPS -- UNPACKING SUBROUTINE USED BY FAC57
/
/	CALLING SEQUENCE
/
/	AC AN LINK CLEAR
/	NEXT CHAR MUST BE IN
/	THE HIGH ORDER END OF THE MQ
/	FACCBX MUST POINT TO THE WORD PRECEDING
/	THE  ONE IN WHICH THE CHAR IS
/	TO BE STORED
/
/	JMS	FACUPS
/	(UNCONDITIONAL RETURN WITH FACCBX POINTING TO THE STORED
/	CHARACTER AND WITH THE AC AND LINK CLEARED)
/
/	MQ AND AC ARE MODIFIED
/
/
FACUPS	0
	LLS	7		/SHIFT THE CHAR INTO THE AC
	ISZ	FACCBX		/LOW BITS OF THIRD CHAR ARE ZERO
	DAC*	FACCBX		/BECAUSE THE LINK IS ZERO
	CLA
	JMP*	FACUPS		/RETURN TO CALLER
FACLBX	740040			/INITIALIZED TO HALT
FACCBX	740040	
FACCB	.BLOCK 5
	-1			/MARKS END OF BUFFER
	.TITLE *** ODT GLOBLE PROGRAM VARIABLES ***
/
/ *** GLOBLE PROGRAM VARIABLES
/
XRADJ	0		/XR ADJUSTMENT FACTOR
EV	0		/EVENT VARIABLE
PBADR	0		/TASK'S PBDL NODE ADDR.
PBASE	0		/TASK'S PART. BASE ADDR.
STFLAG	0		/1 IF TASK HAS BEEN STARTED, 0 IF NOT
SYMPTR	SYMTAB		/POINTER TO NEXT FREE ENTRY IN SYMBOL TABLE
VALPTR	VALTAB		/POINTER TO NEXT FREE ENTRY IN VALUE TABLE
SYMCNT	-SYMSIZ		/RUNNING COUNT OF SYMBOL TABLE ENTRIES LEFT
CMD	0		/1ST HALF OF COMMAND
	0		/2ND HALF OF COMMAND (USUALLY UNUSED)
TEMP	0		/TEMP. STORAGE
TEMP1	0
TEMP2	0
SYMBOL	0		/SYMBOL NAME (1ST HALF)
	0		/SYMBOL NAME (2ND HALF)
TIMER	0		/TIME COUNTER FOR MONITOR
SETFLG	0		/1 IF A BREAK POINT HAS BEEN SET, 0 IF NOT
TERM	0		/LINE TERMINATOR
RBPFLG	0		/1 ONLY IF THE NEWLY REMOVED BREAK POINT WAS THE
			/RESTART ADDRESS FOR CONTINUE COMMAND, 0 IF NOT.
BRKPT	0		/SET TO BREAK POINT ADDRESS ON BREAK POINTS
			/SET TO ZERO IF TASK NOT AT A BREAK POINT
	.IFDEF ONEPLS
SYMFLG	0		/SET ZERO IF OP. CODES NEED NOT BE DECODED
			/SET TO 1 IF OPEN SHOULD DECODE THEM
	.ENDC
	.TITLE *** ODT BUFFERS AND TABLES ***
/
/ *** BUFFERS AND TABLES
/
INBUFF	.BLOCK	20	/INPUT BUFFER
OUTBUF	5000		/OUTPUT BUFFER
	0
	.BLOCK	6
	40		/SPACE
	175		/ALTMODE
BRKTAB	.BLOCK BRKSIZ	/BREAK POINT LOCATION TABLE
INSTAB	.BLOCK BRKSIZ	/CONTENTS OF BREAK POINT LOCATION TABLE
SYMTAB	.BLOCK SYMSIZ	/SYMBOL NAME TABLE
VALTAB	.BLOCK SYMSIZ	/SYMBOL VALUE TABLE
CMDTBL	.SIXBT "STA"	/COMMAND DISPATCH TABLE
	.SIXBT "OPE"
	.SIXBT "SET"
	.SIXBT "CON"
	.SIXBT "REM"
	.SIXBT "DEF"
	.SIXBT "EXI"
	.SIXBT "RES"
	.SIXBT "REL"
	.IFDEF ONEPLS
	.SIXBT "DUM"
	.SIXBT "DEC"
	.SIXBT "REG"
	.ENDC
REGTB1	.SIXBT "$AC"	/REGISTER NAME TABLE (FOR 1ST HALF OF NAME)
	.SIXBT "$XR"
	.SIXBT "$MQ"
	.SIXBT "$LR"
	.SIXBT "$LI"
	.SIXBT "$X1"
	.SIXBT "$X1"
	.SIXBT "$X1"
	.SIXBT "$X1"
	.SIXBT "$X1"
	.SIXBT "$X1"
	.SIXBT "$X1"
REGTB2	0		/REGISTER NAME TABLE (FOR 2ND HALF OF NAME)
	0
	0
	0
	.SIXBT "NK@"
	.SIXBT "0@@"
	.SIXBT "1@@"
	.SIXBT "2@@"
	.SIXBT "3@@"
	.SIXBT "4@@"
	.SIXBT "5@@"
	.SIXBT "6@@"
REGTB3	17		/AC -- LOCATION OF REG WITHIN PBDL NODE
	20		/XR
	22		/MQ
	21		/LR
	14		/LINK
	400010		/X10 -- LOCATIONS NOT IN PBDL
	400011		/X11
	400012		/X12
	400013		/X13
	400014		/X14
	400015		/X15
	400016		/X16
	.TITLE *** ODT CPB'S ***
/
/ *** CPB'S
/
WAIT	20		/WAITFOR CPB
	EV		/EVENT VARIABLE ADDRESS
/
READIT	2600		/READ CPB
	EV		/EVENT VARIABLE ADDRESS
	LUN		/LOGICAL UNIT NUMBER
	2		/MODE (IOPS ASCII)
	INBUFF		/BUFFER ADDRESS
	20		/BUFFER SIZE
/
WRITE	2700		/WRITE CPB
	EV		/EVENT VARIABLE ADDRESS
	LUN		/LOGICAL UNIT NUMBER
	2		/MODE (IOPS ASCII)
	XX		/MESSAGE ADDRESS (UNDEFINED INITIALLY)
/
DET	2500		/DETACH CPB
	EV		/EVENT VARIABLE ADDRESS
	LUN		/LOGICAL UNIT NUMBER
/
ATT	2400		/ATTACH CPB
	EV		/EVENT VARIABLE
	LUN		/LOGICAL UNIT NUMBER
/
FIX	15		/FIX CPB
	EV		/EVENT VARIABLE ADDRESS
NAME1	XX		/TASK NAME (FIRST HALF, INITIALLY UNDEFINED)
NAME2	XX		/TASK NAME (SECOND HALF, INITIALLY UNDEFINED)
/
UNFIX	16		/UNFIX CPB
	EV		/EVENT VARIABLE ADDRESS
	XX		/TASK NAME (FIRST HALF, INITIALLY UNDEFINED)
	XX		/TASK NAME (SECOND HALF, INITIALLY UNDEFINED)
/
/ THE FOLLOWING CPB IS INITIALIZED TO ISSUE A TSKNAM DIRECTIVE.
/ ONCE ISSUED, THE CAL CODE IS CHANGED TO A 14 SO THE CPB
/ BECOMES A SYNC CPB FOR THIS TASK.
/
TSKNAM=.
REQODT	25		/SYNC CPB FOR RE-REQUESTING RSXODT (OVERLAYED)
	0		/EVENT VARIABLE ADDRESS (NONE SPECIFIED)
	.SIXBT "RSX"	/TASK NAME (FIRST HALF) (OVERLAYED)
	.SIXBT "ODT"	/TASK NAME (SECOND HALF) (OVERLAYED)
	2		/SYNC ON SECOND
	1		/RUN AFTER ONE UNIT
	2		/UNIT=SECOND
	0		/NO RE-SCHEDULING
	0
	0		/PRIORITY (USE DEFAULT)
/
MARK	13		/MARK TIME CPB
	EV		/EVENT VARIABLE ADDRESS
	1		/MARK TIME FOR 1 UNIT
	2		/THE UNIT IS A SECOND
/
WRT	2700		/WRITE CPB
	EV		/EVENT VARIABLE ADDRESS
	LUN		/LOGICAL UNIT NUMBER
	3		/MODE (IMAGE ASCII)
	OUTBUF		/OUTPUT BUFFER ADDRESS
/
REQTSK	1		/REQUEST CPB
	EV		/EVENT VARIABLE ADDRESS
	XX		/TASK NAME (FIRST HALF, INITIALLY UNDEFINED)
	XX		/TASK NAME (SECOND HALF, INITIALLY UNDEFINED)
PRIOR	XX		/TASK'S RUN PRIORITY (INITIALLY UNDEFINED)
/
	.IFDEF ONEPLS
CREATE	1600		/CREATE CPB
	EV		/EVENT VARIABLE ADDRESS
	FILLUN		/LOGICAL UNIT NUMBER
	CRECTA		/ADDRESS OF CREATE CONTROL TABLE
CRECTA	XX		/FILE NAME(FIRST HALF, INITIALLY UNDEFINED)
	XX		/FILE NAME(SECOND HALF, INITIALLY UNDEFINED)
	.SIXBT "DMP"	/FILE NAME EXTENSION
	XX		/FILE SIZE IN DISK BLOCKS
	0		/ACCOUNTING INFO
	0		/ACCOUNTING INFO
	1		/UPDATE INDICATOR (UPDATES ALLOWED)
	XX		/DISK UNIT AND PLATTER (INITIALLY UNDEFINED)
	XX		/DISK ADDRESS *INITIALLY UNDEFINED)
/
PUT	13100		/PUT CPB
	EV		/EVENT VARIABLE ADDRESS
	1		/LOGICAL UNIT NUMBER
	PUTCTA		/ADDRESS OF PUT CONTROL TABLE
	XX		/DEVICE CODE (INITIALLY UNDEFINED)
PUTCTA	XX		/DISK UNIT AND PLATTER (INITIALLY UNDEFINED)
	XX		/DISK ADDRESS (INITIALLY UNDEFINED)
	XX		/CORE ADDRESS (INITIALLY UNDEFINED)
	XX		/TRANSFER LENGTH (INITIALLY UNDEFINED)
/
HINF	3600		/HINF CPB
	EV		/EVENT VARIABLE ADDRESS
	FILLUN		/LOGICAL UNIT NUMBER
/
DELETE	3500		/DELETE CPB
	EV		/EVENT VARIABLE ADDRESS
	FILLUN		/LOGICAL UNIT NUMBER
	XX		/FILE NAME (FIRST HALF, INITIALLY UNDEFINED)
	XX		/FILE NAME (SECOND HALF, INITIALLY UNDEFINED)
	.SIXBT "DMP"	/FILE NAME EXTENSION
/
	.ENDC
	.TITLE *** ODT MESSAGES ***
/
/ *** MESSAGES
/
	.IFDEF ONEPLS
MEHIN	MEPUT-MEHIN/2*1000
	0
	.ASCII "HINF ERR"<15>
MEPUT	MECRE-MEPUT/2*1000
	0
	.ASCII "PUT ERR"<15>
MECRE	MSGAC-MECRE/2*1000
	0
	.ASCII "CREATE ERR"<15>
MSGAC	MSGXR-MSGAC/2*1000
	0
	.ASCII "AC:   "<175>
MSGXR	MSGMQ-MSGXR/2*1000
	0
	.ASCII "XR:   "<175>
MSGMQ	MSGLR-MSGMQ/2*1000
	0
	.ASCII "MQ:   "<175>
MSGLR	MSGLNK-MSGLR/2*1000
	0
	.ASCII "LR:   "<175>
MSGLNK	MSGCAL-MSGLNK/2*1000
	0
	.ASCII "LINK: "<175>
MSGCAL	MSGDAC-MSGCAL/2*1000
	0
	.ASCII " CAL "<175>
MSGDAC	MSGJMS-MSGDAC/2*1000
	0
	.ASCII " DAC "<175>
MSGJMS	MSGDZM-MSGJMS/2*1000
	0
	.ASCII " JMS "<175>
MSGDZM	MSGLAC-MSGDZM/2*1000
	0
	.ASCII " DZM "<175>
MSGLAC	MSGXOR-MSGLAC/2*1000
	0
	.ASCII " LAC "<175>
MSGXOR	MSGADD-MSGXOR/2*1000
	0
	.ASCII " XOR "<175>
MSGADD	MSGTAD-MSGADD/2*1000
	0
	.ASCII " ADD "<175>
MSGTAD	MSGXCT-MSGTAD/2*1000
	0
	.ASCII " TAD "<175>
MSGXCT	MSGISZ-MSGXCT/2*1000
	0
	.ASCII " XCT "<175>
MSGISZ	MSGAND-MSGISZ/2*1000
	0
	.ASCII " ISZ "<175>
MSGAND	MSGSAD-MSGAND/2*1000
	0
	.ASCII " AND "<175>
MSGSAD	MSGJMP-MSGSAD/2*1000
	0
	.ASCII " SAD "<175>
MSGJMP	MSGEAE-MSGJMP/2*1000
	0
	.ASCII " JMP "<175>
MSGEAE	MSGIOT-MSGEAE/2*1000
	0
	.ASCII " EAE "<175>
MSGIOT	MSGFPP-MSGIOT/2*1000
	0
	.ASCII " IOT "<175>
MSGFPP	MSGIND-MSGFPP/2*1000
	0
	.ASCII " FPP "<175>
MSGIND	MSGOPR-MSGIND/2*1000
	0
	.ASCII " IND "<175>
MSGOPR	MSGSTA-MSGOPR/2*1000
	0
	.ASCII " OPR "<175>
	.ENDC
MSGSTA	MSGBL-MSGSTA/2*1000
	0
	.ASCII "STATUS: "<175>
MSGBL	MSGCOL-MSGBL/2*1000
	0
	.ASCII "  "<15>
MSGCOL	MSGHDR-MSGCOL/2*1000
	0
	.ASCII ":"<175>
MSGHDR	MSGNAM-MSGHDR/2*1000
	0
	.ASCII "ODT V13"<15>
MSGNAM	MSGQUE-MSGNAM/2*1000
	0
	.ASCII "TASK NAME?"<175>
MSGQUE	MSGBRK-MSGQUE/2*1000
	0
	.ASCII "ODT>"<175>
MSGBRK	MEOPR-MSGBRK/2*1000
	0
	.ASCII "BRKPT AT "<175>
MEOPR	MEXQT-MEOPR/2*1000
	0
	.ASCII "ILLEGAL"<15>
MEXQT	MEEXM-MEXQT/2*1000
	0
	.ASCII "BRKPT AT XCT"<15>
MEEXM	MERER-MEEXM/2*1000
	0
	.ASCII "EXEC MODE"<15>
MERER	MEFORM-MERER/2*1000
	0
	.ASCII "READ ERR"<15>
MEFORM	MEFIX-MEFORM/2*1000
	0
	.ASCII "FORMAT ERR"<15>
MEFIX	MESYS-MEFIX/2*1000
	0
	.ASCII "FIX ERR"<15>
MESYS	MECMD-MESYS/2*1000
	0
	.ASCII "TASK NOT IN STL"<15>
MECMD	MEST-MECMD/2*1000
	0
	.ASCII "WHAT?"<15>
MEST	MEREQ-MEST/2*1000
	0
	.ASCII "ALREADY STARTED"<15>
MEREQ	MESYM-MEREQ/2*1000
	0
	.ASCII "REQ ERR"<15>
MESYM	MEBRK-MESYM/2*1000
	0
	.ASCII "TABLE FULL"<15>
MEBRK	MECON-MEBRK/2*1000
	0
	.ASCII "ALREADY DEFINED"<15>
MECON	MESEA-MECON/2*1000
	0
	.ASCII "NOT AT A BRKPT"<15>
MESEA	MEATT-MESEA/2*1000
	0
	.ASCII "NOT IN TABLE"<15>
MEATT	MEEX-MEATT/2*1000
	0
	.ASCII "ATTACH ERR"<15>
MEEX	MEADR-MEEX/2*1000
	0
	.ASCII "TASK NOT IN ATL"<15>
MEADR	MEDON-MEADR/2*1000
	0
	.ASCII "OUT OF BOUNDS"<15>
MEDON	MSGABO-MEDON/2*1000
	0
	.ASCII "TASK EXITTED"<15>
MSGABO	ENDMSG-MSGABO/2*1000
	0
	.ASCII "ABORT TASK?"<15>
ENDMSG=.
	.TITLE *** ODT ERROR ROUTINES ***
/
/ *** ERROR ROUTINES
/
/ INITIAL NAME ERROR
/
ERRNAM	JMS	DETACH		/DETACH THE OUTPUT DEVICE
	LAC	INBUFF+2	/WAS ONLY A TERM TYPED?
	AND	(774000
	SAD	(064000		/CR?
	JMP	EXITAL		/YES -- EXIT
	SAD	(764000		/NO -- ALTMODE?
	JMP	EXITAL		/YES -- EXIT
	LAC	(MSGBL		/NO -- PRINT BLANK LINE
	JMS	PRINT
	LAC	(MEFORM		/PRINT THE ERROR MESSAGE
	JMS	PRINT
	JMP	LOCB		/ASK FOR THE NAME AGAIN
/
/ FATAL ERRORS
/
/	TASK IS EXEC MODE
ERREXM	LAC	(MEEXM
	SKP
/	REQUEST ERROR
ERRREQ	LAC	(MEREQ
	SKP
/	FIX ERROR
ERRFIX	LAC	(MEFIX
	SKP
/	READ ERROR
ERRREA	LAC	(MERER
	SKP
/	TASK NOT IN ATL -- SYSTEM ERROR
ERREX	LAC	(MEEX
	SKP
/	TASK NOT IN STL
ERRSYS	LAC	(MESYS
	SKP
/	ATTACH ERROR
ERRATT	LAC	(MEATT
	JMS	ERPRNT		/PRINT ERROR MESSAGE
	LAC	(15		/SET UP TO EXIT AND RE-REQUEST ODT
	DAC	TERM
	JMP	EXIT
/
/ NON-FATAL ERRORS
/
	.IFDEF ONEPLS
/	HINF ERROR
ERRHIN	LAC	(MEHIN
	SKP
/	PUT ERROR
ERRPUT	LAC	(MEPUT
	SKP
/	CREATE ERROR
ERRCRE	LAC	(MECRE
	SKP
	.ENDC
/	BREAKPOINT NOT IN TABLE
ERRSEA	LAC	(MESEA
	SKP
/	REGISTERS CAN BE ONLY OPENED AT BREAK POINTS
ERROPR	LAC	(MEOPR
	SKP
/	BREAKPOINT AT XQT IS ILLEGAL
ERRXQT	LAC	(MEXQT
	SKP
/	UNRECOGNIZED COMMAND
ERRCMD	LAC	(MECMD
	SKP
/	TASK ALREADY STARTED
ERRST	LAC	(MEST
	SKP
/	ADDRESS OUT OF BOUNDS
ERRADR	LAC	(MEADR
	SKP
/	SYMBOL/BREAKPOINT TABLE FULL
ERRTAB	LAC	(MESYM
	SKP
/	BREAKPOINT ALREADY DEFINED
ERRBRK	LAC	(MEBRK
	SKP
/	TASK IS NOT AT A BREAKPOINT
ERRCON	LAC	(MECON
	SKP
/	FORMAT ERROR
ERRNUM	LAC	(MEFORM
	JMS	ERPRNT		/PRINT ERROR MESSAGE
	JMP	LOC0		/GO GET NEXT COMMAND
/
	.END
