.NLIST LOC,BIN .TITLE SW.... DT03 SWITCH HANDLER .IDENT /V001.1/ ; ;+ ; ; AUTHOR: M. YANKUS PLANNING RESEARCH CORP. ; 1508 KENNEDY DR. ; BELLEVUE, NEBR. 68005 ; ; DATE: JUNE 1978 ; ; ; FUNCTIONAL DESCRIPTION ; ; ALLOWS PROGRAMMABLE CONTROL OF DT03 OR DT07 UNIBUS ; SWITCHES VIA QIO DIRECTIVES. WHEN A SWITCHED BUS IS CONNECTED, ; THE HANDLER WILL DENY ACCESS TO THE COMPANION PROCESSOR. WHEN ; THE SYSTEM IS "SAV"ED WITH THE HANDLER LOADED AND ANY SWITCHES ; CONNECTED, THE SWITCH WILL AUTOMATICALLY ATTEMPT TO RE-CONNECT ; THE SWITCHES WHEN THE SYSTEM IS BOOTED. ; ; (NOTE: HANDLER NOT THOROUGHLY TESTED WITH DT07) ; ; ; RECORD OF MODIFICATIONS ; VERSION DATE BY DESCRIPTION ; ------- ---- -- ----------- ; ; V001.1 FEB-79 M.YANKUS SVTK$ ; ; ; TASK BUILDER COMMAND STRING ; ; SW/PR/-AB/-FX/-CP/-FP/-TA,SW=SW ; / ; LIBR=HNDLIB:RO:2 ; TASK=SW.... ; PRI=249 ; STACK=24 ; UNITS=1 ; ASG=CO:1 ; UIC=[1,1] ; / ; ; ; GLOBAL EVENT FLAG USAGE ; ; NONE ; ;- .PAGE .LIST LOC,BIN ;+ ; ; LOCAL MACRO DEFINITIONS AND SYSTEM MACRO CALLS ; ;- .MCALL SVTK$,SPRA$,DIR$,EXIT$S,WTLO$,QIO$ .MCALL ASTX$S ; ;+ ; ; EQUATED SYMBOLS ; ;- DEVNM = "SW NLINES = 2 ; ; DT03 CONTROL REGISTER BITS ; REQ = 000001 ;REQUEST INEA = 000100 ;INTERRUPT ENABLE CONN = 000200 ;CONNECTED RESET = 001000 ;RESET EXIN = 010000 ;EXTERNAL INTERRUPT ACT = 020000 ;ACTIVE ACLO = 040000 ;AC LOW WDT = 100000 ;WATCH DOG TIMER ; ; SWITCH DEVICE TABLE OFFSETS ; SWIREG = 4 ;ADDRESS CTL REG SWISTS = SWIREG+2 ;STATUS SWIUIT = SWISTS+2 ;UIT POINTER SWILEN = SWIUIT+2 ;LENGTH OF ENTRY ; ; BIT VALUES IN SWISTS ; STSCON = 1 ;SWITCH TO BE CONNECTED STSCHG = 2 ;STATUS CHANGE STSOFL = 4 ;DEVICE NON-EXISTENT (OFF-LINE) ; ; INITIALIZATION DATA ; GOOD: .WORD 0 ;COUNT OF GOOD UNITS ; SVTK: SVTK$ SSTTAB,SSTTLN ;SPECIFY SST ; SPRA: SPRA$ AST ;SPECIFY POWER RECOVERY AST .PAGE .SBTTL INITIALIZATION ; INIT: MOV #UIT,R0 MOV #DEVNM,R2 MOV #UF.RH,R3 JSR PC,..DSUT ;DECLARE HANDLER RESIDENT BCS EXIT ;CANNOT LOAD ADD .CRTSK,ATLEF ;ADDRESS OF EVENT FLAGS DIR$ #SVTK ;SET UP SST MOV #UIT0,R4 ;1ST UNIT MOV #SWTAB,R1 ;SWITCH TABLE 10$: MOV (R4),R5 ;PUD ADDRESS BEQ 20$ ;NO ENTRY FOR THIS UNIT MOV U.DA(R5),SWIREG(R1) ;ADDRESS DT03 CTL REG MOV R4,SWIUIT(R1) ;UIT ENTRY ADDRESS MOV U.TV(R5),R0 ;VECTOR ADDRESS ;R1 -> JSR R5,ISR CLR R2 CLR R3 BISB U.IP(R5),R3 ;DEVICE PRIORITY JSR PC,..CINT ;CONNECT INTERRUPT VECTOR BCS 20$ ;CANNOT CONNECT BIS #INEA,@SWIREG(R1) ;SET INTERRUPT ENABLE BCC 18$ ;SUCCESS ;NO, SST SET CARRY BIT BIS #STSOFL,SWISTS(R1) ;FLAG AS OFF-LINE 18$: INC GOOD ;ONE SWITCH CONNECTED 20$: ADD #UITLEN,R4 ;NEXT UNIT ADD #SWILEN,R1 ;NEXT ENTRY IN SWTAB CMP R4,#UITE ;DONE ? BLO 10$ ;NO TST GOOD ;ANY UNITS CONNECTED ? BEQ EX0 ;NO DIR$ #SPRA ;SET UP POWER RECOVERY BCS EX2 ;NO GOOD JSR SP,IDLE ;OKAY, SET STACK AND JMP TO IDLE ; ; EX2: MOV #SWTAB,R5 MOV #NLINES,R4 30$: MOV SWIREG(R5),R3 ;DT03 CTL REG BEQ 40$ CLR (R3) ;CLEAR INTERRUPT AND RELEASE SWITCH 40$: ADD #SWILEN,R5 ;NEXT ENTRY SOB R4,30$ EX1: MOV #UIT0,R5 ;1ST UNIT 50$: MOV (R5),R4 ;PUD ADDRESS BEQ 60$ MOV U.TV(R4),R0 ;VECTOR ADDRESS JSR PC,..DINT ;DISCONNECT INTERRUPT VECTOR 60$: ADD #UITLEN,R5 ;NEXT UNIT CMP R5,#UITE ;DONE ? BLO 50$ ;NO ; EX0: MOV #UIT,R0 JSR PC,..DNRC ;DECLARE HANDLER NON-RESIDENT EXIT: EXIT$S .PAGE .SBTTL LOCAL DATA AND TABLES ; ATLEF: .WORD A.EF ;ADDR EVENT FLAGS IN ATL ; SSTTAB: .WORD SST ;ADDR SYNC SYSTEM TRAP ROUTINE SSTTLN= .-SSTTAB/2 ; UNLFLG: .WORD 0 ;UNLOAD FLAG ; UIT: .WORD DISP .WORD NLINES,0,0,0 UITN=0 UIT0: .REPT NLINES .WORD UITN,0,0 UITN=UITN+1 .ENDR UITE: UITLEN=6 ; DISP: .WORD 0,0 ;DISPATCH TABLE DISP1: .WORD 0,SPECIL ;SPECIAL FUNCTIONS .WORD 0,CONNCT ;CONNECT .WORD 0,DISCON ;DISCONNECT .WORD 0,ATTACH ;ATTACH .WORD 0,DETACH ;DETACH .WORD 0,SETLOA ;SET "LOAD HANDLER" .WORD 0,RESETL ;RESET "LOAD HANDLER" NFUN= <.-DISP1>/4 ;NUMBER OF FUNCTIONS ; SWTAB: .REPT NLINES ;DEVICE TABLES JSR R5,ISR .WORD 0 ;SWIREG .WORD 0 ;SWISTS .WORD 0 ;SWIUIT .ENDR ; WTLO: WTLO$ 0,7 ;WAIT FOR EVENT FLAGS 1, 2, OR 3 ; LOST: QIO$ IO.WVB,1,,,,, ; LMSG: .ASCII /*** SW0 LOST TO OTHER CPU/ MSGL= .-LMSG UNITN= LMSG+6 .EVEN .PAGE .SBTTL IDLE LOOP ; IDLE: BIT #4,@ATLEF ;EVENT FLAG 3 ? BEQ 20$ ;NO BIC #4,@ATLEF ;YES, CHECK FOR CHANGE MOV #SWTAB,R5 ;DEVICE TABLE MOV #NLINES,R0 ;# OF UNITS 10$: BIT #STSCHG,SWISTS(R5) ;HAS INTERRUPT OCCURRED ? BEQ 15$ ;NO BIC #STSCHG,SWISTS(R5) ;YES, JSR PC,CHANGE ;PROCESS 15$: ADD #SWILEN,R5 ;NEXT ENTRY SOB R0,10$ ;LOOP FOR ALL UNITS BR IDLE 20$: BIT #2,@ATLEF ;EVENT FLAG 2 ? BEQ 40$ ;NO MOV #UIT,R0 30$: JSR PC,..DQRE ;DEQUEUE EXPRESS REQUEST BCS IDLE JSR PC,DQD ;PROCESS REQUEST BR 30$ ;GET ANOTHER 40$: BIT #1,@ATLEF ;EVENT FLAG 1 ? BEQ 60$ ;NO MOV #UIT,R0 50$: JSR PC,..DQRN ;DEQUEUE NORMAL REQUEST BCS IDLE ;NONE THERE JSR PC,DQD ;PROCESS REQUEST BR 50$ ;GET ANOTHER 60$: TST UNLFLG ;UNLOAD REQUESTED ? BEQ 70$ ;NO JSR PC,UNLOAD ;ATTEMPT TO UNLOAD ; 70$: DIR$ #WTLO ;WAIT FOR SOMETHING BR IDLE ;NOW PROCESS IT .PAGE .SBTTL FUNCTION PROCESSORS ; DQD: MOV #IE.IFC,R3 CMPB R.FC+1(R1),#NFUN BHIS JUNSUC MOV #IE.PRI,R3 JSR PC,@#..VACC BCS JUNSUC MOV R2,R5 CLR R4 SUB #UIT0,R5 DIV #UITLEN,R4 MUL #SWILEN,R4 ADD #SWTAB,R5 MOV SWIREG(R5),R4 JMP @#..DISP ; JUNSUC: BR UNSUC ; SPECIL: MOV #IE.IFC,R3 CMPB R.FC(R1),#12 ;KILL ? BNE 10$ JSR PC,KILLR BR SUC 10$: TST R.AT(R1) ;FROM EXEC ? BNE UNSUC CMPB R.FC(R1),#22 ;RUNDOWN ? BNE 20$ JSR PC,IORUND BR SUC 20$: CMPB R.FC(R1),#42 ;UNLOAD ? BNE UNSUC INC UNLFLG BR SUC ; CONNCT: BIS #STSCON,SWISTS(R5) ;"TO BE CONNECTED" FLAG BIT #STSOFL,SWISTS(R5) ;DEVICE ON-LINE ? BNE 25$ ;NO BIT #CONN,(R4) ;ALREADY CONNECTED ? BNE SUC ;YES BIT #ACLO,(R4) ;POWER OFF ON SWITCHED BUS ? BEQ 30$ ;NO 25$: MOV #IE.OFL,R3 ;YES, ERROR BR UNSUC 30$: BIT #INEA,(R4) ;MANUAL MODE ? BNE 40$ ;NO MOV #IE.DNR,R3 ;YES, ERROR BR UNSUC 40$: BIS #REQ,(R4) ;REQUEST CONNECTION RTS PC ; DISCON: BIC #STSCON,SWISTS(R5) ;CLEAR "TO BE CONNECTED" BIT #STSOFL,SWISTS(R5) ;DEVICE ON-LINE ? BNE SUC ;NO BIC #REQ,(R4) ;CLEAR REQUEST BIT NOP ;GIVE DT03 A CYCLE OR SO BIT #CONN,(R4) ;DISCONNECTED ? BEQ SUC ;YES MOV #IE.DNR,R3 ;NO, PROBABLY IN MANUAL MODE BR UNSUC ; ATTACH: JSR PC,..ATUN BCC SUC MOV #IE.DAA,R3 ;ALREADY ATTACHED BR UNSUC ; DETACH: JSR PC,..DTUN BCC SUC MOV #IE.DNA,R3 ;NOT ATTACHED BR UNSUC ; SETLOA: BR SUC ; RESETL: BR SUC ; SUC: MOV #IS.SUC,R3 ; UNSUC: CLR R4 BIT #2,R.FC(R1) ;EXPRESS REQUEST ? BEQ 1$ ;NO TST (R2)+ 1$: CLR 2(R2) ;ALLOW MORE REQUESTS CLR R2 JSR PC,..IODN ;I/O DONE RTS PC .PAGE KILLR: MOV R.AT(R1),R4 ;ATL POINTER MOV R4,R.PB(R1) ;1ST PARAMETER MOV A.TD(R4),R.PB+2(R1) ;STD ADDRESS MOV (R2),R.PB+4(R1) ;PUD ADDRESS ; IORUND: JSR PC,..FLSH ;FLUSH REQUEST QUEUE MOV R1,-(SP) MOV 2(R2),R3 ;I/O IN PROGRESS ? BEQ 10$ ;NO CMP R.AT(R3),R.PB(R1) ;SAME TASK ? BNE 10$ ;NO MOV R3,R1 ;YES, KILL THE REQUEST CLRB R.FN(R1) ;CLEAR EVENT FLAG, CLR R.SB(R1) ;STATUS BLOCK PTR, CLR R.AE(R1) ;AND AST ADDRESS. MOV #IE.ABO,R3 MOV R2,-(SP) ;SAVE UIT POINTER JSR PC,UNSUC ;RETURN I/O NODE MOV (SP)+,R2 10$: MOV (SP)+,R1 RTS PC ; UNLOAD: MOV #UIT0,R2 MOV #NLINES,R4 20$: TST 2(R2) ;I/O IN PROGRESS ? BNE 30$ ;YES ADD #UITLEN,R2 ;NEXT UNIT SOB R4,20$ JMP EX2 ;NO I/O, EXIT 30$: RTS PC .PAGE .SBTTL PROCESS CHANGE IN SWITCH STATUS ; CHANGE: MOV SWIREG(R5),R4 ;ADDRESS DT03 CTL REG MOV SWIUIT(R5),R2 ;UIT ENTRY ADDRESS BIT #WDT,(R4) ;WATCH DOG TIMER ? BEQ 10$ ;NO BIC #WDT,(R4) ;YES, SWITCH WAS LOST MOV (R2),R3 ;PUD ADDRESS MOVB #'0,UNITN BISB U.UN(R3),UNITN ;SET UNIT NUMBER DIR$ #LOST ;PRINT MESSAGE 10$: MOV 2(R2),R1 ;QIO CONNECT REQUESTED ? BEQ 20$ ;NO BIT #CONN,(R4) ;CONNECTION MADE ? BEQ 15$ ;NO BIS #1,@ATLEF ;SET TO DEQUE NEXT REQUEST BR SUC ;REQUEST SUCCESSFUL 15$: MOV #IE.RSU,R3 ;REQUEST FAILED BR UNSUC 20$: ; AST TURNED ON REQ RTS PC .PAGE .SBTTL INTERRUPT SERVICE ; ISR: BIT #EXIN,@(R5) ;OTHER CPU REQUESTING ? BEQ 10$ ;NO BIC #EXIN,@(R5) ;YES, DENY HIM BR 20$ 10$: BIS #STSCHG,SWISTS-SWIREG(R5) ;SET "CHANGE" BIT BIS #4,@ATLEF ;SET EVENT FLAG BIS #EV.SE,@#.SERFG ;DECLARE SIG EVENT 20$: MOV (SP)+,R5 JMP @#..INTX ;EXIT INTERRUPT ; ; ; .SBTTL POWER RECOVERY AST ; AST: MOV R5,-(SP) MOV R4,-(SP) MOV R0,-(SP) MOV #SWTAB,R5 MOV #NLINES,R0 10$: MOV SWIREG(R5),R4 ;ADDRESS DT03 CTL REG BEQ 20$ ;DOES NOT EXIST CLC BIS #INEA,(R4) ;SET INTERRUPT ENABLE BCC 15$ ;SUCCESS ;NO, SST SET CARRY BIT BIS #STSOFL,SWISTS(R5) ;FLAG DEVICE OFF-LINE BR 20$ 15$: BIT #ACLO,(R4) ;POWER ON SWITCHED BUS ? BNE 20$ ;NO BIT #STSCON,SWISTS(R5) ;SWITCH TO BE CONNECTED ? BEQ 20$ ;NO BIS #REQ,(R4) ;YES, SET REQUEST BIT 20$: ADD #SWILEN,R5 SOB R0,10$ MOV (SP)+,R0 MOV (SP)+,R4 MOV (SP)+,R5 ASTX$S .PAGE .SBTTL SYNCHRONOUS SYSTEM TRAP ROUTINE ; ; IT IS ASSUMED THAT THE TRAP OCCURRED BECAUSE THE INIT ; OR AST ROUTINES ATTEMPTED TO ACCESS A DT03 CONTROL REGISTER ; WHICH DOES NOT EXIST. ; SST: BIS #5,2(SP) ;SET ZERO & CARRY BIT IN PSW RTI ; .END INIT