perm filename INTFAC.PAL[2,VDS] blob sn#228393 filedate 1976-12-03 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00008 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	.TITLE INTFAC
C00004 00003	DAC TEST SECTION
C00007 00004	ADC TEST SECTION
C00009 00005	CONT. OF ADC ROUTINE
C00010 00006	SUBRS AND CLOCK INTERRUPT ROUTINE
C00013 00007	SECTION TO READ FORCE WRIST AND RETURN INFORMATION TO PDP10
C00015 00008	LOCAL STORAGE
C00017 ENDMK
CāŠ—;
.TITLE INTFAC
.INSRT HALHED.PAL[HAL,HE]

.=1000  

.INSRT IO.PAL[3,BES]

DRATRP	==530  		;DR11 A VECTOR 	
DRBTRP	==534  		;DR11 B VECTOR		
DR11S	=167770 	;DR11 STATUS WORD 
DR11O	=167772		;DR11 OUTPUT REGISTER 
DR11I	=167774 	;DR11 INPUT REGISTER   
PANICB	=200
ENABLE	=400		;INTERFACE ENABLE

;COMMUNICATIONS LINK TO PDP10

MASTER==10567
MASLOC=100000
FDATA=100002

; program initialization

.EVEN
START:	RESET
	MOV #1000,SP	;initialize stack
	CLR PS		;initialize processor status
      	CLR CLKCNT	;clear clock registers- trap restart
	CLR CLKSET
	CLR CLKS
	LDFPS	#0
	MOV	#9,R0		;SET TTY OUTPUT FORMAT
	MOV	#2,R1
	JSR	PC,FORMAT
	MOV	#CLKSER,CLKTRP	;SET CLOCK INTERRUPT ROUTINE
	MOV	#340,CLKTRP+2
 
;ASK IF DAC OR ADC CHECK
 
	MOV	#COM1,SG	;ASK IF ADC OR DAC
	JSR	PC,GETNUM
	TST	R0
	BNE	ISADC
;DAC TEST SECTION
 
DACSEC:	CLR	DR11S		;SET DR11 DAC MODE
	MOV	#COM2,SG	;GET DAC CHANNEL
	JSR	PC,GETNUM
	MOVB	BRK(R0),R1	;GET BRAKE MASK BIT
	BIS	#ENABLE,R1	;ADD ON INTERFACE ENABLE BIT
	MOV	R1,BRKMSK
	MOVB	DNE(R0),R1	;GET DONE BIT MASK
	SWAB	R1
	MOV	R1,DNEMSK
	ASH	#13.,R0
	MOV	R0,R3
	MOV	#COM3,SG	;CHECK IF POSITION OR TORQUE MODE
	JSR	PC,GETNUM
	TST	R0
	BEQ	ISCUR		;BRANCH IF CURRENT MODE
	MOV	#1,STPDNE	;ASSUME DONE MASK TO BE CHECKED
	MOV	#COM11,SG	;ASK IF DONE BIT TO BE CHECKED
	JSR	PC,GETNUM
	TST	R0
	BNE	WILCHK		;SKIP IF DONE BIT TEST REQUESTED
	BR	.+6
ISCUR:	BIS	#10000,R3	;SET CURRENT MODE BIT
	CLR	STPDNE     	;DON'T EVER STOP ON DONE CONDITION
WILCHK:	MOV	R3,DACCHN	;SAVE DAC CHANNEL
	MOV	#COM4,SG	;GET DC DAC VALUE
	JSR	PC,GETNUM
	MOV	R0,DACDC
	MOV	#COM5,SG
	JSR	PC,GETNUM	;GET DAC RAMP VALUE
	MOV	R0,DACCHG
	CLR	COUNT
	CLR	DR11S		;RESET DR11
	CLR	PDAC		;START AT BOTTOM OF RAMP
	CLR	PTIME		;INDICATE FIRST PASS THROUGH
	MOV	#10.,CLKSET	;SET CLOCK TO INTERRUPT EVERY 100USEC
	MOV	#111,CLKS
CLKWT:	TST	DNEMSK		;CHECK IF DONE BIT ON
	BNE	.+6
	JMP	RUG		;EXIT IF ALL DONE
	TSTB	KBIS		;ELSE CHECK IF SOMEONE HIT THE TTY
	BEQ	CLKWT		;LOOP TILL SOMETHING HAPPENS
	CLR	CLKS		;STOP THE DAC ROUTINE
	JMP	RUG
;ADC TEST SECTION
  
ISADC:	MOV	#2,DR11S	;SET DR11 ADC MODE
	MOV	#COM6,SG	;ASK IF TYPE OUT REQUESTED
	JSR	PC,GETNUM
	MOV	R0,TYPADC
	MOV	#COM7,SG	;SINGLE CHANNEL OR INDEX?
	JSR	PC,GETNUM
	BIC	#177776,R0
	MOV	R0,INDX
	BEQ	SNGCHN
	MOV	#TOPCLR,SG
	JSR	PC,TYPSTR
	CLR	ODDEVN
	BR	ADCSTR
SNGCHN:	MOV	#COM8,SG	;GET STARTING CHANNEL
	JSR	PC,GETNUM
	BIC	#177740,R0
	MOV	R0,ADCCHN	;SAVE START CHANNEL
 
;ADC LOOP
 
ADCSTR:	MOV	#2,DR11S	;REQUEST ADC CONVERSION
ADCLP:	MOV	ADCCHN,DR11O	;REQUEST ADC CONVERSION
	MOV	#100.,R1	;WAIT LOOP COUNT
WAITLP:	BIT	#200,DR11S
	BNE	ADCDNE		;BRANCH IF DONE
	DEC	R1
	BGE	WAITLP		;REPEAT IF STILL MORE TIME LEFT
	MOV	#COM9,SG
	JSR	PC,TYPSTR
	JMP	RUG
ADCDNE:	MOV	DR11I,R0	;GET ADC READING
	TST	TYPADC		;CHECK IF TYPE OUT REQUIRED
	BEQ	GETNXT		;SKIP IF NO
	MOV	#IOBUF,SG
;	ADD	#2048.,R0
	JSR	PC,CVI		;CONVERT TO ASCII
	MOVB	#40,(SG)+
	MOVB	#40,(SG)+
	MOVB	#40,(SG)+
	MOVB	#40,(SG)+
	CLRB	(SG)
	MOV	#IOBUF,SG	;TYPE OUT READING
	JSR	PC,TYPSTR
	JSR	PC,CRLF
;CONT. OF ADC ROUTINE

GETNXT:	TST	INDX		;CHECK IF INDEXING OR SINGLE CHANNEL
	BEQ	TSTDNE
	COM	ODDEVN		;CHECK IF DISPLAY IN RIGHT OR LEFT PART OF SCREEN
	BEQ	ADDIDX		;SKIP IF MOVING TO LEFT
	MOV	#RIGHT,SG
	JSR	PC,TYPSTR
ADDIDX:	ADD	INDX,ADCCHN	;POINT TO NEXT CHANNEL
	CMP	MAXCHN,ADCCHN	;CHECK IF WRAP AROUND TIME
	BGE	TSTDNE		;SKIP IF STILL OK
	CLR	ADCCHN		;ELSE START WITH CHANNEL 0 AGAIN
	CLR	ODDEVN
	TST	TYPADC		;CHECK IF TYPE OUT REQUIRED
	BEQ	TSTDNE
	MOV	#TOP,SG
	JSR	PC,TYPSTR
TSTDNE:	TSTB	KBIS		;CHECK IF VT05 HIT
	BEQ	ADCLP
	JMP	RUG
;SUBRS AND CLOCK INTERRUPT ROUTINE
 
GETNUM:	JSR	PC,TYPSTR
	MOV	#IOBUF,SG
	JSR	PC,INSTR
	MOV	#IOBUF,SG
	JSR	PC,INTSCN
	RTS	PC
 

CLKSER:	MOV	DACDC,R0	;GET DAC OUTPUT VALUE
	ADD	PDAC,R0
	MOV	R0,R1
	BGE	.+4		;CHECK IF IN RANGE
	NEG	R1
	CMP	#4000,R1
	BGE	VALOK		;BRANCH IF OK
	MOV	DACDC,R0	;ELSE START OVER AT DC VALUE
	MOV	DACCHG,PDAC
	NEG	PDAC
;
;	MOV	#1,DR11S	;USE THIS TO SYNC ON WHEN TESTING
;	MOV	BRKMSK,DR11O	
;
VALOK:	BIC	#170000,R0
	BIS	DACCHN,R0	;ADD DAC CHANNEL
	CLR	DR11S
	MOV	R0,DR11O
	ADD	DACCHG,PDAC
	TST	PTIME		;CHECK IF NOT FIRST PASS THROUGH
	BNE	CHKDNE		;BRANCH IF NOT PASS ONE
	MOV	#1,DR11S	;ELSE SET BRAKE MODE
	MOV	BRKMSK,DR11O	;TURN OFF BRAKE AND ENABLE INTERFACE
	MOV	#1,PTIME	;INDICATE END OF FIRST PASS
	RTI
CHKDNE:	MOV	#3,DR11S	;GET ARM STATUS BITS     
	MOV	DR11I,R0	
 	BIT	#PANICB,R0	;CHECK IF PANIC BUTTON HIT
 	BEQ	STPIT		;STOP SERVICING IF BUTTON HIT
	TST	STPDNE		;CHECK IF IN RANGE CHECKING TO BE DONE
	BNE	.+4		
	RTI			;RETURN IF NOT CHECKING REQUIRED
	BIT	DNEMSK,R0	;CHECK IF IN RANGE
	BNE	INRNGE
	CLR	COUNT 		;CLEAR IN RANGE COUNT
	RTI			;EXIT IF STILL NOT DONE
INRNGE:	INC	COUNT 		;INCREMENT NUMBER OF SEQUENCE TIMES 
	CMP	#3,COUNT 	;CHECK IF AT LEAST 3 TIMES
	BLE	.+4
	RTI
STPIT: 	CLR	CLKS		;ELSE STOP THE CLOCK
	CLR	DNEMSK
	MOV	#1,DR11S	;SET THE BRAKES
	CLR	DR11O
	RTI
;SECTION TO READ FORCE WRIST AND RETURN INFORMATION TO PDP10

FORCE:
F:	MOV	#MASTER,MASLOC	;INDICATE READY TO READ FORCE WRIST

;WAIT LOOP LOOKING AT COMMAND BLOCK FROM PDP10

WTLP:   TST	KBIS		;CHECK IF ANYONE HIT VT05 KEYBOARD
	BEQ	CHKMST
	CLRB	KBIR
	JMP	RUG		;EXIT TO DDT
CHKMST:	CMP	#MASTER,MASLOC	;CHECK IF NO ONE ALTERED THE M.NUMBER YET
	BEQ	WTLP
	MOV	#FDATA,R1
	MOV	#10.,R2		;READ 10 SETS OF DATA

SETLP:	MOV	#8.,R3		;EIGHT STRAIN GAGES IN ALL
	CLR	R4		;START WITH CHANNEL 0

REDLP: 	MOV	#2,DR11S	;REQUEST ADC CONVERSION
      	MOV	R4,DR11O	
	MOV	#100.,R0	;WAIT LOOP COUNT
WLP:   	BIT	#200,DR11S
	BNE	CNVDNE		;BRANCH IF DONE
	DEC	R0
	BGE	WLP    		;REPEAT IF STILL MORE TIME LEFT
	MOV	#COM9,SG
	JSR	PC,TYPSTR
	JMP	RUG
CNVDNE:	MOV	DR11I,R0	;GET ADC READING
	ADD	#2048.,R0
	MOV	R0,(R1)+	;SAVE READING
	INC	R4		;POINT TO NEXT CHANNEL
	SOB	R3,REDLP	;REPEAT UNTIL DONE
	SOB	R2,SETLP
	BR	F		;REPEAT
;LOCAL STORAGE
 
ODDEVN:	0
DACCHN:	0
DACDC:	0
DACCHG:	0
PDAC:	0
TYPADC:	0
ADCCHN:	0
INDX:	0
MAXCHN:	31.
BRK:	.BYTE	1,2,4,10,20,40,100,0
DNE:	.BYTE	1,2,4,10,20,40,100,0
BRKMSK:	0
DNEMSK:	0
STPDNE:	0
COUNT:	0
PTIME:	0
 
;OUTPUT STRINGS
 
COM1:	.ASCIZ	/DAC OR ADC(0:1) = /
COM2:	.ASCIZ	/DAC NUMBER (0:7) = /
COM3:	.ASCIZ	/CURRENT OR POSITION MODE (0:1) = /
COM11:	.ASCIZ	/CHECK DONE BIT (0=NO,1=YES) = /
COM4:	.ASCIZ	/DAC DC VALUE (-2048 : 2047) = /
COM5:	.ASCIZ	/DAC CHANGE EVERY 100 USEC = /
COM6:	.ASCIZ	/TYPE ADC READINGS (0:1)? = /
COM7:	.ASCIZ	/SINGLE CHANNEL OR INDEX (0:1) = /
COM8:	.ASCIZ	/ADC CHANNEL (0:31) = /
COM9:	.ASCIZ	/**ERROR** NO ADC DONE SIGNALED
/
TOP:	.BYTE	35,10,10,10,0
TOPCLR:	.BYTE	35,35,37,37,37,10,10,10,0
RIGHT:	.BYTE	32,10,10,10,30,30,30,30,30,30,30
	.BYTE	30,30,30,30,0
IOBUF:	.BLKW	100.
PBUF:	.BLKW	300.


.END START