PROC TERMIO;
# TITLE TERMIO - TERMINAL INPUT/OUTPUT MODULE. #
BEGIN # TERMIO #
#
*** TERMIO - TERMINAL INPUT/OUTPUT MODULE.
*
* *TERMIO* PROVIDES FETS, CIRCULAR BUFFERS, AND FUNDAMENTAL
* I/O MACROS FOR THE FULL SCREEN EDITOR AND FOR PRODUCTS
* BUILT ON THE VIRTUAL DISPLAY TERMINAL OBJECT ROUTINES.
*
* FOR THE FULL SCREEN EDITOR, *TERMIO* MAPS STORAGE INTO THE
* GLOBAL COMMON BLOCK AND GENERATES CODE APPROPRIATE TO THE
* SINGLE AND MULTI USER VERSIONS OF THE EDITOR. FOR OTHER
* PRODUCTS, *TERMIO* STANDS ALONE.
*
* PROC TERMIO
*
* ENTRY OBJECT ROUTINE CALLED.
*
* EXIT OBJECT ROUTINE EXECUTED.
*
* NOTES THE *TERMIO* ROUTINES ALLOW USE OF BOTH *FORTRAN*
* AND *COBOL* CALLING SEQUENCES.
*
* COPYRIGHT CONTROL DATA SYSTEMS INC. 1992.
#
# START OF MODIFY CONDITIONAL SEQUENCE #
*IF DEF,EDITOR
DEF LISTCON #0#; # DO NOT LIST COMDECKS #
*ELSE
DEF LISTCON #1#; # LIST COMDECKS #
*ENDIF
# END OF MODIFY CONDITIONAL #
*IFCALL SINGLE,COMFSGL
*IFCALL ONLY,COMFONL
*IFCALL MULTI,COMFMLT
*IFCALL EDITOR,COMFFSE
# START OF CODE SEQUENCE CONDITIONALLY PRODUCED BY MODIFY UTILITY #
*NIFCALL EDITOR,COMFTIO
*IF UNDEF,EDITOR
DEF SINGLE #1#; # SINGLE-USER VERSION #
DEF MULTI #0#; # NOT MULTI-USER VERSION #
DEF EDITORVDT #0#; # STANDALONE VERSION OF VIRTERM #
DEF IOBEGIN(XXX) #BEGIN#; # BEGIN COMPOUND STATEMENT #
DEF IOEND #END#; # END COMPOUND STATEMENT #
DEF IORET #RETURN;#; # EXIT FROM SUBPROGRAM #
CONTROL PRESET;
*ENDIF
*IF UNDEF,QTRM
DEF QTRMV #0#; # NOT QTRM VERSION #
*ELSE
DEF QTRMV #1#; # QTRM VERSION #
*ENDIF
# END OF MODIFY CONDITIONAL #
# COMMON DATA #
CONTROL IFEQ MULTI,1;
XREF ARRAY RENTSTK [1:MAXREENT] P(1); # SUBROUTINE STACK #
BEGIN # ARRAY RENTSTK #
ITEM RSTK I; # STACK WORD #
END # ARRAY RENTSTK #
XREF ITEM RSTKPTR I; # STACK POINTER #
CONTROL FI;
CONTROL IFEQ MULTI,1;
XREF
BEGIN
PROC TTITRAP; # TELETYPE INPUT TRAP #
PROC TTOTRAP; # TELETYPE OUTPUT TRAP #
PROC VOLUNTEER; # VOLUNTEER PREEMPTIVE SWAPPING #
FUNC NOSWDSZ; # NOS WORD SIZE #
END
CONTROL FI;
XREF
BEGIN
*IFCALL EDITOR,COMFXSB
CONTROL IFEQ SINGLE,1;
PROC VDTLOF$; # SET LIST OF FILES #
PROC VDTRD$; # READ AFTER EOR #
PROC VDTREC$; # READ CODED LINE #
PROC VDTREO$; # READ ONE WORD #
PROC VDTWRC$; # WRITE CODED LINE #
PROC VDTWRO$; # CIO WRITE WORD #
PROC VDTWRR$; # WRITE EOR #
*IF DEF,CRM
# START OF MODIFY CONDITIONAL FOR TERMINAL OUTPUT. #
PROC VDTCLO$; # CLOSE CRM OUTPUT FILE #
PROC VDTOPN$; # OPEN CRM OUTPUT FILE #
# END OF MODIFY CONDITIONAL FOR TERMINAL OUTPUT. #
*ENDIF
CONTROL FI;
END
XDEF
BEGIN # COMFXTI #
*CALL COMFXTI
END # COMFXTI #
# COMMON DATA BLOCK #
*IFCALL EDITOR,COMFDS1
*IFCALL EDITOR,COMFVD2
*IFCALL EDITOR,COMFDS2
*NIFCALL EDITOR,COMFVD1
*NIFCALL EDITOR,COMFVD2
*NIFCALL EDITOR,COMFVD3
CONTROL EJECT;
PROC VDTFLS;
# TITLE VDTFLS - FLUSH OUTPUT BUFFER. #
BEGIN # VDTFLS #
#
** VDTFLS - FLUSH OUTPUT BUFFER.
*
* *VDTFLS* FLUSHES THE OUTPUT BUFFER.
*
* PROC VDTFLS
*
* EXIT TTYO - FET HAS RESET TO SHOW THE OUTPUT BUFFER
* EMPTY.
#
CONTROL IFEQ SINGLE,1;
TTYOIN = TTYOOT; # SET IN EQUAL TO OUT #
CONTROL FI;
END # VDTFLS #
CONTROL EJECT;
PROC VDTDRN;
# TITLE VDTDRN - FLUSH THE INPUT BUFFER. #
IOBEGIN(VDTDRN)
#
** VDTDRN - FLUSH THE INPUT BUFFER.
*
* *VDTDRN* FLUSHES THE INPUT BUFFER.
*
* PROC VDTDRN
*
* EXIT TTYI - FET HAS EMPTY CIRCULAR BUFFER, IN EITHER
* SINGLE-EDITOR OR STANDALONE VERSION.
*
* CALLS TTITRAP (MULTI ONLY).
*
* USES TTILEN (MULTI ONLY).
#
CONTROL IFEQ SINGLE,1;
TTYIOT=TTYIIN;
CONTROL FI;
CONTROL IFEQ MULTI,1;
TTILEN=-1;
TTITRAP;
CONTROL FI;
IOEND # VDTDRN #
CONTROL EJECT;
PROC VDTRDO(L);
# TITLE VDTRDO - READ ONE WORD OF INPUT. #
IOBEGIN(VDTRDO)
#
** VDTRDO - READ ONE WORD OF INPUT.
*
* *VDTRDO* READS ONE WORD OF INPUT INTO BUFFER *L*.
*
* PROC VDTRDO(L)
*
* ENTRY L - WORD TO BE READ INTO.
*
* CALLS READ, READO (SINGLE OR STANDALONE).
* MORTAL (SINGLE-EDITOR ONLY).
* TTITRAP, VOLUNTEER (MULTI-EDITOR ONLY).
*
* USES TTYI FET (SINGLE OR STANDALONE).
* TTIADDR, TTILEN (MULTI ONLY).
* TTYINPUT (SINGLE EDITOR ONLY)
#
ARRAY L [0:0] P(1); # WORD TO BE READ INTO #
BEGIN # ARRAY L #
ITEM LL I; # LINE OF INPUT #
END # ARRAY L #
CONTROL IFEQ MULTI,1;
TTIADDR=LOC(L);
TTILEN=1;
TTITRAP; # GET FROM SMFEX #
VOLUNTEER; # MOVE FAST IF LOW TTI #
CONTROL FI;
CONTROL IFEQ SINGLE,1;
ITEM R I; # READ STATUS #
LL = 0; # EMPTY LINE BY DEFAULT #
R=-1; # EOF DETECTED ON FILE #
IF TTYIIN EQ TTYIOT THEN
BEGIN
*IF DEF,DEBUG
VDTDMP$;
*ENDIF
VDTRD$(TTYI,1); # READ MACRO #
END
IF TTYIIN NQ TTYIOT THEN VDTREO$(TTYI,L,R); # READO MACRO #
# START OF CODE CONDITIONALLY PRODUCED BY MODIFY UTILITY #
*IF DEF,EDITOR
IF R NQ 0 AND NOT TTYINPUT
THEN MORTAL(" QUIT IS REQUIRED FOR BATCH JOBS.$");
*ENDIF
# END OF MODIFY UTILITY CONDITIONAL #
CONTROL FI;
IOEND # VDTRDO #
CONTROL EJECT;
PROC VDTWTO(A);
# TITLE VDTWTO - WRITE ONE WORD OF OUTPUT. #
IOBEGIN(VDTWTO)
#
** VDTWTO - WRITE ONE WORD OF OUTPUT.
*
* *VDTWTO* WRITES ONE WORD OF OUTPUT FROM BUFFER *A*.
*
* PROC VDTWTO(A)
*
* ENTRY A - THE WORD.
*
* CALLS WRITEO (SINGLE-EDITOR OR STANDALONE).
* TTOTRAP (MULTI ONLY).
*
* USES TTOLEN, TTOTYPE, TTOADDR (MULTI ONLY).
#
ARRAY A [0:0] P(1);; # WORD OF OUTPUT #
CONTROL IFEQ MULTI,1;
TTOADDR=LOC(A);
TTOLEN=1;
TTOTYPE=TTOST"NORMAL";
TTOTRAP;
CONTROL FI;
CONTROL IFEQ SINGLE,1;
VDTWRO$(TTYO,A); # WRITEO MACRO #
CONTROL FI;
IOEND # VDTWTO #
CONTROL EJECT;
PROC VDTRDC(L,N);
# TITLE VDTRDC - READ ONE LINE OF INPUT. #
IOBEGIN(VDTRDC)
#
** VDTRDC - READ ONE LINE OF INPUT.
*
* *VDTRDC* READS ONE LINE OF INPUT INTO BUFFER *L*.
*
* PROC VDTRDC(L,N)
*
* ENTRY L - LINE IMAGE BUFFER.
* N - BUFFER CAPACITY IN WORDS.
*
* CALLS READ, READC (SINGLE OR STANDALONE).
* MORTAL (SINGLE-EDITOR ONLY).
* TTITRAP, VOLUNTEER (MULTI-EDITOR ONLY).
*
* USES TTYI FET (SINGLE OR STANDALONE).
* TTIADDR, TTILEN (MULTI ONLY).
* TTYINPUT (SINGLE EDITOR ONLY)
#
ARRAY L [0:0] P(1); # LINE IMAGE BUFFER #
BEGIN # ARRAY L #
ITEM LL I; # LINE IMAGE #
END # ARRAY L #
ITEM N I; # MAX NUM WORDS #
CONTROL IFEQ MULTI,1;
TTIADDR=LOC(L);
TTILEN=N;
TTITRAP; # GET FROM SMFEX #
VOLUNTEER; # MOVE FAST IF LOW TTI #
CONTROL FI;
CONTROL IFEQ SINGLE,1;
ITEM R I; # READ STATUS #
LL = 0; # EMPTY LINE BY DEFAULT #
R=-1; # EOF DETECTED ON FILE #
IF TTYIIN EQ TTYIOT THEN VDTRD$(TTYI,1); # READ MACRO #
IF TTYIIN NQ TTYIOT THEN VDTREC$(TTYI,L,N,R); # READC MACRO #
# START OF SEQUENCE CONDITIONALLY PRODUCED BY MODIFY UTILITY #
*IF DEF,EDITOR
IF R NQ 0 AND NOT TTYINPUT
THEN MORTAL(" QUIT IS REQUIRED FOR BATCH JOBS.$");
*ENDIF
# END OF MODIFY CONDITIONAL #
CONTROL FI;
IOEND # VDTRDC #
CONTROL EJECT;
PROC VDTWTC(A);
# TITLE VDTWTC - WRITE ONE LINE OF OUTPUT. #
IOBEGIN(VDTWTC)
#
** VDTWTC - WRITE ONE LINE OF OUTPUT.
*
* *VDTWTC* WRITES ONE LINE OF OUTPUT FROM BUFFER *A*.
*
* PROC VDTWTC(A)
*
* ENTRY A - LINE IMAGE BUFFER WITH ZERO BYTE TERMINATOR.
*
* CALLS WRITEC (SINGLE-EDITOR OR STANDALONE).
* TTOTRAP (MULTI ONLY).
*
* USES TTOLEN, TTOTYPE, TTOADDR (MULTI ONLY).
#
ARRAY A [0:0] P(1);; # LINE IMAGE BUFFER #
CONTROL IFEQ MULTI,1;
TTOADDR=LOC(A);
TTOLEN=NOSWDSZ(9999,A);
TTOTYPE=TTOST"NORMAL";
TTOTRAP;
CONTROL FI;
CONTROL IFEQ SINGLE,1;
VDTWRC$(TTYO,A); # WRITEC MACRO #
CONTROL FI;
IOEND # VDTWTC #
CONTROL EJECT;
PROC VDTCLO(RCL);
# TITLE VDTCLO - DO A WRITER ON OUTPUT FET. #
IOBEGIN(VDTCLO)
#
** VDTCLO - DO A WRITER ON OUTPUT FET.
*
* *VDTCLO* CLOSES THE OUTPUT FET BY DOING A *WRITER*.
*
* PROC VDTCLO(RCL)
*
* CALLS VDTWRR$ (SINGLE EDITOR OR STANDALONE).
*IF DEF,CRM
* VDTCLO$ (CRM STANDALONE ONLY).
*ENDIF
#
ITEM RCL I; # RECALL PARAMETER #
CONTROL IFEQ SINGLE,1;
*IF DEF,DEBUG
VDTDMP$;
*ENDIF
VDTWRR$(TTYO,RCL); # WRITER MACRO #
*IF DEF,CRM
# START OF MODIFY CONDITIONAL FOR TERMINAL OUTPUT. #
VDTCLO$; # CLOSE CRM OUTPUT FILE #
# END OF MODIFY CONDITIONAL FOR TERMINAL OUTPUT. #
*ENDIF
CONTROL FI;
IOEND # VDTCLO #
CONTROL EJECT;
PROC VDTFOS(RCL);
# TITLE VDTFOS - FLUSH OUTPUT TO SCREEN. #
IOBEGIN(VDTFOS)
#
** VDTFOS - FLUSH OUTPUT TO SCREEN.
*
* *VDTFOS* FLUSHES THE OUTPUT TO SCREEN BY A WRITER ON OUTPUT FET.
*
* PROC VDTFOS(RCL)
*
* CALLS VDTWRR$ (SINGLE EDITOR OR STANDALONE).
#
ITEM RCL I; # RECALL PARAMETER #
CONTROL IFEQ SINGLE,1;
*IF DEF,DEBUG
VDTDMP$;
*ENDIF
VDTWRR$(TTYO,RCL); # WRITER MACRO #
CONTROL FI;
IOEND # VDTFOS #
CONTROL EJECT;
PROC VDTOPN;
# TITLE VDTOPN - INITIALIZE TERMIO MODULE. #
IOBEGIN(VDTOPN)
#
** VDTOPN - INITIALIZE TERMIO MODULE.
*
* *VDTOPN* OPENS THE INPUT AND OUTPUT FETS AND INITIALIZES
* THEM.
*
* PROC VDTOPN
*
* ENTRY INTERACT - WHETHER TRULY INTERACTIVE (SINGLE EDITOR).
*
* EXIT TTYI, TTYO - FETS ARE INITIALIZED.
* LIST OF FILES IS SET UP.
*
* CALLS MAKEFET (INTERNAL) (STANDALONE ONLY).
* MAKEFET (EXTERNAL) (SINGLE-EDITOR ONLY).
*IF UNDEF,CRM
* VDTLOF$ (SINGLE EDITOR OR STANDALONE).
*ELSE
* VDTOPN$ (CRM STANDALONE ONLY).
*ENDIF
*
* NOTE CURRENTLY A NO-OP FOR MULTI-EDITOR.
#
# START OF SEQUENCE CONDITIONALLY PRODUCED BY MODIFY UTILITY #
*IF UNDEF EDITOR
DEF INTERACT #TRUE#; # INTERACTIVE TERMINALS #
PROC MAKEFET(FET,NAME,BUFFER,LENGTH);
# TITLE MAKEFET - MAKE A FET. #
BEGIN # MAKEFET #
#
** MAKEFET - MAKE A FET.
*
* *MAKEFET* SETS UP THE FET AND INITIALIZES IT.
*
* PROC MAKEFET(FET,NAME,BUFFER,LENGTH)
*
* ENTRY NAME - FET NAME.
* BUFFER - FIRST ADDRESS.
* LENGTH - FET LENGTH.
*
* EXIT FET INITIALIZED.
#
ARRAY FET [0:0] S(5);
BEGIN # ARRAY FET #
ITEM FETNAME C(00,00,07); # FET NAME #
ITEM FETCODE U(00,42,18); # FET STATUS CODES #
ITEM FETFIRST I(01,00,60); # FIRST ADDRESS #
ITEM FETIN I(02,00,60); # IN ADDRESS #
ITEM FETOUT I(03,00,60); # OUT ADDRESS #
ITEM FETLIMIT I(04,00,60); # LIMIT ADDRESS #
END # ARRAY FET #
ITEM NAME C(07); # FET NAME #
ARRAY BUFFER [0:0] P(1);; # FIRST ADDRESS #
ITEM LENGTH I; # FET LENGTH #
ITEM TMP1 I; # TEMPORARY STORAGE #
FETNAME=NAME;
FOR TMP1=0 STEP 1 UNTIL 6 DO
BEGIN
IF C<TMP1,1>FETNAME EQ " " THEN C<TMP1,1>FETNAME=0;
END
FETCODE=1;
FETFIRST=LOC(BUFFER);
FETIN=FETFIRST;
FETOUT=FETFIRST;
FETLIMIT=FETFIRST+LENGTH;
END # MAKEFET #
*ENDIF
# END OF MODIFY CONDITIONAL FOR MAKEFET #
# START OF MAIN-LINE CODE FOR VDTOPN #
CONTROL IFEQ SINGLE,1;
MAKEFET(TTYI,INPTNAM,TTYIBF,TTYIBUFSIZ);
# START OF MODIFY CONDITIONAL FOR TERMINAL OUTPUT. #
*IF UNDEF,CRM
MAKEFET(TTYO,OUTPNAM,TTYOBF,TTYOBUFSIZ);
IF INTERACT THEN
BEGIN
B<12,18>LISTFETPTR=LOC(FETLIST);
FETLSTNAM=TTYONM;
FETLSTLOC=LOC(TTYO);
TTYOFB=TRUE;
VDTLOF$(LISTFETPTR); # SETLOF MACRO #
END
*ELSE
VDTOPN$(LISTFETPTR); # OPEN CRM OUTPUT FILE #
P<TTYO>=LISTFETPTR; # SET BASED ARRAY ADDRESS #
*ENDIF
# END OF MODIFY CONDITIONAL FOR TERMINAL OUTPUT. #
CONTROL FI;
IOEND # VDTOPN #
*IF DEF,DEBUG
CONTROL EJECT;
PROC VDTDMP$;
# TITLE VDTDMP$ - DUMP OUTPUT DATA TO XXXDUMP. #
BEGIN # VDTDMP$ #
#
** VDTDMP$ - DUMP OUTPUT DATA TO XXXDUMP.
*
* THIS PROCEDURE DUMPS THE CURRENT CONTENTS OF THE OUPUT FET TO
* THE LOCAL FILE *XXXDUMP* OR DEBUGGING ANALYSIS.
*
* PROC VDTDMP$.
*
* EXIT DATA DUMPED TO XXXDUMP.
*
* CALLS VDTWRR$.
#
ARRAY XXXDUMP [0:0] P(5);
BEGIN
ITEM DUMPLFN U(00,00,60) = [O"3030 3004 2515 2000 0001"];
ITEM DUMPFT U(01,42,18);
ITEM DUMPIN U(02,42,18);
ITEM DUMPOT U(03,42,18);
ITEM DUMPLM U(04,42,18);
END
DUMPFT = TTYOFT; # SET FET POINTERS #
DUMPIN = TTYOIN;
DUMPOT = TTYOOT;
DUMPIN = TTYOLM;
VDTWRR$(XXXDUMP,1); # DUMP BUFFER #
END # VDTDMP$ #
*ENDIF
END # TERMIO #
TERM