mirror of
https://github.com/PDP-10/its.git
synced 2026-01-24 19:32:35 +00:00
This is the same change as in the new IMP with the comment ;; KLH: "fixed" 11/1/99 Not doing this will e.g. make the FTP server fail because it can't look up its own IP number in the host table.
1995 lines
64 KiB
Plaintext
Executable File
1995 lines
64 KiB
Plaintext
Executable File
;;; -*- Mode:MIDAS -*-
|
||
;;; Copyright (c) 1999 Massachusetts Institute of Technology
|
||
;;; See the COPYING file at the top-level directory of this project.
|
||
|
||
SUBTTL ARPANET HARDWARE DEFINITIONS
|
||
|
||
IFNDEF BLIMPP,BLIMPP==INETP ; Use IMP blockage avoidance code
|
||
IMPVRS==.IFNM2 ; Version of IMP/NCP code
|
||
|
||
IFN KAIMP,[
|
||
; Hardware description of AI-KA/ML/MC IMP interface, device "IMP".
|
||
; For a more detailed description, see AI Hardware Memo #10,
|
||
; "ARPA Network Interface".
|
||
; In particular, the "channel 1 multiplexing" feature of the ITS KA's
|
||
; is used, so that:
|
||
; When PI level 2 (NETCHN) is assigned, the IMP interface takes
|
||
; all interrupts on the normal channel (goes to IMPINT).
|
||
; When PI level 1 (IMPCHN) is assigned,
|
||
; IMPID+(-IMPLIW) => Pseudo channel 4, location 70 (IMPILC)-> various
|
||
; IMPOD => Pseudo channel 5, location 72 (IMPOLC)-> various
|
||
; else normal PI channel 1 (PI0LOC+2)-> IMPBRK
|
||
|
||
; CONI bits - starred items cause interrupt on PIA channel
|
||
; 1.1-1.3 => PIA
|
||
IMPID==10 ;* INPUT DONE - Turned on when interface has word for DATAI
|
||
IMPI32==20 ; Input in 32 bit mode
|
||
;IMPIB==40 ; Input Busy
|
||
IMPOD==100 ;* OUTPUT DONE - Interface has finished giving word to IMP
|
||
;IMPO32==200 ; Output in 32 bit mode
|
||
;IMPOB==400 ; Output Busy
|
||
IMPERR==1000 ;* Imp Error (interrupt if IMPIC zero)
|
||
IMPR==2000 ;* Imp Ready (interrupt if IMPIC set)
|
||
;IMPIC==4000 ; Imp interrupt condition (0 = int on IMPERR, 1= int on IMPR)
|
||
IMPHER==10000 ;* Host Error (interrupt if IMPIHE zero)
|
||
;IMPHR==20000 ; Host Ready
|
||
;IMPIHE==40000 ; Inhibit interrupt on Host Error (IMPHER)
|
||
IMPLW==100000 ;* Last Imp Word
|
||
|
||
; CONO bits - starred flags are always copied directly to set states
|
||
;* 1.1-1.3 => PIA set from these bits
|
||
IMPIDC==10 ; Clear Input Done
|
||
IMI32S==20 ; Set input to 32 bit mode
|
||
IMI32C==40 ; Clear input in 32 bit mode
|
||
IMPODC==100 ; Clear Output Done
|
||
IMO32S==200 ; Set output to 32 bit mode
|
||
IMO32C==400 ; Clear output in 32 bit mode
|
||
IMPODS==1000 ; Set Output Done
|
||
IMPIR==4000 ;* Copied to IMPIC; 1= Enable int on imp ready
|
||
IMPHEC==10000 ; Clear Host Error
|
||
;IMIIHE==40000 ;* Copied to IMPIHE; 1= Inhibit int on host error
|
||
IMPLHW==200000 ; Set Last Host Word (do this before last DATAO of msg)
|
||
|
||
];DMIMP
|
||
IFN DMIMP,[ ;HARDWARE DESCRIPTION OF DM IMP INTERFACE (PER RMM)
|
||
|
||
; Note that all PI level 2 interrupts go to normal ITS location
|
||
; and thence vectored to IMPINT.
|
||
; However, PI 1 interrupts go to different places:
|
||
; Input Done -> loc 70 (IMPILC)
|
||
; Output Done -> loc 72 (IMPOLC)
|
||
; Control -> Should never get control interrupt at PI 1.
|
||
; Thus for example "Last Imp Word" interrupts go to
|
||
; IMPINT even though input side PIA is 1, because LIW is
|
||
; a control interrupt and control ints are always kept at PI 2.
|
||
|
||
;IMP INTERFACE CONO FLAG DESCRIPTION
|
||
|
||
;COMMON FLAG BITS TO CONTROLLER
|
||
|
||
;18-> 0 FOR INPUT SIDE, 1 FOR OUTPUT SIDE
|
||
;19->CLEAR TEST MODE (200000)
|
||
;20->SET TEST MODE (100000)
|
||
|
||
;21->CLEAR HOST READY
|
||
;22->SET HOST READY (20000)
|
||
;23->CLEAR IMP-WAS-DOWN (10000)
|
||
|
||
;24->FI DEVICE RESET (CLEAR ALL INPUT AND OUTPUT FLAGS) (4000)
|
||
|
||
;CONO FI (424) TO OUTPUT SIDE
|
||
;BIT ;18->IS '1' INDICATING TO OUTPUT
|
||
;25->CLEAR OUTPUT 32-BIT MODE
|
||
;26->SET OUTPUT 32-BIT MODE
|
||
|
||
;27->SET OUTPUT EOT (CLEAR DONE, SET BUSY) (400)
|
||
;28->SET OUTPUT DONE (200)
|
||
;29->RESET OUTPUT (CLEAR ALL OUTPUT FLAGS) (100)
|
||
|
||
;30-32->CONTROL PI ASSIGNMENT
|
||
|
||
;33-35->OUTPUT DONE PI ASSIGNMENT
|
||
|
||
;CONO FI (424) TO INPUT SIDE
|
||
;BIT ;18->IS '0' INDICATING TO INPUT
|
||
;25->CLEAR 32-BIT MODE (2000)
|
||
;26->SET 32-BIT MODE (1000)
|
||
|
||
;27->SUSPEND INPUT (400) DATAI WONT SET BUSY NOW
|
||
;28->SET INPUT BUSY (LISTENING TO NETWORK) (200)
|
||
;29->RESET INPUT (CLEAR ALL INPUT FLAGS!) (100)
|
||
|
||
;30-32->CONTROL PI ASSIGNMENT
|
||
|
||
;33-35->INPUT DONE PI ASSIGNMENT
|
||
|
||
;FI CONI FLAG DESCRIPTION
|
||
|
||
;BIT ;00->TEST MODE IS ENABLED
|
||
;08->OUTPUT IS IN 32-BIT MODE
|
||
;17->INPUT IS IN 32-BIT MODE
|
||
|
||
;18->IMP IS DOWN
|
||
;19->IMP WAS DOWN
|
||
;20->HOST READY (?)
|
||
|
||
;21->OUTPUT EOT ON
|
||
;22->OUTPUT BUSY
|
||
;23->OUTPUT DONE
|
||
;24-26->OUTPUT-DONE PI ASSIGNMENT
|
||
|
||
;27->INPUT EOT ON
|
||
;28->INPUT BUSY
|
||
;29->INPUT DONE
|
||
|
||
;30-32->CONTROL INTERRUPT PI ASSIGNMENT
|
||
|
||
;33-35->INPUT DONE PI ASSIGNMENT
|
||
|
||
; SYMBOL ASSIGNMENTS FOR DM HARDWARE
|
||
|
||
; CONO BITS
|
||
|
||
FIIN==000000 ;(SIC) SPECIFY CONO FOR INPUT
|
||
FIOUT==400000 ;SPECIFY CONO FOR OUTPUT SIDE
|
||
;FITSTC==200000 ;CLEAR TEST MODE
|
||
;FITSTS==100000 ;SET TEST MODE
|
||
|
||
;FIHSTC==040000 ;CLEAR HOST READY
|
||
FIHSTS==020000 ;SET HOST READY
|
||
FIIWDC==010000 ;CLEAR "IMP WAS DOWN"
|
||
|
||
FIRSET==004000 ;DO LOCAL IOB RESET FOR FI DEVICE
|
||
|
||
;INPUT SIDE ONLY
|
||
|
||
FII32C==002000 ;CLEAR 32 BIT MODE, INPUT
|
||
FII32S==001000 ;SET 32 BIT MODE, INPUT
|
||
|
||
FISUSP==000400 ;"SUSPEND INPUT" CLEAR FLAG, NOT SET BUSY
|
||
FIIBSY==000200 ;SET INPUT BUSY, ALLOWS BITS IN FROM IMP
|
||
FIIDC==000100 ;CLEAR INPUT DONE
|
||
|
||
; 0000X0 ;CONTROL PIA
|
||
|
||
; 00000X ;INPUT DONE PIA
|
||
|
||
;OUTPUT SIDE ONLY
|
||
|
||
FIO32C==402000 ;CLEAR 32 BIT MODE, OUTPUT
|
||
FIO32S==401000 ;SET 32 BIT MODE, OUTPUT
|
||
|
||
FILHW==400400 ;SET "LAST HOST BIT TO IMP"
|
||
FIODS==400200 ;SET OUTPUT DONE
|
||
FIODC==400100 ;CLR OUTPUT DONE
|
||
|
||
; 0000X0 ;CONTROL PIA
|
||
|
||
; 40000X ;OUTPUT DONE PIA
|
||
|
||
; CONI BITS
|
||
|
||
; LEFT HALF OF CONI WORD FOR FOLLOWING 3 BITS
|
||
|
||
;FITSTM==400000 ;TEST MODE IS ON
|
||
;FIO32==001000 ;OUTPUT IS IN 32 BIT MODE
|
||
FII32==000001 ;INPUT IS IN 32 BIT MODE
|
||
|
||
; RIGHT HALF OF CONI
|
||
|
||
FIDOWN==400000 ;IMP IS DOWN
|
||
FIWASD==200000 ;IMP WAS DOWN (OR IS) SINCE LAST RESET
|
||
;FIHSTR==100000 ;HOST READY IS SET ON
|
||
|
||
;FIOEOT==040000 ;OUTPUT LAST IMP BIT IS ON
|
||
;FIOBSY==020000 ;OUTPUT IS BUSY AFTER DATAO
|
||
FIOD==010000 ;OUTPUT IS DONE, (INTERRUPTING)
|
||
|
||
; 00X000 ;OUTPUT DONE PIA
|
||
|
||
FILW==000400 ;LAST BIT SET FROM IMP
|
||
FIIBSY==000200 ;INPUT IS BUSY, WORD BEING ASSEMBLED FROM IMP
|
||
FIID==000100 ;INPUT IS DONE (INTERRUPTING) TO DO DATAI
|
||
|
||
; 0000X0 ;CONTROL PIA
|
||
|
||
; 00000X ;INPUT PIA
|
||
|
||
IMPLW==FILW ;USEFUL TO TEST IN AC
|
||
IMP==FI ;USEFUL FOR BLKO, DATAO INSTR
|
||
]
|
||
|
||
; IMP 1822 PROTOCOL INFORMATION (EXTENDED-LEADER VERSION)
|
||
|
||
; The IMP leader is 96 bits long, usually organized as 3 words of 32 bits.
|
||
; For further details, these documents are available from the Network
|
||
; Information Center:
|
||
; IMP-HOST protocol: BBN Report No. 1822
|
||
; NCP protocol: NIC 8246, Host-to-Host Protocol for the ARPANET
|
||
; IP, TCP: Internet Protocol Transition Workbook, and
|
||
; Internet Protocol Implementor's Guide
|
||
;
|
||
; For the benefit of the NCP code, ITS reads in the leader as 36-bit words
|
||
; with sufficient IMP padding (5 16-bit wds) to cause NCP data to be aligned
|
||
; on a word boundary. The first 4 words of the leader are read
|
||
; in 36-bit mode:
|
||
;------------------------------------------------------------------------
|
||
;1: 4.9-4.6 not used (0)
|
||
; 4.5-4.2 all 1's for new format, else old msg type (4=old nop)
|
||
; 4.1-3.3 network number (0)
|
||
; 3.2-2.8 not used (0)
|
||
; 2.7 trace (ignored)
|
||
; 2.6-2.4 leader flags (2.6 is to be ignored, 2.5-2.4 are not used!)
|
||
; 2.3-1.5 message type (as of yore, but more bits) (see IMTDT)
|
||
; 1.4-1.1 high 4 bits of handling type (0)
|
||
;
|
||
;2: 4.9-4.6 Low bits of handling type (7 for big buffers, 4 for small buffers,
|
||
; 4.5-3.7 host number and 0 for the control link)
|
||
; 3.6-1.9 Imp number
|
||
; 1.8-1.1 Link number (high 8 bits of message-id)
|
||
;
|
||
;3: 4.9-4.6 Low 4 bits of message-id (0)
|
||
; 4.5-4.2 Sub-type
|
||
; 4.1-2.4 Message length (ignored)
|
||
; 2.3-1.1 Padding
|
||
;------------------------------------------------------------------------
|
||
; All non-regular messages (ie Host-Imp, not Host-Host)
|
||
; stop here, since padding and data only exist for regular
|
||
; messages (Type 0).
|
||
;------------------------------------------------------------------------
|
||
;4: 4.9-1.1 Padding
|
||
;------------------------------------------------------------------------
|
||
; At this point there are still 32 bits of padding left. The
|
||
; Internet Protocol messages are vectored off here (they are
|
||
; identified by a message-type of 0 and a link-number of 233).
|
||
;------------------------------------------------------------------------
|
||
; HOST-HOST REGULAR MESSAGES
|
||
; NETWORK CONTROL PROTOCOL (NCP) - read in 36-bit mode
|
||
;5: 4.9-1.5 Padding
|
||
; 1.4-1.1 M1 Host-host padding
|
||
;
|
||
;6: 4.9-4.6 M1 Host-host padding ; NCP leader contained in this word.
|
||
; 4.5-3.7 S Byte size
|
||
; 3.6-1.9 C Byte count
|
||
; 1.8-1.1 M2 Host-host padding
|
||
;------------------------------------------------------------------------
|
||
; HOST-HOST REGULAR MESSAGES
|
||
; INTERNET PROTOCOL (IP) - read in 32-bit mode
|
||
;5: 4.9-1.5 Padding
|
||
;6: 4.9-1.5 First word of IP datagram
|
||
;------------------------------------------------------------------------
|
||
|
||
;In message types 2 and 6, the going-down status 16-bit word is
|
||
;in word 2 1.8-1.1 and word 3 4.9-4.2.
|
||
|
||
;4.5-4.2 of word 3 are the padding count for type 4 (nop) from host.
|
||
;This is 5. Padding is only put on type-0 messages.
|
||
|
||
IMTBP: 041000,,IMPILB+0 ;BYTE POINTER FOR MESSAGE TYPE FIELD
|
||
IMOTBP: 340400,,IMPILB+0 ; Byte ptr for message format type
|
||
IMLNBP: 001000,,IMPILB+1 ;BYTE POINTER FOR LINK NUMBER FIELD
|
||
IMSABP: 103000,,IMPILB+1 ; Byte ptr for source address field (host+imp)
|
||
IMSHBP: 301000,,IMPILB+1 ;BYTE POINTER FOR SOURCE HOST FIELD
|
||
IMSIBP: 102000,,IMPILB+1 ;BYTE POINTER FOR SOURCE IMP FIELD
|
||
IMSTBP: 340400,,IMPILB+2 ; Byte ptr for subtype field
|
||
IMCBBP: 301000,,IMPILB+5 ;BYTE POINTER FOR CONNECTION BYTE SIZE FIELD
|
||
IMBCBP: 102000,,IMPILB+5 ;BYTE POINTER FOR BYTE COUNT FIELD
|
||
|
||
|
||
SUBTTL ARPANET VARIABLES AND TABLES
|
||
|
||
IFN NCPP,[
|
||
IMPSTL==NNETCH ;SOCKET TABLE LENGTH (MUST BE .LE. 70)
|
||
IFG NNETCH-70,.ERR NNETCH SHOULD BE LESS THAN 70 OCTAL, PER BBN SPECS
|
||
];NCPP
|
||
|
||
IFN INETP,[
|
||
IMPCLP: 0 ; HACK!! # to use for control-link link field.
|
||
]
|
||
EBLK
|
||
|
||
IMPN:: ;IMP DATA AREA CLEARED WHEN IMPUP
|
||
IFN INETP,[
|
||
%IMXLN==:<<8159.-96.>+31.>/32. ; Max # of 32-bit words in IMP regular msg,
|
||
; exclusive of leader and leader padding. = 252.
|
||
IMPIBS: 0 ; Saved initial BLKI pointer for IP datagram read
|
||
IMPIDP: 0 ; Pointer to IP datagram being input at PI level
|
||
IMPODP: 0 ; Pointer to IP datagram being output at PI level
|
||
IMPPSW: 0 ; Flip-flop to alternate output of IP and NCP msgs
|
||
]
|
||
IFN KAIMP,[
|
||
IMPI: 0 ;-1 => IMPCHN INPUT INTERRUPT OCCURRED
|
||
IMPO: 0 ;-1 => IMPCHN OUTPUT INTERRUPT OCCURRED
|
||
IMPB: 0 ;-1 => IMPCHN FLAG INTERRUPT OCCURRED
|
||
IMPIH: 0 ;-1 => INPUT WANTS PIA = IMPCHN
|
||
IMPOH: 0 ;-1 => OUTPUT WANTS PIA = IMPCHN
|
||
]
|
||
IMPIS: 0 ;INPUT STATE
|
||
%ISIDN==:-1 ; Network shut off
|
||
%ISIDL==:0 ; Normal - idle, not expecting input (i.e. between msgs)
|
||
%ISIGN==:1 ; Ignore input until end of current message (36 bit mode)
|
||
%ISIML==:2 ; Reading IMP initial leader (36 bit mode)
|
||
%ISINC==:3 ; Reading NCP control message (32 bit mode)
|
||
%ISIND==:4 ; Reading NCP data message (32 or 36 bit mode)
|
||
%ISINL==:5 ; Reading NCP-type IMP leader (36 bit mode)
|
||
%ISIIL==:6 ; Reading IP-type IMP leader (32 bit mode)
|
||
%ISIID==:7 ; Reading IP datagram (32 bit mode)
|
||
|
||
IMPOS: 0 ;OUTPUT STATE
|
||
%ISODL==:0 ; Not expecting output done (i.e. between messages)
|
||
%ISONC==:1 ; Sending NCP control message
|
||
%ISOND==:2 ; Sending NCP data message
|
||
%ISOID==:3 ; Sending IP Datagram
|
||
|
||
IMPHI: 0 ;-1 TO HOLD UP INPUT
|
||
;-2 INPUT IS SUCCESSFULLY HELD UP
|
||
IMRFCT: 0 ;NUMBER OF HOST TABLE ENTRIES WITH PENDING
|
||
;TIMEOUTS FOR CONTROL-LINK RFNM OR RST-RRP.
|
||
|
||
; ACTIVE HOST TABLE. Entries herein are allocated as needed, using garbage
|
||
; collection. Most "host number" fields are really indices into
|
||
; this table.
|
||
LIMPHT==<NNETCH/2+3>+<XBL+5> ; NCP conns plus TCP conns plus a few extra
|
||
IMPHTN: BLOCK LIMPHT ; Host number. 1.1-1.8 HOST, 2.1-3.7 IMP
|
||
IMPHTB: BLOCK LIMPHT ;BITS:
|
||
;4.9 1=RFNM WAIT ON LINK 0 (NCP)
|
||
;4.8 GC MARK BIT
|
||
;4.7-4.3 UNUSED
|
||
;4.2-4.1 STATUS OF HOST 0 DOWN, 1 RST SENT, 2 UP
|
||
;3.9-3.1 TIME (MOD 2**9) LAST RFNM SENT ON LINK 0 (NCP)
|
||
.SEE IMPHDS ;RH LAST MESSAGE FROM IMP ABOUT "HOST DEAD STATUS"
|
||
IMPHTC: BLOCK LIMPHT ; # active messages outstanding for host (8 max)
|
||
IMPHTT: BLOCK LIMPHT ; Time of last RFNM received
|
||
|
||
IMNCS: 0 ;NUMBER OF CHANNELS BEING CLOSED
|
||
IMNAS: 0 ;NUMBER OF CHANNELS WITH 4.8 IN IMSOC5 SET
|
||
LIMPN==.-1 ;LAST LOCATION BLT'ED TO ZERO WHEN INITIALIZED
|
||
IMNBLK: 0 ; Number of times blockage avoided (output held up by ITS)
|
||
IMPHTF: -1 ;HOST TABLE FREE LIST, THREADED THROUGH IMPHTB, END WITH -1
|
||
IMPUP: -1 ;0 => IMP UP ;-1 => DOWN ;-2 => COMING UP, PI LVL STILL OFF
|
||
;1 => DOWN FOR GOOD, UNTIL NEXT TIME IMP READY LINE CHANGES
|
||
IMPTCU: 0 ;0 IMP UP/DOWN STATUS NOT CHANGING
|
||
;>0 TRYING TO REINITIALIZE, SYS JOB HASN'T DONE SO YET
|
||
;-1 HAS BEEN REINITIALIZED, HAVEN'T EXCHANGED NOPS YET
|
||
IMPUCT: 0 ;IMP COMING UP TIMEOUT, IF 4 NOOPS DON'T GO THROUGH PROMPTLY.
|
||
IMPDWN: BLOCK 3 ;LAST MESSAGE FROM IMP THAT IT IS GOING DOWN
|
||
;WD0 "REASON" CLAIMED BY IMP (SEE CH 3 OF BBN REPORT 1822)
|
||
;WD1 TIME WHEN EXPECTED DOWN
|
||
;WD2 TIME WHEN EXPECTED UP (SYS TIME=1/30 SEC SINCE UP)
|
||
IFN KAIMP,IMPPIA: 0 ;CURRENT IMP PIA
|
||
IMPCNI: 0 ;CONI INTO HERE AT SLOW CLOCK LEVEL
|
||
IMERCN: -1 ;CONI INTO HERE WHEN NET GOES DOWN
|
||
IMNOPC: 0 ;< 0 => SEND NOPS
|
||
IMPA: 0 ;SAVE A AT IMPCHN PI LEVEL
|
||
IMPOAC: -1 ;-1 => OUTPUT INACTIVE
|
||
IMPERB: BLOCK 5 ;LAST "ERR" MESSAGE FROM A HOST
|
||
;WD 0 TIME WHEN RCVD, WD 1 HOST, WD2-4 11. 9-BIT BYTES OF DATA
|
||
IFN DMIMP,IMPSUS: 0 ;HOLDS INPUT WORD WHILE INPUT IS HELD UP
|
||
IMPILB: BLOCK 6 ;INPUT LEADER BUFFER
|
||
IMPINB: BLOCK 30.+5 ;30. WORDS @ 32 BITS/WD = 120. 8 BIT BYTES
|
||
;+5 WORDS FOR GOOD MEASURE
|
||
;THIS BUFFER IS FOR CONTROL-LINK MESSAGES
|
||
BBLK
|
||
|
||
IMHSBT: 330200,,IMPHTB(H) ;RST/RRP STATUS
|
||
|
||
EBLK
|
||
|
||
IMPCSH: -1 ;CURRENT SOURCE HOST (IMPHTB INDEX). -1 WHEN IDLE.
|
||
IMPCLN: 0 ;CURRENT LINK NUMBER
|
||
IMPCBS: 0 ;CURRENT BYTE SIZE
|
||
IMPCBC: 0 ;CURRENT BYTE COUNT
|
||
IMPNIW: 0 ;EXPECTED LAST BLKI ADDRESS
|
||
IMNWSI: 0 ;SECOND BLKI POINTER, ZERO IF NONE
|
||
IMPSVP: 0 ;SAVE PIA AT IMPRMP
|
||
IMPSVQ: 0 ;SAVE CONTROL MESSAGE QUEUE POINTER AT IMPOB2
|
||
IMBLKI: 0 ;PLACE TO STORE BLKI POINTER
|
||
IMBLKO: 0 ;PLACE TO STORE BLKO POINTER
|
||
IMPNBI: 0 ;AMOUNT TO INCREMENT IMSMPC(I) BY, I.E. # OF DATA BYTES
|
||
; IN MESSAGE CURRENTLY COMING IN AT P.I. LEVEL
|
||
IMPNBO: 0 ;AMOUNT TO INCREMENT IMSMPC(I) BY, I.E. # OF DATA BYTES THAT WILL BE
|
||
; MADE FREE IN BUFFER BY MESSAGE CURRENTLY GOING OUT AT P.I. LEVEL
|
||
IMPNBT: 0 ;# BITS ACTUALLY BEING SENT, USED TO ADJUST ALLOCATION
|
||
IMPNPT: 0 ;NEW VALUE FOR IMSPIP(I) AFTER MSG IS SENT
|
||
IMPIPI: -1 ;IMSOC INDEX ACTIVE FOR INPUT AT P.I. LEVEL, OR -1 IF NONE
|
||
IMPOPI: -1 ;IMSOC INDEX ACTIVE FOR OUTPUT AT P.I. LEVEL, OR -1 IF NONE
|
||
IMOB0Z: 0 ;IMSMPP AT IMOBD1, FOR DEBUGGING
|
||
|
||
;IMP OUTPUT LIST. EXECUTED AT PI LEVEL 1.
|
||
;NEGATIVE = BLKO POINTER, 0=STOP, 1=SET LAST WORD, 2=32-BIT MODE, 3=NOP
|
||
IMOPNT: 0 ;INDEX OF NEXT "INSTRUCTION" IN IMP OUTPUT LIST:
|
||
IMOLST: 0 ;BLKO FOR SECOND THROUGH SIXTH LEADER WORDS (FIRST IS DATAO'ED)
|
||
IMOMOD: 2 ;SWITCH TO 32-BIT MODE IF NECESSARY
|
||
IMOBK1: 0 ;FIRST BLKO POINTER
|
||
IMOBK2: 0 ;SECOND BLKO POINTER
|
||
1 ;SET LAST WORD
|
||
IMOBK3: 0 ;THIRD BLKO POINTER (SEND LAST WORD, NOT USED WITH DM INTERFACE)
|
||
0 ;STOP
|
||
IMOLDR: BLOCK 6 ;BUILD PREAMBLE HERE FOR DATA MESSAGES
|
||
|
||
IMPNEA: 0 ;NUMBER OF ECOS IN COMMAND MESSAGE THAT HAVE BEEN ANSWERED
|
||
IMPNRA: 0 ;NUMBER OF RSTS ANSWERED
|
||
|
||
;METERS
|
||
IFN INETP,[
|
||
IMNIPI: 0 ; # of IP datagrams input (rcvd)
|
||
IMNIPF: 0 ; # of IP datagrams flushed (input threw away)
|
||
IMNIPO: 0 ; # of IP datagrams output (sent)
|
||
IMNIPR: 0 ; # of IP RFNMs received
|
||
IMNIP7: 0 ; # of IP Type 7 (Dest Host Dead) messages received
|
||
IMNIP8: 0 ; # of IP Type 8 (Error) msgs rcvd
|
||
IMNIP9: 0 ; # of IP Type 9 (Incomplete Transmission) msgs rcvd
|
||
IMNWIG: 0 ; # words ignored by "Ignore" state (%ISIGN)
|
||
IMNWIF: 0 ; # words flushed by IMPRM5
|
||
] ;INETP
|
||
IFN NCPP,[
|
||
IMNOSH: 0 ;# OF SHUFFLES OF NET OUTPUT BUFFERS
|
||
IMNISH: 0 ;# OF SHUFFLES OF NET INPUT BUFFERS
|
||
IMNSCM: 0 ;NUMBER OF SHORT CONTROL LINK MESSAGES
|
||
IMPNEI: 0 ;NUMBER OF ERPS NOT SENT
|
||
IMPNRI: 0 ;NUMBER OF RRPS NOT SENT
|
||
IMNRFC: 0 ;NUMBER OF RFCS CLSED
|
||
IMNRFI: 0 ;NUMBER OF RFCS IGNORED
|
||
IMNCLI: 0 ;NUMBER OF CLS IGNORED
|
||
IMNALI: 0 ;NUMBER OF ALLS IGNORED
|
||
IMNPIL: 0 ;NUMBER OF TIMES PI CONTROL QUEUE EXCEEDED
|
||
IMNCNS: 0 ;NUMBER OF CLS NOT SENT
|
||
IMNANS: 0 ;NUMBER OF ALLS NOT SENT
|
||
IMNMNC: 0 ;NUMBER OF REGULAR MESSAGES FOR NON-EXISTANT CONNECTIONS
|
||
IMNMAE: 0 ;NUMBER OF TIMES MSG ALL EXCEEDED
|
||
IMNMSS: 0 ;NUMBER OF TIMES MSG SHORT
|
||
IMNBAE: 0 ;NUMBER OF TIMES BIT ALL EXCEEDED
|
||
] ;IFN NCPP
|
||
IMPNPE: 0 ;NUMBER OF PROTOCOL ERRORS
|
||
IMNSRC: 0 ;NUMBER OF SPURIOUS RFNMS ON CONTROL LINK
|
||
IMNSRF: 0 ;NUMBER OF SPURIOUS RFNMS ON REG CONNECTIONS
|
||
IMNRFN: 0 ;NUMBER OF RFNMS NOT SENT
|
||
IMSTAS: 0 ;STATUS OF INPUT AT TIME HELD UP
|
||
IMPNIH: 0 ;NUMBER OF TIMES INPUT SUCCESSFULLY HELD UP
|
||
IMPNUH: 0 ;NUMBER OF TIMES INPUT HOLDUP UNDONE
|
||
IMRFTO==60.*30. ;RFNM WAIT TIME OUT
|
||
IFN NCPP,[
|
||
IMNORH: 0 ;NUMBER OF STYNET OUTPUT RESETS DELAYED
|
||
;IMPRTO==30.*60. ;RESET TIME OUT (IDENTICALLY = IMRFTO)
|
||
IMPCTO==30.*30. ;CLS TIME OUT
|
||
IMFCTO==55.*30. ;RFC QUEUE TIME OUT - SHOULD BE LESS THAN 2*IMPCTO
|
||
IMPCMR: BLOCK 20 ;COUNT OF CONTROL MESSAGES RCD
|
||
IMPCMS: BLOCK 20 ;COUNT OF CTL MSG SENT
|
||
] ;IFN NCPP
|
||
IMPMSR: BLOCK 20 ;COUNT OF IMP MESSAGES RCD
|
||
IMPM1S: BLOCK 4 ; # Type 1 (Error in Leader) subtype msgs
|
||
IMPM9S: BLOCK 20 ; # Type 9 (Incomplete Transmission) subtype msgs
|
||
IMPMSS: BLOCK 1 ;COUNT OF IMP MSG SENT (WE ONLY SEND REGULAR MSGS)
|
||
IMCT1: 0 ;# TIMES AT IMPBKZ
|
||
IMCT2: 0 ;# TIMES AT IMPIBZ
|
||
IMCT3: 0 ;# TIMES AT IMPOBZ
|
||
BBLK
|
||
|
||
SUBTTL ARPANET MAIN-PROGRAM LEVEL
|
||
|
||
IMPINI:
|
||
IFN KAIMP,[
|
||
CONO IMP,IMI32C
|
||
DATAI IMP,A
|
||
CONO IMP,IMPODC ;CLEAR OUTPUT DONE AND PIA
|
||
CONSZ IMP,IMPOD+7 ;CHECK OUTPUT DONE, PIA, CAUSE HOST READY
|
||
JRST 4,. ;CONO DIDN'T CLEAR SOME BITS?
|
||
CONO IMP,IMPIR+IMPHEC ;CLEAR HOST ERR, ENABLE INT ON IMP READY
|
||
]
|
||
IFN DMIMP,[
|
||
CONO FI,FIRSET ;RESET IMP INTERFACE, SET HOST READY
|
||
CONO FI,FIHSTS
|
||
]
|
||
SETOM IMPIPI
|
||
SETOM IMPOPI
|
||
MOVE T,TIME
|
||
ADDI T,15.
|
||
CAMLE T,TIME
|
||
PUSHJ P,UFLS ;WAIT FOR HALF SECOND
|
||
IFN KAIMP,[
|
||
CONO IMP,0 ;CLEAR "ENABLE IMP READY" INT (TURNS OFF IMP ERROR)
|
||
MOVEI A,NETCHN ;IDLE PIA
|
||
MOVEM A,IMPPIA
|
||
MOVE A,[JSR IMPIBK]
|
||
MOVEM A,IMPILC
|
||
MOVE A,[JSR IMPOBK]
|
||
MOVEM A,IMPOLC
|
||
]
|
||
IFN DMIMP,CONO FI,FIIWDC ;CLEAR "IMP WAS DOWN"
|
||
IFN NCPP,[
|
||
MOVSI I,-IMPSTL
|
||
IMPINA: SKIPE IMSOC6(I)
|
||
JRST 4,.
|
||
SETZM IMSOC1(I)
|
||
AOBJN I,IMPINA
|
||
] ;IFN NCPP
|
||
SETZM IMPILC+1
|
||
SETZM IMPOLC+1
|
||
SETOM IMPOAC
|
||
SETOM IMPUP ;NOT UP YET
|
||
MOVNI A,20. ;ALLOW 10 SECONDS TO COME UP
|
||
MOVEM A,IMPUCT
|
||
SETOM IMPTCU ;TRYING TO COME UP
|
||
SETOM IMPHTF ;WILL GC IMPHTB ON FIRST REFERENCE
|
||
IFN NCPP,[
|
||
SETOM IMPMPU
|
||
SETOM IMPMPL
|
||
SETOM IMPNCQ
|
||
SETOM IMPLCQ
|
||
MOVEI I,IMNPIC
|
||
MOVEM I,IMFCQL
|
||
MOVEI A,IMPCQ
|
||
MOVEM A,IMFFCQ
|
||
JRST IMPIN1
|
||
|
||
IMPIN2: ADDI A,IMPMQS+1
|
||
MOVEM A,-IMPMQS-1(A)
|
||
IMPIN1: SOJG I,IMPIN2
|
||
SETOM (A)
|
||
SETOM IMPBPQ
|
||
SETOM IMPEPQ
|
||
MOVEI A,IMPPQ
|
||
MOVEM A,IMFFPQ
|
||
MOVEI I,IMNPQ
|
||
JRST IMPIN4
|
||
|
||
IMPIN3: ADDI A,4
|
||
MOVEM A,-4(A)
|
||
IMPIN4: SOJG I,IMPIN3
|
||
SETOM (A)
|
||
MOVEI A,NETSRS
|
||
MOVEM A,NRSOC
|
||
];NCPP
|
||
MOVE A,[IMPN,,IMPN+1]
|
||
SETZM IMPN
|
||
BLT A,LIMPN
|
||
SETOM IMPIS ; Say IMP shut off
|
||
MOVE T,TIME
|
||
MOVEM T,LNETIM
|
||
IFN KAIMP,CONO IMP,NETCHN
|
||
IFN DMIMP,[
|
||
CONSZ FI,FIDOWN+FIWASD ;SKIP IF STILL UP
|
||
POPJ P, ;LOSE IF NOT IMP UP
|
||
CONO FI,FIIN\FIIBSY+NETCHN*11
|
||
CONO FI,FIOUT+NETCHN*11
|
||
]
|
||
SETOM IMPDWN+1 ;TIME FOR IMP TO GO DOWN, NOT KNOWN
|
||
;MOVE T,TIME
|
||
ADDI T,15.
|
||
CAMLE T,TIME
|
||
PUSHJ P,UFLS
|
||
SETZM IMPIS ; Say up but idle
|
||
MOVNI A,4
|
||
MOVEM A,IMNOPC ;SEND 4 NOPS
|
||
IMPOST: CONO PI,NETOFF
|
||
IFN DMIMP,[
|
||
CONSO FI,70 ;SKIP IF PIA NON-ZERO
|
||
JRST NETONJ ;IF NO PIA, THEN DONT SET INT
|
||
]
|
||
IFN KAIMP,MOVE TT,IMPPIA ;MAIN PROGRAM OUTPUT START
|
||
AOSN IMPOAC ;SKIP IF OUTPUT ALREADY ACTIVE
|
||
IFN KAIMP, CONO IMP,IMPODS(TT) ;GENERATE OUTPUT INTERRUPT
|
||
IFN DMIMP, CONO FI,FIODS+NETCHN*11
|
||
JRST NETONJ
|
||
|
||
IMPIOS:
|
||
IFN KAIMP,[
|
||
AOSE IMPOAC ;PI LEVEL OUTPUT START
|
||
POPJ P,
|
||
PUSH P,TT
|
||
CONO PI,400 ;TURN PI OFF, IMP MAY HAVE PIA = 1
|
||
MOVE TT,IMPPIA
|
||
CONO IMP,IMPODS(TT)
|
||
CONO PI,200
|
||
POP P,TT
|
||
]IFN DMIMP,[
|
||
AOSN IMPOAC
|
||
CONO FI,FIODS+NETCHN*11
|
||
]
|
||
POPJ P,
|
||
|
||
|
||
|
||
;Check if IMP ready line is set
|
||
; Called from SYSJOB.
|
||
; Return +1 if IMP not ready, +2 if so
|
||
;
|
||
IMPCKR:
|
||
IFN DMIMP,[
|
||
.ERR IMPCKR Missing for DMIMP!
|
||
]
|
||
IFN KAIMP,[
|
||
CONSZ IMP,IMPR ;Skip if IMP not ready
|
||
AOS (P) ;Return +2 if ready
|
||
POPJ P,
|
||
]
|
||
|
||
|
||
SUBTTL HOST-TABLE MANAGEMENT
|
||
|
||
; FNDHST - Look up host-table index for a given IMP host address.
|
||
; Call with NETOFF or NETCHN PI in progress.
|
||
; T/ IMP host address (maybe someday other nets?)
|
||
; Returns .+1 if failed (no room in table)
|
||
; Returns .+2
|
||
; H/ host-table index
|
||
; Smashes W.
|
||
|
||
FNDHST: MOVEI H,LIMPHT-1 ;SEARCH FOR AN ENTRY FOR THIS HOST
|
||
CAME T,IMPHTN(H)
|
||
SOJGE H,.-1
|
||
JUMPGE H,POPJ1 ;FOUND
|
||
SKIPGE H,IMPHTF ;NOT FOUND, CONS ONE OFF FREE LIST
|
||
JRST FNDHS1 ;OOPS, MUST GARBAGE COLLECT
|
||
MOVE W,IMPHTB(H)
|
||
IFN INETP,[ ; Later make this check standard!
|
||
CAIGE H,LIMPHT ; Make sure H is valid idx
|
||
CAIL W,LIMPHT ; ditto W
|
||
BUG HALT,[NET: FNDHST idx clobbered!!!]
|
||
]
|
||
MOVEM W,IMPHTF
|
||
MOVEM T,IMPHTN(H)
|
||
SETZM IMPHTB(H) ;NOTHING IS KNOWN ABOUT THIS HOST
|
||
SETZM IMPHTC(H) ; Assume no RFNMs outstanding
|
||
SETZM IMPHTT(H) ; Clear out time of last RFNM.
|
||
JRST POPJ1
|
||
|
||
; Host-Table full, attempt to GC it and flush unused entries, by
|
||
; scanning all possible pointers into table.
|
||
; IMP pointers are IMPCSH and IMPHTC(H)
|
||
; NCP pointers are IMSOC4<3.9-4.7>, RFC queue, PI ctl msg queue,
|
||
; and the RFNM-wait and RST-sent bits in table.
|
||
; TCP pointers are XBNADR(I)
|
||
|
||
; GC mark phase - mark entries in use
|
||
FNDHS1: PUSH P,I
|
||
MOVSI W,200000 ;MARK BIT
|
||
MOVEI H,LIMPHT-1 ;CLEAR ALL MARK BITS
|
||
ANDCAM W,IMPHTB(H)
|
||
SOJGE H,.-1
|
||
SKIPL H,IMPCSH ;MARK FROM IMPCSH
|
||
IORM W,IMPHTB(H)
|
||
|
||
IFN TCPP,[
|
||
MOVEI I,XBL-1
|
||
SKIPL H,XBNADR(I) ; See if TCP conn has a net addr specified
|
||
IORM W,IMPHTB(H) ; Yes, set the mark bit.
|
||
SOJGE I,.-2
|
||
] ;IFN TCPP
|
||
IFN NCPP,[
|
||
MOVEI I,IMPSTL-1 ;MARK FROM IMSOC4
|
||
FNDHS2: SKIPN IMSOC1(I) ;SKIP IF IMSOC4 IS BEING USED BY ANYONE
|
||
SOJGE I,FNDHS2
|
||
JUMPL I,FNDHS3
|
||
LDB H,IMSCFH
|
||
CAIE H,377
|
||
IORM W,IMPHTB(H)
|
||
SOJGE I,FNDHS2
|
||
FNDHS3: MOVE I,IMPBPQ ;MARK RFC PENDING QUEUE
|
||
JUMPGE I,[ LDB H,[101000,,3(I)]
|
||
IORM W,IMPHTB(H)
|
||
MOVE I,(I)
|
||
JRST . ]
|
||
MOVE I,IMPNCQ ;MARK CONTROL QUEUE
|
||
JUMPGE I,[ HLRZ H,1(I)
|
||
IORM W,IMPHTB(H)
|
||
MOVE I,(I)
|
||
JRST . ]
|
||
] ;NCPP
|
||
|
||
; GC sweep phase - free all unmarked entries
|
||
SETO I, ;FREE POINTER
|
||
MOVEI H,LIMPHT-1
|
||
MOVSI W,601000 ;PROTECT IF RFNM-WAIT, RST-WAIT, OR MARKED
|
||
FNDHS4:
|
||
SKIPG IMPHTC(H) ; Also protect if any outstanding RFNMs
|
||
TDNE W,IMPHTB(H)
|
||
SOJGE H,FNDHS4
|
||
JUMPL H,FNDHS5
|
||
SETZM IMPHTN(H) ;DON'T BELONG TO ANY HOST
|
||
MOVEM I,IMPHTB(H) ;CONS ONTO FREE LIST
|
||
MOVE I,H
|
||
SOJGE H,FNDHS4
|
||
FNDHS5: MOVEM I,IMPHTF ;FREE LIST
|
||
POP P,I
|
||
SKIPGE IMPHTF
|
||
POPJ P, ;GC-OVERFLOW
|
||
JRST FNDHST ;TRY AGAIN, SHOULD WIN
|
||
|
||
;See if IMP code is willing to handle a particular datagram right now.
|
||
; A/ IP DGM pointer
|
||
; C/ Immediate destination address
|
||
; Returns +1, can't send right now, +2, OK to send
|
||
;
|
||
IMPCTS:
|
||
IFN 0,[
|
||
MOVE T,C ;Set up for FNDHST
|
||
AND T,[<377_16.>+377] ;Mask out all but host and IMP field
|
||
CALL FNDHST ;Get host index in H
|
||
POPJ P, ;No host entry, don't send
|
||
JSP T,IMPBLI ;See if OK to send
|
||
POPJ P, ;IMP wants to block, no send
|
||
]
|
||
JRST POPJ1 ;Skip return if OK to send.
|
||
|
||
|
||
SUBTTL ARPANET INPUT INTERRUPT LEVEL
|
||
|
||
COMMENT |
|
||
The IMP interrupt level structure is fairly complicated and
|
||
deserves some explanation. Because the IMP interface is not a DMA
|
||
device, all I/O is done "by hand", a word at a time; for this reason
|
||
all I/O is done at PI level IMPCHN=1 (the highest) whenever possible.
|
||
However, to prevent general IMP processing from taking complete
|
||
precedence over everything else, all non-I/O handling is done at
|
||
PI level NETCHN=2, which is the same level as disk devices.
|
||
The MIT-DMS interface (DMIMP) is much more complicated than the
|
||
AI-KA/ML/MC interface and was designed to facilitate this dual-level
|
||
interrupt processing by providing different PI channel assignments
|
||
for each of 3 possible conditions:
|
||
Input Done (must usually read next word)
|
||
Output Done (must usually output next word)
|
||
Control Int (some unusual condition, including Last-IMP-Word)
|
||
|
||
Because the non-DM interface only has one PI assignment available,
|
||
the software to switch levels is much more complicated. For either
|
||
case, the code will not make sense unless you understand the channel 1
|
||
multiplexing feature (see interface CONI bit descriptions).
|
||
|
|
||
|
||
; Here when IMP interface is interrupting at PI level 2 (NETCHN)
|
||
; TT has CONI bits. Can clobber most ACs
|
||
|
||
IMPINT:
|
||
IFN KAIMP,[
|
||
AOSN IMPB ; PI 1 control interrupt?
|
||
JRST IMPBKZ ; Yes
|
||
AOSN IMPI ; PI 1 Input Done interrupt?
|
||
JRST IMPIBZ ; Yes
|
||
AOSN IMPO ; PI 1 Output Done interrupt?
|
||
JRST IMPOBZ ; Yes already
|
||
TRNE TT,IMPLW+IMPHER+IMPERR ; No PI 1 ints, check status bits
|
||
JRST IMPBKZ ; PI 2 Control interrupt (error or Last Imp Word)
|
||
TRNE TT,IMPID
|
||
JRST IMPIBZ ; PI 2 Input Done
|
||
TRNE TT,IMPOD
|
||
JRST IMPOBZ ; PI 2 Output Done
|
||
]IFN DMIMP,[
|
||
TRNE TT,FILW+FIWASD+FIDOWN
|
||
JRST IMPBKZ ; PI 2 Control interrupt (error or Last Imp Word)
|
||
TRNE TT,FIID
|
||
JRST IMPIBZ ; PI 2 Input Done
|
||
TRNE TT,FIOD
|
||
JRST IMPOBZ ; PI 2 Output Done
|
||
]
|
||
JRST 4,. ; Must be one of above!!
|
||
|
||
IFN KAIMP,[
|
||
; IMPIBK - Default PI 1 Input Done routine, called from IMPILC.
|
||
; We're idling, switch to PI 2 to handle the input
|
||
; (normally 1st word of new IMP message)
|
||
EBLK
|
||
IMPIBK: 0
|
||
BBLK
|
||
SETOM IMPI ; Set flag saying PI 1 Input Int seen
|
||
CONO IMP,NETCHN ; Switch PIA to 2
|
||
JRST 12,@IMPIBK ; Go re-interrupt, will get to IMPINT->IMPIBK
|
||
]
|
||
|
||
IFN KAIMP,[
|
||
|
||
; IMPBRK - PI 1 Control interrupt, called from PI0LOC+2 (= 42 on KA's)
|
||
; which is the standard PI 1 vector location.
|
||
; Again, switch to PI 2 to handle the condition
|
||
; (typically Last Imp Word seen on input)
|
||
EBLK
|
||
IMPBRK: 0 ; This interrupt is to 42, may not be the IMP
|
||
BBLK
|
||
CONSO IMP,IMPLW+IMPHER+IMPERR ; This really from the IMP?
|
||
IFE NEWDTP,JRST RC1INT
|
||
IFN NEWDTP,JRST IMPBR1
|
||
SETOM IMPB ; Yes, re-interrupt and handle at NETCHN level
|
||
CONO IMP,NETCHN ; Switch PIA to 2 (NETCHN)
|
||
JRST 12,@IMPBRK ; Go re-interrupt, will get to IMPINT->IMPBKZ
|
||
|
||
IFN NEWDTP,[
|
||
IMPBR1: CONSZ DTC,70 ; Allow for non-IMP interrupt on PI chan 1
|
||
JRST 12,@IMPBRK
|
||
]
|
||
|
||
RC1INT: MOVEM 17,R1NTAC+17
|
||
MOVEI 17,R1NTAC
|
||
BLT 17,R1NTAC+16
|
||
MOVEI J,1
|
||
JSP E,SPUR
|
||
MOVSI 17,R1NTAC
|
||
BLT 17,17
|
||
JRST 12,@IMPBRK
|
||
];IFN KAIMP
|
||
|
||
; IMPRM4 - PI 1 Input-Done handler during readin of IMP data (not leader)
|
||
; BLKI has run out but haven't yet gotten Last Imp Word!
|
||
; Either read more (if 2nd ptr specifed) or ignore following data.
|
||
EBLK
|
||
IMPRM4: 0
|
||
BBLK
|
||
MOVEM A,IMPA ; Save A
|
||
SKIPL A,IMNWSI ; Second BLKI pointer exists?
|
||
JRST IMPRM6 ; Nope, none now
|
||
MOVEM A,IMBLKI ; Yes, store it!
|
||
SETZM IMNWSI ; Clear this flag so don't do it again
|
||
MOVE A,IMPA ; Restore A
|
||
JRST 12,@IMPRM4 ; Return, continuing BLKI.
|
||
|
||
IMPRM6: MOVE A,[JSR IMPRM5] ; Ugh! Ignore additional input
|
||
MOVEM A,IMPILC ; Set up new vector to "ignore" routine
|
||
MOVE A,IMPA
|
||
JRST 12,@IMPRM4
|
||
|
||
; IMPRM5 - PI 1 Input-Done handler while ignoring IMP data, only
|
||
; set up by IMPRM6 above.
|
||
; Just reads a word and ignores it. This loop is broken
|
||
; by a control interrupt when Last-Imp-Word is seen.
|
||
EBLK
|
||
IMPRM5: 0 ; Hmm? Flush input at PI 1
|
||
BBLK
|
||
DATAI IMP,IMPA
|
||
IFN INETP,AOS IMNWIF ; See how often we come here.
|
||
JRST 12,@IMPRM5
|
||
|
||
; IMPIBZ - PI 2 (NETCHN) "Input Done" interrupt, via IMPINT.
|
||
; Note there is one input word waiting in the IMP interface,
|
||
; but it is NOT the last IMP word (if it was, we would get a
|
||
; control interrupt and go to IMPBKZ instead). This situation
|
||
; should only happen while reading the IMP leader and there is
|
||
; more input than just the leader, i.e. it is a NCP or IP message.
|
||
; This is also where we come after being in idle state.
|
||
; TT/ IMP CONI word
|
||
|
||
IMPIBZ: AOS IMCT2
|
||
IFN DMIMP,[
|
||
TRC TT,IMPCHN ;FIND IF INPUT PIA=IMPCHN
|
||
TRNN TT,7
|
||
JRST IMPRET ;YES, ALREADY HANDLED BY IMPCHN
|
||
];DMIMP
|
||
IFE INETP,[ ; Note IP datagram is read in 32-bit mode!
|
||
IFN DMIMP,TLNE TT,FII32
|
||
IFN KAIMP,TRNE TT,IMPI32
|
||
JRST 4,. ; NCP-only, leader should always be read in 36-bit mode
|
||
] ;IFE INETP
|
||
MOVE C,IMPHI
|
||
SKIPN B,IMPIS ; Skip hold-up check unless at start of msg (idle)
|
||
AOJE C,IMPBKW ; Jump if input needs to be held up (can only do at start or end of msg)
|
||
IFE INETP,CAILE B,%ISIML
|
||
IFN INETP,CAILE B,%ISIID
|
||
JRST 4,. ; Unknown input state
|
||
JRST @.+2(B) ; Dispatch, note data not read yet
|
||
|
||
IMPIGN ;-1 Supposed to be shut off, go ignore message.
|
||
OFFSET -.
|
||
%ISIDL:: IMSTR1 ; 0 Was idle, this is start of a message!
|
||
%ISIGN:: IMPIGN ; 1 Ignoring this message.
|
||
IFE INETP,%ISIML:: IMPLD2 ; 2 Reading IMP leader, see what we got.
|
||
IFN INETP,[
|
||
%ISIML:: [JRST 4,.] ; 2 Should only see %ISINL or %ISIIL
|
||
%ISINC:: [JRST 4,.] ; 3 Was reading control msg! Runout is error.
|
||
%ISIND:: [JRST 4,.] ; 4 Was reading NCP data msg! Runout is error.
|
||
%ISINL:: IMPLD2 ; 5 Was reading NCP IMP leader
|
||
%ISIIL:: IMPLD2 ; 6 Was reading IP IMP leader.
|
||
%ISIID:: [JRST 4,.] ; 7 Was reading IP datagram! Runout is error.
|
||
] ;INETP
|
||
OFFSET 0
|
||
|
||
IMPIGN: DATAI IMP,A ; Ignore input (only come here via table above)
|
||
IFN INETP,AOS IMNWIG ; See how often we come here.
|
||
;JRST IMPRET
|
||
|
||
; All routines dispatched to from IMPIBZ should return via IMPRET.
|
||
IMPRET:
|
||
IFN DMIMP,CONI FI,A
|
||
SKIPN IMPIS ; Skip if input not in normal (idle) state
|
||
IFN KAIMP, CONSO IMP,IMPI32 ; It is, see if input is in 32-bit mode
|
||
IFN DMIMP, TLNN A,FII32
|
||
JRST .+2
|
||
JRST 4,. ; Shouldn't be in 32 bit mode in normal state
|
||
IFN KAIMP,CONO IMP,@IMPPIA ; Switch to desired exit PIA
|
||
JRST IMPEX
|
||
|
||
; IMPBKZ - PI 2 (NETCHN) Control interrupt, via IMPINT.
|
||
; Error or Last Imp Word on input.
|
||
; TT/ IMP CONI word
|
||
|
||
IMPBKZ: AOS IMCT1 ; Bump count of control interrupts
|
||
IFN KAIMP,TRNE TT,IMPERR+IMPHER ; See if error or last-imp-word.
|
||
IFN DMIMP,TRNE TT,FIWASD+FIDOWN
|
||
JRST IMPBER ; Jump if IMP Error or Host Error
|
||
|
||
; Not an error, interface has Last Imp Word ready for DATAI'ing!
|
||
MOVE B,IMPHI ; Check here to see if input should be held up
|
||
AOJN B,IMPBKX ; Jump if not.
|
||
|
||
; Input must be held up. Also enter here from IMPIBZ if
|
||
; at start of message (only other time input can be held up).
|
||
IMPBKW:
|
||
IFN KAIMP,CONO IMP,IMPIDC ; Clear Input Done so we don't re-interrupt
|
||
IFN DMIMP,[
|
||
CONO FI,FISUSP ; Suspend input, no bits accepted after DATAI
|
||
DATAI FI,IMPSUS ; Have to read word now
|
||
CONO FI,FIIDC+NETCHN_3 ; Have to do this to clear IMP Last Word
|
||
] ; (also to clear Input-Done PIA)
|
||
SOS IMPHI ; Set -2 to indicate successfully held up
|
||
MOVEM TT,IMSTAS ; Save status (CONI bits)
|
||
AOS IMPNIH ; Bump meter - count of times input was held up.
|
||
JRST IMPRET
|
||
|
||
; IMPBKX - Auxiliary to IMPBKZ, PI 2 Control Interrupt
|
||
; Have got Last Imp Word and not holding up input, so go
|
||
; handle end of IMP message.
|
||
|
||
IMPBKX:
|
||
IFN KAIMP,[
|
||
MOVE A,[JSR IMPIBK] ; Get rid of input BLKI
|
||
MOVEM A,IMPILC ; Replace with default switch-PIA vector
|
||
SETZM IMPIH ; Say don't need PI 1 for input any more.
|
||
MOVEI A,NETCHN ; And change exit PIA to 2
|
||
SKIPL IMPOH ; Unless output side still needs PI 1.
|
||
MOVEM A,IMPPIA ; Set value of PI level desired on exit.
|
||
CONO IMP,IMI32C ; Put back in 36 bit mode to start next msg
|
||
DATAI IMP,A ; Get the last input word for processing
|
||
]IFN DMIMP,[
|
||
CONO FI,FII32C+FISUSP ; Hold up bits for following clear
|
||
DATAI FI,A ; Get last input word
|
||
CONO FI,FIIDC+FIIBSY+NETCHN*11 ; Now clear Last-Imp-Word
|
||
]
|
||
; Enter here from IMOB6 if input had been held up.
|
||
IMPBKV: SKIPGE B,IMPIS ; Unless network has been shut off
|
||
JRST IMPRET ; (in which case ignore input)
|
||
JRST @IMSDT2(B) ; then go process end of IMP message.
|
||
|
||
IMSDT2: OFFSET -.
|
||
%ISIDL:: IMPBKN ; 0 Was idle - leader only 1 word long??
|
||
%ISIGN:: IMPIRT ; 1 Ignore input
|
||
%ISIML:: IMPLD1 ; 2 End of IMP leader - can't be regular msg
|
||
%ISINC:: IMPBK3 ; 3 End of NCP control message
|
||
%ISIND:: IMPRMB ; 4 End of NCP data input
|
||
IFN INETP,[
|
||
%ISINL:: IMPLD1 ; 5 End of NCP IMP leader?? Probably error.
|
||
%ISIIL:: IMPLD1 ; 6 End of IP IMP leader?? Probably error.
|
||
%ISIID:: IMPRMI ; 7 End of IP datagram
|
||
] ;INETP
|
||
OFFSET 0
|
||
|
||
; Here from table above for old-type leader (1 word)
|
||
; IMPBN1 is used by IMPLD2 if long leader has wrong format.
|
||
|
||
IMPBKN: MOVEM A,IMPILB ; Store first (and only) word of leader
|
||
IMPBN1: LDB A,IMOTBP ; Get message format type
|
||
CAIN A,4 ; Old-type NOP?
|
||
JRST IMPIRT ; Just ignore it.
|
||
CAIN A,16 ; Is it 1822L format?
|
||
BUG INFO,[IMP: 1822L leader],OCT,IMPILB
|
||
CAIE A,17 ; Is it not the long-leader format?
|
||
BUG INFO,[IMP: Old-type leader],OCT,IMPILB
|
||
JRST IMPIRT ; Ignore rest of message, if any
|
||
|
||
|
||
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
;;; IMP LEADER READING/DISPATCH ;;;
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
;;; Code on this page handles the initial processing of
|
||
;;; IMP messages and dispatches to the appropriate
|
||
;;; routines for each message type. Only Type 0 ("Regular")
|
||
;;; messages carry Host-Host traffic.
|
||
|
||
; Here from IMPIBZ only, to handle first word of an IMP message.
|
||
; (It's not the last word or IMPBKZ would complain about it)
|
||
; Set up a BLKI to get the rest of the leader.
|
||
|
||
IMSTR1: DATAI IMP,A ; Get 1st word from interface
|
||
; Entry point from IMPOB6 only to restart input from "held-up" state
|
||
; First word already in A
|
||
IMSTRT: MOVEM A,IMPILB ; Store first word of leader
|
||
MOVEI C,%ISIML ; Set new state = reading rest of IMP leader
|
||
IFE INETP,MOVE B,[-4,,IMPILB] ; If not diverting IP, ask for it all.
|
||
IFN INETP,MOVE B,[-2,,IMPILB] ; Must vector IP, ask for max 36-bit wds
|
||
JRST IMPRM9 ; Go read the leader.
|
||
|
||
; The code at IMPLD5 will switch to 32-bit mode at right place if
|
||
; the message turns out to be an IP datagram. Otherwise the message
|
||
; is either a NCP Host-Host message, or an IMP-to-Host note of some kind;
|
||
; both stay in 36-bit mode.
|
||
|
||
; Here from IMPBKX only for a leader not followed by any data.
|
||
; Last word in A, IMPLW flag in TT.
|
||
IMPLD1: AOS B,IMBLKI ; Update pointer to buffer
|
||
MOVEM A,(B) ; and store last word in right place.
|
||
; Fall through to handle what should be an IMP-Host note.
|
||
; The IMPLW flag distinguishes this entry point from IMPLD2,
|
||
; so we know there isn't a data word in the interface.
|
||
|
||
; Here from IMPIBZ only, for an IMP leader with more data following;
|
||
; almost certainly a "Regular" host-host message. The 2 possible
|
||
; states are:
|
||
; %ISINL - NCP, in 36-bit mode, have read 5 wds and 6th awaits.
|
||
; %ISIIL - IP, in 32-bit mode, have read 4 wds and 5th awaits.
|
||
; We can't DATAI the current word from the interface until we know
|
||
; what mode the remaining data should be read in.
|
||
|
||
IMPLD2:
|
||
IFN KAIMP,TRNE TT,IMPI32
|
||
IFN DMIMP,TLNE TT,FII32
|
||
IFE INETP, JRST 4,. ; Input was in 32 bit mode when shouldn't!
|
||
IFN INETP,[JRST [MOVE B,IMPIS ; If reading IP IMP leader then 32 bit OK.
|
||
CAIE B,%ISIIL ; Leader read in 32-bit mode, must be IP.
|
||
JRST 4,. ; It isn't???
|
||
JRST .+1]
|
||
] ;INETP
|
||
LDB T,IMOTBP ; Examine new-format flag bits of leader
|
||
CAIN A,16 ; Is it 1822L format?
|
||
BUG INFO,[IMP: 1822L leader],OCT,IMPILB
|
||
CAIE T,17 ; to verify that leader is "new" 96-bit fmt.
|
||
JRST IMPBN1 ; Something else?? Go discard.
|
||
HRRZ B,IMBLKI ;-> LAST WORD READ
|
||
CAIGE B,IMPILB+2 ;MUST BE AT LEAST 3 WORDS TO BE VALID
|
||
JRST IMPLD3
|
||
LDB T,IMLNBP ; Extract link number (high 8 bits of msg-id)
|
||
IFN INETP,[
|
||
CAMN T,IMPCLP ; HACK! If it matches our specified ctl link
|
||
SETZ T, ; number, then make it look like ctl link!
|
||
]
|
||
MOVEM T,IMPCLN
|
||
LDB T,IMSABP ; Get arpanet address (source host+imp)
|
||
IFN 0,[ LDB T,IMSHBP ;SOURCE HOST
|
||
LDB A,IMSIBP ;SOURCE IMP
|
||
DPB A,[112000,,T] ;FORM HOST ADDRESS
|
||
] ;ifn 0
|
||
PUSHJ P,FNDHST ;H GETS HOST TABLE INDEX
|
||
JRST IMPLD9 ;HOST TABLE FULL
|
||
MOVEM H,IMPCSH ;SAVE CURRENT HOST
|
||
LDB A,IMTBP ;GET MESSAGE TYPE IN A
|
||
CAILE A,10.
|
||
JRST IMPUN ;UNKNOWN TYPE
|
||
AOS IMPMSR(A) ;COUNT IMP MSGS RCD
|
||
JRST @IMTDT(A) ;DISPATCH
|
||
|
||
IMTDT: IMPRM ; 0 Regular Message
|
||
IMPBE1 ; 1 Error in Leader (no msg-id)
|
||
IMPGD ; 2 IMP Going Down
|
||
IMPUN ; 3 -
|
||
IMPIN ; 4 NOP
|
||
IMPRFN ; 5 RFNM - Ready For Next Message (transmit succeeded)
|
||
IMPHDS ; 6 Host Dead Status (general info)
|
||
IMPDHD ; 7 Destination Host Dead (transmit failed)
|
||
IMPBE8 ; 8 Error in Data (has msg-id)
|
||
IMPINC ; 9 Incomplete Transmission (transmit failed temporarily)
|
||
IMPIRS ;10 Interface Reset - IMP dropped its ready line
|
||
|
||
IMPLD9: BUG INFO,[IMP: Message discarded due to host table full],OCT,IMPILB,OCT,IMPILB+1,OCT,IMPILB+2
|
||
JRST IMPIRT
|
||
|
||
; Here from IMPLD2 if leader is too short
|
||
IMPLD3: SUBI B,IMPILB-1 ;# WDS READ
|
||
BUG INFO,[IMP: Short leader, ],DEC,B,[wds. WD1=],OCT,IMPILB,[WD2=],OCT,IMPILB+1
|
||
;JRST IMPIRT ;FLUSH REST OF MESSAGE
|
||
|
||
;;; IMP->Host Type 4 - NOP
|
||
|
||
IMPIN: JRST IMPIRT ; One more nop from IMP
|
||
|
||
;;; IMP->Host Type 10 - Interface Reset
|
||
|
||
IMPIRS: BUG INFO,[IMP: Interface-reset msg]
|
||
JRST IMPIRT ; Probably nothing useful to do about it.
|
||
|
||
;;; IMP->Host Type X (e.g. 3, 11-255) - bad type
|
||
|
||
IMPUN: BUG INFO,[IMP: Unknown msg type ],OCT,A,[ leader ],OCT,IMPILB,OCT,IMPILB+1,OCT,IMPILB+2
|
||
;JRST IMPIRT
|
||
|
||
IFE NCPP,[
|
||
IMPBK3:: ;Ignore NCP messages
|
||
IMPRMB::
|
||
];NCPP
|
||
|
||
; Here from all over, to flush rest of this message.
|
||
; All non-regular messages (not type 0) return here, as well as some
|
||
; errors with regular msgs.
|
||
; TT says whether there is any more data to read from this message.
|
||
IMPIRT: SETZM IMPIS ; Assume end of message, reset to normal state
|
||
TRNN TT,IMPLW ; But if we haven't yet read the last word,
|
||
AOSA IMPIS ; then change state to "Ignore" and flush input.
|
||
; Note skip over following SETZM.
|
||
|
||
; Regular messages (type 0) return here, when we already know this message
|
||
; was completely read. TT isn't valid.
|
||
IMPIR1: SETZM IMPIS ; Reset to normal idle state
|
||
SETOM IMPCSH ; Say no current host
|
||
IFN KAIMP,CONO IMP,IMI32C ; Put world back in 36 bit input mode
|
||
IFN DMIMP,CONO FI,FII32C+NETCHN*11
|
||
JRST IMPRET
|
||
|
||
;;; IMP->Host Type 0 - Regular Host-Host message
|
||
; Unless the source host screwed up and sent a dataless message,
|
||
; there is a word waiting to be read from the interface.
|
||
; For IP this is the 5th word and we are in 32-bit mode.
|
||
; For NCP it's the 6th (the NCP leader) and we're in 36-bit mode.
|
||
; TT/ IMP CONI bits,
|
||
; B/ addr of last wd input (counted-out BLKI pointer)
|
||
|
||
IMPRM: TRNE TT,IMPLW
|
||
JRST IMPRM3 ; Foo, message shouldn't end so soon. Go barf.
|
||
IFE INETP,[
|
||
CAIE B,IMPILB+4 ; Check that host-host leader word is next in
|
||
JRST IMPLD3 ; Barf
|
||
SKIPE IMPCLN ; Skip if link 0 - NCP control msg
|
||
JRST IMPRMD ; Data message, go read into user buffer.
|
||
]
|
||
IFN INETP,[
|
||
SKIPN A,IMPCLN ; Skip unless NCP control link message
|
||
JRST IMPRM1 ; NCP control message, go handle it.
|
||
CAIE A,233 ; Is link number the magic cookie for IP?
|
||
IFN NCPP, JRST IMPRMD ; No, go handle as NCP data message.
|
||
IFE NCPP, JRST IMPIRT ; No, ignore it if we don't have NCP
|
||
|
||
; This is an Internet Protocol datagram. Make sure we are
|
||
; in right mode for reading.
|
||
AOS IMNIPI ; Bump count of IP datagrams received
|
||
IFN KAIMP,TRNN TT,IMPI32 ; Should already be in 32-bit mode
|
||
IFN DMIMP,TLNN TT,FII32
|
||
BUG PAUSE,[IMP: Reading IP dgm in 36-bit mode]
|
||
DATAI IMP,IMPILB+4 ; Okay, read in the padding and get going.
|
||
MOVEI A,%IMXLN ; Specify max size of IMP message
|
||
; (we can't trust msg-len leader field)
|
||
PUSHJ P,IPGIPT ; Call IP module - get input buffer pointer
|
||
JRST [ AOS IMNIPF ; Punted, bump cnt of datagrams lost
|
||
JRST IMPIRT] ; Flush this message (err msg already printed)
|
||
MOVEM A,IMPIDP ; Save datagram pointer
|
||
MOVEM B,IMPIBS ; Save input BLKI pointer for later check
|
||
MOVEI C,%ISIID ; Set state = reading IP datagram
|
||
JRST IMPRM9 ; Go do it.
|
||
|
||
IMPRM1: CAIE B,IMPILB+4 ; NCP control message, check that NCP leader is next
|
||
JRST IMPLD3 ; Barf, short message??
|
||
] ;INETP
|
||
IFN KAIMP,CONO IMP,IMI32S ; NCP control message, set 32-bit mode
|
||
IFN DMIMP,CONO FI,FII32S+NETCHN*11
|
||
DATAI IMP,IMPILB+5 ; Get NCP leader word
|
||
LDB A,IMCBBP
|
||
MOVEM A,IMPCBS ; Byte size
|
||
LDB B,IMBCBP
|
||
MOVEM B,IMPCBC ; Byte count
|
||
CAIN A,8 ; Byte size should be 8 for control link
|
||
CAILE B,120. ; Byte count shouldn't be > 120.
|
||
JRST IMPBCM
|
||
ADDI B,3
|
||
LSH B,-2 ; Number of words necessary
|
||
MOVEM B,IMPNIW ; Number of input words expected
|
||
HRLOI B,-1(B)
|
||
EQVI B,IMPINB-1 ; BLKI pointer
|
||
MOVEI C,%ISINC ; New state = reading NCP control message
|
||
|
||
; Set up BLKI. Pointer in B, state in C.
|
||
; This place is jumped to by several things that initiate IMP input,
|
||
; specifically IMSTRT, IMPRMT, and IMPRM.
|
||
|
||
IMPRM9: MOVEM C,IMPIS
|
||
MOVEM B,IMBLKI
|
||
MOVE B,[BLKI IMP,IMBLKI]
|
||
MOVEM B,IMPILC
|
||
MOVE B,IMPBRO(C) ; Get BLKI runout instruction and set vector;
|
||
MOVEM B,IMPILC+1 ; will execute when ptr counts out.
|
||
IFN KAIMP,[
|
||
SETOM IMPIH ; Say that input wants high pri
|
||
MOVEI B,IMPCHN ; And set our exit PIA to it (IMP)
|
||
MOVEM B,IMPPIA
|
||
]
|
||
IFN DMIMP,CONO FI,NETCHN_3+IMPCHN ; Set control PIA = NET, input done = IMP
|
||
|
||
JRST IMPRET
|
||
|
||
; This table holds the instruction to execute after the input
|
||
; BLKI has counted out the ptr and stored the current input word.
|
||
; Note that if the IMP message ends during the BLKI, a control
|
||
; interrupt will happen instead and control goes to IMPBKZ->IMPBKX
|
||
; where there is another state dispatch table.
|
||
; Normally only %ISIML and %ISINL actually use these instructions;
|
||
; the other states are impossible or expect to read the entire
|
||
; remaining message.
|
||
IMPBRO: OFFSET -.
|
||
%ISIDL:: JRST 4,IMPBRO ; 0 Idle - shouldn't be BLKI'ing.
|
||
%ISIGN:: JRST 4,IMPBRO+1 ; 1 Ignore - shouldn't be BLKI'ing.
|
||
%ISIML::
|
||
IFE INETP,JSR IMPLD4 ; 2 Reading IMP leader (5 wds partial msg)
|
||
IFN INETP,JSR IMPLD5 ; 2 Reading IMP leader (4 wds partial msg)
|
||
%ISINC:: JSR IMPRM4 ; 3 Reading NCP control message (get all)
|
||
%ISIND:: JSR IMPRM4 ; 4 Reading NCP data (get all)
|
||
IFN INETP,[
|
||
%ISINL:: JSR IMPLD4 ; 5 Reading NCP IMP leader (partial msg)
|
||
%ISIIL:: JSR IMPLD4 ; 6 Reading IP IMP leader (partial msg)
|
||
%ISIID:: JSR IMPRM4 ; 7 Reading IP datagram (get all)
|
||
] ;INETP
|
||
OFFSET 0
|
||
|
||
IMPRM3: LDB B,IMBCBP ;BYTE COUNT OF EMPTY CONTROL LINK MESSAGE
|
||
JUMPE B,IMPIRT
|
||
AOS IMPNPE ;NO TEXT BUT BYTE COUNT NOT ZERO
|
||
BUG INFO,[NCP: CTL MSG NO TXT, BC NOT 0. HST ],OCT,IMPHTN(H),[BC],DEC,B
|
||
JRST IMPIRT
|
||
|
||
IFN INETP,[
|
||
EBLK ; PI 1 Input Done interrupt (from IMPILC+1, runout)
|
||
IMPLD5: 0 ; JSR here on BLKI runout after reading 3rd wd of IMP leader.
|
||
BBLK ; Input Done is not set, because BLKI just turned it off.
|
||
MOVEM A,IMPILC ; Save A
|
||
MOVE A,[JSR IMPLD6] ; Make very next input word interrupt to IMPLD6
|
||
EXCH A,IMPILC ; Do it, restore A
|
||
JRST 12,@IMPLD5
|
||
|
||
EBLK ; PI 1 Input Done interrupt (from IMPILC)
|
||
IMPLD6: 0 ; JSR here with 4th wd of leader in interface.
|
||
BBLK ; Must decide whether to continue reading leader in
|
||
; 36-bit mode (NCP) or 32-bit mode (IP).
|
||
MOVEM A,IMPILC ; Save A
|
||
MOVE A,IMPILB+1 ; Get word with link number in it
|
||
ANDI A,377 ; Mask off
|
||
CAIN A,233 ; Internet Protocol "link"?
|
||
JRST IMPLI3 ; Yes! Go handle it.
|
||
|
||
; NCP read will immediately store current 36-bit word (4th),
|
||
; store another 36-bit word (5th), and then run out to IMPLD4.
|
||
MOVE A,[-2,,IMPILB+2] ; Reading NCP message.
|
||
MOVEM A,IMBLKI
|
||
MOVEI A,%ISINL ; Reading NCP leader, set state thereto.
|
||
MOVEM A,IMPIS
|
||
MOVE A,[JSR IMPLD4] ; And change dispatch vector.
|
||
MOVEM A,IMPILC+1
|
||
MOVE A,[BLKI IMP,IMBLKI]
|
||
EXCH A,IMPILC ; Set up BLKI and restore A
|
||
JRST 12,@IMPLD6 ; Return. Note current input word is still waiting.
|
||
|
||
; IP read will immediately store current 36-bit word (4th),
|
||
; then set up so next input-done interrupt (on 5th, 32-bit word)
|
||
; goes directly to IMPIBZ->IMPLD2 with NETCHN PI.
|
||
; (For AI-KA/MC/ML, perhaps by way of IMPIBK if output is active)
|
||
IMPLI3: MOVEI A,%ISIIL ; Say reading IP type leader.
|
||
MOVEM A,IMPIS
|
||
IFN KAIMP,CONO IMP,IMI32S+IMPCHN ; Set further input to 32-bit mode
|
||
IFN DMIMP,CONO FI,FII32S+NETCHN_3+IMPCHN
|
||
DATAI IMP,IMPILB+3 ; Store the 4th 36-bit word immediately; this
|
||
; also starts interface reading the 5th word.
|
||
IFN KAIMP,[
|
||
MOVE A,IMPLD6 ; Now must set up for next interrupt.
|
||
MOVEM A,IMPLD4 ; Fake out the common code below
|
||
JRST IMPLI4 ; Set up for next Input-Done interrupt
|
||
]
|
||
IFN DMIMP,[
|
||
MOVE A,[JSR IMPLD4] ; Shouldn't need this, but just in case...
|
||
EXCH A,IMPILC ; Restore A, set int vector to safe rtn
|
||
CONO FI,NETCHN*11 ; DM interface can simply set Input-Done PIA!
|
||
JRST 12,@IMPLD6
|
||
] ;DMIMP
|
||
] ;INETP
|
||
|
||
EBLK ; PI 1 Input Done interrupt (from IMPILC+1, runout)
|
||
IMPLD4: 0 ; JSR here on BLKI runout after reading IMP leader
|
||
BBLK ; There is still one word to go, to be gotten at NETCHN level
|
||
IFN KAIMP,[
|
||
MOVEM A,IMPILC ; Save A
|
||
; Drop through to common code
|
||
|
||
IMPLI4: SETZM IMPIH ; Say input no longer needs PI 1
|
||
MOVEI A,NETCHN ; Make PI 2 (NETCHN) the exit PIA,
|
||
SKIPL IMPOH ; unless output side needs PI 1.
|
||
MOVEM A,IMPPIA ; Set desired PIA channel on exit
|
||
CONO IMP,@IMPPIA ; Set PIA to whatever it was!
|
||
MOVE A,[JSR IMPIBK] ; Reset PI 1 Input-Done vector back to std.
|
||
EXCH A,IMPILC ; and restore A.
|
||
];DMIMP
|
||
IFN DMIMP, CONO FI,NETCHN*11 ; DM interface can simply set Input-Done PIA!
|
||
JRST 12,@IMPLD4
|
||
|
||
IMPBCM: BUG INFO,[NCP: CTL MSG BS NOT 8 OR CT>120. HST ],OCT,IMPHTN(H),[BS ],DEC,IMPCBS,[BC ],DEC,IMPCBC
|
||
JRST IMPIRT
|
||
|
||
;;; IMP->Host Type 6 - Host Down Status
|
||
; H/ host index
|
||
|
||
IMPHDS: MOVE A,IMPILB+1 ;1.8-1.1 AND 4.9-4.2 ARE THE INFO
|
||
MOVE B,IMPILB+2
|
||
LSHC A,8
|
||
ANDI A,177777
|
||
HRRM A,IMPHTB(H) ;STORE, HOPE USER READ RFC 611
|
||
JRST IMPIRT
|
||
|
||
;;; IMP->Host Type 1 - Error in leader (msg-id not given)
|
||
;;; IMP->Host Type 8 - Error in data (msg-id given)
|
||
|
||
IMPBE1: LDB T,IMSTBP ; Get subtype (4 bits)
|
||
ANDI T,3 ; Only 2 bits should be used
|
||
AOS IMPM1S(T) ; Increment count of Type 1 subtype messages
|
||
IMPBE8: MOVE T,TIME
|
||
SUB T,LNETIM
|
||
CAIL T,60. ;IGNORE ERROR DURING INITIAL SYNCHRONIZATION
|
||
BUG INFO,[IMP: Type ],DEC,A,[err msg, leader],OCT,IMPILB,OCT,IMPILB+1,OCT,IMPILB+2
|
||
IFN INETP,[
|
||
MOVE B,IMPCLN
|
||
CAIN B,233
|
||
AOS IMNIP8
|
||
]
|
||
CAIN A,8.
|
||
JRST IMPBEB ; Process "Error in data" (decrement RFNM wait cnt)
|
||
JRST IMPIRT
|
||
|
||
IMPBER: SKIPGE IMPUP ;SKIP IF UP, OR THOUGHT TO BE BROKEN
|
||
JRST IMPBE2 ;ALREADY DOWN, LET IT COME UP IN PEACE
|
||
MOVSI J,SCLNET ;THINKS IT'S UP, RESET IT
|
||
IORM J,SUPCOR
|
||
CONI IMP,IMERCN ;RECORD IF IMP ERROR FLIP/FLOP SET
|
||
SETOM IMPUP ;IMP IS DOWN
|
||
SETZM IMPTCU ;AND NOT TRYING TO COME UP
|
||
IFN INETP,.ERR IP/TCP code needs handling for IMP crashing.
|
||
IFN NCPP,[
|
||
MOVSI T,200000 ;CLEAR ALL BUFFERS ACTIVE AT PI LEVEL
|
||
MOVSI I,-IMPSTL ;SINCE CORE JOB MAY BE WAITING ON THIS
|
||
ANDCAM T,IMSOC6(I)
|
||
AOBJN I,.-1
|
||
] ;NCPP
|
||
IMPBE2:
|
||
IFN KAIMP,[
|
||
SETZM IMPPIA
|
||
CONO IMP,0
|
||
]
|
||
IFN DMIMP,CONO FI,FIRSET
|
||
JRST IMPEX
|
||
|
||
;;; IMP->Host Type 2 - IMP going down
|
||
|
||
IMPGD: LDB B,[060200,,IMPILB+1] ;WHY
|
||
MOVEM B,IMPDWN
|
||
LDB B,[020400,,IMPILB+1] ;HOW SOON GOING DOWN * 5 MINS
|
||
MOVE H,B
|
||
IMULI B,5*60.*30. ;TICKS IN 5 MINS
|
||
ADD B,TIME
|
||
MOVEM B,IMPDWN+1
|
||
MOVE C,IMPILB+1 ;HOW LONG TO BE DOWN, SPANS WORD BOUNDARY
|
||
MOVE D,IMPILB+2
|
||
LSHC C,8
|
||
ANDI C,1777
|
||
MOVE Q,C
|
||
IMULI C,5*60.*30.
|
||
ADD C,B ;ADD TO TIME DOWN
|
||
MOVEM C,IMPDWN+2 ;STORE TIME WHEN WILL BE UP
|
||
IMULI H,5 ;MINUTES
|
||
IMULI Q,5
|
||
BUG INFO,[IMP: Going down in ],DEC,H,[mins for ],DEC,Q,[mins, reason],DEC,IMPDWN
|
||
JRST IMPIRT
|
||
|
||
;;; IMP Blockage avoidance
|
||
; The current IMP software will not accept more than 8 active
|
||
; messages to a single host; attempting to send a 9th message will block
|
||
; ALL output to the interface, until the first message has been ack'd
|
||
; by means of one of the following message types:
|
||
; Type 5, RFNM - Message delivered OK
|
||
; Type 7, Host dead - transmit failed ("permanent")
|
||
; Type 8, Error in data - interface spazzed
|
||
; Type 9, Incomplete Transmission - temporary failure
|
||
; If for some reason the first message simply becomes lost, the IMP timeout
|
||
; (and blockage) can last for up to 30-45 seconds.
|
||
; More details in BBN Report 1822.
|
||
; ITS attempts to fix this by keeping a count of active un-ACKed
|
||
; messages for each host it is communicating with. A timeout is also
|
||
; associated with each host; if output to a given host is blocked by ITS
|
||
; because there are 8 active messages, trying to send a 9th message
|
||
; will check the last-RFNM-received time and if this was more than
|
||
; 30 or so seconds then the IMP is probably not giving us what it should
|
||
; and we should reset things for that host.
|
||
|
||
%IMPMA==:8. ; # of maximum active IMP messages allowed
|
||
|
||
; IMPBLI, IMPBLD - routines to hack active-message counts, called via JSP T,
|
||
; IMPBLD decrements count.
|
||
; IMPBLI increments count and skips if successful (else failed,
|
||
; and must NOT output another message to this host!)
|
||
; Also clobbers Q.
|
||
IMPBLI: AOS Q,IMPHTC(H)
|
||
CAIGE Q,%IMPMA ; Trying to send max or more messages?
|
||
JRST 1(T) ; No, can return safely.
|
||
CAIG Q,8. ; Is this the maximum # allowed?
|
||
JRST [ MOVE Q,TIME ; Yes, set up blockage timeout
|
||
ADDI Q,60.*30. ; for one minute.
|
||
MOVEM Q,IMPHTT(H)
|
||
JRST 1(T)]
|
||
|
||
; Trying to send too many messages, block it (check for timeout though)
|
||
SOS IMPHTC(H) ; Restore original count
|
||
AOS IMNBLK ; Increment # of times softwarily blocked.
|
||
MOVE Q,IMPHTT(H)
|
||
CAML Q,TIME ; See if timeout still in the future
|
||
JRST (T) ; Yes, just take failure-return to block.
|
||
BUG INFO,[IMP: RFNM-wait timeout! Hst=],OCT,IMPHTN(H)
|
||
SETZM IMPHTC(H) ; This may be dangerous... oh well.
|
||
SETZM IMPHTT(H)
|
||
JRST (T) ; Block one last time, next try will win.
|
||
|
||
IMPBLD: SOSL Q,IMPHTC(H)
|
||
JRST IMPBL2
|
||
BUG INFO,[IMP: neg RFNM-wait cnt, Hst=],OCT,IMPHTN(H)
|
||
SETZB Q,IMPHTC(H)
|
||
IMPBL2: CAIL Q,8.-1 ; If we were blocking on this host,
|
||
CALL IMPIOS ; Ensure IMP output started up so blocked stuff
|
||
JRST (T) ; gets sent promptly.
|
||
|
||
;;; IMP->Host Type 8 - Error in Data
|
||
; Actually this is secondary routine that IMPBE1 jumps to.
|
||
|
||
IMPBEB: JSP T,IMPBLD ; Decrement count of active messages
|
||
JRST IMPIRT
|
||
|
||
|
||
|
||
;;; IMP->Host Type 5 - RFNM (Ready For Next Message)
|
||
|
||
IFN INETP,.ERR INETP needs handling for RFNM on link 233
|
||
IMPRFN:
|
||
IFN BLIMPP,JSP T,IMPBLD ; Decrement count of active IMP messages for this host
|
||
SKIPE IMPCLN ;LINK NUMBER
|
||
JRST IMRFN1 ;DATA LINK
|
||
IMRFN6: SKIPL IMPHTB(H)
|
||
JRST IMRFN7
|
||
SKIPN IMPHTN(H)
|
||
BUG HALT,[IMP: IMRFN6 sees free IMPHTB entry ],OCT,H
|
||
MOVSI D,400000
|
||
ANDCAM D,IMPHTB(H) ;SET RFNM RECEIVED
|
||
SOS IMRFCT
|
||
IFN NCPP,[
|
||
SKIPL IMPNCQ ;SKIP IF NO PENDING CONTROL-LINK OUTPUT
|
||
PUSHJ P,IMPIOS ;START OUTPUT
|
||
];NCPP
|
||
JRST IMPIRT
|
||
|
||
IMRFN7: AOS IMNSRC
|
||
BUG INFO,[IMP: Spurious RFNM from ],OCT,IMPHTN(H),[LNK 0]
|
||
JRST IMPIRT
|
||
|
||
; RFNM on non-zero link message
|
||
IMRFN1:
|
||
IFN INETP,[
|
||
MOVE A,IMPCLN ; Get link #
|
||
CAIE A,233 ; IP link number?
|
||
JRST IMRFNX ; No, skip IP code
|
||
AOS IMNIPR ; Bump count of IP RFNMs received
|
||
JRST IMPIRT ; and do nothing else about it, ugh.
|
||
IMRFNX:
|
||
];INETP
|
||
IFN NCPP,[
|
||
MOVE A,IMPCSH
|
||
LSH A,8
|
||
IOR A,IMPCLN ;HEADER
|
||
MOVSI I,-IMPSTL
|
||
MOVEI W,1
|
||
IMRFN2: LDB D,IMSCHL ;HEADER
|
||
SKIPGE IMSOC1(I) ;SKIP IF SLOT NOT IN USE
|
||
CAME A,D ;SKIP IF HEADER AGREES
|
||
JRST IMRFN3
|
||
HRRZ J,IMSOC4(I) ;STATE
|
||
MOVEI W,0
|
||
CAIN J,%NSRFN
|
||
SOJA J,IMRFN4 ;RFNM WAIT
|
||
MOVSI J,20000 ;MIGHT BE EXPECTING RFNM AFTER CLOSE
|
||
TDNE J,IMSOC5(I)
|
||
JRST [ ANDCAM J,IMSOC5(I)
|
||
JRST IMPIRT ]
|
||
IMRFN3: AOBJN I,IMRFN2
|
||
BUG INFO,[IMP: Spurious RFNM from ],OCT,IMPHTN(H),[link],OCT,IMPCLN,SIXBIT,[(W)[SIXBIT/NOWAITNOLINK/]]
|
||
];NCPP
|
||
.ELSE BUG INFO,[IMP: Spurious RFNM from ],OCT,IMPHTN(H),[link],OCT,IMPCLN
|
||
AOS IMNSRF
|
||
JRST IMPIRT
|
||
|
||
IFN NCPP,[
|
||
IMRFN4: HRRM J,IMSOC4(I) ;CONNECTION OPEN
|
||
MOVSI J,30000 ;TURN OFF CLOSE-AWAITING-RFNM BIT, AND
|
||
ANDCAM J,IMSOC5(I) ; RFNM-TIMEOUT-DURING-CLOSE BIT
|
||
MOVE T,IMSPIP(I)
|
||
CAME T,IMSMPP(I) ;SKIP IF OUTPUT BUFFER EMPTY
|
||
PUSHJ P,IMPIOS ;START OUTPUT
|
||
JRST IMPIRT
|
||
];NCPP
|
||
|
||
|
||
;;; IMP->Host Type 9 - Incomplete Transmission
|
||
|
||
IMPINC: LDB T,IMSTBP ; Get subtype field (4 bit reason for failure)
|
||
AOS IMPM9S(T) ; Bump count of subtypes
|
||
SKIPA E,[%NCINC]
|
||
|
||
;;; IMP->Host Type 7 - Destination Host Dead
|
||
|
||
IMPDHD: MOVEI E,%NCDED
|
||
IFN BLIMPP,JSP T,IMPBLD ; Decrement count of active IMP messages for this host
|
||
IFN INETP,[
|
||
MOVE A,IMPCLN
|
||
CAIN A,233
|
||
JRST [ CAIN E,%NCINC
|
||
AOS IMNIP9
|
||
CAIN E,%NCDED
|
||
AOS IMNIP7
|
||
JRST IMPIRT] ; Don't bother with NCP stuff or anything.
|
||
]
|
||
MOVSI C,1000 ;RST SENT?
|
||
TDNE C,IMPHTB(H)
|
||
SOS IMRFCT ;GOING TO CLEAR IT, DECREASE TIMEOUT RQ
|
||
MOVSI C,3000
|
||
ANDCAM C,IMPHTB(H) ;CLEAR RST STATUS, RFNM SIMULATED LATER
|
||
IFN NCPP,[
|
||
MOVSI I,-IMPSTL
|
||
IMDHD: LDB T,IMSCFH
|
||
SKIPGE C,IMSOC1(I) ;SKIP IF NOT IN USE
|
||
CAME T,IMPCSH
|
||
JRST IMDHDA
|
||
HRRZ T,IMSOC4(I)
|
||
TLNN C,200000 ;THIS GUY IS CLOSING ANYWAY
|
||
CAIG T,%NSLSN
|
||
JRST IMDHDA ;THIS SOCKET'S HOST NUMBER FIELD IS MEANINGLESS
|
||
CAIGE T,%NSCLI .SEE %NSINP
|
||
TDZA T,T .SEE %NSCLS
|
||
MOVEI T,%NSCLI
|
||
HRRM T,IMSOC4(I)
|
||
DPB E,IMSCLS ;CLS REASON
|
||
PUSHJ P,IMPUIN
|
||
IMDHDA: AOBJN I,IMDHD
|
||
];NCPP
|
||
JRST IMRFN6 ;CONTROL LINK, TAKE AS RFNM SO AS NOT TO HANG THINGS
|
||
|
||
IFN INETP,[
|
||
; IMPRMI - End of IP datagram, PI in progress on NETCHN, here from IMPBKX
|
||
; A/ Last IMP word (32-bit)
|
||
; TT/ CONI bits as of interrupt (note already returned to 36-bit mode)
|
||
|
||
IMPRMI: AOS B,IMBLKI ; Get address to store last word in
|
||
MOVEM A,(B) ; Store it away
|
||
SUB B,IMPIBS ; Get # words read into datagram buffer
|
||
MOVEI B,(B)
|
||
MOVE A,IMPIDP ; Get pointer to IP datagram buffer we were using
|
||
SETZ C, ; Say zero offset to IP header.
|
||
MOVE J,IMPCSH ; Set index to host-table entry dgm received from.
|
||
PUSHJ P,IPRDGM ; Call IP module to process received datagram at PI lvl
|
||
SETZM IMPIDP ; Clear PI level pointer
|
||
JRST IMPIR1 ; Return from PI level, setting up for next msg
|
||
|
||
] ;INETP
|
||
|
||
SUBTTL ARPANET OUTPUT INTERRUPT LEVEL
|
||
|
||
; See comments at IMPINT for a description of the overall IMP interrupt
|
||
; structure. Output is simpler than input, however.
|
||
; Each IMP message is output at PI level 1 except for the initial DATAO;
|
||
; the setup and takedown for each message is done at PI level 2.
|
||
; The code on this page is not referenced by anything outside the page
|
||
; except interrupt vector setup at IMPINI (to IMPOBK) and IMOB9 (to IMPCH1).
|
||
|
||
; IMPCH1 - PI 1 Output-Done interrupt, from IMPOLC.
|
||
; Comes here when last word DATAO'd has been sent to IMP.
|
||
EBLK
|
||
IMPCH1: 0
|
||
BBLK
|
||
MOVEM A,IMPOLC ; Save A
|
||
MOVE A,IMOPNT
|
||
IMCH1A: SKIPGE A,IMOLST(A) ; Get next "instruction"
|
||
JRST IMCH1B ; Jump if it's a BLKO pointer
|
||
CAILE A,3 ; Ensure valid operation
|
||
JRST 4,.
|
||
XCT IMCH1I(A) ; Do it
|
||
AOS A,IMOPNT ; Still here? Point to next operation
|
||
JRST IMCH1A ; and loop to do it.
|
||
|
||
IMCH1I: JRST IMCH1C ;0 Stop - end of output list
|
||
IFN KAIMP,CONO IMP,IMPLHW+IMPCHN ;1 Set Last Word
|
||
IFN DMIMP,CONO FI,FILHW+11*NETCHN
|
||
IFN KAIMP,CONO IMP,IMO32S+IMPCHN ;2 Set 32-bit mode
|
||
IFN DMIMP,CONO FI,FIO32S+10*NETCHN+IMPCHN
|
||
JFCL ;3 NOP
|
||
|
||
IMCH1B: MOVEM A,IMBLKO ; Set up BLKO - store the pointer
|
||
MOVE A,[JSR IMCH1D] ; Set dispatch for BLKO runout
|
||
MOVEM A,IMPOLC+1
|
||
MOVE A,[BLKO IMP,IMBLKO]
|
||
EXCH A,IMPOLC ; Store the BLKO and restore A
|
||
AOS IMOPNT ; Increment output list ptr past this op.
|
||
JRST 12,@IMPCH1 ; Will interrupt immediately for first BLKO
|
||
; word, since Output-Done wasn't cleared.
|
||
|
||
; PI 1 Output-Done, from IMPOLC+1 (BLKO runout)
|
||
; Final word of the BLKO pointer is now in interface, being sent
|
||
; to IMP, and Output-Done flag is off.
|
||
EBLK
|
||
IMCH1D: 0
|
||
BBLK
|
||
MOVEM A,IMPOLC
|
||
MOVE A,[JSR IMPCH1] ; Interrupt back when output of final word done
|
||
EXCH A,IMPOLC
|
||
JRST 12,@IMCH1D
|
||
|
||
; Here from IMPCH1, PI 1 Output-Done interrupt
|
||
; Output list has hit "stop" operation (previous op had better be
|
||
; 1 to set Last-Host-Word!)
|
||
; This code reverts control back to PI level 2 (IMPOBK).
|
||
IMCH1C:
|
||
IFN DMIMP,[
|
||
CONO FI,FIOUT+11*NETCHN ; Reset PIA to normal 2
|
||
MOVE A,[JSR RINT1] ; and ensure any further output PI 1 ints
|
||
] ; are classified as spurious.
|
||
|
||
IFN KAIMP,[ ; Non-DM interface needs more hair.
|
||
SETZM IMPOH ; Say output side doesn't need PI 1 anymore
|
||
MOVEI A,NETCHN ; And set exit PIA to 2,
|
||
SKIPL IMPIH ; unless input side still needs PI 1
|
||
MOVEM A,IMPPIA ; Set it.
|
||
CONO IMP,NETCHN ; Shouldn't this be CONO IMP,@IMPPIA??
|
||
SETOM IMPO ; Tell IMPINT we have output-done interrupt.
|
||
MOVE A,[JSR IMPOBK] ; Point PI 1 channel at switch-PIA routine,
|
||
] ; in case we interrupt on PI 1 again anyway.
|
||
EXCH A,IMPOLC
|
||
JRST 12,@IMPCH1
|
||
|
||
IFN KAIMP,[
|
||
|
||
; PI 1 Output Done interrupt, when we should really be interrupting
|
||
; at IMPINT on PI 2.
|
||
EBLK
|
||
IMPOBK: 0
|
||
BBLK
|
||
SETOM IMPO ; Tell IMPINT what kind of interrupt
|
||
CONO IMP,NETCHN ; Reset PIA to 2
|
||
JRST 12,@IMPOBK
|
||
]
|
||
|
||
; IMPOBZ - PI 2 (NETCHN) "Output Done" interrupt, via IMPINT.
|
||
; Come here when we have finished sending stuff out at PI 1,
|
||
; also when something wants output to start and tickled the "Done"
|
||
; flag.
|
||
; TT/ IMP CONI word.
|
||
|
||
IMPOBZ: AOS IMCT3
|
||
IFN DMIMP,[
|
||
TRC TT,IMPCHN_9 ;CHECK IF OUTPUT PIA=IMPCHN
|
||
TRNN TT,7_9
|
||
JRST IMPRET ;IGNORE, ALREADY HANDLED BY IMPCHN
|
||
]
|
||
SKIPL B,IMPOS
|
||
CAIL B,IMPODL
|
||
JRST 4,.
|
||
JRST @IMPODT(B)
|
||
|
||
IMPODT: OFFSET -.
|
||
%ISODL:: IMPOB1 ; 0 Idle, look for something to send
|
||
%ISONC:: IMPOB6 ; 1 Finished NCP control message
|
||
%ISOND:: IMPOBG ; 2 Finished NCP data message
|
||
IFN INETP,%ISOID::IMPOBI ; 3 Finished IP datagram messge
|
||
IMPODL::OFFSET 0
|
||
|
||
IFE NCPP,[
|
||
IMPOB6: SETZM IMPOS
|
||
SKIPN A,IMPSVQ
|
||
JRST IMPRET ;THAT WAS A NOP
|
||
IMPOBG: JRST 4,. ;Can't get here
|
||
];not NCPP
|
||
|
||
; Idle - Look for output to send. First ensure we can send stuff,
|
||
; then try things in the order:
|
||
; (1) Send NOP if net coming up
|
||
; (2) Check NCP control queue, then (3) NCP data output queue
|
||
; OR
|
||
; (2) Check IP datagram queue
|
||
;
|
||
; Note that we alternate between checking the NCP and IP queues first,
|
||
; so that neither protocol can totally wedge the other up even if
|
||
; going at full blst.
|
||
|
||
IMPOB1: HRRZ T,IMPUP
|
||
CAIE T,-2 ; Don't say it's up when it's still going down
|
||
CAIN T,1 ; or when it is broken
|
||
JRST IMPOB9
|
||
|
||
; First check to see if NOP needs to be sent.
|
||
AOSG IMNOPC ; Check to see if sending NOPs
|
||
JRST IMONOP ; Output a NOP
|
||
SETZM IMPUP ; Say IMP is up
|
||
SETZM IMPTCU ; Say no longer trying to come up
|
||
|
||
; Now see whether to check NCP or IP.
|
||
IFN INETP,[
|
||
SETCMB T,IMPPSW ; Complement IMP output protocol switch
|
||
JUMPN T,IMOBNN ; Jump for NCP
|
||
PUSHJ P,IPGIOQ ; Check IP! Get IP IMP output queue entry if any
|
||
JRST IMOBN ; Nothing there, go check NCP.
|
||
; Returns A/ ptr to IP dgm struct
|
||
; B/ BLKO pointer to 32-bit words
|
||
; C/ Arpanet address
|
||
; The output list should be set up as:
|
||
;IMOLST: -3,,IMOLDR
|
||
;IMOMOD: 2 ; switch to 32-bit mode
|
||
;IMOBK1: -1,,IMOLDR+3 ; Send 5th word of padding
|
||
;IMOBK2:output BLKO ; Send datagram minus last word
|
||
; 1
|
||
;IMOBK3: -1,,lstwd-1 ; BLKO to last word of datagram
|
||
; 0
|
||
IMOBI1:
|
||
MOVEM A,IMPODP ; Save ptr to datagram being output
|
||
AOS IMNIPO ; # of IP datagrams sent
|
||
ADD B,[1,,] ; Reduce BLKO count by one
|
||
MOVEM B,IMOBK2 ; Store in output list
|
||
HLRO D,B ; Get -<# wds-1>
|
||
MOVN D,D ; Get <#wds-1>
|
||
ADDI D,(B) ; Get addr for last-word BLKO
|
||
HRROM D,IMOBK3 ; Store -1,,lastwd-1
|
||
MOVE B,[-3,,IMOLDR]
|
||
MOVEM B,IMOLST
|
||
MOVE B,[-1,,IMOLDR+3]
|
||
MOVEM B,IMOBK1
|
||
|
||
; Output list set up, now must put together the IMP leader
|
||
; in IMOLDR.
|
||
MOVE B,[17_10.,,0] ; Regular message
|
||
MOVEM B,IMOLDR
|
||
LSH C,8. ; Move net address over
|
||
IORI C,233 ; Get link # for IP
|
||
MOVEM C,IMOLDR+1 ; Store 2nd word
|
||
SETZM IMOLDR+2 ; 3rd word can be zero
|
||
SETZM IMOLDR+3 ; rest is padding
|
||
SETZM IMOLDR+4 ; ditto
|
||
|
||
IFN KAIMP,CONO IMP,IMO32C
|
||
IFN DMIMP,CONO FI,FIO32C ;SET 36 BIT MODE FOR LEADER, CLEAR PIA
|
||
DATAO IMP,IMOLDR ; Start it going!
|
||
|
||
MOVEI C,%ISOID ; State = outputting IP datagram.
|
||
JRST IMOB9
|
||
|
||
IMOBN: SKIPE IMPPSW ; If no IP, check NCP only if havent already
|
||
JRST IMOBI9 ; Skip NCP check, just return.
|
||
IMOBNN:
|
||
] ;INETP
|
||
|
||
IFN NCPP,[
|
||
; Check NCP control message queue.
|
||
IFN BLIMPP,[
|
||
MOVEI C,IMPNCQ
|
||
IMPOBV: SKIPGE A,(C)
|
||
JRST IMPOBW
|
||
HLRZ H,1(A) ; Got one! Go send NCP control msg,
|
||
SKIPL IMPHTB(H) ; unless control link waiting for RFNM
|
||
JSP T,IMPBLI ; or too many msgs active for that host.
|
||
CAIA
|
||
JRST [MOVEI T,(C) ? JRST IMPOB2] ; Compat hack
|
||
MOVEI C,(A)
|
||
JRST IMPOBV
|
||
] ;BLIMPP
|
||
.ELSE [
|
||
MOVEI T,IMPNCQ
|
||
IMPOBV: SKIPGE A,(T)
|
||
JRST IMPOBW
|
||
HLRZ B,1(A) ;HOST TABLE INDEX
|
||
SKIPL IMPHTB(B) ;SKIP IF WAITING FOR RFNM
|
||
JRST IMPOB2 ; Got one! Go send NCP control message.
|
||
MOVE T,A
|
||
JRST IMPOBV
|
||
] ;IFE BLIMPP
|
||
|
||
; Check NCP data output queue. This simply runs through
|
||
; all the sockets to see if any want to output something.
|
||
IMPOBW: MOVSI I,-IMPSTL
|
||
MOVEI W,1
|
||
IMPOBB: SKIPGE IMSOC1(I) ;SKIP IF NOT IN USE
|
||
TDNN W,IMSOC2(I) ;SKIP IF SEND
|
||
JRST IMOBA9
|
||
HRRZ A,IMSOC4(I)
|
||
CAIN A,%NSOPN ;SKIP IF WRONG STATE
|
||
SKIPGE IMSOC6(I) ;SKIP IF NOT LOCKED BY CORE JOB
|
||
IMOBA9:
|
||
IFE BLIMPP,IMPOBA:
|
||
AOBJN I,IMPOBB
|
||
IFN BLIMPP,[
|
||
JUMPGE I,IMPOB9
|
||
LDB H,IMSCFH ; Get fgn host index for this NCP conn
|
||
JSP T,IMPBLI ; Make sure not too many active msgs
|
||
JRST IMOBA9 ; Sigh, too many, keep looking.
|
||
JRST IMPOBD ; OK, can send!
|
||
IMPOBA: JSP T,IMPBLD ; Couldn't send data msg after all, decr cnt
|
||
JRST IMOBA9
|
||
]
|
||
.ELSE JUMPL I,IMPOBD ; Got one! Go send NCP data message.
|
||
];NCPP
|
||
|
||
; No more NCP output for IMP.
|
||
IMPOB9:
|
||
IFN INETP,[
|
||
SKIPN IMPPSW ; If we didnt check IP queue yet,
|
||
JRST IMOBI9
|
||
PUSHJ P,IPGIOQ ; then do it now, after NCP check.
|
||
JRST IMOBI9 ; Nothing, really no more output.
|
||
JRST IMOBI1 ; Aha, have stuff! Go get it.
|
||
IMOBI9:
|
||
]
|
||
SETOM IMPOAC ; No more output, couldn't find anything to send.
|
||
IFN KAIMP,CONO IMP,IMPODC ; Clear Output-Done interrupt bit
|
||
IFN DMIMP,CONO FI,FIODC+NETCHN*11
|
||
JRST IMPRET
|
||
|
||
|
||
; IMONOP - Send a NOP, here from IMPOBZ only.
|
||
|
||
IMONOP: MOVEI A,IMPNOP-2
|
||
SETZM IMPSVQ ; Set flag => this msg not really from control queue
|
||
MOVEI B,1 ; No text, but one extra wd (needed to make BLKO win)
|
||
JRST IMPOB3
|
||
|
||
; NOP Host-IMP leader
|
||
IMPNOP: 17_10.,,4_4 ; New format, type 4 = NOP
|
||
0
|
||
5_10.,,0 ; 5 16-bit words of padding desired
|
||
|
||
; IMPOB2 - Send a NCP control message, from IMPOBZ only
|
||
|
||
IMPOB2: HRL A,T
|
||
MOVEM A,IMPSVQ ;SAVE CTL MSG QUEUE PNTR
|
||
HRRE B,1(A) ;GET COUNT
|
||
JUMPG B,IMPOB3
|
||
JRST 4,. ;ERROR, COUNT NOT > 0
|
||
IMPOB3: ; Entry pt from NOP sending code
|
||
IFN KAIMP,CONO IMP,IMO32C
|
||
IFN DMIMP,CONO FI,FIO32C ;SET 36 BIT MODE FOR LEADER, CLEAR PIA
|
||
DATAO IMP,2(A) ;OUTPUT FIRST LEADER WORD
|
||
MOVEI C,2(A) ;SET UP BLKO POINTER FOR REST OF LEADER
|
||
SKIPN IMPSVQ
|
||
JRST [ HRLI C,-2 ;KLUDGE, SENDING NOP
|
||
JRST IMPOB4 ]
|
||
HRLI C,-5
|
||
AOS IMPMSS+0 ;COUNT REGULAR MSGS SENT
|
||
IFN INETP,[
|
||
MOVE T,IMPCLP ; HACK! Get specified # to use for ctl link
|
||
DPB T,[001000,,3(A)] ; Deposit in link field of leader.
|
||
];INETP
|
||
IFN NCPP,[
|
||
LDB T,[341000,,10(A)] ;FIRST BYTE OF CONTROL MESSAGE
|
||
CAIGE T,20
|
||
AOS IMPCMS(T)
|
||
];NCPP
|
||
IMPOB4: MOVEM C,IMOLST ;STORE BLKO POINTER THAT SENDS LEADER
|
||
MOVEI C,2 ;DO TEXT WORDS IN 32-BIT MODE
|
||
MOVEM C,IMOMOD
|
||
IFN DMIMP,MOVNI B,(B) ;GET MINUS WORD COUNT
|
||
IFN KAIMP,MOVNI B,-1(B) ;ALSO -1 FOR LAST WORD SENT SEPARATELY.
|
||
HRLI B,7(A) ;ADDR-1 FOR BLKO
|
||
MOVSM B,IMOBK1 ;STORE FOR PI 1
|
||
IFN KAIMP,[
|
||
MOVNI B,(B)
|
||
ADD B,IMOBK1 ;LAST WORD SENT SEPARATELY
|
||
HRROM B,IMOBK3
|
||
MOVEI B,3 ;CHECK FOR SCREW CASE, ONLY SENDING ONE WORD, IT'S THE
|
||
SKIPL IMOBK1 ; LAST, SO NOP OUT THE MAIN BLKO
|
||
MOVEM B,IMOBK1
|
||
]
|
||
.ELSE MOVEI B,3
|
||
MOVEM B,IMOBK2 ;NO 2ND BLKO
|
||
MOVEI C,%ISONC ;STATE FOR CONTROL RETURN TO NETCHN
|
||
IMOB9: MOVEM C,IMPOS
|
||
SETZM IMOPNT
|
||
MOVE C,[JSR IMPCH1]
|
||
MOVEM C,IMPOLC
|
||
IFN KAIMP,[
|
||
SETOM IMPOH ;OUTPUT SIDE WANTS IMP TO RUN ON CHANNEL 1
|
||
MOVEI A,IMPCHN
|
||
MOVEM A,IMPPIA
|
||
]
|
||
IFN DMIMP,CONO FI,FIOUT+NETCHN_3+IMPCHN ;SET PIA FOR OUTPUT
|
||
JRST IMPRET
|
||
|
||
IFN INETP,[
|
||
; Here when IP datagram transmission completed
|
||
|
||
IMPOBI: SETZM IMPOS ; Reset output state
|
||
MOVE A,IMPODP
|
||
PUSHJ P,IPIODN ; Tell IP level that datagram was output
|
||
SETZM IMPODP
|
||
JRST IMPRET
|
||
] ;INETP
|
||
|
||
SUBTTL ARPANET CLOCK LEVEL
|
||
|
||
OVHMTR IMP ;NETWORK INTERRUPT LEVEL (NOT STYNET STUFF)
|
||
|
||
IMRSTO: SKIPN IMRFCT ;CALLED AT 15 SEC CLK LEVEL TO UNHANG RFNM WAITS
|
||
IFE NCPP,POPJ P,
|
||
IFN NCPP,JRST IMFCT1
|
||
MOVEI H,LIMPHT-1 ;SOME CONTROL LINKS WAITING FOR RFNM, CHECK FOR TIME OUT
|
||
MOVSI TT,401000 ;4.9 AND 4.1 - RFNM AND RRP TIMEOUTS
|
||
TDNN TT,IMPHTB(H)
|
||
IMRS4: SOJGE H,.-1
|
||
IFN NCPP,JUMPL H,IMFCT1
|
||
IFE NCPP,JUMPL H,CPOPJ
|
||
CONO PI,NETOFF
|
||
SKIPE IMPHTN(H) ;MAKE SURE IT'S A REAL HOST, NOT A FREE ENTRY
|
||
TDNN TT,IMPHTB(H) ;AND THAT THE BITS DIDN'T TURN OFF DUE TO INTERRUPT
|
||
JRST IMRS1
|
||
LDB E,[221100,,IMPHTB(H)]
|
||
LDB D,[051100,,TIME] ;GET TIME IN SECONDS (APPROX)
|
||
CAMLE E,D
|
||
ADDI D,1_9
|
||
SUB D,E
|
||
CAIGE D,IMRFTO_<-5>
|
||
JRST IMRS1 ;HASN'T TIMED OUT YET.
|
||
LDB D,IMHSBT ;TIMED OUT. CHECK RST/RRP STATUS.
|
||
SOJE D,IMRS2
|
||
MOVSI D,400000
|
||
ANDCAM D,IMPHTB(H) ;RFNM SENT, CLEAR IT
|
||
AOS IMNRFN
|
||
SOS IMRFCT
|
||
BUG INFO,[NET: CTL LNK RFNM TIMEOUT HST],OCT,IMPHTN(H)
|
||
IMRS1: CONO PI,NETON
|
||
JRST IMRS4
|
||
|
||
IMRS2: DPB D,IMHSBT ;RST SENT, SET STATE TO DOWN
|
||
BUG INFO,[NET: RST TIMEOUT HST=],OCT,IMPHTN(H)
|
||
SOS IMRFCT
|
||
JRST IMRS1
|
||
|
||
;NETHST (HOST INFO)
|
||
; ARG 1 - HOST => VAL 1 - STATUS, VAL 2 - HOST NUMBER
|
||
; ARG 1 - -1 => VAL 1 - (STATUS), VAL 2 - OUR HOST NUMBER
|
||
;NOT CURRENTLY IMPLEMENTED- ARG 1 - -1, ARG 2 - OUR GOING-DOWN REASON
|
||
|
||
ANETHST:HRRE T,A ;LET IMMEDIATE -1 WIN (777777 NOT A VALID HOST)
|
||
AOJE T,ANETH2 ;JUMP IF WANT LOCAL STATUS AND HOST NUMBER
|
||
MOVE T,A
|
||
JSP J,STDHST ;STANDARDIZE AND ERROR-CHECK HOST NUMBER
|
||
MOVE B,T ;RETURN NEW FORMAT *******
|
||
TLO B,(NW%ARP)
|
||
MOVEI H,LIMPHT-1
|
||
CONO PI,NETOFF ;DO WE HAVE STATUS?
|
||
CAME T,IMPHTN(H)
|
||
SOJGE H,.-1
|
||
JUMPGE H,ANETH1 ;YES, RETURN IT
|
||
CONO PI,NETON ;NO, HAVE TO GO GET IT
|
||
MOVEM T,SRN3(U)
|
||
IFN NCPP,[
|
||
PUSHJ P,NETO00 ;GET IMSOC, RETURN WITH NETLST, IMSOC LOCKED
|
||
POPJ P, ;DEVICE FULL OR SOMETHING
|
||
PUSHJ P,NETOR ;OPEN COMMUNICATIONS WITH HOST
|
||
JFCL ;IT'S DOWN, THAT'S OK
|
||
];NCPP
|
||
.ELSE POPJ P, ;OH, TOO BAD
|
||
ANETH1: MOVE A,IMPHTB(H) ;GET STATUS
|
||
CONO PI,NETON
|
||
EXCH A,B
|
||
CALL CVH2NA ; Convert to HOSTS2 for compat
|
||
EXCH A,B
|
||
JRST LSWCJ1 ;RETURN IMSOC, NETLST IF NOT DONE ALREADY
|
||
|
||
ANETH2: ;CAIL W,2 ;(THIS IS A CROCK)
|
||
;MOVEM B,NTHDSW ;IF 2 ARGS, SET OUR REASON FOR GOING DOWN.
|
||
SKIPE IMPUP ;FAKE UP OUR STATUS
|
||
TDZA A,A ;WE'RE DOWN
|
||
MOVSI A,2000 ;WE ARE UP
|
||
MOVE B,NIFIPA ;AND OUR HOST #.
|
||
JRST POPJ1
|
||
|
||
|
||
;NETIMP (REASON,TIMEDOWN,TIMEUP) READ/SET
|
||
|
||
ANETIMP:JUMPLE W,ANETM1 ;NO ARGS, RETURN
|
||
CAIGE W,3 ;MUST HAVE 3 ARGS IF ANY
|
||
JRST OPNL30
|
||
MOVEM A,IMPDWN
|
||
MOVEM B,IMPDWN+1
|
||
MOVEM C,IMPDWN+2
|
||
JRST POPJ1
|
||
|
||
ANETM1: MOVE A,IMPDWN
|
||
MOVE B,IMPDWN+1
|
||
MOVE C,IMPDWN+2
|
||
SKIPE IMPUP
|
||
TLO A,400000
|
||
JRST POPJ1
|