.TITLE PDJ DATACOMMUNICATION HANDLER FOR JOB WITH RSP PROTOCOL. ; Multiprocessor V5 ; file PDJ50.MAC, this is the JOB interrupt handler for: ; Q-bus -> WBV-11 & DRV-11 00 ; UNIBUS -> WB -11 & DR -11C & DR -11K ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; ; COPYRIGHT (c) 1985/86 by H.H. Klin. Neuro. AZG ; ; ; ; This software is furnished under a LICENSE and may be USED ONLY IN ; ; ACCORDANCE WITH THE TERMS OF SUCH LICENSE. This software or ; ; any other copies thereof may not be provided or otherwise made ; ; available to any other person. NO TITLE TO AND OWNERSHIP OF THE ; ; SOFTWARE IS HEREBY TRANSFERRED. ; ; ; ; The information in this software is subject to change without notice. ; ; ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; DR11 = 0 ;0=WB-11, 1=DR-11C, 2=DR-11K interface CKS = 1 ;0=minimal error checking, 1=enable checksum checking(safer!) TIM$IT= 1 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; .SBTTL MACROS AND DEFINITIONS ;----------------------------- .MCALL .DRDEF, .MTPS, .PRINT, .INTEN, .TIMIO, .CTIMIO, .FORK .ENABL LC .if EQ,DR11 ;;.DRDEF PD,300, SPFUN$,0,175610,270 ; 1st WB(V)-11 .DRDEF PD,300, SPFUN$,0,175620,170 ; 2nd WB(V)-11 CS$INI=100 ;IE bit in CSR of input, bit 1 is for IE down check! CS$INO=100 ;IE bit in CSR of Output PD$PRI=4 .endc .if EQ,DR11-1 .DRDEF PD,300, SPFUN$,0,167770,310 CS$INI=40 ;IE bit in CSR of input CS$INO=100 ;IE bit in CSR of Output PD$PRI=5 .endc .if EQ,DR11-2 .DRDEF PD,300, SPFUN$,0,167750,320 CS$INI=100 ;IE bit in CSR of input CS$INO=40000 ;IE bit in CSR of Output PD$PRI=4 .endc INIT = 4 ;4. RSP protocol CONTIN = 20 ;16. chars CNDATA = 40 ;32. =continue with data BOOT = 10 ;8. COMMND = 2402 ;2. =command flag, high byte: 5.=wordcount PKMSIZ = 5 ;Command packet word size CHECK = 125252 ;Bit pattern send and checked when NO checksum .DRSET SHOW,-1,S.SHOW ;;SHOW .DRSET JOBNUM,6,S.JOB, ;;Set No. Device Units. ; .SBTTL SET option processing routines ;------------------------------------- NR=4 S.SHOW: MOV R4,-(SP) MOV R5,-(SP) MOV PC,R0 ADD #S.HEAD-.,R0 .PRINT MOV PC,R4 ADD #NUMBER-.,R4 MOV PC,R5 ADD #TEXT-.,R5 MOV #NR,R2 MOV PC,R1 ADD #OUTP-.,R1 LOOP: MOV (R4)+,R0 MOV R1,R3 ;+ CALL CNV8 ; Routine converts bits to octal ASCII string. ; R0; Contains bits to be converted ; R3; Points to output area ; Size of area should be nr. digits plus two ; On return R3 points to string terminator ; Note: Contens of R0, R3 is changed!! CNV8:: MOV R1,-(SP) CALL CONVRT MOVB #' ,(R3)+ MOVB #200,@R3 MOV (SP)+,R1 ;- End CNV8 .PRINT R5 .PRINT R1 ADD #8.,R5 SOB R2,LOOP MOV PC,R0 ADD #CRLF-.,R0 .PRINT MOV (SP)+,R5 MOV (SP)+,R4 CLC RETURN S.JOB: CMP R0,R3 BHI 2$ ;Not too high! TST R0 BLT 2$ ADD #300,R0 ;Valid identifiers: 300,301,302,... 306 MOVB R0,56 ;Set DEVICE IDENTIFIER. MOVB R0,NUMBER ;Copy DEVICE IDENTIFIER for SHOW RETURN 2$: SEC RETURN NUMBER: .WORD PDSTS .WORD PD$CSR .WORD PD$VEC .WORD PD$PRI TEXT: .ASCII /Status=/<200> .ASCII /IntCSR=/<200> .ASCII /Vector=/<200> .ASCII /Prio=/<200> S.HEAD: .ASCII /RSP / .iif EQ,DR11 .ASCII /WB-11/ .iif EQ,DR11-1 .ASCII /DR-11C/ .iif EQ,DR11-2 .ASCII /DR-11K/ .ASCII / JOB-Hndlr / .if NE,CKS .ASCIZ /(Checksum enabled!):/ .iff .ASCIZ /(NO Checksum!):/ .endc OUTP: .BLKB 10. CRLF: .BYTE 0 .EVEN ;+ CONVRT CONVRT: MOV R0,R1 CLR R0 DIV #8.,R0 MOV R1,-(SP) TST R0 BEQ DONE CALL CONVRT DONE: MOVB (SP)+,@R3 BISB #'0,(R3)+ RETURN ;- End CONVRT .IIF GT <.-1000>, .ERROR .-1000 ;SET code too big! ;----------------------------------------------------------------------------; ; CONTROLS: ; ========= ; INPFLG: = 0 Listen ; = 1 receive DATA-packet, after recept of header must ; must be set to -1. ; = 2 receive packet checksum. ; =-1 " (data) body of packet. ; ; ERROR: = 0 No error ; = 1 packet send/received: INIT, give CONTINUE. ; = 2 DATA-packet header error. ; ; =-1 after receiving: CHECKSUM ERROR, send ENDPACKET. ; ; WCNTX: = >0 nr. of words to be send ; = 0 return from send, all done, goto XEXIT ; = -1 send checksum ; ; I/O formats: ; ============ ; .READW => 1. WCNT = 5, BLKN=Error address => rec. COMMAND packet request ; 2. WCNT = 1, BLKN=0 => receive DATA packet request ; ; .WRITW => 1. WCNT = 5, BLKN=+1 => send END packet ; 2. WCNT<=256., BLKN=0 => send DATA packet ; 3. WCNT =256., BLKN=-1 => send BOOTstrap ; ;----------------------------------------------------------------------------; .SBTTL START I/O ENTRY ;---------------------- .DRBEG PD CACHE MOV PDCQE,R4 TSTB Q$FUNC(R4) BEQ 1$ RETURN 1$: CLR INPFLG CLR WCNTX .iif NE,DR11 CLR R3 ;Interrupt bit mask MOV Q$BUFF(R4),BUFDAT MOV Q$WCNT(R4),R0 BMI PDWRIT ; It's a READ: ; ============ PDREAD: MOV (R4),R5 ;RECEIVE data from line. Save Q$BLKN. BEQ RDDATA MOV R5,ERRPT ;Set Error Pointer CLR @R5 ;Clear error BR X ; and go looking for Commandpacket RDDATA: MOV #CNDATA,@XBUF ;Receive DATA, but 1st send CNDATA INC INPFLG ;Set INPFLG = 1 X: BR PDRET ; It's a WRITE: ; ============= PDWRIT: NEG R0 MOV R0,WCNTX TST (R4) ;SEND data to line. Test Q$BLKN. BEQ WTDATA BGT SNDEND WTBOOT: DEC WCNTX ;We send 1st word here! INC INPFLG ;Indicate no check(sum) to be send! MOV @BUFDAT,@XBUF ADD #2,BUFDAT BR OUTY WTDATA: CLR R4 ;Set up header data packet, flag=1 CMP #256.,R0 ;Full packet? BEQ 1$ BISB R0,R4 SWAB R4 1$: INC R4 ;Set data flag=1 BR OUTX SNDEND: MOV ENDPKT,R4 ;Set up flag + packet count OUTX: .if NE,CKS MOV R4,CHKSUM .iff MOV #CHECK,CHKSUM .endc MOV R4,@XBUF ;Send 1st word = header DATA/END packet OUTY: .if EQ,DR11 BIS #CS$INO,@XCSR ;Interrupt enable output .iff BIS #CS$INO,R3 ;Interrupt enable output BIS #1,@#PD$VEC+2 ;IE flag .endc PDRET: .if EQ,DR11 BIS #CS$INI,@RCSR ;Interrupt enable input .iff BIS #CS$INI,R3 ;Interrupt enable input MOV R3,@CSR .endc RETURN ERRPT: .WORD 0 ;Pointer to JOB data area, 1st word=error ;-----------------JOB MONITOR: input interrupt service-------------------; BR ABORT PDINT:: TST INPFLG BLT RDATA ;Most frequent branch BEQ INI .INTEN PD$PRI,PIC MOV @RBUF,R4 ;input-data CMP INPFLG,#2 ;HEADER of packet or TAIL? BEQ TAIL HEADER: CMPB R4,#1 ;R4 = DATHDR=DATA-packet flag? BEQ 4$ ;O.K. go on MOV #2,@ERRPT ;Hard error BR RESUM 4$: .iif NE,CKS MOV R4,CHKSUM ;Init checksum. MOV #-1,INPFLG ;DATA next. SWAB R4 MOVB R4,WCNTR ;Nr. of Data-words to receive CLRB WCNTR+1 ;Make sure upper byte=0 TSTB R4 ;Full packet? BNE 5$ ;O.K. MOV #256.,WCNTR ;Do them all. 5$: .iif EQ,DR11-2 MOV #CS$INI,@CSR ;Interrupt enable input RETURN RDATA: MOV @RBUF,@BUFDAT ;Get DATA WORD .if NE,CKS ADD @BUFDAT,CHKSUM ;Update ADC CHKSUM ; checksum .endc ADD #2,BUFDAT ;Point to next word. DEC WCNTR BGT 1$ MOV #2,INPFLG 1$: .iif EQ,DR11-2 MOV #CS$INI,@CSR ;Interrupt enable input RTI TAIL:.if NE,CKS CMP R4,CHKSUM ;Comp. received with calc. one. .iff CMP R4,#CHECK ;Comp. received with fixed one. .endc; CKS BEQ RESUM ;O.K. MOV #-1,@ERRPT ;Give checksum error RESUM: BR RESUME ;-----------------------------------------------------------------------; ABORT: .if EQ,DR11 CLR @RCSR CLR @XCSR .iff CLR @CSR .endc CLR ERRPT ;NOJOB (ERRPT points to datablock in job) BR RESUME ; ; HOST has something to do for us ? ; INI: .INTEN PD$PRI,PIC MOV @RBUF,R4 ;input-data CMP R4,#COMMND ;COMMAND? BEQ COMMD CMP R4,#INIT ;INIT? BNE BOT ;BOOT? MOV #1,@ERRPT ;Indicate INIT ERROR ;***** We received an INIT ***** RCONT: MOV #CONTIN,@XBUF ;Give CONTINUE BR PDEXIT ; BOT: CMP R4,#BOOT BNE RET MOV R4,@BUFDAT RESUME: BR PDEXIT ; COMMD: .iif NE,CKS MOV R4,CHKSUM ;Init checksum. MOV #PKMSIZ,WCNTR MOV #-1,INPFLG ;No data-header separately RET: .iif EQ,DR11-2 MOV #CS$INI,@CSR ;Interrupt enable input RETURN ;----------------------Ouput(XT) interrupt service-------------------------; PDINTX: TST WCNTX ;Check number to send BGT XDATA ;Go on transmitting data (Most frequent br.) BEQ XREADY CHKSND: CLR WCNTX TST INPFLG ;When BOOT: no checksum BNE XREADY MOV CHKSUM,@XBUF ;Send CHECK / Checksum .iif EQ,DR11-2 MOV #CS$INO!CS$INI,@CSR ;Interrupt enable RTI XDATA: MOV @BUFDAT,@XBUF ;SEND value .if NE,CKS ADD @BUFDAT,CHKSUM ;Calculate ADC CHKSUM ; checksum. .endc ADD #2,BUFDAT ;Point to next word. .iif EQ,DR11-2 MOV #CS$INO!CS$INI,@CSR ;Interrupt enable DEC WCNTX ;One less to do BEQ 1$ ;NO RTI 1$: DEC WCNTX ;Set WCNTX = -1 RTI XREADY: .INTEN PD$PRI,PIC ;------------------------------------------------------------------------; PDEXIT:: .if EQ,DR11 CLR @RCSR ;Disable all interrupts CLR @XCSR BIC #1,@#PD$VEC+2 ;IE flag .iff MOV #0,@CSR .endc .DRFIN PD ;exit to completion I/O ;------------------------------------------------------------------------; INPFLG: .WORD 0 WCNTR: .WORD 0 WCNTX: .WORD 0 CHKSUM: .WORD 0 BUFDAT: .WORD 0 ENDPKT: .BYTE 2,5 .SBTTL PD VECTOR AND CSR ADDRESS LIST ;------------------------------------- .if EQ,DR11-1 ;C CSR: .WORD PD$CSR RBUF: .WORD PD$CSR+4 XBUF: .WORD PD$CSR+2 VECTAB: .DRVTB PD,PD$VEC,PDINTX .DRVTB ,PD$VEC+4,PDINT .endc .if EQ,DR11 ;WB(V) RCSR: .WORD PD$CSR RBUF: .WORD PD$CSR+2 XCSR: .WORD PD$CSR+4 XBUF: .WORD PD$CSR+6 VECTAB: .DRVTB PD,PD$VEC,PDINT .DRVTB ,PD$VEC+4,PDINTX .endc .if EQ,DR11-2 ;K CSR: .WORD PD$CSR RBUF: .WORD PD$CSR+2 XBUF: .WORD PD$CSR+4 VECTAB: .DRVTB PD,PD$VEC,PDINT .DRVTB ,PD$VEC+4,PDINTX .endc .DREND PD .END