TTDRV.MAC;2/AU/-BF=TTDRV.MAC;1 \ -/19/,. .IDENT /1900F3/ -/19/,. ; VERSION 19 FULL DUPLEX VERSION 3 -/MODIFIED BY:/ ; ; M. PETTENGILL 15-APR-77 ; FDPLX -- ADD SUPPORT FOR A FULL DUPLEX BINARY (IE. TRANSPARENT) ; ATTACH FOR UNSOLICTED INPUT AST. THIS ALLOWS A NON- ; PRIVILEDGED TASK TO IMPLEMENT FULL DUPLEX I/O IN LOW ; SPEED OR LOW VOLUME APPLICATIONS. ; ; THIS FEATURE IS LOWER OVERHEAD AND MORE RELIABLE THAN ; OTHER METHODS OF PROVIDING SUCH SUPPORT OTHER THAN A ; SPECIALIZED TERMINAL DRIVER WHICH WOULD LIMIT THE USE ; OF THE TERMINAL INTERFACE IN GENERAL COMMAND MODE. ; ; NOTE ; ____ ; WHEN A TERMINAL IS ATTACHED VIA A QIOW$ IO.ATA!TF.BIN,. ; ..., ALL READ FUNCTIONS ARE DISABLED UNTIL THE TERMINAL ; IS DETACHED. ; ; ALL UNSOLICTED CHARACTERS ARE PASSED TO THE ATTACHED ; TASK IN A MANNER COMPATIBLE WITH THE IO.ATA FUNCTION. ; THE CHARACTER IS PASSED AS A FULL WORD INCLUDING THE ; HARDWARE ERROR BITS IN THE HIGH BYTE. ; ; BIT 15 IS SET FOR DATA ENTRY ; BIT 14 IS SET IF OVER RUN ERROR ; BIT 13 IS SET IF FRAMING ERROR ; BIT 12 IS SET IF PARITY ERROR ; BITS 11-8 ARE UNDEFINED ; BITS 7-0 CONTAIN 8 BIT RECEIVED DATA ; % -/FILTB/ -/.EVEN/+1,,/; FDPLX/ .IF DF T$$CCA&A$$TRP .PSECT FDPLX,ABS FDSSIZ=5 ; SILO SIZE IN CHARACTERS ; FULL DUPLEX CONTROL BLOCK FORMAT FDCNT: .BLKB 1 ; COUNT OF CHARACTERS CURRENTLY IN THE SILO FDSTS: .BLKB 1 ; NON-ZERO IF FORK PENDING, MINUS IF DETACH REQUIRED FDFRK: .BLKW 1 ; FORK BLOCK (LINK WORD) FDPC: .BLKW 1 ; FORK PC FDR5: .BLKW 1 ; FORK R5 FDR4: .BLKW 1 ; FORK R4 FDASR5: .BLKW 1 ; APR5 FDAST: .BLKW 1 ; TASK AST ADDRESS FDSILO: .BLKW FDSSIZ*2 ; SILO FDCTL: ; CONTROL BLOCK SIZE .PSECT $ATTFD: CMP #IO.ATT!TF.AST!TF.BIN,I.FCN(R1) ; FULL DUPLEX DESIRED? BEQ 10$ ; IF EQ YES BIT #1,CCAST(R3) ; FULL DUPLEX ATTACH? BEQ 3$ ; IF EQ NO CMPB #IO.RLB/400,I.FCN+1(R1) ; READ LOGICAL BLOCK? BEQ 6$ ; IF EQ YES .IF DF T$$RPR CMPB #IO.RPR/400,I.FCN+1(R1) ; READ WITH PROMPT? BEQ 6$ ; IF EQ YES .ENDC 3$: ; REFERENCE LABEL ; ; PERFORM REMOVED INSTRUCTION ; .IF DF T$$ESC CMPB #IO.ATT/400,I.FCN+1(R1) ; ATTACH FUNCTION? .IFF CMP #IO.ATT!TF.AST,I.FCN(R1) ; UNSOLICTED INPUT AST ATTACH? .ENDC RETURN 6$: MOV #IE.RSU&377,R0 ; FULL DUPLEX ATTACH, DISALLOW ALL READS TST (SP)+ ; CLEAN STACK BR 30$ ; FINISH I/O 10$: MOV R1,(SP) ;SAVE ADDRESS OF I/O PACKET (CLEANING STACK) MOV #FDCTL,R1 ;SAZE TO ALLOCATE CALL $ALOCB ;ALLOCATE CONTROL BLOCK FOR AST SERVICE BCS 20$ ;IF CS FAILURE MOV (SP)+,R1 ;RETREIVE ADDRESS OF I/O PACKET MOV R0,-(SP) ;SAVE ADDRESS OF CONTROL BLOCK CLR (R0)+ ;(FDSTS) CLEAR STATUS WORD CMP (R0)+,(R0)+ ;(FDFRK) SKIP FORK LINK AND PC MOV R5,(R0)+ ;(FDR5) SAVE R5 MOV (SP),(R0)+ ;(FDR4) ADDRESS OF CONTROL BLOCK MOV KISAR5,(R0)+ ;(FDASR5) DRIVER RELOCATION BASE MOV I.PRM(R1),(R0)+ ;(FDAST) AND ADDRESS OF AST ROUTINE INC (SP) ; MARK AS CONTROL BLOCK MOV (SP)+,CCAST(R3) ;SAVE ADDRESS OF CONTROL BLOCK MOV #IS.SUC&377,R0 ;SUCCESS! BR 30$ ;JOIN COMMON CODE 20$: MOV #IE.NOD&377,R0 ;INSUFFICIENT DYNAMIC MEMORY 30$: CALL $IODON ;FINISH I/O CALLR TTINI ;TRY FOR ANOTHER REQUEST ; $DETFD: ;REF LABEL ; ; REPLACE REMOVED INSTRUCTION ; BIC #CCON!WESC,U.CNT+2+ATERS(R5) ;SHOW NO CONTROL C AST ;AND NO ESCAPE SEQ ACTION MOV U.CNT+2+CCAST(R5),R0 ;GET AST CONTROL BLOCK ADDRESS ROR R0 ;FULL DUPLEX ATTACH? BCC 20$ ;IF CC NO ASL R0 ;CLEAR LOW BIT CLR U.CNT+2+CCAST(R5) ;DISABLE FURTHER AST'S TST (R0) ;(FDSTS) FORK PENDING? BEQ 10$ ;IF EQ NO MOV #-1,(R0) ;(FDSTS) SIGNAL END OF USEFULNESS BR 20$ ;RETURN 10$: MOV #FDCTL,R1 ;SIZE TO DEALLOCATE CALL $DEACB ;DEALLOCATE THE CONTROL BUFFER 20$: MOV #IS.SUC&377,R0 ;SET SUCCESS RETURN ; $QUEFD: MOV CCAST(R3),R4 ;GET ADDRESS OF CONTROL BLOCK (R4=FDCNT+1) MOVB -(R4),R3 ;(FDCNT) GET POINTER INTO BUFFER CMP #FDSSIZ,R3 ;ROOM FOR MORE? BLOS 10$ ;IF LOS NO ASL R3 ;MAKE IT A WORD OFFSET ADD #FDSILO,R3 ;POINT TO BUFFER ADD R4,R3 ;AND TO CONTROL BLOCK MOV (SP)+,(R3) ;SAVE CHARACTER BIS #100000,(R3) ;SET DATA VALID BIT INCB (R4)+ ;(FDCNT) INCREMENT COUNT OF CHARACTERS BUFFERED TSTB (R4) ;(FDSTS) FORK REQUIRED? BEQ 20$ ;IF EQ YES RETURN ;EXIT INTERRUPT 10$: TST (SP)+ ;CLEAN STACK RETURN ;EXIT INTERRUPT ; 20$: INCB (R4)+ ;(FSSTS) SET FORK IN PROGRESS CMP (R4)+,(R4)+ ;(FDFRK) POINT TO PC IN FORK BLOCK CALL $FORK0 ;(FDPC) CREATE SYSTEM PROCESS CLRB 1(R4) ;(FDSTS) RELEASE FORK BLOCK 30$: TSTB (R4) ;(FDCNT) GET SILO COUNT (MINUS TO DETACH) BMI 50$ ;IF MI DETACHED BEQ 70$ ;IF EQ NO MORE CHARACTERS MOV R4,R0 ;COPY CONTROL BLOCK POINTER ADD #FDSILO,R0 ;POINT TO SILO MOV (R0)+,-(SP) ;SAVE CHARACTER MOV #FDSSIZ-1,R1 ;MAXIMUM TO MOVE MTPS #340 ;INTERRUPT SYNC 40$: MOV (R0)+,-4(R0) ;;;MOVE CHARACTER DOWN DEC R1 ;;;DONE? BNE 40$ ;;;ADJUST COUNTER DECB (R4) ;;;SHOW CHARACTER REMOVED FROM BUFFER MTPS #0 ;;;RETURN TO SYSTEM SYNC MOV U.ATT(R5),R0 ;GET TCB OF TASK BEQ 80$ ;IF EQ NO TASK ATTACHED BIT #T2.HLT,T.ST2(R0) ;TASK BEING HALTED? BNE 60$ ;IF NE YES MOV #6*2,R1 ; LENGTH OF AST BLOCK CALL $ALOCB ;ALLOCATE CORE BLOCK FOR AST BCS 60$ ;IF CS DIDN'T GET ONE TST (R0)+ ;SKIP LINK WORD MOV R1,(R0)+ ;(A.CBL) SAVE SIZE OF BLOCK MOV R0,R1 ;COPY POINTER CMP -(R1),-(R1) ;POINT TO START OF BLOCK MOV #10*2,(R0)+ ;(A.BYT) SAVE BYTES TO ALLOCATE ON STACK MOV 14(R4),(R0)+ ;(A.AST) AST TRAP ADDRESS MOV #1,(R0)+ ;(A.NPR) NUMBER OF PARAMETERS MOV (SP)+,(R0)+ ;(A.PRM) UNSOLICTED CHARACTER IS AST PARAMETER MOV U.ATT(R5),R0 ;ADDRESS OF TCB CALL $QASTT ;INSERT AST BLOCK IN AST QUEUE BR 30$ ;GET NEXT CHARACTER 50$: MOV R4,R0 ;COPY ADDRESS OF CONTROL BLOCK MOV #FDCTL,R1 ;NUMBER OF BYTES TO RELEASE CALLR $DEACB ;DEALLOCATE CORE BLOCK 60$: TST (SP)+ ;CLEAN STACK CLRB (R4) ;THROW AWAY QUEUED CHARACTERS 70$: RETURN 80$: CRASH ;NO TASK ATTACHED BUT AST STILL ACTIVE .ENDC -/TTINI:/+75 -/400,I.FCN+1(R1)/,.,/; FDPLX/ CALL $ATTFD ;CHECK FOR FULL DUPLEX ATTACH -/CMP #IO.ATT!TF.AST,I.FCN(R1)/,.,/; FDPLX/ CALL $ATTFD ;CHECK FOR FULL DUPLEX ATTACH -/ BIC #CCON!WESC,ATERS(R3)/,.,/; FDPLX/ CALL $DETFD ;CHECK FOR FULL DUPLEX CLEAN-UP -/TTHUP:/ -/BIC #T3,U.CNT+2+ATERS(R5)/,,/; FDPLX/ .IF DF T$$CCA MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) ; MOV R2,-(SP) ; CALL $DETFD ;DETACH ANY FULL DUPLEX ATTACH MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R1 ; MOV (SP)+,R0 ; .ENDC -/$DLINP::/ -/2$:/,,/; FDPLX/ .IF DF T$$CCA&A$$TRP BIT #1,CCAST(R3) ;FULL DUPLEX ATTACH IN EFFECT BEQ 25$ ;IF EQ NO JMP $QUEFD ;QUEUE CHARACTER FOR FULL DUPLEX SERVICE 25$: ;REF LABEL .ENDC /