; VALIO - VAL PACKAGE I/O ROUTINES ; LAST EDIT: 1-OCT-81 ; ;- .NLIST .NLIST BEX .LIST TTM .TITLE VALIO .LIST ; .IDENT /V003/ ; ; THIS MODULE MUST BE ASSEMBLED PRECEDED BY THE FILE VALMFD ; ;+ ; ; THIS MODULE CONTAINS BASIC TERMINAL PROMPTING AND INPUT ; ROUTINES FOR THE VAL PACKAGE. THEY MAY BE CALLED DIRECTLY ; FROM FORTRAN OR VIA THE VAL INPUT PARSING ROUTINES. ; THERE ARE: ; VPRMPT - SPECIFY VARIABLE NAME AND PROMPT ; VINPUT - OBTAIN A NEW LINE OF INPUT ; VALERR - TO NOTIFY THE COMMAND LANGUAGE SYSTEM OF AN ; ERROR SITUATION. ; VALQIO - TO QUEUE VAL INPUT BUT NOT WAIT. ; VALTST - TO DETERMINE IF VAL INPUT IS AVAILABLE ; ; START MUST HAVE BEEN CALLED PRIOR TO ANY OF THESE CALLS. ; ; ; FOR MACRO CALLERS:- ; ONLY R5 IS PRESERVED THROUGH THESE CALLS. ; ; ;- ; .PSECT VALIO ; .MCALL QIO$S,STSE$S,CLEF$S ; RDOFF$ ;DEFINE READIT OFFSETS ; ; FORTRAN PARAMETER BLOCK OFFSETS P1=2 P2=4 P3=6 P4=10 P5=12 P6=14 P7=16 ; ; CHARACTER CONSTANTS SPACE=40 CR=15 LF=12 CTRLZ=32 ESCAPE=33 ; ; ; ;+ ; VPRMPT - SET NAME AND PROMPT STRINGS ; ; CALL VPRMPT(NAME,PROMPT) ; WHERE: NAME - ZERO TERMINATED STRING 0 10$: RETURN ; PMODE: .WORD 2 ;PROMPT MODE CODE FOR OUTS OUTTI: .WORD 0 ;OUTPUT TO TI: AT ORSAY ; ; ;+ ; ; VALERR - FLAG VAL ERROR CONDITION ; ; THIS ROUTINE PERMITS THE USER TO SPECIFY THAT SOME ; EXEPTIONAL ERROR CONDITION HAS TAKEN PLACE . ; FURTHER INPUT TAKES PLACE IN SPECIAL-MODE. ; SPECIAL-MODE IS NOT RELEVANT TO 'FREE' OPERATION OF ; THE PACKAGE, BUT UNDER A COMMAND LANGUAGE PROCESSOR ; THIS MODE PROTECTS AGAINST LOSS OF REQUEST SYNCRONISATION ; DURING ERRORS DETECTED BY THE PROGRAM. SPECIFICALY ; NO NAME LOOKUPS ARE PERFORMED OR REPLIES ACCEPTED ; AND QUESTIONS ARE FORCED DIRECTLY TO THE CONSOLE ; ; CALL VALERR([N]) ;WHERE: N IS THE FUNCTION FLAG ; IF N=0 OR ABSENT: ; THE INPUT BUFFER IS CLEARED AND THE NEXT ; REQUEST TAKES PLACE IN SPECIAL MODE. ; IF N>0 : ; THE INPUT BUFFER IS CLEARED AND VAL ENTERS ; SPECIAL MODE CONTINUOUSLY ; IF N<0 : ; SPECIAL MODE IF ACTIVE IS CLEARED. ; ;- ; VALERR::CALL VMAP TSTB (R5) ;IS THERE AN ARG ? BEQ 1$ ;GO DO SINGLE SHOT TST @P1(R5) BEQ 1$ BLT 2$ ;DISABLE SPECIAL MODE BIS #ST.SPC,VC.STA(R1);ENABLE SPECIAL MODE 1$: BIS #ST.ERR,VC.STA(R1) CLRB RD.IST(R0) ;CLEAR READIT STATUS BYTE MOVB #1,RD.ITW(R0) ;SET END OF LINE MOV R1,RD.KP(R0) ;LEAVE POINTER ON A ZERO BYTE ADD #VC.LBF+1,RD.KP(R0) CLRB @RD.KP(R0) BR 3$ 2$: BIC #ST.ERR!ST.SPC,VC.STA(R1) 3$: CALL VRSCTX RETURN ; ; ;+ ; ; VALTST - DETERMINE IF INPUT IS AVAILABLE ; ; CALL VALTST(N) ; ; WHERE: N RECEIVES THE NUMBER OF CHARS IN THE ; INPUT BUFFER. OR <0 IF BUFFER IS EMPTY ; A REPLY OF CR HAS ZERO LENGTH. ; IF THE BUFFER IS EMPTY: ; N=-1 TERMINAL INPUT ; N=-2 CLONE IS ACTIVE AND HAS DATA READY. ; ;- ; VALTST::CALL VMAP ;GET IMPURE AREA BIT #ST.QIO,VC.STA(R1);INPUT QUEUED ? BNE 3$ ;SKIP IF SO MOV RD.KP(R0),R2 ;GET POINTER CLR @P1(R5) ;AND COUNT CHARS IN BUFFER 1$: TSTB (R2)+ BEQ 2$ INC @P1(R5) BR 1$ 2$: TST @P1(R5) ;ANYTHING THERE ? BGT 20$ ;IF SO NO PROBS BR 10$ ;GO RETURN -1 ; 3$: TSTB VC.QST(R1) ;INPUT COMPLETED ? BEQ 10$ ;NO RETURN NOTHING MOV VC.QST+2(R1),@P1(R5) BR 20$ ; ; HERE THE INPUT BUFFER IS EMPTY 10$: MOV #-1,@P1(R5) ;RETURN NOTHING THERE FLAG BIT #ST.CL1,VC.STA(R1) ;ARE WE UNDER CLONE ? BEQ 20$ ;IF NOT SKIP AND RETURN -1 CALL CL1T$ ;ISSUE TEST TO CLONE BCS 20$ ;IF CLONE HAS NOTHING RETURN -1 DEC @P1(R5) ;RETURN -2 20$: CALL VRSCTX ;RESTORE CALLER CONTEXT RETURN ; ; ;+ ; ; VALQIO - QUEUE AN INPUT REQUEST AND RETURN IMMEDIATLY ; ; CALL VALQIO(NAME,PROMPT,IEFN) ; ; ON RETURN IEFN CONTAINS AN EVENT FLAG ASSOCIATED ; WITH THE INPUT REQUEST. IF INPUT IS ALREADY IN PROGRES ; NO FURTHER ACTION IS TAKEN. IF DATA REMAINS IN THE BUFFER ; IT IS CLEARED TO AVOID UNPREDICTABLE BEHAVIOUR ; SUBSEQUENTLY VALTST MAY BE CALLED TO DETERMINE IF THE ; REQUEST HAS COMPLETED OR THE EVENT FLAG MAY BE READ ; DIRECTLY. ; ; ;- ; VALQIO::MOV R5,-(SP) CALL VMAP ;GET IMPURE AREA BIT #ST.QIO,VC.STA(R1) BNE 2$ ;INPUT ALREADY QUEUED MOV R1,R2 ;PUSH POINTER TO VERY END OF BUFFER ADD #VC.LBF+81.,R2 CLRB (R2) ;WITH ZERO BYTE MOV R2,RD.KP(R0) CALL VPRMPT ;PARSE NAME AND PROMPT CALL VMAP BIS #ST.NWT,VC.STA(R1);SET NO-WAIT FLAG BIT #ST.CL1,VC.STA(R1);ARE WE UNDER CLONE BEQ 1$ ;IF NOT ISSUE QIO CALL CL1Q$ ;AND START REQUEST BR 2$ 1$: CALL VALQ ;ISSUE INPUT REQUEST 2$: MOV (SP)+,R5 CMPB (R5),#3 ;EFN REQUIRED ? BLT 10$ MOV VI.LUN(R0),@P3(R5) BNE 10$ MOV VI.DLN(R0),@P3(R5) 10$: CALL VRSCTX RETURN ; ; ;+ ; ; VALGSW - GET VALUE OF VAL STATUS WORD ; THIS ROUTINE IS CALLED GENERALY FROM MACRO TO OBTAIN IN R0 ; THE VAL STATUS WORD FROM VC.STA IN VALCOM ; E.G. CALL VALGSW ; BIT #ST.###,R0 ; ; R1 IS ALSO DESTROYED ; ;- ; VALGSW::CALL VMAP MOV VC.STA(R1),R0 CALL VRSCTX RETURN ; ; ;+ ; VALSSW - WRITE VAL STATUS WORD ; INPUT: R0=NEW STATUS WORD VALUE ; ; R1 IS DESTROYED ; ; WARNING VALGSW SHOULD ALWAYS BE CALLED FIRST AND A ; BIS/BIC OPERATION PERFORMED ON THE SELECTED BIT(S) ; OTHERWISE OBSCURE PROBLEMS MAY RESULT. ; VALSSW::MOV R0,-(SP) CALL VMAP MOV (SP)+,VC.STA(R1) CALL VRSCTX RETURN ; .END