Trailing-Edge
-
PDP-10 Archives
-
bb-ev83b-bm_longer
-
tcpip-sources/iphost.mac
There are 12 other files named iphost.mac in the archive. Click here to see a list.
; UPD ID= 6, SNARK:<6.1.ARPA-UTILITIES>IPHOST.MAC.6, 6-May-85 15:12:06 by PAETZOLD
;Remove some of ETHERNET STATUS from the BUGGY switch.
; UPD ID= 4, SNARK:<6.1.ARPA-UTILITIES>IPHOST.MAC.5, 26-Apr-85 20:17:41 by PAETZOLD
;Add AN20 command and ETHERNET STATUS command. Most of the ETHERNET STATUS
;command is under IFN BUGGY switch until the NI JSYS works better.
; UPD ID= 3, SNARK:<6.1.ARPA-UTILITIES>IPHOST.MAC.4, 7-Mar-85 11:23:12 by PAETZOLD
;Output interface index in INFO NETWORK command.
;Add ENABLED and DISBABLED subcommands to INTERNET command.
; UPD ID= 2, SNARK:<6.1.ARPA-UTILITIES>IPHOST.MAC.3, 3-Feb-85 21:41:11 by PAETZOLD
;Get rid of the buggy switch and let filtering happen.
; UPD ID= 9, SNARK:<TCPIP.5.4.UTILITIES>IPHOST.MAC.9, 1-Nov-84 20:58:51 by PAETZOLD
;Use new GTHST functionality for network interfaces.
;Rework lots of command now that we know all our addresses.
;Update the Help stuff.
;Some code clean up.
; UPD ID= 8, SNARK:<TCPIP.5.4.UTILITIES>IPHOST.MAC.8, 16-Oct-84 16:10:58 by PAETZOLD
;No break mask in HSCFB3.
; UPD ID= 7, SNARK:<TCPIP.5.4.UTILITIES>IPHOST.MAC.7, 26-Sep-84 07:57:47 by PAETZOLD
;Make sure filtering is not used until tested.
; UPD ID= 6, SNARK:<TCPIP.5.4.UTILITIES>IPHOST.MAC.6, 25-Sep-84 16:20:45 by PAETZOLD
;Simplify and fix RETRIEVE
; UPD ID= 5, SNARK:<TCPIP.5.4.UTILITIES>IPHOST.MAC.5, 22-Aug-84 21:43:53 by PAETZOLD
;Add Retrieve command. No more FTNIDB. Add VALID command.
;Add ENABLE and DISABLE commands. Add MSDOS, VMS, and TAC OPSTAB entries.
; UPD ID= 4, SNARK:<TCPIP.5.4.UTILITIES>IPHOST.MAC.4, 12-May-84 19:05:44 by PAETZOLD
;Implement some Ethernet control commands. Add switches for flags in
;host command. Allow null mapping files.
; UPD ID= 3, SNARK:<TCPIP.5.4.UTILITIES>IPHOST.MAC.3, 8-Apr-84 15:54:04 by PAETZOLD
;Change format of CONVERT command. Add CONVERT ETHERNET and CONVERT
;DECNET commands Use symbols in ANAUNV for GHT formats. Turn off
;FTNIDB. Add support for the POKE command. Make HSDMPX and friends tell
;us about host status and downtimes.
; UPD ID= 1, SNARK:<TCPIP.5.4.UTILITIES>IPHOST.MAC.2, 20-Mar-84 20:02:32 by PAETZOLD
;Release 6.1. Add support for the INTERNET-ETHERNET-MAPPING.TXT file.
;Add Support for HS%NET, HS%GAT, and .HSFUZ. Add PUSH command.
; UPD ID= 3, SNARK:<6.ARPA-UTILITIES>IPHOST.MAC.3, 21-Nov-83 10:01:48 by PAETZOLD
;Remove REL6 switch. Old REL6 code is assembled in. Add INFORMATION
;(ABOUT) NETWORK (STATUS) command. Make ARPANET STATUS command use code
;from above.
; UPD ID= 2, SNARK:<6.ARPA-UTILITIES>IPHOST.MAC.2, 30-Oct-83 17:13:08 by PAETZOLD
;REL6 switch is off by default
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1985 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
DEFINE VTITLE(VW,VMA,VMI,VE),<
TITLE IPHOST - TCP/IP Host Utility - KWPaetzold - Version 'VMA'.'VMI'('VE')-'VW' ->
SALL
IF1 <TITLE IPHOST>
IF2 <PRINTX PASS 2>
IF2 <VTITLE \VWHO,\VMAJOR,\VMINOR,\VEDIT>
SEARCH MONSYM,MACSYM,ANAUNV
COPYRT 1985
.REQUIRE SYS:MACREL.REL
.DIRECTIVE FLBLST
IFNDEF DEBUG,<DEBUG==0>
IFN DEBUG,<LALL>
IFNDEF BUGGY,<BUGGY==0>
SUBTTL Non Executable Initialization
DEFINE SYM(A,B),<A=B>
DEFINE SYMS(A,B),<A==B>
DEFINE DSYM(A,B),<IFNDEF A,<A=B>>
DEFINE DSYMS(A,B),<IFNDEF A,<A==B>>
;VERSION INFORMATION
DSYMS VWHO,0 ;WHO LAST HACKED
DSYMS VMAJOR,6 ;MAJOR VERSION NUMBER
DSYMS VMINOR,1 ;MINOR VERSION NUMBER
DSYMS VEDIT,45 ;EDIT NUMBER
VERSIO==<VWHO>B2!<VMAJOR>B11!<VMINOR>B17!<VEDIT>B35
SUBTTL AC Definitions
;AC NAMES
SYM F,0 ;FLAGS
SYM T1,1 ;\
SYM T2,2 ; \
SYM T3,3 ; \ TEMPORARY
SYM T4,4 ; / ACS
SYM T5,5 ; /
SYM T6,6 ;/
SYM X1,5 ;TEMP AC
SYM X2,6 ;TEMP AC
SYM NT,7 ;NETWORK INTERFACE AOBJN POINTER
SYM HT,7 ;HOST TABLE ADDRESS
SYM GW,7 ;GATEWAY AOBJN POINTER
SYM PT,7 ;PROTOCOL TYPE AOBJN POINTER
SYM NN,10 ;NETWORK INTERFACE NAME STORAGE
SYM GL,10 ;GATEWAY ADDRESS AOBJN POINTER
SYM QC,7 ;QUEUEING CURRENT ITEM
SYM QP,10 ;QUEUEING PREVIOUS ITEM
SYM QN,11 ;QUEUEING NEXT ITEM
SYM QO,12 ;QUEUEING OLD ITEM
SYM FP,15 ;MACSYM'S FRAME POINTER
SYM CX,16 ;MACSYM'S TEMPORARY AC
SYM P,17 ;STACK POINTER
SYMS AC0,0 ;ALTERNATIVE AC NAMES
SYMS AC1,1
SYMS AC2,2
SYMS AC3,3
SYMS AC4,4
SYMS AC5,5
SYMS AC6,6
SYMS AC7,7
SYMS AC10,10
SYMS AC11,11
SYMS AC12,12
SYMS AC13,13
SYMS AC14,14
SYMS AC15,15
SYMS AC16,16
SYMS AC17,17
SUBTTL Flag and Macro Definitions
;FLAGS
MSKSTR F%INIT,F,1B0 ;INITIALIZATION DONE
MSKSTR F%NAME,F,1B1 ;HOST NAMES LOADED
MSKSTR F%HSOB,F,1B2 ;BITCH ON HOST NAME ERRORS
MSKSTR F%DIDB,F,1B3 ;WE BITCH ON A HOST NAME ERROR
MSKSTR F%WLDF,F,1B4 ;WILD MATCH FOUND
MSKSTR F%HOLY,F,1B5 ;WE HAVE PRIVS FLAG
MSKSTR F%SYML,F,1B6 ;MONITOR SYMBOLS LOADED
MSKSTR F%BIJ,F,1B7 ;INPUT JFN EXISTS
MSKSTR F%BIO,F,1B8 ;INPUT JFN OPEN
MSKSTR F%BOJ,F,1B9 ;OUTPUT JFN EXISTS
MSKSTR F%BOO,F,1B10 ;OUTPUT JFN IS OPEN
MSKSTR F%BULD,F,1B11 ;BUILD COMMAND SET UP
MSKSTR F%PUSH,F,1B12 ;PUSH EXEC EXISTS
MSKSTR F%BERR,F,1B13 ;ERROR PARSING ETHERNET TEXT FILE
MSKSTR F%IPSQ,F,1B15 ;SPECIAL QUEUE IS ASSIGNED
MSKSTR F%ICER,F,1B16 ;RECEIVED AN ECHO REPLY
MSKSTR F%WALL,F,1B17 ;ALL NAMES MATCH FLAG
MSKSTR F%ROJ,F,1B18 ;RETRIEVE JFN EXISTS
MSKSTR F%ROO,F,1B19 ;RETRIEVE JFN OPEN
MSKSTR F%TOJ,F,1B20 ;TCP JFN EXISTS
MSKSTR F%TOO,F,1B21 ;TCP JFN OPEN
MSKSTR F%VLD,F,1B22 ;VALID COMMAND FLAG
MSKSTR F%FLT,F,1B23 ;RETRIEVE STUFF NEEDS TO FILTER
MSKSTR F%BIN,F,1B24 ;INITIAL RETRIEVE BUFFER FLAG
MSKSTR F%ES1,F,1B25 ;ETHERNET STATUS COMMAND FLAGS
MSKSTR F%FILE,F,<F%BIO!F%BIJ!F%BOJ!F%BOO!F%ROO!F%ROJ!F%TOJ!F%TOO>
DEFINE JSYSF,<ERCAL .JSYSF> ;ERROR HANDLING MACRO
DEFINE JSYSC,<ERCAL .JSYSF> ;COMMAND ERROR HANDLING MACRO
DEFINE NOERR,<ERJMP .+1> ;ERROR IGNORING MACRO
DEFINE ERSKP,<ERJMP .+2> ;SKIP ON ERROR
DEFINE SAVACS,<CALL .SAVAC> ;GO SAVE ACS
DEFINE XLIST%,<
XLIST.==XLIST.+1
XLIST>
DEFINE LIST%,<
XLIST.==XLIST.-1
IFE XLIST.,<LIST>>
XLIST.==0
SUBTTL Parameters
DSYMS PDLSIZ,200 ;STACK SIZE
DSYMS TXTSIZ,^D500 ;TEXT BUFFER SIZE
DSYMS ATMSIZ,^D200 ;ATOM BUFFER SIZE
DSYMS DDTADR,770000 ;DDT STARTING ADDRESS
DSYMS NAMSIZ,^D39 ;MAX SIZE OF A WILD HOST NAME
DSYMS PGSIZ,1000 ;SIZE OF A PAGE
DSYMS POKTIM,^D50 ;SLEEP TIME FOR POKE RECEIVES
DSYMS POKNUL,^D100 ;5 SECONDS
DSYMS POKSND,^D50 ;SLEEP TIME FOR POKE SENDS
DSYMS MXNETS,10 ;MAXIMUM NUMBER OF SUPPORTED NETWORK INTERFACES
DSYMS MXPTYP,^D16 ;NUMBER OF NI PROTOCOL TYPES SUPPORTED
DEFINE PG(S,L),<
S=.LOC
.LOC==.LOC+^D<L>*PGSIZ>
.LOC==040000 ;PAGE STORAGE STARTS AT PAGE 40
PG INTNAM,1 ;INTERFACE NAME TABLE
PG UHSTNM,4 ;USER HOST NAME TABLE
PG UHSTNN,4 ;USER HOST NICKNAME TABLE
PG SHSTNM,8 ;SERVER HOST NAME TABLE
PG SHSTNN,8 ;SERVER HOST NICKNAME TABLE
PG GHSTNM,1 ;GATEWAY HOSTNAME TABLE
PG GHSTNN,1 ;GATEWAY HOST NICKNAME TABLE
PG NHSTNM,1 ;NETWORK NAME TABLE
PG HSTNAM,16 ;HOST NAME STRING STORAGE
PG GWYBLK,1 ;GATEWAY STATUS TABLE
PG LNKSTG,4 ;LINK TABLE STORAGE
PG GHTBUF,5 ;GATEWAY HOST TABLE BUFFER
PG TCPBUF,1 ;TCP DATA PAGE
SUBTTL GHT Building Data Structure Definitions
DEFSTR MPLNK,0,35,36 ;LINK POINT
DEFSTR MPINT,1,35,36 ;INTERNET ADDRESS
DEFSTR MPEA1,2,35,36 ;ETHERNET ADDRESS WORD ONE
DEFSTR MPEA2,3,35,36 ;ETHERNET ADDRESS WORD TWO
DEFSTR MPFLG,4,35,36 ;GATEWAY CONTROL FLAGS
LNKSZ==<$MPFLG-$MPLNK>+1
DEFINE TYPE(S),<
HRROI T1,[ASCIZ\
S\]
PSOUT>
DEFINE TYPEN(S),<
HRROI T1,[ASCIZ\S\]
PSOUT>
DEFINE NUMO(A,R,S),<
XLIST%
MOVE T2,A
MOVEI T1,.PRIOU
IFE <S>,<MOVEI T3,R>
IFN <S>,<MOVX T3,<NO%LFL!<S>B17!<R>B35>>
LIST%
NOUT
XLIST%
JSYSF
LIST%>
DEFINE NUMOZ(A,R,S),<
XLIST%
MOVE T2,A
MOVEI T1,.PRIOU
IFE <S>,<MOVEI T3,R>
IFN <S>,<MOVX T3,<NO%ZRO!NO%LFL!<S>B17!<R>B35>>
LIST%
NOUT
XLIST%
JSYSF
LIST%>
SUBTTL COMND JSYS Macros
DEFINE CMD(N,D,F),< ;;MACRO TO DEFINE A COMMAND
IFB <D>,<[ ;;IF NO DISPATCH ADDRESS
IFNB <F>,<CM%FW!F> ;;IF FLAGS
ASCIZ\N\],,.'N> ;;COMMAND WITH DEFAULT ADDRESS
IFNB <D>,<[ ;;IF DISPATCH ADDRESS
IFNB <F>,<CM%FW!F> ;;IF FLAGS
ASCIZ\N\],,D>> ;;COMMAND WITH DISPATCH ADDRESS
DEFINE DOCMD(FNC,DAT,DFT,HLP,BRK),< ;;MACRO TO XCT A COMND FUNCTION
DOCFLG==0 ;;INITIALZE FLAGS
IFNB <HLP>,<DOCFLG==DOCFLG!CM%SDH!CM%HPP>;;IF HELP STRING EXISTS
IFNB <DFT>,<DOCFLG==DOCFLG!CM%DPP> ;;IF DEFAULT STRING EXISTS
IFNB <BRK>,<DOCFLG==DOCFLG!CM%BRK> ;;IF BREAK MASK EXISTS
MOVEI T2,[<FNC>B8!DOCFLG ;;FUNCTION CODE AND FLAGS
<DAT> ;;DATA WORD
IFB <HLP>,<Z> ;;IF NO HELP STRING
IFNB <HLP>,<-1,,[ASCIZ\HLP\]> ;;HELP STRING
IFB <DFT>,<Z> ;;IF NO DEFAULT STRING
IFNB <DFT>,<-1,,[ASCIZ\DFT\]> ;;DEFAULT STRING
IFB <BRK>,<Z> ;;IF NO BREAK MASK
IFNB <BRK>,<EXP BRK>] ;;IF BREAK MASK
CALL .DOCMD> ;;GO TO WORKER ROUTINE
DEFINE DOCMDB(FNC,DAT,DFT,HLP,BRK),< ;;MACRO TO XCT A COMND FUNCTION
DOCFLG==0 ;;INITIALZE FLAGS
IFNB <HLP>,<DOCFLG==DOCFLG!CM%SDH!CM%HPP>;;IF HELP STRING EXISTS
IFNB <DFT>,<DOCFLG==DOCFLG!CM%DPP> ;;IF DEFAULT STRING EXISTS
IFNB <BRK>,<DOCFLG==DOCFLG!CM%BRK> ;;IF BREAK MASK EXISTS
MOVEI T2,[<FNC>B8!DOCFLG ;;FUNCTION CODE AND FLAGS
<DAT> ;;DATA WORD
IFB <HLP>,<Z> ;;IF NO HELP STRING
IFNB <HLP>,<-1,,[ASCIZ\HLP\]> ;;HELP STRING
IFB <DFT>,<Z> ;;IF NO DEFAULT STRING
IFNB <DFT>,<-1,,[ASCIZ\DFT\]> ;;DEFAULT STRING
IFB <BRK>,<Z> ;;IF NO BREAK MASK
IFNB <BRK>,<EXP BRK>] ;;IF BREAK MASK
CALL .BOCMD> ;;GO TO WORKER ROUTINE
DEFINE NOISE(S),<DOCMD .CMNOI,<-1,,[ASCIZ\S\]>> ;;NOISE WORDS
DEFINE CNFIRM,<DOCMD .CMCFM> ;;CONFIRMATION
DEFINE DODSP,< ;;MACRO TO HANDLE KEYWORD DISPATCH
HRRZ T2,(T2) ;;GET THE DISPATCH ADDRESS
CALL (T2)> ;;AND GO THERE
SUBTTL Impure Data
IF2 <IFN <CSBSIZ-<.CMGJB+1>>,<PRINTX ?PROBLEM WITH CSB AND CSBV>>
CSB: BLOCK .CMGJB+1 ;COMND STATE BLOCK
BCSB: BLOCK .CMGJB+1 ;BUILD COMMAND COMND STATE BLOCK
PDL: BLOCK PDLSIZ ;STACK STORAGE
GTJFNB: BLOCK .GJATR+1 ;GTJFN BLOCK
ERRACS: BLOCK 20 ;ERROR AC STORAGE
ERRPC: Z ;ERROR PC STORAGE
TXTBUF: BLOCK <TXTSIZ/5>+1 ;COMND TEXT BUFFER
ATMBUF: BLOCK <ATMSIZ/5>+1 ;COMND ATOM BUFFER
BXTBUF: BLOCK <TXTSIZ/5>+1 ;BUILD COMND TEXT BUFFER
BTMBUF: BLOCK <ATMSIZ/5>+1 ;BUILD COMND ATOM BUFFER
DBUGSW: Z ;DEBUGING MODE SWITCH
MAXNET: Z ;MAXIMUM NETWORK INDEX
LHOSTN: BLOCK MXNETS ;OUR HOST NUMBER
LNETWN: BLOCK MXNETS ;NETWORK NUMBER (PARALLEL TO LHOSTN)
BLDIJF: Z ;MAPPING FILE INPUT JFN
BLDOJF: Z ;MAPPING FILE OUTPUT JFN
RTRJFN: Z ;RETRIEVAL FILE JFN
TCPJFN: Z ;TCP JFN
PSHFRK: Z ;FORK HANDLE FOR PUSHED EXEC
BUILDP: Z ;PDL POINTER WHEN ENTERING BUILD STUFF
LNKHED: Z ;HEAD OF LIST FOR LINKING MAPPING ENTRIES
LNKFST: Z ;FIRST FREE LINK LOCATION
NTFCNM: 0,,MXNETS ;KEYWORD TABLE FOR NETWORK INTERFACES
BLOCK MXNETS ;SPACE FOR ENTRIES
NIPTYP: BLOCK MXPTYP+1 ;SPACE FOR PROTOCOL TYPES
IPSQH: Z ;INTERNET SPECIAL QUEUE HANDLE
ASNIQB: ;ASNIQ% DESCRIPTOR BLOCK
1B31 ;ICMP PROTOCOL
Z ;ALL 4N HOSTS
Z ;OUR HOST NUMBER GOES HERE
Z ;PORT NUMBERS
Z ;PROTOCOL MASK
Z ;4N HOST MASK
Z ;LOCAL HOST MASK
Z ;PORT MASK
SNDINB: ;SNDIN% BLOCK
1+<.IPKDH-.IPKVR+1>+3 ;SNDIN% - WORD COUNT
4B3!5B7!0B15!^D32B31 ;IP - VERSION, HDR LEN, TOS, DATAGRAM LEN
0B15!2B18!0B31 ;IP - SEG ID, DONT FRAGMENT, FRAGMENT OFFSET
377B7!1B15!0B31 ;IP - TIME TO LIVE, ICMP, PROTOCOL, IP CHKSUM
Z ;SOURCE ADDRESS
Z ;DESTIONATION ADDRESS
10B7!0B15!<121253>B31 ;ICMP - ECHO TYPE AND CHECKSUM
<12525>B15!<12525>B31 ;ICMP - SEQUENCE AND DESCRIPTOR
<12525>B15!<12525>B31 ;ICMP - ECHO REPLY DATA
RCVINB: ;RCVIN% BLOCK
1+20 ;RCVIN% - WORD COUNT
BLOCK 20 ;SPACE FOR MESSAGES
SUBTTL Pure Data
XX==0
BITS: REPEAT ^D36,<EXP 1B<XX>
XX=XX+1>
PDLPTR: IOWD PDLSIZ,PDL ;STACK POINTER
CSBV: ;COMMAND STATE BLOCK
CM%RAI!RPARSE ;RAISE ALL INPUT TO UPPER CASE...REPARSE ADR
.PRIIN,,.PRIOU ;IO DESIGNATORS
-1,,[ASCIZ/IPHOST>/] ;PROMPT TEXT
-1,,TXTBUF ;TEXT BUFFER POINTER
-1,,TXTBUF ;FIRST INPUT TO PARSE
EXP TXTSIZ ;SIZE OF TEXT BUFFER
Z ;COUNT OF UNPARSED CHARACTERS
-1,,ATMBUF ;ATOM BUFFER POINTER
EXP ATMSIZ ;ATOM BUFFER SIZE
EXP GTJFNB ;GTJFN BLOCK
CSBSIZ==.-CSBV
BCSBV: ;COMMAND STATE BLOCK FOR BUILD COMMAND
EXP BPARSE ;REPARSE ADDRESS
Z ;NO JFNS
-1,,[0] ;NO PROMPT
-1,,BXTBUF ;TEXT BUFFER POINTER
-1,,BXTBUF ;FIRST INPUT TO PARSE
EXP TXTSIZ ;SIZE OF TEXT BUFFER
Z ;COUNT OF UNPARSED CHARACTERS
-1,,BTMBUF ;ATOM BUFFER POINTER
EXP ATMSIZ ;ATOM BUFFER SIZE
Z ;NO GTJFN BLOCK
BCSBSZ==.-BCSBV
SUBTTL Pure Data - 1822 Stuff
SYSTYP: ;OPERATING SYSTEM TYPE TABLE
[ASCIZ/Unknown/] ;0
[ASCIZ/Tenex/] ;1
[ASCIZ/ITS/] ;2
[ASCIZ/TOPS-10/] ;3
[ASCIZ/Tip/] ;4
[ASCIZ/Mtip/] ;5
[ASCIZ/Elf/] ;6
[ASCIZ/Ants/] ;7
[ASCIZ/Multics/] ;10
[ASCIZ/TOPS-20/] ;11
[ASCIZ/Unix/] ;12
[ASCIZ/Network/] ;13
[ASCIZ/Fuzzball/] ;14
[ASCIZ/VMS/] ;15
[ASCIZ/TAC/] ;16
[ASCIZ/MSDOS/] ;17
TYPMAX=.-SYSTYP-1
RSN182: ;1822 Reason Codes
-1,,[ASCIZ/Unknown (0)/] ;0
-1,,[ASCIZ/Not ready/] ;1
-1,,[ASCIZ/Tardy/] ;2
-1,,[ASCIZ/Nonexistant/] ;3
-1,,[ASCIZ/IMP reinitialization/] ;4
-1,,[ASCIZ/Scheduled pm/] ;5
-1,,[ASCIZ/Scheduled hardware work/] ;6
-1,,[ASCIZ/Scheduled software work/] ;7
-1,,[ASCIZ/Emergency restart/] ;8
-1,,[ASCIZ/Power outage/] ;9
-1,,[ASCIZ/Software breakpoint/] ;10
-1,,[ASCIZ/Hardware failure/] ;11
-1,,[ASCIZ/Scheduled down/] ;12
-1,,[ASCIZ/Unknown (13)/] ;13
-1,,[ASCIZ/Unknown (14)/] ;14
-1,,[ASCIZ/Coming up/] ;15
WEKDAY: ; DAYS OF THE WEEK
[ASCIZ/Sunday/]
[ASCIZ/Monday/]
[ASCIZ/Tuesday/]
[ASCIZ/Wednesday/]
[ASCIZ/Thursday/]
[ASCIZ/Friday/]
[ASCIZ/Saturday/]
WEKMAX==.-WEKDAY-1
SUBTTL Pure Data - Ethernet Status Stuff
NISTAT: ;ETHERNET CHANNEL STATES
-1,,[ASCIZ/Undefined/]
-1,,[ASCIZ/Virgin/]
-1,,[ASCIZ/Reloading/]
-1,,[ASCIZ/Reload Failed/]
-1,,[ASCIZ/Initialized/]
-1,,[ASCIZ/Running/]
-1,,[ASCIZ/Dump requested/]
-1,,[ASCIZ/Dump & Reload requested/]
-1,,[ASCIZ/Broken/]
-1,,[ASCIZ/Disabled/]
-1,,[ASCIZ/Reload Requested/]
NISTMX==.-NISTAT-1 ;MAX VALUE
NICONT: -1,,[ASCIZ/Seconds since last zeroed: /]
-1,,[ASCIZ/Bytes received: /]
-1,,[ASCIZ/Bytes sent: /]
-1,,[ASCIZ/Datagrams received: /]
-1,,[ASCIZ/Datagrams sent: /]
-1,,[ASCIZ/Multicast bytes received: /]
-1,,[ASCIZ/Multicast datagrams received: /]
-1,,[ASCIZ/Datagrams sent, initially deferred: /]
-1,,[ASCIZ/Datagrams sent, single collision: /]
-1,,[ASCIZ/Datagrams sent multiple collisions: /]
-1,,[ASCIZ/Send failures: /]
Z
-1,,[ASCIZ/Receive failures: /]
Z
-1,,[ASCIZ/Unrecognized frame destination: /]
-1,,[ASCIZ/Data overrun: /]
-1,,[ASCIZ/System buffer unavailable: /]
-1,,[ASCIZ/User buffer unavailable: /]
NICNMX==.-NICONT-1
NISFAL: ;SEND FAILURE BITS
-1,,[ASCIZ/Loss of carrier/]
-1,,[ASCIZ/Xmit buffer parity error/]
-1,,[ASCIZ/Remote failure to defer/]
-1,,[ASCIZ/Xmitted frame too long/]
-1,,[ASCIZ/Open circuit/]
-1,,[ASCIZ/Short circuit/]
-1,,[ASCIZ/Collision detect check failed/]
-1,,[ASCIZ/Excessive collisions/]
NISFMX==.-NISFAL-1
NIRFAL: ;RECEIVE FAILURE BITS
-1,,[ASCIZ/Free list parity error/]
-1,,[ASCIZ/No free buffers/]
-1,,[ASCIZ/Frame too long/]
-1,,[ASCIZ/Framing error/]
-1,,[ASCIZ/Block check error/]
NIRFMX==.-NIRFAL-1
PICONT:
-1,,[ASCIZ/Seconds since last zeroed/]
-1,,[ASCIZ/Bytes received/]
-1,,[ASCIZ/Datagrams received/]
-1,,[ASCIZ/Bytes sent/]
-1,,[ASCIZ/Datagrams sent/]
-1,,[ASCIZ/User buffer unavailable/]
SUBTTL Command Keyword Tables
CMDCFB: <.CMKEY>B8<.+4>B35 ;CFB FOR PRIMARY COMMANDS WHEN A WHEEL
EXP PCMDS
EXP 0,0
<.CMKEY>B8
EXP WCMDS
EXP 0,0
WCMDS: NWCMDS,,NWCMDS ;PRIMARY COMMANDS FOR WHEELS
CMD AN2,<0>,CM%NOR ;PREVENT A MATCH
CMD AN20,,CM%INV ;AN20 MANIPULATION COMMANDS
CMD BUILD, ;BUILD THE ETHERNET FILES
CMD ETHERNET, ;CONTROL THE ETHERNET
CMD INTERNET, ;INTERNET CONTROL
CMD LOAD, ;LOAD TABLES
CMD MDDT,,CM%INV ;GO TO MDDT
CMD POKE,,CM%INV ;POKE ALL HOSTS WITH AN IP NOP
CMD RETRIEVE, ;GET TABLES AND INFORMATION FROM THE NIC
NWCMDS==.-WCMDS-1
PCMDS: NPCMDS,,NPCMDS ;PRIMARY COMMANDS FOR NON WHEELS
CMD CONVERT, ;CONVERT NUMBERS TO OTHER FORMATS
CMD DDT,,CM%INV ;GO TO DDT
CMD DISABLE,,CM%INV ;DISABLE US
CMD ENABLE,,CM%INV ;ENABLE US IF POSSIBLE
CMD EXIT, ;RETURN TO LOWER FORK
CMD HELP, ;TYPE OUT HELP STRING
CMD INFORMATION, ;DISPLAY INFORMATION
CMD LOCAL, ;LOCAL HOST INFORMATION
CMD NAME, ;SPECIFIC HOST NAME INFORMATION
CMD NUMBER, ;SPECIFIC HOST NUMBER INFORMATION
CMD PUSH, ;PUSH TO A NEW EXEC
CMD QUIT,.EXIT,CM%INV ;SAME AS EXIT
CMD RELOAD,,CM%INV ;FORCE HOST TABLE RELOAD POINT
CMD VALID, ;SAME AS NAME COMMAND BUT ONLY SHOW VALID STATUS
CMD VERSION,,CM%INV ;VERSION INFORMATION
NPCMDS==.-PCMDS-1
ACMDS: NACMDS,,NACMDS ;INTERNET SUBCOMMANDS
CMD BYPASS,.INETB ;BYPASS CONTROL
CMD CYCLE,.INETC ;CYCLE ALL INTERFACES
CMD DISABLE,.INETD ;DISABLE ALL INTERFACES
CMD ENABLE,.INETE ;ENABLE ALL INTERFACES
CMD INTERFACE,.INETF ;CHANGE INTERFACE STATUS
CMD NETWORK,.INETW ;CHANGE NETWORK STATUS
NACMDS==.-ACMDS-1
BYCMDS: NBYCMD,,NBYCMD ;BYPASS SUBCOMMANDS
CMD OFF,0 ;OFF
CMD ON,1 ;ON
NBYCMD==.-BYCMDS-1
INCMDS: NINCMD,,NINCMD ;INITIALIZE SUBCOMMANDS
CMD GATEWAY,.IGATE ;INITIALIZE GATEWAY TABLES
CMD HOST,.IHOST ;INITIALIZE HOST TABLES
NINCMD==.-INCMDS-1
SUBTTL Command Keyword Tables Continued
SCMDS: NSCMDS,,NSCMDS ;NETWORK STATE COMMANDS
CMD CYCLE,1 ;CYCLE
CMD OFF,0 ;OFF
CMD ON,-1 ;ON
NSCMDS==.-SCMDS-1
CCMDS: NCCMDS,,NCCMDS ;CONVERT COMMANDS
CMD DECNET, ;DECNET NODE NUMBER
CMD ETHERNET,.CETHE ;CONVERT ETHERNET NODE NUMBER
CMD INTERNET,.CINTER ;CONVERT INTERNET HOST NUMBER
NCCMDS==.-CCMDS-1
HCMDS: NHCMDS,,NHCMDS ;CONVERT HOST SUBCOMMANDS
CMD DECIMAL, ;FROM DECIMAL
CMD INTERNET,.HINTE ;FROM INTERNET OCTET FORMAT
CMD OCTAL, ;FROM OCTAL
NHCMDS==.-HCMDS-1
ICMDS: NICMDS,,NICMDS ;INFORMATION COMMANDS
CMD BYPASS,.BSTAT ;BYPASS STATUS COMMAND
CMD GATEWAY, ;GATEWAY STATUS COMMAND
CMD NETWORK, ;NETWORK STATUS COMMAND
NICMDS==.-ICMDS-1
ECMDS: NECMDS,,NECMDS ;ETHERNET SUBCOMMANDS
CMD ARP,E.ARP ;ARP CONTROL
CMD INITIALIZE,E.INIT ;INITIALIZE ETHERNET HOST TABLE
CMD IP,E.IP ;INTERNET CONTROL
CMD STATUS,E.STAT ;REPORT ETHERNET STATUS
NECMDS==.-ECMDS-1
EACMDS: NEACMD,,NEACMD ;ENABLE/DISABLE SUBCOMMANDS
CMD DISABLED,0 ;DISABLE
CMD ENABLED,1 ;ENABLED
NEACMD==.-EACMDS-1
BCMDS: NBCMDS,,NBCMDS ;BUILD COMMAND KEYWORDS
CMD HOST, ;HOST COMMAND
NBCMDS==.-BCMDS-1
NNCMDS: NNNCMD,,NNNCMD ;NAME SUBCOMMANDS
CMD GATEWAY,.NGATE ;GATEWAY NAMES
CMD NETWORK,.NNETW ;NETWORK NAMES
CMD SERVER,.NSERV ;SERVER NAMES
CMD USER,.NUSER ;USER NAMES
NNNCMD==.-NNCMDS-1
HSCMDS: NHSCMD,,NHSCMD ;HOST COMMAND SWITCHES
CMD ARP,.HARP ;HOST DOES ARP
CMD NOARP,.HNARP ;HOST DOES NOT DO ARP
NHSCMD==.-HSCMDS
INSCMD: NINSCM,,NINSCM ;INFORMATION NETWORK SUBCOMMANDS
CMD ALL, ;ALL INTERFACES
CMD INTERFACE,.INTRF ;A SPECIFIC INTERFACE
NINSCM==.-INSCMD-1
ANCMDS: NANCMS,,NANCMS ;SUBCOMMANDS FOR THE AN20
CMD ASSERT,.ANASS ;TURN ON THE READY LINE
CMD RESET,.ANRST ;RESET THE AN20
CMD REVOKE,.ANREV ;TURN OFF THE READY LINE
CMD STATUS,.ANSTS ;PRINT OUT DEVICE STATUS
NANCMS==.-ANCMDS-1
HSWCFB: <.CMSWI>B8!<.+4>B35 ;CFB FOR HOST COMMAND SWITCHES
EXP HSCMDS ;SWITCHES
Z ;HELP
Z ;DEFAULT
<.CMCFM>B8 ;CONFIRM FUNCTION
Z
Z
Z
RCMDS: NRCMDS,,NRCMDS ;RETRIEVE COMMAND SUBCOMMANDS
CMD GATEWAY,.RGATE ;RETRIEVE GATEWAY TABLE
CMD HOST,.RHOST ;RETRIEVE HOST TABLE
CMD OLD-HOST,.ROHST ;RETRIEVE OLD HOST TABLE
NRCMDS==.-RCMDS-1
SUBTTL Help Text
HLPTXT: ASCIZ/
The following commands exist:
Command Description
------------------------------------------------------------------------
CONVERT Convert host numbers from one format to the other
formats.
EXIT Return to EXEC level.
HELP Type this text.
INFORMATION Return information about network interface status.
LOCAL Dump information about the local host.
NAME Dump information about a specific host given the name or
a group of hosts given a wild card string.
NUMBER Dump information about a specific host given the number.
The number is in the format aaa.bbb.ccc.ddd.
PUSH Push to a new EXEC.
VALID Return information on hosts with known status. Same
arguments as the NAME command.
/
HLPHLY: ASCIZ /
The following privileged commands exist:
Command Description
------------------------------------------------------------------------
BUILD Build internet ethernet address translation files.
ETHERNET Perform various Ethernet control functions.
INTERNET Perform various Internet internet control functions.
LOAD Reload monitor's copy of the host table.
RETRIEVE Copy Host and Gateway tables from the NIC name server.
/
SUBTTL Mainline
EVEC: ;ENTRY VECTOR
JRST IPHOST ;STARTING ADDRESS
JRST IPHSTR ;REENTER ADDRESS
EXP VERSIO ;VERSION INFORMATION
EVECL==.-EVEC ;LENGTH OF ENTRY VECTOR
IPHOST: ;STARTING ADDRESS
RESET ;ALWAYS CLEAN UP
MOVE P,PDLPTR ;GET STACK POINTER
SETZ F, ;RESET FLAGS
MOVX T1,<CSBV,,CSB> ;GET BLT AC
BLT T1,CSB+CSBSIZ-1 ;INITIALIZE COMND STATE BLOCK
CALL VEROUT ;OUTPUT THE VERSION INFORMATION
MOVEI T1,.FHSLF ;THIS FORK
RPCAP% ;GET MY PRIVS
JSYSF
TXNE T3,SC%WHL!SC%OPR!SC%MNT ;ARE WE HOLY?
SETONE F%HOLY ;YES
CALL LCLADR ;GET ALL OUR LOCAL ADDRESSES
TYPE <>
TYPE <>
SETONE F%INIT ;SET THE INIT DONE FLAG
JRST GETCMD ;AND GET THE FIRST COMMAND
IPHSTR: ;REENTER ADDRESS
JE F%INIT,,IPHOST ;DO INIT NOW IF NEEDED
GETCMD: ;HERE TO START UP A COMMAND
DOCMD .CMINI ;START UP A COMMAND
RPARSE: ;REPARSE DISPATCH ADDRESS
MOVE P,PDLPTR ;REFRESH STACK POINTER
CALL CLNJFN ;CLEAN UP LEFTOVER JFNS
MOVE T1,IPSQH ;GET THE QUEUE HANDLE
TMNE F%IPSQ ;SPECIAL QUEUE ASSIGNED?
RELIQ% ;YES SO RELEASE IT
JSYSF
SETZRO F%IPSQ ;NO SPECIAL QUEUE ANYMORE
JN F%HOLY,,RPARS2 ;IF A WHEEL DO DIFFERENT STUFF
DOCMD .CMKEY,PCMDS ;GET A PRIMARY COMMAND
JRST RPARS3 ;GO JOIN NORMAL FLOW
RPARS2: ;HERE IF WE ARE A WHEEL
MOVEI T2,CMDCFB ;GET THE CFB ADDRESS
CALL .DOCMD ;DO THE WORK WITH COMND
RPARS3: ;NORMAL COMMAND FLOW
DODSP ;DISPATCH ON COMMAND
JRST GETCMD ;AND GET ANOTHER COMMAND
SUBTTL Local Address Handling
LCLADR: ;ROUTINE TO GET ALL OUR LOCAL ADDRESS INFO
TYPE <>
SETZM MAXNET ;ASSUME NO INTERFACES
MOVEI T1,MXNETS ;GET NUMBER OF NETS SUPPORTED
MOVEM T1,NTFCNM ;INTIALIZE THE INTERFACE KEYWORD TABLE
MOVEI T1,.GTHLA ;LOCAL HOST NUMBERS FUNCTION
MOVEI T3,LHOSTN ;DESTINATION ADDRESS
MOVEI T4,MXNETS ;NUMBER OF NETWORKS WE SUPPORT
GTHST% ;GET OUR HOST NUMBER
ERJMP LCLAD4 ;HANDLE ERROR
JUMPE T4,LCLAD4 ;HANDLE NO DEFINED INTERFACES
MOVEM T4,MAXNET ;SAVE THE NUMBER OF INTERFACES PRESENT
MOVN NT,MAXNET ;GET THE NUMBER OF INTERFACES
HRLZS NT ;GET THE COUNT INTO LEFT HALF
MOVEI NN,INTNAM ;INITIALIZE INTERFACE NAME STORAGE POINTER
LCLAD1: ;INTERFACE NAME LOOP
MOVE T1,LHOSTN(NT) ;GET THE HOST NUMBER
MOVE T2,LHOSTN(NT) ;GET THE HOST NUMBER
TXNN T2,<BYTE (4)0(8)200,0,0,0> ;CLASS A?
TXZ T1,<BYTE (4)0(8)0,377,377,377> ;YES
TXNE T2,<BYTE (4)0(8)200,0,0,0> ;CLASS B?
TXNE T2,<BYTE (4)0(8)100,0,0,0> ;CLASS B?
SKIPA ;NOT CLASS B
TXZ T1,<BYTE (4)0(8)0,0,377,377> ;YES
TXNE T2,<BYTE (4)0(8)200,0,0,0> ;CLASS C?
TXNN T2,<BYTE (4)0(8)100,0,0,0> ;CLASS C?
SKIPA ;NOT CLASS C
TXZ T1,<BYTE (4)0(8)0,0,0,377> ;YES
MOVEM T1,LNETWN(NT) ;SAVE THE NETWORK NUMBER
MOVEI T1,.GTHNS ;GET NAME STRING FUNCTION
MOVEI T2,(NN) ;GET THE STRING ADDRESS
TXO T2,<POINT 7,> ;MAKE IT A BYTE POINTER
MOVE T3,LNETWN(NT) ;GET THE NETWORK NUMBER
GTHST% ;GET THE NAME OF THIS NETWORK
ERJMP LCLAD2 ;NO NAME FOR THIS NETWORK
MOVEI T1,NTFCNM ;GET ADDRESS OF THE TABLE
HRRZS T2 ;ZERO THE LEFT HALF
MOVEI T2,1(T2) ;BUMP THE ADDRESS BY ONE
EXCH T2,NN ;FIX UP THE POINTERS
HRLS T2 ;NAME ADR INTO LEFT HALF
HRR T2,NT ;PUT INTERFACE INDEX INTO RIGHT HALF
TBADD% ;ADD THIS NAME TO THE TABLE
JSYSF ;HANDLE AND ERRORS
LCLAD2: ;HERE TO CHECK OUT THE NEXT INTERFACE
AOBJN NT,LCLAD1 ;LOOP FOR ALL THE INTERFACES
MOVN NT,MAXNET ;GET THE HIGHEST NETWORK NUMBER
HRLZS NT ;MAKE AN AOBJN POINTER
LCLAD3: ;LOOP FOR OUTPUTING ADDRESSES
TYPE <Interface # >
MOVEI T2,(NT) ;GET THE INTERFACE NUMBER
NUMO T2,10,0 ;OUTPUT THE NUMBER
TYPEN <, net # >
MOVE T1,LNETWN(NT) ;GET THE NETWORK NUMBER
CALL OCTETS ;OUTPUT NETWORK NAME AND NUMBER
TYPEN <, adr >
MOVE T1,LHOSTN(NT) ;GET THE HOST NUMBER
CALL OCTETS ;OUTPUT HOST NAME AND NUMBER
AOBJN NT,LCLAD3 ;LOOP FOR ALL THE INTERFACES
RET ;RETURN TO CALLER WHEN ALL ARE DONE
LCLAD4: ;HERE WHEN IT APPEARS WE HAVE NO NETWORK
TYPE <%Monitor does not support Internet or no interfaces defined>
RET ;RETURN TO CALLER
SUBTTL CLNJFN - Abort and/or Release Left Over JFNs
CLNJFN: ;ROUTINE TO CLEAN UP JFNS FROM COMMANDS
MOVE T1,BLDIJF ;GET THE INPUT JFN
TMNE F%BIJ ;NEED TO RELEASE THIS JFN?
RLJFN% ;YES SO RELEASE IT
JSYSF
TMNE F%BIO ;NEED TO CLOSE THIS JFN?
CLOSF% ;YES SO CLOSE IT
JSYSF
MOVE T1,BLDOJF ;GET THE OUTPUT JFN
TMNE F%BOJ ;NEED TO RELEASE THIS?
RLJFN% ;YES SO DO IT
JSYSF
TXO T1,CZ%ABT ;ABORT THIS JFN
TMNE F%BOO ;NEED TO CLOSE THIS JFN?
CLOSF% ;YES SO DO IT
JSYSF
MOVE T1,RTRJFN ;GET THE RETRIEVE JFN
TMNE F%ROJ ;NEED TO RELEASE THIS?
RLJFN% ;YES SO DO IT
JSYSF
TXO T1,CZ%ABT ;ABORT THIS JFN
TMNE F%ROO ;NEED TO CLOSE THIS JFN?
CLOSF% ;YES SO DO IT
JSYSF
MOVE T1,TCPJFN ;GET THE TCP JFN
TMNE F%TOJ ;NEED TO RELEASE THIS?
RLJFN% ;YES SO DO IT
JSYSF
TXO T1,CZ%ABT ;ABORT THIS JFN
TMNE F%TOO ;NEED TO CLOSE THIS JFN?
CLOSF% ;YES SO DO IT
JSYSF
SETZRO F%FILE ;RESET ALL THE FILE FLAGS
RET
SUBTTL COMND JSYS Handling Routine
.DOCMD: ;HERE FROM DOCMD MACRO
MOVEI T1,CSB ;GET ADDRESS OF COMND STATE BLOCK
COMND ;DO THE JSYS
ERJMP .JSYSC ;HANDLE REAL BAD ERRORS
JE CM%NOP,T1,R ;DONE IF NO PARSE ERRORS
.JSYSC: ;HERE ON ERROR OR NOPARSE
CALL NEWLIN ;GET A NEW LINE
TYPEN <?> ;PROMPT ERROR STRING
MOVEI T1,.PRIOU ;OUTPUT TO TTY
MOVX T2,<.FHSLF,,-1> ;MY LAST ERROR
SETZB T3,T4 ;NO FUNNY LIMITS
ERSTR ;OUTPUT THE ERROR STRING
NOERR ;HANDLE ERRORS
NOERR ;HANDLE ERRORS
JRST GETCMD ;GO GET ANOTHER COMMAND
NEWLIN: ;HERE TO GET A NEW LINE IF NEEDED
MOVEI T1,.PRIOU ;MY TTY
RFPOS ;GET ITS POSITION
NOERR ;HANDLE ERRORS
HRRZS T2 ;ZERO LEFT HALF
SKIPN T2 ;ARE WE AT THE LEFT MARGIN?
RET ;YES SO RETURN
TYPE <> ;NO SO GET A NEW LINE
RET ;AND RETURN
SUBTTL JSYS ERROR Handler and AC Save Facility
.JSYSF: ;HERE FROM JSYSF MACRO
MOVEM AC17,ERRACS+AC17 ;SAVE AC 17
MOVEI AC17,ERRACS ;GET BLT AC
BLT AC17,ERRACS+AC16 ;SAVE ACS 0-16
MOVE AC17,ERRACS+AC17 ;GET AC 17 BACK
CALL NEWLIN ;GET A NEW LINE
TYPEN <?JSYS error at user PC >
HRRZ T2,0(P) ;GET THE ERROR PC
MOVEM T2,ERRPC ;SAVE THE ERROR PC
NUMO T2,10 ;OUTPUT THE ERORR PC
TYPE <?> ;PROMPT THE ERROR STRING
MOVEI T1,.PRIOU ;OUTPUT TO TTY
MOVX T2,<.FHSLF,,-1> ;MY LAST ERROR
SETZB T3,T4 ;NO FUNNY LIMITS
ERSTR ;OUTPUT THE ERROR STRING
NOERR ;HANDLE ANY ERRORS
NOERR ;HANDLE ANY ERRORS
SKIPE DBUGSW ;ARE WE DEBUGING?
CALL TODDT ;YES SO GO TO DDT
JN F%INIT,,GETCMD ;IF WE HAVE INITED GO GET A COMMAND
KILLUS:
HALTF ;OTHERWISE STOP
JRST .-1 ;WITHOUT CONTINUES
.SAVAC: ;ROUTINE TO SAVE ACS ON STACK
ADJSP P,^D14 ;GET ROOM ON THE STACK
MOVEM AC16,0(P) ;SAVE AC 16
MOVEI AC16,-^D13(P) ;GET RIGHT HALF OF BLT AC
HRLI AC16,AC1 ;GET LEFT HALF OF BLT AC
BLT AC16,-1(P) ;SAVE ACS 1-15
MOVE AC16,0(P) ;RESTORE AC 16
CALL @-^D14(P) ;GO BACK TO CALLER
.RSTAC: ;HERE TO RESTORE ACS
SKIPA ;NON-SKIP RETURN
AOS -^D15(P) ;SKIP RETURN...BUMP RETURN PC
HRLI AC16,-^D13(P) ;GET BLT AC LEFT
HRRI AC16,AC1 ;GET BLT AC RIGHT
BLT AC16,AC16 ;RESTORE ACS
ADJSP P,-^D15 ;FIX UP THE STACK
RET ;RETURN TO ORIGINAL
SUBTTL Simple Commands
.EXIT: ;RETURN TO EXIT
NOISE <FROM IPHOST> ;HELP OUT THE USER
CNFIRM ;MAKE SURE
HALTF ;STOP
RET ;ON CONTINUE RETURN
.HELP: ;HELP STRING TYPEOUT
NOISE <WITH IPHOST> ;HELP OUT THE USER
CNFIRM ;MAKE SURE
HRROI T1,HLPTXT ;GET HELP TEXT POINTER
PSOUT ;AND OUTPUT IT
JE F%HOLY,,R ;IF NOT HOLY WE ARE ALL DONE
HRROI T1,HLPHLY ;GET HOLY HELP TEXT POINTER
PSOUT ;AND OUTPUT IT
RET ;AND GET ANOTHER COMMAND
.MDDT: ;GO TO MDDT
NOISE <MODE> ;HELP OUT THE USER
CNFIRM ;MAKE SURE
MDDT% ;GO TO MDDT
JSYSF ;HANDLE ERRORS
RET ;GET ANOTHER COMMAND
.ENABL: ;ENABLE COMMAND
NOISE <THIS PROCESS>
CNFIRM ;MAKE SURE
MOVEI T1,.FHSLF ;THIS FORK
SETOB T2,T3 ;ALL PRIVS
EPCAP% ;ENABLE THEM
JSYSF
JRST IPHOST ;NOW RESTART
.DISAB: ;DISABLE COMMAND
NOISE <THIS PROCESS>
CNFIRM ;MAKE SURE
MOVEI T1,.FHSLF ;THIS FORK
RPCAP% ;GET OUR PRIVS
JSYSF
HLLZS T3 ;TURN OFF SPECIAL PRIVS
EPCAP% ;DISABLE THEM
JSYSF
JRST IPHOST ;NOW RESTART
RSKP: AOS (P) ;SKIP RETURN
R: RET ;NON SKIP RETURN
SUBTTL Reload Command
.RELOA: ;RELOAD HOST TABLES
NOISE <INTERNAL HOST TABLES>
CNFIRM ;MAKE SURE
STKVAR <RLDTT>
SETZM RLDTT ;ZERO THE TOTAL
SETONE F%HSOB ;ALLOW BITCHING
CALL HSTLDF ;LOAD THEM UP
TYPE <Host tables loaded. >
TYPE <>
HRRZ T2,SHSTNM ;GET NUMBER OF SERVER HOSTS
ADDM T2,RLDTT ;ADD TO THE TOTAL
NUMO T2,12 ;OUTPUT COUNT
TYPEN < server host names.>
TYPE <>
HRRZ T2,SHSTNN ;GET NUMBR OF SERVER NICKNAMES
ADDM T2,RLDTT ;ADD TO THE TOTAL
NUMO T2,12 ;OUTPUT COUNT
TYPEN < server host nicknames.>
TYPE <>
HRRZ T2,UHSTNM ;GET NUMBER OF USER HOSTS
ADDM T2,RLDTT ;ADD TO THE TOTAL
NUMO T2,12 ;OUTPUT COUNT
TYPEN < user host names.>
TYPE <>
HRRZ T2,UHSTNN ;GET NUMBER OF USER NICKNAMES
ADDM T2,RLDTT ;ADD TO THE TOTAL
NUMO T2,12 ;OUTPUT COUNT
TYPEN < user host nicknames.>
TYPE <>
HRRZ T2,GHSTNM ;GET NUMBER OF GATEWAYS
ADDM T2,RLDTT ;ADD TO THE TOTAL
NUMO T2,12 ;OUTPUT COUNT
TYPEN < Gateway names.>
TYPE <>
HRRZ T2,NHSTNM ;GET NUMBER OF NETWORK NAMES
ADDM T2,RLDTT ;ADD TO THE TOTAL
NUMO T2,12 ;OUTPUT COUNT
TYPEN < Network names.>
TYPE <>
NUMO RLDTT,12 ;OUTPUT TOTAL NUMBER OF HOST NAMES
TYPEN < names total.>
TYPE <>
TYPE <>
RET ;AND GET ANOTHER COMMAND
SUBTTL DDT Command and Routines
.DDT: ;GO TO UDDT
NOISE <MODE> ;HELP OUT THE USER
CNFIRM ;MAKE SURE
CALL TODDT ;GO TO DDT
RET ;NON SKIP RETURN
TODDT: ;ROUTINE TO SEND US TO DDT
CALL TODDT0 ;CALL WORKER ROUTINE
CALL DDTADR ;GO TO DDT
RET ;RETURN FOR ANOTHER COMMAND
TODDT0: ;WORKER ROUTINE TO GET DDT
SAVACS ;SAVE ACS SO DDT WILL GET THE CORRECT ACS
MOVE T1,[.FHSLF,,<DDTADR/1000>]; SEE IF A PAGE OF DDT EXISTS
RPACS% ;GET PAGE ACCESSABILITY
JSYSF
JE PA%PEX,T2,TODDT1 ;LOAD DDT IF PAGE DOES NOT EXIST
MOVE T1,DDTADR ;GET DDT START LOCATION
CAMN T1,[JRST DDTADR+2] ;LOOK LIKE A DDT?
JRST TODDT2 ;YES, ENTER IT
TODDT1: ;HERE TO LOAD DDT
MOVX T1,<GJ%OLD!GJ%SHT> ;NO, GET A JFN ON DDT
HRROI T2,[ASCIZ/SYS:UDDT.EXE/] ;WHERE DDT LIVES
GTJFN% ;GET A JFN ON DDT
JSYSF ;DDT NOT AVAILABLE
HRLI T1,.FHSLF ;THIS FORK
GET% ;LOAD DDT IN
JSYSF ;HANDLE ERRORS
DMOVE T1,.JBSYM## ;GET SYMBOL TABLE POINTERS
DMOVEM T1,@DDTADR+1 ;AND SHOVE THEM INTO DDT
MOVEI T1,.FHSLF ;DAMN GET% SETS THE EVEC TO BE DDT, SO
MOVE T2,[EVECL,,EVEC] ;WE'LL SET IT BACK!
SEVEC% ;SET THE ENTRY VECTOR
JSYSF ;HANDLE ERRORS
TODDT2:
CALL NEWLIN ;GIVE US A NEW LINE
TYPEN <[Type R$G to return to IPHOST]>
TYPE <>
RET ;RETURN...CALLER WILL PUT US IN DDT
SUBTTL INTERNET Command
.INTER: ;INTERNET COMMAND
DOCMD .CMKEY,ACMDS,<NETWORK> ;GET THE ARPANET COMMAND
DODSP ;DISPATCH ON THE COMMAND
RET ;RETURN TO CALLER AFTER SUBCOMMAND
.INETD: ;INTERNET DISABLE COMMAND
NOISE <ALL INTERFACES> ;HELP OUT THE USER
CNFIRM ;MAKE SURE
SETZ T1, ;OK SET FLAG FOR DISABLE
CALL DONETS ;AND DO IT
RET
.INETC: ;INTERNET CYCLE COMMAND
NOISE <ALL INTERFACES> ;HELP OUT THE USER
CNFIRM ;MAKE SURE
MOVEI T1,1 ;OK SET FLAG FOR CYCLE
CALL DONETS ;AND DO IT
RET
.INETE: ;INTERNET ENABLE COMMAND
NOISE <ALL INTERFACES> ;HELP OUT THE USER
CNFIRM ;MAKE SURE
SETO T1, ;OK SET FLAG FOR ENABLE
CALL DONETS ;AND DO IT
RET
DONETS: ;WORKER ROUTINE FOR SETTING STATE OF ALL NETS
STKVAR <DONTF>
MOVEM T1,DONTF ;SAVE THE FLAG
MOVN NT,MAXNET ;GET THE HIGHEST NETWORK NUMBER
HRLZS NT ;MAKE AN AOBJN POINTER
DONET2: ;TOP OF LOOP
MOVEI T1,.IPSNT ;GET THE IPOPR FUNCTION
MOVE T2,LNETWN(NT) ;GET THE NETWORK NUMBER
MOVE T3,DONTF ;GET THE NEW STATE
IPOPR% ;CHANGE NETWORK STATE
JSYSF
AOBJN NT,DONET2 ;LOOP FOR ALL INTERFACES
RET ;AND RETURN
.INETF: ;INTERNET INTERFACE COMMAND
NOISE <NUMBER>
DOCMD .CMNUM,10 ;INPUT A NUMBER
MOVE NT,T2 ;SAVE THE INTERFACE NUMBER
.INET1: ;COMMON CODE
NOISE <IS>
DOCMD .CMKEY,SCMDS,<ON> ;GET THE STATE COMMAND
HRRE X1,0(T2) ;GET THE STATE CODE
CNFIRM ;MAKE SURE THE USER WANTS THIS
SKIPL NT ;IS INTERFACE NUMBER LEGIT?
CAML NT,MAXNET ;LEGIT NUMBER?
JRST .INET2
MOVEI T1,.IPSNT ;GET THE IPOPR FUNCTION
MOVE T2,LNETWN(NT) ;GET THE NETWORK NUMBER
MOVE T3,X1 ;GET THE NEW STATE
IPOPR% ;CHANGE NETWORK STATE
JSYSF
RET ;RETURN TO CALLER
.INET2:
TYPE <?No such interface>
TYPE <>
TYPE <>
RET
.INETW: ;INTERNET NETWORK COMMAND
DOCMD .CMKEY,NTFCNM ;GET THE INTERFACE NAME
HRRZ NT,(T2) ;GET THE INDEX
JRST .INET1 ;JOIN COMMON CODE
.INETB: ;INTERNET BYPASS COMMAND
STKVAR <BYPFLG>
DOCMD .CMKEY,BYCMDS,<STATUS> ;GET A KEYWORD
HRRE T2,0(T2) ;GET THE ACTION FLAG?
MOVEM T2,BYPFLG ;SAVE THE FLAG
CNFIRM ;CONFIRM THE COMMAND
MOVE T2,BYPFLG ;GET THE FLAG BACK
MOVEI T1,.IPSIB ;SET BYPASS STATE
IPOPR% ;CHANGE THE BYPASS STATE
JSYSF
RET ;GET ANOTHER COMMAND
SUBTTL LOAD Command
.LOAD: ;LOAD TABLES COMMAND
DOCMD .CMKEY,INCMDS,<HOST> ;GET A KEYWORD
DODSP ;DISPATCH ON THE KEYWORD
RET ;RETURN FOR ANOTHER COMMAND
.IGATE: ;ARPANET INITIALIZE GATEWAY (TABLES) COMMAND
NOISE <TABLES> ;HELP OUT THE USER
CNFIRM ;MAKE SURE THE USER WANTS THIS
MOVEI T1,.IPGWY ;INITIALIZE GATEWAY FUNCTION
IPOPR% ;PERFORM THE FUNCTION
JSYSF ;HANDLE ERRORS
RET ;AND RETURN FOR ANOTHER COMMAND
.IHOST: ;ARPANET INITIALIZE HOST (TABLES) COMMAND
NOISE <TABLES> ;HELP OUT THE USER
CNFIRM ;MAKE SURE
MOVEI T1,.IPINI ;INTIALIZE HOST TABLE FUNCTION
IPOPR% ;PERFORM THE FUNCTION
JSYSF
SETONE F%HSOB ;ALLOW BITCHING
CALL HSTLDF ;RELOAD INTERNAL HOST TABLES
RET ;GET ANOTHER COMMAND
SUBTTL Push Command
.PUSH: ;PUSH TO A NEW EXEC COMMAND
NOISE <TO A NEW EXEC>
CNFIRM ;MAKE SURE USER WANTS THIS
JN F%PUSH,,.PUSH3 ;HERE WHEN WE ALLREADY HAVE AN EXEC
STKVAR <PSHJFN>
MOVX T1,<GJ%SHT!GJ%OLD> ;FILE MUST EXIST
HRROI T2,[ASCIZ/DEFAULT-EXEC:/] ;GET JFN FOR EXEC
GTJFN% ;GET A JFN ON THE EXEC
ERSKP ;SKIP ON ERROR
JRST .PUSH2 ;WE FOUND IT....
MOVX T1,<GJ%SHT!GJ%OLD> ;FILE MUST EXIST
HRROI T2,[ASCIZ/SYSTEM:EXEC.EXE/] ;GET JFN FOR EXEC
GTJFN% ;GET A JFN ON THE EXEC
JSYSF ;HANDLE ERRORS
.PUSH2: ;HERE WHEN WE HAVE THE EXEC JFN
MOVEM T1,PSHJFN ;SAVE THE JFN
MOVX T1,<CR%CAP> ;CFORK FLAGS
CFORK% ;MAKE A FORK FOR THE EXEC
JSYSF ;HANDLE ERRORS
MOVEM T1,PSHFRK ;SAVE THE FORK HANDLE
HRL T1,PSHFRK ;GET THE FORK HANDLE
HRR T1,PSHJFN ;GET THE JFN
GET% ;LOAD THE EXEC INTO THE FORK
JSYSF ;HANDLE ERRORS
MOVE T1,PSHFRK ;GET THE FORK HANDLE
SETZ T2, ;OFFSET ZERO IN ENTRY VECTOR
SFRKV% ;START UP THE PUSHED EXEC
JSYSF ;HANDLE ERRORS
SETONE F%PUSH ;SET THE PUSH FLAG
JRST .PUSH4 ;GO WAIT FOR THE EXEC TO STOP
.PUSH3: ;HERE WHEN FORK ALLREADY EXISTED
MOVE T1,PSHFRK ;GET THE FORK HANDLE
TXO T1,SF%CON ;CONTINUE THE FORK
SFORK% ;CONTINUE
JSYSF
.PUSH4: ;HERE TO WAIT FOR EXEC TERMINATION
MOVE T1,PSHFRK ;GET THE FORK HANDLE
WFORK% ;WAIT FOR THE INFERIOR TO DIE
JSYSF ;HANDLE ERRORS (VERY WIERD)
RET ;RETURN TO CALLER
SUBTTL Version Command
.VERSI: ;VERSION COMMAND
NOISE <INFORMATION> ;HELP OUT USER
CNFIRM ;MAKE SURE USER WANTS THIS
CALL VEROUT ;OUTPUT VERSION INFORMATION
TYPE <>
TYPE <>
RET ;RETURN TO CALLER
VEROUT: ;ENTRY POINTER TO OUTPUT VERSION
TYPE <IPHOST - TOPS-20AN TCP/IP Host Utility Program - Version >
MOVEI T2,VMAJOR ;GET THE MAJOR VERSION NUMBER
NUMO T2,10 ;OUTPUT MAJOR VERSION
MOVEI T2,VMINOR ;GET MINOR VERSION NUMBER
JUMPE T2,VEROU2 ;IF ZERO SKIP IT
TYPEN <.> ;DELIMIT
MOVEI T2,VMINOR ;GET THE MINOR VERSION NUMBER
NUMO T2,10 ;OUTPUT MINOR VERSION NUMBER
VEROU2:
MOVEI T2,VEDIT ;GET EDIT NUMBER
JUMPE T2,VEROU3 ;IF ZERO SKIP IT
TYPEN <(> ;DELIMIT
MOVEI T2,VEDIT ;GET THE EDIT NUMBER
NUMO T2,10 ;OUTPUT THE EDIT NUMBER
TYPEN <)> ;DELIMIT
VEROU3:
MOVEI T2,VWHO ;GET THE WHO CODE
JUMPE T2,R ;IF ZERO SKIP IT
TYPEN <-> ;DELIMIT
MOVEI T2,VWHO ;GET THE WHO CODE
NUMO T2,10 ;OUTPUT THE WHO CODE
RET ;RETURN TO CALLER
SUBTTL AN20 Definitions
SYMS PI,4 ;PI SYSTEM DEVICE CODE
SYMS ANI,520 ;AN20 INPUT SIDE DEVICE CODE
SYMS ANO,524 ;AN20 OUTPUT SIDE DEVICE CODE
SYMS IDR,0 ;INPUT DATA REG.
SYMS IWAR,1 ;INPUT WORD COUNT REG.
SYMS IVAR,2 ;INPUT VECTOR ADDRESS REG.
SYMS ODR,0 ;OUTPUT DATA REG.
SYMS OWAR,1 ;OUTPUT WORD COUNT REG.
SYMS OVAR,2 ;OUTPUT VECTOR ADDRESS REG.
OPDEF PIOFF [CONO PI,0] ; TURN ON INTERRUPTS
OPDEF PION [CONO PI,277] ; TURN ON INTERRUPTS AGAIN
SUBTTL AN20 Commands
.AN20: ;AN20 COMMAND
DOCMD .CMKEY,ANCMDS,<STATUS>
DODSP ;DISPATCH ON IT
RET ;AND RETURN
.ANSTS: ;AN20 STATUS COMMAND
CNFIRM ;MAKE SURE
TRVAR <RIDR,RODR,RIVAR,ROVAR,RIWAR,ROWAR,RICSR,ROCSR>
CALL LOADRG ;GET THE REGISTERS
IFSKP.
CALL DUMPRG ;DUMP THE REGISTERS
CALL READRG ;INTERPRET THE REGS.
ELSE.
TYPE <%No AN20 Detected>
ENDIF.
TYPE <>
TYPE <>
RET ;AND RETURN
.ANASS: ;AN20 ASSERT COMMAND
NOISE <READY LINE>
CNFIRM
USRIO% ;GET MAGIC MODE
JSYSF
CONO ANI,<<IVAR>B29> ;SELECT THE REGISTER
DATAO ANI,[002000,,0] ;TURN ON THE READY LINE
HRRZS 0(P) ;MAKE SURE USRIO TURNS OFF
RET ;AND RETURN
.ANREV: ;AN20 REVOKE COMMAND
NOISE <READY LINE>
CNFIRM
USRIO% ;GET MAGIC MODE
JSYSF
CONO ANI,<<IVAR>B29> ;SELECT THE REGISTER
DATAO ANI,[Z] ;TURN OFF THE READY LINE
HRRZS 0(P) ;MAKE SURE USRIO TURNS OFF
RET ;AND RETURN
.ANRST: ;AN20 RESET COMAND
NOISE <READY LINE>
CNFIRM
USRIO% ;GET MAGIC MODE
JSYSF
CONO ANI,200000 ;TURN ON THE RESET BIT
HRRZS 0(P) ;MAKE SURE USRIO TURNS OFF
RET ;AND RETURN
SUBTTL AN20 Status Code
LOADRG:
USRIO% ;TURN ON USER IO MODE
JSYSF
SKIP NOPI1 ;TOUCH RIGHT STUFF TO PREVENT PAGE FAULTS
SKIP LOADR2
SKIP RIDR
SKIP ROCSR
PIOFF ;TAKE THE PLUNGE AND SIEZE THE MACHINE
NOPI1: CONI ANI,RICSR ;GET INPUT SIDE STUFF
CONI ANO,ROCSR ;GET OUTPUT SIDE STUFF
SKIPN RICSR ;ANYTHING READ ON CONI?
SKIPE ROCSR
SKIPA ;YES
JRST LOADR2 ;NO AN10 AROUND SO BITCH
CONO ANI,<<IDR>B29> ;SELECT IDR REGISTER
DATAI ANI,RIDR ;READ REG
CONO ANI,<<IWAR>B29> ;SELECT IWAR REGISTER
DATAI ANI,RIWAR ;READ REG
CONO ANI,<<IVAR>B29> ;SELECT IVAR REGISTER
DATAI ANI,RIVAR ;READ REG
HRRZ T1,RICSR ;GET OLD STATUS REGISTER
TRZ T1,740000 ;MAKE SURE TERRIBLE BITS NOT SET
CONO ANI,(T1) ;RESTORE STATE OF ANI DEVICE
CONO ANO,<<ODR>B29> ;SELECT ODR REGISTER
DATAI ANO,RODR ;READ REG
CONO ANO,<<OWAR>B29> ;SELECT OWAR REG
DATAI ANO,ROWAR ;READ IT
CONO ANO,<<OVAR>B29> ;SELECT OVAR REG
DATAI ANO,ROVAR ;READ IT
HRRZ T1,ROCSR ;GET STATUS REG BEFORE WE PLAYED
CONO ANO,(T1) ;PUT ANO DEVICE BACK
AOS 0(P) ;SKIP RETURN
LOADR2: PION ;RELEASE THE MACHINE
HRRZS 0(P) ;MAKE SURE USRIO TURNS OFF
RET ;AND RETURN
DUMPRG: ;DUMP OUT REGISTERS
TYPE < ICSR/ >
MOVE T1,RICSR
CALL REGOUT
TYPEN < OCSR/ >
MOVE T1,ROCSR
CALL REGOUT
TYPE < IDR/ >
MOVE T1,RIDR
CALL REGOUT
TYPEN < ODR/ >
MOVE T1,RODR
CALL REGOUT
TYPE < IWAR/ >
MOVE T1,RIWAR
CALL REGOUT
TYPEN < OWAR/ >
MOVE T1,ROWAR
CALL REGOUT
TYPE < IVAR/ >
MOVE T1,RIVAR
CALL REGOUT
TYPEN < OVAR/ >
MOVE T1,ROVAR
CALL REGOUT
RET
REGOUT: ;OUTPUT REGISTERS
STKVAR <RGOUT>
MOVEM T1,RGOUT ;SAVE THE DATA
HLRZ T2,RGOUT ;GET THE LEFT HALF
NUMOZ T2,10,6 ;OUTPUT IT
TYPEN <,,>
HRRZ T2,RGOUT ;GET THE RIGHT HALF
NUMOZ T2,10,6 ;OUTPUT IT
RET ;AND RETURN
READRG: ;READ AND INTERPRET AN20 REGISTERS
TYPE <>
MOVX T1,<1B19> ;IMP READY BIT
TDNE T1,RICSR ;IMP READY?
IFSKP.
TYPE < IMP ready line is on.>
ELSE.
TYPE < IMP ready line is off.>
ENDIF.
MOVX T1,<1B10> ;AN20 READY BIT
TDNN T1,RIVAR ;IS THE AN20 READY BIT ON?
IFSKP.
TYPE < AN20 ready line is on.>
ELSE.
TYPE < AN20 ready line is off.>
ENDIF.
MOVX T1,<1B4> ;DISTANT BIT
TDNN T1,RICSR ;DISTANT CONNECTION?
IFSKP.
TYPE < AN20 has a distant connection to the IMP.>
ENDIF.
MOVX T1,<1B5> ;LOCAL BIT
TDNN T1,RICSR ;LOCAL CONNECTION?
IFSKP.
TYPE < AN20 has a local connection to the IMP.>
ENDIF.
RET
SUBTTL Routine to Load Host Names
HSTLDF: ;ENTRY POINT TO FORCE LOADING
SETZRO F%NAME ;RESET THE NAME FLAG
JRST HSTLD2 ;AND JOIN LOADING CODE
HSTLOD: ;ROUTINE TO LOAD HOST NAMES
TMNE F%NAME ;ARE NAMES ALLREADY LOADED?
RET ;YES SO JUST RETURN
HSTLD2: ;HERE TO FORCE A NAME LOAD
SETZRO F%DIDB ;TURN OFF THE DID BITCH FLAG
SETZM UHSTNM ;ZERO HOST TABLE WORDS
SETZM UHSTNN
SETZM SHSTNM
SETZM SHSTNN
SETZM GHSTNM
SETZM GHSTNN
SETZM NHSTNM
MOVEI T5,HSTNAM ;INITIALIZE HOST NAME STORAGE POINTER
MOVEI T1,.GTHSZ ;GTHST GENERAL FUNCTION
GTHST ;GET NUMBER OF HOST NAMES
JSYSF
MOVE T6,T2 ;SAVE AOBJN POINTER
HSTLD3: ;HOST NAME LOADING LOOP
MOVEI T1,.GTHIX ;HOST NAME FROM INDEX FUNCTION
HRRO T2,T5 ;GET LOCATION TO STORE THE HOST NAME
HRRZ T3,T6 ;GET INDEX
GTHST ;GET NAME AND INFORMATION ABOUT HOST
JSYSF ;HANDLE ERRORS
IBP T2 ;INCREMENT THE BYTE POINTER
JE HS%SRV,T4,HSTLD4 ;IS THIS HOST A SERVER?
MOVEI T1,SHSTNM ;YES SO ASSUME NOT A NICKNAME
TXNE T4,HS%NCK ;IS THIS A NICKNAME?
MOVEI T1,SHSTNN ;YES SO GET NICKNAME TABLE
JRST HSTLD5 ;JOIN COMMON CODE
HSTLD4: ;HERE IF HOST IS NOT A SERVER
JN HS%GAT,T4,HSLD41 ;IS THIS NAME A GATEWAY?
JN HS%NET,T4,HSLD42 ;IS THIS NAME A NETWORK?
MOVEI T1,UHSTNM ;NO AND NO. MUST JUST BE A USER.
TXNE T4,HS%NCK ;IS THIS A NICKNAME?
MOVEI T1,UHSTNN ;YES SO GET NICKNAME TABLE
JRST HSTLD5 ;JOIN COMMON CODE
HSLD41: ;HERE FOR A GATEWAY
MOVEI T1,GHSTNM ;GET THE TABLE HEAD
TMNE HS%NCK,T4 ;IS THIS A NICKNAME?
MOVEI T1,GHSTNN ;GET THE HEAD FOR A NICKNAME
JRST HSTLD5 ;JOIN COMMON CODE
HSLD42: ;HERE FOR A NETWORK
MOVEI T1,NHSTNM ;GET THE TABLE HEAD
HSTLD5:
AOS (T1) ;BUMP ENTRY AVAILABLE COUNT
HRRZS T2 ;ZERO THE LEFT HALF
AOJ T2, ;BUMP THE ADDRESS
EXCH T2,T5 ;SAVE NEW NAME ADDRESS
HRLZS T2 ;PUT ADDRESS INTO LEFT HALF
HRR T2,T6 ;SAVE INDEX IN RIGHT HALF
TBADD ;ADD ENTRY TO THE TABLE
ERSKP ;SKIP ON ERRORS
JRST HSTLD6 ;NO ERROR SO CONTINUE ON
MOVEI T1,.FHSLF ;MYSELF
GETER% ;GET MY LAST ERROR
JSYSF ;TRAP ERRORS
HRRZS T2 ;ZERO THE LEFT HALF
CAIE T2,TADDX2 ;ENTRY ALLREADY EXIST?
CALL .JSYSF ;NO SO GIVE AN ERROR
TMNN F%HSOB ;CAN WE BITCH ABOUT IT?
JRST HSTLD6 ;NO
TYPE <%Duplicate host name ">
MOVEI T1,.GTHIX ;INDEX TO HOST NAME FUNCTION
MOVEI T2,.PRIOU ;OUTPUT TO TTY
HRRZ T3,T6 ;GET THE HOST INDEX
GTHST% ;OUTPUT THE HOST NAME
JSYSF
TYPEN <" encountered.>
SETONE F%DIDB ;FLAG THAT WE BITCHED
HSTLD6: ;HERE FOR NEXT ENTRY
AOBJN T6,HSTLD3 ;LOOP FOR ALL HOSTS
SETONE F%NAME ;TURN ON THE NAMES LOADED FLAGS
SETZRO F%HSOB ;TURN OFF BITCH FLAG
TMNN F%DIDB ;DID WE BITCH?
RET ;NO
TYPE <> ;YES SO EXTRA CRLFS
TYPE <>
RET ;RETURN TO CALLER
SUBTTL Host Lookup COMND Function Block
HSTCFB: ;COMND FUNCTION BLOCK FOR HOST NAMES
<.CMKEY>B8!CM%BRK!CM%HPP!<.+5>B35
NNCMDS
-1,,[ASCIZ/
Host Name Type
--------------
/]
Z
EXP HSTCBM
<.CMKEY>B8!CM%HPP!<.+5>B35
SHSTNM
-1,,[ASCIZ/
Server Host Name
----------------
/]
Z
Z
<.CMKEY>B8!CM%HPP!<.+5>B35
EXP UHSTNM
-1,,[ASCIZ/
User Host Name
--------------
/]
Z
Z
<.CMKEY>B8!CM%HPP!<.+5>B35
EXP SHSTNN
-1,,[ASCIZ/
Server Host Nickname
--------------------
/]
Z
Z
<.CMKEY>B8!CM%HPP!<.+5>B35
EXP UHSTNN
-1,,[ASCIZ/
User Host Nickname
------------------
/]
Z
Z
<.CMKEY>B8!CM%HPP!<.+5>B35
EXP GHSTNM
-1,,[ASCIZ/
Gateway Name
------------
/]
Z
Z
<.CMKEY>B8!CM%HPP!<.+5>B35
EXP GHSTNN
-1,,[ASCIZ/
Gateway Nickname Name
---------------------
/]
Z
Z
<.CMKEY>B8!CM%HPP!<.+5>B35
EXP NHSTNM
-1,,[ASCIZ/
Network Name
------------
/]
Z
Z
<.CMTXT>B8!CM%HPP!CM%SDH
Z
-1,,[ASCIZ/a wild card string
/]
Z
Z
HSCFB2:
<.CMKEY>B8!CM%BRK!CM%HPP!<.+5>B35
NNCMDS
-1,,[ASCIZ/
Host Name Type
--------------
/]
Z
EXP HSTCBM
<.CMKEY>B8!CM%HPP!<.+5>B35
SHSTNM
-1,,[ASCIZ/
Internet Host Name
------------------
/]
Z
Z
<.CMKEY>B8!CM%HPP<.+5>B35
EXP SHSTNN
-1,,[ASCIZ/
Internet Host Nickname
----------------------
/]
Z
Z
<.CMKEY>B8!CM%HPP!<.+5>B35
EXP GHSTNM
-1,,[ASCIZ/
Gateway Name
------------
/]
Z
Z
<.CMKEY>B8!CM%HPP!<.+5>B35
EXP NHSTNM
-1,,[ASCIZ/
Network Name
------------
/]
Z
Z
<.CMTXT>B8!CM%HPP!CM%SDH
Z
-1,,[ASCIZ/a wild card string
/]
Z
Z
HSTCBM: EXP -1,0,0,0
HSCFB3: ;COMND FUNCTION BLOCK FOR HOST NAMES
<.CMKEY>B8!CM%DPP!<.+4>B35
EXP SHSTNM
Z
-1,,[ASCIZ/SRI-NIC/]
<.CMKEY>B8
EXP SHSTNN
Z
Z
INTCFB: <.CMKEY>B8!CM%DPP!<.+4>B35
EXP NTFCNM
Z
-1,,[ASCIZ/ALL/]
<.CMKEY>B8
EXP INSCMD
Z
Z
SUBTTL NAME Command
.VALID: ;VALID COMMAND
NOISE <HOST STATUS INFORMATION FOR>
SETONE F%VLD ;SET THE VALID FLAG
JRST .NAME0 ;JOIN COMMON CODE
.NAME: ;HOST NAME COMMAND
NOISE <OF HOST IS> ;HELP OUT THE USER
SETZRO F%VLD ;RESET THE VALID COMMAND
.NAME0: ;HERE ALSO FROMT THE VALID COMMAND
CALL HSTLOD ;LOAD HOST NAMES IF NEEDED
MOVEI T2,HSTCFB ;GET THE HOST NAME FUNCTION BLOCK
SKIPN UHSTNM ;ANY USER HOSTS?
SKIPE UHSTNN ;ANY USER HOST NICKNAMES?
JRST .NAME1 ;YES OR YES
SKIPN GHSTNN ;ANY GATEWAY NICKNAMES?
MOVEI T2,HSCFB2 ;NO SO GET ALTERNATE BLOCK
.NAME1:
CALL .DOCMD ;LOOKUP THE HOST NAME
CAIL T2,NNCMDS ;POSSIBLE HOST TYPE?
CAIG T2,NNCMDS+NNNCMD ;?
JRST .NAME7 ;YES SO HANDLE IT
CAIL T2,UHSTNM ;POSSIBLE HOST NAME?
CAIL T2,HSTNAM ;POSSIBLE HOST NAME?
JRST .NAME2 ;NO SO IT MUST BE A QUOTED STRING
HRRZ T5,(T2) ;GET THE HOST INDEX
CNFIRM ;MAKE SURE
MOVE T1,T5 ;GET THE INDEX INTO CORRECT AC
CALL HSDMPX ;OUTPUT INFORMATION ON THIS HOST
TYPE <>
TYPE <>
RET ;RETURN TO CALLER
.NAME2: ;HERE ON A QUOTED STRING
TRVAR <<NAMQST,<NAMSIZ/5+1>>>
SETZRO F%WLDF ;INITIALIZE THE WILD FLAG
MOVX T1,<POINT 7,ATMBUF> ;GET THE DESTINATION POINTER
MOVX T2,<POINT 7,NAMQST> ;GET THE TARGET POINTER
.NAME3: ;LOOP FOR COPYING THE ATOM BUFFER
ILDB T3,T1 ;GET A BYTE
IDPB T3,T2 ;PUT THE BYTE
JUMPN T3,.NAME3 ;LOOP UNTIL A NULL BYTE
CNFIRM ;MAKE SURE THE USER WANTS THIS FUNCTION
MOVEI HT,SHSTNM ;SERVER HOSTS
CALL NAMWLD ;DUMP INFORMATION ON ANY MATCHES
MOVEI HT,UHSTNM ;USER HOSTS
CALL NAMWLD ;DUMP INFORMATION ON ANY MATCHES
JN F%VLD,,.NAME4 ;IF A VALID COMAND DO NOT DO NICKNAMES
;xxxxx JN F%WLDF,,.NAME4 ;IF WE FOUND MATCHES DO NOT CHECK NICKNAMES
MOVEI HT,SHSTNN ;SERVER HOST NICKNAMES
CALL NAMWLD ;DUMP INFORMATION ON ANY MATCHES
MOVEI HT,UHSTNN ;USER HOST NICKNAMES
CALL NAMWLD ;DUMP INFORMATION ON ANY MATCHES
;...
SUBTTL NAME Command Continued
;...
.NAME4: ;HERE TO LOOK FOR GATEWAY MATCHES
MOVEI HT,GHSTNM ;GATEWAYS
CALL NAMWLD ;DUMP INFORMATION ON ANY MATCHES
JN F%WLDF,,.NAME5 ;ANY MATCHES FOUND?
MOVEI HT,GHSTNN ;NO SO SEARCH GATEWAY NICKNAMES
CALL NAMWLD ;AND DUMP INFO ON THEM
.NAME5: ;HERE FOR NETWORKS
MOVEI HT,NHSTNM ;NETWORKS
CALL NAMWLD ;DUMP INFORMATION ON ANY MATCHES
JN F%WLDF,,.NAME6 ;MATCHES FOUND?
TYPE <%No matches found.>
.NAME6:
TYPE <>
TYPE <>
RET
.NAME7: ;HERE ON A HOST TYPE
SETZRO F%WLDF ;ZERO THE MATCH FOUND FLAG
SETONE F%WALL ;ALL NAMES MATCH FLAG ON
DODSP ;DISPATCH ON THE HOST NAME
RET ;AND GET ANOTHER COMMAND
SUBTTL Host Name Type Handling
.NSERV: ;SERVER HOSTS
CNFIRM ;MAKE SURE
MOVEI HT,SHSTNM ;SERVER HOST NAMES
CALL NAMWLD ;DUMP THEM
JN F%WLDF,,R ;IF ANY FOUND RETURN
MOVEI HT,SHSTNN ;SERVER HOST NICKNAMES
CALL NAMWLD ;DUMP THEM
RET ;RETURN FOR ANOTHER COMMAND
.NUSER: ;USER HOSTS
CNFIRM ;MAKE SURE
MOVEI HT,UHSTNM ;USER HOST NAMES
CALL NAMWLD ;DUMP THEM
JN F%WLDF,,R ;IF ANY FOUND RETURN
MOVEI HT,UHSTNN ;USER HOST NICKNAMES
CALL NAMWLD ;DUMP THEM
RET ;RETURN FOR ANOTHER COMMAND
.NGATE: ;GATEWAYS
CNFIRM ;MAKE SURE
MOVEI HT,GHSTNM ;GATEWAY HOST NAMES
CALL NAMWLD ;DUMP THEM
JN F%WLDF,,R ;IF ANY FOUND RETURN
MOVEI HT,GHSTNN ;GATEWAY HOST NICKNAMES
CALL NAMWLD ;DUMP THEM
RET ;RETURN FOR ANOTHER COMMAND
.NNETW: ;NETWORKS
CNFIRM ;MAKE SURE
MOVEI HT,NHSTNM ;NETWORK HOST NAMES
CALL NAMWLD ;DUMP THEM
RET
SUBTTL NAMWLD - Routine to Search Tables for Wild Matches
NAMWLD: ;ROUTINE TO LOOK FOR WILD MATCHES
;HT/ HOST TABLE ADDRESS
SKIPN (HT) ;ANY ENTRIES?
RET ;NO SO RETURN NOW
HRRZ T1,(HT) ;GET THE NUMBER OF ENTRIES
JUMPE T1,R ;IF NO ENTRIES JUST RETURN
MOVNS T1 ;GET THE NEGATIVE ENTRY COUNT
MOVEI HT,1(HT) ;BUMP THE ADDRESS OF THE TABLE
HRL HT,T1 ;BUILD THE AOBJN WORD
NAMWL2: ;LOOP FOR CHECKING HOST NAMES
JN F%WALL,,NAMWL3 ;IF EVERYTHING MATCHES WE HAVE A WIN
MOVX T1,.WLSTR ;THIS IS A WILD STRING COMPARE
HRROI T2,NAMQST ;THE WILD STRING ADDRESS
HLRO T3,(HT) ;GET THE NON WILD STRING
WILD% ;DOES IT MATCH?
JSYSF
JUMPE T1,NAMWL3 ;YES
AOBJN HT,NAMWL2 ;NO SO KEEP LOOKING
RET ;RETURN AFTER ALL ENTRIES
NAMWL3: ;HERE WHEN WE HAVE A MATCH
SETONE F%WLDF ;SET THE WILD FLAG
HRRZ T1,(HT) ;GET THE INDEX
CALL HSDMPX ;DUMP INFORMATION ON HOST
AOBJN HT,NAMWL2 ;KEEP LOOKING
RET ;RETURN AFTER ALL ENTRIES
SUBTTL LOCAL and NUMBER Commands
.LOCAL: ;LOCAL HOST COMMAND
NOISE <HOST INFORMATION> ;HELP OUT THE USER
CNFIRM ;MAKE SURE USER WANTS THIS
MOVE T1,LHOSTN ;GET THE LOCAL HOST NUMBER
CALL HSDMPN ;DUMP THIS HOST NUMBER
TYPE <>
TYPE <>
RET ;RETURN FOR ANOTHER COMMAND
.NUMBE: ;HOST NUMBER COMMAND
STKVAR <HSTNUM>
NOISE <OF HOST> ;HELP OUT THE USER
SETZM HSTNUM ;ZERO THE HOST NUMBER WORD
MOVX T6,<POINT 8,HSTNUM,3> ;GET NEAT BYTE POINTER
MOVEI T5,4 ;FOUR OCTETS
.NUMB2: ;OCTET LOOP
DOCMD .CMNUM,12,0,<DECIMAL OCTET>
IDPB T2,T6 ;DEPOSIT THE OCTET
SOJLE T5,.NUMB3 ;ALL FOUR OCTETS YET?
DOCMD .CMTOK,<-1,,[ASCIZ\.\]>,<.> ;NO SO PARSE A COMMA
JRST .NUMB2 ;WE NEED FOUR OCTETS
.NUMB3: ;HERE WHEN WE HAVE THE HOST NUMBER
CNFIRM ;MAKE SURE USER WANTS THIS
MOVEI T1,.GTHHN ;NAME CHECKING FUNCTION
MOVE T3,HSTNUM ;GET THE HOST NUMBER
GTHST ;GET THE STATUS OF THIS HOST
ERJMP .NUMB4 ;ON ERROR ASSUME NOT FOUND
MOVE T1,HSTNUM ;GET THE HOST NUMBER
CALL HSDMPN ;DUMP THIS HOST NUMBER
TYPE <>
TYPE <>
RET ;RETURN FOR ANOTHER COMMAND
.NUMB4: ;HERE WHEN HOST NOT FOUND
TYPE <%NAME FOR HOST NOT FOUND>
TYPE <>
TYPE <>
RET ;GET ANOTHER COMMAND
SUBTTL CONVERT Commands
.CONVE: ;CONVERT COMMAND
DOCMD .CMKEY,CCMDS,<INTERNET> ;GET A KEYWORD
DODSP ;DISPATCH ON IT
RET ;AND RETURN FOR ANOTHER COMMAND
.CETHE: ;CONVERT ETHERNET COMMAND
STKVAR <<NIENN,2>>
NOISE <ADDRESS>
MOVEI T5,5 ;READ SIX HEX OCTETS
MOVX T6,<POINT 8,NIENN> ;GET THE BYTE POINTER
CETHE2: ;OCTET READING LOOP
DOCMD .CMFLD,,<00>,<two hex digits>,HEXBRK ;READ IN THE OCTET
MOVX T1,<POINT 7,ATMBUF> ;GET THE POINTER
CALL HEXRED ;READ HEX FROM THE ATOM BUFFER
JRST CETHE3 ;ERROR READING HEX
IDPB T1,T6 ;DEPOSIT THE OCTET
JUMPE T5,CETHE4 ;IF LAST BYTE WE ARE DONE
DOCMD .CMTOK,<-1,,[ASCIZ/-/]>,<->,<a dash> ;GET A HYPHEN
SOJA T5,CETHE2 ;GO READ THE NEXT OCTET
CETHE3: ;HERE ON A HEX READ ERROR
CALL NEWLIN ;GET A NEW LINE
TYPEN <?Command error reading HEX Ethernet address.>
TYPE <?>
HRROI T1,ATMBUF ;GET A POINTER TO THE TEXT BUFFER
PSOUT% ;OUTPUT THE TEXT BUFFER
RET ;RETURN FOR ANOTHER COMMAND
CETHE4: ;HERE WHEN WE HAVE THE HEX
NOISE <TO DECNET NODE NUMBER>
CNFIRM
LDB T3,[POINT 16,1+NIENN,15] ;GET THE DECNET NODE NUMBER
DPB T3,[POINT 8,T3,19] ;MOVE THE LOW ORDER BYTE TO HIGH
LSH T3,-10 ;SHIFT IT OVER
DMOVE T1,NIENN ;GET THE ETHERNET ADDRESS
CALL NIDCNP ;PRINT OUT THE TRANSLATION
RET ;AND RETURN FOR ANOTHER COMMAND
.DECNE: ;CONVERT DECNET COMMAND
STKVAR <DCNDN,<DCNEN,2>>
NOISE <NODE NUMBER>
DOCMD .CMNUM,12,,<area number> ;GET THE AREA NUMBER
SETZM DCNDN ;ZERO THE DECNET NODE NUMBER FOR DEPOSITS
DPB T2,[POINT 6,DCNDN,25] ;DEPOSIT THE AREA NUMBER
DOCMD .CMTOK,<-1,,[ASCIZ/./]>,<.> ;GET THE DELIMITOR
DOCMD .CMNUM,12,,<node number> ;GET THE LOCAL NUMBER
DPB T2,[POINT 10,DCNDN,35] ;DEPOSIT THE LOCAL NODE NUMBER
NOISE <TO ETHERNET ADDRESS>
CNFIRM ;MAKE SURE
MOVE T2,DCNDN ;GET THE DECNET NODE NUMBER
DPB T2,[POINT 8,T2,19] ;PUT LOW ORDER BYTE INTO HIGH ORDER BYTE
LSH T2,-10 ;AND MOVE OVER ALL 16 BITS
SETZM DCNEN ;ZERO CELL FOR BYTE DEPOSITS
SETZM 1+DCNEN
DPB T2,[POINT 16,1+DCNEN,15] ;PUT THE DECNET PART BACK IN CORRECT ORDER
MOVX T1,<BYTE (4)12,12,0,0,0,4,0,0> ;GET DECNET FIRST PART
IORM T1,DCNEN ;AND DEPOSIT IT
DMOVE T1,DCNEN ;GET THE ETHERNET ADDRESS
MOVE T3,DCNDN ;GET THE DECNET ADDRESS
CALL NIDCNP ;OUTPUT THE INFORMATION
RET
NIDCNP: ;OUTPUT ETHERNET DECNET ADDRESSES
STKVAR <NIDNA,<NIDNI,2>>
DMOVEM T1,NIDNI ;SAVE THE ETHERNET ADDRESS
MOVEM T3,NIDNA ;SAVE THE DECNET ADDRESS
CALL NEWLIN ;GET A NEW LINE
TYPE < Decnet node number: >
LDB T2,[POINT 6,NIDNA,25] ;GET THE AREA NUMBER
NUMO T2,12,0 ;OUTPUT THE AREA NUMBER
TYPEN <.> ;DELIMIT
LDB T2,[POINT 10,NIDNA,35] ;GET THE LOCAL NUMBER
NUMO T2,12,0 ;OUTPUT THE LOCAL NUMBER
TYPEN < is Ethernet address: >
MOVE T5,[POINT 4,NIDNI] ;GET THE BYTE POINTER
MOVEI T6,^D11 ;INIT THE COUNT
JRST NIDCN3 ;NO DELIMTOR FIRST TIME
NIDCN2: ;HEX OUTPUT LOOP
TRNE T6,1 ;IS IT ODD?
PBOUT% ;YES SO OUTPUT THE DELMITOR
NIDCN3: ;ENTRY POINT FOR LOOP
ILDB T1,T5 ;GET A BYTE
ADJBP T1,[POINT 7,[ASCIZ/0123456789ABCDEF/],6]
LDB T1,T1 ;TRANSLATE TO HEX
PBOUT% ;OUTPUT THE HEX CHARACTER
MOVEI T1,"-" ;GET A DELIMITOR
CAIN T6,6 ;IS THE COUNT SIX?
IBP T5 ;YES SO AN EXTRA BYTE INCREMENT
SOJGE T6,NIDCN2 ;LOOP FOR ALL HEX BYTES
TYPE <>
TYPE <>
RET ;RETURN FOR ANOTHER COMMAND
.CINTER: ;CONVERT INTERNET COMMAND
TRVAR <CNVHNM>
NOISE <HOST NUMBER IN>
DOCMD .CMKEY,HCMDS,<INTERNET> ;ASK FOR THE NUMBER TYPE
DODSP ;DISPATCH ON THE KEYWORD
CALL NEWLIN ;GET A NEW LINE
TYPE < Internet: >
MOVX T5,<POINT 8,CNVHNM,3> ;GET NEAT BYTE POINTER
MOVEI T6,4 ;FOUR OCTETS
JRST CONVE2 ;JOIN COMMON CODE
CONVE1:
TYPEN <.> ;DELIMIT WITH A DOT
CONVE2:
ILDB T2,T5 ;GET AN OCTET
NUMO T2,12 ;OUTPUT THE OCTET IN DECIMAL
SOJG T6,CONVE1 ;LOOP FOR FOUR OCTETS
TYPEN <, Decimal: >
NUMO CNVHNM,12,0 ;OUTPUT HOST NUMBER IN DECIMAL
TYPEN <, Octal: >
NUMO CNVHNM,10,0 ;OUTPUT HOST NUMBER IN OCTAL
TYPE <>
TYPE <>
RET ;GET ANOTHER COMMAND
.HINTE: ;CONVERT INTERNET COMMAND
NOISE <FORMAT>
MOVX T6,<POINT 8,CNVHNM,3> ;GET NEAT BYTE POINTER
MOVEI T5,4 ;FOUR OCTETS
INTER1: ;OCTET LOOP
DOCMD .CMNUM,12,0,<DECIMAL OCTET>
IDPB T2,T6 ;DEPOSIT THE OCTET
SOJLE T5,INTER2 ;ALL FOUR OCTETS YET?
DOCMD .CMTOK,<-1,,[ASCIZ\.\]>,<.> ;NO SO PARSE A COMMA
JRST INTER1 ;WE NEED FOUR OCTETS
INTER2: ;HERE WHEN WE HAVE THE HOST NUMBER
CNFIRM ;MAKE SURE USER WANTS THIS
RET ;RETURN TO CALLER
.OCTAL: ;CONVERT OCTAL COMMAND
NOISE <FORMAT>
DOCMD .CMNUM,10 ;GET THE OCTAL HOST NUMBER
MOVEM T2,CNVHNM ;SAVE THE HOST NUMBER
CNFIRM ;MAKE SURE USER WANTS THIS
RET
.DECIM: ;CONVERT DECIMAL COMMAND
NOISE <FORMAT>
DOCMD .CMNUM,12 ;GET THE DECIMAL HOST NUMBER
MOVEM T2,CNVHNM ;SAVE THE HOST NUMBER
CNFIRM ;MAKE SURE USER WANTS THIS
RET
SUBTTL Host Information Dumping Routines
HSDMPN: ;HOST DUMPER FROM HOST NUMBER
;T1/ HOST NUMBER
STKVAR <F4NIDX,F4NHST,F4NSTS,SYSIDX>
MOVEM T1,F4NHST ;SAVE HOST NUMBER
MOVEI T1,.GTHHN ;HOST NUMBER FOR HOST STATUS FUNCTION
MOVE T3,F4NHST ;GET THE HOST NUMBER
GTHST ;GET THE HOST STATUS
JSYSF
MOVEM T4,F4NSTS ;SAVE THE STATUS
JRST HSTDM1 ;JOIN COMMON CODE
HSDMPX: ;HOST DUMPER
;T1/ HOST INDEX
STKVAR <F4NIDX,F4NHST,F4NSTS,SYSIDX>
MOVEM T1,F4NIDX ;SAVE THE 4N HOST INDEX
MOVEI T1,.GTHIX ;HOST FUNCTION GIVEN INDEX
MOVEI T2,.NULIO ;OUTPUT TO BIT BUCKET
MOVE T3,F4NIDX ;GET THE HOST INDEX
GTHST ;GET INFO ON THIS HOST
JSYSF ;HANDLE ERRORS
MOVEM T3,F4NHST ;SAVE 4N HOST NUMBER
MOVEM T4,F4NSTS ;FOREIGN HOST STATUS
TMNE F%VLD ;ONLY WANT VALID HOSTS?
TXNE T4,HS%VAL ;WANT VALID. IS THIS VALID?
SKIPA ;VALID OR WE WANT ALL
JRST HSTDM7 ;WANT VALID AND THIS IS NOT VALID
JE HS%NCK,T4,HSTDM1 ;IS THIS A NICKNAME?
TYPE < > ;YES SO GET A NEW LINE
MOVEI T1,.GTHIX ;GET THE INDEX TO NAME FUNCTION CODE AGAIN
MOVEI T2,.PRIOU ;OUTPUT TO TTY
MOVE T3,F4NIDX ;GET THE NAME INDEX
GTHST ;OUTPUT THE HOST NICKNAME
JSYSF
TYPEN < is a nickname for:>
HSTDM1:
TYPE < > ;GET A NEW LINE
MOVX T5,<POINT 8,F4NHST,3> ;GET NEAT BYTE POINTER
MOVEI T6,4 ;FOUR OCTETS
JRST HSTDM3 ;JOIN COMMON CODE
SUBTTL Host Information Dumping Routines Continued
HSTDM2:
TYPEN <.> ;DELIMIT WITH A DOT
HSTDM3:
ILDB T2,T5 ;GET AN OCTET
NUMO T2,12 ;OUTPUT THE OCTET IN DECIMAL
SOJG T6,HSTDM2 ;LOOP FOR FOUR OCTETS
TYPEN < > ;DELIMIT
MOVEI T1,.GTHNS ;PRIMARY HOST NAME FUNCTION
MOVEI T2,.PRIOU ;OUTPUT TO TTY
MOVE T3,F4NHST ;GET THE HOST NUMBER
GTHST ;OUTPUT THE HOST NAME
JSYSF ;HANDLE ERRORS
MOVE T5,F4NSTS ;GET THE STATUS WORD
HRROI T1,[ASCIZ/, Network/]
TXNE T5,HS%NET ;NETWORK?
PSOUT ;YES SO OUTPUT IT
HRROI T1,[ASCIZ/, Gateway/]
TXNE T5,HS%GAT ;GATEWAY?
PSOUT ;YES SO OUTPUT IT
HRROI T1,[ASCIZ/, Server/]
TXNE T5,HS%SRV ;SERVER?
PSOUT ;YES SO OUTPUT IT
HRROI T1,[ASCIZ/, User/]
TXNE T5,HS%USR ;USER?
PSOUT ;YES SO OUTPUT IT
HRROI T1,[ASCIZ/, Self/]
TXNE T5,HS%SLF ;SELF?
PSOUT ;YES SO OUTPUT IT
LDB T1,[POINTR T5,HS%STY] ;GET SYSTEM TYPE CODE
CAILE T1,TYPMAX ;KNOWN NUMBER?
SETZ T1, ;NO
JUMPE T1,HSTDM4 ;IF NULL THEN RETURN
HRRO T1,SYSTYP(T1) ;GET THE SYSTEM TYPE STRING
MOVEM T1,SYSIDX ;SAVE THE INDEX
TYPEN <, > ;DELIMIT
MOVE T1,SYSIDX ;GET THE POINTER BACK
PSOUT ;AND OUTPUT SYSTEM TYPE
HSTDM4:
MOVE T5,F4NSTS ;GET THE STATUS WORD
JE HS%VAL,T5,HSTDM7 ;IS IT VALID?
JE HS%UP,T5,HSTDM5 ;YES, IS IT UP?
TYPEN <, Up> ;YES, TELL THEM IT IS UP
JRST HSTDM7 ;AND DONT CHECK THE REST
HSTDM5: ;HERE TO CHECK FOR A REASON
JN <HS%DAY!HS%HR!HS%MIN!HS%RSN>,T5,HSTDM8 ;DO WE KNOW ANYTHING ABOUT IT?
TYPEN <, Down> ;NO
JRST HSTDM7 ;JOIN REST OF FLOW
HSTDM8:
TYPEN <,>
TYPE < Down> ;TELL USER IT IS DOWN
JE HS%RSN,T5,HSTDM6 ;DO WE KNOW WHY?
TYPEN <, > ;YES SO PROMPT THE OUTPUT
LOAD T1,HS%RSN,T5 ;GET THE REASON
MOVE T1,RSN182(T1) ;GET THE REASON
PSOUT% ;AND OUTPUT IT
HSTDM6: ;HERE TO CHECK FOR A POSSIBLE UP TIME
LOAD T1,<HS%DAY!HS%HR!HS%MIN>,T5 ;GET THE WHEN CODE
JUMPE T1,HSTDM7 ;DO WE KNOW WHEN?
CAIN T1,7777 ;MORE THAN A WEEK?
JRST HSTDM9 ;YES
CAIN T1,7776 ;UNSPECIFIED?
JRST HSDM11 ;YES
TYPEN <, Back up > ;LESS THAN A WEEK
LOAD T1,HS%DAY,T5 ;GET DAY BACK UP AGAIN
CAILE T1,WEKMAX ;LEGIT DAY CODE?
JRST HSDM10 ;NO
HRRO T1,WEKDAY(T1) ;GET DAY OF WEEK STRING
PSOUT% ;OUTPUT THE DAY OF THE WEEK
JRST HSDM10 ;JOIN FLOW
HSTDM9: ;HERE WHEN NOT UP FOR A LONG TIME
TYPEN < Back up in more than a week>
JRST HSTDM7 ;JOIN FLOW
HSDM11: ;HERE WHEN UNSPECIFIED
TYPEN < Back up time unknown>
JRST HSTDM7
HSDM10: ;HERE AFTER DAY OF THE WEEK OUT
TYPEN < > ;DELIMIT
LDB T2,[POINTR T5,HS%HR] ;GET HOUR BACK UP
NUMO T2,12 ;OUTPUT THE HOUR
TYPEN <:>
LDB T2,[POINTR T5,HS%MIN] ;GET NUMBER OF INTERVALS
IMULI T2,5 ;MAKE MINUTES
NUMOZ T2,12,2 ;OUTPUT MINUTES
TYPEN < GMT> ;OUTPUT THE TIMEZONE
HSTDM7: ;HERE AFTER STATUS STUFF
RET ;WE ARE ALL DONE
SUBTTL Monitor Symbol Support
DEFINE LODSYM(NAME,MODULE),<
SYMCNT==SYMCNT+1
NAME: Z
IF2 <RELOC SYMNAM+SYMCNT-1
SQUOZE 0,NAME
RELOC
RELOC SYMODL+SYMCNT-1
SQUOZE 0,MODULE
RELOC>>
SYMCNT==0
SYMVAL: LODSYM GWTAB,STG ;TABLE OF SYMBOLS WE NEED
LODSYM MAXGWA,IPIPIP
SYMNAM: BLOCK SYMCNT ;SYMBOL NAMES
SYMODL: BLOCK SYMCNT ;SYMBOL MODULES
SYMLOD: ;ROUTINE TO LOAD SYMBOLS
TMNE F%SYML ;SYMBOLS LOADED?
RET ;YES
MOVX T5,<-SYMCNT,,0> ;GET AOBJN POINTER
SYMLOP:
MOVEI T1,.SNPSY ;LOOKUP SYMBOL FUNCTION
MOVE T2,SYMNAM(T5) ;GET THE SYMBOL NAME
MOVE T3,SYMODL(T5) ;GET THE MODULE NAME
SNOOP% ;LOOKUP THE MONITOR SYMBOL
JSYSF
MOVEM T2,SYMVAL(T5) ;SAVE THE SYMBOL VALUE
AOBJN T5,SYMLOP ;LOOP FOR ALL SYMBOLS
SETONE F%SYML ;SYMBOLS ARE LOADED
RET ;RETURN TO CALLER
MONRED: ;READ WORDS FROM THE MONITOR
STKVAR <<XPKBLK,.XPUAD+1>>
MOVEM T1,.XPUAD+XPKBLK ;SAVE THE DESTINATION ADDRESS
MOVEM T2,.XPMAD+XPKBLK ;SAVE THE SOURCE ADDRESS
MOVEM T3,.XPCN1+XPKBLK ;SAVE THE WORD COUNT
MOVEI T1,XPKBLK ;GET THE ADDRESS OF THE BLOCK
MOVEI T2,.XPUAD+1 ;GET THE LENGTH OF THE ARG BLOCK
MOVEM T2,.XPABL+XPKBLK ;SAVE THE BLOCK LENGTH
MOVEI T2,.XPPEK ;GET THE FUNCTION CODE
MOVEM T2,.XPFNC+XPKBLK ;SAVE THE FUNCTION CODE
XPEEK% ;GET WORDS FROM THE MONITOR
JSYSF
RET ;RETURN TO CALLER
SUBTTL Information Command
.INFOR: ;INFORMATION COMMAND
NOISE <ABOUT> ;HELP OUT THE USERS
DOCMD .CMKEY,ICMDS,NETWORK ;ASK FOR A KEYWORD
DODSP ;DISPATCH ON THE KEYWORD
RET ;AND RETURN TO CALLER
.BSTAT: ;INFORMATION (ABOUT) BYPASS (STATUS)
JE F%HOLY,,R ;NO OP IF NOT HOLY
NOISE <STATUS>
CNFIRM
TYPE < Internet bypass is >
MOVEI T1,.IPRIB ;READ BYPASS STATE
IPOPR% ;GET THE BYPASS STATE
JSYSF
HRROI T1,[ASCIZ/enabled/]
SKIPN T2 ;ENABLED?
HRROI T1,[ASCIZ/disabled/]
PSOUT
TYPE <>
TYPE <>
RET ;GET ANOTHER COMMAND
.GATEW: ;INFORMATION (ABOUT) GATEWAY (STATUS)
JE F%HOLY,,PRVCMD ;NEED PRIVS
CALL SYMLOD ;LOAD SYMBOLS IF NEEDED
NOISE <STATUS>
CNFIRM ;MAKE SURE THE USER WANTS THIS
CALL GWYRPT ;DO THE GATEWAY REPORT
RET ;AND RETURN TO CALLER
PRVCMD: ;HERE WHEN A PRIV'ED COMMAND WAS NOT FILTERED
CALL NEWLIN ;NO
TYPE <%This command requires priviledges.>
TYPE <>
TYPE <>
RET ;JUST RETURN
.NETWO: ;INFORMATION (ABOUT) NETWORK
MOVEI T2,INTCFB ;GET THE CFB ADDRESS
CALL .DOCMD ;DO THE COMND JSYS
CAILE T2,NTFCNM ;NAMED NETWORK INTERFACE?
CAILE T2,NTFCNM+MXNETS+1 ;NAMED NETWORK INTERFACE?
JRST .NETW2 ;NOT A NAMED INTERFACE
HRRZ NT,0(T2) ;GET THE INTERFACE INDEX
CNFIRM ;MAKE SURE THE USER WANTS THIS
.NETW1: ;OUTPUT INFORMATION ON A NETWORK
CALL NETSTS ;OUTPUT THE STATUS FOR DESIRED NETWORK
TYPE <>
TYPE <>
RET
.NETW2: ;HERE WHEN NOT A NAMED INTERFACE
DODSP ;DISPATCH ON THE KEYWORD
RET ;GET THE NEXT COMMAND
.INTRF: ;INFORMATION NETWORK INTERFACE COMMAND
NOISE <NUMBER> ;HELP OUT THE USER
DOCMD .CMNUM,10,<0> ;GET THE INTERFACE NUMBER
MOVE NT,T2 ;SAVE THE NUMBER FOR A WHILE
CNFIRM ;MAKE SURE USER WANTS THIS
SKIPL NT ;IS INTERFACE NUMBER LEGIT?
CAML NT,MAXNET ;LEGIT NUMBER?
SKIPA ;NO
JRST .NETW1 ;GO OUTPUT STATUS OF THIS INTERFACE
TYPE <?No such interface>
TYPE <>
TYPE <>
RET
.ALL: ;INFORMATION NETWORK ALL COMMAND
NOISE <INTERFACES>
CNFIRM ;MAKE SURE
MOVN NT,MAXNET ;GET THE NUMBER OF INTERFACES
HRLZS NT ;GET AOBJN POINTER
.ALL2: ;AOBJN LOOP
CALL NETSTS ;OUTPUT STATUS ON THE NETWORK
TYPE <>
AOBJN NT,.ALL2 ;LOOP FOR ALL INTERFACES
TYPE <>
RET ;GO GET ANOTHER COMMAND
SUBTTL NETSTS - Routine to Output Network Status
NETSTS: ;OUTPUT NETWORK STATE
STKVAR <<DCASTS,7>>
MOVEI T1,.GTHNT ;GET NETWORK STATUS FUNCTION
MOVE T2,LNETWN(NT) ;GET THE NETWORK NUMBER
MOVEI T3,DCASTS ;GET ADDRESS OF THE FIRST WORD
MOVSI T4,-7 ;GET SEVEN WORDS OF STATUS
GTHST% ;GET NETWORK STATUS
ERJMP NETSTE ;HANDLE THE ERROR
TYPE <Interface #>
MOVEI T2,(NT) ;GET THE INTERFACE INDEX
NUMO T2,10,0 ;OUTPUT THE INTERFACE INDEX
TYPEN < for network >
MOVE T1,LNETWN(NT) ;GET THE NETWORK NUMBER AGAIN
CALL OCTETS ;OUTPUT THE ADDRESS
HRROI T1,[ASCIZ/ is up/] ;ASSUME INTERFACE IS UP
SKIPN 0+DCASTS ;INTERFACE DOWN?
HRROI T1,[ASCIZ/ is down/] ;YES
SKIPLE 0+DCASTS ;CYCLING?
HRROI T1,[ASCIZ/ is cycling/] ;YES
PSOUT ;OUTPUT THE NETWORK INTERFACE STATE
TYPE <Interface output is >
HRROI T1,[ASCIZ/enabled/] ;ASSUME OUTPUT ENABLED
SKIPN 3+DCASTS ;OUTPUT DISABLED?
HRROI T1,[ASCIZ/disabled/] ;YES
PSOUT ;OUTPUT THE OUTPUT STATE
TYPE <Network service is >
HRROI T1,[ASCIZ/enabled/] ;ASSUME ENABLED INTERFACE
SKIPN 1+DCASTS ;INTERFACE DISABLED?
HRROI T1,[ASCIZ/disabled/] ;YES
SKIPLE 1+DCASTS ;CYCLING
HRROI T1,[ASCIZ/cycling/] ;YES
PSOUT ;OUTPUT THE SERVICE STATE
SKIPG 4+DCASTS ;GET NETWORK CYCLE TIME
JRST NETST2 ;NO CYCLE TIME
TYPE <Last interface cycle transition: >
MOVEI T1,.PRIOU ;OUTPUT TO THE TTY
MOVE T2,4+DCASTS ;GET THE CYCLE TIME
SETZ T3, ;NORMAL FORMAT
ODTIM% ;OUTPUT THE DATE AND TIME
JSYSF
NETST2:
SKIPG 5+DCASTS ;GET NETWORK OFF TIME
JRST NETST3
TYPE <Last network interface off transition: >
MOVEI T1,.PRIOU ;OUTPUT TO THE TTY
MOVE T2,5+DCASTS ;GET THE OFF TIME
SETZ T3, ;NORMAL FORMAT
ODTIM% ;OUTPUT THE DATE AND TIME
JSYSF
NETST3:
SKIPG 6+DCASTS ;GET NETWORK ON TIME
RET ;AND RETURN
TYPE <Last network interface up transition: >
MOVEI T1,.PRIOU ;OUTPUT TO THE TTY
MOVE T2,6+DCASTS ;GET THE ON TIME
SETZ T3, ;NORMAL FORMAT
ODTIM% ;OUTPUT THE DATE AND TIME
JSYSF
RET
NETSTE: ;HERE ON AN ERROR FROM THE STATUS GTHST%
TYPE <%No interface on that network>
RET ;AND RETURN
SUBTTL GWYRPT - Routine to Report Gateway Status
GWYRPT: ;GATEWAY REPORT
STKVAR <GWYADR>
MOVEI T1,GWYADR ;GATEWAY ADDRESS
MOVE T2,GWTAB ;GET ADDRESS OF THE GATEWAY TABLE
MOVEI T3,1 ;ONE WORD
CALL MONRED ;GET A WORD FROM THE MONITOR
MOVN GW,MAXGWA ;GET THE NUMBER OF GATEWAYS
HRLZS GW ;MAKE IT AN AOBJN POINTER
GWYRPL: ;GATEWAY REPORTING LOOP
MOVEI T1,GWYBLK ;STORE INTO GATEWAY BLOCK AREA
MOVE T2,GWYADR ;GET THE ADDRESS OF THE GATEWAY TABLE
ADDI T2,(GW) ;ADD IN THE GATEWAY OFFSET
MOVEI T3,1 ;WE ONLY WANT ONE WORD
CALL MONRED ;GET A WORD FROM THE MONITOR
SKIPN GWYBLK ;DO WE HAVE A GATEWAY BLOCK ADDRESS?
JRST GWYRPX ;NO
;WE FOUND A GATEWAY BLOCK
MOVEI T1,GWYBLK ;STORE INTO GATEWAY BLOCK AREA
MOVE T2,GWYBLK ;GET THE BLOCK ADDRESS
MOVEI T3,GWBKSZ ;GET THE BLOCK SIZE
CALL MONRED ;READ WORDS FROM THE MONITOR
;WE HAVE A COPY OF THE GATEWAY BLOCK
TYPE < Gateway No. >
HRRZ T2,GW ;GET THE GATEWAY NUMBER
NUMO T2,12 ;OUTPUT THE GATEWAY NUMBER
TYPEN <. status is >
HRROI T1,[ASCIZ/up/] ;ASSUME THE GATEWAY IS UP
TMNN GWUP,+GWYBLK ;IS THE GATEWAY UP?
HRROI T1,[ASCIZ/down/] ;NO
PSOUT ;OUTPUT THE GATEWAY STATE
TYPEN <, type is >
LOAD T1,GWTYP,+GWYBLK ;GET THE GATEWAY TYPE
CAILE T1,GWYMAX ;KNOWN GATEWAY TYPE?
SETZ T1, ;NO SO UNKNOWN
MOVE T1,GWYTBL(T1) ;GET THE TYPE STRING
PSOUT ;OUTPUT THE GATEWAY TYPE
;...
SUBTTL GWYRPT Continued
;...
TYPEN <, successful pings >
LOAD T2,GWSPC,+GWYBLK ;GET THE PING COUNT
NUMO T2,12,0 ;OUTPUT THE PING COUNT
TYPEN <.> ;IT WAS DECIMAL OUTPUT
TYPE < Connected Address >
MOVE T1,.GWILS+GWYBLK ;GET THE CONNECTED ADDRESS
CALL ADROUT ;OUTPUT THE ADDRESS
MOVEI GL,GWYBLK+.GWILS+1 ;GET ADDRESS OF GATEWAY ADDRESSES
HRLI GL,-MXGWIC ;MAKE AN AOBJN POINTER
GWYALP: ;GATEWAY ADDRESS LOOP
SKIPN T1,(GL) ;GET THE ADDRESS
JRST GWYALX ;NO ADDRESS HERE
TYPE < Alernate Address >
MOVE T1,(GL) ;GET THE ADDRESS
CALL ADROUT ;OUTPUT THE ADDRESS
GWYALX:
AOBJN GL,GWYALP ;LOOP FOR ALL ADDRESSES
TYPE <>
GWYRPX:
AOBJN GW,GWYRPL ;LOOP FOR ALL GATEWAYS
TYPE <>
RET
GWYTBL: ;GATEWAY TYPES
-1,,[ASCIZ/unknown/]
-1,,[ASCIZ/prime/]
-1,,[ASCIZ/dumb/]
-1,,[ASCIZ/host/]
-1,,[ASCIZ/always-up/]
GWYMAX==.-GWYTBL
ADROUT: ;ADDRESS OUTPUT ROUTINE
STKVAR <ADRHST>
MOVEM T1,ADRHST ;SAVE THE HOST ADDRESS
MOVE T5,[POINT 8,ADRHST,3] ;GET THE BYTE POINTER
MOVEI T6,4 ;FOUR BYTES
ADROUL: ;ADDRESS OUTPUT LOOP
ILDB T2,T5 ;GET A BYTE
NUMO T2,12,0 ;OUTPUT THE OCTET
MOVEI T1,"." ;GET A DOT
CAIE T6,1 ;IS THIS THE LAST OCTET?
PBOUT ;NO SO OUTPUT THE DOT
SOJG T6,ADROUL ;LOOP FOR ALL FOUR OCTETS
TYPEN < (> ;PROMPT
MOVEI T1,.GTHNS ;HOST NAME FUNCTION
MOVEI T2,.PRIOU ;OUTPUT TO THE TTY
MOVE T3,ADRHST ;GET THE HOST ADDRESS
GTHST% ;OUTPUT THE HOST NAME
ERJMP ADROU2 ;ASSUME NO HOST NAME IF NOT FOUND
TYPEN <)>
RET
ADROU2: ;HERE WHEN HOST NAME NOT FOUND
TYPEN <unknown name)>
RET ;AND RETURN TO CALLER
SUBTTL Retrieve Command and Support Routines
.RETRI: ;RETRIEVE COMMAND
TRVAR <RRBYT,RRHST,RRPRT,RRCMD,<RRBUF,<^D100/5+1>>>
SETZRO F%FLT ;DO NOT NEED FILTERING
DOCMD .CMKEY,RCMDS,<HOST> ;GET A KEYWORD
DODSP ;DISPATCH ON THE KEYWORD
RET ;RETURN FOR ANOTHER COMMAND
RRHOST: ;READ HOST NAME AND PORT PAIR
NOISE <TABLE FROM> ;HELP OUT THE USER
CALL HSTLOD ;GET HOST NAMES
MOVEI T2,HSCFB3 ;GET THE CFB ADDRESS
CALL .DOCMD ;GET THE HOST NAME
HRRZ T1,0(T2) ;GET THE INDEX
MOVEI T1,.GTHHI ;HOST INDEX TO NUMBER TRANSLATION
HRRZ T3,0(T2) ;GET THE INDEX
GTHST% ;GET THE NUMBER
JSYSF
MOVEM T3,RRHST ;SAVE THE HOST NUMBER
NOISE <ON PORT>
DOCMD .CMNUM,12,<101> ;GET THE PORT NUMBER
MOVEM T2,RRPRT ;SAVE THE PORT NUMBER
NOISE <INTO FILE> ;HELP OUT THE USER
RET ;RETURN TO THE CALLER
RHOSTF: ;HERE TO GET THE FILE JFN OPEN
MOVEM T2,RTRJFN ;SAVE THE JFN
SETONE F%ROJ ;FLAG THAT THE JFN IS ASSIGNED
CNFIRM ;MAKE SURE
MOVE T1,RTRJFN ;GET THE JFN
MOVX T2,<7B5!OF%WR> ;WE WANT TO WRITE THIS FILE
OPENF% ;OPEN UP THE FILE FOR IO
JSYSF
SETONE F%ROO ;JFN IS OPEN
SETZRO F%ROJ ;RESET JFN IS ASSIGNED
RET ;RETURN TO THE CALLER
RHOSTC: ;HERE TO CLOSE UP THE FILE
MOVE T1,RTRJFN ;GET THE JFN
CLOSF% ;CLOSE THE FILE
JSYSF
SETZRO F%ROO ;JFN IS NO LONGER OPEN
RET ;AND GET ANOTHER COMMAND
SUBTTL Retrieve Command Subcommands
.RHOST: ;RETRIEVE HOST (TABLE)
CALL RRHOST ;GET THE HOST NUMBER AND PORT
DOCMD .CMOFI,,<HOSTS.TXT> ;GET A FILE TO OUTPUT INTO
CALL RHOSTF ;GO OPEN UP THE FILE
HRROI T1,[ASCIZ/ALL/] ;COMMAND TO SEND TO THE NIC
MOVEM T1,RRCMD ;SAVE THE NIC COMMAND POINTER
SETONE F%FLT ;WE NEED FILTERING
CALL NICRED ;READ IN THE FILE
CALL RHOSTC ;CLOSE THE FILE
RET ;AND GET NEXT COMMAND
.RGATE: ;RETRIEVE GATEWAY (TABLE)
CALL RRHOST ;GET THE HOST NUMBER AND PORT
DOCMD .CMOFI,,<INTERNET.GATEWAYS> ;GET A FILE TO OUTPUT INTO
CALL RHOSTF ;GO OPEN UP THE FILE
HRROI T1,[ASCIZ/ALL-INGWAY/] ;COMMAND TO SEND TO THE NIC
MOVEM T1,RRCMD ;SAVE THE NIC COMMAND POINTER
CALL NICRED ;READ IN THE FILE
CALL RHOSTC ;CLOSE THE FILE
RET ;AND GET NEXT COMMAND
.ROHST: ;RETRIEVE OLD-HOST (TABLE)
CALL RRHOST ;GET THE HOST NUMBER AND PORT
DOCMD .CMOFI,,<HOSTS.TXT> ;GET A FILE TO OUTPUT INTO
CALL RHOSTF ;GO OPEN UP THE FILE
HRROI T1,[ASCIZ/ALL-OLD/] ;COMMAND TO SEND TO THE NIC
MOVEM T1,RRCMD ;SAVE THE NIC COMMAND POINTER
SETONE F%FLT ;WE NEED FILTERING
CALL NICRED ;READ IN THE FILE
CALL RHOSTC ;CLOSE THE FILE
RET ;AND GET NEXT COMMAND
SUBTTL Retrieve Command TCP Routines
NICRED: ;ROUTINE TO OPEN A TCP CONNECTION TO THE NIC
STKVAR <NICRP,NICRC>
CALL TCPGTJ ;GET THE TCP JFN
CALL TCPOPN ;OPEN THE TCP CONNECTION
CALL TCPSND ;SEND THE COMMAND
TYPE < [ Receiving TCP data >
SETZRO F%BIN ;INITIAL RETRIEVE BUFFER NOT READ
NICRD0: ;READ LOOP
MOVE T1,TCPJFN ;GET THE NETWORK JFN
MOVX T2,<POINT 7,TCPBUF> ;GET THE INITIAL POINTER
MOVEM T2,NICRP ;SAVE THE POINTER
MOVNI T3,<5*^D512> ;ASK FOR A PAGE OF DATA
MOVEM T3,NICRC ;SAVE THE COUNT
SIN% ;READ IN A PAGE OF DATA
ERJMP NICRD3 ;HERE WHEN WE GET AN ERROR
JE F%FLT,,NICRD2 ;NEED FILTERING?
JN F%BIN,,NICRD2 ;YES. ALLREADY READ FIRST BUFFER?
NICRD1: ;REMOVE PREFIX LOOP
AOS NICRC ;FIX THE COUNT BY ONE
ILDB T1,NICRP ;GET A BYTE
CAIE T1,":" ;GOT A COLON?
JRST NICRD1 ;NO SO KEEP GOING
NICRD2: ;HERE TO OUTPUT THE BUFFER
MOVE T1,RTRJFN ;GET THE RETRIEVE FILE JFN
MOVE T2,NICRP ;SOURCE POINTER
MOVE T3,NICRC ;ASK FOR A PAGE OF DATA
SOUT% ;DUMP IT TO THE FILE
JSYSF
TYPEN <.> ;TELL USER WE ARE STILL DOING WORK
SETONE F%BIN ;INITIAL RETRIEVE BUFFER NOW READ
JRST NICRD0 ;LOOP IT UNTIL DONE
NICRD3: ;HERE WHEN WE GOT A READ ERROR
JE F%FLT,,NICRD6 ;FILTERING?
JE F%BIN,,NICRD6 ;PREFIX FILTERED?
NICRD4: ;SUFFIX COLON SEARCHING LOOP
LDB T1,T2 ;GET A BYTE
CAIN T1,":" ;IS IT A COLON?
JRST NICRD5 ;YES
SETO T1, ;GET A -1
EXCH T1,T2 ;SWITCH ACS
IBP T2,T1 ;BACKUP THE BYTE POINTER ONE BYTE
AOSGE NICRC ;FIX UP THE COUNT
JRST NICRD4 ;KEEP LOOKING FOR THE COLON
JRST NICRD6 ;HERE WHEN NO COLON FOUND
NICRD5: ;SUFFIX LF SEARCH LOOP
LDB T1,T2 ;GET A BYTE
CAIN T1,"J"-100 ;LINE FEED?
JRST NICRD6 ;YES
SETO T1, ;GET A -1
EXCH T1,T2 ;SWITCH ACS
IBP T2,T1 ;BACKUP THE BYTE POINTER ONE BYTE
AOSGE NICRC ;FIX UP THE COUNT
JRST NICRD5 ;KEEP LOOKING FOR THE COLON
NICRD6: ;HERE TO OUTPUT THE LAST BUFFER
MOVE T1,RTRJFN ;GET THE RETRIEVE JFN
MOVN T2,NICRC ;GET THE COUNT WE TRIED TO READ
ADD T3,T2 ;HOW MANY BYTES DID WE READ?
MOVE T2,NICRP ;SOURCE POINTER
SKIPE T3 ;DID WE READ ANY?
SOUT% ;YES SEND THEM OUT
JSYSF ;GET ANY OUTPUT ERRORS
TYPEN < ] [OK]>
CALL TCPCLS ;CLOSE THE TCP CONNECTION
TYPE <>
TYPE <>
RET ;AND RETURN
SUBTTL Retrieve Command TCP Routines Continued
TCPSND: ;SEND THE COMMAND TO THE NIC
MOVE T1,TCPJFN ;GET THE JFN
MOVE T2,RRCMD ;GET THE COMMAND STRING
SETZB T3,T4 ;ASCIZ
SOUT% ;SEND THE COMMAND TO THE NIC
JSYSF
HRROI T2,[ASCIZ/
/] ;GET A CRLF
SOUTR% ;FORCE THE BUFFER OUT
JSYSF
RET ;AND RETURN
TCPERR: ;HERE ON TCP OPENF AND CLOSF ERRORS
TYPEN < [ Failed: > ;PROMPT ERROR STRING
MOVEI T1,.PRIOU ;OUTPUT TO TTY
MOVX T2,<.FHSLF,,-1> ;MY LAST ERROR
SETZB T3,T4 ;NO FUNNY LIMITS
ERSTR ;OUTPUT THE ERROR STRING
NOERR ;HANDLE ANY ERRORS
NOERR ;HANDLE ANY ERRORS
TYPEN < ]>
TYPE <>
TYPE <>
JRST GETCMD ;GET ANOTHER COMMAND
TCPGTJ: ;HERE TO GTJFN THE TCP CONNECTION
HRROI T1,RRBUF ;GET INITIAL GTJFN STRING ADDRESS
HRROI T2,[ASCIZ/TCP:./] ;DEVICE NAME
SETZB T3,T4 ;PLAIN ASCIZ
SOUT% ;APPEND THE STRING
JSYSF
MOVE T2,RRHST ;GET THE HOST NUMBER
MOVEI T3,10 ;IN OCTAL
NOUT% ;APPEND THE HOST NUMBER
JSYSF
MOVEI T2,"-" ;GET THE SEPARATOR
IDPB T2,T1 ;APPEND THE SEPARATOR
MOVE T2,RRPRT ;GET THE PORT NUMBER
MOVEI T3,12 ;IN DECIMAL
NOUT% ;APPEND THE PORT NUMBER
JSYSF
HRROI T2,[ASCIZ/;CONNECTION:ACTIVE;PERSIST:10;TIMEOUT:10/] ;GET ATRIBUTES
SETZB T3,T4 ;ASCIZ
SOUT% ;APPEND THE ATTRIBUTES
JSYSF
MOVX T1,GJ%SHT ;SHORT MODE GTJFN
HRROI T2,RRBUF ;GET THE STRING ADDRESS
GTJFN% ;GET THE NETWORK JFN
JSYSF
SETONE F%TOJ ;FLAG THAT TCP JFN EXISTS
MOVEM T1,TCPJFN ;SAVE THE JFN
RET
TCPOPN: ;HERE TO OPEN THE TCP CONNECTION
TYPE < [ Opening TCP connection ]>
MOVE T1,TCPJFN ;GET THE JFN
MOVX T2,<10B5!<.TCMWI>B9!OF%RD!OF%WR> ;GET OPENF FLAGS
OPENF% ;OPEN UP THE CONNECTION
ERJMP TCPERR
SETONE F%TOO ;FLAG THAT TCP JFN IS OPEN
SETZRO F%TOJ ;FLAG THAT TCP JFN IS NOT JUST GTJFN'ED
TYPEN < [OK]> ;FLAG SUCCESS
RET ;RETURN TO CALLER
TCPCLS: ;HERE TO CLOSE THE TCP CONNECTION
TYPE < [ Closing TCP connection ]>
MOVE T1,TCPJFN ;GET THE TCP JFN
CLOSF% ;CLOSE THE CONNECTION
ERJMP TCPERR
TYPEN < [OK]>
SETZRO F%TOO ;FLAG THAT IT IS CLOSED
RET
ENDTV.
SUBTTL Ethernet Command
.ETHER: ;ETHERNET COMMAND
DOCMD .CMKEY,ECMDS ;GET A SUBCOMMAND
DODSP ;DISPATCH ON THE COMMAND
RET ;RETURN TO CALLER
E.INIT: ;ETHERNET INITIALIZE COMMAND
NOISE <ADDRESS MAPPING FILE>
CNFIRM ;MAKE SURE
MOVEI T1,.IPIGH ;GET THE FUNCTION CODE
IPOPR% ;RELOAD THE ETHERNET MAPPING FILE
JSYSF ;HANDLE ERRORS
RET ;GET ANOTHER COMMAND
E.ARP: ;ETHERNET ARP COMMAND
STKVAR <EARPT>
NOISE <PROTOCOL IS>
DOCMD .CMKEY,EACMDS,ENABLED ;FIND OUT WHAT THE USER WANTS
HRRZ T2,0(T2) ;GET THE FLAG
MOVEM T2,EARPT ;SAVE THE FLAG
CNFIRM ;MAKE SURE THE USER WANTS THIS
MOVEI T1,.IPNAP ;GET THE FUNCTION CODE
MOVE T2,EARPT ;GET WHAT THE USER WANTED
IPOPR% ;ENABLE OR DISABLE ARP ON THE NI
JSYSF ;HANDLE ERRORS
RET ;GET ANOTHER COMMAND
E.IP: ;ETHERNET IP COMMAND
STKVAR <IPPT>
NOISE <PROTOCOL IS>
DOCMD .CMKEY,EACMDS,ENABLED ;FIND OUT WHAT THE USER WANTS
HRRZ T2,0(T2) ;GET THE FLAG
MOVEM T2,IPPT ;SAVE THE FLAG
CNFIRM ;MAKE SURE THE USER WANTS THIS
MOVEI T1,.IPNIP ;GET THE FUNCTION CODE
MOVE T2,IPPT ;GET WHAT THE USER WANTED
IPOPR% ;ENABLE OR DISABLE IP ON THE NI
JSYSF ;HANDLE ERRORS
RET ;GET ANOTHER COMMAND
SUBTTL ETHERNET STATUS Command
E.STAT: ;ETHERNET STATUS COMMAND
NOISE <INFORMATION>
CNFIRM ;MAKE SURE
CALL NIRCI ;READ AND REPORT CHANNEL INFORMATION
TYPE <>
CALL NIRCC ;READ CHANNEL COUNTERS
CALL NIRPL ;GET THE PORTAL LIST
IFN BUGGY,<
MOVX PT,<<-MXPTYP>,,1> ;INITIALIZE THE AOBJN POINTER
ESTAT2: ;PORTAL SCANNING LOOP
SKIPN NIPTYP(PT) ;PORTAL OPEN?
IFSKP. ;YES
TYPE <> ;EXTRA CRLF
CALL NIRPC ;READ PORTAL COUNTERS
ENDIF.
AOBJN PT,ESTAT2 ;FOR FOR ALL PROTOCOL TYPES
>
TYPE <>
TYPE <>
RET ;AND RETURN
SUBTTL Ethernet Read Channel Info
NIRCI: ;READ CHANNEL INFORMATION
STKVAR <<NRCIB,.EIHRD+2>>
MOVEI T1,1+NRCIB ;GET ADDRESS OF BLOCK
HRLI T1,NRCIB ;MAKE IT A BLT AC
SETZM NRCIB ;ZERO THE FIRST WORD
BLT T1,.EIAR2+NRCIB ;ZERO THE REST OF THE WORDS
MOVX T1,<.EIHRD+2,,.EIRCI> ;GET THE FUNCTION CODE
MOVEM T1,NRCIB ;SET IT IN THE BLOCK
MOVEI T1,NRCIB ;GET THE ARG BLOCK ADDRESS
NI% ;GET THE INFORMATION FROM THE MONITOR
JSYSF
TYPE < Current channel state is: >
MOVE T1,.EISTA+NRCIB ;GET THE CHANNEL STATE
ANDX T1,<EI%EXS> ;GET THE VALID BITS ONLY
CAILE T1,NISTMX ;KNOWN STATE?
SETZ T1, ;NO
MOVE T1,NISTAT(T1) ;GET THE STATUS STRING
PSOUT% ;OUTPUT CHANNEL STATE
TYPE < Current channel address: >
DMOVE T1,.EIPHY+NRCIB ;GET THE ADDRESS
CALL HEXOUT ;OUTPUT THE ADDRESS IN HEX
TYPE < Hardware channel address: >
DMOVE T1,.EIHRD+NRCIB ;GET THE HARDWARE ADDRESS
CALL HEXOUT ;OUTPUT IT ALSO
RET ;AND RETURN
SUBTTL Ethernet Read Channel Counters
NIRCC: ;READ CHANNEL COUNTERS
SAVEAC <T5>
STKVAR <<NRCCB,<.EIAR2+1>>,<NRCCD,<.ECUBU+1>>>
MOVEI T1,1+NRCCB ;GET ADDRESS OF BLOCK
HRLI T1,NRCCB ;MAKE IT A BLT AC
SETZM NRCCB ;ZERO THE FIRST WORD
BLT T1,.EIAR2+NRCCB ;ZERO THE REST OF THE WORDS
MOVX T1,<<.EIAR2+1>,,.EIRCC> ;GET THE FUNCTION CODE
MOVEM T1,0+NRCCB ;SET IT
MOVEI T1,.ECUBU ;GET THE BUFFER SIZE
MOVEM T1,.EIAR1+NRCCB ;SET IT
MOVEI T1,NRCCD ;GET THE BUFFER ADDRESS
MOVEM T1,.EIAR2+NRCCB ;SET IT
MOVEI T1,NRCCB ;GET THE ARG BLOCK ADDRESS
NI% ;GET THE DATA FROM MONITOR
JSYSF
MOVEI T5,1+NRCCD ;GET THE DATA ADDRESS
MOVSI T5,<-.ECUBU> ;MAKE IT AN AOBJN POINTER
NIRCCL: ;THIS IS THE LOOP
SKIPN T1,NICONT(T5) ;GET THE DESCRIPTOR STRING
IFSKP.
TYPE < > ;NEW LINE
HRRO T1,NICONT(T5) ;MAKE IT A BYTE POINTER
PSOUT% ;OUTPUT THE STRING
JSYSF
MOVEI T2,1+NRCCD ;GET THE DATA ITEM ADDRESS
ADDI T2,(T5) ;ADD IN THE AOBJN POINTERR
MOVE T2,(T2) ;GET THE DATA ITEM
NUMO T2,12 ;OUTPUT THE ITEM IN DECIMAL
ENDIF.
AOBJN T5,NIRCCL ;LOOP FOR ALL ITEMS
;...
;...
SKIPN .ECSFM+NRCCD ;AND SEND FAILURE BITS?
SKIPE .ECRFM+NRCCD ;OR ANY RECEIVE FAILURE BITS?
IFNSK. ;YES
TYPE <> ;DO AN EXTRA CRLF
ENDIF.
SKIPN T5,.ECSFM+NRCCD ;SEND FAILURES?
IFSKP. ;YES
TYPE < Send failures due to: >
MOVEI T1,NISFAL ;GET FAILURE MASK STRINGS
MOVEI T2,<POS(EC%LOC)> ;GET THE FIRST BIT POSITION
MOVEI T3,<POS(EC%LOC)+NISFMX> ;GET THE LAST BIT POSITION
CALL NIRMSK ;OUTPUT THE MASK BITS
ENDIF.
SKIPN T5,.ECRFM+NRCCD ;RECEIVE FAILURES?
IFSKP. ;YES
TYPE < Receive failures due to: >
MOVEI T1,NIRFAL ;GET FAILURE MASK STRINGS
MOVEI T2,<POS(EC%FLE)> ;GET THE FIRST BIT POSITION
MOVEI T3,<POS(EC%FLE)+NIRFMX> ;GET THE LAST BIT POSITION
CALL NIRMSK ;OUTPUT THE MASK BITS
ENDIF.
RET ;AND RETURN TO CALLER
ENDSV.
NIRMSK: ;ROUTINE TO OUTPUT FAILURE BIT MASKS
STKVAR <NRMSB,NRMSL,NRMSS> ;T5 HAS THE MASK, T1 HAS ADR OF STRINGS
SETZRO F%ES1 ;RESET THE FLAG
SUB T1,T2 ;MAKE IT SO WE CAN USE DIRECT OFFSETS
MOVEM T1,NRMSS ;SAVE THE STRING ADDRESS
MOVEM T2,NRMSB ;SAVE THE FIRST BIT POSITION
MOVEM T3,NRMSL ;SAVE THE LAST BIT POSITION
MOVE T1,NRMSB ;GET THE FIRST BIT
NIRMLP: ;THIS IS THE LOOP
MOVE T1,T5 ;GET THE BIT MASK
JFFO T1,NIRML2 ;DID WE FIND A BIT SET?
RET ;NO SO RETURN
NIRML2: ;HERE WHEN WE FOUND A BIT
MOVE T1,BITS(T2) ;GET THE BIT MASK
TDZ T5,T1 ;TURN OFF THE BIT IN QUESTION
CAML T2,NRMSB ;IS THE BIT WITHIN RANGE?
CAMG T2,NRMSL ;?
IFNSK. ;HERE WHEN WITHIN RANGE
TMNN F%ES1 ;IS THE FLAG ON?
IFSKP. ;YES
BLOCK.
SAVEAC <T1,T2,T3,T4>
TYPEN <, > ;TYPE OUT A DELIMITOR
ENDBK.
ENDIF.
SETONE F%ES1 ;SET THE FLAG
MOVE T1,NRMSS ;GET ADDRESS OF THE STRING TABLE
ADDI T1,(T2) ;GET THE OFFSET
MOVE T1,(T1) ;GET THE STRING
PSOUT% ;AND OUTPUT IT
JSYSF
ENDIF.
JRST NIRMLP ;DO THE NEXT BIT
ENDSV.
SUBTTL Ethernet Read Portal Stuff
NIRPL: ;READ PROTOCOL LIST
SETZM NIPTYP ;ZERO THE FIRST WORD
MOVX T1,<NIPTYP,,NIPTYP+1> ;GET THE BLT AC
BLT T1,NIPTYP+MXPTYP ;ZERO THE WHOLE BLOCK
STKVAR <<NRPLB,<.EIAR2+1>>>
MOVEI T1,1+NRPLB ;GET ADDRESS OF BLOCK
HRLI T1,NRPLB ;MAKE IT A BLT AC
SETZM NRPLB ;ZERO THE FIRST WORD
BLT T1,.EIAR2+NRPLB ;ZERO THE REST OF THE WORDS
MOVX T1,<<.EIAR2+1>,,.EIRPL> ;GET THE FUNCTION CODE
MOVEM T1,0+NRPLB ;SET IT
MOVX T1,<EI%GBL> ;GET THE GLOBAL FLAG BIT
MOVEM T1,.EIFLG+NRPLB ;SET IT
MOVEI T1,MXPTYP ;GET THE BUFFER LENGTH
MOVEM T1,.EIAR1+NRPLB ;SET IT
MOVEI T1,NIPTYP ;GET THE BUFFER ADDRESS
MOVEM T1,.EIAR2+NRPLB ;SET IT
MOVEI T1,NRPLB ;GET THE ARG BLOCK ADDRESS
NI% ;GET THE PORTAL LIST
JSYSF
RET ;RETURN TO CALLER
ENDSV.
NIRPC: ;READ PORTAL COUNTERS
STKVAR <<NRPCB,<.EIAR2+1>>,<NRPCD,<.EPUBU+1>>>
MOVEI T1,1+NRPCB ;GET ADDRESS OF BLOCK
HRLI T1,NRPCB ;MAKE IT A BLT AC
SETZM NRPCB ;ZERO THE FIRST WORD
BLT T1,.EIAR2+NRPCB ;ZERO THE REST OF THE WORDS
MOVX T1,<<.EIAR2+1>,,.EIRPC> ;GET THE FUNCTION CODE
MOVEM T1,0+NRPCB ;SET IT
HRRZ T1,NIPTYP(PT) ;GET THE PORTAL ID
TXO T1,<EI%GBL> ;GET THE GLOBAL FLAG BIT
MOVEM T1,.EIFLG+NRPCB ;SET IT
HLRZ T1,NIPTYP(PT) ;GET THE JOB NUMBER
MOVEM T1,.EIJOB+NRPCB ;SET IT
MOVEI T1,.EPUBU ;GET THE BUFFER SIZE
MOVEM T1,.EIAR1+NRPCB ;SET IT
MOVEI T1,NRPCD ;GET THE BUFFER ADDRESS
MOVEM T1,.EIAR2+NRPCB ;SET IT
MOVEI T1,NRPCB ;GET THE ARG BLOCK ADDRESS
NI% ;GET THE DATA FROM MONITOR
JSYSF
MOVEI T5,1+NRPCD ;GET THE DATA ADDRESS
MOVSI T5,<-.EPUBU> ;MAKE IT AN AOBJN POINTER
NIRPCL: ;THIS IS THE LOOP
TYPE < > ;NEW LINE
HRRO T1,PICONT(T5) ;MAKE IT A BYTE POINTER
PSOUT% ;OUTPUT THE STRING
JSYSF
MOVEI T2,1+NRPCD ;GET THE DATA ITEM ADDRESS
ADDI T2,(T5) ;ADD IN THE AOBJN POINTERR
MOVE T2,(T2) ;GET THE DATA ITEM
NUMO T2,12 ;OUTPUT THE ITEM IN DECIMAL
AOBJN T5,NIRPCL ;LOOP FOR ALL ITEMS
RET ;AND RETURN TO CALLER
ENDSV.
SUBTTL Build Command
.BUILD: ;BUILD COMMAND
NOISE <ETHERNET MAPPINGS FROM>
DOCMD .CMIFI,,<SYSTEM:INTERNET-ETHERNET-MAPPINGS.TXT>
MOVEM T2,BLDIJF ;SAVE THE JFN
SETONE F%BIJ ;INPUT JFN EXISTS
MOVE T1,BLDIJF ;GET THE JFN
MOVX T2,<7B5!OF%RD> ;WE WANT TO READ THIS FILE
OPENF% ;OPEN IT UP
JSYSC ;HANDLE ERROR LIKE A COMMAND ERROR
SETONE F%BIO ;INPUT JFN IS OPEN
SETZRO F%BIJ ;SO TURN OFF THIS
NOISE <TO>
DOCMD .CMOFI,,<SYSTEM:INTERNET-ETHERNET-MAPPINGS.BIN>
MOVEM T2,BLDOJF ;SAVE THE OUTPUT JFN
SETONE F%BOJ ;OUTPUT JFN EXISTS
MOVE T1,BLDOJF ;GET THE OUTPUT JFN
MOVX T2,<44B5!OF%WR> ;WE WANT TO WRITE THIS FILE
OPENF% ;OPEN UP THE OUTPUT FILE FOR IO
JSYSC ;HANDLE ERROR LIKE A COMMAND ERROR
SETONE F%BOO ;OUTPUT JFN IS OPEN
SETZRO F%BOJ ;SO TURN OFF THIS
CNFIRM
CALL IPNIRD ;READ THE FILE
RET ;ERROR RETURN
SETZRO F%BIO ;FLAG THAT INPUT IS NO LONGER OPEN
MOVE T1,BLDIJF ;GET THE INPUT JFN
CLOSF% ;CLOSE IT
JSYSF ;HANDLE ERROR
CALL IPNIWR ;WRITE THE NEW FILE
SETZRO F%BOO ;FLAG THAT OUTPUT IS NO LONGER OPEN
MOVE T1,BLDOJF ;GET THE OUTPUT JFN
CLOSF% ;CLOSE IT
JSYSF
RET ;AND RETURN TO CALLER
SUBTTL Ethernet Mapping Text File COMND Processing
.BOCMD: ;HERE FROM DOCMDB MACRO
MOVEI T1,BCSB ;GET ADDRESS OF COMND STATE BLOCK
COMND ;DO THE JSYS
ERJMP BOCMD2 ;HANDLE REAL BAD ERRORS
JE CM%NOP,T1,R ;IF NOT A NO PARSE THEN WE ARE DONE
BOCMD2: ;HERE ON ERROR OR NOPARSE
MOVEI T1,.FHSLF ;THIS FORK
GETER% ;GET THE ERROR CODE
HRRZS T2 ;ZERO THE RIGHT HALF
CAIN T2,IOX4 ;EOF?
JRST BPFEOF ;YES
CALL NEWLIN ;UH OH...GET A NEW LINE
TYPEN <?Command error processing mapping input file>
TYPE <?>
MOVEI T1,.PRIOU ;OUTPUT TO TTY
MOVX T2,<.FHSLF,,-1> ;MY LAST ERROR
SETZB T3,T4 ;NO FUNNY LIMITS
ERSTR ;OUTPUT THE ERROR STRING
NOERR ;HANDLE ERRORS
NOERR ;HANDLE ERRORS
TYPE <?>
HRROI T1,BXTBUF ;GET A POINTER TO THE TEXT BUFFER
PSOUT% ;OUTPUT THE TEXT BUFFER
SETONE F%BERR ;SET THE ERROR FLAG
JRST IPNIR3
SUBTTL Ethernet Mapping Text File Parsing
IPNIRD: ;HERE TO READ THE TEXT FILE
MOVEM P,BUILDP ;SAVE THE STACK POINTER
JN F%BULD,,IPNIR2 ;INITED BCSB YET?
MOVX T1,<BCSBV,,BCSB> ;NO SO GET A BLT AC
BLT T1,BCSB+BCSBSZ-1 ;INIT THE CSB
SETONE F%BULD ;FLAG THAT WE HAVE DONE THIS
IPNIR2: ;HERE WHEN BCSB INITED...INIT THE ENTRY QUEUE
MOVEI T1,LNKHED ;GET INITIAL VALUE FOR QUEUE HEAD POINTER
MOVEM T1,LNKHED ;AND SAVE IT
MOVEI T1,LNKSTG ;GET FIRST STORAGE LOCATION
MOVEM T1,LNKFST ;AND SAVE IT IN PROPER PLACE
;FIX THE CSB FOR INPUT FROM THE JFN
HRLZ T1,BLDIJF ;GET THE INPUT JFN
HRRI T1,.NULIO ;NO OUTPUT
MOVEM T1,BCSB+.CMIOJ ;SAVE THE IO DESIGNATORS
SETZRO F%BERR ;RESET BUILD ERROR FLAG
IPNIR3: ;HERE TO GET A COMMAND
MOVE P,BUILDP ;REFRESH THE STACK
JN F%BERR,,R ;ERROR RETURN
DOCMDB .CMINI ;START UP A COMMAND
BPARSE: ;REPARSE ADDRESS
MOVE P,BUILDP ;REFRESH THE STACK
DOCMDB .CMKEY,BCMDS ;GET A KEYWORD
DODSP ;DISPATCH ON THE KEYWORD
JE F%BERR,,IPNIR3 ;IF NO ERROR GET ANOTHER COMMAND
RET ;NON SKIP...ERROR RETURN
BPFEOF: ;HERE WHEN WE FOUND THE EOF
MOVE P,BUILDP ;FIX UP THE STACK
JE F%BERR,,RSKP ;SUCCESS RETURN IF NO ERROR
RET ;OTHERWISE ERROR RETURN
SUBTTL Ethernet Mapping File Processing - HOST Command
.HOST: ;HERE ON THE HOST COMMAND
TRVAR <BHSTFL,BHSTIA,<BHSTHX,2>>
SETZM BHSTFL ;ZERO OUT THE FLAG WORD
SETZM BHSTIA ;ZERO OUT THE INTERNET ADDRESS
SETZM BHSTHX ;ZERO OUT THE HEX NUMBER
SETZM 1+BHSTHX ;ZERO OUT THE HEX NUMBER
MOVEI T5,5 ;READ SIX HEX OCTETS
MOVX T6,<POINT 8,BHSTHX> ;GET THE BYTE POINTER
.HOST2: ;OCTET READING LOOP
DOCMDB .CMFLD,,,,HEXBRK ;READ IN THE OCTET
MOVX T1,<POINT 7,BTMBUF> ;GET THE POINTER
CALL HEXRED ;READ HEX FROM THE ATOM BUFFER
JRST .HOST3 ;ERROR READING HEX
IDPB T1,T6 ;DEPOSIT THE OCTET
JUMPE T5,.HOST4 ;IF LAST BYTE WE ARE DONE
DOCMDB .CMTOK,<-1,,[ASCIZ/-/]> ;GET A HYPHEN
SOJA T5,.HOST2 ;GO READ THE NEXT OCTET
.HOST3: ;HERE ON AN ERROR READING HEX
CALL NEWLIN ;GET A NEW LINE
TYPEN <?Command error reading HEX Ethernet address. Build aborted.>
TYPE <?>
HRROI T1,BXTBUF ;GET A POINTER TO THE TEXT BUFFER
PSOUT% ;OUTPUT THE TEXT BUFFER
SETONE F%BERR ;SET THE ERROR FLAG
JRST IPNIR3 ;ABORT THE READ
.HOST4: ;HERE TO GET THE INTERNET PORTION OF ADR
MOVEI T5,3 ;FOUR OCTETS
MOVX T6,<POINT 8,BHSTIA,3> ;GET THE TARGET POINTER
.HOST5: ;OCTET READING LOOP
DOCMDB .CMNUM,12 ;GET A DECIMAL OCTET
IDPB T2,T6 ;DEPOSIT THE OCTET
JUMPE T5,.HOST6 ;DO WE HAVE ALL THE OCTETS?
DOCMDB .CMTOK,<-1,,[ASCIZ/./]> ;NO SO PARSE A DOT
SOJA T5,.HOST5 ;KEEP READING IN OCTETS
.HOST6: ;HERE WHEN WE HAVE ALL THE OCTETS
MOVEI T2,HSWCFB ;GET THE CFB WE WANT
CALL .BOCMD ;GET A SWITCH OF A CONFIRM
HRRZS T3 ;ZERO THE LEFT HALF
LDB T3,[POINT 9,(T3),8] ;GET THE FUNCTION CODE
CAIN T3,.CMCFM ;WAS IT A CONFIRM?
JRST .HOST7 ;YES
DODSP ;NO SO DISPATCH ON THE SWITCH
JRST .HOST6 ;AND LOOP UNTIL A CONFIRM OR ERROR
.HOST7: ;HERE WHEN THE LINE IS CONFIRMED
CALL ADDENT ;STORE THE ENTRY (RETURNS T1)
CALL QUEENT ;QUEUE UP THE ENTRY (T1 HAS ENTRY ADDRESS)
RET ;AND RETURN TO CALLER
.HARP: ;ARP SWITCH
MOVX T1,GH%DMB ;ARP POSSIBLE FLAG
ANDCAM T1,BHSTFL ;SAY THAT THIS HOST CAN DO ARP
RET ;AND RETURN
.HNARP: ;NOARP SWITCH
MOVX T1,GH%DMB ;ARP POSSIBLE FLAG
IORM T1,BHSTFL ;SAY THAT THIS HOST CAN NOT DO ARP
RET ;AND RETURN
SUBTTL Ethernet Mapping Binary File Generation Routines
QUEENT: ;QUEUE UP AN ENTRY
MOVE QC,T1 ;INIT THE CURRENT ITEM
MOVE QP,LNKHED ;INIT PREVIOUS ITEM
MOVEI QO,LNKHED ;INIT OLD ITEM
QUEENL: ;LINKING LOOP
CAIN QP,LNKHED ;PREVIOUS AT THE END?
JRST QUEENP ;YES SO INSERT BEFORE PREVIOUS
LOAD T1,MPINT,(QC) ;GET CURRENT INTERNET ADR
LOAD T2,MPINT,(QP) ;GET PREVIOUS INTERNET ADR
CAMN T1,T2 ;ARE THEY THE SAME?
JRST QUEERR ;YES ERROR
CAMG T1,T2 ;CURRENT BIGGER THAN PREVIOUS?
JRST QUEENP ;NO SO INSERT BEFORE PREVIOUS
LOAD QN,MPLNK,(QP) ;GET THE NEXT ITEM
CAIN QN,LNKHED ;END OF THE LIST?
JRST QUEENN ;YES SO INSERT BEFORE THE NEXT
LOAD T3,MPINT,(QN) ;GET NEXT INTERNET ADR
CAMN T1,T3 ;ARE THE THE SAME?
JRST QUEERR ;YES SO ERROR
CAMG T1,T3 ;CURRENT BIGGER THAN NEXT?
JRST QUEENN ;NO SO INSERT BEFORE THE NEXT
MOVE QO,QP ;NO SO OLD IS THE PREVIOUS
MOVE QP,QN ;AND PREVIOUS IS THE NEXT
JRST QUEENL ;SO KEEP CHASING DOWN THE LIST
QUEENP: ;HERE TO INSERT BEFORE PREVIOUS
STOR QC,MPLNK,(QO) ;OLD POINTS TO CURRENT
STOR QP,MPLNK,(QC) ;CURRENT POINTS TO PREVIOUS
RET ;AND RETURN
QUEENN: ;HERE TO INSERT BEFORE THE NEXT
STOR QN,MPLNK,(QC) ;CURRENT POINTS TO NEXT
STOR QC,MPLNK,(QP) ;PREVIOUS POINTS TO CURRENT
RET ;AND RETURN
QUEERR: ;HERE ON A QUEUEING ERROR
CALL NEWLIN ;GET A NEW LINE
TYPEN <?Duplicate Internet address encountered. Build aborted.>
TYPE <?>
HRROI T1,BXTBUF ;GET A POINTER TO THE TEXT BUFFER
PSOUT% ;OUTPUT THE TEXT BUFFER
SETONE F%BERR ;SET THE ERROR FLAG
JRST IPNIR3 ;ABORT THE READ
SUBTTL Ethernet Mapping Binary File Writing
IPNIWR: ;WRITE THE BINARY FILE
SETZ T1, ;ZERO THE CHECKSUM AC
MOVEI T2,GHTBUF+NIHMHL ;DETERMINE THE FIRST LOCATION FOR HOST INFO
MOVE QC,LNKHED ;GET THE HEAD OF THE LINKED LIST
CAIN QC,LNKHED ;IS THE LIST EMPTY?
JRST IPNIW3 ;YES
IPNIW2: ;TOP OF LINK CHASING LOOP
LOAD T3,MPINT,(QC) ;GET THE INTERNET ADDRESS
ADD T1,T3 ;ADD IT TO THE CHECKSUM
MOVEM T3,.NIINT(T2) ;STORE IT AWAY
LOAD T3,MPEA1,(QC) ;GET THE FIRST ETHERNET ADR WORD
ADD T1,T3 ;ADD IT TO THE CHECKSUM
LOAD T4,MPEA2,(QC) ;GET THE SECOND ETHERNET ADR WORD
ADD T1,T4 ;ADD IT TO THE CHECKSUM
DMOVEM T3,.NIEN1(T2) ;STORE THEM AWAY
LOAD T3,MPFLG,(QC) ;GET THE FLAGS WORD
ADD T1,T3 ;ADD IT TO THE CHECKSUM
MOVEM T3,.NIGCF(T2) ;STORE THEM AWAY
LOAD QC,MPLNK,(QC) ;GET THE NEXT ENTRY
CAIN QC,LNKHED ;END OF LIST?
JRST IPNIW3 ;YES
ADDI T2,NIHMDL ;BUMP THE HOST INFO INDEX
JRST IPNIW2 ;AND KEEP CHASING DOWN THE LIST
IPNIW3: ;HERE WHEN ALL HOST INFO STORED AWAY
MOVEM T1,GHTBUF+.NICHK ;STORE AWAY THE CHECKSUM
SUBI T2,<GHTBUF-NIHMDL> ;GET THE POSITIVE LENGTH
MOVN T3,T2 ;POSITION IT FOR THE SOUT
SUBI T2,NIHMHL ;SUBTRACT THE HEADER LENGTH
MOVEM T2,GHTBUF+.NILEN ;SAVE THE LENGTH AWAY
MOVX T1,<VERSIO> ;GET OUR VERSION
MOVEM T1,GHTBUF+.NIMIR ;STORE IT AWAY
GTAD% ;GET THE TIME AND DATE
MOVEM T1,GHTBUF+.NIGTD ;STORE IT AWAY
MOVE T1,BLDOJF ;GET THE OUTPUT JFN
MOVX T2,<POINT 36,GHTBUF> ;GET THE SOURCE POINTER
SOUT% ;WRITE THE BUFFER TO THE FILE
JSYSF
RET
SUBTTL Misc Routines
HEXBRK: 777777,,777760 ;MAGIC BREAK MASK FOR HEX
777774,,001760
403777,,777760
403777,,777760
HEXRED: ;READ IN HEX FROM ATOM BUFFER POINTED BY T1
CALL HEXRDB ;GET A BYTE
RET ;ERROR
MOVEI T3,(T2) ;SAVE THE BYTE
CALL HEXRDB ;GET A BYTE
RET ;ERROR
ILDB T1,T1 ;GET ANOTHER BYTE
JUMPN T1,R ;IF NOT NULL THEN AN ERROR
LSH T3,4 ;MAKE ROOM
ADDI T3,(T2) ;ADD IN THE SECOND NIBBLE
MOVEI T1,(T3) ;AND PUT IT IN THE CORRECT AC
RETSKP ;SUCCESS RETURN
HEXRDB: ;GET A HEX BYTE
ILDB T2,T1 ;GET A BYTE
CAIL T2,"0" ;FROM ZERO
CAILE T2,"9" ;TO NINE?
JRST HEXRB2 ;NO
SUBI T2,60 ;CONVERT FROM ASCII
RETSKP ;AND SUCCESS RETURN
HEXRB2: ;HERE WHEN THE CHARACTER IS NOT 0-9
CAIL T2,"A"+40 ;FROM LITTLE A
CAILE T2,"F"+40 ;TO LITTLE F?
SKIPA ;NO
TXZ T2,40 ;YES SO MAKE IT UPPER CASE
CAIL T2,"A" ;FROM A
CAILE T2,"F" ;TO F?
RET ;NO SO ERROR
SUBI T2,67 ;YES SO CONVERT TO A REAL NUMBER
RETSKP ;AND SUCCESS RETURN
ADDENT: ;HERE TO QUEUE UP AN ENTRY
MOVEI T1,LNKSZ ;GET THE SIZE OF AN ENTRY
EXCH T1,LNKFST ;GET THE FIRST FREE ENTRY
ADDM T1,LNKFST ;AND SAVE THE NEW ENTRY
;STORE INFORMATION IN THE BLOCK
MOVE T2,BHSTIA ;GET THE INTERNET ADDRESS
STOR T2,MPINT,(T1) ;SAVE IT IN THE BLOCK
DMOVE T2,BHSTHX ;GET THE ETHERNET ADDRESS
STOR T2,MPEA1,(T1) ;SAVE THE FIRST WORD
STOR T3,MPEA2,(T1) ;SAVE THE SECOND WORD
MOVE T2,BHSTFL ;GET THE FLAG WORD
STOR T2,MPFLG,(T1) ;SAVE THE FLAG WORD
RET ;RETURN TO CALLER
OCTETS: ;OUTPUT INTERNET ADDRESS FROM T1
STKVAR <OCTAD>
MOVEM T1,OCTAD ;SAVE THE ADDRESS
MOVEI X1,4 ;FOUR OCTETS
MOVX X2,<POINT 8,OCTAD,3> ;BYTE POINTER
OCTET1: ;OCTET LOOP
ILDB T2,X2 ;GET AN OCTET
NUMO T2,12,0 ;OUTPUT THE DECIMAL OCTET
MOVEI T1,"." ;GET A DOT
CAIE X1,1 ;LAST OCTET?
PBOUT% ;NO SO OUTPUT THE DOT
SOJG X1,OCTET1 ;DO ALL FOUR OCTETS
TYPEN < [>
MOVEI T1,.GTHNS ;RETURN NAME STRING FUNCTION
MOVEI T2,.PRIOU ;OUTPUT TO THE TTY
MOVE T3,OCTAD ;GET THE ADDRESS
GTHST% ;OUTPUT THE NAME
ERSKP ;SKIP ON ERROR
JRST OCTET2 ;NO ERROR
TYPEN <unknown> ;SAY WE DO NOT KNOW THE NAME
OCTET2:
TYPEN <]>
RET ;AND RETURN TO CALLER
HEXOUT: ;ROUTINE TO OUTPUT HEX ETHERNET ADDRESSES
SAVEAC <T5,T6>
STKVAR <<HXADR,2>> ;ADDRESS IS IN T1 AND T2
DMOVEM T1,HXADR ;SAVE THE ADDRESS
MOVEI T5,6 ;SIX OCTETS
MOVEI T6,HXADR ;GET POINTER TO THE BYTES
HRLI T6,(POINT 8,0) ;MAKE THIS A BYTE POINTER
HEXLOP: ;HEX OUTPUT LOOP
ILDB T1,T6 ;GET AN OCTET
CALL HEXWRK ;OUTPUT IT IN HEX
MOVEI T1,"-" ;GET A DELIMITOR
CAIE T5,1 ;IS THIS THE LAST OCTET?
PBOUT% ;NO SO OUTPUT THE DELIMITOR
SOJG T5,HEXLOP ;LOOP UNTIL DONE
RET ;DONE SO RETURN
HEXWRK: ;WORKER ROUTINE FOR HEX ADDRESSES
MOVEI T3,2 ;TWO CHARACTERS
HEXWR2:
IDIVI T1,^D16 ;DIVIDE BY THE RADIX
PUSH P,T2 ;SAVE REMAINDER, A CHARACTER
SOSE T3 ;IF A IS NOW ZERO, UNWIND THE STACK
CALL HEXWR2 ;CALL SELF AGAIN, REDUCE A
POP P,T1 ;GET CHARACTER
ADJBP T1,[350700,,[ASCII/0123456789ABCDEF/]]
LDB T1,T1 ;CONVERT HEX CODE TO ASCII
PBOUT% ;OUTPUT THE ASCII CHARACTER
JSYSF
RET
SUBTTL Poke Command
.POKE: ;POKE COMMAND
STKVAR <POKNNN,POKCNT>
NOISE <ALL KNOWN HOSTS FOR STATUS INFORMATION>
DOCMD .CMNUM,12,<1>,<number of times to poke>
JUMPG T2,.POKE2 ;MAKE SURE IT IS LEGAL
CALL NEWLIN ;GET A NEW LINE
TYPEN <?Command error - Illegal count.>
JRST GETCMD ;GET A NEW COMMAND
.POKE2:
MOVEM T2,POKNNN ;SAVE THE COUNT
CNFIRM ;MAKE SURE HE WANTS THIS
MOVX T1,AQ%ICM!ASNIQB ;GET THE BLOCK ADDRESS
SETZB T2,T3 ;ZERO THESE ACS
ASNIQ% ;ASSIGN INTERNET QUEUE
JSYSF
MOVEM T1,IPSQH ;SAVE THE QUEUE NUMBER
SETONE F%IPSQ ;FLAG THAT WE HAVE THE QUEUE
.POKE3:
CALL DOPOKS ;DO ALL THE POKES
SOSLE POKNNN ;DONE YET?
JRST .POKE3 ;NOPE
MOVE T1,IPSQH ;YUP SO GET THE QUEUE HANDLE
RELIQ% ;RELEASE THE QUEUE
JSYSF
SETZRO F%IPSQ ;NO SPECIAL QUEUE ANYMORE
RET ;RETURN TO CALLER
SUBTTL DOPOKS - Actual Poke Routine
DOPOKS: ;HERE TO DO ALL THE POKES
MOVEI T1,.GTHSZ ;GTHST GENERAL FUNCTION
GTHST ;GET NUMBER OF HOST NAMES
JSYSF
MOVE T5,T2 ;SAVE AOBJN POINTER FOR USE
DOPOK1: ;AOBJN LOOP
MOVEI T1,.GTHHI ;GET HOST NUMBER FROM INDEX
MOVEI T3,(T5) ;GET THE INDEX
GTHST% ;GET THE NUMBER OF A HOST
JSYSF
JN <HS%NCK!HS%NET>,T4,DOPOK2 ;IS IT ONE WE SHOULD IGNORE?
MOVE T1,T3 ;NO, MOVE THE NUMBER FOR POKHST
CALL POKHST ;POKE THE HOST
DOPOK2: ;BOTTOM OF THE LOOP
CALL POKRCV ;RECEIVE A MESSAGE IF AVAILABLE
NOP ;DO NOT CARE AT THIS POINT
AOBJN T5,DOPOK1 ;LOOP FOR ALL KNOWN HOSTS
DOPOK3: ;RECEIVING LOOP
MOVEI T1,POKNUL ;NUMBER OF NON RCVINS WE WILL TOLERATE
MOVEM POKCNT ;PUT THIS IN POKCNT
DOPOK4: ;LOOP
CALL POKRCV ;GET A MESSAGE
SKIPA ;NONE AVAILABLE
JRST DOPOK3 ;TRY TO GET ANOTHER
SOSG POKCNT ;SHOULD WE KEEP TRYING?
RET ;NO SO WE ARE ALL DONE
MOVEI T1,POKTIM ;GET THE SLEEP TIME
DISMS% ;GO TO SLEEP FOR A WHILE
JSYSF
JRST DOPOK4 ;TRY TO RECEIVE
SUBTTL POKRCV - Routine to Receive Echo Replies
POKRCV: ;HERE TO RECEIVE AN ICMP MSG
MOVE T1,IPSQH ;GET THE QUEUE HANDLE
TXO T1,RIQ%NW ;DO NOT WAIT
MOVEI T2,RCVINB ;GET THE RECEIVE BUFFER POINTER
SETZ T3, ;MBZ
RCVIN% ;GET AN INTERNET DATAGRAM
ERSKP ;HANDLE ERRORS
JRST POKRC2 ;NO ERROR
JUMPL T1,R ;RETURN WHEN NO BUFFER
CALL .JSYSF ;NO SO TREAT AS A REAL ERROR. NEVER RETURNS
HALTF% ;NEVER DO THIS
POKRC2: ;HERE WHEN BUFFER AVAILABLE
SETONE F%ICER ;SET THE FLAG
LDB T1,[POINT 32,1+RCVINB+.IPKSH,31] ;GET THE HOST NUMBER
CALL HSDMPN ;DUMP INFORMATION ABOUT THIS HOST
RETSKP ;SKIP RETURN
SUBTTL POKHST - Routine to send ICMP Echo Message
POKHST: ;SEND ICMP ECHO MESSAGE
SETZM SNDINB+1+.IPKDH ;SAVE TARGET HOST NUMBER
DPB T1,[POINT 32,SNDINB+1+.IPKDH,31]
JN F%ICER,,POKHS2 ;DID WE RECEIVE AN ECHO REPLY?
MOVEI T1,POKSND ;NO SO GET A TIME INTERVAL
DISMS% ;SNOOZE
POKHS2:
SETZRO F%ICER ;RESET THE FLAG
MOVE T1,IPSQH ;GET THE QUEUE HANDLE
MOVEI T2,SNDINB ;GET THE BUFFER DESRIPTOR ADDRESS
SETZ T3, ;MBZ
SNDIN% ;SEND THE IP DATAGRAM OFF
JSYSF ;HANDLE ERRORS
RET
SUBTTL Final Stuff
IFE DEBUG,<XLIST>
...LIT: LIT ;LITERALS
IFE DEBUG,<LIST>
END <EVECL,,EVEC> ;THATS ALL FOLKS