Trailing-Edge
-
PDP-10 Archives
-
BB-5255D-BM
-
4-sources/netsta.mac
There are 4 other files named netsta.mac in the archive. Click here to see a list.
;<4.ARPA-UTILITIES>NETSTA.MAC.8, 4-Jan-80 09:47:38, EDIT BY R.ACE
;UPDATE COPYRIGHT DATES
;<4.ARPA-UTILITIES>NETSTA.MAC.7, 11-Oct-79 11:38:17, Edit by LCAMPBELL
; Update version and edit numbers for release 4
;<4.ARPA-UTILITIES>NETSTA.MAC.6, 10-Jul-79 18:32:49, Edit by LCAMPBELL
; Also leave B19 clear, it now has meaning
;<4.ARPA-UTILITIES>NETSTA.MAC.5, 23-Apr-79 18:43:34, Edit by LCAMPBELL
; Leave DEC-reserved bit (B18) zero in SFMODs
;<4.ARPA-UTILITIES>NETSTA.MAC.4, 9-Jan-79 14:00:16, Edit by LCAMPBELL
; Update copyright notice
;<JBORCHEK>NETSTA.MAC.3, 6-Nov-78 11:44:50, EDIT BY JBORCHEK
;IF HOST NUMBER IS 0 ASSUME DEAD AT LP2
;<3-CLEMENTS>NETSTA.MAC.18, 20-Aug-78 23:01:08, EDIT BY CLEMENTS
; Combine and trim files into one.
;<3.ARPA-UTILITIES>NETSTA.MAC.5, 14-Nov-77 10:20:01, EDIT BY CROSSLAND
;CORRECT COPYRIGHT NOTICE
;<3.ARPA-UTILITIES>NETSTA.MAC.4, 26-Oct-77 02:37:41, EDIT BY CROSSLAND
;UPDATE COPYRIGHT FOR RELEASE 3
;<3.ARPA-UTILITIES>NETSTA.MAC.2, 5-Oct-77 00:53:50, EDIT BY CROSSLAND
;CONVERT STDIR TO RCUSR IN USERS COMMAND
;<A-SOURCES>NETSTA.MAC.6, 30-Dec-76 22:13:10, EDIT BY CROSSLAND
;CONVERT VERSION NUMBER TO DEC STYLE VERSION NUMBER
;<2MURPHY>NETSTA.MAC.15, 2-Sep-76 23:01:11, EDIT BY MURPHY
;ADDED SEARCH MONSYM,MACSYM
;<JOHNSON>NETSTA.MAC;16 5-FEB-74 09:42:45 EDIT BY JOHNSON
;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 Digital Equipment Corporation, Maynard, Mass.
TITLE NETSTAT
SEARCH MONSYM,MACSYM
SALL
.REQUIRE SYS:MACREL
.DIRECT FLBLST
VWHO==0 ;LAST EDITED BY DEC
VMAJOR==4 ;MAJOR VERSION #
VMINOR==0 ;REVISION #
VEDIT==33 ;EDIT NUMBER
LOC <.JBVER==137>
VERSIO: <VWHO>B2+<VMAJOR>B11+<VMINOR>B17+VEDIT ;VERSIONS FOR TYPEOUT
RELOC
;AC DEFINITIONS
A=1
B=2
C=3
D=4
AC5=5
AC6=6
AC7=7
NCOL=10
COL=11
PTR=12
FM=15
FS=16
P=17
OPDEF NOP [JFCL 0,0] ;A NO-OP
OPDEF IFIW [400B8] ;FOR INDIRECTS ON MODEL B MACHINE
;FLAGS IN FM
FIRSTF==400000 ;1 MEANS: NOT FIRST TYPEOUT OF SKT INFO.
FGO==200000 ;GO START TYPEOUT (SET BY CSPEC WHEN DONE)
DOHSTF==100000 ;GIVE HOST INFO
DOSKTF==040000 ;GIVE SOCKET CONNECTION INFO
FSCON==020000 ;SPECIFIC CONNECTIONS WANTED
TTYALL==010000 ;ALL (OR NOT ALL) TTYS WANTED
HELPF==004000 ;SHORT HELP MESSAGE ALREADY GIVEN
FNOTLK==002000 ;DO NOT TALK TO USER
FREPT==001000 ;REPEAT RATHER THAN HALTF AT END.
FVERB==000400 ;USE HEADINGS ALWAYS.
FBRIEF==000200 ;USE NO HEADINGS OR MESSAGES.
DOSITF==000100 ;GIVE SITE INFO.
DECHNF==000040 ;DECIMAL HOST NUMBERS.
OCTHNF==000020 ;OCTAL HOST NUMBERS.
AGAINF==000010 ;THIS IS A REPEAT WITH NO COMMANDS YET.
;FLAGS IN FS
FNOT==400000
FHO==200000
FNHO==100000
FJO==040000
FNJO==020000
FSI==010000
FNSI==004000
FST==002000
FNST==001000
FTT==000400
FNTT==000200
FUS==000100
FNUS==000040
FLS==000020
FNLS==000010
FFS==000004
FNFS==000002
RAZ==200000 ;BIT FLAG FOR CASE CONVERSION FOR INEDIT
; PARAMETERS
TBLSIZ==1000 ;SIZE OF GETAB TABLES TOALLOW FOR.
MXNHST==1000 ;NUMBER OF HOSTS WHICH MAY BE KNOWN
ENTVEC: JRST BEG ;STARTING ADDRESS
JRST JSTCON
JRST JSTHST
;ENTRY FOR CONNECTION INFO ONLY
;HOST NUMBER IN AC0
;STATES WANTED IN A (BIT N => STATE #N)
JSTCON: RESET
MOVE P,[XWD -100,PDL-1]
PUSH P,0
PUSH P,1
PUSHJ P,SETUP
POP P,1
POP P,0
TRO FM,DOSKTF!FSCON!FNOTLK
CAMN 0,[-1]
JRST JSTCN1 ;IF AC0=-1 THEN ALL HOSTS
MOVE D,HOSTS
AOJ D,
MOVEM 0,HOSTS(D)
MOVEM D,HOSTS
TRO FM,FIRSTF ;NO HEADING IF A HOST IS GIVEN.
JSTCN1: CAME 1,[-1]
TRO FM,FIRSTF ;NO HEADING IF STATE IS GIVEN.
TDZ 1,[1B0+1B14] ;IGNORE DEAD AND FREE STATES.
MOVEM 1,STATES
TRO FS,FHO!FST
JRST NTSTAT
;ENTRY FOR HOST STATUS INFO ONLY
;A CONTAINS FLAGS:
; BIT 0 - HOSTS ONLY (NO TIPS).
; BIT 1 - DECIMAL HOST NUMBERS.
; BIT 2 - OCTAL HOST NUMBERS.
; BIT 3 - NO HEADING.
JSTHST: RESET
MOVE P,[XWD -100,PDL-1]
PUSH P,A
PUSHJ P,SETUP
POP P,A
TLNE A,400000
TRO FM,DOHSTF
TLNE A,200000
TRO FM,DECHNF
TLNE A,100000
TRO FM,OCTHNF
TLNE A,040000
TRO FM,FBRIEF
TRO FM,DOSITF!FNOTLK ;Do sites, No talk to user
JRST NTSTAT
;REPEAT ENTRY
KEEPF==FIRSTF!HELPF!FREPT!FVERB!FBRIEF!DECHNF!OCTHNF
AGAIN: PUSH P,B
PUSH P,C
PUSH P,10
PUSHJ P,SETAGN
ANDI FM,KEEPF ;KEEP THESE FLAGS.
POP P,10
POP P,C
POP P,B
POPJ P,
BEG: RESET
MOVE P,[XWD -100,PDL-1]
PUSHJ P,SETUP
HRROI A,[ASCIZ / "?" FOR HELP
/]
; PSOUT
NTSTAT: MOVEI A,100 ;GET, SAVE, AND RESET TTY MODE.
RFMOD
MOVEM B,TTYMOD
TRZ B,776000
TRO B,174000 ;WAKE ON ALL,
SFMOD ;DEFFERED OR IMMEDIATE ECHOING.
MOVE A,[SIXBIT /NETRDY/] ;CHECK FOR LIVE IMP.
SYSGT
JUMPGE A,[HRROI A,[ASCIZ /
THE IMP IS DEAD!
/]
PSOUT
JRST ENDUP]
;LOOP TO READ ALL AVAILABLE INFO ABOUT HOSTS KNOWN TO SYSTEM
; FIRST, ALL NAMES KNOWN TO SYSTEM
MOVEI A,.GTHSZ ;GET TABLE SIZE
GTHST ; FROM MONITOR
JRST ENDUP ;NOT AVAILABLE
HLRE C,B ;MAKE SURE WILL FIT IN TABLES
MOVMS C ; ..
CAILE C,MXNHST ;TOO BIG?
MOVEI C,MXNHST ;YES, TRIM IT
MOVNS C ;NEGATIVE AGAIN
HRL B,C ;AND UPDATE TO TRIMMED VALUE
MOVE COL,B ;HERE IS THE AOBJN POINTER
HLLZ NCOL,COL ;SAME, WITH INDEX OF 0 IN RH
MOVEM B,NHOSTS ;NUMBER OF HOST NAMES
SETZM HOSTAB ;CLEAR NAME STRINGS
MOVE C,[HOSTAB,,HOSTAB+1]
BLT C,EHSTAB
MOVEI PTR,HOSTAB ;WHERE TO STORE FIRST STRING
GTHL1: MOVEI A,.GTHIX ;GET HOSTNAME, FROM INDEX
MOVE B,PTR ;NEXT WORD IN STRING TABLE
HRLI B,440700 ;STRING POINTER
MOVEI C,(COL) ;INTERNAL INDEX
GTHST ;GET THE INFO
JRST EGETH1 ;NOT THERE?
MOVEI A,0(PTR) ;START OF THIS STRING
SUBI A,HOSTAB ;AS INDEX INTO TABLE
MOVEM A,HOSTNT(NCOL) ;SAVE NAME TABLE INDEX
MOVEI PTR,1(B) ;POINTER FOR NEXT NAME
MOVEM C,HOSTN(NCOL) ;REMEMBER THE NUMBER
MOVEM D,NAMSTS(NCOL) ;AND NAME'S STATUS
AOBJN NCOL,.+1 ;STEP TWO COUNTERS
AOBJN COL,GTHL1 ;AND GET ALL HOST NAMES
EGETH1:
;;
TRNE FM,FNOTLK ;SHOULD WE TALK TO USER
JRST NTSTR1 ;NO, GO WORK ON CONNECTIONS.
;FIND OUT WHAT TO DO
NTST10: MOVEI A,400000
MOVE B,[1B1]
DIC
MOVEI A,.CHLFD
PBOUT
NTST1: MOVEI A,"*" ;PROMPT CHARACTER
PBOUT
PUSHJ P,CHQUES ;CHECK FOR QUESTION MARK.
JRST CHELP
PUSHJ P,CHSEMI
JRST NTCMNT ;COMMENT.
MOVEI A,CMNDF ;SET UP TO LOOK FOR COMMAND.
MOVEM A,PRSTAB
MOVEI A,CMNDN
MOVEM A,PRSTRN
MOVEI A,PRSFND
TLO A,RAZ ;RAISE LOWER CASE TO UPPER CASE
SETZ B,
PUSHJ P,INEDIT
JRST NTCHEL ;NO MATCH
JRST NTST10 ;RUBOUT
JUMPE A,NTEOL ;BLANK LINE
TRZE FM,AGAINF ;FIRST COMMAND OF A REPEAT?
PUSHJ P,AGAIN ;YES. RESET THINGS.
PUSHJ P,ALTSPC ;OUTPUT SPACE IF TERM WAS ALTMODE.
HLRZ A,(10) ;GET ADDRESS OF ROUTINE TO HANDLE THIS
PUSHJ P,@A ;COMMAND, AND CALL IT.
CAIN C,","
JRST NTQUES
TRNE FM,FGO
JRST NTEOL
CAIE C,.CHLFD
JRST NTST10
JRST NTST1
;CHECK FOR BLANK LINE
NTCHEL: JUMPE A,NTEOL
;ERROR
NTQUES: HRROI A,[ASCIZ / ??/]
PSOUT
JRST NTST10
;COMMENT
NTCMNT: PUSHJ P,COMENT
JRST NTST1+2 ;^A PAST ;
JRST NTST10 ;RUBOUT
JRST NTST1 ;EOL.
;OUTPUT SPACE IF TERM WAS ALTMODE.
ALTSPC: PUSH P,A
MOVEI A," " ;SPACE
CAIN C,33 ;DID IT TERMINATE WITH ALTMODE?
PBOUT ;YES, TYPE SPACE
POP P,A
POPJ P,
;COMMAND TABLE
DEFINE CMNDS(CC)<
CC(ALL,CALL)
CC(HOSTS,CHOSTS)
CC(CONNECTIONS,CCONN)
CC(SPECIFIC,CSPEC)
CC(SITES,CSITE)
CC(SOCKETS,CCONN)
CC(QUIT,CQUIT)
CC(REPEAT,CREPT)
CC(BRIEF,CBRIEF)
CC(VERBOSE,CVERB)
CC(DECIMAL.HOST.NUMBERS,CDECHN)
CC(OCTAL.HOST.NUMBERS,COCTHN)
CC(NO.HOST.NUMBERS,CNOHN)
>
;REPEAT UNTIL "QUIT"
CREPT: TRO FM,FREPT
POPJ P,
;QUIT
CQUIT: TRZ FM,FREPT
POP P,
JRST ENDUP
;BRIEF MESSAGES AND HEADINGS
CBRIEF: TRO FM,FBRIEF
TRZ FM,FVERB
POPJ P,
;LONG MESSAGES AND HEADINGS
CVERB: TRO FM,FVERB
TRZ FM,FBRIEF
POPJ P,
;DECIMAL HOST NUMBERS WITH HOST NAME TYPEOUT.
CDECHN: TRO FM,DECHNF
POPJ P,
;OCTAL HOST NUMBERS
COCTHN: TRO FM,OCTHNF
POPJ P,
;NO HOST NUMBERS
CNOHN: TRZ FM,DECHNF!OCTHNF
POPJ P,
;ALL HOSTS AND CONNECTIONS
CALL: TRO FM,DOSKTF!DOSITF
POPJ P,
;ALL HOSTS
CHOSTS: CAIN C,.CHLFD
JRST CHORT
PUSHJ P,NTHGRP ;GET HOST GROUP NAME
POPJ P,
CHORT: TRO FM,DOHSTF!DOSITF
POPJ P,
;ALL SITES
CSITE: CAIN C,.CHLFD
JRST CSIRT
PUSHJ P,NTHGRP
POPJ P,
CSIRT: TRO FM,DOSITF
TRZ FM,DOHSTF
POPJ P,
;ALL CONNECTIONS
CCONN: TRO FM,DOSKTF
POPJ P,
;BLANK LINE. GO TO OUTPUT SECTION.
NTEOL: CAIE C,.CHLFD
JRST NTQUES
TRNN FM,DOSKTF!DOHSTF!DOSITF ;ARE ANY SET?
TRO FM,DOSKTF!DOSITF ;NO. DO ALL.
JRST NTSTRT
;READ IN AND STORE HOST GROUP NAMES.
NTHGRP: MOVE D,HSTGRP
MOVEI A,HGRPF
MOVEM A,PRSTAB
MOVEI A,HGRPN
MOVEM A,PRSTRN
MOVEI A,PRSFND
TLO A,RAZ ;RAISE LC TO UC.
MOVEI B,HGMESS
PUSHJ P,INEDIT
JRST NTHGCH
POPJ P, ;RUBOUT
HLRZ A,(10) ;GET GROUP BITS.
AOJ D,
HRRZM A,HSTGRP(D) ;SAVE THEM.
PUSHJ P,ALTSPC ;TYPE SPACE IF TERM WAS ALTMODE.
NTHGR1: CAIE C,.CHLFD
JRST NTHGRP+1 ;BACK FOR MORE.
CAMG D,HSTGRP ;WAS ANYTHING GIVEN?
POPJ P, ;NO.
MOVEM D,HSTGRP ;YES. SAVE POINTER AND RETURN.
AOS 0(P)
POPJ P,
;CHECK IF ONLY A CONFIRMING CR.
NTHGCH: CAIE C,.CHLFD
JRST NTHGER
JUMPN A,NTHGER
CAME D,HSTGRP
JRST NTHGR1+2
AOS 0(P)
POPJ P,
NTHGER: PUSHJ P,QUESMK
JRST NTHGR1
;HOST GROUP BITS, AND TABLE.
FTENEX==1000
FITS==2000
FDEC10==3000
FTIP==4000
FMTIP==5000
FSERV==400000
FUSER==200000
FNICKN==100000
DEFINE HGRPS(CC)<
CC(TENEX,FTENEX)
CC(ITS,FITS)
CC(DEC10,FDEC10)
CC(TIP,FTIP)
CC(MTIP,FMTIP)
>
;SPECIFIC CONNECTIONS
CSPEC: HRROI A,[ASCIZ /CONNECTIONS:/]
CAIN C,33
PSOUT
SP10: MOVEI A,.CHLFD ;EOL
PBOUT
SP1: TRZ FS,FNOT ;CLEAR "NOT" FLAG.
SP3: MOVEI A,"*" ;TYPE ** PROMPT.
PBOUT
PBOUT
SP33: PUSHJ P,CHQUES
JRST SPHELP
PUSHJ P,CHSEMI
JRST SPCMNT
MOVEI A,SPECF
MOVEM A,PRSTAB
MOVEI A,SPECN
MOVEM A,PRSTRN
MOVEI A,PRSFND
TLO A,RAZ ;RAISE LC TO UC.
SETZ B,
PUSHJ P,INEDIT
JRST SPCHEL
JRST SP10 ;RUBOUT
JUMPE A,SPEOL ;BLANK LINE
PUSHJ P,ALTSPC ;TYPE SPACE IF TERM WAS ALTMODE.
HLRZ A,(10) ;GET SPECIFICATION ROUTINE.
PUSHJ P,@A ;CALL IT.
JRST SPQUES
JRST SP10 ;RUBOUT
TRNE FS,FNOT
JRST SP33
TRO FM,DOSKTF!FSCON ;TYPE OUT SPECIFC CONNECTIONS.
JRST SP3
;CHECK FOR BLANK LINE
SPCHEL: JUMPE A,SPEOL
;ERROR
SPQUES: HRROI A,[ASCIZ / ??/]
PSOUT
JRST SP10
;TYPE QUESTION MARK
QUESMK: HRROI A,[ASCIZ / ? /]
PSOUT
POPJ P,
;COMMENT
SPCMNT: PUSHJ P,COMENT
JRST SP33 ;^A PAST ;
JRST SP10 ;RUBOUT
JRST SP1 ;EOL
;SPECIFICATION COMMANDS
DEFINE SPECS(CC)<
CC(NOT,SPNOT)
CC(STATES,SPSTAT)
CC(SIZES,SPSIZE)
CC(HOSTS,SPHOST)
CC(SITES,SPHOST)
CC(TTYS,SPTTY)
CC(JOBS,SPJOB)
CC(USERS,SPUSE)
CC(LOCAL.SOCKETS,SPLSKT)
CC(FOREIGN.SOCKETS,SPFSKT)
CC(SOCKETS,SPLSKT)
>
; "NOT" SPECIFICATIONS
SPNOT: CAIN C,.CHLFD
POPJ P,
PUSHJ P,ALTSPC ;TYPE SPACE IF TERM WAS ALTMODE.
TRNE FS,FNOT ;IS THERE ALREADY A NOT.
POPJ P, ;YES. ERROR.
TRO FS,FNOT ;NO. SET NOT FLAG.
AOS 0(P)
AOS 0(P)
POPJ P,
;EOL
SPEOL: TRNE FS,FNOT
JRST SPQUES ;"NOT" THEN EOL. ERROR.
TRNE FM,FSCON ;WAS ANYTHING SPECIFIED?
TRO FM,FGO ;YES. SET GO FLAG.
POPJ P,
NTSTRT: MOVEI A,.CHLFD ;EOL
PBOUT
NTSTR1: TRNN FM,DOSITF ;WANT TO DO SITES?
JRST ENDUPH ;NO.
MOVEI A,ENDUPH ;GO TO ENDUPH
MOVEM A,ABRET ; ON ^O INTERRUPT.
MOVEI A,400000
MOVE B,[1B1]
AIC ;ARM THE ^O INT.
;FIRST, SEE HOW MANY HOSTS THE MONITOR KNOWS OF, WITH OR W/O NAMES.
MOVEI A,.GTHSZ ;GET HOST TABLE SIZES
GTHST
JRST ENDUPH ;NOT IMPLEMENTED?
MOVEM C,AC5 ;THIS IS THE NUMBER IN HOST HASH TABLE
MOVE PTR,[POINT 7,STRING]
MOVEI AC6,HLIST-1
LP2: MOVEI A,.GTHHI ;GET HOST STATUS & NUM FROM IDX
MOVEI B,0 ;SHOULD BE UNUSED
MOVEI C,0(AC5) ;THIS INDEX
GTHST ;GET THE STATUS AND NUMBER
JRST DEAD ;FAILED?
JUMPLE C,DEAD ;IF NO HOST NUMBER OR
JUMPGE D,DEAD ;IF STATUS BIT 0 OFF, DEAD.
PUSH AC6,PTR
MOVE A,PTR
HRLI A,440700
MOVE B,C ;FULL HOST NUMBER
MOVE C,[1B2+12B17+10]
PUSHJ P,GETHST
JRST [POP AC6,PTR
JRST DEAD]
MOVE A,PTR ;NOW COUNT THE CHARS IN NAME
HRLI A,440700 ;RESCAN OVER THE TEXT
MOVEI C,0 ;COUNT FROM 0
LP2A: ILDB B,A ;GET A NAME CHAR
AOS C ;COUNT IT
JUMPN B,LP2A ;LOOP IF NOT AT TND
HRLM C,0(AC6) ;REMEMBER THE COUNT
MOVEI PTR,1(A) ;POINT FOR NEXT NAME
DEAD: AOBJN AC5,LP2 ;LOOP THRU ALL INDEXES
HLRZS AC6 ; NUMBER OF UP HOSTS
JUMPE AC6,[HRROI A,[ASCIZ /
NONE ARE UP.
/]
SKIPE HSTGRP
HRROI A,[ASCIZ /
NONE OF SPECIFIED TYPE ARE UP.
/]
TRNN FM,FBRIEF ;SKIP IF BRIEF MODE.
PSOUT
JRST ENDUPH]
MOVEI NCOL,8
FIT1: PUSHJ P,CHKFIT
SOSA NCOL
AOJA NCOL,FIT1
PUSHJ P,CHKFIT
SOJA NCOL,.-1
HRROI A,[ASCIZ /
THE FOLLOWING ARE UP:
/]
TRNN FM,FBRIEF ;SKIP IF BRIEF MODE.
PSOUT
SETZ AC7, ; START AT 0
PLN: MOVEI A,.CHLFD
PBOUT
PUSH P,AC7
MOVE COL,NCOL
PHL: HRRO A,HLIST(AC7)
PSOUT
SOJLE AC6,EPHL
SOJLE COL,EPHL
HLRZ B,HLIST(AC7) ; GET WIDTH OF THIS STRING
SUB B,CWIDTH(COL) ; NEG OF SPACING NEEDED
MOVEI A," "
PBOUT
AOJL B,.-1
ADD AC7,HITE(COL)
JRST PHL
EPHL: POP P,AC7 ; BACK TO WHERE WE STARTED
AOS AC7 ; WHERE TO START NEXT ROW
JUMPG AC6,PLN
JRST ENDUPH
; ROUTINE TO SEE IF NCOL COLUMNS WILL FIT
CHKFIT: MOVE COL,NCOL
SETZ AC7,
SETZM TWIDTH
FITLP: MOVE A,AC6 ; TOTAL HOSTS
SUBI A,0(AC7) ; LESS HOW MANY SO FAR
ADDI A,-1(COL) ; FIND LEAST INTEGER .GE. AC7/COL
IDIV A,COL
MOVEM A,HITE-1(COL) ; KEEP AS HEIGHT OF THIS COL
MOVNS A
HRL AC7,A ; MAKE AOBJN PTR
SETZM CWIDTH-1(COL) ; KEEP MAX WIDTH STRING
FMAXW: HLRZ A,HLIST(AC7) ; GET WIDTH
ADDI A,1
CAML A,CWIDTH-1(COL)
MOVEM A,CWIDTH-1(COL)
AOBJN AC7,FMAXW
MOVE A,CWIDTH-1(COL)
ADDB A,TWIDTH ; KEEP TOTAL WIDTH
CAILE A,^D72
POPJ P,
SOJG COL,FITLP
AOS 0(P)
POPJ P,
;SUBROUTINE TO GET HOST NAME
; ACCEPTS IN 1 POINTER TO DESTINATION
; 2 HOST NUMBER
; RETURNS +1 IF NOT OF RIGHT HOST GROUP
; +2 IF SUCCESS
;
GETHST: PUSH P,A ;PRESERVE THE ARG AC'S
PUSH P,B
PUSH P,C
PUSH P,D
MOVE C,B ;ARGS TO GTHST JSYS
MOVE B,[440700,,TMPSTR] ;STRING POINTER, IF FOUND
MOVEI A,.GTHNS ;NUMBER TO STRING FUNCTION
GTHST ;GET THE INFO
JRST GETHSU ;NUMBER NOT FOUND
GETHS0: SKIPN HSTGRP ;IT WAS FOUND. WANT GROUP CHECK?
JRST GETHS1 ;NOPE, GO CHECK SERVERS FLAG
PUSHJ P,CHHGRP ;SEE IF THIS IS IN THE GROUP
JRST GETHR1 ;IT ISN'T. FAIL.
JRST GETHOK ;SUCCESS. RETURN THE NAMESTRING
GETHSU: MOVE A,B ;POINTER
MOVE B,C ;NUMBER
MOVEI C,10 ;OCTAL
NOUT
JFCL
SKIPN HSTGRP ;WANT GROUP?
JRST GETHOK ;NO. RETURN THE NUMBER, THOUGH
JRST GETHR1 ;WELL, IT ISN'T IN THE GROUP!
GETHS1: TRNN FM,DOHSTF ;CHECK IF ONLY SERVERS WANTED.
JRST GETHOK ;NO
TXNN D,HS%SRV ;SKIP IF A SERVER
JRST GETHR1 ;NOT WANTED. SAME AS NOT IN GROUP
GETHOK: MOVE A,-3(P) ;AND ORIGINAL STRING POINTER
TRNN FM,DECHNF ;DECIMAL HOST NUMBERS?
JRST GETHS2 ;NO.
LDB B,[POINT 8,-2(P),19]
MOVE C,[1B2+4B17+^D10] ;YES.
NOUT
JFCL
MOVEI B,"/"
BOUT
LDB B,[POINT 16,-2(P),35]
MOVE C,[6B17+^D10]
NOUT
JFCL
;MORE
; FALLS THRU
GETHS2: MOVE B,-2(P) ;CALLED HOST NUMBER
TRNN FM,OCTHNF ;OCTAL HOST NUMBERS?
JRST GETHS3 ;NO.
MOVE C,[1B2+12B17+10] ;YES.
NOUT
JFCL
PUSH P,B
MOVEI B," "
IDPB B,A
POP P,B
GETHS3: MOVE C,[440700,,TMPSTR] ;ELSE COPY OUT THE NAME
GETHS4: ILDB D,C
IDPB D,A
JUMPN D,GETHS4
AOS -4(P)
GETHR1: POP P,D
POP P,C
POP P,B
POP P,A
POPJ P,
CHHGRP: PUSH P,A
MOVE C,D
ANDI C,17000
MOVE A,HSTGRP
CHHGR1: CAMN C,HSTGRP(A)
JRST CHHGR2
SOJG A,CHHGR1
SKIPA
CHHGR2: AOS -1(P)
POP P,A
POPJ P,
; HOST STATES DONE. NOW REPORT CONNECTION STATUS
ENDUPH: TRNN FM,DOSKTF
JRST ENDUP
MOVEI A,101
DOBE ;WAIT FOR ALL HOST STUFF TO MAKE IT OUT.
MOVEI A,ENDUP ;GO TO ENDUP
MOVEM A,ABRET ;ON ^O INTERRUPT.
MOVEI A,400000
MOVE B,[1B1]
AIC ;ARM THE ^O INT.
;NOW GET THE INFO ABOUT ALL SOCKETS
MOVEI A,.GTNSZ ;FIRST, GET THE TABLE SIZE
GTNCP ; ..
JRST ENDUP ;JSYS NOT IMPLEMENTED?
HLRE C,B ;NEG SIZE
MOVMS C ;POS SIZE
CAILE C,TBLSIZ ;FIT IN SPACE ALLOCATED?
MOVEI C,TBLSIZ ;NO, TRIM IT
MOVNS C ;NEGATIVE AGAIN
HRL B,C ;TRIM POINTER, MAYBE
HLLZM B,NSKT ;REMEMBER FOR LATER SCANNING
MOVE PTR,B ;NOW A COUNTER STARTING AT 0
HLLZ AC5,B ;SAME, STARTING AT 0
GETSL1: MOVEI A,.GTNIX ;ASK BY INDEX
MOVEI B,(PTR) ;THIS INDEX
MOVEI C,DGTNCP ;INTO DATA BLOCK
MOVSI D,-NNCPGT ;THIS MANY DATA ITEMS
GTNCP ;GET THE POOP
JRST ENDUP ;CAN'T FAIL HERE?!?
MOVSI COL,-NNCPGT ;NOW DISTRIBUTE THE DATA
GETSL2: MOVE A,DGTNCP(COL) ;GET AN ITEM
XCT TBLTBL(COL) ;SAVE IT
AOBJN COL,GETSL2 ;INNER LOOP
AOBJN AC5,.+1 ;BOTH INDEXES OF OUTER LOOP
AOBJN PTR,GETSL1 ;OUTER LOOP
JRST DUMPCN ;GO DUMP CONNECTION INFO
TBLTBL: NOP ;(00)INDEX
MOVEM A,FHST(AC5) ;(01)THIS CONN'S FOREIGN HOST
MOVEM A,NETLSK(AC5) ;(02)THIS CONN'S LOCAL SOCKET
MOVEM A,NETFSK(AC5) ;(03)THIS CONN'S FOREIGN SOCKET
DPB A,PFSM ;(04)FSM STATE
DPB A,PLINK ;(05)LINK NUMBER
HRLM A,NVT(AC5) ;(06)NVT NUMBER
DPB A,PBPBYT ;(07)BYTE SIZE
HRRM A,MSGALL(AC5) ;(10)MSG ALLOCATION
MOVEM A,NETBAL(AC5) ;(11)BIT ALLOCATION
; NOP ;(12)DESIRED ALLOCATION
; NOP ;(13)BITS TRANSFERRED
; NOP ;(14)BYTES PER BUFFER
; NOP ;(15)TIMEOUT COUNTER
; NOP ;(16)CONN STATUS WORD
NNCPGT==.-TBLTBL ;NUMBER OF WORDS TO HANDLE PER CONN
DUMPCN: TRNE FM,FVERB ;VERB FORCES HEADINGS.
TRZ FM,FIRSTF
TRNE FM,FBRIEF
TRO FM,FIRSTF ;BRIEF FORCES NO HEADINGS.
HLLZ AC5,NSKT ;AOBJN THRU ALL CONN'S
DEFINE NUMBER(GETIT,COLUMNS,RADIX,NOT)<
GETIT
MOVE C,[XWD 130000+COLUMNS,RADIX]
CAMN B,[NOT]
JRST NEXT
MOVEI A,101
NOUT
JFCL
>
; CHECK EACH CONNECTION FOR SATISFICATION OF CONDITIONS
; AND TYPE IT IF IT PASSES.
LP4: TRNN FS,FST ;STATE CONDITIONS
JRST LP4A
PUSHJ P,SKSTAT
JRST NEXT
TRNN FS,FNST ;FOR "NOT" CASE EXCISE FREE AND DEAD STATES.
JRST LP4B
LP4A: LDB B,PFSM
CAIE B,16
CAIN B,0
JRST NEXT
; HOST CONDITIONS
LP4B: SKIPG HOSTS ;HOSTS .GT. 0 MEANS SELECTED CONNECTION BASED
JRST LP4C ;ON CERTAIN HOSTS
PUSHJ P,SKHOST ;SKIPS IF HOST FOR THIS CONNECTION IS OK
JRST NEXT
; TTY CONDITIONS
LP4C: SKIPG TTYS
JRST LP4D
LP4F: PUSHJ P,SKTTY
JRST NEXT
JRST LP4E
LP4D: TRNE FM,TTYALL
JRST LP4F
; JOB CONDITIONS
LP4E: SKIPG JOBS
JRST LP4G
PUSHJ P,SKJOB
JRST NEXT
; USER CONDITIONS
LP4G: SKIPG USERS
JRST LP4H
PUSHJ P,SKUSER
JRST NEXT
; LOCAL SOCKET CONDITIONS
LP4H: SKIPG LCLSKT
JRST LP4J
PUSHJ P,SKLSKT
JRST NEXT
; FOREIGN SOCKET CONDITIONS
LP4J: SKIPG FRNSKT
JRST LP4I
PUSHJ P,SKFSKT
JRST NEXT
; BYTE SIZE CONDITIONS
LP4I: SKIPG BYTES ;BYTES>0 MEANS CHECK CONNECTION BYTE
JRST LP4K ;SIZE TO SEE IF SHOULD PRINT
PUSHJ P,SKBYTE ;SKIPS IF BYTE SIZE OK
JRST NEXT
LP4K: HRROI A,[ASCIZ \
ACTIVE CONNECTIONS:
I STATE LCL-SOCKET HOST 4N-SOCKET LNK BITS-ALLOC M-ALL BS/VT
\]
TRON FM,FIRSTF
PSOUT
MOVEI A,.CHLFD
PBOUT
NUMBER(<HRRZ B,AC5>,3,10,-1)
MOVEI A,40
PBOUT
LDB B,PFSM
HRROI A,STTB(B)
PSOUT
PRLSK: NUMBER(<MOVE B,NETLSK(AC5)>,^D12,10,-1)
PRFHN: MOVE B,FHST(AC5)
CAMN B,[-1]
JRST NEXT
MOVE A,[POINT 7,STRING]
MOVE C,[1B2+12B17+10]
CVHST
JRST [ MOVE A,[POINT 7,STRING]
NOUT
MOVE A,[POINT 7,STRING]
JRST .+1]
MOVEI B," "
IDPB B,A ; TERMINATE WITH SPACE
MOVEI A,101
BOUT ; INITIAL SPACE
HRROI B,STRING
MOVEI C,^D100
MOVEI D," "
SOUT ; SOUT THRU THE SPACE
SUBI C,^D<100-12> ; WANT 11 SPACES
JUMPL D,[HRROI B,[ASCIZ /
/]
MOVEI C,0
SOUT
MOVEI C,^D33
JRST .+1]
MOVEI B," "
SKIPE C
BOUT
SOJG C,.-1
PRFSK: NUMBER(<MOVE B,NETFSK(AC5)>,^D11,10,-1)
PRLNK: NUMBER(<LDB B,PLINK>,4,10,0)
PRBAL: NUMBER(<MOVE B,NETBAL(AC5)>,^D12,12,-1)
PRMAL: NUMBER(<HRRZ B,MSGALL(AC5)>,7,12,-1)
PRBSZ: HLRE B,NVT(AC5)
JUMPL B,PRBSZ1
HRROI A,[ASCIZ / T/]
PSOUT
NUMBER(<HLRZ B,NVT(AC5)>,3,10,0)
JRST PRBSZ2
PRBSZ1: HRROI A,[ASCIZ / B/]
LDB B,PBPBYT
SKIPE B
PSOUT
NUMBER(<LDB B,PBPBYT>,2,12,0)
PRBSZ2:NEXT: AOBJN AC5,LP4
HRROI A,[ASCIZ /
There are no active connections.
/]
TRNE FM,FSCON
HRROI A,[ASCIZ /
There are no connections of the specified type.
/]
TRNN FM,FIRSTF
PSOUT
ENDUP: MOVEI A,101
DOBE ;WAIT TILL IT ALL GETS OUT (OR ^O).
MOVEI A,.CHLFD
PBOUT
MOVEI A,100
MOVE B,TTYMOD
SFMOD
MOVEI A,400000
MOVE B,[1B1]
DIC ;DISARM ^O INT.
TRNN FM,FREPT ;SKIP IF IN REPEAT MODE
HALTF
TRO FM,AGAINF ;FLAG THE REPEAT.
JRST NTSTAT ;BACK AGAIN.
; MACRO TO HANDLE SPECIFICATION ROUTINES
DEFINE SPSET(MN,RDSUB)<
TRNN FS,FNOT!FN'MN
JRST RDSUB ;NO NOTS.
TRNN FS,F'MN
JRST RDSUB ;NEW SPEC.
TRNN FS,FN'MN
POPJ P, ;NEW NOT. ERROR.
TRNE FS,FNOT
JRST RDSUB ;BOTH ARE NOT.
HRROI A,[ASCIZ /(NOT) /] ;OLD NOT, TYPE REMINDER.
PSOUT
TRO FS,FNOT ;SET NOT FLAG.
JRST RDSUB
;RETURN
;FIRST CHECK IF ANYTHING WAS INPUT CORRECTLY
;AND THEN SET FLAGS.
SP'MN'RT: TRO FS,F'MN ;SET FLAG FOR THIS SPEC.
TRZE FS,FNOT
TRO FS,FN'MN ;SET NOT FLAG FOR THIS SPEC.
AOS 0(P)
SP'MN'RB: AOS 0(P) ;RUBOUT
SP'MN'ER: POPJ P, ;ERROR
>
;SIZES
SPSIZE: SPSET (SI,RDBYTE)
;HOSTS
SPHOST: SPSET (HO,RDHOST)
;STATES
SPSTAT: SPSET (ST,RDSTAT)
;TTYS
SPTTY: SPSET (TT,RDTTT)
;JOBS
SPJOB: SPSET (JO,RDJOB)
;USERS
SPUSE: SPSET (US,RDUSER)
;LOCAL.SOCKETS
SPLSKT: SPSET (LS,RDLSKT)
;FOREIGN.SOCKETS
SPFSKT: SPSET (FS,RDFSKT)
RDBYTE: CAIN C,.CHLFD
JRST SPSIER ;NO ARGS. ERROR.
MOVE D,BYTES
RDBYT0: MOVEI C,12 ;DECIMAL INPUT
HRROI B,HDNUM
MOVE A,B
PUSHJ P,CHQUES
PSOUT
PUSHJ P,NUMGET ;READ IN NUMBER.
JRST RDBYCH
JRST SPSIRB
JUMPE B,RDBYER ;0 IS ERROR.
AOJ D,
MOVEM B,BYTES(D) ;STORE NUM.
RDBYT1: CAIE C,.CHLFD ;EOL
JRST RDBYT0 ;BACK FOR MORE.
CAMG D,BYTES
JRST SPSIER ;NOTHING GIVEN. ERROR.
MOVEM D,BYTES
JRST SPSIRT ;RETURN
RDBYCH: CAIN C,.CHLFD
JUMPE A,RDBYT1+2
RDBYER: PUSHJ P,QUESMK
JRST RDBYT1
RDTTT: CAIN C,.CHLFD
JRST RDTTAL ;NO ARGS, ALL TTYS.
MOVE D,TTYS
RDTTY0: MOVEI C,10 ;OCTAL INPUT
HRROI B,HONUM
MOVE A,B
PUSHJ P,CHQUES
PSOUT
PUSHJ P,NUMGET
JRST RDTTCH
JRST SPTTRB
JUMPE B,RDTTER ;0 IS ERROR.
AOJ D,
MOVEM B,TTYS(D)
RDTTY1: CAIE C,.CHLFD
JRST RDTTY0
CAMG D,TTYS
JRST SPTTER
MOVEM D,TTYS
JRST SPTTRT ;RETURN
RDTTCH: CAIE C,.CHLFD
JRST RDTTER
JUMPN A,RDTTER
CAME D,TTYS
JRST RDTTY1+4
JRST RDTTAL
RDTTER: PUSHJ P,QUESMK
JRST RDTTY1
RDTTAL: TRO FM,TTYALL
JRST SPTTRT
RDJOB: CAIN C,.CHLFD
JRST SPJOER
MOVE D,JOBS
RDJOB0: MOVEI C,12 ;DECIMAL INPUT
HRROI B,HDNUM
MOVE A,B
PUSHJ P,CHQUES
PSOUT
PUSHJ P,NUMGET
JRST RDJOCH
JRST SPJORB
AOJ D, ;ZERO JOB OK.
MOVEM B,JOBS(D)
RDJOB1: CAIE C,.CHLFD
JRST RDJOB0
CAMG D,JOBS
JRST SPJOER
MOVEM D,JOBS
JRST SPJORT ;RETURN
RDJOCH: CAIN C,.CHLFD
JUMPE A,RDJOB1+2
RDJOER: PUSHJ P,QUESMK
JRST RDJOB1
; SUBROUTIN TO READ IN A NUMBER.
;ACCEPTS IN 3 THE RADIX.
;RETURNS +1 IF ERROR.
;RETURNS +2 WITH NUMBER IN B, # OF CHARS IN A, AND TERMINATOR IN C.
;
NUMGET: PUSH P,D
PUSH P,AC5
SETZ A,
MOVE D,C
PUSHJ P,INEDIT ;GET STRING.
0
JRST NMGRT2 ;RUBOUT
MOVE AC5,A
MOVE A,B
EXCH C,D
NIN ;CONVERT IT TO A NUMBER.
JRST NMGRT1 ;ERROR
AOS -2(P)
NMGRT2: AOS -2(P)
NMGRT1: MOVE C,D
MOVE A,AC5
POP P,AC5
POP P,D
POPJ P,
;GET LOCAL SOCKET SPECS.
RDLSKT: CAIN C,.CHLFD
JRST SPLSER ;NO ARGS, ERROR.
MOVEI AC5,LCLSKT ;PNTR TO CORRECT TABLE.
PUSHJ P,RDSKTS ;GET SOCKET RANGE WORDS.
JRST SPLSER ;ERROR.
JRST SPLSRB ;RUBOUT.
MOVEM D,LCLSKT ;OK. RETURN.
JRST SPLSRT
;GET FOREIGN SOCKET SPECS.
RDFSKT: CAIN C,.CHLFD
JRST SPFSER ;NO ARGS, ERROR.
MOVEI AC5,FRNSKT ;PNTER TO CORRECT TABBLE.
PUSHJ P,RDSKTS ;GET SOCKET RANGE WORDS.
JRST SPFSER ;ERROR.
JRST SPFSRB ;RUBOUT.
JRST SPFSRT ;OK. RETURN.
;RETURNS +1 IF ERROR
; +2 IF RUBOUT
; +3 IF OK HAVING PUT SOCKET RANGES INTO TABLE INDEXED
; BY D.
RDSKTS: MOVE D,0(AC5) ;GET OFFSET INTO TABLE.
ADD D,AC5 ;GET INDEX INTO TABLE.
RDSKT0: HRROI B,HSKTS ;SOCKETS HELP MESSAGE.
MOVE A,B
PUSHJ P,CHQUES
PSOUT
SETZ A,
PUSHJ P,INEDIT
0
JRST RDSKRB ;RUBOUT
CAIN C,.CHLFD ;WAS TERM EOL?
JUMPE A,RDSKT4 ;YES. JUMP IF BLANK SPEC.
MOVE AC6,C ;SAVE TERM CHAR.
MOVE A,B
ILDB B,B ;GET FIRST CHAR.
CAIE B,"<" ;CHECK IF < OR > RANGGE.
CAIN B,">"
JRST [ MOVEM B,2(D) ;YES. SAVE WHICH AND GET NUMBER.
ILDB B,A ;MOVE ON TO FIRST CHAR OF NUMBER.
JRST RDSKT2
]
CAIL B,"0"
CAILE B,"7" ;MUST BE OCTAL DIGIT.
JRST RDSKER
MOVEI C,10
NIN ;GET FIRST SOCKET.
JRST RDSKER
TLZE B,740000 ;32 BIT MAX.
JRST RDSKER
MOVEM B,1(D) ;PUT INTO TABLE TEMPORARILY.
LDB C,A ;GET MIDDLE CHAR.
JUMPE C,[MOVEM B,2(D) ;SINGLE SOCKET. USE IT AS FINAL ALSO.
JRST RDSKT1
]
CAIE C,"+"
CAIN C,"-" ;MUST BE + OR -.
CAIA
JRST RDSKER
MOVEM C,2(D) ;SAVE MIDDLE CHAR.
RDSKT2: MOVE B,A
ILDB B,B ;GET FIRST CHAR OF SECOND NUM.
CAIL B,"0"
CAILE B,"7" ;MUST BE OCTAL DIGIT.
JRST RDSKER
MOVEI C,10
NIN ;GET SECOND NUM.
JRST RDSKER
MOVE C,2(D) ;GET MIDDLE CHAR BACK.
CAIN C,"+" ;IS THIS THE RANGE?
ADD B,1(D) ;YES. GET IT AS LAST SOCKET.
TLZE B,740000 ;32 BIT MAX.
JRST RDSKER
CAIN C,"<" ;CHECK FOR LESS-THAN RANGE.
JRST [ MOVEM B,2(D) ;YES. USE NUMBER AS TOP
SETZM 1(D) ;AND ZERO AS BOTTOM.
JRST RDSKT3
]
CAIN C,">" ;CHECK FOR GREATER-THAN RANGE.
JRST [ MOVEM B,1(D) ;YES. USE NUMBER AS BOTTOM AND
HRLOI B,37777 ;MAXIMUM 32-BIT NUMBER AS TOP.
MOVEM B,2(D)
JRST RDSKT3
]
MOVEM B,2(D) ;NEITHER. SAVE IT IN TABLE AS TOP.
RDSKT3: LDB B,A ;CHECK CHAR WHICH TERMINATED THE NIN.
JUMPN B,RDSKER ;SHOULD HAVE BEEN FINAL CHAR (THUS ZERO)
RDSKT1: ADDI D,2 ;MAKE THEM SEMI-OFFICIAL.
CAIE AC6,.CHLFD ;WAS TERM A <EOL>?
JRST RDSKT0 ;NO. BACK FOR MORE.
RDSKT4: SUB D,AC5 ;YES. GET OFFSET.
MOVEM D,0(AC5) ;ALL IS FULLY OFFICIAL NOW.
AOS (P)
RDSKRB: AOS (P)
RDSKER: POPJ P,
RDHOST: CAIN C,.CHLFD
JRST SPHOER
MOVE D,HOSTS
RDHST0: HRROI B,HELPHO
MOVE A,B
PUSHJ P,CHQUES
PSOUT
MOVEI A,HSTVER
TLO A,RAZ ;RAISE LC TO UC.
PUSHJ P,INEDIT ;READ HOST NAME WITH RECOGNITION.
JRST RDHOCH
JRST SPHORB
JUMPE A,RDHST2 ;NOTHING GIVEN
HLRZ A,(10) ;GET ANSWER. 10 POINTS INTO TABLE
SKIPE HVMTCH
JRST SETGRP ;A HOST GROUP
MOVEI A,0(10) ;POINTER INTO HOSTNT
SUBI A,HOSTNT ;BUT WE NEED HOSTN TABLE
MOVE A,HOSTN(A) ;GET HOST NUMBER
RDHST1: AOJ D,
MOVEM A,HOSTS(D) ;SAVE IT.
PUSHJ P,ALTSPC ;TYPE SPACE IF TERM WAS ALTMODE.
RDHST2: CAIE C,.CHLFD
JRST RDHST0 ;BACK FOR MORE.
CAMG D,HOSTS ;ANY GIVEN?
JRST SPHOER ;NO, ERROR.
MOVEM D,HOSTS ;YES, SAVE POINTER.
JRST SPHORT
SETGRP: ANDI A,17000 ;GET GROUP BITS.
JRST RDHST1
RDHOCH: CAIN C,.CHLFD
JUMPE A,RDHST2+2
RDHOER: PUSHJ P,QUESMK
JRST RDHST2
;RECOGNITION ROUTINE FOR HOSTS.
; CALLED FROM INEDIT ON "$" FOR RECOGNITION.
;CHECKS FOR BOTH HOST NAME OR HOST GROUP.
;ALSO CHECKS FOR A NUMBER TO BE USED AS HOST NUM.
HSTVER: PUSH P,AC5
PUSH P,A ;SAVE ARGS.
HRRZS B ;GET CHAR COUNT ONLY.
PUSH P,B
;CHECK FOR HOST NUM.
MOVE AC5,A
ILDB AC5,AC5
CAIL AC5,"0"
CAILE AC5,"7"
SKIPA
JRST HSTVNM
SETZM HVMTCH
MOVEI AC5,HGRPF
MOVEM AC5,PRSTAB
MOVEI AC5,HGRPN
MOVEM AC5,PRSTRN
PUSHJ P,PRSFND ;CHECK FOR HOST GROUP
JRST HSTVR1 ;NOT A GROUP.
JRST HSVAMB ;HOST GROUP IS AMBIGUOUS.
SETOM HVMTCH ;A HOST GROUP.
HSTVR1: EXCH A,-1(P) ;SAVE POINTERS AND GET ARGUMENTS BACK.
EXCH B,0(P)
MOVEI AC5,HOSTNT ;TABLE OF OFFSETS INTO STRINGS
MOVEM AC5,PRSTAB
MOVEI AC5,HOSTAB ;TABLE OF NAMESTRINGS
MOVEM AC5,PRSTRN
PUSHJ P,PRSFND ;LOOK FOR HOST NAME.
JRST NTHST ;NOT A HOST.
JRST HSVAMB ;HOST NAME AMBIGUOUS.
SKIPE HVMTCH
JRST HSVAMB ;BOTH ARE AMBIGUOUS.
HSVRTN: SUB P,[2,,2]
HSVRT3: AOS -1(P)
HSVRT2: AOS -1(P)
HSVRT1: POP P,AC5
POPJ P,
HSVAMB: SUB P,[2,,2]
JRST HSVRT2
NTHST: POP P,B
POP P,A
SKIPE HVMTCH
JRST HSVRT3
JRST HSVRT1
HSTVNM: PUSH P,C
MOVEI C,10 ;HOST NUMBERS READ IN OCTAL
NIN
JRST HVNMER
HRLZM B,HVNUM ;PUT INTO LEFT HALF (AS IN HOSTAB)
MOVEI B,HVNUM ;AND POINT TO IT.
POP P,C
JRST HSVRTN
HVNMER: POP P,C
SUB P,[2,,2]
JRST HSVRT1
HVNUM: 0
HVMTCH: 0
RDSTAT: CAIN C,.CHLFD
JRST SPSTER
SETZ D,
RDST1: HRROI A,HELPST
PUSHJ P,CHQUES
PSOUT
MOVEI A,STVER ;SET UP TO VERIFY STATES
TLO A,RAZ ;RAISE LC TO UC.
HRROI B,HELPST ;HELP STRING.
PUSHJ P,INEDIT ;GET VERIFIED STATE STRING
JRST RDSTCH ;NOT A VALID STATE
JRST SPSTRB ;RUBOUT.
JUMPE A,RDST2
SUBI 10,STTB-1
MOVNS 10
HRLZI AC5,400000
ROT AC5,(10)
IOR D,AC5
PUSHJ P,ALTSPC ;TYPE SPACE IF TERM WAS ALTMODE.
RDST2: CAIE C,.CHLFD ;CHECK FOR EOL
JRST RDST1 ;NO. GET NEXT STATE.
JUMPE D,SPSTER
IORM D,STATES
JRST SPSTRT ;YES. BACK FOR NEXT SPEC.
RDSTCH: CAIN C,.CHLFD
JUMPE A,RDST2+2
STBAD: PUSHJ P,QUESMK
JRST RDST2
;VERIFY STATE STRING
STVER: PUSH P,11
PUSH P,10
PUSH P,C ;SAVE C
PUSH P,D ;SAVE D
HRRZS B
MOVNS B ;NEGATE COUNT
MOVE C,[POINT 7,STTB]
HRROI D,-20
PUSHJ P,CSVER
JRST STVN
JRST STVA
MOVE B,10
MOVE A,11
AOS -4(P) ;UNIQUE
STVA: AOS -4(P) ;AMBIGUOUS
STVN: POP P,D ;NO MATCH. RESTORE D
POP P,C ;RESTORE C
POP P,10
POP P,11
POPJ P, ;RETURN
; READ IN USER NAMES.
RDUSER: CAIN C,.CHLFD
JRST SPUSER
MOVE D,USERS
RDUSE0: HRROI A,HELPUS
PUSHJ P,CHQUES
PSOUT
MOVEI A,VRDIR ;SET UP TO RECOGNIZE NAMES.
TLO A,RAZ ;RAISE LC TO UC.
HRROI B,HELPUS ;HELP STRING.
PUSHJ P,INEDIT ;GO GET NAME.
JRST RDUSCH ;NOT KNOWN.
JRST SPUSRB ;RUBOUT.
JUMPE A,RDUSE3
AOJ D, ;FOUND ONE. DIR # IS AN AC10.
MOVEM 10,USERS(D) ;SAVE IT.
PUSHJ P,ALTSPC ;TYPE SPACE IF TERM WAS ALTMODE.
RDUSE3: CAIE C,.CHLFD
JRST RDUSE0
CAMG D,USERS
JRST SPUSER
MOVEM D,USERS
JRST SPUSRT ;RETURN
RDUSCH: CAIN C,.CHLFD
JUMPE A,RDUSE3+2
RDUSE5: PUSHJ P,QUESMK
JRST RDUSE3
;RECOGNIZE DIR NAMES.
VRDIR: PUSH P,D
PUSH P,C
HRRZS B
PUSH P,B
PUSH P,A
MOVE B,A
SETZ C,
SOUT ;FIRST FIND END OF STRING FOR LATER USE.
MOVE D,A ;SAVE IN D.
POP P,A
POP P,B
POP P,C ;GET ARGS BACK.
JUMPE B,VRDRT3 ;NULL STRING.
MOVE B,A ;SET UP FOR RCUSR CALL.
SETZ A, ;USE RECOGNITION
RCUSR ;VERIFY DIR STRING
ERJMP VRDRT3 ;NOT KNOWN.
TXNE A,RC%NOM ;WAS THERE A MATCH
JRST VRDRT3 ;NO, GIVE ERROR
TXNE A,RC%AMB ;AMBIGIOUS?
JRST VRDRT2 ;YES.
MOVE A,D ;GET REST OF NAME.
MOVE B,C ;AND USER NUMBER
AOS -1(P)
VRDRT2: AOS -1(P)
VRDRT3: POP P,D
POPJ P,
SKHOST: MOVE B,FHST(AC5) ;SKIP IF HOST NAME IS IN LIST.
HLLZ C,NHOSTS ;CHECK FOR HOST TYPE.
SKHOS0: MOVE D,HOSTN(C)
CAME D,B ;THIS HOST NUMBER SELECTED?
AOBJN C,SKHOS0
MOVE D,NAMSTS(C) ;IF SO, GET HOST TYPE
ANDI D,17000
MOVE C,HOSTS
SKHOS1: SKIPG A,HOSTS(C)
JRST SKHOGR
CAMN B,A
JRST SKHORT
SKHOS2: SOJG C,SKHOS1
TRNE FS,FNHO ;CHECK "NOT" FLAG AND ADJUST RETURN.
AOS 0(P)
POPJ P,
SKHORT: TRNN FS,FNHO
AOS 0(P)
POPJ P,
SKHOGR: CAMN D,A
JRST SKHORT
JRST SKHOS2
SKBYTE: LDB B,PBPBYT ;SKIP IF BYTE SIZE IS IN LIST.
MOVE C,BYTES
SKBYTL: CAMN B,BYTES(C)
JRST SKBYT1
SOJG C,SKBYTL
TRNE FS,FNSI ;CHECK "NOT" FLAG AND ADJUST RETURN.
AOS 0(P)
POPJ P,
SKBYT1: TRNN FS,FNSI
AOS 0(P)
POPJ P,
;SKIP IF TTY NUMBER IS IN LIST.
SKTTY: HLRE B,NVT(AC5) ;GET TTY #
JUMPL B,TTNSKP ;NOT A TTY
TRNE FM,TTYALL
JRST TTSKP ;ALL TTYS FLAG SET. SKIP.
MOVE C,TTYS
SKTTY1: CAMN B,TTYS(C)
JRST TTSKP
SOJG C,SKTTY1
TTNSKP: TRNE FS,FNTT
AOS 0(P)
POPJ P,
TTSKP: TRNN FS,FNTT
AOS 0(P)
POPJ P,
;SKIP IF JOB NUMBER IS IN LIST.
SKJOB: LDB B,[POINT 17,NETLSK(AC5),20] ;GET LOCAL SOCKET.
CAIGE B,^D100000 ;IS IT JOB REL?
POPJ P, ;NO.
SUBI B,^D100000
MOVE C,JOBS
SKJOB0: CAMN B,JOBS(C)
JRST SKJOB1
SOJG C,SKJOB0
TRNE FS,FNJO
AOS 0(P)
POPJ P,
SKJOB1: TRNN FS,FNJO
AOS 0(P)
POPJ P,
SKSTAT: LDB B,PFSM ;GET STATE
MOVE C,STATES
ROT C,(B)
JUMPL C,SKSTT1
TRNE FS,FNST ;CHECK "NOT" FLAG AND ADJUSS RETURN.
AOS 0(P)
POPJ P,
SKSTT1: TRNN FS,FNST
AOS 0(P)
POPJ P,
;SKIP IF USER IS IN LIST
SKUSER: LDB B,[POINT 17,NETLSK(AC5),20]
SKIPN B
POPJ P, ;0 HIGH ORDER PART.
CAIL B,^D100000
POPJ P, ;JOB REL
MOVE C,USERS
SKUSRL: CAMN B,USERS(C)
JRST SKUSR1
SOJG C,SKUSRL
TRNE FS,FNUS
AOS 0(P)
POPJ P,
SKUSR1: TRNN FS,FNUS
AOS 0(P)
POPJ P,
;SKIP IF LOCAL SOCKET IS ON LIST.
SKLSKT: MOVE B,NETLSK(AC5) ;GET LOCAL SOCKET.
MOVEI D,LCLSKT ;USE LOCAL SOCKET TABLE.
MOVEI C,FNLS ;USE CORRECT FLAG.
JRST SKSOKT ;GO TO COMMON ROUTINE FOR SOCKETS.
;SKIP IF FOREIGN SOCKET IS ON LIST.
SKFSKT: MOVE B,NETFSK(AC5) ;GET FOREIGN SOCKET.
MOVEI D,FRNSKT ;USE FOREIGN SOCKET TABLE.
MOVEI C,FNFS ;USE CORRECT FLAG.
JRST SKSOKT ;GO TO COMMON ROUTINE FOR SOCKETS.
;COMMON ROUTINE FOR SKIP IF SOCKET IS ON LIST.
SKSOKT: MOVN A,0(D) ;NEGATIVE COUNT OF ENTRIES.
HRL D,A ;SET FOR LOOP.
SKOSK1: CAML B,1(D) ;SEE IF IT IS IN THIS RANGE.
CAMLE B,2(D)
CAIA ;NO.
JRST SKSKP ;YES.
AOBJN D,.+1 ;MOVE ON
AOBJN D,SKOSK1 ;TO NEXT RANGE.
SKNSKP: TRNE FS,0(C) ;NOT FOUND.
AOS 0(P)
POPJ P,
SKSKP: TRNN FS,0(C) ;FOUND.
AOS 0(P)
POPJ P,
;CHECK FOR QUESTION MARK AND SKIP IF NONE.
CHQUES: PUSH P,A
PBIN
CAIN A,"?"
JRST CHQURT
MOVEI 1,100
BKJFN
0
AOS -1(P)
CHQURT: POP P,A
POPJ P,
;CHECK FOR SEMI-COLON AND SKIP IF NONE.
CHSEMI: PUSH P,A
PBIN
CAIE A,";"
AOS -1(P)
MOVEI A,100
BKJFN
0
POP P,A
POPJ P,
;HANDLE COMMENT
COMENT: MOVE A,[POINT 7,TEMP]
MOVEI B,TMPSIZ*5-1 ;NUM OF CHARS -1
JRST RDLINE
;ROUTINE TO READ IN A LINE OF TEXT.
;EDITTED BY ^A ^R AND RUBOUT.
;TERMINATED BY <CR>.
; ENTER WITH:
; A - POINTER TO DESTINATION
; B - MAX NUMBER OF CHARS
; RETURNS:
; +1 - IF USER TRIED TO ^A PAST START OF STRING
; +2 - ON RUBOUT (XXX ALREADY TYPED)
; +3 - <CR> TERMINATION. STRING AT DESTINATION, UPDATES POINTER IN AC1.
;
RDLINE: HRLI B,(RD%BRK+RD%BEL+RD%CRF+RD%RND)
PUSH P,C
SETZ C,
RDTTY
JSHLT
POP P,C
AOS 0(P) ;NEVER GIVE +1 RETURN
TXNE B,RD%BLR ;EDITTED BACK TO BEG OF STRING?
RET ;YES, RETURN +2
HRLI B,0 ;NO, CLEAR FLAGS
AOS 0(P) ;GIVE +3 RETURN
RET
;SETUP TABLES AND FLAGS AND ^O INTERRUPT.
SETUP: SETZ FM,
SETAGN: SETZ FS,
SETZM HOSTS
SETZM BYTES
SETZM STATES
SETZM JOBS
SETZM TTYS
SETZM USERS
SETZM HSTGRP
SETZM LCLSKT
SETZM FRNSKT
MOVEI A,400000
MOVE B,[LEVTAB,,CHNTAB]
SIR ;SET UP INT TABLES.
SETO B,
DIC ;NO INTS YET.
MOVE A,[^D15,,1] ;^O TO CHAN 1.
ATI
MOVEI A,400000
EIR ;ENABLE INTS.
POPJ P,
;STOP OUTPUT ON ^O
;CLEARS OUTPUT BUFFER AND DEBRK'S TO ADDRESS IN ABRET.
STPOUT: MOVEI A,101
CFOBF
MOVE A,PC
HRR A,ABRET ;NEW RETURN ADDRESS
TLO A,010000 ;TURN ON USER MODE BIT
MOVEM A,PC
DEBRK
;ROUTINE TO DO RECOGNITION FOR INEDIT
;ADDRESS OF POINTER TABLE IS IN PRSTAB
; TABLE IN FORM ARG,,STRING POINTER
;WILL ALLWAYS SEARCH THE WHOLE TABLE.
PRSFND: PUSH P,D
PUSH P,10
PUSH P,11
PUSH P,12
PUSH P,13
MOVE D,A
SETZM MATSW
SETZ 12,
HRRZ 10,PRSTAB
FNDLP: HRRZ 11,0(10)
ADD 11,PRSTRN
HRLI 11,440700
PUSHJ P,COMPAR
JRST PRNEXT
SKIPE MATSW
JRST FNDTWO
SETOM MATSW
MOVE 12,10
MOVE 13,11
PRNEXT: AOJ 10,
SKIPN 0(10)
JRST FNDRT
MOVE A,D
JRST FNDLP
FNDRT: SKIPN MATSW
JRST FNDRT1
FNDRT3: JUMPE 12,FNDRT2
MOVE B,12
MOVE A,13
AOS -5(P)
FNDRT2: AOS -5(P)
FNDRT1: POP P,13
POP P,12
POP P,11
POP P,10
POP P,D
POPJ P,
PRSTRN: BLOCK 1
PRSTAB: BLOCK 1
MATSW: BLOCK 1
COMPAR: PUSH P,D
ILDB D,A
JUMPE D,MAT
ILDB B,11
JUMPE B,NOMAT
CAME D,B
JRST NOMAT
JRST COMPAR+1
MAT: AOS -1(P)
NOMAT: POP P,D
POPJ P,
;FOUND TWO MATCHES.
FNDTWO: CAIN C,33 ;IS THIS AN ALTMODE SEARCH?
JRST FNDRT2 ;YES. AMBIGOUS.
JUMPE 12,FNDTW0 ;NO. SEE IF WE HAVE A COMPLETED STRING.
ILDB B,13
JUMPE B,FNDRT3
FNDTW0: ILDB B,11
JUMPE B,FNDTW1
SETZ 12,
JRST PRNEXT
FNDTW1: MOVE 12,10
MOVE 13,11
JRST FNDRT3
CHNTAB: XWD 0
XWD 1,STPOUT ;ON ^O INT.
BLOCK ^D34
LEVTAB: PC
0
0
PC: 0
ABRET: 0
;FIELDS IN NETSTS (NO LONGER SAME AS WAS IN MONITOR CORE)
PBPBYT: POINT 6,NETSTS(AC5),17
PFSM: POINT 4,NETSTS(AC5),3
PLINK: POINT 8,NETSTS(AC5),35
STTB: ASCIZ /DEAD/
ASCIZ /CLZD/
ASCIZ /PNDG/
ASCIZ /LSNG/
ASCIZ /RFCR/
ASCIZ /CLW2/
ASCIZ /RFCS/
ASCIZ /OPND/
ASCIZ /CLSW/
ASCIZ /DATW/
ASCIZ /RFN1/
ASCIZ /CLZW/
ASCIZ /RFN2/
ASCIZ /KILD/
ASCIZ /FREE/
ASCIZ /AAGH/
DEFINE A1(NAM,F)<
ASCIZ \NAM\>
DEFINE A2(NAM,F)<
Q==0
IRPC NAM,<
Q==Q+1>
XWD F,QQ
QQ==QQ+<<Q+5>/5>>
QQ==0
CMNDN: CMNDS(A1)
CMNDF: CMNDS(A2)
0
QQ==0
SPECN: SPECS(A1)
SPECF: SPECS(A2)
0
QQ==0
HGRPN: HGRPS(A1)
HGRPF: HGRPS(A2)
0
PDL: BLOCK 100
TMPSIZ==200
TEMP: BLOCK TMPSIZ
TTYMOD: BLOCK 1
NHOSTS: BLOCK 1
NSKT: BLOCK 1
STRING: BLOCK 2000
TMPSTR: BLOCK 40
HLIST: BLOCK 1000
CWIDTH: BLOCK ^D72
TWIDTH: BLOCK 1
HITE: BLOCK ^D72
HSTGRP: BLOCK 10
HOSTS: BLOCK 44
BYTES: BLOCK 44
STATES: BLOCK 1
TTYS: BLOCK 44
JOBS: BLOCK 44
USERS: BLOCK 44
LCLSKT: BLOCK 110
FRNSKT: BLOCK 110
HOSTAB: BLOCK 2*MXNHST
EHSTAB=.-1 ;END FOR CLEARING
HOSTN: BLOCK MXNHST+1 ;THE HOST NUMBER
HOSTNT: BLOCK MXNHST+1 ;INDEX INTO NAME TABLE (HOSTAB)
NAMSTS: BLOCK MXNHST+1 ;STATUS FOR NAME
;
FHST: BLOCK TBLSIZ ;FOREIGN HOST
NVT: ;SHARE TABLE. NVT IN LH
MSGALL: BLOCK TBLSIZ ;RH = MESSAGE ALLOCATION FOR THIS CONN
NETBAL: BLOCK TBLSIZ ;BIT ALLOCATION
NETFSK: BLOCK TBLSIZ ;FOREIGN SOCKET
NETLSK: BLOCK TBLSIZ ;LOCAL SOCKET NUMBER
NETSTS: BLOCK TBLSIZ ;BYTESIZE, FSM, AND LINK
DGTNCP: BLOCK NNCPGT ;GTNCP JSYS READS DATA INTO HERE
;HELP ROUTINE FOR COMMANDS.
CHELP: MOVEI A,CHELRT
MOVEM A,ABRET ;ADDRESS FOR ^O RETURN.
MOVEI A,400000
MOVE B,[1B1]
AIC ;TURN ^O ON.
TROE FM,HELPF
JRST CHELP0
HRROI A,HBRIEF ;GET BRIEF MESSAGE
JRST CHELP1
CHELP0: TRZ FM,HELPF
HRROI A,HLONG ;LONG MESSAGE.
CHELP1: PSOUT
CHELRT: MOVEI A,101
DOBE ;WAIT TILL ITS ALL OUT (OR ^O).
MOVEI A,400000
MOVE B,[1B1]
DIC ;TURN ^O OFF.
JRST NTST10
HBRIEF: ASCIZ /
(^O TO STOP OUTPUT)
AVAILABLE COMMANDS ARE:
ALL, HOSTS, SITES, CONNECTIONS, SOCKETS, SPECIFIC, BRIEF, VERBOSE,
DECIMAL.HOST.NUMBERS, OCTAL.HOST.NUMBERS, NO.HOST.NUMBERS,
REPEAT, QUIT, OR BLANK.
FOR MORE HELP TYPE ? AGAIN.
/
HLONG: ASCIZ /
POSSIBLE COMMANDS:
ALL GIVES STATUS OF BOTH SITES AND CONNECTIONS
SITES GIVES STATUS OF ALL SITES
HOSTS GIVES STATUS OF HOSTS ONLY
(BOTH THE ABOVE CAN TAKE A SITE TYPE AS ARGUMENT)
CONNECTIONS GIVES STATUS OF ALL CONNECTIONS
SOCKETS SAME AS "CONNECTIONS"
BRIEF NO HEADINGS OR MESSAGES TO BE TYPED.
VERBOSE ALL HEADINGS OR MESSAGES TO BE TYPED.
(THE DEFAULT IS TO TYPE HEADINGS THE FIRST TIME AND
NOT AGAIN.)
DECIMAL.HOST.NUMBERS
PRINT DECIMAL HOST NUMBERS WITH HOST NAMES.
OCTAL.HOST.NUMBERS
PRINT OCTAL HOST NUMBERS WITH HOST NAMES.
NO.HOST.NUMBERS
DO NOT PRINT HOST NUMBERS.
REPEAT COME BACK FOR MORE COMMANDS INSTEAD OF QUITTING.
QUIT QUIT NETSTAT.
SPECIFIC ALLOWS SELECTION OF SPECIFIC CONNECTIONS.
POSSIBLE SPECIFICATIONS ARE:
SITES CONNECTIONS WITH SPECIFIC SITES (OR SITE TYPES)
HOSTS SAME AS "SITES"
JOBS CONNECTIONS RELATIVE TO SPECIFIC JOBS
SIZES CONNECTIONS WITH SPECIFIC BYTE SIZES
STATES CONNECTIONS IN SPECIFIC STATES
TTYS CONNECTIONS WITH SPECIFIC TTYS
USERS CONNECTIONS RELATIVE TO SPECIFIC USERS
SOCKETS CONNECTIONS WITH THE SPECIFIED LOCAL SOCKETS
LOCAL.SOCKETS SAME AS "SOCKETS"
FOREIGN.SOCKETS
CONNECTIONS WITH THE SPECIFIED FOREIGN SOCKETS
NOT ALL CONNECTIONS WITHOUT THE FOLLOWING SPECIFICATION
EACH SPECIFICATION CAN HAVE MORE THAN ONE ARGUMENT,
SEPERATED BY COMMAS, SPACES, OR ALTMODE (WHEN USED FOR COMPLETION).
THE SPECIFICATIONS FOR THE "SOCKETS" COMMANDS CAN BE ANY OF THE
FOLLOWING (ALL ARE OCTAL NUMBERS):
SKT A SINGLE SPECIFIC SOCKET: S = SKT
SKT1-SKT2 ANY SOCKET IN RANGE: SKT1 <= S <= SKT2
SKT1+INCR ANY SOCKET IN RANGE: SKT1 <= S <= SKT1+INCR
<SKT ANY SOCKET IN RANGE: S <= SKT
>SKT ANY SOCKET IN RANGE: SKT <= S
ALTMODE MAY BE USED TO COMPLETE ALL COMMANDS, SPECIFICATIONS,
SITE NAMES (OR TYPES), STATES, AND USER NAMES.
A BLANK LINE WILL START THE TYPEOUT.
IF NO COMMAND IS GIVEN "ALL" IS ASSUMED, EXCEPT THAT ON REPEATING
AN INITIAL BLANK LINE MEANS "DO WHAT I SPECIFIED LAST TIME".
RUBOUT ABORTS THE GIVEN LINE.
^O (CNTL O) WILL STOP TYPE OUT.
SEMICOLON (;) AT THE START OF ANY COMMAND OR SPECIFICATION LINE MAY BE
USED TO INDICATE A LINE TO BE IGNORED.
/
;SPECIFICATION HELP (GENERAL)
SPHELP: MOVEI A,HELPSP
PSOUT
JRST SP10
HELPSP: ASCIZ /
SITES, HOSTS, JOBS, SIZES, STATES, TTYS, USERS,
SOCKETS, LOCAL.SOCKETS, FOREIGN.SOCKETS, OR NOT/
HELPHO: ASCIZ /(NAME, TYPE, OR OCT NUM) /
HELPST: ASCIZ /(NAME) /
HELPUS: ASCIZ /(NAME) /
HONUM: ASCIZ /(OCT NUM OR BLANK) /
HDNUM: ASCIZ /(DEC NUM) /
HGMESS: ASCIZ /(SITE TYPE) /
HSKTS: ASCIZ /(OCT NUM, OR RANGE) /
LN$DEL=="U"-100 ;CONTROL-U DELETES LINE
CH$DEL==.CHDEL ;RUBOUT DELETES CHAR
AC0==0
AC1==1
AC2==2
AC3==3
AC4==4
AC5==5
AC6==6
AC7==7
AC10==10
AC11==11
AC12==12
AC13==13
AC14==14
AC15==15
AC16==16
AC17==17
P==17
A==1
B==2
C==3
D==4
;PROGRAM TO ACCEPT INPUT STRINGS FROM THE TTY ALLOWING THE USER
;TO DO EDITTING WITH ^A, ^R, RUBOUT AND TO USE ALTMODE
;FOR COMPLETION.
;COMMA, SPACE AND NEWLINE TERMINATE THE STRING
;INEDIT:
;ACCEPTS IN AC1 FLAGS,,PTR
; FLAGS:
; BIT 0 - ON => DON'T ECHO / OFF => USE ECHO DEFAULT
; BIT 1 - ON => RAISE LOWER CASE / OFF DON'T
; BIT 2 - ON => DON'T RECOG ON EOL/ OFF DO
; PTR=ADDRESS OF ROUTINE USED FOR COMPLETION
; IF PTR=0 THEN ALTMODE COMPLETION IS NOT USED AND INPUT
; OF ALTMODE MERELY RINGS THE TERMINAL BELL.
; AC2 0/PTR TO "HELP" STRING FOR ALTMODE
;RETURNS +1 IF STRING IS NOT FOUND BY THE SEARCH ROUTINE.
;RETURNS +2 IF STRING INCLUDED RUBOUT
;RETURNS +3 IF STRING IS FOUND BY SEARCH ROUTINE
; OR IF NO SEARCH ROUTINE IS SPECIFIED
;INSTR:
;SAME AS INEDIT WITH ADDITIONAL PARAMETER
;ACCEPTS IN AC3 ADDITIONAL TERMINATION CHARACTER
;RETURNS WITH AC1 CONTAINING # OF CHARACTERS INPUT FROM TTY
; AC2 CONTAINING STRING POINTER TO CHARACTER STRING.
; AC3 CONTAINING TERMINATING CHARACTER
; AC10 POINTING TO ENTRY FOUND BY SEARCH ROUTINE
;THE ROUTINE PASSED TO INEDIT/INSTR IS ASSUMED TO ACT AS FOR GTSTR
;INEDIT AND INSTR NOW JUST CALL GTSTR.
INSTR: HRL AC3,AC3
CAIA
INEDIT: SETZ AC3,
HRR AC3,AC1 ;AC3_ADDR OF SEARCH ROUTINE
PUSH P,AC4
MOVE AC4,[BUFSIZ*5-1] ;GET CHAR COUNT.
MOVEM AC4,INBCNT ;PUT IN WORD 0 OF BUFFER.
HRLZI AC4,INBCNT ;SET GTSTR FLAGS IN AC4
TRO AC4,11 ;JFN PAIR
TLNN AC1,400000 ;DEFAULT ECHO
TRO AC4,2 ;YES.
TLNE AC1,200000 ;RAISE?
TRZ AC4,10 ;NO
TLNN AC1,100000
TRO AC4,4 ;RECOG ON EOL
TRO AC4,1B30 ;USE CHAR COUNT.
MOVE AC1,AC4
MOVE AC4,AC2 ;AC4_PROMPT PTR
MOVE AC2,[XWD 100,101] ;AC2_JFN PAIR
PUSHJ P,GTSTR
SOS -1(P)
SOS -1(P)
MOVE AC10,AC3 ;SET UP ACS FOR RETURN
HLRZ AC3,AC1
HRRZ AC1,AC1
MOVE AC2,[POINT 7,INBUFF]
AOS -1(P)
AOS -1(P)
POP P,AC4
POPJ P,
LIT
BUFSIZ==^D20
INBCNT: BLOCK 1
INBUFF: BLOCK BUFSIZ
;PROGRAM TO ACCEPT INPUT STRINGS AND DO RECOGNITION
;WILL DO EDITTING WITH ^A, ^R, RUBOUT AND TO USE ALTMODE
;FOR COMPLETION.
;COMMA, SPACE AND NEWLINE TERMINATE THE STRING
;ACCEPTS IN AC1 PTR,,FLAGS:
; PTR - TO BUFFER TO STORE STRING COLLELCTED
; FLAGS:
; BIT 35 ON => AC2 - JFN PAIR / OFF => AC2 - STR PTR
; BIT 34 ON => ECHO / OFF => DON'T ECHO
; BIT 33 ON => RECOG ON EOL / OFF => EXACT MATCH ON EOL
; BIT 32 ON => NO RAISE / OFF => RAISE
; BIT 31 ON => DON'T IGNORE LEADING SPACES /OFF => DO
; BIT 30 ON => USE CHAR COUNT IN WORD 0 OF BUFFER.
; START STRING IN WORD 1.
; BIT 29 ON => LONG CALL AC5 IS PTR TO PARAM BLOCK
; BIT 28 (RETURN PARAMETER IN LONG CALL ON =>
; SWITCH FROM STR PTR TO JFNS
; PARAM BLOCK:
; 0: FLAGS (1 IS OR'D INTO AND IT IS OR'D WITH 1)
; 1: IN,,OUT JFNS (377777,,377777 FOR NONE)
; 2: EXHAUSTED AC2 STR PTR RET'D HERE IF SWITCH
; 3: STRING PTR FOR ^R - STRING IS OUTPUT
; AS PREFIX
; AC2 (STRING PTR)/(INJFN,,OUTJFN) AS SPEC'D BY BIT 35 OF AC1
; AC3 SPECIAL TERM CHAR,,ADDRESS OF SEARCH ROUTINE
; AC4 PTR TO PROMPT STRING
; AC5 PTR TO PARAM BLOCK IF BIT 29 OF 1 ON
;RETURNS +1 IF STRING IS NOT FOUND BY THE SEARCH ROUTINE.
;RETURNS +2 IF STRING INCLUDED RUBOUT
;RETURNS +3 IF STRING IS FOUND BY SEARCH ROUTINE
; OR IF NO SEARCH ROUTINE IS SPECIFIED
;RETURNS WITH AC1 CONTAINING TERM CHAR,,# OF CHARACTERS IN STRING
; AC2 CONTAINING UPDATED STRING POINTER (IF APPROPRIATE)
; AC3 POINTING TO ENTRY FOUND BY SEARCH ROUTINE /
; STRING PTR TO STRING READ IF SEARCH ROUTINE UNSPEC
;THE ROUTINE PASSED TO GTSTR IS ASSUMED TO:
;ACCEPT IN AC1 PTR TO STRING TO BE VERIFIED
; AC2 (0/-1),, CHARACTER COUNT
; -1 => TRY EXACT MATCH, 0 => TRY TO RECOGNIZE
; AC3 TERMINATING CHAR TYPED
;RETURN + 1 IF COMPLETE FAILURE
; + 2 IF AMBIGUOUS
; + 3 IF UNIQUE WITH AC1 POINTING TO "REST" OF STRING
; AC2 POINTING TO ENTRY FOUND
ECH==2 ;ECHO FLAG
REC==4 ;EOL RECOG FFLAG
RAZ==10 ;RAISE FLAG
IGSP==20 ;IGNORE SPACES FLAG
LONG==100 ;LONG CALL
STJF==200 ;SWITCH FROM STR PTR TO JFNS OCCURRED
SVAC5==-11
DEFINE READCH
< MOVE AC1,AC10
BIN
JUMPGE AC6,.+5 ;STRING IO?
JUMPN AC2,.+3 ;YES, NULL CH?
PUSHJ P,IOSWCH ;YES, TRY TO SWITCH TO JFNS
CAIA
MOVE AC10,AC1 ;SAVE STR PTR
>
;ROUTINE TO ACCOMPLISH IO SWITCH
IOSWCH: TRNN AC14,LONG ;LONG CALL?
POPJ P, ;NO, DO NOTHING.
MOVE AC2,SVAC5-1(P) ;2=PTR TO PARAM BLOCK
MOVEM AC10,2(AC2) ;SAVE EXHAUSTED PTR
MOVE AC2,1(AC2) ;2=IN,,OUT JFNS
CAMN AC2,[XWD 377777,377777] ;NULL?
JRST [ SETZ AC2, ;YES, RETURN NULL CH
POPJ P, ]
HLRZ AC1,AC2 ;1=IN JFN
MOVEI AC10,(AC1) ;AND 10
MOVEI AC11,(AC2) ;11=OUTJFN
SETZ AC6, ;INDICATE JFNS
TRO AC14,ECH+STJF ;INDICATE IO SWITCH AND ECHOS ON
MOVE AC2,SVAC5-1(P)
MOVEM AC14,0(2) ;SAVE FLAGS
PUSH P,AC3
HRRZ AC1,AC11 ;NOW SET MODES FOR JFNS
RFCOC
MOVEM AC2,TTYCOC
MOVEM AC3,TTYCOC+1
TLZ AC2,(3B3+3B13+3B15) ;IGNORE ^A,^F
TLO AC2,(2B15) ;SEND CODE FOR BELL
TLZ AC3,(3B1+3B9) ;IGNORE ^R, ^V
TRZ AC3,3B19 ;IGNORE ALTNODE
SFCOC ;ON OUTPUT TO JFN
HRRZ AC1,AC10
RFMOD
MOVEM AC2,TTYMDS
TRO AC2,770000 ;WAKEUP ON EVERYTHING
PUSHJ P,ISALNM ;UNLESS TERM CHAR NOT ALPAHNUM.
TRZ AC2,10000
SFMOD
POP P,AC3
MOVEI AC1,(AC10)
BIN ;READ THE CH
POPJ P, ;AND RETURN
GTSTR: PUSH P,AC0 ;SAVE USER'S ACS
HRLI AC0,AC1
HRRI AC0,1(P)
ADDI P,16
BLT AC0,0(P)
SETZ AC11,
HRRZ AC14,AC1 ;AC14_FLAGS
TRNN AC14,LONG ;LONG CALL?
JRST .+4
IOR AC14,(AC5) ;OR IN FLAGS IN PARM BLOCK
MOVEM AC14,(AC5) ;AND VICE VERSA.
HRRZ AC11,1(AC5) ;AC11=OUT JFN
HRRZ AC5,AC3 ;AC5=PTR TO SEARCH ROUTINE/0
HLRZ AC7,AC3 ;AC7=SPECIAL TERM CH
MOVS AC13,AC1 ;SET UP PTR TO BUFFER
HRLI AC13,440700
HRLOI AC15,377777 ;USE MAX CHAR COUNT,
TRNN AC1,1B30 ;UNLESS ONE IS GIVEN?
JRST .+3 ;NO.
MOVE AC15,0(AC13) ;YES. USE IT.
AOJ AC13, ;START STRING IN WORD 1.
MOVEM AC13,STRBPT ;SAVE PTR TO USER'S BUFFER
TRNE AC1,1 ;BIT 35 ON?
JRST GTSTR1 ;YES
MOVE AC10,AC2 ;NO
HLRZ AC2,AC2
CAIN AC2,-1
HRLI AC10,440700
SETO AC6, ;AC6 < 0 => STRING PTR IN AC2
JRST GTSTR2
GTSTR1: HLRZ AC10,AC2 ;AC10=INJFN
HRRZ AC11,AC2 ;AC11=OUTJFN
SETZ AC6, ;AC6 = 0 => ECHO AND JFNS IN AC2
TRNE AC1,2 ;BIT 34 ON?
JUMPN AC11,.+3 ;YES. DON'T JUMP IF NO OUT JFN
AOJ AC6, ;AC6 > 0 => DON'T ECHO AND JFNS
JUMPE AC11,GTST1A ;JUMP IF NO OUT JFN.
HRRZ AC1,AC11
RFCOC
MOVEM AC2,TTYCOC
MOVEM AC3,TTYCOC+1
TLZ AC2,(3B3+3B13+3B15) ;IGNORE ^A,^F
TLO AC2,(2B15) ;SEND CODE FOR BELL
TLZ AC3,(3B1+3B9) ;IGNORE ^R, ^V
TRZ AC3,3B19 ;IGNORE ALTNODE
SFCOC ;ON OUTPUT TO JFN
GTST1A: HRRZ AC1,AC10
RFMOD
MOVEM AC2,TTYMDS
TRNN AC14,ECH
TRZ AC2,6000 ;FORCE ECHO IF REQUESTED
TRO AC2,170000 ;WAKEUP ON EVERYTHING
PUSHJ P,ISALNM ;UNLESS TERM CHAR NOT ALPAHNUM.
TRZ AC2,10000
SFMOD
GTSTR2: MOVE AC12,AC4
GTSTST: SETZ AC3, ;AC3 HOLDS CHAR COUNT
TRNE AC14,IGSP ;IGNORE SPACES
JRST GTSTS4 ;NO
GTSTS1: READCH ;IGNORE LEADING SPACES IN INPUT
CAIN AC2," "
JRST GTSTS1
CAIE AC2,33
JRST GTSTS5
JUMPE AC12,GTSTS2 ;ALT MODE BUT NO PROMPT
TRNN AC14,LONG
JUMPN AC6,.+4
MOVE AC1,AC11
MOVE AC2,AC12
SOUT
SETZ AC12,
JRST GTSTS1
GTSTS2: HRRZI AC2,7
TRNN AC14,LONG
JUMPN AC6,GTSTS1
HRRZ AC1,AC11
BOUT
JRST GTSTS1
GTSTS5: MOVE AC4,STRBPT ;AC4=PTR TO CHAR BUFF
JRST GTSTLP+2
GTSTS4: MOVE AC4,STRBPT
GTSTLP: READCH
JUMPE AC2,DONL ;END OF ASCIZ STRING
CAIN AC2,LN$DEL ;RUBOUT
JRST DORUB
CAIN AC2,22 ;CONTROL R - RETYPE
JRST DOCNTR
CAIN AC2,CH$DEL ;CONTROL A - DELETE CHAR
JRST DOCNTA
CAIN AC2,.CHLFD ;NEWLINE - ENDS STRIN
JRST DONL
CAIN AC2,15 ;CARRIARE RETURN -MUST BE
JRST DOCR ;FOLLOWED BY LINE FEED = NEWLINE
CAIN AC2," " ;SPACE - TERMINATES STRING
JRST DOSP
CAIN AC2,33 ;ALTMODE - USED WITH SEARCH
JRST DOALT ;ROUTINE FOR STRING COMPLETION
CAIN AC2,6 ;CONTROL F - USED AS ALTMODE
JRST DOCNTF
CAIN AC2,"," ;COMMA - ENDS STRING
JRST DOCOMA
CAIN AC2,26 ;CONTROL V - ESCAPE IN NEXT CHAR
JRST DOCNTV
CAMN AC2,AC7 ;USER SPECIFIED TERMINATOR
JRST DOUTRM
DOCH: MOVE AC10,AC1
TRNN AC14,RAZ
PUSHJ P,RAISE
DOCH1: IDPB AC2,AC4
AOJ AC3,
CAMLE AC3,AC15 ;IS BUFFER FULL?
JRST RET1 ;YES.
JRST GTSTLP
DORUB: MOVE AC7,AC2
TRNN AC14,LONG
JUMPN AC6,RET2
HRRZ AC1,AC11
HRROI AC2,[ASCIZ /XXX/]
SETZ AC3,
SOUT
JRST RET2
DOCNTR: TRNN AC14,LONG
JUMPN AC6,GTSTLP
MOVE AC13,AC4
SETZ AC2,
IDPB AC2,AC13 ;MAKE STRING ASCIZ FOR ECHO
HRRZ AC1,AC11
HRRZI AC2,.CHLFD
BOUT
TRNN AC14,LONG ;LONG CALL
JRST .+8 ;NO
MOVE AC2,SVAC5(P)
SKIPN AC2,3(AC2) ;^R PREFIX SPEC'D
JRST .+5 ;NO
PUSH P,AC3 ;YES, OUTPUT IT
SETZ AC3,
SOUT
POP P,AC3
JUMPE AC3,RNGBEL
MOVE AC2,STRBPT
MOVE AC12,AC3
SETZ AC3,
SOUT
MOVE AC3,AC12
JRST GTSTLP
DOCNTA: JUMPL AC6,DOCH
HRRZ AC1,AC11
JUMPE AC3,RNGBEL
HRRZI AC2,"\"
SKIPE AC11 ;SKIP IF NO OUT JFN.
BOUT
LDB AC2,AC4
TRNN AC14,LONG
SKIPN AC6
BOUT
SETZ AC1,
DPB AC1,AC4
MOVE AC4,STRBPT
SOJE AC3,GTSTLP
MOVE AC1,AC3
IBP AC4
SOJG AC1,.-1
JRST GTSTLP
DOCNTV: IDPB AC2,AC4
AOJ AC3,
CAMLE AC3,AC15
JRST RET1
READCH
JRST DOCH1
DOALT: PUSH P,AC2 ;REMEMBER ALT
DOALT2: JUMPE AC5,[ POP P,
JRST RNGBEL ]
MOVE AC13,AC4
SETZ AC2,
IDPB AC2,AC13 ;MAKE ASCIZ STRING FOR SEARCH
MOVE AC1,STRBPT
MOVE AC2,AC3
PUSH P,AC3
MOVE AC3,-1(P) ;GET THE ALT.
PUSHJ P,@AC5
JRST [ POP P,AC3
POP P,AC7
JRST RET1 ]
JRST [ POP P,AC3
POP P,
JRST RNGBEL ]
POP P,AC3
MOVE AC12,AC1
MOVEM AC2,ENTPTR
JUMPE AC3,.+5
LDB AC2,AC1
JUMPE AC2,DOALT1
ILDB AC2,AC1
JUMPE AC2,DOALT1
JUMPG AC6,DOALT0
TRNN AC14,LONG
JUMPN AC6,.+3
HRRZ AC1,AC11
CAIA
MOVE AC1,AC10
MOVE AC2,AC12
PUSH P,AC3
SETZ AC3,
SOUT
POP P,AC3
JUMPE AC6,DOALT0
MOVE AC10,AC1
DOALT0: ILDB AC2,AC12
JUMPE AC2,DOALT1
IDPB AC2,AC4
AOJ AC3,
JRST .-4
DOALT1: JUMPE AC7,DOALT4 ;IF SPECIAL TERM CH ECHO IT
TRNE AC14,LONG
JRST .+3
JUMPG AC6,DOALT4
JUMPN AC6,.+3
HRRZ AC1,AC11
CAIA
MOVE AC1,AC10
MOVE AC2,AC7 ;ECHO SPECIAL TERM CHAR.
BOUT
JUMPE AC6,DOALT4
MOVE AC10,AC1
DOALT4: POP P,AC7 ;AC7 = ALT OR ^F
MOVE AC2,ENTPTR
JRST RET3
DONL: MOVE AC7,AC2
JUMPE AC5,RET3
MOVE AC13,AC4
SETZ AC2,
IDPB AC2,AC13 ;MAKE STRING ASCIZ
MOVE AC1,STRBPT
SETZ AC2,
TRNN AC14,REC
SETO AC2, ;TRY FOR EXACT MATCH
HRR AC2,AC3
PUSH P,AC3
MOVE AC3,AC7 ;GET TERM CHAR.
PUSHJ P,@AC5
JFCL
JRST [ POP P,AC3
JRST RET1 ]
POP P,AC3
MOVEM AC2,ENTPTR
JRST RET3
DOSP=DONL
DOCR: READCH
CAIE AC2,12 ;LINE FEED
JRST .+4
HRRZI AC7,.CHLFD
JUMPE AC5,DOCR1
JRST DONL
JUMPL AC6,RET1
JUMPE AC11,RET1
HRRZ AC1,AC11
BOUT
JRST RET1
DOCR1: JUMPL AC6,.+4
JUMPE AC11,.+3
HRRZ AC1,AC11
BOUT
HRRZI AC2,.CHLFD
JRST RET3
DOCNTF: PUSH P,AC2 ;REMEMBER ^F
JRST DOALT2 ;AND HANDLE LIKE ALT
DOCOMA=DONL
DOUTRM=DONL
RNGBEL: TRNN AC14,LONG
JUMPN AC6,GTSTLP
MOVE AC1,AC11
HRRZI AC2,7
BOUT
JRST GTSTLP
RET3: SETZ AC2,
IDPB AC2,AC4 ;MAKE COLLECTED STRING ASCIZ
AOS -17(P)
RET2: AOS -17(P)
RET1: JUMPGE AC6,.+3
MOVE AC2,AC10
JRST RET11
MOVE AC1,AC10
MOVE AC2,TTYMDS
SFMOD
JUMPE AC11,.+7
PUSH P,AC3
MOVE AC1,AC11 ;RESTORE COC
MOVE AC2,TTYCOC
MOVE AC3,TTYCOC+1
SFCOC
POP P,AC3
TRNE AC14,STJF ;CHANGED IO?
JRST [ MOVE AC5,SVAC5(P) ;YES, MUST RESTORE STR PTR
MOVE AC2,2(AC5)
JRST RET11 ]
HRL AC2,AC10
HRR AC2,AC11
RET11: HRR AC1,AC3
HRL AC1,AC7
JUMPN AC5,.+3
MOVE AC3,STRBPT
CAIA
MOVE AC3,ENTPTR
HRLI AC0,-12(P) ;RESTORE STACK
HRRI AC0,4
BLT AC0,AC16
SUBI P,16
POP P,AC0
POPJ P,
STRBPT: BLOCK 1
TTYMDS: BLOCK 1
TTYCOC: BLOCK 2
ENTPTR: BLOCK 1
ISALNM: CAIGE AC7,"0" ;ROUTINE TO SKIP IF CAHR IN AC7
POPJ P, ;IS ALPHANUMERIC
CAIG AC7,"9"
JRST ISANSK
CAIGE AC7,"A"
POPJ P,
CAIG AC7,"Z"
JRST ISANSK
CAIGE AC7,"a"
POPJ P,
CAIG AC7,"z"
ISANSK: AOS 0(P)
POPJ P,
RAISE: CAIL AC2,"a" ;RAISE LOWER TO UPPER
CAILE AC2,"z"
POPJ P,
SUBI AC2,40
POPJ P,
;PROGRAM TO BE USED AS VERIFICATION ROUTINE WITH INEDIT.
;ACCEPTS IN: AC1 POINTER TO INPUT STRING
; AC2 NEGATIVE CHAR COUNT FOR INPUT STRING
; AC3 POINTER TO COMPARISON LIST
; AC4 NEGATIVE COUNT OF STRINGS IN COMP LIST
;
;RETURNS: +1 NO MATCH
; +2 AMBIGUOUS
; +3 UNIQUE WITH: AC10 POINTER TO MATCH
; AC11 POINTER TO "REST" OF MATCH
;
; NOTE: IT IS AMBIGUOUS TO HAVE A STRING IN THE COMPARISON LIST
; WHICH IS THE SAME AS THE START OF SOME OTHER STRING
; IN THE LIST.
; E.G. HAVING BOTH "GOOD" AND "GOODY" IS AMBIGUOUS.
;
CSVER: MOVEM AC1,INPNT# ;SAVE INPUT POINTER
MOVEM AC2,INCNTS# ;SAVE INPUT COUNT
MOVEM AC2,INCNT# ;SET WORKING INPUT COUNT
SETZ AC10, ;ZERO MATCH POINTER
MOVEM AC3,CMPPNT# ;SAVE COMP POINTER
MOVEM AC4,CMPCNT# ;SET UP COMP COUNTER
;INITIALIZATION DONE
;START COMPARISON
CSV1: ILDB AC4,AC3 ;GET COMP CHAR
JUMPE AC4,CSV2 ;IF NULL, GO ON TO NEXT STRING.
ILDB AC2,AC1 ;NO. GET INPUT CHAR
CAME AC2,AC4 ;ARE THEY THE SAME?
JRST CSV3 ;NO. ON TO THE NEXT.
AOSGE INCNT ;INCREMENTINPUT COUNT.
JRST CSV1 ;MORE TO WORD. CONTINUE COMP
JUMPN AC10,CSVAMB ;A MATCH. CHECK IF WE HAVE ANOTHER.
MOVE AC10,CMPPNT ;NO. SAVE POINTER TO MATCH.
MOVE AC11,AC3 ;SAVE POINTER TO REST.
CSV3: ILDB AC4,AC3 ;LOOP UNTIL WE HIT A NULL
JUMPN AC4,.-1 ;BEFORE GOING ON.
JRST CSV2 ;ON WE GO.
;GET NEXT COMP WORD AND RESTART
;IF COMPARISON LIST IS FINISHED THEN EXIT.
CSV2: AOSL CMPCNT ;INCR COMP COUNT
JRST CSV4 ;DONE. GO EXIT.
ANDCM AC3,[77B5] ;CLEAR P TO MAKE POINTER POINT
;TO FIRST CHAR OF NEXT WORD
MOVEM AC3,CMPPNT ;SAVE IT.
MOVE AC1,INPNT ;RESET INPUT POINTER BACK
MOVE AC2,INCNTS ;AND
MOVEM AC2,INCNT ;RESET INPUT COUNTER.
JRST CSV1 ;GO LOOK AT NEXT COMP STRING.
;
;CHECK FOR UNIQUE OR NO MATCH AND RETURN
CSV4: JUMPE AC10,CSVNOM ;CHECK FOR A MATCH POINTER.
;
CSVUNQ: AOS (P) ;UNIQUE MATCH
CSVAMB: AOS (P) ;AMBIGUOUS
CSVNOM: POPJ P, ;NO MATCH. RETURN.
;
END <3,,ENTVEC>