Trailing-Edge
-
PDP-10 Archives
-
BB-FP64A-SB_1986
-
10,7/who/wholin.mac
There are 4 other files named wholin.mac in the archive. Click here to see a list.
TITLE LINSCN - LINE mode scan defaulting for WHO
SEARCH WHOMAC
$SETUP (LINSCN)
Comment |
This module provides the LINE mode specific scan defaulting code. Its
only entry point is LINSCN.
|
; TABLE OF CONTENTS FOR LINSCN
;
;
; SECTION PAGE
; 1. LINSCN - Apply job line mode specific scan input defaults. 3
; 2. STORAGE................................................... 4
SUBTTL LINSCN - Apply job line mode specific scan input defaults
LINSCN::MOVE T1,.FXDEV(I) ;GET DEVICE
MOVX T2,FX.NDV ;GET NULL DEVICE BIT
TDNN T2,.FXMOD(I) ;SEE IF DEVICE GIVEN
JRST [CHKSWT (TTY)
JRST .+1]
SKIPE T1,.FXEXT(I) ;SEE IF EXTENSION GIVEN
JRST [CAIN T1,-1 ;YES--INSURE JUST EXTENSION
SKIPE .FXNAM(I) ;AND NO NAME
JRST E$$EIC ;BECAUSE THATS BAD
PUSHJ P,CHKDOT## ;SEE IF DOT OK (NOT CRASH FILE)
MOVE T1,MYTTY## ;GET USERS TTY
CHKSWT (TTY)
JRST .+1] ;AND CONTINUE
SKIPN T1,.FXNAM(I) ;SEE IF NAME
JRST LINS.2 ;NO
SKIPE .FXEXT(I) ;YES--INSURE NO EXTENSION
$FATAL (EIC,<Extension illegal in this context>) ;NO--DIE
CAMN T1,[SIXBIT/*/] ;ALL WILD?
JRST LINS.2 ;YES--TREAT AS NO NAME
CAMN T1,[SIXBIT/SYSTEM/] ;SYSTEM LINE?
HRLZ T1,SYSLIN## ;YES--SETUP
TXNE T1,77B5 ;FIRST CHAR BLANK?
JRST LINS.3 ;NO
MOVSS T1 ;YES--GET OCTAL NUMBER
PUSHJ P,TTYNNN## ;MAKE NNN
LINS.4: HRLI T1,'TTY' ;INCLUDE TTY
CHKSWT (TTY)
JRST LINS.2 ;AND PROCEED
LINS.3: DVNAM. T1, ;GET LOGICAL NAME
MOVE T1,.FXNAM(I) ;NONE
CHKSWT (TTY)
CAME T1,[SIXBIT/CTY/] ;SEE IF CTY
TRNE T1,-1 ;OR RH BLANK
JRST LINS.2 ;NO
HLRZS T1 ;YES--GET LEADING SIXBIT
HRLI T1,'TTY' ;INCLUDE TTY
MOVEM T1,.FZTTY(I) ;STORE
;
;Fix up /TTY spec, and make mask
;
LINS.2: PUSHJ P,FIXTTY## ;FIX UP TTY SPEC
PUSHJ P,FIXNOD## ;FIX UP NODE SPEC
;
;Range check job number
;
SKIPL T1,.FZJOB##(I) ;GET JOB NUMBER
PUSHJ P,CHKJOB## ;YES--RANGE CHECK
;
;Default /DIALUP if /CARRIER
;
MOVEI T1,.TODSD ;GET /DIALUP
SKIPL .FZDSC##(I) ;/[NO]CARRIER GIVEN?
MOVEM T1,.FZAPC##(I) ;YES--FORCE /DIALUP
IFN FTPOWER,<
;
;Default /NODIALUP if /POWER
;
MOVEI T1,.TOHWD ;GET /HARDWIRED
SKIPL T2,.FZPOW##(I) ;/[NO]POWER GIVEN?
JRST [MOVEM T1,.FZAPC##(I) ;YES--FORCE /NODIALUP
MOVEM T2,.FZDSC##(I) ;AND STORE /POWER AS /CARRIER
JRST .+1] ;CONTINUE
>
;
;Convert /LOCAL to /NOREMOTE and visa versa
;
SKIPL T1,.FZLCL##(I) ;SEE IF /LOCAL
JRST [TRC T1,1 ;FLIP THE BIT
CHKSWT (RMT,LOCAL) ;AND STORE /REMOTE
JRST .+1] ;CONTINUE
;
;Convert /SPEED:N to /XMTSPEED:N and /RCVSPEED:N
;
SKIPLE T1,.FZSPD##(I) ;GET SPEED
JRST [CHKSWT (TSP,XMTSPEED) ;CHECK AND STORE
CHKSWT (RSP,RCVSPEED) ;..
JRST .+1]
;
;Default /INCLUDE:PTY if /LOGINQ
;
IFN FTLGNQ,<
MOVX T1,INCPTY## ;GET INCLUDE BITS
TLNE F,(FL.LGNQ) ;HAVE LOGIN QUEUE SUPPORT?
SKIPLE .FZLQP##(I) ;SEE IF /LOGINQ
IORM T1,S.INCLUDE## ;YES--DEFAULT /INCLUDE:PTY
> ;END IFN FTLGNQ
;
;Here to change /TYPE:NONE into BLANKS
;
MOVE T1,.FZTYP##(I) ;GET TYPE
CAMN T1,[SIXBIT/NONE/] ;NONE?
SETZM .FZTYP##(I) ;YES--CHANGE TO BLANKS
;HERE TO TURN LOCATE STRING (ASCII INTO WILDCARDED ASCIZ)
SETCM T1,.FZLOC##(I) ;SEE IF STRING SPECIFIED
JUMPE T1,LINS.8 ;NO
MOVEI T1,.FZLOC##(I) ;POINT TO STRING
MOVEI T2,.FZLMC##(I) ;AND MASK STORAGE
MOVEI T3,^D19 ;CHARACTER COUNT
PUSHJ P,MSKUC## ;AND MAKE A MASK
;
;All done with this spec
;
LINS.8: POPJ P, ;AND RETURN
SUBTTL STORAGE
$LOW
PRGEND
TITLE LINGET - Get line information
SEARCH WHOMAC
$SETUP (LINGET)
; TABLE OF CONTENTS FOR LINGET
;
;
; SECTION PAGE
; 1. Main line routines
; 1.1 LINNXT - Get the next line........................ 3
; 1.2 LINSET - Setup for a new line..................... 4
; 1.3 LININC - Handle incremental statistics............ 5
; 1.4 LINSRT - Handle line sorting...................... 6
; 2. LINE tables
; 2.1 Define simple TRMOP's required.................... 7
; 2.2 Define all line subfields......................... 8
; 2.3 Routines to fetch all subfields................... 9
; 3. Storage................................................... 12
SUBTTL Main line routines -- LINNXT - Get the next line
LINNXT::JUMPL O,LINN.1 ;JUMP IF THE FIRST TIME
SKIPL S.SORT## ;SEE IF /SORT
JRST SRTNXT ;YES--GET NEXT LINE
ADDI O,1 ;ADVANCE TO NEXT LINE
CAMG O,MAXLIN ;SEE IF PAST THE END
JRST LINN.2 ;NO--SETUP FOR THIS ONE
POPJ P, ;AND RETURN
LINN.1: MOVE T1,LINMAX## ;GET HIGHEST LINE
MOVE T2,S.INCLUDE## ;GET /INCLUDE:
HLRZ T3,.FZTTY##(I) ;GET /TTY/PTY
CAIE T3,'PTY' ;/PTY GIVEN?
TRNE T2,INCPTY## ;OR /INCLUDE:PTY
ADD T1,PTYN## ;YES--INCLUDE THEM
MOVEM T1,MAXLIN ;AND SAVE MAX
CAIN T3,'PTY' ;/PTY GIVEN?
SKIPA O,LINMAX## ;YES--START WITH FIRST PTY
SETO O, ;NO--START WITH FIRST LINE
ADDI O,1 ;ADVANCE TO NEXT LINE
MOVEI T1,^D10 ;INITIAL TABLE SIZE
MOVEI T2,^D2 ;SIZE OF EACH ENTRY
PUSHJ P,.HASHI## ;ADD IT
SKIPL T1,S.SORT## ;GET SORT INDEX
JRST LINSRT ;GO HANDLE /SORT
LINN.2: PUSHJ P,LINSET ;SETUP FOR THIS LINE
JRST LINNXT ;NOT CONNECTED
JRST .POPJ1## ;ALL SET
SUBTTL Main line routines -- LINSET - Setup for a new line
LINSET::SKIPE JP,LINCOR ;SEE IF CORE ALLOCATED YET
JRST LINS.C ;YES
MOVEI T1,.LBLEN ;NO--GET SIZE
PUSHJ P,M$ALLOC## ;GET CORE
MOVEM T1,LINCOR ;SAVE STARTING ADDRESS
MOVEI JP,(T1) ;AND INTO JP
LINS.C: HRLI T1,(JP) ;GET STARTING ADDRESS
HRRI T1,1(JP) ;ENDING ADDRESS
SETOM (JP) ;SET FIRST WORD TO -1
BLT T1,.LBLEN-1(JP) ;AND SET THEM ALL TO -1
MOVEI T1,(O) ;GET LINE NUMBER
PUSHJ P,TTYUSE## ;SEE IF IN USE
POPJ P, ;IT ISN'T
SKPYES S.INCREMENTAL## ;SEE IF /INCREMENTAL
JRST .POPJ1## ;NO--RETURN NOW
MOVSI T1,-INCLEN ;GET LENGTH
MOVEI T2,(O) ;GET LIN INDEX
IMULI T2,INCLEN ;POINT TO BLOCK
ADD T2,INCINC ;ADD START OF TABLE
LINS.1: MOVEI T3,@INCOFF(T1) ;GET OFFSET THIS FIELD
MOVE T4,(T2) ;GET COMPUTED INCREMENTAL VALUE
SETZM -1(T3) ;INDICATE WE GOT IT
MOVEM T4,(T3) ;STORE IT
ADDI T2,1 ;ADVANCE TO NEXT
AOBJN T1,LINS.1 ;LOOP FOR ALL
JRST .POPJ1## ;AND RETURN
SUBTTL Main line routines -- LININC - Handle incremental statistics
LININC::PUSH P,S.INCREMENTAL## ;SAVE /INCREMENTAL
PUSH P,S.SORT ;SAVE /SORT
SETZM S.INCREMENTAL## ;FAKE LINSET
SETOM S.SORT ;..
MOVNI O,1 ;FLAG LINSET TO GET FIRST LINE
SKIPE INCINC ;SEE IF TABLE YET
JRST LINI.L ;YES!
MOVEI T1,1000*INCLEN ;GET CORE NEEDED
PUSHJ P,C$ALLOC## ;ALLOCATE CORE
MOVEM T1,INCINC ;SAVE ADDRESS
MOVEI T1,1000*INCLEN ;GET CORE NEEDED AGAIN
PUSHJ P,C$ALLOC## ;ALLOCATE IT
MOVEM T1,INCOLD ;SAVE
LINI.L: PUSHJ P,LINNXT ;GET THE NEXT LINE
JRST LINI.E ;ALL DONE
PUSHJ P,LININJ ;HANDLE INCREMENTAL STATISTICS
JRST LINI.L ;LOOP FOR ALL
LINI.E: POP P,S.SORT ;RESTORE /SORT
POP P,S.INCREMENTAL## ;AND /INCREMENTAL
POPJ P, ;RETURN
LININJ: PUSHJ P,.SAVE3## ;SAVE P1-P3
MOVEI T1,(O) ;GET LINE NUMBER
IMULI T1,INCLEN ;TIME LENGHTH OF TABLE
MOVSI P1,-INCLEN ;GET AOBJN POINTER
MOVE P2,INCOLD ;GET ADDRESS OF TABLE
ADDI P2,(T1) ;..
MOVE P3,INCINC ;AND ADDRESS OF INCREMENTAL TABLE
ADDI P3,(T1) ;..
SKIPN (P2) ;SEE IF SEE BEFORE
JRST LNI.N ;SETUP FOR NEW LIN
LNI.L: PUSHJ P,@INCGET(P1) ;GET CURRENT VALUE
MOVE T2,T1 ;SAVE
EXCH T1,(P2) ;STORE OLD,,GET PREVIOUS OLD
SUB T2,T1 ;COMPUTE CURRENT-OLD
MOVEM T2,(P3) ;STORE INCREMENTAL
ADDI P2,1 ;ADVANCE TO NEXT BLOCK
ADDI P3,1 ;ADVANCE TO NEXT
AOBJN P1,LNI.L ;LOOP FOR ALL OFFSETS
POPJ P, ;AND RETURN
LNI.N: PUSHJ P,@INCGET(P1) ;GET CURRENT VALUE
MOVEM T1,(P2) ;STORE AS OLD
SETZM (P3) ;CLEAR INCREMENTAL
ADDI P2,1 ;ADVANCE TO NEXT BLOCK
ADDI P3,1 ;..
AOBJN P1,LNI.N ;LOOP FOR ALL OFFSETS
POPJ P, ;AND RETURN
DEFINE INCS,<
X OCT
X ICT
X BCC
X CMD
>
DEFINE X(Z),<EXP LB$'Z>
INCGET: INCS
INCLEN==.-INCGET
DEFINE X(Z),<.LB'Z(JP)>
INCOFF: INCS
SUBTTL Main line routines -- LINSRT - Handle line sorting
LINSRT: PUSHJ P,.SAVE1## ;SAVE P1
MOVEI P1,(T1) ;SAVE SORT INDEX
MOVE T1,MAXLIN ;GET MAX LINES
ADDI T1,1 ;STARTS WITH ZERO
IMULI T1,2 ;2 WORD TABLE
MOVN T2,T1 ;NEGATE INTO T2
HRLZM T2,SRTTAB ;SAVE -N,,0
PUSHJ P,I$ALLOC## ;GET THE CORE
HRRM T1,SRTTAB ;SAVE START
SRTJ.1: PUSHJ P,LINSET ;SETUP FOR THIS LINE
JRST SRTJ.2 ;NOT ASSIGNED
PUSHJ P,@SUMLOD##(P1) ;GET SORT KEY
MOVEI T2,(O) ;GET LINE
IMULI T2,2 ;DOUBLE
ADD T2,SRTTAB ;PLUS START OF TABLE
MOVEM T1,(T2) ;SAVE SORT KEY FIELD
MOVEM O,1(T2) ;SAVE LINE NUMBER
AOS 1(T2) ;ADD ONE TO KEEP ZERO DIFFERENT
SRTJ.2: ADDI O,1 ;BUMP TO NEXT LINE
CAMG O,MAXLIN ;ALL DONE?
JRST SRTJ.1 ;NO--ADVANCE TO NEXT
MOVE T1,SRTTAB ;GET AOBJN WORD
MOVE T2,[400000,,2] ;UNSIGNED AND STRAIGHT SORT
SKIPLE S.SORT##+1 ;SEE IF DESCENDING
TLO T2,200000 ;YES-SET FLAG
PUSHJ P,.SORT2## ;SORT THE LIST
MOVE T1,SRTTAB ;GET AOBJN
MOVEM T1,SRTPTR ;SAVE
SETZM SRTCNT ;NO LINES YET
JRST LINNXT ;AND BACK TO THE TOP
SRTNXT: SKIPL T1,SRTPTR ;GET POINTER
POPJ P, ;ALL DONE
SKIPN O,1(T1) ;GET LINE NUMBER
JRST SRTN.1 ;NONE
SUBI O,1 ;ACCOUNT FOR ADDI ABOVE
PUSHJ P,LINSET ;SETUP FOR THIS LINE
JRST SRTN.1 ;NOT IN USE NOW?
AOS T1,SRTCNT ;COUNT THE LINES
CAMLE T1,S.SORT##+2 ;IN RANGE?
POPJ P, ;NO--STOP NOW
MOVE T1,[2,,2] ;ADVANCE POINTER
ADDM T1,SRTPTR ;TO NEXT PAIR
JRST .POPJ1## ;AND USE THAT J
SRTN.1: MOVE T1,[2,,2] ;ADVANCE POINTER
ADDM T1,SRTPTR ;TO NEXT PAIR
JRST SRTNXT ;AND GET NEXT
SUBTTL LINE tables -- Define simple TRMOP's required
DEFINE LTRM(LST),<
XLIST
IRP LST,<
LT%'LST==.LBLEN ;;Define flag word
.LT'LST==.LBLEN+1 ;;And data word
.LBLEN==.LBLEN+2
LT$'LST::AOSN T1,LT%'LST(JP) ;;We already have this TRMOP?
JRST LT1'LST ;;No--Get it now
MOVE T1,.LT'LST(JP) ;;Yes--Return its value
POPJ P, ;;And return
LT1'LST:MOVEI T1,.TO'LST ;;Get the desired TRMOP table
MOVEI T2,.UXTRM(O) ;;Get the UDX
PUSHJ P,UTRMOP## ;;Fetch for the current line
MOVEI T1,0 ;;Failed
MOVEM T1,.LT'LST(JP) ;;Store for later
POPJ P, ;;And return
>;END IRP
LIST
>;END DEFINE
.LBLEN==0
LTRM <DSS,TRM,TSP,RSP,SLV,ICT,OCT,BCT,GMS,RMT>
LTRM <LCT,TAB,FRM,DEM,LCP,NFC,WID,SND,DIS,FLC,TAP,XON,PAG,PSZ>
LTRM <BLK,ALT,DBK,TDY,RTC,HLFX,OIP,HPS,STP,PCT,APL,274,ACR,OSU>
SUBTTL LINE tables -- Define all line subfields
;This macro fetches a sub-field about the Lob. If the field has been
;gotten before, it simply returns the known field. If the field has
;not been gotten before, it it derived/computed, stored for later
;use, and returned.
;
;In all cases, the field will be returned in T1, and set in table
;.LBxxx (flag LB%xxx indicates if the field has been gotten)
DEFINE LB$(X,N<1>),<
XLIST
LB%'X==.LBLEN ;;FLAG WORD
.LB'X==.LBLEN+1 ;;DATA WORD
.LBLEN==.LBLEN+2
IFG N-1,.LBLEN==.LBLEN+N
LB$'X:: AOSN LB%'X(JP) ;;DO WE HAVE THE INFO?
JRST LB1'X ;;NO--GO GET IT
MOVE T1,.LB'X(JP) ;;YES--JUST GET IT NOW
POPJ P, ;;AND RETURN
LB1'X: ;;(HERE TO GET INFO)
DEFINE END$,<
XLIST
MOVEM T1,.LB'X(JP) ;STORE
POPJ P, ;AND RETURN
LIST
>
LIST
>;END DEFINE
;This macro is a trivial case of LB$(xxx). The information is simply
;from a GETTAB table, and a dispatch to fetch that GETTAB table entry
;is made, if needed.
;
;Again, in all cases, the field will be returned in T1, and set in table
;.LBxxx (flag LB%xxx indicates if the field has been gotten)
DEFINE LB$$(X),<
LB$'X==:LT$'X
.LB'X==.LT'X
LB%'X==LT%'X
>
;This macro fetches a sub-field about the Lob. If the field has been
;gotten before, it simply returns the known field. If the field has
;not been gotten before, it it derived/computed, stored for later
;use, and returned.
;
;In all cases, the field will be returned in T1, and set in table
;.LXxxx (flag LX%xxx indicates if the field has been gotten)
DEFINE LX$(X),<
XLIST
LX%'X==.LBLEN ;;FLAG WORD
.LX'X==.LBLEN+1 ;;DATA WORD
.LBLEN==.LBLEN+2
LX$'X:: AOSN LX%'X(JP) ;;DO WE HAVE THE INFO?
JRST LX1'X ;;NO--GO GET IT
MOVE T1,.LX'X(JP) ;;YES--JUST GET IT NOW
POPJ P, ;;AND RETURN
LX1'X: ;;(HERE TO GET INFO)
DEFINE END$,<
MOVEM T1,.LX'X(JP) ;STORE
POPJ P, ;AND RETURN
>
LIST
>;END DEFINE
SUBTTL LINE tables -- Routines to fetch all subfields
LB$(TYP) ;TERMINAL TYPE
PUSHJ P,LT$TRM
END$
LB$$(TSP) ;TRANSMIT SPEED INDEX
LB$$(RSP) ;RECEIVE SPEED INDEX
LB$$(SLV) ;SLAVE BIT
LB$$(ICT) ;INPUT CHARACTER COUNT
LB$$(OCT) ;OUTPUT CHARACTER COUNT
LB$$(RMT) ;REMOTE BIT
LB$(MCL) ;MIC CONTROLLED LINE
PUSHJ P,LT$GMS ;GET MIC STATUS
CAIE T1,0 ;CONTROLLED BY MIC?
MOVEI T1,1 ;YES--SET 1
END$
LB$(DSC) ;DATA SET CARRIER
PUSHJ P,LT$DSS ;GET DATA SET STATUS
LOAD T1,T1,LS.CAR ;GET THE CARRIER BIT
END$
LB$(TBD) ;TRANSMIT BAUD
PUSHJ P,LB$TSP ;GET TRANSMIT SPEED INDEX
MOVE T1,SPETAB(T1) ;CONVERT INTO BAUD
END$
LB$(RBD) ;RECEIVE BAUD
PUSHJ P,LB$RSP ;GET RECEIVE SPEED INDEX
MOVE T1,SPETAB(T1) ;CONVERT INTO BAUD
END$
LB$(BCC) ;BREAK CHARACTER COUNT
PUSHJ P,LT$BCT ;GET COUNTERS
LOAD T1,T1,LS.BRK ;GET BREAK COUNT
END$
LB$(CMD) ;COMMANDS TYPED
PUSHJ P,LT$BCT ;GET COUNTERS
LOAD T1,T1,LS.CMD ;GET COMMAND COUNT
END$
LB$(NLN) ;NETWORK LINE NUMBER
PUSHJ P,LX$NNL ;GET NODE AND LINE
LOAD T1,T1,GX.LIN ;GET LINE NUMBER
END$
LB$(NNU) ;NETWORK NODE NUMBER
PUSHJ P,LX$NNL ;GET NODE AND LINE
LOAD T1,T1,GX.NOD ;GET NODE NUMBER
END$
LB$(NNM) ;NETWORK NODE NAME
PUSHJ P,LB$NNU ;GET NODE NUMBER
CAIE T1,0 ;SEE IF KNOWN
PUSHJ P,ANODE## ;YES--CONVERT
MOVEI T1,0 ;FAILED?
END$
LB$(TLN) ;TERMINAL LINE NUMBER
MOVEI T1,(O) ;GET LINE
END$
LB$(JOB) ;ASSOCIATED JOB
MOVEI T1,.UXTRM(O) ;GET UDX
PUSHJ P,UDEVTYP## ;GET JOB IN USE
MOVEI T1,0 ;FAILED
LOAD T1,T1,TY.JOB ;EXTRACT
END$
LB$(TTY) ;TERMINAL NAME
MOVEI T1,(O) ;GET TERMINAL LINE NUMBER
CAMN T1,CTYLIN## ;SEE IF CTY
JRST TTY.C ;YES
CAML T1,SYSPTY## ;SEE IF PTY
JRST TTY.P ;YES
PUSHJ P,TTYNNN## ;NO--MAKE NNN
HRLI T1,'TTY' ;INCLUDE PREFIX
JRST TTY.E ;AND FINISH
TTY.P: SUB T1,SYSPTY## ;MINUS OFFSET FOR PTYS
PUSHJ P,TTYNNN## ;MAKE NNN
HRLI T1,'PTY' ;INCLUDE PREFIX
JRST TTY.E
TTY.C: MOVSI T1,'CTY' ;GET CTY PREFIX
TTY.E: END$
LB$(TCJ) ;TERMINAL CONTROLLING A JOB
PUSHJ P,LX$DVC ;GET DEVICE CHARS
LOAD T1,T1,DV.TTA ;GET THE BIT
END$
LB$(TAC) ;TERMINAL ASSIGNED BY COMMAND
PUSHJ P,LX$DVC ;GET DEVICE CHARS
LOAD T1,T1,DV.ASC ;GET THE BIT
END$
LB$(TAP) ;TERMINAL ASSIGNED BY PROGRAM
PUSHJ P,LX$DVC ;GET DEVICE CHARS
LOAD T1,T1,DV.ASP ;GET THE BIT
END$
LB$(APC) ;ASYNC PORT CHARACTERISTICS
MOVEI T2,.UXTRM(O) ;GET LINE
MOVEI T1,.TOAPC ;FUNCTION CODE
PUSHJ P,UTRMOP## ;READ APC
MOVEI T1,.TOUNK ;UNKNOWN
END$
LB$(LOC,4) ;LOCATION STRING
PUSHJ P,LB$NLN ;GET NETWORK LINE NUMBER
PUSH P,T1 ;SAVE
PUSHJ P,LB$NNM ;GET NETNORK NODE NAME
POP P,T2 ;RESTORE LINE NUMBER
PUSHJ P,LOCFND## ;FIND ITS STRING
DMOVEM T1,.LBLOC+1(JP) ;SAVE
DMOVEM T3,.LBLOC+3(JP) ;..
MOVEI T1,.LBLOC+1(JP) ;GET ADDRESS OF STRING
END$
IFN FTLGNQ,<
LB$(LQP) ;LOGIN QUEUE POSITION
PUSHJ P,CHKLGQ## ;SEE IF IN LOGIN QUEUE
END$
> ;END IFN FTLGNQ
LX$(NNL) ;GET NETWORK NODE AND LINE
MOVEI T1,.UXTRM(O) ;GET UDX
PUSHJ P,UGTNTN## ;DO GTNTN.
MOVEI T1,0 ;FAILED
END$
LX$(DVC) ;DEVICE CHARACTERISTICS
MOVEI T1,.UXTRM(O) ;GET UDX
PUSHJ P,UDEVCHR## ;DO DEVCHR
END$
LX$(GLC) ;GET LINE CHARACTERISTICS
MOVEI T1,(O) ;GET LINE
PUSHJ P,UGETLCH## ;DO GETLCH
END$
SUBTTL Storage
SPETAB::DEC 0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,0,0
$LOW
MAXLIN::BLOCK 1
LINCOR::BLOCK 1
SRTTAB: BLOCK 1
SRTPTR: BLOCK 1
SRTCNT: BLOCK 1
INCOLD: BLOCK 1
INCINC: BLOCK 1
PRGEND
TITLE LINLOC - Location string information for WHO
SEARCH WHOMAC
$SETUP (LINLOC)
Comment |
This module contains the entry point LOCFND to return a string
corresponding to the node/line descriptor.
|
; TABLE OF CONTENTS FOR LINLOC
;
;
; SECTION PAGE
; 1. LOCINI - Initialize LINES.INI file........................ 3
; 2. LOCFND - Find corresponding node/line string.............. 4
; 3. Storage................................................... 5
SUBTTL LOCINI - Initialize LINES.INI file
;Call:
; PUSHJ P,LOCINI
;LOCTAB will contain either -1 if STD:LINES.INI cant be accessed, or
;the address of the in core copy of the file.
LOCINI: PUSHJ P,.SAVT2## ;SAVE T1,T2
MOVEI T1,.IODMP ;DUMP MODE
MOVSI T2,'STD' ;SYS:
MOVEI T3,0 ;NO BUFFERS
OPEN INI,T1 ;OPEN CHANNEL
JRST LOCI.E ;ERROR
MOVE T1,[SIXBIT/LINES/] ;GET NAME
MOVSI T2,'INI' ;EXTENSION
SETZB T3,T4 ;CLEAR OTHER STUFF
LOOKUP INI,T1 ;TRY FAST LOOKUP
JRST LOCI.E ;ERROR
HLRE T1,T4 ;GET FILE SIZE
PUSH P,T1 ;SAVE
MOVNS T1 ;MAKE POSITIVE
PUSHJ P,M$ALLOC## ;GET CORE
HRRZM T1,LOCTAB ;SAVE START
POP P,T2 ;GET SIZE BACK
HRL T1,T2 ;POSITION
SUBI T1,1 ;MAKE IOWD
MOVEI T2,0 ;CLEAR
INPUT INI,T1 ;READ FILE
RELEAS INI, ;FREE CHANNEL
POPJ P, ;AND RETURN
LOCI.E: SETOM LOCTAB ;FLAG ERROR
POPJ P, ;AND RETURN
SUBTTL LOCFND - Find corresponding node/line string
;Call:
; MOVE T1,[SIXBIT /node name/]
; MOVEI T2,line number
; PUSHJ P,LOCFND
;Returns with T1-T4 ASCIZ string
LOCFND::SKIPN LOCTAB ;SEE IF TABLE KNOWN
PUSHJ P,LOCINI ;NO--TRY TO READ STD:LINES.INI
SKIPG T4,LOCTAB ;SEE IF TABLE PRESENT NOW
JRST LOCF.X ;NOT THERE - RETURN EMPTY HANDED
LOCF.1: SKIPN T3,(T4) ;GET A NODE NAME
JRST LOCF.X ;END OF TABLE
CAMN T1,T3 ;IS IT A MATCH ?
JRST LOCF.2 ;YES
ADDI T4,2 ;ACCOUNT FOR TWO WORD ENTRIES
JRST LOCF.1 ;KEEP LOOKING
LOCF.X: SETZB T1,T2 ;RETURN NOTHING
SETZB T3,T4 ;...
POPJ P, ;AND RETURN
LOCF.2: PUSHJ P,.SAVE1## ;SAVE P1
MOVE P1,1(T4) ;GET STARTING ADDRESS OF ENTRY FOR NODE
ADD P1,LOCTAB ;PLUS START OF TABLE
LOCF.3: SKIPGE T3,(P1) ;GET A LINE NUMBER
JRST LOCF.X ;END OF TABLE
CAMN T2,T3 ;IS IT A MATCH ?
JRST LOCF.4 ;GOT IT
ADDI P1,5 ;ACCOUNT FOR 5 WORD ENTRIES
JRST LOCF.3 ;NO - KEEP LOOKING
LOCF.4: DMOVE T1,1(P1) ;RETURN FIRST HALF
DMOVE T3,3(P1) ;AND SECOND HALF
POPJ P, ;AND RETURN
SUBTTL Storage
$LOW
LOCTAB::BLOCK 1
END