mirror of
https://github.com/PDP-10/its.git
synced 2026-02-03 23:32:51 +00:00
505 lines
13 KiB
Plaintext
505 lines
13 KiB
Plaintext
;;; Copyright (c) 1999 Massachusetts Institute of Technology
|
||
;;; See the COPYING file at the top-level directory of this project.
|
||
|
||
;; For ITS network stuff, the following parameters are defined:
|
||
;
|
||
; NETP - General network code (net independent, both CHAOS, NCP, TCP, etc)
|
||
; INETP - Internet Protocol code. Must have IMPP or some other device.
|
||
; NCPP - Include NCP code (IMPP must be on)
|
||
; TCPP - Include TCP code (INETP must be on)
|
||
|
||
; CHAOSP - Include CHAOS net code
|
||
; - other CHAOS stuff, all independent of internet stuff.
|
||
|
||
NE%UNT==:<1_32.> ; Escape bit indicating non-Internet address
|
||
NW$BYT==:301400 ; Byte pointer to network number (approx!)
|
||
NE%STR==:<1_33.> ; Escape bit indicating string-type address
|
||
|
||
DEFINE HOSTN A,B,C,D
|
||
.RADIX 10.,<<<<<A_8>+B>_8>+C>_8>+D,!TERMIN
|
||
|
||
; HOSTS3 full word network # values for certain networks
|
||
|
||
NW%CHS==:<NE%UNT+<7_24.>>
|
||
NW%ARP==:<12_24.>
|
||
NW%LCS==:<22_24.>
|
||
NW%AI==:HOSTN 128,52,0,0
|
||
|
||
DEFINE GETNET AC,(ADDR) ; Macro to extract net number
|
||
IFNB [ADDR] MOVE AC,ADDR
|
||
TLNN AC,(17_32.) ; Check for non-Internet type addrs
|
||
TLNN AC,(1_31.) ; Internet address, see if class A net
|
||
TDZA AC,[77,,-1] ; Unternet or class A, zap low 3 octets
|
||
TLNN AC,(1_30.) ; Class B or C, see which.
|
||
TRZA AC,177777 ; Class B network, zap low 2 octets
|
||
TRZ AC,377 ; Class C net, only zap 1 low octet
|
||
TERMIN
|
||
|
||
;;; Misc defs
|
||
CALL==<PUSHJ P,>
|
||
RET==<POPJ P,>
|
||
CALRET==<JRST>
|
||
|
||
OVHMTR NET
|
||
|
||
IFN IMPP,[ ; ARPAnet IMP interface code
|
||
IFN KAIMP,[
|
||
$INSRT IMPOLD
|
||
]
|
||
IFN KSIMP\SSIMP,[
|
||
$INSRT IMP
|
||
]
|
||
]
|
||
|
||
OVHMTR NET
|
||
|
||
IFN NCPP,[ ; Old Arpanet NCP protocol code
|
||
$INSRT NCP
|
||
]
|
||
OVHMTR NET
|
||
|
||
IFN INETP,[ ; Internet Protocol code
|
||
$INSRT INET
|
||
]
|
||
|
||
OVHMTR NET
|
||
|
||
IFN TCPP,[ ; Transmission Control Protocol code
|
||
$INSRT TCP
|
||
]
|
||
|
||
OVHMTR UUO
|
||
|
||
IFN CHAOSP,[ ; CHAOSnet interface and protocol code
|
||
$INSRT CHAOS
|
||
]
|
||
OVHMTR UUO
|
||
|
||
SUBTTL General Network System Calls
|
||
|
||
; .CALL NETRFC - Get a pending Request For Connection for a specific network
|
||
; Arg 1 - SIXBIT name of network
|
||
; Arg 2 - optional network-dependent arg
|
||
; (for CHAOS, points to packet buffer)
|
||
; Val 1 - network-dependent value
|
||
; For TCP and ARPNCP, this is <id>,,<port/socket #>
|
||
; Control bits:
|
||
%NQREF==:1 ; Arg 2 is previously returned identifier,
|
||
; refuse connection and flush from queue.
|
||
|
||
NETRFC: MOVE C,CTLBTS(U) ; Set up control bits in C
|
||
IFN TCPP,[
|
||
CAMN A,[SIXBIT /TCP/]
|
||
JRST TCPRQ
|
||
]
|
||
IFN CHAOSP,[
|
||
CAMN A,[SIXBIT /CHAOS/]
|
||
JRST [ TRNE C,%NQREF ; If refusing conn,
|
||
JRST OPNL12 ; Ignore, can't handle yet. "Mode not avail"
|
||
CAIGE W,2 ; Must have a 2nd arg
|
||
JRST OPNL30 ; "Too few args"
|
||
MOVE A,B ; Fake out old CHAOSQ call
|
||
JRST CHAOSQ]
|
||
]
|
||
IFN NCPP,[ ; NOP for now
|
||
; CAMN A,[SIXBIT /ARPNCP/]
|
||
; JRST IMPRQ
|
||
]
|
||
JRST OPNL33 ; No match, say "meaningless args".
|
||
|
||
; .CALL NETBLK - Wait for net channel state to change, or time out.
|
||
; Arg 1 - Channel (comes in R)
|
||
; Arg 2 - Undesired state
|
||
; Arg 3 - Optional timeout (as in .SLEEP), written back unless immediate
|
||
; Val 1 - New state
|
||
; Val 2 - Time left
|
||
|
||
NETBLK: HRRZ T,(R) ; Get IOCHNM RH = device index
|
||
HLRZ I,(R) ; Get LH = often connection index
|
||
IFN NCPP,[
|
||
CAIL T,NETDUI
|
||
CAILE T,NETDBO
|
||
CAIA
|
||
JRST [MOVE T,[HRRZ A,IMSOC4]
|
||
JRST NETBLI]
|
||
] ;NCPP
|
||
IFN CHAOSP,[
|
||
CAIE T,CHAIDN
|
||
CAIN T,CHAODN
|
||
JRST [MOVE T,[HRRZ A,CHSSTA]
|
||
JRST NETBLI]
|
||
] ;CHAOSP
|
||
IFN TCPP,[
|
||
CAIN T,TCPDUI
|
||
JRST [ MOVE T,[HLRZ A,XBSTAU]
|
||
JRST NETBLI]
|
||
CAIN T,TCPDUO
|
||
JRST [ MOVE T,[HRRZ A,XBSTAU]
|
||
JRST NETBLI]
|
||
] ;TCP
|
||
JRST OPNL34 ; Not a net chan, say "Wrong Type Device".
|
||
|
||
|
||
; T/ Instruction to XCT (not indexed) to get state in A
|
||
; Entry at NETBLI adds (I) to the instruction.
|
||
|
||
NETBLI: ADDI T,(I) ; Provide "index" for instruction.
|
||
NETBL0: CAIGE W,3
|
||
JRST [ HRLOI D,377777 ; No time given, use infinity
|
||
JRST NETBL4 ]
|
||
TLNE C,1000 ; Skip if pointer rather than immediate
|
||
JRST [ HRRZ D,C ; Get immediate time
|
||
ADD D,TIME
|
||
JRST NETBL4 ]
|
||
XCTR XRW,[MOVES D,(C)] ; Get time, check writeability
|
||
JUMPGE D,[ MOVNS D ; Relative time, make negative absolute
|
||
SUB D,TIME
|
||
JRST .+1 ]
|
||
UMOVEM D,(C) ; Store back absolute time
|
||
MOVNS D ; Make positive
|
||
NETBL4: MOVEM D,AC0S+D(U) ; Save absolute time to wait until
|
||
MOVEM B,AC0S+B(U) ; Save undesired state
|
||
PUSHJ P,NETBL2 ; Skip if state change or timeout
|
||
PUSHJ P,UFLS
|
||
MOVE B,D
|
||
SUB B,TIME ; How much used?
|
||
XCT T ; Return new state
|
||
JRST POPJ1
|
||
|
||
NETBL2: XCT T ; Get current state
|
||
CAME A,AC0S+B(U) ; Skip if still match
|
||
JRST POPJ1
|
||
MOVE A,AC0S+D(U) ; Timeout time
|
||
CAMG A,TIME
|
||
AOS (P)
|
||
POPJ P,
|
||
|
||
SUBTTL Utilities - CVTH2A, CVTH3A
|
||
|
||
|
||
; CVH2NA - Convert network host address in A to HOSTS2 format.
|
||
; A/ net address (any format)
|
||
; Returns A
|
||
|
||
CVH2NA: PUSH P,B
|
||
LDB B,[301400,,A] ; Get high 12 bits of net address
|
||
CAIGE B,70 ; If less than lowest HOSTS2-fmt value
|
||
JUMPN B,CVH2N3 ; then must be HOSTS3, go convert.
|
||
CAIL B,1000 ; If any of high 3 bits set,
|
||
JRST CVH2N3 ; then it's a HOSTS3 strange-fmt number.
|
||
JUMPN B,CVH2N2
|
||
CAILE A,377 ; Zero network, so must be ARPA net
|
||
JRST CVH2N1 ; Not just 8 bits, just add net number.
|
||
|
||
; Old-style 8-bit Arpanet host number
|
||
LSHC A,-6.
|
||
ROT B,6.
|
||
DPB B,[112000,,A]
|
||
CVH2N1: TLO A,(12_33)
|
||
JRST POPBJ
|
||
|
||
; Probably HOSTS2 format number
|
||
CVH2N2: JRST POPBJ ; For now, that's good enough.
|
||
|
||
; HOSTS3 format number, convert it.
|
||
CVH2N3: CAIN B,12 ; Arpa net?
|
||
JRST [ LSHC A,-16.
|
||
ANDI A,377
|
||
ROT B,16.
|
||
DPB B,[112000,,A]
|
||
TLO A,(12_33)
|
||
JRST POPBJ]
|
||
CAIN B,7+<NE%UNT_-24.> ; Chaos net?
|
||
JRST [ ANDI A,177777 ; Yup, fix it up.
|
||
TLO A,(7_33)
|
||
JRST POPBJ]
|
||
CAIN B,22 ; LCS net?
|
||
JRST [ LSHC A,-8.
|
||
ANDI A,-1
|
||
LSH A,2
|
||
LSHC A,8.
|
||
TLO A,(22_33)
|
||
JRST POPBJ]
|
||
|
||
; Not a known net, but try to do something plausible.
|
||
ANDCM A,[-1_24.] ; Preserve low 24 bits
|
||
DPB B,[331100,,A] ; put net # into HOSTS2 field.
|
||
POP P,B
|
||
RET
|
||
|
||
; CVH3NA - Convert network host address in A to HOSTS3 (Internet) format.
|
||
; A/ net address (any format)
|
||
; Returns A
|
||
|
||
CVH3NA: PUSH P,B
|
||
LDB B,[301400,,A] ; Get high 12 bits of net address
|
||
CAIGE B,70 ; If less than lowest HOSTS2 value,
|
||
JUMPN B,CVH3N3 ; it's already HOSTS3 format! (unless zero)
|
||
CAIL B,1000 ; If any of high 3 bits were set,
|
||
JRST CVH3N3 ; it must be a HOSTS3 strange-fmt addr.
|
||
JUMPN B,CVH3N2 ; If not zero, then must assume HOSTS2 fmt.
|
||
|
||
; Old-format 8-bit Arpanet host number, or HOSTS2 with zero net.
|
||
CAILE A,377
|
||
JRST CVH3N6 ; If greater than 8 bits, assume HOSTS2, zero net.
|
||
LSHC A,-6 ; Put 10 bits spacing between host/imp #s.
|
||
LSH B,-<2+8.>
|
||
LSHC A,<2+8.+6>
|
||
TLO A,(12_24.) ; and add ARPA network number.
|
||
JRST CVH3N3
|
||
|
||
; HOSTS2 format number
|
||
CVH3N2: TRZE B,7 ; Zap low 3 bits to ensure correct comparison
|
||
JRST CVH3N5 ; If any were set, can't be Chaosnet.
|
||
CAIN B,7_3 ; Chaos net?
|
||
JRST [ ANDI A,177777 ; Yes, kill all but bottom 16 bits
|
||
TLO A,(NE%UNT+<7_24.>) ; Add Chaos net #
|
||
JRST CVH3N3]
|
||
CVH3N5: CAIN B,12_3 ; Arpa net?
|
||
CVH3N6: JRST [ LSHC A,-9.
|
||
ANDI A,177777
|
||
ROT B,9.
|
||
DPB B,[201000,,A]
|
||
TLO A,(12_24.)
|
||
JRST CVH3N3]
|
||
CAIN B,22_3 ; LCS net?
|
||
JRST [ LSHC A,-8.
|
||
LSH A,-2
|
||
ANDI A,377
|
||
LSHC A,-8.
|
||
TLO A,(22_24.)
|
||
JRST CVH3N3]
|
||
|
||
; No match, assume it's HOSTS3.
|
||
|
||
CVH3N3: POP P,B
|
||
RET
|
||
|
||
;.CALL STYNET
|
||
;ARG 1 - STY CHANNEL
|
||
;ARG 2 - NET INPUT CHANNEL TO CONNECT STY OUTPUT TO, OR -1 TO DISCONNECT
|
||
;ARG 3 - NET OUTPUT CHANNEL TO CONNECT STY INPUT TO
|
||
;ARG 4 - CHARS TO SEND WHEN OUTPUT .RESET HAPPENS ON STY'S TTY
|
||
; UP TO 3 8-BIT CHARACTERS, LEFT JUSTIFIED.
|
||
|
||
NSTYNT: TLNN R,%CLSST
|
||
JRST OPNL34 ;1ST ARG NOT A STY CHANNEL.
|
||
HLRZ I,(R) ;GET TTY # OF STY
|
||
HRRES B ;ALLOW IMMEDIATE -1
|
||
JUMPGE B,NSTYN2 ;JUMP IF CONNECTING.
|
||
PUSHJ P,NSTYN0 ;DISCONNECT
|
||
JRST OPNL41 ;WASN'T CONNECTED
|
||
JRST POPJ1
|
||
|
||
;VARIOUS ROUTINES CALL HERE WITH THE TTY# OF A STY IN I, TO DISCONNECT THE
|
||
; STY FROM THE NETWORK. NOTE THIS ROUTINE MUST NOT CHANGE U AND MUST NOT
|
||
; LSWCLR, SINCE IT COULD BE CALLED FROM IODCL VIA STYCLS OR NETCLS.
|
||
|
||
NSTYN0: MOVSI B,%SSNET ;DISCONNECTING BOTH SIDES.
|
||
CONO PI,NETOFF
|
||
TDNN B,STYSTS-NFSTTY(I)
|
||
POPJ P, ;THIS STY NOT CONNECTED?
|
||
ANDCAB B,STYSTS-NFSTTY(I) ;MARK AS NO LONGER CONNECTED
|
||
MOVE C,STYNTL-NFSTTY(I) ;REMOVE THIS STY FROM ACTIVATION LIST
|
||
MOVEI D,STYNTA-STYNTL+NFSTTY
|
||
NSTYN1: CAMN I,STYNTL-NFSTTY(D) ;FIND THE STY THAT POINTS TO THIS ONE,
|
||
MOVEM C,STYNTL-NFSTTY(D) ;AND PATCH US OUT OF THE LIST.
|
||
SKIPE D,STYNTL-NFSTTY(D) ;SEARCH WHOLE LIST TILL FIND WHO POINTS TO US.
|
||
JRST NSTYN1
|
||
SETOB C,STYNTL-NFSTTY(I)
|
||
EXCH C,STYNTI-NFSTTY(I) ;MARK THIS STY AS HAVING NO CONNECTION, GET SOCKET INDICES
|
||
IFN CHAOSP,[
|
||
TLNE B,%SSCHA
|
||
JRST [ MOVSI B,%SSCHA ;DISCONNECT FROM CHAOS NET
|
||
ANDCAM B,STYSTS-NFSTTY(I)
|
||
MOVSI B,%CFSTY
|
||
TDNN B,CHSSTA(C)
|
||
JRST 4,. ;CHAOS DOESN'T THINK IT WAS CONNECTED?
|
||
ANDCAM B,CHSSTA(C)
|
||
JRST NETOJ1 ]
|
||
];CHAOSP
|
||
IFN TCPP,[
|
||
TLNE B,%SSTCP
|
||
JRST [ MOVSI B,%SSTCP ; Disconnect from TCP connection
|
||
ANDCAM B,STYSTS-NFSTTY(I) ; Flush STY's "connect" bit
|
||
MOVSI B,(XB%STY)
|
||
TDNN B,XBUSER(C) ; Make sure TCP thinks connected
|
||
BUG ; It isn't??
|
||
ANDCAM B,XBUSER(C)
|
||
JRST NETOJ1]
|
||
] ;TCPP
|
||
IFN NCPP,[
|
||
MOVE B,[40000,,777]
|
||
TDNN B,IMSOC5(C)
|
||
JRST 4,. ;SOCKET DOESN'T THINK IT WAS CONNECTED?
|
||
ANDCAM B,IMSOC5(C) ;AND MARK SOCKETS WE WERE CONNECTED TO AS DISCONNECTED
|
||
MOVSS C
|
||
TDNN B,IMSOC5(C)
|
||
JRST 4,. ;SOCKET DOESN'T THINK IT WAS CONNECTED?
|
||
ANDCAM B,IMSOC5(C)
|
||
JRST NETOJ1
|
||
] ;NCPP
|
||
.ELSE BUG
|
||
|
||
; Here to set up STY connection.
|
||
|
||
NSTYN2: MOVE Q,I ;SAVE TTY # OF STY
|
||
MOVEI E,1
|
||
MOVE A,B ;DECODE THE NETWORK INPUT CHANNEL
|
||
JSP T,CHNDCD
|
||
HRRZ A,(R)
|
||
IFN CHAOSP,[
|
||
CAIE A,CHAIDN
|
||
CAIN A,CHAODN
|
||
JRST [ HLRZ I,(R) ;CONNECT TO CHAOS NET
|
||
CONO PI,NETOFF
|
||
MOVSI B,%CFSTY
|
||
TDNE B,CHSSTA(I)
|
||
JRST OPNL23 ;ALREADY CONNECTED, FILE LOCKED
|
||
MOVSI C,%SSNET+%SSCHA
|
||
TDNE C,STYSTS-NFSTTY(Q)
|
||
JRST OPNL23 ;ALREADY CONNECTED, FILE LOCKED
|
||
IORM B,CHSSTA(I) ;OK, HOOK UP
|
||
DPB Q,[$CFTTN,,CHSSTA(I)]
|
||
JRST NSTYN3 ]
|
||
];CHAOSP
|
||
IFN TCPP,[
|
||
CAIE A,TCPDUI
|
||
CAIN A,TCPDUO
|
||
JRST [HLRZ I,(R) ; Connect to TCP, get TCB index
|
||
CONO PI,NETOFF
|
||
MOVSI B,(XB%STY)
|
||
TDNE B,XBUSER(I)
|
||
JRST OPNL23 ; TCB Already connected, say "File Locked"
|
||
MOVSI C,%SSNET+%SSTCP
|
||
TDNE C,STYSTS-NFSTTY(Q)
|
||
JRST OPNL23 ; STY already connected, say "File Locked"
|
||
DPB Q,[XB$STY (I)] ; Store TTY # to connect TCB.
|
||
JRST NSTYN3]
|
||
] ;TCPP
|
||
IFN NCPP,[
|
||
JSP T,NETCHK ;TEST LEGALITY; OPNL IF LOSES
|
||
TDNE E,IMSOC2(I)
|
||
JRST OPNL2 ;WRONG DIRECTION IF IT'S AN OUTPUT CHANNEL
|
||
MOVE B,I ;SAVE INPUT IMSOC INDEX
|
||
MOVE A,C ;DECODE OUTPUT CHANNEL
|
||
JSP T,CHNDCD
|
||
JSP T,NETCHK
|
||
TDNN E,IMSOC2(I)
|
||
JRST OPNL2 ;WRONG DIRECTION IF INPUT SOCKET
|
||
CONO PI,NETOFF
|
||
MOVE E,[40000,,777]
|
||
TDNN E,IMSOC5(B) ;ERROR IF EITHER CHANNEL ALREADY CONNECTED
|
||
TDNE E,IMSOC5(I)
|
||
JRST OPNL23 ;"FILE LOCKED"
|
||
MOVSI C,%SSNET
|
||
TDNE C,STYSTS-NFSTTY(Q)
|
||
JRST OPNL23 ;SIMILAR ERROR IF STY ALREADY CONNECTED
|
||
HRR E,Q ;GET 40000,,TTY #
|
||
IORM E,IMSOC5(I)
|
||
IORM E,IMSOC5(B) ;MARK SOCKETS AS CONNECTED
|
||
] ;NCPP
|
||
|
||
NSTYN3: SKIPGE STYNTL-NFSTTY(Q) ;HALT IF STY'S VARS ARE NOT CORRECT FOR A
|
||
SKIPL STYNTI-NFSTTY(Q) ;NON-CONNECTED STY.
|
||
JRST 4,.
|
||
IORM C,STYSTS-NFSTTY(Q) ;ALL ERROR CAUGHT, SO MARK STY CONNECTED.
|
||
HRL B,I ;PUT INPUT IMSOC IDX,, OUTPUT IMSOC IDX
|
||
MOVSM B,STYNTI-NFSTTY(Q) ;INTO THE STY
|
||
TRZ D,7777 ;STORE THE OUTPUT RESET CHARACTERS - AT MOST 3
|
||
MOVEM D,STYORC-NFSTTY(Q)
|
||
|
||
;ACTIVATE IN CASE HAS UNREAD INPUT
|
||
IFN NCPP,[
|
||
TLNN C,%SSCHA+%SSTCP
|
||
PUSHJ P,IMPUIN
|
||
] ;NCPP
|
||
IFN CHAOSP,[
|
||
TLNE C,%SSCHA
|
||
PUSHJ P,CHINTI
|
||
];CHAOSP
|
||
IFN TCPP,[
|
||
TLNE C,%SSTCP
|
||
PUSHJ P,TCPUII
|
||
] ;TCPP
|
||
JRST NETOJ1
|
||
|
||
SUBTTL Clock interrupt level code
|
||
|
||
; NETCLK - Slow net clock. Called at clock level every 1/2 sec.
|
||
; Can clobber all ACs
|
||
|
||
NETCLK:
|
||
IFN CHAOSP, PUSHJ P,CHACLK ; Run Chaos net 1/2-second clock
|
||
IFN TCPP, PUSHJ P,TCPCLK ; Run TCP 1/2-sec clock
|
||
SETCMB A,NETCL1 ; Flip the 1 sec switch
|
||
JUMPE A,CPOPJ ; Return unless time for 1-sec clock
|
||
IFN INETP,CALL IPFCLK ; Run IP reassembly timeout every 1 sec
|
||
RET
|
||
EBLK
|
||
NETCL1: 0 ; Flip-flop to get 1-sec ticks
|
||
BBLK
|
||
|
||
; STYNTC - Called at clock level every 1/60 sec to process all
|
||
; necessary transfers of data between STYs and associated
|
||
; net connections
|
||
|
||
STYNTC: CONO PI,NETOFF
|
||
SKIPN I,STYNTA ;GET HEAD OF ACTIVATE LIST
|
||
JRST NETONJ ;EMPTY
|
||
SETZM STYNTA ;COPY LIST IN CASE A STY IS PUT BACK ON
|
||
CONO PI,NETON
|
||
STYNT7: MOVE A,STYNTL-NFSTTY(I) ;GET NEXT ON LIST
|
||
MOVEM A,STYNTB ;SAVE FOR NEXT TIME AROUND LOOP
|
||
SETOM STYNTL-NFSTTY(I) ;THIS ONE IS NO LONGER ON ACTIVATE LIST
|
||
MOVE A,STYSTS-NFSTTY(I)
|
||
TLNN A,%SSNET
|
||
JRST 4,. ;STY CLAIMS NOT TO BE CONNECTED??
|
||
MOVE R,I ;SAVE TTY #
|
||
|
||
IFN CHAOSP,[
|
||
TLNE A,%SSCHA
|
||
JRST STYCHA ;CONNECTED TO CHAOS NET
|
||
];CHAOSP
|
||
IFN TCPP,[
|
||
TLNE A,%SSTCP
|
||
JRST STYTCP
|
||
] ;TCPP
|
||
IFN NCPP,[
|
||
JRST STYNCP
|
||
];NCPP
|
||
|
||
STYNT8: SKIPE I,STYNTB ;GET NEXT STY FROM COPIED ACTIVATION LIST
|
||
JRST STYNT7
|
||
POPJ P,
|
||
|
||
;SUBROUTINE TO STANDARDIZE HOST NUMBER, OPNL25 IF NO GOOD
|
||
;PROCESSES HOST NUMBER IN T, MUNGS H, CALLED BY JSP J,STDHST
|
||
STDHST:
|
||
IFN 1,[
|
||
EXCH A,T
|
||
CALL CVH3NA ; Convert # to HOSTS3 fmt
|
||
EXCH A,T
|
||
LDB H,[301400,,T] ; Get high 12 bits (net #)
|
||
CAIE H,12 ; Should be ARPA net
|
||
JRST OPNL25
|
||
TDZ T,[NW%ARP+<377_8.>] ; Flush the net # and logical host field
|
||
JRST (J)
|
||
] ;IFN 1
|
||
IFN 0,[
|
||
LDB H,[331000,,T] ;GET NETWORK-NUMBER FIELD
|
||
CAIE H,12 ;ONLY 12 OR 0 IS ACCEPTABLE
|
||
JUMPN H,OPNL25
|
||
TDNE T,[400600,,400] ;MAKE SURE OTHER RANDOM BITS AREN'T ON
|
||
JRST OPNL25
|
||
TLZ T,777000 ;CLEAR NETWORK NUMBER
|
||
JUMPE T,OPNL25 ;0 IS NOT ACCEPTABLE
|
||
CAIL T,400 ;SKIP IF OLD-STYLE HOST NUMBER
|
||
JRST (J)
|
||
LDB H,[060200,,T] ;GET HOST FIELD
|
||
ANDI T,77 ;GET IMP FIELD
|
||
EXCH H,T
|
||
DPB H,[112000,,T] ;RECOMBINE
|
||
JRST (J)
|
||
] ;IFN 0
|