; .TITLE TTYATA ; .IDENT /V1.1/ ; ;+ ; ; TTYATA -- FORTRAN CALLABLE SUBROUTINE TO LINK A FORTRAN ; COMPLETION ROUTINE TO THE UNSOLICITED INPUT ; CHARACTER AST MECHANISM. ; ; WARNING: SINCE AST SERVICE ROUTINES ARE SERIALIZED, THE ; COMPLETION ROUTINE MAY NOT USE ANY FEATURES THAT ; DEPEND ON THE AST MECHANISM, SUCH AS I/O. ; ; ONLY ONE LUN MAY BE ATTACHED THROUGH THIS SUBROUTINE ; AT A TIME, DUE TO THE NATURE OF THE FORTRAN LINKAGE. ; TO CHANGE TTY'S, YOU MUST FIRST CALL TTYDET (SEE BELOW) ; TO CLEAN UP FOR THE NEXT CALL TO TTYATA. TTYATA MARKS ; ITSELF "IN USE" IF $DSW = IS.SUC, REGARDLESS OF THE ; I/O STATUS RETURNED. ; ; CALL TTYATA(LUN,SUBR,IOSB,IERR) ; ; LUN -- PREASSIGNED LOGICAL UNIT NUMBER FOR TTY ; ATTACHMENT WITH UNSOLICITED INPUT ; CHARACTER AST AND EVENT FLAG NUMBER ; SUBR -- NAME OF THE FORTRAN COMPLETION ROUTINE. ; IT MUST BE DECLARED IN AN EXTERNAL SPECIFICATION ; STATEMENT, AND WILL BE CALLED BY THE AST SERVICE ; ROUTINE WITH TWO ARGUMENTS: THE UNSOLICITED ; CHARACTER, AND THE TASK'S WAITFOR MASK (SEE ; EXECUTIVE REFERENCE MANUAL, SECTION 2.3.3), E.G., ; ; ; EXTERNAL SUBR ; : ; CALL TTYATA(5,SUBR,IERR) ; : ; STOP ; END ; ; SUBROUTINE SUBR (CHAR, MASK) ; LOGICAL*1 CHAR ; INTEGER*2 MASK ; : ; RETURN ; END ; ; ; : ; CALL SUBR(CHAR,MASK) ; : ; ; IOSB -- TWO WORD I/O STATUS BLOCK, FILLED IN ; AT THE COMPLETION OF THE ATTACH QIO ; IERR -- ERROR RETURN CODE: ; 0 = NO ERRORS ; 1 = SUBROUTINE ALREADY IN USE ; <0 = DIRECTIVE STATUS ERROR CODE ; ; NOTE: THE QIO IS ISSUED SYNCHRONOUSLY WITH NOTIFICATION ; THROUGH EVENT FLAG #LUN. THE ISSUING TASK MUST FIRST ; CHECK THE DIRECTIVE STATUS WORD (IERR) BEFORE CHECKING ; THE I/O STATUS BLOCK FOR ERRORS. ; ; *** ASSEMBLY INSTRUCTIONS *** ; ; TTYATA MAY BE ASSEMBLED TO PRODUCE TWO VERSIONS: ; ; 1) IF THE SYMBOL NO$$F4 IS DEFINED, TTYATA PERFORMS ; ITS OWN REGISTER SAVES AND RESTORES. YOU MUST ; PREFIX THE SYSTEM CONFIGURATION FILE TO DETERMINE ; WHETHER THE FLOATING POINT HARDWARE IS PRESENT: ; ; >MAC TTYATA,TTYATA=[200,200]RSXMC/PA:1,[G,M]TTYATA ; ; THE COMPLETION ROUTINE WILL BE CALLED USING THE ; STANDARD FORTRAN LINKAGE. ; ; 2) IF THE SYMBOL NO$$F4 IS UNDEFINED, TTYATA ASSUMES IT ; CAN USE THE FORTRAN OTS ROUTINES TO SAVE AND RESTORE ; REGISTERS. ; ; >MAC TTYATA,TTYATA=TTYATA ; ;- ; .PAGE .SBTTL TTYATA - ISSUE IO.ATA QIO ; .MCALL FILIO$,SPCIO$,IOERR$,QIOW$S ; ; DEFINE I/O FUNCTIONS AND ERROR CODES ; FILIO$ SPCIO$ IOERR$ ; .PSECT TTYATA,RO .ENABL LSB ; TTYATA:: CLR @10(R5) ;IERR = 0 TST FORLUN ;IF FORLUN ^= 0, SUBROUTINE IS ALREADY BNE 10$ ; IN USE MOV @2(R5),R0 ;WE'RE OK, PICK UP LUN QIOW$S #IO.ATA,R0,R0,,6(R5),,<#ASTSV$> ;ATTACH WITH UNSOLICITED ;INPUT CHARACTER AST SUPPORT BCS 20$ ;CONTINUE IF NO ERRORS MOV R0,FORLUN ;MARK SUBROUTINE IN USE MOV 4(R5),FORSUB ;SAVE THE ADDRESS OF THE FORTRAN ;COMPLETION ROUTINE EXATA: RETURN ;RETURN TO CALLER ; 10$: INC @10(R5) ;IERR = 1 BR EXATA ; 20$: MOV $DSW,@10(R5) ;IERR = BR EXATA ; .PSECT ; FORLUN: .WORD 0 ;STORE FORTRAN LUN HERE AS "IN USE" FLAG FORSUB: .WORD 0 ;STORE FORTRAN COMPLETION CODE ADDRESS HERE ; .DSABL LSB .PAGE .SBTTL TTYDET - ISSUE IO.DET QIO ; ;+ ; TTYDET -- DETACH TTY FROM LUN AND MARK SUBROUTINE TTYATA AS ; AVAILABLE FOR USE AGAIN. ; ; CALL TTYDET(IOSB,IERR) ; ; IOSB -- SAME AS ABOVE FOR TTYATA ; IERR -- SAME AS ABOVE FOR TTYATA, EXCEPT IERR = 1 INDICATES ; THAT NO LUN IS CURRENTLY ATTACHED. ; ;- ; .PSECT TTYATA .ENABL LSB ; TTYDET:: CLR @4(R5) ;IERR = 0 MOV FORLUN,R0 ;IF (FORLUN .EQ. 0) SOFT ERROR BEQ 30$ QIOW$S #IO.DET,R0,R0,,2(R5) ;DETACH TTY FROM FORLUN BCS 40$ ;DON'T TOUCH "IN USE" FLAG IF ERROR CLR FORLUN ;MARK TTYATA AVAILABLE EXDET: RETURN ;RETURN TO CALLER ; 30$: INC @4(R5) ;IERR = 1 BR EXDET ; 40$: MOV $DSW,@4(R5) ;IERR = BR EXDET ; .DSABL LSB .PAGE .SBTTL TTYAST - AST SERVICE ROUTINE ; ;+ ; ; ASTSV$ TTY UNSOLICITED INPUT CHARACTER AST SERVICE ROUTINE ; ; ON ENTRY, THE STACK CONTAINS: ; ; SP+10 EVENT FLAG MASK WORD ; SP+06 PS OF THE TASK PRIOR TO AST ; SP+04 PC OF THE TASK PRIOR TO AST ; SP+02 TASK'S DIRECTIVE STATUS WORD ; SP+00 THE UNSOLICITED CHARACTER IN THE LOW BYTE ; ; BEFORE EXIT, THE UNSOLICITED CHARACTER MUST BE POPPED OFF THE ; STACK. TO EXIT, INVOKE ASTX$S: ; ; TST (SP)+ ; ASTX$S ; ; THE FORTRAN COMPLETION SUBROUTINE IS CALLED WITH THE ; UNSOLICITED INPUT CHARACTER AS THE FIRST ARGUMENT, AND ; THE EVENT FLAG MASK AS THE SECOND ARGUMENT (TO REPLACE ; THE VALUE ON THE STACK BEFORE DISMISSING THE AST). ; ; *** FORTRAN OTS ROUTINES USED *** ; ; MODULE: FPPUTI ENTRY: $SVFPP FPP REG SAVE ; SAVRG $SAVP0 GEN REG SAVE ; ;- ; .MCALL ASTX$S ; .PSECT TTYATA ; ASTSV$:: MOV SP,ARGLST+2 ;MOVE @ INTO ARG LIST MOV SP,ARGLST+4 ;MOVE @ INTO ARG LIST ADD #10,ARGLST+4 ;(CORRECT FOR SP OFFSET) .IF DF NO$$F4 ;NO FORTRAN OTS, SAVE REGS OURSELVES CALL F4PSR$ ;SAVE REGISTERS FOR FORTRAN TO USE .IFF ;LET FORTRAN OTS SAVE REGS MOV #EXAST,-(SP) ;FORCE OTS COROUTINE TO RETURN TO US CALL $SAVP0 ;SAVE GENERAL REGISTERS CALL $SVFPP ;SAVE FPP REGISTERS (IF PRESENT) .IFTF ;ALWAYS DO COMPLETION ROUTINE MOV #ARGLST,R5 ;POINT TO ARG LIST CALL @FORSUB ;CALL FORTRAN COMPLETION ROUTINE CALL @(SP)+ ;COROUTINE RESTORE ALL OR FPP REGISTERS .IFF RETURN ;OTS COROUTINE RESTORE OF GENERAL REGS ;(RETURNS CONTROL TO EXAST) .ENDC ;DF NO$$F4 EXAST: TST (SP)+ ;POP CHARACTER OFF STACK ASTX$S ;EXIT AST SERVICE ROUTINE ; .PSECT ; ARGLST: .WORD 2 ;2 ARGUMENTS FOR FORTRAN .WORD 0 ;1ST POINTS TO UNSOLICITED CHARACTER .WORD 0 ;2ND POINTS TO EVENT FLAG MASK ; .PAGE .SBTTL F4PSR - REGISTER SAVE COROUTINE (NO OTS) .IF DF NO$$F4 ;REGISTER SAVE FOR NO FORTRAN OTS ; .PSECT TTYATA ; F4PSR$: MOV R0,-(SP) ;SAVE REGISTERS FOR FORTRAN TO USE MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) ; STKDEP=14 ; .IF DF F$$LPP ; F0=%0 F1=%1 F2=%2 F3=%3 F4=%4 F5=%5 ; STFPS -(SP) ;SAVE FPP STATUS AND REGISTERS SETD STD F0,-(SP) STD F1,-(SP) STD F2,-(SP) STD F3,-(SP) LDD F4,F0 STD F0,-(SP) LDD F5,F0 STD F0,-(SP) ; STKDEP=STKDEP+62 ; .ENDC ;DF F$$LPP ; MOV STKDEP(SP),-(SP) ;PICK UP CALLERS RETURN ADDRESS CALL @(SP)+ ;COROUTINE RETURN TO CALLER ; .IFTF .PAGE .SBTTL F4PRR - REGISTER RESTORE COROUTINE (NO OTS) .IFT ;REGISTER RESTORE FOR NO FORTRAN OTS ; MOV (SP)+,STKDEP(SP) ;LOAD RETURN ADDRESS IN SLOT ; .IF DF F$$LPP ; SETD ;RESTORE FPP REGISTERS AND STATUS LDD (SP)+,F0 STD F0,F5 LDD (SP)+,F0 STD F0,F4 LDD (SP)+,F3 LDD (SP)+,F2 LDD (SP)+,F1 LDD (SP)+,F0 LDFPS (SP)+ ; .ENDC ;DF F$$LPP ; MOV (SP)+,R5 ;RESTORE GENERAL REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; .ENDC ;DF NO$$F4 .END