.TITLE TRMATA .IDENT /01/ ; ; VERSION 01 ; ; **-INIAST-INITIALIZE FOR TERMINAL INPUT ASTS ; **-IGTCHR-GET INPUT CHARACTER (WAITING IF NECESSARY) ; **-IGTCON-GET INPUT CONDITIONALLY ON A CHARACTER BEING AVAILABLE ; **-IDTAST-DETACH INPUT AST ATTACH ; ; ; SYSTEM MACRO CALLS ; .MCALL QIOW$S,CLEF$S,SETF$S,ASTX$S,WTSE$S ; ; LOCAL DATA ; XFRVEC: CALL @#ASTENT IOST: .BLKW 2 ; ; **-INIAST-INITIALIZE TERMINAL INPUT ASTS ; CALLING SEQUENCE: ; ISTAT=INIAST(IBUF,IBFSIZ,LUN,IEF,ITYPE) ; WHERE ; ISTAT =I/O STATUS CODE OF ATTACH AND GENERAL SUCCESS ; IBUF =INTEGER VECTOR FOR CONTROL BLOCK AND CHARACTER STORAGE ; IBFSZ =LENGTH OF VECTOR IBUF IN WORDS ; LUN =LOGICAL UNIT NUMBER OF TERMINAL (MUST BE ASSIGNED) ; IEF =EVENT FLAG TO USE IN ALL I/O AND SYNCHRONIZATION ; ITYPE =MODIFIER FOR ATTACH WITH THE FOLLOWING VALUES ; BIT 0 = STANDARD IO.ATA ATTACH IF 0 ; ELSE IO.ATA!TF.BIN ATTACH IF 1 (FULL DUPLEX) ; OUTPUTS: ; THE BUFFER IS SETUP AS FOLLOWS: ; ; _________________ ; ! CALL !0 ; _________________ ; ! @#ASTENT !2 ; _________________ ; !EVNT FLG! LUN !4 ; _________________ ; ! END OF BUFFER !6 ; _________________ ; ! FIRST CHAR OUT!10 ; _________________ ; ! NEXT CHAR IN !12 ; _________________ ; ! !14 ; ! CHARACTER ! ; ! INPUT ! ; ! CIRCULAR ! ; ! BUFFER ! ; ! ! ; ; INIAST::CMPB (R5)+,#5 ; CORRECT NUMBER OF PARAMETERS? BNE 10$ ; IF NE NO INC R5 ; SKIP RESERVED BYTE MOV (R5)+,R0 ; GET BUFFER ADDRESS MOV @(R5)+,R1 ; GET BUFFER LENGTH CMP #10,R1 ; LENGTH GREAT ENOUGH BGT 10$ ; IF LO NO ASL R1 ; CHANGE TO A BYTE LENGTH ADD R0,R1 ; COMPUTE ADDRESS OF LAST WORD PLUS 2 MOV @(R5)+,R2 ; GET LUN NUMBER MOV @(R5)+,R3 ; GET EVENT FLAG NUMBER CLEF$S R3 ; VALID EVENT FLAG? BCC 20$ ; IF CC YES 10$: EMT 0 ; FATAL ERROR IN CALL 20$: MOV R0,R4 ; COPY ADDRESS OF BUFFER MOV XFRVEC,(R4)+ ; INSERT TRANSFER VECTOR MOV XFRVEC+2,(R4)+ ; MOVB R2,(R4)+ ; LUN MOVB R3,(R4)+ ; EVENT FLAG NUMBER MOV R1,(R4)+ ; END OF THE BUFFER MOV R0,R1 ; COPY START OF BUFFER ADD #14,R1 ; COMPUTE START OF CHARACTER AREA MOV R1,(R4)+ ; SETUP FIRST CHARACTER OUT POINTER MOV R1,(R4)+ ; SETUP NEXT CHARACTER IN POINTER MOV #IO.ATA,R4 ; ASSUME STANDARD ATTACH BIT #1,@(R5)+ ; FULL DUPLEX ATTACH? BEQ 30$ ; IF EQ NO BIS #100000,4(R0) ; FLAG IT FOR LATER USE MOV #IO.ATA!TF.BIN,R4 ; SET FOR FULL DUPLEX TRANSPARENT ATTACH 30$: QIOW$S R4,R2,R3,,#IOST,, ; ISSUE THE ATTACH BCC 40$ ; IF CC NO ERRORS MOV $DSW,R0 ; RETURN DSW RETURN ; EXIT 40$: MOV IOST,R0 ; RETURN THE I/O STATUS RETURN ; ; **-IGTCHR-GET NEXT INPUT CHARACTER (WAITING IF NECESSARY) ; **-IGTCON-GET NEXT INPUT CHARACTER CONDITIONALLY ON A CHARACTER ; BEING PRESENT IN BUFFER ; CALLING SEQUENCE: ; ICHAR=IGTCHR(BUFFER) ; WHERE ; ICHAR =CHARACTER RETURNED IN LOW BYTE ; BIT 15 = 1 IF DATA VALID ; IBUF =BUFFER GIVEN AS PARAMETER TO PREVIOUS INIAST CALL ; IGTCHR::CMPB #1,(R5)+ ; CORRECT NUBER OF PARAMETERS? BNE 10$ ; IF NE NO INC R5 ; SKIP RESERVED BYTE MOV (R5)+,R4 ; GET BUFFER ADDRESS CMP XFRVEC,(R4) ; VALID BUFFER? BEQ 20$ ; IF EQ YES (PROBABLY) 10$: EMT 0 ; FATAL ERROR 20$: MOVB 5(R4),R3 ; GET EVENT FLAG NUMBER BIC #177740,R3 ; REMOVE FLAG BITS CLEF$S R3 ; CLEAR SYNCHRONIZATION FLAG CALL GETCOM ; CALL COMMON CODE TST R0 ; GET A CHARACTER? BNE 30$ ; IF NE YES WTSE$S R3 ; WAIT FOR CHARACTER BR 20$ ; TRY AGAIN 30$: RETURN ; EXIT IGTCON::CMPB #1,(R5)+ ; CORRECT NUMBER OF PARAMETERS? BNE 10$ ; IF NE NO INC R5 ; SKIP RESERVED BYTE MOV (R5)+,R4 ; GET BUFFER ADDRESS CMP XFRVEC,(R4) ; VALID BUFFER? BEQ 20$ ; IF EQ YES (PROBABLY) 10$: EMT 0 ; FATAL ERROR 20$: ; REF LABEL GETCOM: CLR R0 ; ASSUME NO CHARACTERS CMP 10(R4),12(R4) ; BUFFER EMPTY? BEQ 20$ ; IF EQ YES MOV 10(R4),R2 ; GET FIRST CHAR OUT POINTER MOV (R2)+,R0 ; GET CHARACTER BIS #100000,R0 ; SHOW DATA PRESENT CMP 6(R4),R2 ; BUFFER WRAP? BHI 10$ ; IF HI NO MOV R4,R2 ; RESET TO START OF BUFFER ADD #14,R2 ; POINT TO CHARACTER AREA 10$: MOV R2,10(R4) ; RESET FIRST OUT POINTER 20$: RETURN ; ; **-IDTAST-DETACH FROM TERMINAL INPUT AST ; CALLING SEQUENCE: ; ISTAT=IDTAST(IBUF) ; WHERE ; ISTAT =I/O STATUS OF DETACH ; IBUF =BUFFER GIVEN AS PARAMETER TO PREVIOUS INIAST CALL ; IDTAST::CMPB #1,(R5)+ ; CORRECT NUMBER OF PARAMETERS? BNE 10$ ; IF NE NO INC R5 ; SKIP RESERVED BYTE MOV (R5)+,R4 ; GET ADDRESS OF BUFFER CMP XFRVEC,(R4) ; VALID BUFFER? BEQ 20$ ; IF EQ YES (PROBABLY) 10$: EMT 0 ; FATAL ERROR 20$: MOVB 4(R4),R0 ; GET LUN MOVB 5(R4),R1 ; EVENT FLAG BIC #177740,R1 ; CLEAR FLAG BITS QIOW$S #IO.DET,R0,R1,,#IOST ; DO I/O MOV IOST,R0 ; RETURN STATUS RETURN ; ; **-ASTENT-AST SERVICE ROUTINE, CALLED FROM BUFFER VECTOR ; ASTENT: MOV R5,-(SP) ; SAVE R5 MOV 2(SP),R5 ; GET ADDRESS OF BUFFER+4 MOV R4,2(SP) ; SAVE R4 MOV 12-4(R5),R4 ; GET NEXT CHAR IN POINTER MOV 4(SP),(R4)+ ; STUFF CHARACTER RECEIVED INTO BUFFER MOV R3,4(SP) ; SAVE R3 CMP 6-4(R5),R4 ; BUFFER WRAP? BHI 10$ ; IF HI NO MOV R5,R4 ; RESET POINTER TO BUFFER+4 ADD #14-4,R4 ; POINT TO START OF CHARACTER AREA 10$: MOV R4,12-4(R5) ; RESET POINTER MOVB 5-4(R5),R3 ; GET EVENT FLAG BIC #177740,R3 ; CLEAR OFF FLAG BITS SETF$S R3 ; SET EVENT FLAG MOV (SP)+,R5 ; RESTORE REGISTERS MOV (SP)+,R4 ; MOV (SP)+,R3 ; ASTX$S ; .END