1
0
mirror of https://github.com/PDP-10/its.git synced 2026-04-05 05:36:05 +00:00
Files
PDP-10.its/src/cstacy/netrtn.76
2019-02-24 22:33:03 -08:00

409 lines
11 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;; -*- Mode: MIDAS -*-
TITLE NETRTN - Maclisp/NETWRK package.
;CStacy, December 1983
; Summary:
;
; (MAP-HOSTS3) ==> T if mapped in the database.
; (STDHST host) ==> standardized host-number.
; (GET-NET-FROM-ADDRESS host) ==> network-number.
; (OWN-HOST network-numer) ==> host.
; (HOST-EQUAL host1 host2) ==> T iff they refer to same host.
; (LOOKUP-HOST host-name) ==> host-number.
; (HOST-SIXBIT-NAME host) ==> sixbit host name.
; (HOST-INFO host) ==> (host-name . SITES-pointer)
; (TAC? host) ==> T iff this is an Internet TIP or TAC.
; NW%ARP ==> ARPAnet network-number.
; NW%LCS ==> LCSnet network-number.
; NW%CHS ==> CHAOSnet network-number.
.FASL
IF1,.INSRT SYS:.FASL DEFS
;;; Accumulator definitions
;;; NETWRK assumes A thru E, consecutive T and TT, and pdl pointer P.
NETWRK"A=A
NETWRK"B=B
NETWRK"C=D
NETWRK"D=R
NETWRK"E=F
NETWRK"T=T
NETWRK"TT=TT
NETWRK"P==FXP
;;; NETWRK routines
NETWRK"$$LOOK==1 ;Include only lookup routines.
NETWRK"$$ARPA==1
NETWRK"$$CHAOS==1
NETWRK"$$HST3==1 ;Use the HOSTS3 database.
NETWRK"$$ALLNET==1 ;Look up Internet/Unternet.
NETWRK"$$HSTMAP==1 ;Host mapping routines.
NETWRK"$$SYMLOOK==1 ;Host name lookup.
NETWRK"$$HOSTNM==1 ;Host name lookup.
NETWRK"$$HSTSIX==1 ;Sixbit-name host lookup.
NETWRK"$$OWNHST==1 ;Own host number routine.
NETWRK"$$HSTCMP==1 ;Host number comparisons.
NETWRK"$$CVH==1 ;Host number conversions.
.INSRT SYSENG;NETWRK
;;;; Macros.
;;; Nice names for some instructions.
NOP=:<JFCL>
CALRET==:JRST
;;; System calling.
DEFINE SYSCAL NAME,ARGS
.CALL [SETZ ? SIXBIT /NAME/ ? ARGS ((SETZ))]
TERMIN
;;; (NOT NIL)
DEFINE TRUTH
.ATOM T!TERMIN
;;; SETQing a symbol to a number at FASLOAD time.
DEFINE QTES NAME,VAL
.SXEVA (SETQ NAME #VAL )
TERMIN
;;; GCOFF and GCON can surround code during which garbage collection
;;; and interrupts should not happen.
;;; This is necessary since we let LSRTNS randomly hack the argument ACs.
DEFINE GCOFF
PUSH FXP,INHIBIT
SETOM INHIBIT
PUSH FXP,NOQUIT
HLLOS NOQUIT
TERMIN
DEFINE GCON
POP FXP,NOQUIT
PUSHJ P,INTREL ;Pop FXP and check for deferred interrupts.
TERMIN
;;; Bash ACs to be NIL, which is a reasonable pointer for an argument AC.
;;; MacLisp does "caller-saves" protocol, so we just need to make sure
;;; there is not garbage left in these when we turn back on interrupts
;;; and garbage collection.
DEFINE NULLIFY LIST
IRP AC,,[LIST]
MOVE AC,NIL
TERMIN
TERMIN
;;; Popular returns:
;;; ONRET - Zap reasonable things into argument ACs, turn on interrupts
;;; and garbage collection, and return the value in A.
;;; (But for NCALLable functions, you must return value in TT instead.)
ONRET: NULLIFY [B,C,AR1,AR2A]
GCON
POPJ P,
;;; Check for HOSTS3 having been mapped in.
;;; Do this before hacking GC or trashing anything.
DEFINE HST3CK
SKIPN HST3P
LERR [SIXBIT "Host table has not been mapped in!"]
TERMIN
;;; BP2LST - Given a Bp in D, return in A a list of characters.
BP2LST: PUSH FXP,B
PUSH FXP,D
MOVEI B,NIL ;()
BP2LS1: ILDB TT,D ;Get a character.
JUMPE TT,BP2LS9 ;Zero terminated strings.
JSP T,FXCONS ;Turn into fixnum.
CALL 2,.FUNCTION CONS ;CONS onto our list.
MOVE B,A ;Recover list pointer.
JRST BP2LS1 ;Gobbble entire string.
BP2LS9: MOVE A,B ;Recover list pointer.
CALL 1,.FUNCTION NREVERSE ;Reverse it to normal order.
POP FXP,D
POP FXP,B
POPJ FXP,
;;;; (HSTMAP)
;;;
;;; Maps in the HOSTS3 database and returns the file object opened.
;;; Returns NIL if there was an error.
;;;
;;; Note: since there is no way to return storage to Maclisp,
;;; we do not provide a "HSTUNM" function.
HST3P: 0
.ENTRY MAP-HOSTS3 SUBR 1+0 ;No argument.
GCOFF
MOVEI A,.ATOM SYSBIN/;HOSTS3/ >
MOVEI B,.SX (IN)
CALL 2,.FUNCTION OPEN ;Ask for file object.
PUSH FXP,A ;Stack the file object.
MOVEI TT,F.CHAN ;Get channel number from the file array.
MOVE B,@TTSAR(A)
SYSCAL OPEN,[ NETWRK"B ? %CLBIT,,.BII
[SIXBIT /DSK/]
[SIXBIT /HOSTS3/]
[SIXBIT />/]
[SIXBIT /SYSBIN/]]
JRST HSTMA8 ; Fail
SYSCAL FILLEN,[B ? %CLOUT,,TT] ;Get length in bytes.
JRST HSTMA8 ; Fail
JUMPLE TT,HSTMA8 ;Make sure length not zero.
MOVEI TT,1777(TT) ;Round up length to next page.
LSH TT,-10. ;And convert to number of pages.
PUSH FXP,TT
PUSHJ P,GETCOR ;Ask for that much core.
JUMPE TT,HSTMA8 ; If not available, fail.
MOVEM TT,NETWRK"HSTADR ;Remember addr where mapping.
IDIVI TT,2000 ;Convert addr to page number.
HRRZ A,TT ;Page number RH of AOBJN ptr.
POP FXP,TT ;Get number pages desired.
MOVNS TT ;Negative number of pages in LH.
HRL A,TT
MOVEM A,NETWRK"HSTABN ;Save AOBJN for unmapping (not really).
SYSCAL CORBLK,[ 1000,,%CBNDR ;Read-only
1000,,%JSELF ;into self
A ;at core pages provided.
B] ;from file open on channel.
JRST HSTMA8 ; Fail.
SYSCAL CLOSE,[ B ] ;All mapped in: close HOSTS3.
JRST HSTMA8
MOVE T,NETWRK"HSTADR ;Address where HOSTS3 should start.
MOVE T,NETWRK"HSTSID(T) ;Examine check word.
MOVEI FREEAC,TRUTH ;If we win, we return T.
CAME T,[SIXBIT /HOSTS3/] ;Finally, is this really HOSTS3?
HSTMA8: MOVEI FREEAC,NIL ; No, we lose: we return NIL.
POP FXP,A ;Recover file object.
CALL 1,.FUNCTION CLOSE ;Close it.
SETOM HST3P ;Remember we mapped it in OK.
MOVE A,FREEAC
JRST ONRET ;Return T or NIL.
;;;; (OWN-HOST network-numer)
;;;
;;; Given a network number (fixnum), returns our own host address there.
.ENTRY OWN-HOST SUBR 1+1
HST3CK
JSP T,FXNV1 ;TT gets network fixnum.
GCOFF
MOVE NETWRK"A,TT
PUSHJ FXP,NETWRK"OWNHST ;Look up our host address.
JRST [ MOVEI NETWRK"A,NIL ; Not on this net => NIL.
JRST ONRET ]
MOVE TT,NETWRK"A ;Get the HOSTS3 address.
JSP T,FXCONS ;Make into fixnum.
JRST ONRET
;;; (STDHST host)
;;; Return the host number in standard format.
.ENTRY STDHST SUBR 1+1
JSP T,FXNV1 ;TT gets host fixnum.
GCOFF
MOVE NETWRK"A,TT
PUSHJ FXP,NETWRK"STDHST ;Hack the host number.
MOVE TT,NETWRK"A ;Here it is in standard format
JSP T,FXCONS ;Make it into a fixnum.
JRST ONRET ;Return it.
;;; (GET-NET-FROM-ADDRESS host-address)
;;;
;;; Given a host address (fixnum), return its network number (fixnum).
.ENTRY GET-NET-FROM-ADDRESS SUBR 1+1
JSP T,FXNV1 ;TT gets host fixnum.
GCOFF
NETWRK"GETNET TT,TT ;Get network number of our arg.
JSP T,FXCONS ;CONS fixnum.
MOVE A,TT ;That's the return value.
JRST ONRET
;;; Some popular HOSTS3 Network Numbers.
QTES NW%ARP,\NETWRK"NW%ARP
QTES NW%LCS,\NETWRK"NW%LCS
QTES NW%CHS,\NETWRK"NW%CHS
;.ENTRY NW%ARP SUBR 1+0
; MOVE TT,[NETWRK"NW%ARP] ;ARPAnet IP net number.
; JRST FIX1 ;CONS fixnum from A and return.
;;;; (HOST-EQUAL host1 host2)
;;;
;;; Returns T if the host numbers refer to the same host.
;;; To compare host-numbers on different networks, HOSTS3 must be mapped.
.ENTRY HOST-EQUAL SUBR 2+1
HST3CK
JSP T,FXNV1 ;Host1 into TT.
JSP T,FXNV2 ;Host2 into D.
GCOFF
MOVE NETWRK"A,TT
MOVE NETWRK"B,D
PUSHJ FXP,NETWRK"HSTCMP
JRST [ MOVEI A,NIL
JRST ONRET ]
MOVEI A,TRUTH
JRST ONRET
;;;; HOSTS3 SITE table lookup.
;;; (HOST-INFO host-address)
;;;
;;; Given a host (fixnum), returns a pair whose CAR is the host
;;; name (fake-string) and whose CADR is a (fixnum) pointer into
;;; the HOSTS3 SITE table.
;;; Returns NIL if the host is not found.
.ENTRY HOST-INFO SUBR 1+1
HST3CK
JSP T,FXNV1 ;TT gets host fixnum.
GCOFF
MOVE NETWRK"B,TT
PUSHJ FXP,NETWRK"HSTSRC ;Look up host.
JRST [ MOVEI A,NIL ; Not found => NIL.
JRST ONRET ]
HRRZ D,NETWRK"A ;D gets address of official host name.
HRLI D,440700 ;Make Bp to it.
PUSHJ FXP,BP2LST ;Get list of fixnums into A.
CALL 1,.FUNCTION IMPLODE ;Make into a symbol.
PUSH P,A ;Stash pointer to it.
; MOVEI B,TRUTH ;Say that it is a fake string.
; MOVEI C,.ATOM +INTERNAL-STRING-MARKER
; CALL 3,.FUNCTION PUTPROP
MOVE TT,NETWRK"D ;Get SITE table pointer.
JSP T,FXCONS
MOVEI B,NIL ;Start with ().
CALL 2,.FUNCTION CONS ;CONS on HOSTS3 pointer.
MOVE B,A ;Recover list pointer.
POP P,A ;A gets host name string.
CALL 2,.FUNCTION CONS ;CONS it on.
JRST ONRET ;Return pair.
;;; (TAC? host-address)
;;;
;;; Given a host (fixnum), returns T of the host claims to be an
;;; Internet TAC or TIP. Otherwise, returns NIL.
.ENTRY TAC? SUBR 1+1
HST3CK
JSP T,FXNV1 ;TT gets host fixnum.
GCOFF
MOVE NETWRK"B,TT
PUSHJ FXP,NETWRK"HSTSRC ;Look up host.
JRST TACP1 ; Not found, return NIL.
MOVEI B,TRUTH ;Assume host is a TAC.
TLNN NETWRK"A,400000 ;Is it really?
TACP1: MOVEI B,NIL ; Nope.
MOVE A,B
JRST ONRET
;;; (HOST-SIXBIT-NAME host-address)
;;;
;;; Given a host (fixnum), return its (sixbit quantity) host name,
;;; or NIL if the host is not found.
;;;
;;; You need something like KMP's SIXBIT package (with SIXBIT->SYMBOL) to
;;; make much use of the return value.
.ENTRY HOST-SIXBIT-NAME SUBR 1+1
HST3CK
JSP T,FXNV1 ;TT gets host fixnum.
GCOFF
MOVE NETWRK"A,TT
PUSHJ FXP,NETWRK"HSTSIX ;Look up host.
JRST [ MOVEI A,NIL ; Not found => NIL.
JRST ONRET ]
MOVE TT,NETWRK"A ;Sixbit value.
JSP T,FXCONS ;CONS fixnum.
JRST ONRET
;;; Other things from the SITE table we might want to fool around with
;;; include: the host ADDRESS table entries, the operating system and
;;; machine types, and whether the host is a server; from the NAMES table
;;; we might want to manually frob around with other names. We might also
;;; want to examine the NETNAMES table and provide functions to map those
;;; names to addresses and back.
;;;
;;; Hey, maybe if I figured out how to do Structs from inside MIDAS or something,
;;; we could have SI:PARSE-HOST, which accept either host names or addresses
;;; (maybe even site table entries?) and return all the various junk.
;;;
;;; Someday when I figure out the functionality and representation for these
;;; features, I will implement them. That probably won't happen until I have
;;; a real need to use them. If you are using this package and need to do
;;; these things, send me mail and I'll put it in. -- CSTACY, 31 December 1983
;;;; Host name lookup.
;;; (HOST-LOOKUP host-name)
;;;
;;; Given a host name (symbol), return its (fixnum) host address,
;;; or NIL if unknown host.
HSLUQQ: BLOCK 20. ;Cruft.
.ENTRY HOST-LOOKUP SUBR 1+1
HST3CK
GCOFF
PUSH P,A ;Stash arg.
MOVEI TT,7. ;We want packed-ASCII fixnums.
JSP T,FXCONS ;(Must use Lisp fixnums.)
MOVE B,A
POP P,A ;Recover arg.
CALL 2,.FUNCTION PNGET ;Get the pname-list of our argument.
MOVE F,[440700,,HSLUQQ] ;Bp to ASCIZ string we'll accumulate.
MOVE A,(A) ;A gets first CONS of pname-list.
HSLU20: HLRZ B,A ;Take CAR of list.
MOVE C,B ;Make Bp to chars.
HRLI C,440700
MOVE FREEAC,[-5,,0] ;AOBJN to them.
HSLU30: ILDB R,C ;Get a character.
IDPB R,F ;Store it.
AOBJN FREEAC,HSLU30 ;Get all five chars.
SKIPE A,(A) ;Get next CONS from CDR of A.
JRST HSLU20 ;Process this one.
MOVEI NETWRK"A,HSLUQQ ;ASCIZ host name.
PUSHJ FXP,NETWRK"HSTLOOK ;Look up the host.
JRST [ MOVEI A,NIL ; Not found => NIL.
JRST ONRET ]
MOVE TT,NETWRK"A ;TT gets the host's Inter/Unternet address.
JSP T,FXCONS ;CONS fixnum.
JRST ONRET
.SXEVAL (SSTATUS FEATURE NETWRK)
FASEND