perm filename FUNCTS.PAL[V,VDS] blob sn#270261 filedate 1977-04-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00015 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	.TITLE FUNCTS
C00005 00003	"HERE"   - COMMAND INSTRUCTION
C00007 00004	"TRANS"  - COMMAND INSTRUCTION
C00009 00005	"WHERE"  - COMMAND INSTRUCTION
C00012 00006	"TF"     - COMMAND INSTRUCTION
C00014 00007	"CLEAR"  - COMMAND INSTRUCTION
C00016 00008	"LISTT"  - LISTS THE VALUES OF STORED TRANSFORMATION
C00019 00009	"LISTP"  - LISTS THE STEPS OF A USER PROGRAM
C00022 00010	"PUNCHT"&"PUNCHP" - SAME AS LISTT&LISTP TO PAPER TAPE
C00023 00011	"PROGS"  - LISTS THE NAMES OF ALL USER PROGRAMS
C00025 00012	"CALLS"  - LISTS THE SEQUENCE OF "GOSUB" CALLS
C00027 00013	"FREE"   - COMMAND INSTRUCTION
C00029 00014	"EXEC"   - COMMAND INSTRUCTION
C00034 00015	"PROCEED","SNGSTP" - COMMAND INSTRUCTIONS
C00036 ENDMK
C⊗;
.TITLE FUNCTS

;START OF TOP LEVEL ARM PROGRAM

START:	RESET
	MTPS	LOCK		;INITIALIZE PROCESSOR STATUS
	MOV 	#STKTOP,SP	;INITIALIZE STACK
.IFZ LSI
	MOV	#1000.,CLKSET	;SET UP THE REAL TIME CLOCK
	MOV	#111,CLKS
;	MOV	#PARSER,PARVEC	;ENABLE PARITY ERROR TRAPS
	MOV	#LOCK,PARVEC+2
	MOV 	#1,PARCSR
.ENDC
	MOV	#CLKSER,@#CLKTRP;SET UP CLOCK VECTOR
	MOV	#LOCK,@#CLKTRP+2
	MOV	#BUF1,BUF2	;SET UP "DRIVE" RING BUFFERS
	MOV	#BUF2,BUF1
	MOV	#BUF1,CBUF
	MOV	#HELLO,SG	;TELL EVERYONE WHO WE ARE
	JSR	PC,LINOUT
MAINL:	MOV	#QUERY,SG	;ASK FOR INSTRUCTION
	JSR	PC,TYPSTR
	MOV	#INBUF,SG	;READ IN A COMMAND INSTRUCTION
	JSR	PC,INSTR
	MOV	#FUNTAB,R0	;DECODE IT,NEED FUNCTION HASH TABLE
	MOV	#CMND,R1	;ONLY LOOK FOR TOP LEVEL COMMANDS
	JSR	PC,PUSARG
	BCC	GOTCOM		;BRANCH IF LEGAL COMMAND
	TST	R1		;TEST IF EMPTY STRING 
	BEQ	MAINL		;LOOP BACK IF EMPTY LINE
	JSR	PC,TYPERR 	;ELSE TYPE ERROR MESSAGE
	BR	MAINL
GOTCOM:	JSR	PC,@FUNPTR(R0)	;EXECUTE FUNCTION
	ADD	#MAXARG,SP	;CLEAR ARGUMENT LIST OFF STACK
	BR	MAINL

DONE:	MOV	#GOODBY,R1	;ALL DONE, STOP MONITOR
	JSR	PC,TYPERR
	ADD	#MAXARG+2,SP	;LEAVE STACK CLEAR
	MOV	#2,@#CLKTRP+2	;CLEAR CLOCK INTERRUPT VECTOR
	MOV	#CLKTRP+2,@#CLKTRP
	HLT

QUERY:	.ASCIZ	/./

;END OF TOP LEVEL SEQUENCE
;"HERE"   - COMMAND INSTRUCTION
 
;THIS ROUTINES SETS A GIVEN TRANSFORM EQUAL TO THE PRESENT POSITION
;OF THE ARM.  THE ONLY ARGUMENT REQUIRED FOR THIS FUNCTION IS A PTR
;TO THE TRANSFORMATION.

;REGISTERS USED:
;
;	ALL REGISTERS ARE AVAILABLE FOR USE

HERE:	CLR	R0		;READ CURRENT JOINT ANGLES
	MOV	#6,R1		;SIX JOINTS IN ALL
	MOV	#JANGLES,R2
	JSR	PC,ANGLES	
	BCC	HERE1		;BRANCH IF NO ADC ERROR
	JSR	PC,TYPERR	;SIGNAL ERROR
	BR	HERDNE
HERE1:	MOV	2(SP),R2	;GET PTR TO TRANS SYMBOL BLOCK
	MOV	TRNPTR(R2),R0	;GET PTR TO DATA
	BNE	HERE2
	MOV	#12.,R0		;GET A BLOCK OF F.S. IF NOT DEFINED
	JSR	PC,GETBLK
	BCS	HERDNE		;BRANCH IF NO ROOM LEFT
	MOV	R0,TRNPTR(R2)	;SET PTR TO TRANS DATA AREA
HERE2:	MOV	#JANGLE,R1	;HERE ARE THE CURRENT ANGLES
	JSR	PC,UPDATE	;DO CONVERSION
	MOV	TRNPTR(R2),R0
	JSR	PC,MODTRN	;PERMIT EDITING OF TRANSFORM
HERDNE:	RTS	PC


;END OF "HERE"
;"TRANS"  - COMMAND INSTRUCTION
 
;THIS COMMAND IS USED FOR INITIALIZING AND EDITING THE X,Y,Z,O,A,T
;VALUES OF A SPECIFIED TRANSFORM.  THE TRANSFORMATION POINTER IS
;ASSUMED TO BE IN THE ARGUMENT LIST ON THE STACK.

;REGISTERS USED:
;
;	ALL REGISTERS ARE AVAILABLE FOR USE

STRANS:	MOV	2(SP),R2	;GET PTR TO TRANS SYMBOL BLOCK
	MOV	TRNPTR(R2),R0	;GET PTR TO DATA
	BNE	STRAN2
	MOV	#12.,R0		;GET A BLOCK OF F.S. IF NOT DEFINED
	JSR	PC,GETBLK
	BCS	STNDNE		;BRANCH IF NO ROOM
	MOV	R0,TRNPTR(R2)	;SET PTR TO TRANS DATA AREA
	MOV	#SMPTRN,R3	;INIT. TRANSFORM TO REASONABLE POS
	MOV	R0,R1
	MOV	#12.,R4
	MOV	(R3)+,(R1)+
	SOB	R4,.-2
STRAN2:	JSR	PC,MODTRN	;PERMIT EDITING OF TRANSFORM
STNDNE:	RTS	PC


;END OF "TRANS"
;"WHERE"  - COMMAND INSTRUCTION
 
;THIS COMMAND IS USED FOR TYPING OUT THE CURRENT ARM POSITION.  THE
;ARM POSITION IS PRINTED BOTH IN EULER ANGLES AND JOINT ANGLES.  THE
;HAND OPENING IS ALSO LISTED IN INCHES.  AS A SIDE AFFECT, "WHERE"
;UPDATES "CTRANS" WITH THE CURRENT ARM TRANSFORM.  NO ARGUMENTS ARE
;REQUIRED BY THIS ROUTINE.

;REGISTERS USED:
;
;	ALL REGISTERS ARE AVAILABLE FOR USE

WHERE:	CLR	R0		;READ JT. ANGLES/HAND OPENING
	MOV	#7,R1		;SEVEN CHANNELS IN ALL
	MOV	#JANGLE,R2
       	JSR	PC,ANGLES	;PUT INTO "JANGLE"
	BCC	WHER1 		;BRANCH IF NO ADC ERROR
	JSR	PC,TYPERR
	BR	WHEDNE		;EXIT
WHER1:	MOV	#CTRANS,R0	;PUT CURRENT TRANSFORM IN HERE
	MOV	#JANGLE,R1	;GET JOINT ANGLES FROM HERE
	JSR	PC,UPDATE	;CONVERT JT. ANGLES TO TRANSFORM
      	MOV     #HTRANS+7,SG	;TYPE OUT THE COLUMN HEADER 
	JSR	PC,LINOUT
	MOV	#CTRANS,R0
      	JSR	PC,PTRANS	;TYPE OUT THIS TRANSFORM
	MOV	#WHERC1,SG	;TYPE OUT JOINT ANGLES COLUMN HEADER
	JSR	PC,LINOUT
	MOV	#OUTBUF,SG	;CONVERT JOINT ANGLES TO ASCII
	MOV	#JANGLE,R2	;HERE ARE THE ANGLES
	MOV	#6,R3		;PRINT 6 ANGLES AND HAND OPENING
WHER2:	MOV	(R2)+,R0 	;GET AN ANGLE
	JSR	PC,PRTANG	;CONVERT TO ASCII
	MOVB	#40,(SG)+	;PUT IN A SPACE CHARACTER
	SOB	R3,WHER2
	MOV	(R2),R0		;CONVERT THE HAND OPENING TO INCHES
	JSR	PC,PRTDIS
	MOV	#OUTBUF,SG	;PRINT THE ASC STRING
	JSR	PC,LINOUT
WHEDNE:	RTS	PC

WHERC1:	.ASCII	/   JT 1    JT 2    JT 3    JT 4    JT 5    /
	.ASCIZ	/JT 6    HAND/
	.EVEN

;END OF "WHERE"
;"TF"     - COMMAND INSTRUCTION
 
;THIS ROUTINES INITIALIZES THE VALUE OF ONE TRANSFORM.  IT REQUIRES
;AS ITS ARGUMENTS, THE TRANSFORM NAME AND ITS 6 DEFINING VALUES.

;REGISTERS USED:
;
;	ALL REGISTERS ARE AVAILABLE FOR USE

TF:	MOV	SP,R3		;GET PTR TO ARGUMENTS
	TST	(R3)+
      	MOV	(R3)+,R2	;GET PTR TO TRANS SYMBOL BLOCK
	MOV	TRNPTR(R2),R0	;GET PTR TO DATA
	BNE	TF2
	MOV	#12.,R0		;GET A BLOCK OF F.S. IF NOT DEFINED
	JSR	PC,GETBLK
	BCS	TFDNE 		;BRANCH IF NO ROOM
	MOV	R0,TRNPTR(R2)	;SET PTR TO TRANS DATA AREA
TF2:	MOV	R3,R1		;CONVERT EULER ANGLES TO TRANFORM
	JSR	PC,UNEUL 	;DO CONVERSION
TFDNE: 	RTS	PC


;END OF "TF"
;"CLEAR"  - COMMAND INSTRUCTION
 
;THIS COMMAND IS USED FOR RE-INITIALIZING THE ARM PROGRAM.  IT DOES
;THIS BY ZEROING ALL VARIABLE WORDS FROM "ZAPSTR" TO "ZAPEND".  NO
;ARGUMENT IS REQUIRED BY THIS ROUTINE, HOWEVER RE-CONFIRMATION OF
;THE CLEAR COMMAND IS REQUESTED.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

CLEAR:	MOV	#SURE,SG	;REAFFIRM COMMAND REQUEST
	JSR	PC,TYPSTR
	MOV	#INBUF,SG	;INPUT RESPONSE
	JSR	PC,INSTR
	CMPB	#131,(SG)+	;"Y" ?
	BNE	NOCLR
	TSTB	(SG)		;THIS SHOULD BE A NULL
	BNE	NOCLR
	MOV	#ZAPEND,R0	;NUMBER OF WORDS TO ZERO
	SUB	#ZAPSTR,R0
	ASR	R0
	MOV	#ZAPSTR,R1	;START CLEARING AT THIS LOCATION
	CLR	(R1)+
	SOB	R0,.-2
	MOV	#CLRFIN,SG	;TELL EVERYONE IT'S DONE
	BR	.+6
NOCLR:	MOV	#CANCLR,SG	;CANCEL CLEAR COMMAND
	JMP	LINOUT

SURE:	.ASCIZ	/ARE YOU SURE (Y,N)? /
CLRFIN:	.ASCIZ	/ARM PROGRAM RE-INITIALIZED, ALL FREE STORAGE RECLAIMED/
CANCLR:	.ASCIZ	/CLEAR COMMAND ABORTED/
	.EVEN

;END OF "CLEAR"
;"LISTT"  - LISTS THE VALUES OF STORED TRANSFORMATION

;LISTS UP TO EIGHT TRANSFORMATIONS THAT ARE SPECIFIED BY THE USER.
;IT IS ASSUMED THAT THE TRANSFORMATIONS SYMBOL BLOCK POINTERS ARE
;ON THE STACK.  IF NO TRANSFORMATIONS ARE SPECIFIED, ALL EXISTING
;TRANSFORMATIONS ARE LISTED.

;REGISTERS USED:
;
;	ALL REGISTERS ARE AVAILABLE FOR USE

LISTT:	MOV	#HTRANS,SG	;PRINT THE HEADER
	JSR	PC,LINOUT
	CLR	@#ISPNHT	;INDICATE "LISTT" INSTRUCTION

LSTSTR:	CLR	R4		;# OF TRANS' PRINTED
	MOV	#8.,R2		;LIMITED LIST OF 8 MAX
	MOV	SP,R3		;GET PTR TO LIST
	TST	(R3)+
LISTT1:	MOV	(R3)+,R0
	BEQ	DNTPTR
	MOV	@#ISPNHT,R1	;PRINT ALL SPECIFIED TRANSFORMS
	JSR	PC,PTRTRN
	INC	R4		;ONE MORE TRANS PRINTED
DNTPTR:	SOB	R2,LISTT1
	TST	R4		;PRINT ALL TRANS' IF NONE SPECIFIED
	BNE	LSTDNE
LSTALL:	MOV	#32.,R2		;CHECK ALL 32. HASH BUCKETS FOR TRANS
	MOV	#VARTAB,R3	;PTR TO FIRST BUCKET
LSTAL1:	MOV	(R3)+,R4	;GET FIRST POINTER
	BEQ	LSTAL4
LSTAL2:	BITB	#TRANS,TYPBIT(R4)	;CHECK IF TRANS VARIABLE
	BEQ	LSTAL3
	MOV	R4,R0		;GOT A TRANS, PRINT IT
	MOV	@#ISPNHT,R1
	JSR	PC,PTRTRN
LSTAL3:	MOV	(R4),R4		;NEXT ITEM IN BUCKET
	BNE	LSTAL2		
LSTAL4:	SOB	R2,LSTAL1	;REPEAT FOR ALL BUCKETS
LSTDNE:	TST	@#ISPNHT	;NEED MORE BLANK TAPE?
	BEQ	.+6
	JSR	PC,NULLS
	RTS	PC

;END OF "LISTT"
;"LISTP"  - LISTS THE STEPS OF A USER PROGRAM

;LISTS THE SPECIFIED STEPS OF A USER PROGRAM.  IF NO FIRST STEP IS
;SPECIFIED, STEP ONE IS ASSUMED.  IF NO LAST STEP IS SPECIFIED,
;PRINTING IS CONTINUED UNTIL THE END OF THE PROGRAM IS ENCOUNTERED.
;THE ARGUMENTS FOR THIS ROUTINE ARE ASSUMED TO BE ON THE STACK IN THE
;FOLLOWING ASCENDING ORDER: PROGRAM PTR, 1ST STEP, LAST STEP.

;REGISTERS USED:
;
;	ALL REGISTERS ARE AVAILABLE FOR USE

LISTP:	CLR	@#ISPNHP	;INDICATE "LISTP"

LSPSTR:	MOV	2(SP),R0	;PTR TO PROGRAM SYMBOL BLOCK
	MOV	#LSTPMS,SG	;TYPE PROGRAM NAME
	JSR	PC,TYPSTR
	MOV	#OUTBUF,SG
	JSR	PC,PACNMS
	MOV	#OUTBUF,SG
	JSR	PC,LINOUT
	MOV	R0,R1		;PTR TO PROGRAM SYMBOL BLOCK
	ADD	#FSTSTP,R1	;PTR TO FIRST PROGRAM STEP
	TST	(R1)
	BEQ	NOSTPS
	MOV	4(SP),R2	;FIRST STEP NUMBER
	BGT	.+6
	MOV	#1,R2		;DEFAULT = STEP 1
	MOV	6(SP),R3	;FINAL STEP NUMBER
	BGT	.+6
	MOV	#77777,R3	;DEFAULT = LAST PROGRAM STEP
	SUB	R2,R3		;NUMBER OF STEPS TO PRINT-1
	BGE	LISTP2
	MOV	#BADSTP,R1	;SIGNAL ERROR IF FINAL<FIRST
	JSR	PC,TYPERR
	BR	LSTPDN
LISTP2:	INC	R3
       	MOV	R2,R4		;GET FIRST REQUESTED STEP
LISTP3:	MOV	(R1),R1
	BEQ	LSTPDN		;NOTHING TO DO IF PAST END
	SOB	R4,LISTP3
LISTP4:	MOV	R2,R0		;PRINT THE REQUESTED STEPS
	JSR	PC,PSTEP
	INC	R2		;INCREASE STEP NUMBER
	MOV	(R1),R1
	BEQ	LSTPDN		;DONE IF END OF PROGRAM
	SOB	R3,LISTP4
	BR	LSTPDN
NOSTPS:	MOV	#NULPRG,R1	;INDICATE NO PRG STEPS DEFINED
	JSR	PC,TYPERR
LSTPDN:	JSR	PC,CRLF
	TST	@#ISPNHP	;NEED MORE BLANK TAPE?
	BEQ	.+6
	JSR	PC,NULLS
	RTS	PC

LSTPMS:	.ASCIZ	/DEFPRO /
	.EVEN

;END OF "LISTP"
;"PUNCHT"&"PUNCHP" - SAME AS LISTT&LISTP TO PAPER TAPE

;THESE ROUTINES ARE IDENTICAL TO "LISTT" AND "LISTP" EXCEPT THAT
;NO HEADERS ARE TYPED OUT AND INSTEAD NULL CHARACTERS ARE PRINTED
;BEFORE AND AFTER THE DATA TO PROVIDE SOME BLANK LEADER.

;REGISTERS USED:
;
;	ALL REGISTERS ARE AVAILABLE FOR USE

PUNCHT:	JSR	PC,NULLS	;PUNCH OUT A LEADER TAPE
	MOV	#-1,@#ISPNHT	;INDICATE PUNCHT COMMAND
	JMP	LSTSTR		;NOW JUST LIKE "LISTT"

PUNCHP:	JSR	PC,NULLS	;PUNCH OUT A LEADER TAPE
	MOV	#-1,@#ISPNHP	;INDICATE PUNCHT COMMAND
	JMP	LSPSTR		;NOW JUST LIKE "LISTP"

;END OF "PUNCHT"&"PUNCHP"
;"PROGS"  - LISTS THE NAMES OF ALL USER PROGRAMS

;THIS ROUTINE LISTS THE NAMES OF ALL USER PROGRAMS THAT HAVE BEEN
;DEFINED.  IT REQUIRES NO ARGUMENTS.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

PROGS:	MOV	#32.,R2		;CHECK ALL 32. HASH BUCKETS FOR PROGS
	MOV	#VARTAB,R3	;PTR TO FIRST BUCKET
	MOV	#"  ,@#OUTBUF
PROGS1:	MOV	(R3)+,R4	;GET FIRST POINTER
	BEQ	PROGS4
PROGS2:	BITB	#PROG,TYPBIT(R4)  ;CHECK IF PROGRAM NAME
	BEQ	PROGS3
	MOV	R4,R0		;GOT A PROGRAM NAME, PRINT IT
	MOV	#OUTBUF+2,SG
	JSR	PC,PACNMS
	MOV	#OUTBUF,SG
	JSR	PC,LINOUT
PROGS3:	MOV	(R4),R4		;NEXT ITEM IN BUCKET
	BNE	PROGS2
PROGS4:	SOB	R2,PROGS1	;REPEAT FOR ALL BUCKETS
	RTS	PC

;END OF "PROGS"
;"CALLS"  - LISTS THE SEQUENCE OF "GOSUB" CALLS

;THIS ROUTINE LISTS THE LEVELS OF "GOSUB" CALLS THAT ARE NOW ACTIVE.
;IT REQUIRES NO ARGUMENTS.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

CALLS:	MOV	#SUBSTK+2,R3	;SUBR STACK
	MOV	#CALHDR,SG	;PRINT HEADER
	JSR	PC,LINOUT
	MOV	#"  ,@#OUTBUF
1$:	MOV	#OUTBUF+2,SG
	MOV	-(R3),R0	;GET SUBR NAME
	BEQ	4$
	JSR	PC,PACNME	;SAVE IN OUTBUF
	MOV	-(R3),R2	;RETURN ADDR
	BEQ	3$
	MOV	FSTSTP(R0),R1	;COMPUTE STEP NUMBER
	CLR	R0
2$:	MOV	(R1),R1		;KEEP MOVING
	INC	R0
	CMP	R1,R2		;FOUND STEP?
	BNE	2$		;NO
	JSR	PC,PTSINT	;YES, CONVERT TO ASCII
3$:	MOV	#OUTBUF,SG
	JSR	PC,LINOUT
	CMP	R3,@#SUBPTR	;END OF LIST?
	BGT	1$		;NO
4$:	RTS	PC

CALHDR:	.ASCIZ	/RTN   LAST STEP/
	.EVEN

;END OF "CALLS"
;"FREE"   - COMMAND INSTRUCTION
 
;THIS ROUTINE TYPES OUT THE AMOUNT OF FREE STORAGE SPACE THAT IS
;NOT CURRENTLY BEING USED.  NO ARGUMENTS ARE REQUIRED.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

FREE:	CLR	R5		;NUMBER OF FREE BYTES
	MOV	#10000.,R0	;100% FREE?
	TST	@#FSPTR
	BEQ	ALLFRE		;YES
	MOV	#FREEST+2,R2	;START ADDING FROM HERE
	MOV	@#HICORE,R4	;END OF F.S.
FREELP:	MOV	(R2),R3		;NEXT BOUNDARY TAG
	BEQ	FREEER		;CAN'T EVER BE THIS
	BPL	MOREFR		;>0 INDICATES NOT BEING USED
	NEG	R3		;ON TO NEXT
	BR	NXTBLK
MOREFR:	ADD	R3,R5		;ADD TO FREE SUM
NXTBLK:	MOV	R2,R1		;CHECK FOR VALID BOUNDARY TAGS
	ADD	R3,R2
	CMP	(R1),-2(R2)	;HI=LOW?
	BNE	FREEER
	CMP	R4,R2		;END OF F.S.?
	BHI	FREELP
	SUB	#FREEST,R4	;TOTAL SIZE OF F.S AREA
	TST	-(R4)
	MUL	R5,R0		;COMPUTE PERCENTAGE FREE
	DIV	R4,R0
ALLFRE:	MOV	#FREMES,SG	;TYPE OUTPUT MESSAGE
	JSR	PC,TYPSTR
	MOV	#OUTBUF,SG	;CONVERT PERCENTAGE TO ASCII
	JSR	PC,PTSHUN
	MOVB	#45,(SG)+	;%
	CLRB	(SG)
	MOV	#OUTBUF,SG
	JSR	PC,LINOUT
	BR	FREDNE

FREEER:	MOV	#BADFRE,R1	;SAY F.S. AREA IN WRONG FORMAT
	JSR	PC,TYPERR

FREDNE:	RTS	PC

FREMES:	.ASCIZ	/UNUSED FREE STORAGE = /
	.EVEN

;END OF "FREE"
;"EXEC"   - COMMAND INSTRUCTION

;THIS COMMAND IS USED FOR INITIATING ARM MOTION PROGRAMS.  IT
;REQUIRES THREE ARGUMENTS:  A USER PROGRAM NAME, A LOOP COUNT, AND
;A STARTING STEP NUMBER FOR THE FIRST PASS.  IF THE PROGRAM NAME IS
;OMITTED, THE LAST PROGRAM EXECUTED IS AGAIN RUN.  IF THE COUNT IS
;MISSING, ONE PASS IS ASSUMED.  A PASS ENDS WHENEVER A "STOP"
;INSTRUCTION IS ENCOUNTERED.  FOR MULTIPLE PASS COMMANDS, THE STOP
;MESSAGE IS SUPPRESSED UNTIL THE FINAL PASS IS COMPLETED.
;IF THE STARTING STEP NUMBER IS OMITTED, EXECUTION BEGINS
;WITH THE FIRST PROGRAM INSTRUCTION.

;REGISTERS USED:
;	ALL REGISTERS ARE AVAILABLE FOR USE

EXEC:	CLR	@#ARMS		;CLEAR ALL FLAGS
	MOV	2(SP),R2	;PROGRAM PTR
	BNE	1$
	MOV	#NOPROG,R1	;ERROR CODE IF NO PROGS EXECUTED YET
	MOV	@#SUBSTK,R2	;RE-TRY LAST PROGRAM
	BEQ	EXECER
1$:	MOV	R2,@#SUBSTK	;SET-UP SUBROUTINE STACK
	MOV	#SUBSTK-2,@#SUBPTR
       	MOV	#NULPRG,R1	;ERROR MESSAGE FOR NO PROGRAM STEPS
	MOV	FSTSTP(R2),R2	;PTR TO FIRST STEP TO EXECUTE
	BEQ	EXECER
	MOV	4(SP),R0
	BGT	.+6
	MOV	#1,R0		;DEFAULT = 1 PASS
	MOV	R0,@#EXECNT	;PASS COUNT
	MOV	6(SP),R0	;GET STARTING STEP NUMBER
	DEC	R0
	BLE	3$		;START WITH FIRST STEP
2$:	MOV	(R2),R2		;MOVE DOWN TO STARTING STEP
	BEQ	.+4		;CANT MOVE PAST END
	SOB	R0,2$
3$:	MOV	R2,@SUBPTR	;SAVE PTR TO FIRST STEP TO EXEC
	CLR	@#NSPEED	;NORMAL SPEED
	CLR	@#CONFIG	;NO SPECIAL CONFIGURATION
	CLR	@#MODES		;NO PARTICULAR SERVO MODES
	CLR	@#PMODES


EXECST:	CLR	R0		;READ CURRENT JT. ANGLES+HAND OPENING
	MOV	#7,R1		;SEVEN CHANNELS IN ALL
	MOV	#DANGLE,R2	;SAVE IN HERE
	JSR	PC,ANGLES
	BCS	EXECER		;BRANCH IF ADC DEAD
	CLR	R0		;INIT. DACS TO THE CURRENT POSITION
	MOV	#7,R1
	JSR	PC,DACOUT
	CLR	@#BRAKES	;RESET ALL HARDWARE BITS
	MOV	@#SWAIT,@#WAITNG;SET START WAIT COUNT
	MTPS	UNLOCK		;LET THE CLOCK INTERRUPT
	MOV	#DANGLE,R0	;DETERMINE CURRENT ARM CONFIGURATION
	JSR	PC,FLAGS
	MOV	@SUBPTR,R4	;ADDR. OF STEP TO EXECUTE
	ADD	#2,@#SUBPTR
	BR	TSTSTP
TOTOP:	MOV	@#SUBSTK,R4	;RESTART AT TOP OF PROGRAM
	MOV	#SUBSTK,@#SUBPTR;RESET SUBR CALL STACK
	MOV	FSTSTP(R4),R3
GOSTEP:	MOV	(R3)+,R4	;NEXT STEP TO EXECUTE
	MOV	(R3)+,R1	;PTR TO MOTION FUNCTION
	BIT	#1,R1		;SKIP OVER LABEL
	BEQ	.+4
	MOV	(R3)+,R1
	JSR	PC,@FUNPTR(R1)	;EXECUTE MOTION FUNCTION
	TST	@#ARMS  	;ANY ERROR BITS SET?
	BNE	TELSTP		;YES
TSTSTP:	MOV	R4,R3		;END OF PASS?
	BNE	GOSTEP
	DEC	@#EXECNT	;LAST PASS?
	BGT	TOTOP 
	MOV	#FINI,R1	;SIGNAL ALL DONE
	CLR	@#ARMS
	BR	.+6

TELSTP:	MOV	#UHALT,R1	;PRINT ERROR MESSAGE

	SUB	#2,@#SUBPTR	;SAVE PTR TO NEXT STEP
	MOV	R4,@SUBPTR

EXECER:	MOV	#-1,R0		;SET ALL OF THE BRAKES
	JSR	PC,SETBRK
	MTPS	LOCK		;STOP THE CLOCK INTERRUPTS
	JMP	TYPERR		;TYPE ERROR AND RETURN


;END OF "EXEC"
;"PROCEED","SNGSTP" - COMMAND INSTRUCTIONS

;THESE COMMANDS ARE USED FOR CONTINUING THE EXECUTION OF AN ARM
;PROGRAM AFTER IT HAS BEEN TERMINATED BY EITHER A "PAUSE" COMMAND
;OR ANY ONE OF A NUMBER OF ERROR CONDITIONS.  ONLY TERMINATION
;CONDITIONS THAT LEAVE THE "CANPRO" BIT IN THE ARM STATUS WORD
;( "ARMS" ) ON PERMIT THESE FUNCTIONS TO OPERATE.  NO ARGUMENTS
;ARE REQUIRED BY THESE ROUTINES.

;REGISTERS USED:
;	ALL REGISTERS AVAILABLE FOR USE

PROCED:	CLR	R0		;ARMS←0 IF CAN PROCEED
	MOV	#CNTPRO,R1	;ERROR MESSAGE OTHERWISE
	BR	TRYGO

SNGSTP:	MOV	#CANPRO,R0	;ARMS←CANPRO IF CAN PROCEED
	MOV	#CNTSGS,R1

TRYGO:	BIT	#CANPRO,ARMS	;CHECK IF PROCEEDING PERMITTED
	BEQ	NOPROC		;BRANCH IF NOT OK
	MOV	R0,@#ARMS
	JMP	EXECST		;GO CONTINUE EXECUTION

NOPROC:	JMP	TYPERR		;ELSE TYPE ERROR MESSAGE


;END OF "PROCED","SNGSTP"