Trailing-Edge
-
PDP-10 Archives
-
BB-Y393Q-SM
-
monitor-sources/ttdzdv.mac
There are 21 other files named ttdzdv.mac in the archive. Click here to see a list.
; Edit= 8883 to TTDZDV.MAC on 11-Aug-88 by GSCOTT
;Make modem scan logic work properly when connected to DECserver-200s by
;reverse LAT, since the DECserver-200s don't follow proper modem protocol.
; *** Edit 7245 to TTDZDV.MAC by MRASPUZZI on 18-Feb-86
; Fix autobaud code to handle 2400, 4800, and 9600 baud better
;Edit 3198 to TTDZDV.MAC by EVANS on Thu 10-Jan-85
; Remove instruction to restore T2 - T2 already has what we want.
;Edit 3163 to TTDZDV.MAC by EVANS on Mon 10-Sep-84, for SPR #20353
; At DZCROF+4, change T1 to T2 to restore correct register.
;Edit 2913 - Fix hung lines problem
; UPD ID= 113, FARK:<4-1-WORKING-SOURCES.MONITOR>TTDZDV.MAC.3, 30-Jul-82 09:33:40 by DONAHUE
;Edit 2638 - Fix edit 2629 to check for -1 explicitly
; UPD ID= 98, FARK:<4-1-WORKING-SOURCES.MONITOR>TTDZDV.MAC.2, 23-Jun-82 11:56:59 by DONAHUE
;Edit 2629 - Check if TTACTL entry is negative
;<4-1-FIELD-IMAGE.MONITOR>TTDZDV.MAC.2, 25-Feb-82 20:50:07, EDIT BY DONAHUE
;UPDATE COPYRIGHT DATE
; UPD ID= 716, FARK:<4-WORKING-SOURCES.MONITOR>TTDZDV.MAC.4, 18-Aug-81 19:29:40 by ZIMA
;Edit 1924 - put edit 1820 in standard form. No code changes.
; UPD ID= 341, FARK:<4-WORKING-SOURCES.MONITOR>TTDZDV.MAC.3, 16-Dec-80 07:39:07 by DEUFEL
;Edit 1822 - Fix KLINIK modem handling code completely and correctly
; UPD ID= 336, FARK:<4-WORKING-SOURCES.MONITOR>TTDZDV.MAC.2, 16-Dec-80 00:05:09 by DEUFEL
;Edit 1820 - ADD CODE TO DISCONNECT THE JOB ON THE KLINIK LINE IF THE 8080
;TELLS US THAT THE CARRIER IS GONE. REWRITE DATASET HANDLING CODE AND ADD
;AUTOBAUD CAPABILITIES
; UPD ID= 129, FARK:<4-WORKING-SOURCES.MONITOR>TTDZDV.MAC.2, 21-Jul-80 20:17:43 by ZIMA
;Edit 1760 - remove unneeded sendall check preventing TTMSG to CTY.
;<4.MONITOR>TTDZDV.MAC.180, 3-Jan-80 08:10:38, EDIT BY R.ACE
;UPDATE COPYRIGHT DATE
;<4.MONITOR>TTDZDV.MAC.179, 25-Oct-79 15:13:10, EDIT BY ZIMA
;TCO 4.2550 - INSTALL A TERMINAL SPEED ZERO FOR DZ11 LINES BY TURNING
; OFF THE RECEIVER CLOCK. PRESERVES OUTPUT CHARACTERISTICS SINCE
; THE OUTPUT CANNOT BE TURNED OFF FOR A LINE.
;<4.MONITOR>TTDZDV.MAC.178, 12-Oct-79 09:35:34, Edit by KONEN
;CORRECT CODE SENDING XON WHILE THERE IS ROOM IN THE INPUT BUFFER
;<4.MONITOR>TTDZDV.MAC.177, 5-Oct-79 17:07:29, EDIT BY MURPHY
;MINXOS CHANGED TO MINXON
;<4.MONITOR>TTDZDV.MAC.176, 5-Oct-79 00:36:16, Edit by KONEN
;CALL GETEXA BEFORE DZXOCA
;<4.MONITOR>TTDZDV.MAC.175, 2-Oct-79 09:13:06, Edit by KONEN
;APPLY PARITY IF NEEDED TO XON/XOFF
;<4.MONITOR>TTDZDV.MAC.174, 28-Sep-79 14:03:03, Edit by KONEN
;ALLOW OUTPUT OF XON/XOF OF DZ'S WHEN OUTPUT BUFFER IS EMPTY
;<4.MONITOR>TTDZDV.MAC.173, 19-Sep-79 14:49:53, EDIT BY MURPHY
;CHANGE VECTOR OFFSET NAMES
;<OSMAN.MON>TTDZDV.MAC.1, 10-Sep-79 16:11:45, EDIT BY OSMAN
;TCO 4.2412 - Move definition of BUGHLTs, BUGCHKs, and BUGINFs to BUGS.MAC
;<4.MONITOR>TTDZDV.MAC.171, 24-Aug-79 13:38:11, EDIT BY WEISBACH
;TCO 4.2355 SEND XON OVER DZ LINES ONLY IF LINE PREVIOUSLY X'D OFF.
;<4.MONITOR>TTDZDV.MAC.170, 11-Mar-79 13:12:43, EDIT BY KONEN
;UPDATE COPYRIGHT FOR RELEASE 4
;<4.MONITOR>TTDZDV.MAC.169, 15-Feb-79 19:06:01, Edit by MCLEAN
;SOTP EXTRANEOUS DZ OUTPUT INTERRUPT FROM HANGING
;<4.MONITOR>TTDZDV.MAC.168, 2-Feb-79 23:40:35, Edit by MCLEAN
;ADD VSFEXO FOR FRONT-END XOFF RECOGNITION ;ENABLE/DISABLE FRONT-END XOFF RECOGNITION
;<4.MONITOR>TTDZDV.MAC.167, 24-Jan-79 00:20:48, Edit by MCLEAN
;FIX XON/XOFF AND OUTPUT TO NON-EX LINE CRASHES
;<4.MONITOR>TTDZDV.MAC.166, 28-Dec-78 22:45:26, Edit by MCLEAN
;ADD VSTPLN ;STOP LINE
;<4.MONITOR>TTDZDV.MAC.165, 13-Dec-78 16:20:51, Edit by MCLEAN
;CORRECT NUMBER OF STOP BITS IN TABLE IT WAS BACKWARDS.
;<2MCLEAN>TTDZDV.MAC.164, 18-Oct-78 22:50:03, Edit by MCLEAN
;<2MCLEAN>TTDZDV.MAC.163, 18-Oct-78 11:46:55, Edit by MCLEAN
;<2MCLEAN>TTDZDV.MAC.162, 14-Oct-78 22:18:05, Edit by MCLEAN
;<2MCLEAN>TTDZDV.MAC.161, 14-Oct-78 22:14:57, Edit by MCLEAN
;<2MCLEAN>TTDZDV.MAC.160, 14-Oct-78 18:07:23, Edit by MCLEAN
;<2MCLEAN>TTDZDV.MAC.159, 13-Oct-78 16:10:51, Edit by MCLEAN
;<2MCLEAN>TTDZDV.MAC.158, 11-Oct-78 00:09:41, Edit by MCLEAN
;<2MCLEAN>TTDZDV.MAC.157, 10-Oct-78 23:52:42, Edit by MCLEAN
;<2MCLEAN>TTDZDV.MAC.156, 7-Oct-78 22:31:18, Edit by MCLEAN
;REMOVE OBFFR FOR SPEED
;<4.MONITOR>TTDZDV.MAC.155, 5-Oct-78 15:50:02, Edit by MCLEAN
;FIX CARNON SO PERM BIT IS CORRECTLY CHECKED
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976,1977,1978,1979,1980,1981,1982 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
SUBTTL DZ11 DEVICE DEPENDENT CODE FOR SM10
; DZ11 TTY SERVICE MODULE FOR SM10 CONFIGURATIONS
EXTN <DZCHCT> ;SPECIAL "CLOCK" FOR PI CHECKS
;DEFINITIONS FOR TTDEV FOR DZ TYPE LINES
;DEFINITIONS FOR TT.DZ LINE TYPE
TT%DZI==1B0 ;DZ INTERRUPT SERVICE FLAG
MSKSTR TTDZI,TTDEV,TT%DZI
;DEFINITIONS FOR AUTOBAUDING ON DZ LINES
DZIGNC==1B0 ;[7245] IGNORE NEXT CHAR (PROBABLY GARBAGE)
MSKSTR DZIGN,0,DZIGNC ;[7245] MASK FOR DZIGNC
DZSFLG==DZ1RXO+DZ1OPA+DZ8BIT+DZ2STP ;[7245] DZ FLAGS FOR THE LINE
RESCD
SCDTMZ==^D50 ;TIME FOR RING CHECKS
DZTMCK==^D5000/SCDTMZ ;WHEN TO DO PI CHECK
DZCRDL==^D8000 ;TIME DELAY FOR CARRIER HANGUP
;VECTOR TABLE FOR DEVICE DEPENDENT ROUTINES
TTDZVT=.
TTDDLN ;LENGTH OF DYNAMIC DATA FOR THIS TYPE
-1 ;FIRST LINE OF THIS TYPE/-1 NO LINES
IFIW!DZINIT ;VITBLS -INITALIZATION ;INITIALIZE TABLES AT SYSTEM STARTUP
IFIW!DZRSTR ;RESTART
IFIW!TTCOB5 ;CLEAR OUTPUT BUFFER
IFIW!DZSSP2 ;SET LINE SPEED
IFIW!DZRSPD ;[1820] READ TTY SPEED
IFIW!DZSNT1 ;SET NON-TERM STATUS
IFIW!DZRNT1 ;READ NON-TERM STATUS
IFIW!TTSTO3 ;REMOVE CHAR FROM OUTPUT BUFFER
IFIW!R ;STPAR JSYS
IFIW!RSKP ;CHECK PHYSICAL LINE
IFIW!TTXON2 ;VXON -XON ;PROCESS XON FROM TERMINAL
IFIW!TTYDE0 ;DEASIGN DYNAMIC DATA
TRO 1,200 ;SET PARITY
IFIW!STRTO1 ;START OUTPUT LINE
IFIW!DZSXOF ;XOFF
IFIW!DZSXON ;XON
IFIW!DZRING ;EMPTY BUFFER
IFIW!DZ7CX2 ;CARRIER ON
IFIW!DZCX2 ;CARRIER OFF
IFIW!DZHU0 ;HANGUP
IFIW!R ;VXOFF -^S ;PROCESS XOFF FROM TERMINAL
IFIW!TTC7S1 ;NO LOGINS
IFIW!DZBST ;STORE CHARACTER
IFIW!DZSND1 ;SEND CHARACTER
IFIW!TTDAL7 ;DEALLOCATE LINE
IFIW!DLSSX2 ;BUFFER OVERFLOW
IFIW!R ;EMPTY BUFFER
IFIW!DZSNSA ;VTTMSG - ALLOW TTMSG FOR SINGLE LINE ;DO TTMSG FOR ONE LINE?
IFIW!R ;ENABLE/DISABLE DATASETS
IFIW!DZCH7D ;PIA ETC CHECKS
IFIW!R ;30 CLEAR INPUT BUFFER
IFIW!R ;31 DOBE
IFIW!R ;32 INPUT GA
IFIW!TTSET1 ;33 SET INIT. VALUES FOR A LINE
IFIW!TTSBE1 ;34 SOBE
IFIW!TTOBE1 ;35 WAKEUP IF OUTPUT BUFFER EMPTY
IFIW!DZSNSN ;VSNDA1 - ALLOW TTMSG FOR SINGLE LINE ;SENDALL FOR ONE LINE
IFIW!DZSNDL ;VSNDAL - ALLOW TTMSG FOR ALL LINES ;SENDALL FOR ALL LINES
JFCL ;VAJWCL - ADJUST WAKEUP CLASS ;ADJUST WAKEUP CLASS
IFIW!R ;VSTPLN - STOP LINE ;STOP LINE
IFIW!R ;VSFEXO - ENABLE XOFF RECOGNITION ;ENABLE/DISABLE FRONT-END XOFF RECOGNITION
IFN <.-TTVTMX>-TTDZVT,<PRINTX %% INVALID DEVICE DEPENDTNT TABLE SIZE>
;
; SEND CHARACTER TO LINE
; CURRENTLY ONLY CTY IN SECONDARY PROTOCOL IS IMPLEMENTED
;WARNING!!! SNEAKY BUT Q2 IS SET UP TO EXTERNAL PAGE ADDRESS OF
;DZ11 IFF TTDZI IS NON-ZERO!!!
DZSND1: PUSH P,T2
JN TTDZI,(T2),[ MOVEI T4,0(T3) ;IF DZ INTERRUPT THEN JUST OUTPUT CHARACTER
SETZRO TTDZI,(T2)
WRIOB T4,DZTBUF(Q2)
POP P,T2
RET]
DYNST
CAME T2,KLILNO ;KLINIK?
JRST NOTDZK ;NOT KLINIK
JN KLIOVL,,[ POP P,T2 ;BACKUP STILL BUSY
JRST DZBKUP]
JN TTXOC,(T2),DZXOC ;XON/OFF REQUESTED?
STOR T3,KLIOCH ;STORE OUTPUT CHARACTER
SETONE KLIOVL ;SET VALID
JRST CTYCOM ;AND DO COMMON STUFF
NOTDZK:CAME T2,CTYLNO
JRST [ SKIPE DZLNCT ;IF NO DZ LINES MUST RETURN
SKIPN FEFLG ;SECONDARY PROTOCOL?
JRST PB2 ;NO -- RETURN IT IS NOT LEGAL NOW
JRST DZPRNC] ;NOT CTY BUT PRIMARY PROTOCOL
JN CTYOVL,,[ POP P,T2 ;RESTORE T2
JRST DZBKUP] ;AND BACKUP
JN TTXOC,(T2),DZXOC ;XON/OFF REQUIRED?
STOR T3,CTYOCH ;SET OUTPUT CHARACTER
SETONE CTYOVL ;SET VALID CHARACTER AVAILABLE
CTYCOM: CALL INTETY ;INTERRUPT 8080
POP P,T2 ;RESTORE
SETONE TTOTP,(T2) ;SET LINE ACTIVE
RET ;RETURN
DZPRNC: SUB T2,DZLNOF ;SUBTRACT RESTRICTED LINES
CAMLE T2,DZLNNO ;LEGAL?
JRST PB2 ;NO IGNORE
POP P,T2 ;RESTORE REGISTER
MOVEI T4,0(T3) ;SAVE CHARACTER
CALL GETEXL ;GET EXTERNAL PAGE INFO
SETONE TTOTP,(T2) ;SET LINE ACTIVE
BSIOB T1,DZTCR(T3) ;LINE NOT ENABLED DO IT AND WAIT FOR INTERRUPT
DZBKUP: JN TTSAL,(T2),[ MOVNI T3,1 ;BACK UP SENDALL
LOAD T1,TSALP,(T2)
ADJBP T3,T1 ;BACKUP POINTER
STOR T3,TSALP,(T2) ;RESTORE COUNTER
INCR TSALC,(T2) ;UPDATE CHARACTER COUNT
RET] ;RETURN
MOVNI T3,1 ;BACKUP BYTE POINTER
ADJBP T3,TTOOUT(T2)
MOVEM T3,TTOOUT(T2) ;RESTORE IT
AOS TTOCT(T2) ;RESET COUNT
RET
DZXOC: JN TTFXF,(T2),DZPRXO ;DO XON
DZPRXF: MOVEI T4,XOFFC ;GET XOFF CHARACTER
SKIPA ;COMMON
DZPRXO: MOVEI T4,XONC ;GET CHARACTER
SKIPGE CHITAB(T4) ;PARITY NEEDED?
TXO T4,200 ;YES, APPLY IT
SETZRO <TTXOC>,(T2) ;CLEAR FLAGS
CAMN T2,KLILNO ;KLINIK?
JRST [ STOR T4,KLIOCH ;YES STORE IN KLINIK BUFFER
SETONE KLIOVL ;SET VALID CHARACTER
JRST DZPRXA]
STOR T4,CTYOCH ;STORE CHARACTER IN 8080 BUFFER
SETONE CTYOVL ;SET VALID CHARACTER
DZPRXA: CALL INTETY ;INTERRUPT 8080
POP P,T2 ;RESTORE T2
SETONE TTOTP,(T2) ;SET LINE ACTIVE
JRST DZBKUP ;AND BACKUP
;
DZXOCA: JN TTFXO,(T2),DZDZXF ;XOFF?
DZDZXO: MOVEI T4,XONC ;GET CHARACTER
SKIPA ;COMMON ENTRY
DZDZXF: MOVEI T4,XOFFC ;GET XOFF CHARACTER
SKIPGE CHITAB(T4) ;PARITY NEEDED?
TXO T4,200 ;YES, APPLY IT
SETZRO <TTXOC>,(T2) ;CLEAR FLAGS
WRIOB T4,DZTBUF(T3) ;WRITE CHARACTER
RET
; SET/CLEAR NON-TERMINAL STATUS
SWAPCD
DZSNT1: STOR T3,TTNTS,(T2) ;SET/CLEAR FLAG
RET
; READ NON-TERMINAL STATUS
DZRNT1: LOAD T3,TTNTS,(T2) ;RETURN STATUS
RET
RESCD
DZBST: LOAD T3,TTFBB,(T2) ;GET COUNT
AOS T3 ;INCREASE COUNT OF CHARACTERS IN TTBBUF
CAIL T3,MAXABC ;OVER RUN (IGNORE IT TOO MANY)
RET ;YOU HAVE BEEN WARNED
STOR T3,TTFBB,(T2) ;STORE COUNT
CAIL T3,MAXBBC ;CHECK FOR MAX BEFORE SHUT OFF
CALL SNDXOF ;SEND XOFF
JRST BIGST1 ;STORE CHARACTER
DZSXOF: MOVEI T4,XOFFC ;GET XOFF CHARACTER
SETONE <TTXOC,TTFXO>,(T2) ;SET XOFF
SETZRO TTFXF,(T2)
JRST DZXCM ;GO TO COMMON STUFF
DZSXON: JE TTFXO,(T2),R ;XON ONLY IF REQUIRED
PUSH P,T2 ;SAVE LINE NUMBER
CALL STADYN ;CONVERT TO DYNAMIC
JRST DZNXN ;FORGET IT
LOAD T4,TIMAX,(2) ;CAPACITY OF INPUT BUFFERS
SUBI T4,MINCT1 ;LESS AMOUNT BEFORE FORCED WAKEUP
CAMG T4,TTICT(2) ;BUFFER NOW THAT FULL?
JRST PB2 ;YES, WAIT
DYNST ;BACK TO STATIC ADDRESS
SETONE <TTXOC,TTFXF>,(T2) ;SET XON REQUIRED
SETZRO TTFXO,(T2) ;CLEAR OLD SWITCH
DZNXN: MOVEI T4,XONC ;GET XON CHARACTER
POP P,T2 ;RESTORE LINE NUMBER
DZXCM: SKIPGE CHITAB(T4) ;PARITY NEEDED?
TXO T4,200 ;YES, APPLY IT
CHNOFF DLSCHN ;SET CHANNEL OFF
CAMN T2,KLILNO ;KLINIK?
JRST [ JN KLIOVL,,DZCXR ;CHECK TO SEE IF READY
STOR T4,KLIOCH ;STORE CHARACTER
SETONE KLIOVL ;SET VALID
JRST DZXCM1]
CAME T2,CTYLNO ;CTY?
JRST DZXDZ ;REAL DZ
JN CTYOVL,,DZCXR ;CHECK TO SEE IF READY FOR A CHARACTER
STOR T4,CTYOCH ;SET OUTPUT CHARACTER
SETONE CTYOVL ;SET VALID
DZXCM1: SETZRO TTXOC,(T2) ;CLEAR BOTH SINCE ALL IS DONE
CALL INTETY ;INTERRUPT 8080
DZCXR: CHNON DLSCHN ;TURN CHANNEL BACK ON
RET ;AND RETURN
DZXDZ: PUSH P,T2 ;SAVE STATIC ADDRESS
CALL STADYN ;FIND DYNAMIC STORAGE ADDRESS
JRST DZDZX ;NOT SETUP YET FORGET IT
JN TTDZI,(T2),DZDZX ;QUIT IF BUSY (IT WILL GET CLEARED)
CALL GETEXL ;FIND EXTERNAL PAGE ADDRESS
SETONE TTOTP,(T2) ;SET LINE ACTIVE
BSIOB T1,DZTCR(T3) ;REQUEST INTERRUPT
DZDZX: CHNON DLSCHN
JRST PB2 ;AND QUIT
;DZINIT -- ROUTINE TO INITALIZE DZ11
;DZRSTR -- SAME ROUTINE TO RESTART DZ11
DZINIT: SAVEAC <Q1,Q2,P1> ;SAVE AN AC
SETZM CTYINT ;SET ALIAS (FOR NOW IT IS 0) FOR CTY
MOVE T4,SMTEPT+DZUBN ;FIND THE TRAP VECTORS
ADDI T4,DZ110V/4 ;OFFSET TO INTERRUPT VECTORS
MOVEI Q2,DZMAX ;FIND THE MAX DZ11
MOVE T2,[XPCW DZRDIB] ;SET INTERRUPT BLOCK
MOVE T3,[XPCW DZXINB] ;OUTPUT INTERRUPT BLOCK
SETZB Q1,P1 ;SET POINTER TO CORRECT BLOCK
DZIVLP: MOVEM T2,0(T4) ;MAKE AN ENTRY IN THE INTERRUPT VECTOR BLOCK
MOVEM T3,1(T4) ;GET OUTPUT INTERRUPT VECTOR
ADDI T3,4 ;FOUR WORDS PER INTERRUPT BLOCK
ADDI T4,2 ;POINT TO NEXT INTERRUPT BLOCK
MOVE T1,[MSEC1,,DZRDIN] ;SET UP THE INTERRUPT BLOCK
MOVEM T1,DZRDIB+3 ;SET UP VECTOR ADDRESS
SETZM DZRDIB+2 ;SET FLAGS TO 0
MOVE T1,[MSEC1,,DZTXIN] ;SET UP OUTPUT INTERRUPT BLOCK
ADD T1,Q1 ;POINT TO CORRECT INTERRUPT INST
MOVEM T1,DZXINB+3(P1)
SETZM DZXINB+2+(P1) ;SET FLAGS TO 0
ADDI Q1,3 ;3 INSTRUCTIONS PER LINE
ADDI P1,4 ;4 WORDS PER BLOCK
SOJN Q2,DZIVLP ;LOOP UNTIL DONE
MOVE T1,CTYINT ;GET CTY LINE NUMBER
AOS T1 ;MAKE KLINIK CTY+1
MOVEM T1,KLILNO ;SAVE KLINIK LINE NUMBER
RET
; RESTART CODE ALSO RUN FOR INITILIZATION IT SETS UP THE INTERRUPT ENABLES
DZRSTR: SAVEP ;SAVE THE P'S
MOVSI P1,-DZMAX ;MAXIMUNM NUMBER OF DZ11'S TO HANDLE
MOVE P2,[DZ11BA] ;GET BASE ADDRESS OF DZ11
DZINLP: MOVE T1,P2 ;ADDRESS OF DZ11
CALL UBGOOD ;DOES IT EXIST ?
JRST DZNOUB ;NO
MOVEI T1,DZCLR ;INIT THE DZ11
WRIO T1,DZCSR(P2) ;RESET THE DZ
MOVSI T2,1 ;SET UP LOOP COUNT
DZCLRK: SOJE T2,[BUG(DZCLRB)]
TIOE T1,DZCSR(P2) ;WAIT FOR FINISH
JRST DZCLRK
MOVEI T1,DZRIEN+DZTIEN+DZMSCN ;SET INTERRUPT ENABLES AND SCANNER
WRIO T1,DZCSR(P2) ;START DZ11
ADDI P2,DZMNV ;ADD THE VECTOR SIZE
AOBJN P1,DZINLP ;AND TRY THE NEXT ONE
DZNOUB: HRRZM P1,DZLNCT ;SAVE NUMBER OF DZ11'S FOUND
IMULI P1,10 ;COUNT OF LINES
HRRZM P1,DZLNNO
MOVE T1,TTLINV+TT.DZ ;FIND THE OFFSET AND KEEP IT HANDY
MOVE T1,TT1LIN(T1)
ADDI T1,FELNS ;ADD IN PSEUDO LINES
MOVEM T1,DZLNOF
RET ;RETURN
; DZHU0 -- ROUTINE TO SCHEDULE A HANGUP
DZHU0: SETZ T1, ;T1/ INDICATE DO IT IMMEDIATELY
MOVE T3,[DZHU2] ;T3/ ROUTINE TO HANGUP THE LINE
CALL TTQAD ;SCHEDULE HANGUP AS SOON AS POSSIBLE
RET
; DZHU2 -- ROUTINE TO DO A HANGUP
DZHU2: JE TTFEM,(T2),R ;RETURN IF NO DATASET
SETZRO TTCON,(T2) ;[1820] CLEAR CARRIER ON BIT
SAVET ;SAVE TEMP'S
CALL GETEXA ;GET EXTERNAL ADDRESS
BCIOB T1,DZLPR(T3) ;CLEAR LINE ENABLE
BCIOB T1,DZDTR(T3) ;CLEAR CARRIER
RET ;RETURN
;DZ7CX2 -- CARRIER ON
;DZCX2 -- CARRIER OFF
DZ7CX2: SKIPA T3,[TTCON1] ;CARRIER ON
DZCX2: MOVE T3,[TTCOF] ;CARRIER OFF
MOVEI T1,DZCRDL ;8 SEC
CALL TTQAD
JRST TTCH7
;DZCH7D -- PIA CHECK TO SEE IF INTERRUPTS ENABLES HAVE BEEN LOST
DZCH7D: MOVEI T1,^D250 ;[1820] TIME FOR NEXT CHECK (EVERY .25 SECONDS)
MOVEM T1,TTYTIM ;TELL SCHEDULER
SOSLE DZCHCT ;TIME FOR PI CHECK?
JRST DZRING ;NO. DO RING POLL ONLY THEN
MOVEI T1,DZTMCK ;YES. SET UP NEXT TIME CHECK
MOVEM T1,DZCHCT ;AND SET UP "CLOCK"
CHNOFF DLSCHN ;TURN OFF DLS CHANNEL
MOVE T1,DZLNCT ;GET LINE COUNTS
JUMPE T1,DZCH7E ;IF NO DZ'S THEN NO CHECK
MOVE T2,[DZ11BA] ;GET BASE ADDRESS
MOVEI T3,DZRIEN!DZTIEN!DZMSCN
DZCH7L: TION T3,DZCSR(T2) ;CHECK FOR ENABLES
JRST [ BUG(DZLINT,<<T2,D>>)
MOVEI T4,377 ;SET ALL LINES TO INTERRUPT ASSUMING LOST ONE
WRIOB T4,DZTCR(T2)
BSIO T3,DZCSR(T2) ;SET INTERRUPT ENABLES AGAIN
JRST .+1]
ADDI T2,DZMNV ;LOOK AT NEXT DEVICE
SOJN T1,DZCH7L ;TRY NEXT ONE
DZCH7E: CHNON DLSCHN ;TURN ON CHANNEL
;NOW CHECK FOR RING ON ANY OF THE LINES
;[8883] Since DECserver-200s and other devices don't do modem protocol quite
;[8883] right, we now consider a ring as a change in ring going from off to on.
;[8883] This does not change the operation of normal modems, which only toggle
;[8883] ring when a call comes in, and it makes devices connected to DZ lines
;[8883] that lower and then raise ring to simulate a modem work properly.
DZRING: MOVE T2,TTLINV+TT.DZ ;GET VECTOR FOR THIS LINE TYPE
SKIPE DZLNCT ;IF NO DZ LINES FORGET IT
SKIPGE T2,TT1LIN(T2) ;GET FIRST LINE NUMBER
RET ;NONE THERE
MOVN T4,DZLNNO ;FIND COUNT OF LINES
HRL T2,T4 ;GET - NUMBER OF LINES
ADDI T2,FELNS ;UPDATE FOR CTY AND KLINIK
DZRNG0: JE TTFEM,(T2),DZRNG2 ;[1820] NOT A REMOTE LINE - NO PROCESSING NECESSARY
PUSH P,T2 ;SAVE ARGS
CALL GETEXA ;GET EXTERNAL PAGE ADDRESS
TIONB T1,DZRNG(T3) ;CHECK FOR RING
JRST DZRNG3 ;[8883] Ring not up
JE TTORG,(T2),DZRGON ;[8883] Jump if ring was down and now is up
JRST DZRNG4 ;[8883] Ring still up, check carrier
DZRNG3: SETZRO TTORG,(T2) ;[8883] Remember ring was not up
DZRNG4: TIONB T1,DZCAR(T3) ;[1820] IS CARRIER UP
JRST DZCROF ;[1820] NO, GO DO CARRIER OFF PROCESSING
JRST DZCRON ;[1820] YES, GO DO CARRIER ON PROCESSING
DZRNG1: POP P,T2 ;[1820]
DZRNG2: AOBJN T2,DZRNG0 ;[1820] DO THEM ALL
RET ;[1820] AND DONE
DZRGON: SETONE TTORG,(T2) ;[8883] Ring was up
JN TTCON,(T2),DZRGO1 ;[1820] IS CARRIER THOUGHT TO BE ON?
BSIOB T1,DZDTR(T3) ;[1820] NO, SO SET DTR ON
SETONE TTCRW,(T2) ;[1820] SET THE CARRIER WAIT BIT ON
MOVEI T1,^D20000 ;[1820] SET THE CARRIER WAIT TIMEOUT TO 20 SECONDS
MOVE T3,[DZCRTO] ;[1820] INDICATE ROUTINE TO BE CALLED
CALL TTQAD ;[1820] QUEUE THE REQUEST
JRST DZRNG1 ;[1820] AND CONTINUE SCANNING THE LINES
DZRGO1: SETZRO TTCON,(T2) ;[1820] CLEAR THE CARRIER ON BIT
SETZ T1, ;[1820] QUEUE THIS TO RUN ASAP
MOVE T3,[NTYCOF] ;[1820] INDICATE THE ROUTINE TO BE CALLED
CALL TTQAD ;[1820] AND QUEUE THE REQUEST TO DETATCH THE JOB
;[1820] ON THIS LINE
JRST DZRNG1 ;[1820] CONTINUE SCANNING...
DZCRON: JN TTCRW,(T2),DZCRCW ;[1820] IS THIS LINE WAITING FOR CARRIER?
JN TTCON,(T2),DZRNG1 ;[1820] NO, IS CARRIER SUPPOSED TO BE ON?
CALL STADYN ;[1820] IS THE LINE ACTIVE?
JRST DZRNG1 ;[1820] NO SO IGNORE THE CARRIER
MOVE T2,(P) ;[1820] RESTORE T2 (STADYN CLOBBERED IT)
SETONE TTCON,(T2) ;[1820] YES, SO SET THE CARRIER BIT ON AGAIN
JRST DZRNG1 ;[1820] AND CONTINUE SCANNING
;[1820] HERE IF A LINE IS IN CARRIER WAIT AND THE CARRIER COMES ON
DZCRCW: SETZRO TTCRW,(T2) ;[1820] CLEAR THE CARRIER WAIT BIT
JE TTAUT,(T2),DZCRC1 ;[1820] IS THIS AN AUTOBAUD LINE?
PUSH P,T4 ;[1820] SAVE AWAY T4
MOVE T4,T2 ;[1820] GET THE LINE NUMBER
SUB T4,DZLNOF ;[1820] SUBTRACT THE DZ LINE OFFSET
ANDI T4,7 ;[1820] MASK DOWN TO THE UNIT NUMBER
HLRZ T1,ATB240 ;[7245] GET DEFAULT AUTOBAUD SPEED (2400)
IOR T1,T4 ;[1820] ADD IN THE UNIT NUMBER
WRIO T1,DZLPR(T3) ;[1820] AND SET LINE SPEED
POP P,T4 ;[1820] RESTORE T4
SETZRO TTLSP,(T2) ;[7245] CLEAR LOW SPEED AUTOBAUD FLAG
SETZRO TTINC,(T2) ;[7245] CLEAR IGNORE CHARACTER (AUTOBAUD)
SETONE TTABW,(T2) ;[1820] PUT LINE INTO AUTOBAUD WAIT STATE
SETONE TTCON,(T2) ;[1820] SET THE CARRIER ON BIT
MOVEI T1,^D30000 ;[1820] SET TIMEOUT TO 30 SECONDS
MOVE T3,[DZABTO] ;[1820] THE ROUTINE TO CALL
CALL TTQAD ;[1820] QUEUE THE TIMEOUT ROUTINE
JRST DZRNG1 ;[1820] AND CONTINUE SCANNING
DZCRC1: SETONE TTCON,(T2) ;[1820] NOT AN AUTOBAUD LINE SO SET CARRIER BIT ON
MOVEI T1,^D2000 ;[1820] QUEUE A REQUEST FOR 2 SECONDS FROM NOW
;[1820] (THIS IS SO THE LINE CAN SETTLE)
MOVE T3,[TTCON1] ;[1820] THE ROUTINE TO START A JOB
CALL TTQAD ;[1820] QUEUE THE REQUEST
JRST DZRNG1 ;[1820] AND CONTINUE SCANNING
;[1820] HERE IF THE CARRIER FOR A LINE IS OFF
DZCROF: JE TTCON,(T2),DZRNG1 ;[1820] GO AWAY IF THE CARRIER IS SUPPOSED TO BE OFF
SETZRO TTCON,(T2) ;[1820] CLEAR THE CARRIER ON BIT
CALL STADYN ;[1820] IS THE LINE ACTIVE?
JRST DZCRF1 ;[1820] NO, GO QUEUE CARRIER OFF TIMEOUT
JE TTPRM,(T2),DZCRF1 ;[1820] IS THE LINE PERMANENT
JRST DZRNG1 ;[1820] JUST CONTINUE SCANNING
DZCRF1: MOVE T2,(P) ;[1820] RESTORE T2 (STADYN CLOBBERED IT)
MOVEI T1,^D4000 ;[1820] SET UP AN 4 SECOND TIMEOUT
MOVE T3,[TTCOF] ;[1820] FOR THIS CARRIER OFF TRANSITION
CALL TTQAD ;[1820] QUEUE IT
JRST DZRNG1 ;[1820] AND CONTINUE SCANNING
;[1820] HERE WHEN WE TIMEOUT FROM DZRGON
DZCRTO: JE TTCRW,(T2),R ;[1820] HAS CARRIER WAIT BEEN CLEARED FOR THIS LINE?
SETZ T1, ;[1820] NO, SO JUST HANG UP THE LINE ASAP
MOVE T3,[DZHU2] ;[1820] THE HANGUP CODE
CALL TTQAD ;[1820] QUEUE THE REQUEST
SETZRO TTCRW,(T2) ;[1820] CLEAR THE CARRIER WAIT FLAG
RET ;[1820] AND EXIT
;[1820] HERE WHEN WE TIMEOUT FROM DXCRCW
DZABTO: JE TTABW,(T2),R ;[1820] STILL IN AUTOBAUD WAIT?
MOVE T3,[DZHU2] ;[1820] YES, HANG UP
SETZ T1, ;[1820] NOW!!!
CALL TTQAD ;[1820] QUEUE THE REQUEST
SETZRO TTABW,(T2) ;[1820] CLEAR THE AUTOBAUD WAIT BIT
SETZRO TTCON,(T2) ;[1820] CLEAR THE CARRIER FLAG
RET ;[1820] AND EXIT
;READ INTERRUPT ROUTINE
DZRDIN: MOVEM P,DZSAVP ;SAVE A REGISTER
MOVEI P,DZSVAC ;POINT TO AC SAVE AREA
BLT P,DZSVAC+16 ;SAVE AC'S
MOVE P,DZPDL ;SET UP STACK
MOVE Q1,DZLNCT ;FIND THE NUMBER OF LINES
MOVE Q2,[DZ11BA] ;FIND FIRST EXTERNAL PAGE ADDRESS
SKIPE FEFLG ;CHECK FOR PRIMARY PROTOCOL
JRST DZINPP ;YES -- GO DUMP ALL DZ'S
DZCTRD: RDIO T1,DZRBUF(Q2) ;READ A CHARACTER
TRNE T1,DZRDVL ;VALID?
JRST DZCTRD ;LOOP AND TRY FOR ANOTHER
DZNXCL: SOJE Q1,DZRXIT ;CHECK TO SEE IF ALL DZS DONE
ADDI Q2,DZMNV ;LOOK AT NEXT DZ TO DUMP ALL CHARACTERS
MOVEI T1,DZRDVL ;IN THE BUFFERS TO STOP THEIR INTERRUPTING
TIOE T1,DZRBUF(Q2) ;THIS WILL READ A CHARACTER AND DUMP IT
JRST .-1 ;THIS WILL CAUSE ALL CHARACTERS TO BE DUMPED
JRST DZNXCL ;GO DO NEXT DZ
DZINPP: MOVE P1,DZLNOF ;SET UP LINE NUMBER (MUST START AT 1
DZINPL: RDIO T1,DZRBUF(Q2) ;GET A CHARACTER
TRNN T1,DZRDVL ;VALID?
JRST DZNXLN ;NO -- GO TO NEXT LINE
LOAD T2,DZTXLN,T1 ;[1820] GET THE LINE NUMBER
ADD T2,P1 ;[1820] FIND ITS INTERNAL LINE NUMBER
JN TTINC,(T2),DZINP1 ;[7245] IGNORE NEXT CHAR AFTER AUTOBAUD ?
JN TTABW,(T2),DZABCK ;[1820] IS THE LINE IN THE AUTOBAUD WAIT STATE?
TRNE T1,DZROVR ;OVER RUN
BUG(DZOVER,<<T1,D>>)
ANDI T1,377 ;MASK TO CHARACTER ONLY
CALL TTIDON ;GO PUT IN BUFFER
JRST DZINPL ;GET ANOTHER CHARACTER
DZINP1: SETZRO TTINC,(T2) ;[7245] CLEAR IGNORE CHAR (AFTER AUTOBAUD)
DZNXLN: ADDI P1,10 ;8 LINES PER DZ
ADDI Q2,DZMNV ;LOOK AT NEXT DZ
SOJN Q1,DZINPL ;CHECK TO SEE IF COUNT DONE
JRST DZRXIT ;GO TO READ EXIT (DONE)
DZRXIT: MOVSI P,DZSVAC ;RESTORE ACS
BLT P,CX ;RESTORE
MOVE P,DZSAVP ;RESTORE P
XJEN DZRDIB ;RETURN
;INTERRUPT ROUTINE FOR THE CTY FOR THE KS10
DZCTIN::CLSB DLSCHN ;CLEAR CHANNEL INTERRUPT REQUEST
MOVEM P,DZSAVP ;SAVE STACK REGISTER
MOVEI P,DZSVAC ;POINT TO SC SAVE AREA
BLT P,DZSVAC+16 ;SAVE ACS
MOVE P,DZPDL ;SET UP STACK
LOAD T1,KLIACT ;[1822] GET THE KLINIK INPUT ACTIVITY BYTE
JUMPE T1,DZNOKL ;[1822] IF NO ACTIVITY GO ON
MOVE T2,KLILNO ;[1822] GET THE LINE NUMBER OF THE KLINIK LINE
CAIN T1,KLICHR ;[1822] INCOMING CHARACTER?
JRST [ LOAD T1,KLIICH ;[1822] YES, GO PROCESS IT
CALL TTIDON ;[1822] PASS THE CHARACTER ON
JRST DZCTI1 ] ;[1822] AND CONTINUE
CAIN T1,KLICAR ;[1822] NO, LOST KLINIK CARRIER?
JRST [ MOVE T3,[NTYCOF] ;[1822] YES, DISCONNECT THE JOB
SETZ T1, ;[1822] ASAP
CALL TTQAD ;[1822] QUEUE THE REQUEST
JRST DZCTI1 ] ;[1822] AND CONTINUE ON
CAIE T1,KLIINI ;[1822] NO, A NEW CALL MAYBE?
JRST DZCTI1 ;[1822] NO, SO PUNT
MOVE T3,[TTCON1] ;[1822] YES, SO GIVE THE GUY A JOB
SETZ T1, ;[1822] NOW! THE 8080 SHOULD HAVE A GOOD
;[1822] SOLID CARRIER BY NOW
CALL TTQAD ;[1822] QUEUE THE REQUEST
DZCTI1: SETZM KLIIWD ;[1822] ZAP THE KLINIK INPUT WORD
CALL INTETY ;INTERRUPT EIGHTY EIGHTY
DZNOKL: JN KLIOVL,,DZNXT ;OUTPUT VALID?
MOVE T2,KLILNO ;YES GET LINE NUMBER
CALL STADYN ;GET DYN ADDR
JUMPLE T2,DZNXT ;TRY NEXT
CALL TTSND ;DONE DO NEXT CHARCTER
DZNXT: JE CTYIVL,,DZNOCT ;CHECK FOR CTY INPUT
LOAD T1,CTYICH ;PICK UP THE CHACTER
MOVE T2,CTYLNO ;GET THE CTY LINE NUMBER
SETZRO CTYIVL ;CLEAR CHARACTER IN BUFFER FLAG
CALL TTIDON ;OUTPUT CHARACTER
CALL INTETY ;INTERRUPT EIGHTY EIGHTY
DZNOCT: JN CTYOVL,,DZNXIT ;NO CTY
MOVE T2,CTYLNO ;GET LINE NUMBER
CALL STADYN ;CONVERT TO DYNAMIC STORAGE
JUMPLE T2,DZNXIT ;QUIT IF NO DYNAMIC STORAGE
CALL TTSND ;DO DONE STUFF
DZNXIT: MOVSI P,DZSVAC ;RESTORE
BLT P,CX
MOVE P,DZSAVP
RET ;RETURN
DZPDL: IOWD 40,DZISTK ;I/O STACK SIZE
RS (DZISTK,40) ;STACK FOR INTERRUPT SERVICE
RS (DZRDIB,4) ;INPUT INTERRUPT BLOCK
RS (DZXINB,4*^D8) ;INTERRUPT BLOCK FOR OUTPUT
RS (DZSVAC,17) ;SAVE AC FOR READ INTERRUPT
RS (DZSAVP,1) ;SAVE AC 17
RS (DZLNCT,1) ;COUNT OF DZ'S FOUND
RS (DZLNNO,1) ;COUNT OF LINES FOUND
RS (DZLNOF,1) ;OFFSET TO FIRST LINE NUMBER
; NOTE MUST HAVE ONE SET OF 3 INSTRUCTIONS PER DZ11!!!!!!
DZTXIN::DMOVEM P6,DZSVAC+P6 ;SAVE REGISTERS
SETZ P6,0 ;POINTER TO WHICH LINE SET
JRST DZCOMI ;GO TO COMMON INTERRUPT SERVICE
DZTXI1: DMOVEM P6,DZSVAC+P6
MOVEI P6,10 ;SECOND BLOCK OF 10
JRST DZCOMI
DZTXI2: DMOVEM P6,DZSVAC+P6
MOVEI P6,20
JRST DZCOMI
DZTXI3: DMOVEM P6,DZSVAC+P6
MOVEI P6,30
JRST DZCOMI
DZTXI4: DMOVEM P6,DZSVAC+P6
MOVEI P6,40
JRST DZCOMI
DZTXI5: DMOVEM P6,DZSVAC+P6
MOVEI P6,50
JRST DZCOMI
DZTXI6: DMOVEM P6,DZSVAC+P6
MOVEI P6,60
JRST DZCOMI
DZTXI7: DMOVEM P6,DZSVAC+P6
MOVEI P6,70
; JRST DZCOMI
;
DZCOMI: MOVEM P,DZSAVP ;SAVE A REGISTER
DMOVEM T1,DZSVAC+T1
DMOVEM T3,DZSVAC+T3
DMOVEM Q1,DZSVAC+Q1
MOVE P,DZPDL ;SET UP STACK SIZE
MOVE Q2,[DZ11BA] ;GET BASE ADDRESS
ADD Q2,P6 ;POINT TO CORRECT ADDRESS
LSH P6,-1 ;FIND RETURN ADDRESS
DMOVE T1,DZXINB(P6) ;GET RETURN PS/PC
DMOVEM T1,DZXINB ;STORE IN COMMON RETURN
LSH P6,1 ;GET ADDRESS BACK
ADD P6,DZLNOF ;SET UP LINE COUNT
DZTNXO: RDIO T2,DZCSR(Q2) ;READ THE STATUS
TRNN T2,DZTRDY ;CHECK FOR TRANSMIT DONN
JRST DZTXIT ;NOT THIS DZ TRY NEXT ONE
LDB T2,[POINT 3,T2,27] ;PICK UP LINE NUMBER
MOVNS T2 ;GET CORRECT BIT POSITION
MOVE Q1,BITS+^D35(T2) ;SAVE LINE NUMBER
MOVNS T2 ;BACK THE WAY IT WAS
ADD T2,P6 ;MAKE ABSOLUTE NUMBER
JN <TTXOC>,(T2),[CALL GETEXA
CALL DZXOCA ;DO XON/XOF
JRST DZTNXO]
SKIPG T2,TTACTL(T2) ;[2629] NET DYNAMIC STORANE
JRST [ CAML T2,[-1] ;[2638]
JRST DXTNEX ;[2638] 0 OR -1
JRST .+1 ] ;[2638] OK
SETONE TTDZI,(T2) ;SET INTERRUPT FLAG
CALL TTSND ;DO TTY DONE
SETZRO TTDZI,(T2)
JN TTOTP,(T2),DZTNXO ;DONE?
DXTNEX: BCIOB Q1,DZTCR(Q2) ;CLEAR THE ACTIVE BITS
JRST DZTNXO ;TRY FOR ANOTHER
;THIS WILL STOP INTERRUPTING DZ AND END OUTPUT
DZTXIT: DMOVE T1,DZSVAC+T1
DMOVE T3,DZSVAC+T3
DMOVE Q1,DZSVAC+Q1
DMOVE P6,DZSVAC+P6
MOVE P,DZSAVP ;RESTORE AC
XJEN DZXINB ;AND RETURN
; SENDALL
SWAPCD
DZSNDL: CAME T2,KLILNO
CAMN T2,CTYINT ;CHECK FOR REAL CTY
RET ;CAN'T DO THIS LINE
PUSH P,T2
SUB T2,DZLNOF ;FIND IF LINE A LEGAL DZ LINE
CAML T2,DZLNNO ;LGAL? (DZ'S +CTY)
JRST [ ADD T2,DZLNOF ;PUT LINE NUMBER BACK
CAME T2,KLILNO ;CHECK FOR KLINIK
CAMN T2,CTYLNO ;CHECK FOR CTY
JRST .+1 ;YUP ALL OK TO DO SENDALL
JRST PB2] ;NOPE QUIT
DZCTOK: POP P,T2 ;RESTORE LINE NUMBER
SKIPE FEFLG ;SECONDARY PROTOCOL?
RETSKP ;YES RETURN OK
SETO T2,0 ;NO SKIP GROUP
RETSKP
; SENDALL TO SPECIFIC LINE
;
DZSNSA:
DZSNSN: CAME T2,KLILNO ;NOT KLINIK YET
CAMN T2,CTYINT ;CHECK FOR CTY
RET ;YES NOT THIS ONE
SKIPN FEFLG ;CHECK FOR PRIMARY PROTOCOL
RET ;NO SEND ALL LEGAL HERE
PUSH P,T2 ;SAVE REGISTER
SUB T2,DZLNOF ;FIND BEGINNING OF LINES
CAML T2,DZLNNO ;LGAL? (DZ'S + CTY)
JRST [ ADD T2,DZLNOF ;PUT LINE NUMBER BACK
CAME T2,KLILNO ;CHECK FOR KLINIK
CAMN T2,CTYLNO ;CHECK FOR CTY
JRST .+1 ;YUP DO SENDALL
JRST PB2] ;NO ON SENDALL
POP P,T2 ;YES
RETSKP ;RETURN SEND ALL LEGAL
RESCD
;
SWAPCD
; SET SPEED FOR A DZ11 LINE
;
DZSSP2: UMOVE T4,2 ;GET FLAGS
TXNE T4,MO%AUT ;REQUESTING AUTO?
JRST [ TXNE T4,MO%RMT ;[1820] YES. ALSO WANT REMOTE?
JRST .+1 ;[1820] YES. PROCEED THEN
RET] ;[1820] NO. ILLEGAL REQUEST
SKIPN DZLNCT ;IF NO DZ LINES CAN'T SET SPEED
RET
UMOVE T4,T3 ;GET THE SPEED
HLRZ T1,T4 ;CHECK TO SEE BOTH HALF THE SAME
CAME T2,KLILNO ;NOT KLINIK LINE NUMBER EITHER
CAMN T2,CTYINT ;CHECK FOR CTY
RET ;NOT LEGAL ON THIS MACHINE
CAME T2,CTYLNO ;CHECK TO SEE IF CTY <CAN'T SET THAT ONE)
CAIE T1,0(T4) ;IF NOT SAME THEN FORGET IT HARDWARE
RET ;SUPPORTS INPUT/OUTPUT SAME
NOINT ;SET NOINT
CHNOFF DLSCHN ;TURN OFF CHANNEL WHILE PLAYING WITH LINE SPEEDS
JN TTFEM,(T2),DZSSP1 ;IF REMOTE DON'T SET PERM SPEED
XCTU [SKIPGE 2] ;REMOTE REQUESTED?
JRST [ MOVX T3,SC%OPR!SC%WHL ;CHECK CAPBILITIES
TDNN T3,CAPENB
JRST DZSSP1 ;NO CAPABILITIES FORGET IT
SETONE TTFEM,(T2) ;[1820] SET ONCE ONLY FLAG
UMOVE T3,2 ;[1820] GET THE REMOTE AND AUTOBAUD BITS
TXNN T3,MO%AUT ;[1820] IS THE LINE TO BE AUTOBAUD
JRST .+1 ;[1820] NO, CONTINUE
SETONE TTAUT,(T2) ;[1820] YES, SET THE AUTOBAUD BIT
MOVE T4,[<^D300>B17+<^D300>B35] ;[1820] SET THE DEFAULT SPEED
JRST .+1] ;AND CONTINUE
JUMPE T4,[EXCH T4,TTSPWD(T2) ;TREAT SPEED ZERO SPECIALLY, PRESERVE
JRST DZSSP1] ; OUTPUT CHARACTERISTICS, TURN OFF INPUT
MOVEM T4,TTSPWD(T2) ;SAVE TTY SPEED
DZSSP1: MOVEM T4,DZSPWD(T2) ;[1820] SET THE DZ11 SPECIFIC SPEED WORD
HRRZS T4 ;SET SPEED IN RIGHT HALF ONLY
MOVEI T1,ATBSTB ;FIND POINTER TO TABLE POINTER
DZSPLP: MOVE T3,0(T1) ;GET A TABLE ENTRY
JUMPE T3,NOLNSP ;NO LINE SPEED FOUND
CAIE T4,0(T3) ;CORRECT ENTRY?
AOJA T1,DZSPLP ;NO -- TRY NEXT ONE
HLRZ T4,T3 ;GET LINE SPEED
MOVE T3,T2 ;GET LINE NUMBER
SUB T3,DZLNOF ;SUBTRACT FRONT-END LINES
CAML T3,DZLNNO ;CHECK TO SEE IF LEGAL LINE NUMBER
JRST NOLNSP ;NOPE -- QUIT WHILE AHEAD
ANDI T3,7 ;MASK TO 3 BITS
IOR T4,T3 ;SET UNIT NUMBER
CALL GETEXA ;GET THE EXTERNAL PAGE ADDRESS OF THIS DZ
SKIPN DZSPWD(T2) ;[2913] SETTING SPEED TO ZERO?
TRZ T4,DZ1RXO ;YES, FOR DZ HARDWARE TURN OFF RX CLOCK
WRIO T4,DZLPR(T3) ;SET THE LINE PARAMETER REGISTER
NOLNSP: CHNON DLSCHN ;ENABLE CHANNEL
OKINT ;ENABLE INTERRUPTS
RET ;RETURN
;[1820] ROUTINE TO RETURN SPEED TO A USER
;[1820] IMPLEMENTS THE .MORSP FUNCTION OF MTOPR
DZRSPD: SETO T3, ;[1820] SET UP THE "INDETERMINATE SPEED" VALUE
CAME B,KLILNO ;[1820] IS THIS THE KLINIK LINE?
CAMN T2,CTYLNO ;[1820] NO, IS THIS THE CTY?
SKIPA ;[1820] YES, SO THE SPEED IS INDETERMINATE
DZRSP1: MOVE C,DZSPWD(B) ;[1820] GET CURRENT SPEED
UMOVEM C,C ;[1820] PUT INTO USER SPACE
SETZ C, ;[1820] CLEAR C
OPSTR <SKIPE>,TTFEM,(B) ;[1820] A REMOTE LINE?
TXO C,MO%RMT ;[1820] YES
OPSTR <SKIPE>,TTAUT,(B) ;[1820] AN AUTOBAUD LINE?
TXO C,MO%AUT ;[1820] YES
XCTU [HLLM C,2] ;[1820] PUT IT INTO USER SPACE
RET ;[1820] AND RETURN
;[1820] HERE WITH A CHARACTER IF A LINE IS IN AUTOBAUD WAIT
;[1820] NOTE THAT Q2 HAS EXTERNAL PAGE ADDRESS
RESCD
DZABCK: PUSH P,T3 ;[1820] SAVE AN AC
PUSH P,T4 ;[1820] SAVE ANOTHER AC
ANDI T1,377 ;[7245] SAVE ONLY CHARACTER BITS
MOVEI T4,ATBLST ;[7245] POINT TO LOW-SPEED AUTOBAUD TABLE
JN TTLSP,(T2),DZABC1 ;[7245] WAITING TO TRY HI-SPEED AUTOBAUD?
MOVEI T4,ATBHST ;[7245] YES - THEN USE HI-SPEED TABLE
TXZ T1,1B35 ;[7245] FOR HI-SPEED, LOW ORDER BIT IS GARBAGE
DZABC1: HLRZ T3,(T4) ;[1820] GET CHARACTER FROM TABLE
ANDI T3,777 ;[7245] CLEAR FLAG BITS
JUMPE T3,DZABC2 ;[1820] IF END OF TABLE THEN QUIT
CAME T1,T3 ;[1820] IS THIS A MATCH?
AOJA T4,DZABC1 ;[7245] NO, BUMP POINTER AND CONTINUE SCAN
HLRZ T3,(T4) ;[1820] GET FLAGS FOR THIS CHAR
JE DZIGN,(T4),DZABC3 ;[7245] WANT TO IGNORE POSSIBLE GARBAGE CHARS
SETONE TTINC,(T2) ;[7245] YES - SET FLAG FOR DZ INPUT ROUTINE
DZABC3: HRRZ T3,(T4) ;[1820] GET THE SPEED TABLE ENTRY
HRRZ T4,(T3) ;[7245] GET THE DECIMAL LINE SPEED
HRL T4,T4 ;[1820] IN BOTH LH AND RH
MOVEM T4,DZSPWD(T2) ;[1820] AND STORE IT IN THE SPEED WORD
HLRZ T4,(T3) ;[7245] GET THE SPEED WORD
CALL DZABSP ;[7245] GO SET DZ AUTOBAUD SPEED
SETZRO TTLSP,(T2) ;[7245] CLEAR CHECK LOW-SPEED FLAG
SETZRO TTABW,(T2) ;[1820] CLEAR THE AUTOBAUD WAIT BIT
MOVE T3,[TTCON1] ;[1820] SET CARRIER ON
MOVEI T1,^D750 ;[7245] IN 3/4 SEC.
CALL TTQAD ;[1820] SCHEDULE IT
JRST DZABC4 ;[7245] GO FINISH UP
DZABC2: SETCMP TTLSP,(T2) ;[7245] FLIP THE SPEED TABLE BIT
SETONE TTINC,(T2) ;[7245] IGNORE NEXT CHAR, TTY MAYBE AT LO-SPEED
HLRZ T4,ATB300 ;[7245] GET LO-SPEED FLAGS
OPSTR <SKIPN>,TTLSP,(T2) ;[7245] GOING TO TRY HI-SPEED AUTOBAUD?
HLRZ T4,ATB240 ;[7245] YES - GET HI-SPEED FLAGS
CALL DZABSP ;[7245] GO SET DZ AUTOBAUD SPEED
DZABC4: POP P,T4 ;[7245] RESTORE T4
POP P,T3 ;[1820] RESTORE T3
JRST DZINPL ;[1820] AND GO CHECK FOR MORE CHARACTERS
;[7245] HERE TO SET DZ SPEED AFTER AUTOBAUD OR TO CHANGE SPEED
;[7245] USING OTHER AUTOBAUD SPEED TABLE
;
;[7245] T2/ LINE #
;[7245] Q2/ EXTERNAL PAGE #
DZABSP: MOVE T3,T2 ;[7245] GET THE LINE NUMBER
SUB T3,DZLNOF ;[7245] SUBTRACT THE FRONT-END LINE OFFSET
ANDI T3,7 ;[7245] MASK TO 3 BIT LINE NUMBER
IOR T4,T3 ;[7245] SET UNIT NUMBER
WRIO T4,DZLPR(Q2) ;[7245] AND SET THE LINE SPEED
RET
;FLAGS AND LINE SPEED TABLE USED WHEN THE SPEED HAS BEEN FOUND
ATBSTB: DZSFLG+0,,^D50
DZSFLG+400,,^D75
ATB110: DZSFLG+1000,,^D110
DZSFLG+1400,,^D134
ATB150: DZSFLG+2000,,^D150
ATB300: DZSFLG+2400,,^D300 ;OUR LOW SPEED AUTOBAUD SPEED
DZSFLG+3000,,^D600
ATB120: DZSFLG+3400,,^D1200
ATB180: DZSFLG+4000,,^D1800
DZSFLG+4400,,^D2000
ATB240: DZSFLG+5000,,^D2400 ;OUR HI SPEED AUTOBAUD SPEED
DZSFLG+5400,,^D3600
ATB480: DZSFLG+6000,,^D4800
DZSFLG+6400,,^D7200
ATB960: DZSFLG+7000,,^D9600
0,,0 ;END OF TABLE
;LOW SPEED AUTO BAUD TABLE
ATBLST: 174B17!ATB110 ;^C AT 110 BAUD
234B17!ATB110!DZIGNC ;<CR> AT 110 BAUD
214B17!ATB110!DZIGNC ;<CR> AT 110 BAUD
346B17!ATB150!DZIGNC ;<CR> AT 150 BAUD
036B17!ATB150 ;^C AT 150 BAUD
003B17!ATB300 ;^C AT 300 BAUD
203B17!ATB300!DZIGNC ;^C AT 300 BAUD
015B17!ATB300 ;<CR> AT 300 BAUD
215B17!ATB300!DZIGNC ;<CR> AT 300 BAUD
0,,0 ;END OF LOW SPEED TABLE
;HIGH SPEED AUTOBAUD TABLE
ATBHST: 036B17!ATB120 ;^C AT 1200 BAUD
346B17!ATB120!DZIGNC ;<CR> AT 1200 BAUD
006B17!ATB180 ;^C AT 1800 BAUD
072B17!ATB180 ;<CR> AT 1800 BAUD
002B17!ATB240 ;^C AT 2400 BAUD
202B17!ATB240 ;^C AT 2400 BAUD
214B17!ATB240 ;<CR> AT 2400 BAUD
014B17!ATB240 ;<CR> AT 2400 BAUD
370B17!ATB480 ;^C AT 4800 BAUD
360B17!ATB480 ;^C AT 4800 BAUD
374B17!ATB480 ;^C AT 4800 BAUD
376B17!ATB960 ;^C AT 9600 BAUD
0,,0 ;END OF HI SPEED TABLE
;GETEXA -- SUBROUTINE TO FIND THE EXTERNAL PAGE ADDRESS OF
; THE SPECIFIED DZ11
; CALLING SEQUENCE:
; T2 -- LINE NUMBER
;
; CALL GETLIN
; T1 -- LINE BIT POSITION (LINE 0=1B35 ETC)
; T3 -- EXTERNAL PAGE ADDRESS OF FIRST REGISTER FOR THIS DZ11
; RETURNS +1 ALWAYS
GETEXA: PUSH P,T2 ;SAVE LINE NUMBER
GETEX1: SUB T2,DZLNOF ;BACKUP TO POINT TO REAL NUMBER
MOVE 3,2 ;GET LINE NUMBER
ANDI T3,777770 ;MASK OF LOW ORDER 3 BITS (8 PER DZ)
ADD T3,[DZ11BA] ;ADD DZ11 BASE ADDRESS
MOVE T1,T2
ANDI T1,7 ;MASK OFF UNIT
MOVNS T1
MOVE T1,BITS+^D35(T1)
POP P,T2 ;RESTORE
RET
;
; GETEXL -- SUBROUTINE TO FIND EXTERNAL PAGE AND LINE NUMBER
;
; CALLING SEQUENCE:
; B -- DYNAMIC STORAGE ADDRESS
; CALL GETEXL
; RETURNS:
; A -- LINE BIT POSITION (LINE 0=1B35 1,1B34 ETC)
; C -- EXTERNAL PAGE ADDRESS OF THIS DZ11
;
GETEXL: PUSH P,T2 ;SAVE DYNAMIC ADDRESS
DYNST ;GET LINE NUMBER
CALLRET GETEX1 ;GET EXTERNAL PAGE ADDRESS