perm filename FAKTNX.FAI[S,NET]4 blob
sn#811752 filedate 1986-03-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE FAKTNX - Fake TENEX JSYS's for PUPGAT
C00014 ENDMK
C⊗;
TITLE FAKTNX - Fake TENEX JSYS's for PUPGAT
.LIBRARY TVRLIB.REL[SUB,SYS]
↓A←1
↓B←2
↓C←3
↓P←17
.TIME↑: MOVEI A,215
PEEK A,
PEEK A,
PUSH P,B
MULI A,=100 ;Convert from tics to msec
DIVI A,=6
POP P,B
POPJ P,
.GETAB↑:PUSH P,B
HRRZ B,A
HLRZ A,A
CAMN B,PUPPAR
JRST[ CAIE A,2
JRST XGETAB
BRETZA: SETZ A,
JRST POPJB1 ]
CAIN B,ROUTAB
AOJA A,[
PUSH P,B
PUSHJ P,HSHROU
POP P,B
JRST POPJB1 ]
CAMN B,ENTFLG
JRST BRETZA
XGETAB: OUTSTR[ASCIZ/?
Unsimulated GETAB. /]
POP P,B
DOHALT: POP P,(P)
JRST 4,@1(P)
.OPRFN↑:CAMN A,[SIXBIT/PUPROU/]
JRST[ OUTSTR[ASCIZ/Routine table update request.
/]↔ POPJ P, ]
OUTSTR[ASCIZ/?
Unsimualted OPRFN. /]
JRST DOHALT
.DISMS↑:INTMSK [0]
PUSH P,B
MULI A,6 ;Convert from msec to tics
DIVI A,=100
POP P,B
SKIPE A ;Don't wait if zero time given!
SKIPE WAKFLG ;Have we been woken?
JRST[ SETZM WAKFLG ; Yes, don't sleep
INTMSK[-1]
POPJ P,]
CLKINT (A)
IMSTW [-1]
POPJ P,
WAKFLG↑:0
.PUPI↑: PUSH P,C
PUSH P,B
MOVE C,A
TLZ A,(1B0+1B1)
SKIPL A
CAILE A,17
PUSHJ P,ILGJFN
TLNN C,(1B0) ;Wait?
JRST PUPI2 ; Yes, that's OK
PUSHJ P,ARBCHN
MTAPE 0,[10]
JRST[ MOVEI A,PUPX3
JRST PUPI3 ]
PUPI2: MOVE A,[IN B]
DPB C,[POINT 4,A,12]
MOVN B,B
HRR B,(P)
SOS B
SETZ C,
XCT A
AOSA -2(P)
MOVEI A,-1 ;Fictious error code
PUPI3: POP P,B
POP P,C
POPJ P,
.PUPO↑: PUSH P,C
PUSH P,B
LDB C,[POINT 16,(B),15]
ADDI C,3
LSH C,-2
MOVN C,C
HRL B,C
SETZ C,
TLZ A,(1B1) ;Flush bit meaning compute checksum
SKIPL A
CAILE A,17
PUSHJ P,ILGJFN
LSH A,=18+5
IOR A,[OUT B]
SOS B
XCT A
AOSA -2(P)
MOVEI A,-1 ;Fictious error code
POP P,B
POP P,C
POPJ P,
POPJB1: POP P,B
SKPRET: AOS (P)
CPOPJ: POPJ P,
.PUPNM↑:TLCE B,(1B2)
TLNE B,-1
POPJ P,
MOVEM A,FAKJFN
PUSH P,1(B) ;Socket number
PUSH P,(B)
HRRZS (P) ;Just host number
HLRZ B,(B)
PUSH P,B
PUSH P,[8]
PUSH P,FAKEOP
PUSHJ P,WRINT↑
MOVEI A,"#"
XCT FAKEOP
; POP P,B
; PUSH P,B
PUSH P,[8]
PUSH P,FAKEOP
PUSHJ P,WRINT↑
MOVEI A,"#"
XCT FAKEOP
; POP P,B
; PUSH P,B
PUSH P,[8]
PUSH P,FAKEOP
PUSHJ P,WRINT↑
MOVEI A,"#"
XCT FAKEOP
JRST FPOPJ1
.SOUT↑: MOVEM A,FAKJFN
TLC B,-1
TLCN B,-1
HRLI B,(<POINT 7,0>)
PUSH P,B
PUSH P,FAKEOP
PUSHJ P,WRASCZ↑
TLNN B,6077 ;Look like a byte pointer?
TLNN B,1700
JRST FPOPJ ; No, just return JFN
SETZ A, ;Null terminate string
PUSH P,FAKJFN
IDPB A,FAKJFN
POP P,A
POPJ P,
.NOUT↑: MOVEM A,FAKJFN
PUSH P,B
PUSH P,C
ANDI C,77
EXCH C,(P)
PUSH P,FAKEOP
PUSHJ P,WRINT↑
FPOPJ1: MOVE A,FAKJFN
AOS (P)
POPJ P,
.ODTIM↑:MOVEM A,FAKJFN
ACCTIM A,
PUSH P,A
PUSH P,FAKEOP
PUSHJ P,WRDAYT↑
JRST FPOPJ
.BOUT↑: MOVEM A,FAKJFN
MOVE A,B
XCT FAKEOP
FPOPJ: MOVE A,FAKJFN
POPJ P,
.JFNS↑: MOVEM A,FAKJFN
JUMPL B,ILGJFN
CAILE B,17
JRST ILGJFN
SETZ A,
SLEEP A,
HRRZ A,JOBJDA↑(B)
JUMPE A,CPOPJ
PEEK A,
PUSH P,A
PUSH P,A
PUSH P,FAKEOP
PUSHJ P,WRSIX↑
MOVEI A,":"
XCT FAKEOP
POP P,A
HLRZ A,A
CAIE A,'DSK'
CAIN A,'UDP'
POPJ P,
HRRZ A,JOBJDA↑(B)
ADDI A,11
PEEK A,
PUSH P,A
PUSH P,FAKEOP
PUSHJ P,WRSIX
MOVEI A,"."
XCT FAKEOP
HRRZ A,JOBJDA↑(B)
ADDI A,12
PEEK A,
PUSHJ P,SIXHLF
MOVEI A,"["
XCT FAKEOP
HRRZ A,JOBJDA↑(B)
ADDI A,14
PEEK A,
PUSH P,A
PUSHJ P,SIXHLF
MOVEI A,","
XCT FAKEOP
POP P,A
MOVS A,A
PUSHJ P,SIXHLF
MOVEI A,"]"
XCT FAKEOP
JRST FPOPJ
SIXHLF: PUSH P,0
PUSH P,A
HLLZS (P)
PUSH P,FAKEOP
PUSHJ P,WRSIX
POP P,0
POPJ P,
ILGJFN: OUTSTR[ASCIZ/Illegal JFN for simulator.
/]↔ JRST 4,.
TIME↑←←<PUSHJ P,.TIME>
GETAB↑←←<PUSHJ P,.GETAB>
HALTF↑←←<EXIT 1,>
OPRFN↑←←<PUSHJ P,.OPRFN>
RUNTM↑←←<RUNTIM A,>
DISMS↑←←<PUSHJ P,.DISMS>
PUPI↑←←<PUSHJ P,.PUPI>
PUPO↑←←<PUSHJ P,.PUPO>
PUPNM↑←←<PUSHJ P,.PUPNM>
SOUT↑←←<PUSHJ P,.SOUT>
NOUT↑←←<PUSHJ P,.NOUT>
BOUT↑←←<PUSHJ P,.BOUT>
PBOUT↑←←<OUTCHR B>
ODTIM↑←←<PUSHJ P,.ODTIM>
JFNS↑←←<PUSHJ P,.JFNS>
erstr↑←←<jfcl>
dirst↑←←<jfcl>
dobe↑←←<jfcl>
cfibf↑←←<clrbfi>
ARBCHN↑:PUSH P,@(P)
AOS -1(P)
DPB C,[POINT 4,(P),12]
XCT (P)
SKIPA
AOS -1(P)
POP P,(P)
POPJ P,
GETCHN↑:SETZ C,
SLEEP C, ;Make sure JOBJDA is current.
MOVSI C,-20
SKIPE JOBJDA↑(C)
AOBJN C,.-1
JUMPL C,[HRRZ C,C
AOS (P)
POPJ P,]
SETO C,
POPJ P,
FAKEOP: PUSHJ P,FAKER
FAKER: PUSH P,B
MOVE B,FAKJFN
CAIL B,0
CAILE B,17
JRST FAKER2
FAKER1: outstr[asciz/Only JFN simulator currently can output to is a string or TTY
/]↔ exit 1,
JRST FAKER9
FAKER2: CAMN B,[-2]
JRST[ OUTCHR A
JRST FAKER9]
TLNN B,6077 ;Look like a byte pointer?
TLNN B,1700 ;Look like a byte pointer?
JRST FAKER1
IDPB A,FAKJFN
FAKER9: POP P,B
POPJ P,
FAKJFN: -1
%UFTPM↑: OUTSTR[ASCIZ/Illegal user UUO. /]
POP P,(P)
JRST 4,@1(P)
;Fake GETAB entries and related GENSYMmed garbage
.TEMP←←0
FOR X IN (PUPPAR,ENTFLG,PUPX3) <
.TEMP←←.TEMP+1
X↑: .TEMP
>;FOR
BEGIN HSHROU
tac←a
tac1←b
↑hshrou:
jumpe tac,[
direct: move tac,nettab
popj p,]
cain tac,@nettab
jrst direct
PUPRO1: PUSH P,TAC ;Save on stack
IDIVi TAC,ROUSIZ ;Hash the network number
PUSH P,[-1] ;Push a flag
PUPRO2: LDB TAC,ROUNET ;Is this the network number we want?
CAMN TAC,-1(P)
JRST PUPRO3 ; Yes, use it
JUMPE TAC,PUPRO4 ;Not accessable if slot is empty
SOJGE TAC1,PUPRO2 ;Try next slot, but watch for wraparound
MOVEi TAC1,ROUSIZ ;Start again from other end of table
AOSG (P) ;Check for hash table overflow.
SOJA TAC1,PUPRO2
AOSE SNTCTY ;Have we complained yet?
JRST PUPRO4 ; Yes, take a failure return
MOVEI TAC,[SIXBIT/CTY/↔[ASCIZ/Routing table overflow. Fix ROUTAB in FAKTNX/]]
TTYMES TAC,
JFCL
JRST PUPRO4
; ---
PUPRO3:
POP P,TAC ;Flush stack
AOS -1(P) ;Assume success
LDB TAC,ROUGTW ;Return gateway to use
HRLZM TAC,(P) ;Set host number
LDB TAC,ROUINT ;Internal network number
MOVE TAC,NETTAB(TAC)
DPB TAC,[POINT 10,(P),9] ;Set network number, broadcast, accessibilty
POP P,TAC
POPJ P,
PUPRO4: POP P,(P)
POP P,A
movsi a,-1
POPJ P,
↑ROUNET: POINT 8,routab(TAC1),7 ;Target-net
↑ROUGTW: POINT 8,routab(TAC1),23 ;Gateway-net
↑ROUINT: POINT 0,routab(TAC1),35 ;Internal net number (currently only EtherNet here)
NETTAB: 1B1+44 ;SU-Net
;TENEX routing table looks like this
;B0 Inaccessable
;B1 Can't broadcast
;B2:9 Gateway network
;B10:17 Gateway host
ROUCLR↑:SETZM ROUTAB
MOVE A,[XWD ROUTAB,ROUTAB+1]
BLT A,ROUTAB+ROUSIZ-1
POPJ P,
ROUADD↑:PUSH P,A
PUSH P,B
HRRZ A,A
PUSHJ P,PUPRO1 ;Hash network number
POP P,A
SETZM @ROUNET ;Start with fresh entry
TRNE A,-1 ;Directly connected?
JRST ROUAD2
HLRZ A,A ;Get gateway address
DPB A,ROUGTW
ROUAD2:
printx If more than one network, must fix here.
; DPB A,ROUINT
POP P,A
DPB A,ROUNET ;Now, set network number
POPJ P,
BEND HSHROU
PUPROU↑:-77,,ROUTAB
IOWD ROUSIZ,ROUTAB ;Must precede actual routing table
ROUTAB: BLOCK =67+1 ;Should be prime + 1
ROUSIZ←←.-ROUTAB-1 ;(Extra word to absorb overflow by ROUADD)
SNTCTY: -1 ;Send only one message if table overflows
END