.TITLE DSPLBL - TOP GENERATOR/PROCESSOR .INSERT MOSCNF-1.SML .INSERT MOSMAC.SML .INSERT MOSTBL.SML .INSERT DSPMAC.SML .INSERT DSPTBL.SML .LIST ME $CNFIG .PAGE $DFIOR ;DEFINE I/O REQUEST INFO BLK FORMAT .PAGE $DFIST .PAGE $DFHDR ;DEFINE FORMAT OF LOCAL NET HEADER .PAGE $DFCCB ;DEFINE FORMAT OF SPP CONN CNTL BLK .PAGE $DFPKD ;DEFINE PACKET DESCRIPTOR .PAGE $DFMDB ;DEFINE MATCH DESCRIPTOR $DFDOF ;DEFINE DISPATCH OPTION FLAGS .NLIST ME .LIST MEB .ENABL ISD .GLOBL $LBLER ;LABELER PROCESS' ENTRY POINT .GLOBL $NTSTS ;NETWORK STATUS FLAG .GLOBL $CVTBL ;DSP CONTROL BLOCK VECTOR TABLE .GLOBL $LBLID ;LABELER PID .GLOBL TOPRAT,TOPFLG,TOPCNT,TOPCID .GLOBL $LBLTP,$LBLBT,$NOSTA .PAGE .SBTTL .SBTTL LABELER INITIALIZATION ; ; REGISTER USAGE: R5 (CCB) - ADDRESS OF CONNECTION CONTROL BLOCK ; R4 (IORB) - ADDRESS OF I/O REQUEST BLOCK ; R3 (PKT) - ADDRESS OF PACKET ; CCB = %5 IORB = %4 PKT = %3 ; ; TOP PROCESSOR SIGNAL OPCODES ; SG.TIN = 0 ;TOP/ACK RECEIVE SG.TOT = 1 ;TOP SEND COMPLETION SG.TOP = 2 ;SEND TOP TIMER SIGNAL SG.SD = 3 ;TOP/ACK TIME-OUT SIGNAL SG.OPN = 4 ;CONNECTION OPEN SIGNAL .PAGE ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .SBTTL LABELER/TOP PROCESS $LBLTP: $LBLER: TST $NOSTA ; CHECK IF THERE IS A STATION BEQ 5$ ; BR IF THERE IS A STATION ; DUMMY STATUS FLAGS TO LOOK LIKE ; THERE IS A STATION MOVB #1,TOPFLG ; SET STA RESPONDING FLAG CLRB TOPCNT ; CLR UN-ACKED TOPS COUNT CLRB TOPCID ; CLR TOP CONNECTION ID CLRB $NTSTS+1 ; INDICATE NET STATUS OK $GAPID ; GET LABED PROCESS ID MOVB R0,$LBLID ; SAVE FOR USER SIGNALS BR LBLLP ; BR TO SERVICE SIGNALS ; STATION EXISTS,SETUP FOR TOPS 5$: CLRB TOPFLG ;SET TOP FLAG TO STATION NOT RESPONDING CLRB TOPCID ; ZERO TOP CONNECTION ID $GAPID ;GET OUR PID MOVB R0,$LBLID ;AND SAVE AWAY SO USERS CAN SIGNAL US MOV #HF.NC!HT.ROP,-(SP) ;TOP PACKET TYPE & FCN MOV #HC.FCN!HC.TYP,-(SP) ;MATCH ON FCN & TYPE FIELD CLR -(SP) ;FOREIGN COMPARE WORD CLR -(SP) ;FOREIGN MASK WORD CLR -(SP) ;LOCAL ID WORD CLR -(SP) ;MATCH ON ANY LOCAL ID MOV #DF.ARQ!DF.TRN!DF.NTP*400!SG.OPN,R0 ;ASK FOR E-T-E ACKS MOV SP,R1 ;CONSTRUCT OPEN BLOCK ON STACK 10$: $PROPN R0,R0,R1 ;OPEN THE CONNECTION TST R0 ;CHECK RESULT BMI 10$ ;KEEP ON TRYING MOVB R0,TOPCID ;REMEMBER TOP CONN ID ADD #MDBLEN,SP ;CLEAR UP STACK $WAITS #SG.OPN ;WAIT FOR OPEN CONNECTION SIGNAL $PRRCV #SG.TIN,TOPCID ;ISSUE A RECEIVE ; WAIT FOR WORK HERE LBLLP: $WAIT ; R0 <= SIGNAL OPCODE TST $NOSTA ; CHECK IF A STATION EXISTS BNE LBLLP ; BR IF STATION DOESN'T EXIST BIC #^C3,R0 ;CLEAR ALL BUT INDEX BITS ASL R0 ;CONVERT TO WORD INDEX JSR PC,@OPCTBL(R0) ;CALL ROUTINE TO HANDLE SIGNAL BR LBLLP ;AND GET NEXT SIGNAL OPCTBL: .WORD TOPIN ;INPUT COMPLETION .WORD TOPOUT ;OUTPUT COMPLETION .WORD TOPTIM ;SEND TOP SIGNAL .WORD TOPRTX ;TOP UNACKED TIME-OUT .PAGE .SBTTL TOPIN - TOP RECEIVED TOPIN: MOV R1,IORB ;GET IORB POINTER MOV IRUVA(IORB),PKT ; AND PACKET POINTER CLRB TOPCNT ;CLEAR 'NEED TO GET TOP/ACK' COUNTER TSTB TOPFLG ;WAS THE STATION ALREADY RESPONDING? BNE 1$ ;IF SO, SKIP & CANCEL TIME-OUT SIGNAL $STIME #SG.SD,#0,#0 ;ELSE, CANCEL PREVIOUS TOP TIMER $STIME #SG.SD,#0,TOPRAT ;AND SET NEW TOP TIMER CLRB $NTSTS+1 ;MARK TERMINAL AS DEFINED MOVB #1,TOPFLG ;AND STATION AS RESPONDING 1$: $FVS #PKTLEN+PDLEN,IORB ;RELEASE PACKET $PRRCV #SG.TIN,TOPCID ;ISSUE ANOTHER RECEIVE FOR TOP ACKS RTS PC ;AND RETURN .PAGE .SBTTL TOPOUT - TOP OUTPUT COMPLETION TOPOUT: $FVS #PKTLEN+PDLEN,R1 ;RELEASE THE PACKET RTS PC .PAGE .SBTTL TOPTIM - TOP TIMER EXPIRED TOPRTX: CMPB TOPCNT,#3 ;TOO MANY TOPS NOT ACKED? BLT TOPTIM ;IF NOT, SKIP CLRB TOPFLG ;MARK STATION AS NOT RESPONDING MOVB #1,$NTSTS+1 ;INDICATE TERMINAL UNDEFINED TOPTIM: $AVS #PKTLEN+PDLEN TST R0 ;DID WE GET ANY? BEQ 6$ ;IF NOT, EXIT CLR R0 ;RESET CONNECTION COUNTER MOV R2,R1 ;GET ADDRESS OF IORB ADD #PDLEN,R1 ;ADVANCE TO START OF PKT MOV R1,IRUVA(R2) ;SAVE PACKET POINTER ADD #SPPHDL,R1 ;ADVANCE TO TEXT AREA OF PACKET MOV #$CVTBL,R4 ;GET CONNETION TABLE ADDRESS MOV (R4)+,R3 ; AND NUMBER OF ENTRIES 1$: MOV (R4)+,CCB ;GET NEXT CCB BEQ 2$ ;IF IN USE... BITB #DF.NTP,COPFLG(CCB) ;IS TOPPING ALLOWED? BNE 2$ ;IF NO TOPS, SKIP TST CLCLID(CCB) ;IS A LOCAL ID SET? BEQ 2$ ;IF NOT, DON'T TOP INC R0 ;1 MORE DEVICE ID MOV CLCLID(CCB),(R1)+ ;PUT INTO PACKET MOV CLCLID(CCB),(R1)+ 2$: $LOOP R3,1$ ;GOTO NEXT ENTRY TST R0 ;DID WE FIND ANY? BEQ 4$ ;IF NOT, EXIT ASL R0 ;CONVERT NUMBER OF DEVICE IDS ASL R0 ;INTO TEXT BYTE COUNT ADD #SPPHDL,R0 MOV R0,IRBR(R2) ;PUT INTO PACKET IORB MOVB #SG.TOT,IROPC(R2) ;SET TOP OUTPUT COMPLETION OPCODE $PRSND TOPCID,R2 ;SEND THE TOP TST R0 ; ERROR? BMI 4$ ; YES ==> EXIT INCB TOPCNT ;INDICATE WE SENT ANOTHER TOP TSTB TOPFLG ;IS STATION RESPONDING? BNE 3$ ;YES ==> USE DEFINED RATE MOV TOPRAT+2,R3 ; R3 = UNDEFINED TIMER RATE BR 5$ ; SET TIMER 3$: MOV TOPRAT,R3 ; R3 = DEFINED TIMER RATE 5$: $STIME #SG.SD,#0,#0 ; CANCEL PREVIOUS TOP TIMER $STIME #SG.SD,#0,R3 ; SET TOP TIMER BR 6$ ; EXIT 4$: $FVS #PKTLEN+PDLEN,R2 ;RELEASE PACKET BUFFER 6$: RTS PC $LBLBT: .END