.TITLE QNJ DATACOMMUNICATION HANDLER FOR JOB WITH RSP PROTOCOL. ; Multiprocessor V5 ; file QNJ50.MAC, this is the interrupt handler for the Qnector ; DMA hardware(Westfries Systems b.v.) ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; ; COPYRIGHT (c) 1985 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. ; ; ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; TIM$IT= 1 CKS = 1 ;0=minimal error checking, 1=enable checksum checking(safer!) ; *** Qnector interface defenitions *** QN$PRI = 7 ;QNECTOR Interrupt priority setting BAR = 172410 ;QNECTOR Address (switch setting) QNVEC = 170 ;QNECTOR Vector (switch setting) WCR = BAR+2 ;Word Count Register. CSR = BAR+4 ;Command and Status Register. COL=20000 ;Collision indicator bit STP= 400 ;Cancel IO bit IE = 100 ;Interrupt enable bit CE = 4 ;Enable collision interrupt SND= 2 ;Transmit data GO = 1 ;Start transfer XOFF = 23 ;19. RSP-serial INIT = 4 ;4. 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 PKDSIZ = 256. ;Data " " " PKASIZ = 2*PKDSIZ ;Data " corresp. adres offset. CHECK = 125252 ;Bit pattern send and checked when NO checksum .SBTTL MACROS AND DEFINITIONS ;----------------------------- .MCALL .DRDEF, .MTPS, .PRINT, .INTEN, .TIMIO, .CTIMIO .ENABL LC .DRDEF QN,300, SPFUN$,0,172410,170 .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 QNSTS .WORD QN$CSR .WORD QN$VEC .WORD QN$PRI TEXT: .ASCII /Status=/<200> .ASCII /IntCSR=/<200> .ASCII /Vector=/<200> .ASCII /Prio=/<200> S.HEAD: .ASCII /RSP Qnector JOB-Handler / .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. ; = 3 Interface hard error. ; ; =-1 after receiving: CHECKSUM ERROR, send ENDPACKET. ; ; WCNTX: = >0 nr. of words to be send ; = 0 return from send, goto EXIT=after boot / Continue=CNDATA ; = -1 send checksum ; = -2 checksum is send, exit handler. ; ; 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 QN CACHE MOV QNCQE,R4 TSTB Q$FUNC(R4) BEQ 1$ RETURN 1$: CLR INPFLG CLR WCNTX MOV Q$BUFF(R4),BUFDAT MOV Q$WCNT(R4),R0 BMI QNWRIT QNREAD: MOV (R4),R5 ;RECEIVE data from line. Save Q$BLKN. BEQ RDDATA MOV R5,ERRPT ;Set Error Pointer CLR @R5 ;Clear error JMP ONEINP ; and go looking for Commandpacket RDDATA: MOV #CNDATA,ONEWRD ;Receive DATA, but 1st send CNDATA INC INPFLG ;Set INPFLG = 1 BR ONEO QNWRIT: NEG R0 MOV R0,WCNTX TST (R4) ;SEND data to line. Test Q$BLKN. BEQ WTDATA BGT SNDEND WTBOOT: MOV #256.,R4 CLR WCNTX JMP BUFOUT WTDATA: MOV #1.,ONEWRD ;Set up header data packet, 1=flag CMP #256.,R0 ;Full packet? BEQ OUTX MOVB R0,ONEWRD+1 BR OUTX SNDEND: MOV ENDPKT,ONEWRD ;Set up flag + packet count OUTX: .IF NE,CKS MOV ONEWRD,CHKSUM .IFF MOV #CHECK,CHKSUM .ENDC ONEO: JMP ONEOUT ;-----------------JOB MONITOR: interrupt service-------------------; ERRPT: .WORD 0 .DRAST QN,QN$PRI,ABORT MOV @#CSR,R4 ;Get status-data BPL 1$ MOV #3,@ERRPT ;Indicate HARD ERROR 1$: CLR @#CSR ;Cleanup, disable interrupts! BIT #SND,R4 ;We were sending? BEQ 2$ JMP SNDTX 2$: TST INPFLG BEQ INI ;=0 Listen BLT RDATA ;Receive data CMP INPFLG,#2 ;HEADER of packet or TAIL? BEQ TAIL HEADER: CMPB CMDPKT,#1 ;DATA-packet flag? BEQ 4$ ;O.K. go on MOV #2,@ERRPT ;Hard error BR RESUME 4$: CLR R4 ;!? Do not use MOVB to registr.! BISB CMDPKT+1,R4 ;Nr. of Data-words to receive BNE 5$ ;O.K. MOV #256.,R4 ;Do them all. 5$: MOV R4,WCNTR ;Store JMP GETBUF ;Sets FLAG, inits CHKSUM, jump to BUFINP RDATA: .if NE,CKS MOV WCNTR,R5 MOV BUFDAT,R4 ;Get buffer pointer of DATA RLOOP: ADD (R4)+,CHKSUM ;Update ADC CHKSUM ; checksum SOB R5,RLOOP .endc ;CKS MOV #2,INPFLG JMP ONEINP TAIL: .if NE,CKS CMP CMDPKT,CHKSUM ;Comp. received with calc. one. .iff CMP CMDPKT,#CHECK ;Comp. received with fixed one. .endc; CKS BEQ RESUME ;O.K. MOV #-1,@ERRPT ;Give checksum error RESUME: JMP QNEXIT ABORT: CLR @#CSR CLR ERRPT ;NOJOB (ERRPT points to datablock in job) BR RESUME ; ; HOST has something to do for us ? ; INI: CMP CMDPKT,#COMMND ;COMMAND? BEQ COMMD CMP CMDPKT,#BOOT ;BOOT command? BEQ BOTCMD CMP CMDPKT,#INIT ;INIT? BEQ 1$ BR ONEINP ;Get next one. ;***** We received an INIT, so transmitter must be ready *****; 1$: MOV #1,@ERRPT ;Indicate INIT error MOV #CONTIN,ONEWRD ; CONTINUE CLR WCNTX ;TX: do nothing after interrupt JMP ONEOUT BOTCMD: MOV CMDPKT,@BUFDAT BR RESUME COMMD: MOV #PKMSIZ,R4 ;R4 = WCNT, wordcount. MOV R4,WCNTR GETBUF: MOV #-1,INPFLG ;Data next. .iif NE,CKS MOV CMDPKT,CHKSUM ;Init checksum! BR BUFINP ;-------------------------- Output(XT) service -----------------------------; SNDTX: MOV WCNTX,R5 ;Get nr. to send BMI CHKSND ;Send checksum/resume main BNE 1$ TST INPFLG ;When CNDATA: receive header BNE ONEINP BR QNEXIT ;After bootstrap send or CONTINUE send 1$: MOV WCNTX,R4 ;Wordcount for QN MOV R4,WCNTR ;Save MOV #-1,WCNTX BR BUFOUT CHKSND: CMP #-2,WCNTX BEQ QNEXIT ;RESUME .if NE,CKS MOV WCNTR,R5 MOV BUFDAT,R4 ;BUFDAT sould be pointing to data XLOOP: ADD (R4)+,CHKSUM ;Calculate ADC CHKSUM ; checksum. SOB R5,XLOOP .endc; CKS MOV #-2,WCNTX ;Resume main next, goto ONEOUT MOV CHKSUM,ONEWRD ;------------------------- QN interface service ----------------------------; ONEOUT: BIS #SND,QNPATR MOV PC,R5 ADD #ONEWRD-.,R5 BR QNGO1 ONEINP: BIC #SND,QNPATR MOV PC,R5 ADD #CMDPKT-.,R5 QNGO1: MOV R5,@#BAR MOV #-1,@#WCR BR QNGO BUFOUT: BIS #SND,QNPATR BR QNGOB BUFINP: BIC #SND,QNPATR QNGOB: MOV BUFDAT,@#BAR NEG R4 MOV R4,@#WCR QNGO: MOV QNPATR,@#CSR RETURN ;------------------------------------------------------------------------; QNEXIT::.DRFIN QN ;exit to completion I/O QNPATR: .WORD CE+IE+GO INPFLG: .WORD 0 WCNTR: .WORD 0 WCNTX: .WORD 0 CMDPKT: .WORD 0 CHKSUM: .WORD 0 ONEWRD: .WORD 0 BUFDAT: .WORD 0 ENDPKT: .BYTE 2,5 .DREND QN .END