Trailing-Edge
-
PDP-10 Archives
-
SRI_NIC_PERM_SRC_3_19910112
-
utilities/hostab.mid
There are no other files named hostab.mid in the archive.
title HOSTAB Host table printer
;Some kind person should rewrite this piece of shit
ifndef sailsw,sailsw==ife <.osmidas-sixbit/SAIL/>,[-1] .else 0
ifndef t20sw,t20sw==ife <.osmidas-sixbit/TWENEX/>,[-1] .else 0
;Cough bletch
ife sailsw\t20sw,.insrt MRC;MACROS
ifn sailsw,.insrt MACROS[1,MRC]
ifn t20sw,.insrt MACROS
;The format of the compiled HOSTS2 file is:
HSTSID==0 ; wd 0 SIXBIT /HOSTS2/
HSTFN1==1 ; wd 1 SIXBIT /HOSTS/ usually
HSTVRS==2 ; wd 2 FN2 of HOSTS file which this was compiled from.
HSTDIR==3 ; wd 3 SIXBIT /SYSENG/ usually, directory name of source file
HSTMCH==4 ; wd 4 SIXBIT /AI/ (e.g.), device name of source file
HSTWHO==5 ; wd 5 UNAME of person who compiled this
HSTDAT==6 ; wd 6 Date of compilation as sixbit YYMMDD
HSTTIM==7 ; wd 7 Time of compilation as sixbit HHMMSS
NAMPTR==10 ; wd 10 Address in file of NAME table.
SITPTR==11 ; wd 11 Address in file of SITE table.
NETPTR==12 ; wd 12 Address in file of NETWORK table.
;....expandable....
;NETWORK table
; wd 0 Number of entries in table.
; wd 1 Number of words per entry. (2)
;This table contains one entry for each network known about, sorted
;by network number. A network number is bits 4.8-4.1 of a network
;address; these numbers are assigned by Jon Postel. See symbols below.
;The reason for keeping track of different networks is that the user
;program must make different system calls to use each network.
;Each entry contains:
NETNUM==0 ; wd 0 network number
NTLNAM==1 ; wd 1 LH - address in file of name of network
NTRTAB==1 ; wd 1 RH - address in file of network's address table
;ADDRESS table(s)
; wd 0 Number of entries in table.
; wd 1 Number of words per entry. (2)
;There is one of these tables for each network. It contains entries
;for each site attached to that network, sorted by network address.
;These tables are used to convert a numeric address into a host name.
;Also, the list of network addresses for a site is stored
;within these tables.
;Each entry contains:
ADDADR==0 ; wd 0 Network address of this entry (including network number).
ADLSIT==1 ; wd 1 LH - address in file of SITE table entry
ADRCDR==1 ; wd 1 RH - address in file of next ADDRESS entry for this site
; 0 = end of list
;SITE table
; wd 0 Number of entries in table.
; wd 1 Number of words per entry. (3)
;This table contains entries for each network site,
;not sorted by anything in particular. A site can have more
;than one network address, usually on different networks.
;This is the main, central table.
;Each entry looks like:
STLNAM==0 ; wd 0 LH - address in file of official host name
STRADR==0 ; wd 0 RH - address in file of first ADDRESS table entry for this site
; successive entries are threaded together through ADRCDR
STLSYS==1 ; wd 1 LH - address in file of system name (ITS, TIP, TENEX, etc.)
; May be 0 => not known.
STRMCH==1 ; wd 1 RH - address in file of machine name (PDP10, etc.)
; May be 0 => not known.
STLFLG==2 ; wd 2 LH - flags:
STFSRV==400000 ; 4.9 1 => server site (according to NIC)
; wd 2 RH - not used
;NAMES table:
; wd 0 Number of entries
; wd 1 Number of words per entry. (1)
;This table is used to convert host names into network addresses.
; Followed by entries, sorted by the host name treated as a vector of
; signed integers, looking like:
NMLSIT==0 ; lh address in file of SITE table entry for this host.
NMRNAM==0 ; rh address in file of host name
;This name is official if NMRNAM = STLNAM of NMLSIT.
; All names are ASCIZ strings, all letters upper case.
; The strings are stored before, after and between the tables.
; All strings are word-aligned, and fully zero-filled in the last word.
;Network addresses are defined as follows, for purposes of this table:
; 4.9 0
; 4.8-4.1 network number
; Chaos net (number 7):
; 3.9-2.8 0
; 2.7-1.1 address (2.7-1.9 subnet, 1.8-1.1 host)
; Arpa net (number 12): (note, old-format Arpanet addresses
; 3.9-3.8 0 never appear in the host table.)
; 3.7-2.1 Imp
; 1.9 0
; 1.8-1.1 Host
; Dialnet (number 26):
; 3.9-3.1 0
; 2.9-1.1 address in file of ASCIZ string of phone number
NW%RCC==3 ;RCCnet
NW%CHS==7 ;Chaosnet
NW%ARP==12 ;Arpanet
NW%DLN==26 ;Dialnet
NW%LCS==22 ;LCSnet
NW%SU==44 ;SUnet
NW$BYT==331000 ;Byte pointer to network number
ife sailsw\t20sw,[
define TYPE string
move x,[point. 7,[ascii\string\]]
movx y,<.length\string\>
syscal SIOT,[ clarg. tto
%clarg x
%clarg y]
.lose %lssys
termin
]
ifn sailsw,[
define TYPE string
outstr [asciz\string\]
termin
]
ifn t20sw,[
define TYPE string
hrroi a1,[asciz\string\]
psout
termin
];ifn t20sw
acdef. [a1 a2 a3 a4 x y z a b c d tbl] ; accumulators
acdef. [tto htb] ; I/O channels
nd. pdllen==50. ; push down list length
ifn t20sw,.decsav ? loc 140
pdl: block pdllen ; push down list
;nout sout octout octou1 octou2
; I/O subroutines
; NOUT numeric output
; accepts in x: base to use for outputting the number
; y: number to be output
; returns: +1: always, with y and z clobbered
nout=call .
idivi y,(x) ; get a digit
save z ; save the lowest order digit left
caxe y,%zeros ; got them all?
nout ; nope
retr y ; get a digit to output
addx y,"0 ; convert to ASCII
ife sailsw\t20sw,.iot tto,y ; output it
ifn sailsw,outchr y ; output it
ifn t20sw,move a1,y ? pbout
return ; and return
; SOUT string output
; accepts in x: pointer to string (0 in LH means ASCIZ string)
; returns +1: always, with updated string pointer in x; 0 & y clobbered
sout=call .
txnn x,%lhalf ; is there a left half?
hrli x,440700 ; yes, make it a 7 bit pointer
movx y,%zeros ; initialize string counter
ife sailsw\t20sw,[
save x ; save pointer away
ildb x ; get a character
jumpn [aoja y,.-1] ; count character if non-null
retr x ; else restore pointer
movem y,strlen' ; save string length
syscal SIOT,[ clarg. tto ; output to TTY
%clarg x ; string pointer
%clarg y] ; byte counter
.lose %lssys ; ? ? ?
];ife sailsw\t20sw
ifn sailsw,[
ildb x
jumpn [outchr ? aoja y,.-1]
movem y,strlen' ; save string length
];ifn sailsw
ifn t20sw,[
ildb x
jumpn [move a1, ? pbout ? aoja y,.-1]
movem y,strlen' ; save string length
];ifn t20sw
return ; and return
;Right-justified octal from y, in x columns
;Bash x,z
octout: jffo y,.+1 ; haulong
subi z,36.
skipn z
movni z,1
subi z,2
push p,z+1
idivi z,3 ; z now has minus number of octal digits
pop p,z+1
add z,x ; z now has number of spaces
jumple z,octou2
octou1:
ife sailsw\t20sw,.iot tto,[" ]
ifn sailsw,outchr [" ]
ifn t20sw,movei a1,<" > ? pbout
sojg z,octou1
octou2: movx x,8. ; load up octal base
nout ; output it
return
ifn sailsw\t20sw,.lose=<jrst 4,>
;hostab htbunm netprt nhashs skpntp
; Start of program
hostab:
ifn sailsw,[
cai
reset
open [17 ? 'DSK,, ? 0] ; get a disk channel
.lose
dmove [sixbit/HOSTS2BIN/]
move 3,['NETMRC]
lookup ; find file HOSTS2.BIN[NET,MRC]
.lose
movei 2,hsttab
movem 2,jobff
movs 3 ? movn ? addb jobff ; get address of highest addr we need
core ; get more core from system maybe
.lose
move 3 ? hrri -1(2) ; compute IOWD to read host table in
setz 1,
input
releas
];ifn sailsw
move p,[pdl(-pdllen)] ; load PDP
ife sailsw\t20sw,[
syscal OPEN,[ clctl. .uao ; open in single ASCII mode
clarg. tto ; TTY output channel
clarg. ('TTY)] ; the TTY
.lose %lsfil ; ? ? ?
syscal OPEN,[ clctl. .bai ; open in block ASCII mode
clarg. htb ; host table channel
clarg. ('DSK) ; device
clarg. 'HOSTS2 ; fn1
clarg. sixbit/>/; fn2
clarg. 'SYSBIN] ; sname
.lose %lsfil ; ? ? ?
move x,[-100.,,hsttab_-10.] ; 100. pages starting at HSTTAB
syscal CORBLK,[ clarg. %cbndr ; map pages, fail if can't get all
clarg. %jself ; this job
x ; pointer to pages to load
clarg. htb] ; channel
];ife sailsw\t20sw
ifn t20sw,[
movsi a1,(gj%old\gj%sht) ; try to access host table
hrroi a2,[asciz/SYSTEM:HOSTS2.BIN/]
gtjfn
.lose
movei a2,of%rd ; open up host table
openf
.lose
sizef ; get its size
.lose
movsi a1,(a1) ; map in host table starting at page 0
move a2,[.fhslf,,hsttab/1000]
hrli a3,(pm%cnt\pm%rd)
pmap
];ifn t20sw
skipn x,hsttab ; check first word of host table
.lose ; didn't read it all or bad?
caxe x,'HOSTS2 ; right first word?
.lose ; bad file?
type [Host table generated by ]
skipn x,hsttab+hstwho ; get UNAME of creator
.lose ; null UNAME?
htbunm: movx y,%zeros ; zap where character will go
rotc x,6 ; gobble a character
addx y,<" > ; ASCIIify
ife sailsw\t20sw,.iot tto,y ; output
ifn sailsw,outchr y
ifn t20sw,move a1,y ? pbout
jumpn x,htbunm ; continue if more
type [ on ]
skipn x,hsttab+hstdat ; get compilation date
.lose ; null creation date?
rot x,12. ; put year last
repeat 3,[
repeat 2,[
movx y,%zeros ; zap character
rotc x,6 ; gobble a character
addx y,<" > ; ASCIIify
ife sailsw\t20sw,.iot tto,y ; output the character
ifn sailsw,outchr y
ifn t20sw,move a1,y ? pbout
];repeat 2
ifn .rpcnt-2,[
ife sailsw\t20sw,.iot tto,["/] ; output a slash
ifn sailsw,outchr ["/]
ifn t20sw,movei a1,"/ ? pbout
];ifn .rpcnt-2
ife .rpcnt-2,[
ife sailsw\t20sw,.iot tto,[" ] ; output a space last time
ifn sailsw,outchr [" ]
ifn t20sw,movei a1,<" > ? pbout
];ife .rpcnt-2
];repeat 3
skipn x,hsttab+hsttim ; get compilation time
.lose ; null compilation time?
repeat 3,[
repeat 2,[
movx y,%zeros ; zap character
rotc x,6 ; gobble a character
addx y,<" > ; ASCIIify
ife sailsw\t20sw,.iot tto,y ; output the character
ifn sailsw,outchr y
ifn t20sw,move a1,y ? pbout
];repeat 2
ifn .rpcnt-2,[
ife sailsw\t20sw,.iot tto,[":] ; delimiter
ifn sailsw,outchr [":]
ifn t20sw,movei a1,": ? pbout
];ifn .rpcnt-2
];repeat 3
type [
]
;Now, for each network print the name of the network
;and print a host map driven off its ADDRESS table.
move a,hsttab+netptr
addi a,hsttab
move b,(a) ;Number of networks
movem b,netcnt'
move b,1(a) ;Words per entry
movem b,netsiz'
addi a,2 ;Address of first network
movem a,netloc'
netprt: sosge netcnt
ife sailsw\t20sw,.logout 1, ;No more networks
ifn sailsw,exit
ifn t20sw,haltf
type [
]
hlrz x,ntlnam(a)
addi x,hsttab
sout
type [ Network:]
hrrz tbl,ntrtab(a)
jumpn tbl,nhashs
type [ no hosts]
nhashs: type [
]
jumpe tbl,skpntp
addi tbl,hsttab
call onenet
skpntp: move a,netsiz
addb a,netloc
jrst netprt
;onenet foo1 foo3 hstprt hstpr1 foo2 cpopj
;Print info for net whose ADDRESS table is pointed to by tbl
onenet: ldb b,[nw$byt,,2+addadr(tbl)] ; Get network number
cain b,nw%dln ; Dialnet is strange
jrst [ type [Phone # ]
jrst foo3]
type [Host # ]
foo3: type [Official Name Machine System
]
skipge d,(tbl) ; load number of entries
.lose ; invalid number of entries?
jumpe d,cpopj ; no hosts this net
skipg c,1(tbl) ; load number of words/entry
.lose ; invalid number of words?
ife sailsw,movei a,-hsttab+2(tbl) ;(Simulate old program)
ifn sailsw,[
movei a,2(tbl)
subi a,hsttab
];ifn sailsw
;a has file-relative address of next ADDRESS table entry to print
hstprt: hlrz b,hsttab+adlsit(a) ; Get SITE entry
movx x,"* ; assume a server
skipl hsttab+stlflg(b) ; but is it really?
movx x,<" > ; nope, a user
ife sailsw\t20sw,.iot tto,x ; initial heading
ifn sailsw,outchr x
ifn t20sw,move a1,x ? pbout
skipn y,hsttab+addadr(a) ; get number of host
.lose ; funny host number?
ldb x,[nw$byt,,y] ; Get network number
caie x,nw%rcc ; RCCnet
cain x,nw%arp ; If Arpanet,
jrst [ldb y,[001000,,y] ; decimal host
movei x,10.
nout
ife sailsw\t20sw,.iot tto,["/]; slash
ifn sailsw,outchr ["/]
ifn t20sw,movei a1,"/ ? pbout
ldb y,[112000,,hsttab+addadr(a)]
movei x,10. ; decimal imp
nout
jrst hstpr1 ]
cain x,nw%chs ; If Chaos net
jrst [ movei x,0 ; Clear subnet
dpb x,[nw$byt,,y]
movei x,4
call octout ; Print right-justified octal
jrst hstpr1 ]
cain x,nw%dln ; If Dialnet
jrst [ movei x,0 ; Clear network
dpb x,[nw$byt,,y]
movei x,hsttab(y) ; get ptr to string
sout ; output the string
jrst hstpr1 ]
cain x,nw%lcs ; If LCSnet,
jrst [ ldb y,[221000,,y] ; octal subnet
movei x,8.
nout
ife sailsw\t20sw,.iot tto,["/]; slash
ifn sailsw,outchr ["/]
ifn t20sw,movei a1,"/ ? pbout
ldb y,[001000,,hsttab+addadr(a)]
movei x,8. ; octal host
nout
jrst hstpr1 ]
cain x,nw%su ; If SUnet
jrst [ ldb y,[111000,,y] ; octal subnet
movei x,8.
nout
ife sailsw\t20sw,.iot tto,["#]; slash
ifn sailsw,outchr ["#]
ifn t20sw,movei a1,"# ? pbout
ldb y,[001000,,hsttab+addadr(a)]
movei x,8. ; octal host
nout
jrst hstpr1 ]
tlz y,777000 ; else output octal number
movei x,8. ; octal host
nout
hstpr1:
ife sailsw\t20sw,.iot tto,[^I] ; go to next field
ifn sailsw,outchr [^I]
ifn t20sw,movei a1,^I ? pbout
hlrz x,hsttab+stlnam(b) ; get name of host
jumpe x,[.lose] ; null host pointer?
addi x,hsttab ; convert to absolute address
sout ; output the string
skipn x,strlen' ; get length of string
.lose ; null host name?
ifn t20sw,movei a1,^I
caxge x,8. ; more than one field length?
ife sailsw\t20sw,[
.iot tto,[^I] ; yes, another tab required
.iot tto,[^I] ; output another tab
];ife sailsw\t20sw
ifn sailsw,[
outchr [^I]
outchr [^I]
];ifn sailsw
ifn t20sw,pbout ? pbout
hrrz x,hsttab+strmch(b) ; get machine host is
jumpe x,[ movei x,[asciz/UNKNOWN/]; unknown name
jrst .+2] ; and continue
addi x,hsttab ; convert to absolute address
move y,(x) ; get first word of machine name
andx y,777777700000 ; get first three characters
caxe y,ascii/PDP/ ; is this a PDP-nn?
jrst foo2
ldb y,[100700,,(x)] ; yes, get fourth character
caxn y,"- ; is it a dash?
jrst foo2 ; yes (foo, somebody lost!)
save x ; save current pointer
type [PDP-]
retr x ; get current pointer back
hrli x,170700 ; kludge up byte pointer after PDP
foo2: sout ; and output it
skipn x,strlen' ; get length of string
.lose ; null host name?
ifn t20sw,movei a1,^I
caxge x,8. ; more than one field length?
ife sailsw\t20sw,[
.iot tto,[^I] ; yes, another tab needed
.iot tto,[^I] ; output a delimiting tab
];ife sailsw\t20sw
ifn sailsw,[
outchr [^I]
outchr [^I]
];ifn sailsw
ifn t20sw,pbout ? pbout
hlrz x,hsttab+stlsys(b) ; get system host has
jumpe x,[ movei x,[asciz/UNKNOWN/]; unknown system
jrst .+2] ; and continue
addi x,hsttab ; convert to absolute address
sout ; and output it
type [
]
addi a,(c) ; go to next entry in the table
sojg d,hstprt ; loop for next entry
type [
* means this site is a server
]
cpopj: return
; Generate literals
variables ? constants
ife sailsw,hsttab=<.+1777>&-2000 ; start of host table
ifn sailsw,hsttab=.
end HOSTAB