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