Trailing-Edge
-
PDP-10 Archives
-
decuslib20-02
-
decus/20-0063/dial.mac
There are 2 other files named dial.mac in the archive. Click here to see a list.
TITLE DIAL ;SUBROUTINES TO HANDLE IMAGE MODE TTY LINES
ENTRY GETCHR,PUTCHR,PUTOUT,INITF,INITC
entry init ;new improved all-purpose entry point
EXTERN TABGEN ;ROUTINE TO GENERATE CRC TABLE
IFNDEF FTDEBUG,<FTDEBUG==0> ;IF NON-ZERO WRITE OUT EACH CHARACTER READ
; AND SENT INTO "DEBUG.FIL
DEFINE SAVE(A) ;SAVE ACS MACRO
< MOVEM A,ACSAV+A ;STORE HIGHEST NUMBERED AC
HRRZI A,ACSAV ;SET UP BLT WORD
BLT A,A-1> ;SAVE ACS
DEFINE RESTOR(A) ;RESTORE SAVED ACS
< HRLZI A,ACSAV ;SET UP BLT WORD
BLT A,A> ;RESTORE ACS
DEFINE CLRTTY(A) ;CLEAR TTY BITS USING TRMOP. UUO
< MOVEI A ;GET TRMOP. FUNCTION TO BE EXECUTED
MOVEM CLRBLK ;STORE IN CLEAR BLOCK
MOVE [XWD 3,CLRBLK] ;SET UP FOR TRMOP.
TRMOP. ;CLEAR THE DESIRED TTY BITS
JFCL> ;NO ERRORS REPORTED
DEFINE SETTTY(A) ;SET TTY BITS MACRO
< MOVEI A ;GET TRMOP. FUNCTION
MOVEM SETBLK ;STORE FOR TRMOP. UUO
MOVE [XWD 3,SETBLK] ;SET UP TRMOP. POINTER
TRMOP. ;EXECUTE THE TRMOP. UUO
JFCL> ;NO ERRORS REPORTED
DEFINE ERRMES(A) ;TYPE OUT ERROR MESSAGE MACRO
< JRST [TTCALL 3,[ASCIZ/?
?A/]
;;; JSA 16,HNGUPF ;RESTORE LINE ON FATAL ERRORS
pushj 17,hngup ;restore line on fatal errors
EXIT]> ;TYPE MESSAGE AND EXIT TO MONITOR
C=1 ;CHARACTER AC
T1=3 ;TEMPORARY
T2=4 ;TEMPORARY
Q=16 ;FORTRAN JSA AC
P=17 ;PUSH DOWN AC
CNTX=30 ;CONTROL-X ASCII VALUE
;;;INITF: 0 ;CALL INITF(IOINDX,IERR,ITYPE)
;;; PUSH P,Q ;STORE RETURN ADDR AND ARGUMENT POINTER
;;; SETOM F4FLG# ;MARK THAT A FORTRAN CALLWAS USED
;;; SKIPA
;;;INITC: SETZM F4FLG ;MARK THAT A COBOL CALL WAS DONE
initf: ;new convention makes all entry points equal
initc:
init: SAVE 5 ;SAVE 5 ACS
;;; HRRZ T1,(P) ;GET POINTER TO ARGUMENTS
;;; MOVE T1,@(T1) ;PICK UP UNIVERSAL IO INDEX
move t1,@(q) ;pick up universal io index
MOVEM T1,IOINDX ;STORE FOR ALL TTY OPERATIONS
MOVEM T1,CLRBLK+1 ;INITIALIZE CLEAR TRMOP.
MOVEM T1,SETBLK+1 ;AND SET TRMOP. DATA AREAS
;;; AOS (P) ;INCREMENT ARGUMENT POINTER
MOVSI (SIXBIT/TTY/) ;BUILD SIXBIT TTY NAME FOR INIT UUO
MOVEM TTYNAM ;STORE PREFIX
MOVE [POINT 6,TTYNAM,17];SET UP ILDB POINTER
ANDI T1,777 ;CLEAR 200000 BIT IN IO INDEX
PUSHJ P,OCTCNV ;GO BUILD SIXBIT TTY NAME
MOVE TTYNAM ;GET TTY NAME
DEVCHR ;GET THE DEVICE CHARACTERISTICS
TRNN 400000 ;IS THIS TTY ASSIGNED?
JRST ERROR2 ;NO, IT MUST BE ASSIGNED TO DO IMAGE
; MODE INPUT FROM IT.
PJOB ;GET CONTROLING JOB NUMBER
TRMNO. ;IS THE COMUNICATIONS TTY ALSO THE CONTROLING TTY
JRST SETINT ;TRMNO. UUO FAILED ASSUME IT IS
CAME IOINDX ;IS CONTROLING TTY THE SAME?
JRST NOINT ;NO, DO NOT TURN ON ^C INTERCEPT
SETINT: SKIPE .JBINT## ;SET ^C INTERCEPT TO GUARANTEE THAT
; THE LINE WILL NOT EXIT TO MONITOR MODE
JRST NOINT ;DO NOT RESET INTERCEPT IF ALREADY SET
MOVEI INTBLK ;GET INTERCEPT BLOCK ADDRESS
MOVEM .JBINT ;STORE IN INTERCEPT WORD
NOINT: ;
IFN FTDEBUG,< ;IF DEBUGGING, INIT THE DSK FOR OUTPUT
INIT 15,10 ;INIT DSK IN IMAGE MODE
SIXBIT/DSK/ ;
XWD DOBUF,0 ;FOR OUTPUT ONLY
ERRMES(<DSK NOT AVAILABLE TO WRITE DEBUG FILE>)
OUTBUF 15,2 ;SET UP TWO BUFFERS
HLLZS NAME+1 ;CLEAR NAME BLOCK
SETZM NAME+2 ; SO ENTER WILL NOT FAIL
SETZM NAME+3 ; ...
ENTER 15,NAME ;ENTER "DEBUG.FIL"
ERRMES(<CANNOT ENTER DEBUG FILE>)
> ;
MOVE .JBFF## ;GET START OF FREE CORE
MOVEM SAVJBF# ;SAVE IT. THIS IS WHERE TTY BUFFER WILL BE
MOVEI IBUF ;SET UP FOR THE OPEN UUO
MOVEM BUFHD ;STORE BUFFER HEADER
OPEN 17,OPNBLK ;INIT THE TTY LINE FOR INPUT IN IMAGE MODE
JRST ERROR1 ;TTY NOT AVAILABLE
INBUF 17,1 ;SET UP ONE BUFFER
MOVSI OBUF ;NOW SET UP TO INIT TTY FOR OUTPUT
MOVEM BUFHD ; ...
OPEN 16,OPNBLK ;OPEN THE OUTPUT CHANNEL
JRST ERROR1 ;TTY NOT AVAILABLE
MOVE [XWD 400000,OBUF1+1]
MOVEM OBUF ;SET UP 80 WORD BUFFER FOR OUTPUT
MOVSI (POINT 36,0,35) ;THIS GUARANTEES THAT AN ENTIRE MESSAGE
MOVEM OBUF+1 ;WILL FIT IN THE BUFFER. OTHERWISE A MESSAGE
SETZM NCHAR# ;COULD BE SPLIT DURING SENDING AND CAUSE
; THE RECEIVER TO THINK THAT
; THE REMAINDER OF THE MESSAGE WAS LOST.
AOS NCHAR ;INITIALIZE NCHAR TO 1 TO FORCE INITIAL OUTPUT
PUSHJ P,INITTY ;GO INITIALIZE THE TTY FOR INPUT AND SET
; ALL OF THE PROPER MODES
CLRTTY(<3>) ;CLEAR INPUT BUFFER
CLRTTY(<4>) ;CLEAR OUTPUT BUFFER
PUSHJ P,TABGEN ;GENERATE THE CRC TABLE
;;; HRRZ T1,(P) ;GET NEXT ARGUMENT ADDRESS
;;; SETOM @(T1) ;MARK THAT THE INITIALIZATION WAS SUCCESSFUL
setom @1(q) ;mark that the initialization was successful
EXIT0: ;;;AOS (P) ;INCREMENT ARGUMENT POINTER
;;; HRRZ T1,(P) ;GET TYPE POINTER
MOVE ITYPE ;GET ITYPE VALUE
;;; MOVEM @(T1) ;STORE ITYPE
;;; AOS (P) ;INCREMENT ARGUMENT POINTER
movem @2(q) ;store itype
EXIT1: RESTOR 5 ;RESTORE ACS
EXIT2: ;;;SKIPN F4FLG ;WAS THIS ROUTINE CALLED BY FORTRAN
POPJ P, ;NO, DO A POPJ RETURN
;;;EXITF4: POP P,Q ;RESTORE RETURN ADDRESS
;;; JRA Q,(Q) ;RETURN TO CALLER
ERROR1: SKIPA [1] ;TTY NOT AVAILABLE ERROR
ERROR2: MOVEI 2 ;TY NOT ASSIGNED ERROR
MOVEM ITYPE ;STORE TYPE OF ERROR
;;; HRRZ T1,(P) ;GET ERROR ARGUMENT ADDRESS
;;; SETZM @(T1) ;MARK THAT AN ERROR OCCURED
setzm @1(q) ;mark that an error occurred
JRST EXIT0 ;GO STORE TYPE OF ERROR AND RETURN
OCTCNV: IDIVI T1,10 ;CONVERT OCTAL TO SIXBIT
HRLM T2,(P) ;STORE LOW ORDER DIGIT
SKIPE T1 ;ARE WE THROUGH
PUSHJ P,OCTCNV ;NO GO GET HIGHER ORDER DIGITS
HLRZ T1,(P) ;GET HIGH ORDER DIGIT
ADDI T1,20 ;MAKE IT SIXBIT
IDPB T1,0 ;STORE IN TTYNAM
POPJ P, ;RETURN FOR OTHER DIGITS IF ANY
CLRINP:: CLRTTY(<3>) ;CLEAR THE INPUT BUFFER
POPJ P, ;RETURN
GETCHR: SOSGE IBUF+2 ;GET CHARACTER ROUTINE RETURNS CHAR IN C
JRST GETBF ;NO CHARACTERS IN BUFFER GO DO INPUT MAYBE
ILDB C,IBUF+1 ;GET CHARACTER FROM BUFFER
ANDI C,377 ;CLEAR BIT 9
IFN FTDEBUG,< ;IF DEBUGGING THEN WRITE OUT CHARACTER
PUSHJ P,DEBIN ; SET LEFT HALF WORD TO ZERO
> ;
CPOPJ1:: AOS (P) ;SKIP RETURN
CPOPJ: POPJ P, ;NON-SKIP RETURN
GETBF: STATZ 17,1B22 ;IS THERE AN END OF FILE ON TTY
JRST GETBF1 ;YES, GO REINIT THE TTY
MOVEI 1 ;NOW CHECK IF TTY HAS INPUT READY
MOVEM SKPBLK ;STORE TRMOP. FUNCTION CODE
MOVE [XWD 2,SKPBLK] ;SET UP TRMOP. UUO
TRMOP. ;SKIP IF INPUT IS READY
POPJ P, ;NO INPUT READY, TAKE NON-SKIP RETURN
IN 17, ;INPUT IS THERE SO IN UUO WILL NOT
; GO INTO I/O WAIT
JRST GETCHR ;INPUT UUO WAS SUCCESSFUL
STATO 17,1B22 ;INPUT UUO FAILED, CHECK END OF FILE
ERRMES(<COMMUNICATIONS TTY LINE NO LONGER ASSIGNED TO JOB>)
GETBF1: PUSHJ P,INITTY ;EOF - TTY MUST BE REINITED
JRST GETBF ;GO BACK AND TRY AGAIN
INITTY: MOVEI IBUF ;SET UP FOR AN INPUT INIT
MOVEM BUFHD ;
MOVE SAVJBF ;ALLWAYS REUSE INPUT BUFFER AREA
EXCH .JBFF ; OTHERWISE JOB WILL GROW INDEFINATELY
OPEN 17,OPNBLK ;OPEN TTY FOR INPUT
ERRMES (<COMMUNICATIONS TTY LINE NO LONGER AVAILABLE>)
INBUF 17,1 ;SET UP ONLY ONE BUFFER
MOVEM .JBFF ;RESTORE ORIGINAL .JBFF
SETTTY(<2004>) ;SLAVE
SETTTY(<2013>) ;GAG
SETTTY(<2007>) ;LOCAL COPY
SETTTY(<2010>) ;NO CR-LF
SETTTY(<2021>) ;PAGE
POPJ P, ;RETURN
PUTCHR: SOSG OBUF+2 ;PUT CHARACTER IN C INTO BUFFER
PUSHJ P,PUTOUT ;NO MORE ROOM - SEND OUT BUFFER
IDPB C,OBUF+1 ;STORE CHARACTER
IFN FTDEBUG,< ;IF DEBUGGING -
PUSHJ P,DEBOUT ; SEND OUT CHARACTER TO DISK ALSO
> ;
AOS NCHAR ;COUNT UP NUMBER OF CHARACTERS IN BUFFER
POPJ P, ;RETURN
PUTOUT: MOVE IOINDX ;SEND OUT BUFFER
MOVEM RPAGE+1 ;CHECK IF OUTPUT IS STOPPED BY XOFF
MOVE [XWD 3,RPAGE] ;SET UP FOR TRMOP. UUO
TRMOP. ;IS OUTPUT STOPPED?
JFCL ;IGNORE FAILURE OF TRMOP. UUO
SKIPE RPAGE+2 ;
PUSHJ P,[ CLRTTY(<4>)
CLRTTY(<2022>)
POPJ P,];YES, CLEAR THE BIT AND CLEAR THE BUFFER
SKIPE NCHAR ;ARE THERE ANY CHARACTERS TO BE OUTPUT
OUTPUT 16, ;YES, OUTPUT THGEM
SETZM NCHAR ;CLEAR COUNT
WAIT 16, ;WAIT FOR OUTPUT TO BE DONE
CHKOBF: MOVEI 2 ;NOW CHECK IF OUTPUT BUFFER IS EMPTY
MOVEM SKPBLK ; WITH A TRMOP. UUO
TRMOP. ;
POPJ P, ;BUFFER IS EMPTY, NOW RETURN
MOVEI 0 ;BUFFER HAS CHARACTERS IN IT
SLEEP ;SLEEP FOR 1 CLOCK TICK
JRST CHKOBF ;THEN GO CHECK AGAIN
ENTRY DIALF,DIALC,HNGUPC,HNGUPF
entry dial, hngup ;new improved entry points
;;;HNGUPF: 0 ;CALL HNGUPF
;;; PUSH P,Q ;SAVE RETURN AC
;;; SETOM F4FLG ;MARK THAT WE CAME FROM FORTRAN JOB
;;; SKIPA
;;;HNGUPC: SETZM F4FLG ;MARK THAT A COBOL CALL WAS DONE
hngupf:
hngupc:
hngup: PUSH P,0 ;SAVE AC 0
CLRTTY(<2004>) ;SLAVE
MOVEI INTLOC ;CHECK IF WE SHOULD CLEAR ^C INTERCEPT
CAMN .JBINT ;DID WE SET IT INITIALLY
SETZM .JBINT ;YES, THEN CLEAR IT
CLRTTY(<14>) ;HANGUP THE MODEM
MOVEI ^D6000 ;THEN WAIT 6 SECONDS
HIBER ; FOR LINE TO HANGUP PROPERLY
JFCL ;IGNORE ERROR RETURN
POP P,0 ;RESTORE 0
JRST EXIT2 ;AND RETURN TO CALLER
;;;DIALF: 0 ;CALL DIAL(ARRAY,N,IFLAG)
;;; PUSH P,Q ;SAVE RETURN AC
;;; SETOM F4FLG ;MARK THIS AS A FORTRAN CALL
;;; SKIPA
;;;DIALC: SETZM F4FLG ;MARK THAT A COBOL CALL WAS DONE
dialf:
dialc:
dial: SAVE 5 ;SAVE 5 ACS
SETOM ITYPE# ;START WITH CORRECT ITYPE
;;; HRRZ 1,(P) ;GET ADDRESS OF FIRST ARGUMENT
;;; HRRZ 2,(1) ;GET ARRAY ADDRESS
movei 2,@(q) ;get array address in ac2
;;; AOS (P) ;INCREMENT POINTER
;;; HRRZ 1,(P) ;GET ADDRESS OF SECOND ARGUMENT
;;; SKIPN 3,@(1) ;ARE THERE ANY DIGITS TO DIAL
skipn 3,@1(q) ;are there any digits to dial
JRST NODIAL ;NO, THEN SKIP THE DIALING PART
CAIL 3,17 ;THERE MUST BE LESS THAN 17 DIGITS
JRST [ MOVEI 3 ;MORE THAN 17, SET ERROR BIT
MOVEM ITYPE ;IN ITYPE
JRST DERROR] ;GO GIVE ERROR RETURN
MOVNS 3 ;GET NEGATIVE COUNT OF DIGITS TO BE DIALED
;;; SKIPN F4FLG ;COBOL CALL?
;;; HRRZ 2,(2) ;YES, GET THE REAL ARRAY ADDRESS
HRL 2,3 ;SET UP AOBJN COUNTER
SETZM NUMBER ;INITIALIZE NUMBER TO BE DIALED
SETZM NUMBER+1 ;...
MOVE 1,[POINT 4,NUMBER] ;SET UP BYTE POINTER
MOVE (2) ;GET NEXT DIGIT TO BE DIALED
IDPB 1 ;STORE IN DIAL BUFFER
AOBJN 2,.-2 ;LOOP THROUGH ALL DIGITS
MOVEI 17 ;END WITH A 17
IDPB 1 ;...
;;; PUSH P,F4FLG ;SAVE F4FLG
PUSHJ P,HNGUPC ; THIS GUARANTEES THAT THE LINE IS AVAILABLE
;;; POP P,F4FLG ;RESTORE F4FLG
MOVE IOINDX ;SET UP FOR DIAL
MOVEM DIALAD+1 ;
MOVE [XWD 4,DIALAD] ;
TRMOP. ;DO THE DIALING
JRST BADIAL ;THE DIAL FAILED, GO GIVE ERROR RETURN
NODIAL: TTCALL 3,[ASCIZ/CONTROLLING TTY IS NOW DIRECTLY CONNECTED TO COMMUNICATIONS LINE.
TYPE ^X TO CONTINUE.
/] ;USER CAN NOW LOGIN AND START RECEIVER JOB
TLOOP: PUSHJ P,GETTTY ;ANY CHARACTERS FROM TTY
JRST NOTTY ;NO GO CHECK COMMUNICATIONS LINE
CAIN C,CNTX ;YES, IS THIS A CONTROL X
JRST DIALRT ;YES, THEN THE USER IS DONE
PUSHJ P,PUTCHR ;NO, SEND CHARACTER OUT TO COMMUNICATIONS LINE
JRST TLOOP ;LOOP BACK FOR MORE
NOTTY: PUSHJ P,GETCHR ;CHECK FOR CHARACTERS FROM COMM LINE
JRST NOACU ;NO CHARACTERS THERE
PUSHJ P,PUTTTY ;TYPE OUT CHARACRTER
JRST TLOOP ;LOOP BACK
NOACU: PUSHJ P,PUTOUT ;SEND OUT BUFFER
MOVSI -1 ;SLEEP WAITING FOR TTY ACTIVITY
HIBER ;...
JFCL ;IGNORE ERROR RETURN
JRST TLOOP ;LOOP BACK
GETTTY: TTCALL 2,C ;GET A CHARACTER FROM TTY
POPJ P, ;NONE THERE
CAIN C,"^" ;IS THIS AN ^
JRST [SETOM CNTFLG# ;YES, SET FLAG
POPJ P,] ;AND RETURN
SKIPE CNTFLG ;NO, IS FLAG SET
TRZ C,100 ;YES, THE MAKE THIS CHARACTER A CONTROL CHAR
SETZM CNTFLG ;ZERO FLAG
AOS (P) ;TAKE SKIP RETURN
POPJ P, ;RETURN
PUTTTY: TTCALL 1,C ;SEND OUT CHARACTER
POPJ P, ;RETURN
BADIAL: SUBI 3 ;CHECK THE DIAL ERROR
CAIE 1 ;IS IT THAT THE LINE IS NOT A DATASET?
CAIN 2 ;OR THAT THE DIAL FAILED
SKIPA ;YES
MOVEI 0 ;NO SET ERROR TYPE TO ZERO
MOVEM ITYPE ;STORE ERROR TYPE
DERROR: TDZA ;SET ERROR WORD FALSE
DIALRT: SETO ;SET ERROR WORD TRUE
;;; AOS (P) ;INCREMENT ARG POINTER
;;; HRRZ 1,(P) ;GET ARG ADDRESS
;;; MOVEM @(1) ;STORE ERROR FLAG
movem @2(q) ;store error flag
JRST EXIT0 ;GO STORE TYPE
INTLOC: PUSH P,INTBLK+2 ;SAVE INTERRUPT ADDRESS
SETZM INTBLK+2 ;CLEAR INTERRUPT LOCATION
POPJ P, ;RETURN TO INTERRUPTED ADDRESS
INTBLK: XWD 4,INTLOC ;INTERRUPT ROUTINE ADDRESS
XWD 0,2 ;^C ONLY
0 ;
0 ;
OBUF1: 0 ;SPECIAL OUTPUT BUFFER AREA
XWD ^D80,OBUF1+1 ;80 WORDS LONG
BLOCK ^D80 ;...
OPNBLK: 210 ;IMAGE MODE AND NO-ECHO
TTYNAM: SIXBIT/TTY/ ;SIXBIT NAME OF COMMUNICATIONS TTY
BUFHD: 0 ;BUFFER HEADER
SKPBLK: 0 ;SKIP TRMOP.
IOINDX: 200000 ;IO INDEX OF COMMUNICATIONS LINE
CLRBLK: 0 ;CLEAR TRMOP. BLOCK
0 ;...
0 ;...
SETBLK: 0 ;SET TRMOP. BLOCK
0
1 ;SET THE BIT TO 1
DIALAD: 13 ;DIAL TRMOP. BLOCK
200000 ;IO INDEX
NUMBER: 0 ;NUMBER TO DIAL
0 ;...
IBUF: BLOCK 3 ;INPUT BUFFER HEADER
OBUF: BLOCK 3 ;OUTPUT BUFFER HEADER
PDLEN=10 ;PUSH DOWN BLOCK LENGTH
PDLST: BLOCK PDLEN ;PUSH DOWN LIST AREA
RPAGE: 1022 ;CHECK PAGE BIT
200000 ;...
0 ;...
IFN FTDEBUG,<
DEBIN: TDZA
DEBOUT: MOVSI -1 ;MARK THAT THIS WAS A CHAR SENT OUT
HRR C ;GET CHAR
DEBPNT:: SOSG DOBUF+2 ;PUT IT INTO BUFFER
OUTPUT 15, ;BUFFER WAS FULL
IDPB DOBUF+1 ;NOW STORE CHAR
POPJ P, ;RETURN
DOBUF: BLOCK 3 ;DEBUG BUFFER HEADER
NAME: SIXBIT/DEBUG/ ;NAME OF DEBUG FILE
SIXBIT/FIL/ ;EXT
0 ;...
0 ;...
>
ACSAV: BLOCK 5 ;AREA TO SAVE ACS
END ;END OF DIAL