1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-04 10:24:35 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

681 lines
19 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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