mirror of
https://github.com/PDP-10/its.git
synced 2026-03-20 08:28:43 +00:00
WIP: Add Ethernet support and Unibus DEUNA/DELNA driver.
This commit is contained in:
@@ -2,6 +2,11 @@ set console wru=034
|
||||
set cpu its
|
||||
set cpu idle
|
||||
set tim y2k
|
||||
set debug stderr
|
||||
set xu enable
|
||||
set xu type=delua
|
||||
set xu debug=eth;trace;reg;warn;packet;data
|
||||
attach xu nat:tcp=9523:10.0.2.15:23,tcp=9595:10.0.2.15:95
|
||||
set rp0 rp06
|
||||
at rp0 out/simh/rp0.dsk
|
||||
b rp0
|
||||
|
||||
@@ -959,6 +959,13 @@ IFN DBRM80, DEFOPT RM80P==1 ; with one RM80
|
||||
DEFOPT NMTCS==1 ;Number of magtape units (so why not NMTUS?)
|
||||
DEFOPT TM03S==1 ;TM03/RH11 Unibus tape controller
|
||||
|
||||
DEFOPT NETP==1 ;Has one kind of network anyway
|
||||
DEFOPT INETP==1 ; Include Internet code
|
||||
DEFOPT TCPP==1 ; Include TCP code
|
||||
DEFOPT XBL==30. ; # TCP network channels
|
||||
DEFOPT ETHERP==1 ; Uses Ethernet
|
||||
DEFOPT UNAP==1 ; Has a DEUNA/DELNA
|
||||
|
||||
DEFOPT DZ11P==1 ;Has DZ11 TTY controllers
|
||||
DEFOPT DZ11NB==1 ; 1 of them
|
||||
DEFSYM DZ0BA=:760010
|
||||
@@ -978,6 +985,10 @@ DEFSYM PMRCM==001777 ;2.1 - 1.1 Physical page number
|
||||
; addresses.)
|
||||
DEFSYM PMUNSD==146000 ;Unused bits
|
||||
|
||||
DEFOPT ETHUS==<IPADDR %IP%> ; IP address
|
||||
DEFOPT NM%ETH==<IPADDR %NETMASK%> ; Subnet mask
|
||||
DEFOPT PKTTRC==-1 ;Packet tracing code enabled
|
||||
|
||||
DEFINE ITSIRP BODY
|
||||
IRPS ITS,,[DB]
|
||||
BODY
|
||||
@@ -1049,7 +1060,7 @@ DEFOPT NNETCH==30. ; # of NCP network channels system supports
|
||||
|
||||
;IP-specific paramters
|
||||
IFN INETP,[
|
||||
IFE IPUNCP,IFNDEF IMPUS3,.ERR IMPUS3 must be defined as Internet host addr
|
||||
IFE IPUNCP,IFNDEF IMPUS3,IFNDEF ETHUS,.ERR Internet host addr must be defined
|
||||
IFN IPUNCP,IFE CHAOSP,.ERR Chaosnet must exist for IP encapsulation scheme
|
||||
]
|
||||
|
||||
@@ -1076,8 +1087,12 @@ DEFOPT SSIMP==0 ;1= Has "Simulated Simple IMP", similar to KSIMP
|
||||
IFN IMPP,IFE DMIMP+KAIMP+KSIMP+SSIMP,.ERR IMPP requires an interface type
|
||||
IFN IMPP,IFN IPUNCP,.ERR IPUNCP and IMPP are incompatible
|
||||
|
||||
;Ethernet specific parameters
|
||||
DEFOPT ETHERP==0 ;1= Has Ethernet interface to ARPAnet
|
||||
DEFOPT UNAP==0 ;1= Has DEUNA/DELNA on KS10
|
||||
|
||||
; Generic network interface parameters
|
||||
DEFOPT NNIFS==<IMPP+CHAOSP> ; # of network interfaces
|
||||
DEFOPT NNIFS==<IMPP+CHAOSP+ETHERP> ; # of network interfaces
|
||||
|
||||
|
||||
; TTY line parameters
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
.SEE %UB ;BITS IS KS10 UNIBUS STATUS REGISTER (UBASTA)
|
||||
.SEE %UC ;FOR KL AND KS, BITS IN LH OF RESULT OF APRID
|
||||
.SEE %UM ;BITS IN UMAPS VARIABLE, AND ARGS TO PGLD, MPLD1, PLD1.
|
||||
.SEE %UN ;DEUNA/DELNA bits and constants
|
||||
.SEE %UP ;BITS IN KS10 UNIBUS PAGE MAP (WHEN MAP IS READ) (UBAPAG)
|
||||
.SEE %UQ ;BITS IN KS10 UNIBUS PAGE MAP (WHEN MAP IS WRITTEN) (UBAPAG)
|
||||
.SEE %UST ;BITS IN USTP VARIABLE.
|
||||
|
||||
@@ -2772,8 +2772,9 @@ MUR==360500 ;4.4-4.8 USAGE CODE
|
||||
MU23FB==24 .SEE QSFBT ;DISK FREED-BLOCKS TABLES
|
||||
MUPKT==25 ; Net packet buffers
|
||||
MUDVB==26 ;Semi-static device IO buffer page
|
||||
MUETH==27 ;Ethernet buffers
|
||||
;ADD NEW MUR TYPES HERE ^
|
||||
MURMAX==27 ;HIGHEST VALID CODE + 1
|
||||
MURMAX==30 ;HIGHEST VALID CODE + 1
|
||||
|
||||
MWC==221400 ;3.1-4.3 WORD COUNT IN I/O BUFFERS
|
||||
|
||||
|
||||
135
src/system/deuna.defs1
Normal file
135
src/system/deuna.defs1
Normal file
@@ -0,0 +1,135 @@
|
||||
;;; DEUNA/DELUA definitions -*-MIDAS-*-
|
||||
;;;
|
||||
;;; Copyright (C) 1999 Massachusetts Institute of Technology
|
||||
;;; Copyright (C) 2018 Adam Sampson <ats@offog.org>
|
||||
;;;
|
||||
;;; This program is free software; you can redistribute it and/or modify
|
||||
;;; it under the terms of the GNU General Public License as published by
|
||||
;;; the Free Software Foundation, either version 2 of the License, or
|
||||
;;; (at your option) any later version.
|
||||
;;;
|
||||
;;; This program is distributed in the hope that it will be useful,
|
||||
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;; GNU General Public License for more details.
|
||||
;;;
|
||||
;;; You should have received a copy of the GNU General Public License
|
||||
;;; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
.AUXIL
|
||||
|
||||
IFNDEF DEFSYM,[ ;ALLOW USER TO USE SYMBOLS IN OTHER WAYS IF HE WISHES.
|
||||
;BUT NORMALLY, DEFSYM FOO==BAR DOES FOO==BAR WITH ERROR CHECK.
|
||||
DEFINE DEFSYM X/
|
||||
IRPS Z,,[X]
|
||||
IFNDEF Z,X
|
||||
.ELSE [
|
||||
$$TEM1==Z
|
||||
X
|
||||
IFN Z-$$TEM1,.ERR Z MULTIPLY .QUOTE`.QUOTE/DEFINED/`
|
||||
]
|
||||
.ISTOP
|
||||
TERMIN TERMIN
|
||||
|
||||
IFLE .MLLIT,.ERR .MLLIT MUST BE 1; SETTING IT TO 1.
|
||||
.MLLIT==1
|
||||
$$TEMP==1
|
||||
]
|
||||
.ELSE $$TEMP==0
|
||||
|
||||
; Information here is from EK-DELUA-UG-002.
|
||||
|
||||
DEFSYM %UNVEC==120 ;Interrupt vector
|
||||
DEFSYM %UNBAS==3,,774510 ;Base of Unibus register address space
|
||||
|
||||
DEFSYM %UNR0==%UNBAS ;PCSR0
|
||||
.BEGIN %UN0
|
||||
;FIXME stop using DEFSYM
|
||||
DEFSYM SERI==1_15. ;status error
|
||||
DEFSYM PCEI==1_14. ;port command error
|
||||
DEFSYM RXI==1_13. ;receive interrupt
|
||||
DEFSYM TXI==1_12. ;transmit interrupt
|
||||
DEFSYM DNI==1_11. ;done interrupt
|
||||
DEFSYM RCBI==1_10. ;receive buffer unavailable interrupt
|
||||
DEFSYM FATL==1_9. ;fatal internal error
|
||||
DEFSYM USCI==1_8. ;unsolicited state change
|
||||
DEFSYM ALLINT==<SERI+PCEI+RXI+TXI+DNI+RCBI+FATL+USCI>
|
||||
DEFSYM INTR==1_7. ;or of bits 15-8
|
||||
DEFSYM INTE==1_6. ;interrupt enable
|
||||
DEFSYM RSET==1_5. ;reset
|
||||
.END %UN0
|
||||
.BEGIN %UNCMD
|
||||
DEFSYM NOP==0
|
||||
DEFSYM GETPCB==1
|
||||
DEFSYM GETCMD==2
|
||||
DEFSYM SLFTST==3
|
||||
DEFSYM START==4
|
||||
DEFSYM BOOT==5
|
||||
DEFSYM PDMD==10 ;polling demand
|
||||
DEFSYM HALT==16
|
||||
DEFSYM STOP==17
|
||||
.END %UNCMD
|
||||
|
||||
DEFSYM %UNR1==%UNBAS+2 ;PCSR1
|
||||
|
||||
DEFSYM %UNR2==%UNBAS+4 ;PCSR2
|
||||
|
||||
DEFSYM %UNR3==%UNBAS+6 ;PCSR3
|
||||
|
||||
.BEGIN %UNAF ;ancillary function codes in PCB
|
||||
DEFSYM NOP==0
|
||||
DEFSYM START==1 ;start microcode at
|
||||
DEFSYM RDDPA==2 ;read default physical address
|
||||
DEFSYM RDPA==4 ;read physical address
|
||||
DEFSYM WRPA==5 ;write "
|
||||
DEFSYM RDMAL==6 ;read multicast address list
|
||||
DEFSYM WRMAL==7 ;write "
|
||||
DEFSYM RDDRF==10 ;read descriptor ring format
|
||||
DEFSYM WRDRF==11 ;write "
|
||||
DEFSYM RDCTRS==12 ;read counters
|
||||
DEFSYM RCCTRS==13 ;read and clear counters
|
||||
DEFSYM RDMODE==14 ;read mode register
|
||||
DEFSYM WRMODE==15 ;write "
|
||||
DEFSYM RDSTAT==16 ;read status
|
||||
DEFSYM RCSTAT==17 ;read and clear status
|
||||
DEFSYM RDMEM==20 ;read internal memory
|
||||
DEFSYM WRMEM==21 ;write "
|
||||
DEFSYM RDSID==22 ;read system ID parameters
|
||||
DEFSYM WRSID==23 ;write "
|
||||
DEFSYM RDLSA==24 ;read load server address
|
||||
DEFSYM WRLSA==25 ;write "
|
||||
.END %UNAF
|
||||
|
||||
.BEGIN %UNTD ;bits in transmit/receive descriptors
|
||||
DEFSYM OWN==<1_15.>
|
||||
DEFSYM ERRS==<1_14.>
|
||||
.END %UNTD
|
||||
|
||||
;Layout of memory shared with DEUNA.
|
||||
;Each 1024. x 36-bit ITS page we allocate will be mapped to the Unibus as
|
||||
;two 1024. x 16-bit Unibus pages.
|
||||
|
||||
DEFSYM %UNNTB==4 ;# transmit buffers (even)
|
||||
DEFSYM %UNNRB==4 ;# receive buffers (>= 2, even)
|
||||
|
||||
;First page contains PCB, UDB, transmit/receive ring descriptors in its first
|
||||
;half. The second half is currently unused.
|
||||
;Offsets in bytes:
|
||||
DEFSYM %UNPCB==0 ;Port control block (4 uwds)
|
||||
DEFSYM %UNUDB==%UNPCB+<4*2> ;Unibus data block
|
||||
;(max 153. words for system ID params,
|
||||
;plus 1 to keep TDR 10-word-aligned)
|
||||
DEFSYM %UNTDR==%UNUDB+<154.*2> ;Transmit descriptor ring (4 uwds each)
|
||||
DEFSYM %UNRDR==%UNTDR+<%UNNTB*8> ;Receive descriptor ring (4 uwds each)
|
||||
;(init code assumes R follows T)
|
||||
IFG %UNRDR+<%UNNRB*8>-<1000*4>, .ERR DEUNA first half-page full
|
||||
|
||||
;Remaining pages contain buffers, with one buffer in the first half and one in
|
||||
;the second half; all the transmit buffers come first, then all the receive
|
||||
;buffers.
|
||||
DEFSYM %UNNPG==1+<%UNNTB/2>+<%UNNRB/2>
|
||||
DEFSYM %UNBSZ==2048.
|
||||
DEFSYM %UNBOF==2 ;Padding at start, so the packet
|
||||
;data starts on a PDP-10 word
|
||||
|
||||
IFN $$TEMP,EXPUNG DEFSYM
|
||||
313
src/system/ether.1
Normal file
313
src/system/ether.1
Normal file
@@ -0,0 +1,313 @@
|
||||
;;; ITS Ethernet support -*-MIDAS-*-
|
||||
;;;
|
||||
;;; Copyright (C) 2018 Adam Sampson <ats@offog.org>
|
||||
;;;
|
||||
;;; This program is free software; you can redistribute it and/or modify
|
||||
;;; it under the terms of the GNU General Public License as published by
|
||||
;;; the Free Software Foundation, either version 2 of the License, or
|
||||
;;; (at your option) any later version.
|
||||
;;;
|
||||
;;; This program is distributed in the hope that it will be useful,
|
||||
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;; GNU General Public License for more details.
|
||||
;;;
|
||||
;;; You should have received a copy of the GNU General Public License
|
||||
;;; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
;Check whether the interface is able to send a packet.
|
||||
;Skip-return if it is.
|
||||
ETHCTS:
|
||||
;FIXME check if we have an ARP entry, and if not, send a request
|
||||
AOS (P)
|
||||
POPJ P,
|
||||
|
||||
IFN UNAP,[
|
||||
;;; DEUNA/DELNA driver
|
||||
|
||||
$INSRT DEUNA
|
||||
|
||||
%ETMTU==1492. ;MTU (could be 1500, but be conservative)
|
||||
%ETMXL==(1500./4) ;Maximum packet length in 32-bit words
|
||||
|
||||
EBLK
|
||||
|
||||
UNPAGS: BLOCK %UNNPG ;PDP-10 pages: 0,,addr
|
||||
UNPAGU: BLOCK %UNNPG ;Unibus pages: first-addr,,second-addr
|
||||
|
||||
UNTXRP: BLOCK %UNNTB ;Transmit ring: descriptor addr,,buffer addr
|
||||
UNRXRP: BLOCK %UNNRB ;As above for receive
|
||||
;(setup code assumes those two are contiguous)
|
||||
|
||||
UNADNI: CPOPJ ;Call this after a DNI interrupt
|
||||
UNARCB: 0 ;Have we seen an RCBI interrupt?
|
||||
|
||||
BBLK
|
||||
|
||||
;BUG INFO the UNA's registers.
|
||||
UNREGS: PUSH P,A
|
||||
PUSH P,B
|
||||
PUSH P,C
|
||||
PUSH P,D
|
||||
IORDI A,%UNR0
|
||||
IORDI B,%UNR1
|
||||
IORDI C,%UNR2
|
||||
IORDI D,%UNR3
|
||||
BUG INFO,[UNA PCSR0=],OCT,A,[ PCSR1=],OCT,B,[ PCSR2=],OCT,C,[ PCSR3=],OCT,D
|
||||
POP P,D
|
||||
UNR3: POP P,C
|
||||
POP P,B
|
||||
POP P,A
|
||||
POPJ P,
|
||||
|
||||
;BUG INFO the PCB.
|
||||
UNDPCB: PUSH P,A
|
||||
PUSH P,B
|
||||
PUSH P,C
|
||||
MOVE A,UNPAGS
|
||||
MOVE B,0(A)
|
||||
MOVE C,1(A)
|
||||
BUG INFO,[UNA PCB:],OCT,B,[ ],OCT,C
|
||||
JRST UNR3
|
||||
|
||||
;Initialise the DEUNA.
|
||||
UNAINI: MOVEI D,%UNNPG-1
|
||||
|
||||
;FIXME This memory stuff would be simpler given a routine
|
||||
;that allocated and mapped a page, returning the PDP-10
|
||||
;address and the two Unibus addresses. We could then
|
||||
;allocate on the fly while setting up the rings, and
|
||||
;store the list of descriptor,,data pointers at the start
|
||||
;of the first shared page.
|
||||
|
||||
UNAIN1: PUSHJ P,TCALL ;Allocate a page of unshuffleable low core
|
||||
JRST IOMQ
|
||||
BUG HALT,[Couldn't allocate page for UNA]
|
||||
MOVEI B,MUETH ;Tag what it's being used for
|
||||
DPB B,[MUR,,MEMBLT(A)]
|
||||
|
||||
LSH A,10. ;Save the pointer
|
||||
MOVEM A,UNPAGS(D)
|
||||
|
||||
MOVE B,A
|
||||
LSH B,-9. ;DEC page number
|
||||
;FIXME Could we use %UQFST? (How do we know nobody else is?)
|
||||
; Could have a word with either 0 or the MU in...
|
||||
IORI B,%UQVAL
|
||||
|
||||
PUSHJ P,UBAASL ;Allocate first UBA paging slot
|
||||
IOWRI B,UBAPAG(A)
|
||||
HRLZ C,A
|
||||
PUSHJ P,UBAASL ;Allocate second slot
|
||||
AOS B
|
||||
IOWRI B,UBAPAG(A)
|
||||
HRR C,A
|
||||
LSH C,11.
|
||||
MOVEM C,UNPAGU(D)
|
||||
|
||||
MOVE A,UNPAGS(D)
|
||||
;BUG INFO,[UNA block ],OCT,D,[ entry ],OCT,B,[ pdp10 ],OCT,A,[ unibus ],OCT,C
|
||||
|
||||
SOJGE D,UNAIN1
|
||||
|
||||
;Initialisation sequence from DELUA user guide, page 3-8 (42).
|
||||
;This needs us to wait for an interrupt in several places, so
|
||||
;UNACMD has magic interrupt-continuation behaviour.
|
||||
|
||||
;Enable interrupts.
|
||||
MOVEI A,%UN0"INTE
|
||||
IOWRI A,%UNR0
|
||||
|
||||
;Set the PCB address.
|
||||
HLRZ A,UNPAGU ;Low bits
|
||||
IOWRI A,%UNR2
|
||||
LSH A,-16. ;High bits
|
||||
IOWRI A,%UNR3
|
||||
MOVEI A,%UN0"DNI+%UNCMD"GETPCB ;Ack DNI as it's on after reset
|
||||
PUSHJ P,UNACMD ;We've really returned to the caller here
|
||||
|
||||
IFN 1,[
|
||||
;Read, and display, the MAC address
|
||||
MOVE A,UNPAGS
|
||||
MOVSI TT,%UNAF"RDDPA
|
||||
MOVEM TT,0(A)
|
||||
MOVEI A,%UNCMD"GETCMD
|
||||
PUSHJ P,UNACMD
|
||||
PUSHJ P,UNDPCB ;Show results
|
||||
]
|
||||
|
||||
;Set up transmit and receive rings
|
||||
MOVE D,UNPAGS ;Point to TDR (RDR follows)
|
||||
ADDI D,<%UNTDR/4>
|
||||
|
||||
SETZM C ;Buffer index
|
||||
|
||||
UNAIN2: MOVE TT,C ;Work out index into UNPAGS/UNPAGU
|
||||
IDIVI TT,2
|
||||
AOS TT
|
||||
HLRZ B,UNPAGU(TT) ;Get Unibus addr. Even on the left...
|
||||
TRNE C,1
|
||||
HRRZ B,UNPAGU(TT) ;... and odd on the right
|
||||
ADDI B,%UNBOF ;Add padding at start
|
||||
|
||||
;FIXME This bit for now, until I rewrite this whole section..
|
||||
HRLM D,UNTXRP(C) ;Descriptor pointer
|
||||
MOVE A,UNPAGS(TT)
|
||||
TRNE C,1
|
||||
ADDI A,1000
|
||||
HRRM A,UNTXRP(C) ;Data pointer
|
||||
MOVE A,UNTXRP(C)
|
||||
BUG INFO,[ring],OCT,C,[ptr],OCT,A
|
||||
|
||||
MOVSI A,%UNBSZ ;SLEN (only useful for recv at this point)
|
||||
HRR A,B ;SEGB low bits
|
||||
MOVEM A,0(D)
|
||||
;BUG INFO,[t/rdr ],OCT,C,[ at ],OCT,D,[ 0/1 = ],OCT,A
|
||||
|
||||
LSH B,-16. ;SEGB high bits
|
||||
CAIL C,%UNNTB ;in the receive ring?
|
||||
IORI B,%UNTD"OWN ; yes - give this buffer to DEUNA
|
||||
HRLZS B ;zero other flags
|
||||
MOVEM B,1(D)
|
||||
;BUG INFO,[t/rdr ],OCT,C,[ at ],OCT,D,[ 2/3 = ],OCT,B
|
||||
|
||||
ADDI D,2 ;Next descriptor
|
||||
AOS C ;Next buffer
|
||||
CAIGE C,<%UNNTB+%UNNRB>
|
||||
JRST UNAIN2
|
||||
|
||||
;Set ring descriptor format
|
||||
MOVSI A,%UNAF"WRDRF ;Set up for UDB-using command
|
||||
PUSHJ P,UNAPCB
|
||||
|
||||
HLRZ B,UNPAGU ;Get Unibus address of TDR
|
||||
ADDI B,%UNTDR
|
||||
HRLZ A,B ;TDRB low bits
|
||||
IORI A,<4_8> ;TELEN
|
||||
LSH B,-16.
|
||||
IOR A,B ;TDRB high bits
|
||||
MOVEM A,0(D) ;Store word 0/1
|
||||
;BUG INFO,[rdf 0/1 =],OCT,A
|
||||
|
||||
MOVSI A,%UNNTB ;TRLEN
|
||||
HLRZ B,UNPAGU ;Get Unibus address of RDR
|
||||
ADDI B,%UNRDR
|
||||
HRR A,B ;RDRB low bits
|
||||
MOVEM A,1(D) ;Store word 2/3
|
||||
;BUG INFO,[rdf 2/3 =],OCT,A
|
||||
|
||||
LSH B,-16. ;RDRB high bits
|
||||
IORI B,<4_8> ;RELEN
|
||||
HRLZS B
|
||||
IORI B,%UNNRB ;RRLEN
|
||||
MOVEM B,2(D) ;Store word 4/5
|
||||
;BUG INFO,[rdf 4/5 =],OCT,B
|
||||
|
||||
MOVEI A,%UNCMD"GETCMD
|
||||
PUSHJ P,UNACMD
|
||||
|
||||
;Start the interface
|
||||
MOVEI A,%UNCMD"START
|
||||
PUSHJ P,UNACMD
|
||||
|
||||
BUG INFO,[UNA setup done]
|
||||
MOVEI A,CPOPJ ;Reset UNADNI behaviour
|
||||
MOVEM A,UNADNI
|
||||
POPJ P,
|
||||
|
||||
;Set up the PCB for a command that uses the UDB.
|
||||
;A=Unibus word 0 (command),,LH of Unibus word 3 (0 for most commands).
|
||||
;Returns: D pointing to UDB.
|
||||
UNAPCB: HLRZ B,UNPAGU ;Get Unibus address of UDB
|
||||
ADDI B,%UNUDB
|
||||
MOVE D,UNPAGS ;Point to PCB
|
||||
MOVE C,B ;UDBB low bits
|
||||
HLL C,A ;Command
|
||||
MOVEM C,0(D) ;Store word 0/1
|
||||
HRRZS A ;(command-specific)
|
||||
LSH A,8.
|
||||
LSH B,-16. ;UDBB high bits
|
||||
IOR A,B
|
||||
HRLZS A ;Zero word 3
|
||||
MOVEM A,1(D) ;Store word 2/3
|
||||
MOVE D,UNPAGS ;Point to UDB
|
||||
ADDI D,<%UNUDB/4>
|
||||
POPJ P,
|
||||
|
||||
;Send a command (in A). Then set the next instruction in the caller as UNADNI,
|
||||
;and return to the caller's caller -- this means that it'll appear to return
|
||||
;(in interrupt context) when the command is done.
|
||||
UNACMD: POP P,UNADNI ;Back to the caller when DNI is set
|
||||
IORI A,%UN0"INTE ;Keep interrupts on
|
||||
IOWRI A,%UNR0 ;Send command
|
||||
POPJ P, ;Return to caller's caller
|
||||
|
||||
;Handle a DEUNA interrupt.
|
||||
EBLK
|
||||
UNABRK: 0
|
||||
BBLK
|
||||
JSR UTCSAV
|
||||
|
||||
IORDI H,%UNR0 ;Read status
|
||||
BUG INFO,[DEUNA interrupt, PCSR0=],OCT,H,[ UNADNI=],OCT,UNADNI
|
||||
|
||||
TRNE H,%UN0"SERI+%UN0"PCEI+%UN0"FATL+%UN0"USCI
|
||||
BUG HALT,[DEUNA error, PCSR0=],OCT,H ;FIXME do something better!
|
||||
|
||||
TRNE H,%UN0"RXI
|
||||
PUSHJ P,UNARX
|
||||
|
||||
;FIXME %UN0"TXI
|
||||
|
||||
TRNE H,%UN0"RCBI
|
||||
SETOM UNARCB ;Just remember for when a buffer is freed
|
||||
|
||||
MOVE A,H
|
||||
ANDI A,%UN0"ALLINT+%UN0"INTE
|
||||
IOWRI A,%UNR0 ;Acknowledge interrupts
|
||||
|
||||
TRNE H,%UN0"DNI ;DNI handler *after* acknowledgement
|
||||
PUSHJ P,@UNADNI ;(because it will probably issue a new cmd)
|
||||
|
||||
JRST DSKEX ;Return from interrupt
|
||||
|
||||
;FIXME check in a ring - i.e. continue from the first empty slot found last time
|
||||
;Check the receive ring for new packets, and process them.
|
||||
UNARX: SETZM W ;Buffer index
|
||||
UNARX1: HLRZ J,UNRXRP(W) ;Descriptor
|
||||
HRRZ R,UNRXRP(W) ;Buffer
|
||||
|
||||
MOVE Q,1(J) ;OWN==0?
|
||||
BUG INFO,[rx packet slot],OCT,W,[desc],OCT,J,[buf],OCT,R,[flags],OCT,Q
|
||||
TLNE Q,%UNTD"OWN
|
||||
JRST UNARX2 ; No
|
||||
|
||||
MOVE A,0(R)
|
||||
MOVE B,1(R)
|
||||
MOVE C,2(R)
|
||||
BUG INFO,[got packet],OCT,W,[data],OCT,A,[ ],OCT,B,[ ],OCT,C
|
||||
|
||||
;FIXME process
|
||||
|
||||
TLO Q,%UNTD"OWN ;Set OWN to mark as free
|
||||
MOVEM Q,1(J)
|
||||
|
||||
SKIPN UNARCB ;Have we had RCB?
|
||||
JRST UNARX2 ; No
|
||||
SETZM UNARCB
|
||||
MOVEI A,%UN0"INTE+%UNCMD"PDMD
|
||||
IOWRI A,%UNR0 ;Issue POLLING DEMAND command
|
||||
|
||||
UNARX2: AOS W ;Next buffer
|
||||
CAIGE W,%UNNRB
|
||||
JRST UNARX1
|
||||
|
||||
POPJ P,
|
||||
|
||||
;FIXME
|
||||
;Stylewise, trying to match IMP...
|
||||
;See:
|
||||
;receive packet - IMPRM (uses IPGIPT, IPRDGM)
|
||||
;send packet - IMPOB0 (uses IPGIOQ)
|
||||
|
||||
] ;UNAP
|
||||
@@ -534,11 +534,16 @@ IFE KS10P,[
|
||||
]
|
||||
MOVE C,PK.DST(A) ; Get destination address
|
||||
|
||||
; IMP-specific!!!
|
||||
; Ask interface if it wants this particular datagram right now.
|
||||
;
|
||||
IFN IMPP,[
|
||||
CALL IMPCTS
|
||||
JRST IPGOQ5 ; Can't send, requeue
|
||||
] ;IFN IMPP
|
||||
IFN ETHERP,[
|
||||
CALL ETHCTS
|
||||
JRST IPGOQ5 ; Can't send, requeue
|
||||
] ;IFN ETHERP
|
||||
|
||||
; Got valid dgm, must ensure that block queue is merged back
|
||||
; onto beginning of output queue.
|
||||
@@ -957,8 +962,15 @@ IPKIOT:
|
||||
; C/ # of 32-bit words in buffer
|
||||
TRZ E,%IPIQK ; Flush "keep" bit since won't be on any list!
|
||||
CAIL C,5 ; Must have at least 5 words for IP
|
||||
CAIL C,%IMXLN ; Must be less or eq to maximum datagram size
|
||||
JRST OPNL33 ; Too big, say meaningless args.
|
||||
JRST OPNL33 ; Too small, say meaningless args.
|
||||
IFN IMPP,[
|
||||
CAIL C,%IMXLN ; Must be less or eq to maximum datagram size
|
||||
JRST OPNL33 ; Too big, say meaningless args.
|
||||
] ;IFN IMPP
|
||||
IFE IMPP,IFN ETHERP,[ ; (as IMP MTU < Ethernet MTU)
|
||||
CAIL C,%ETMXL ; Must be less or eq to maximum datagram size
|
||||
JRST OPNL33 ; Too big, say meaningless args.
|
||||
] ;IFE IMPP,IFN ETHERP
|
||||
CAIN J,%IPOUS ; Outputting back to self?
|
||||
JRST POPJ1 ; Yeah, just turn into a NOP.
|
||||
CALL PKTGF ; Get a free packet buffer (hangs until got it)
|
||||
@@ -1096,6 +1108,7 @@ SUBN27==:<HOSTN 18,27,0,0> ; Damn macro generates an error inside literal
|
||||
NW%CHW==:<HOSTN 128,31,0,0> ; Old CHAOS-wrapping scheme, probably unused
|
||||
|
||||
IPMTU:
|
||||
IFN IMPP,[
|
||||
IFE IPUNCP,[
|
||||
PUSH P,A ; Save address for a bit
|
||||
MOVEI T,576. ; Default value
|
||||
@@ -1116,6 +1129,11 @@ IFE IPUNCP,[
|
||||
IPMTU1: POP P,A
|
||||
] ;IFE IPUNCP
|
||||
IFN IPUNCP, MOVEI T,488.-40. ; This should be small enough...
|
||||
]
|
||||
IFN ETHERP,[
|
||||
MOVEI T,%ETMTU ; Default value
|
||||
]
|
||||
IFE IMPP+ETHERP,.ERR Write IPMTU for your interface
|
||||
RET
|
||||
|
||||
IF1,.ERR Amazing MIT-Specific crocks near IPMTU...
|
||||
@@ -1232,26 +1250,31 @@ EBLK
|
||||
NIFIPA: ; IP Address for network interface
|
||||
IFN IMPP, IMPUS3 ; IP address on IMP interface
|
||||
IFN CHAOSP, IMPUS4 ; IP address on CHAOS interface
|
||||
IFN ETHERP, ETHUS ; IP address on Ethernet interface
|
||||
IFN .-NIFIPA-NNIFS, .ERR Wrong size table - NIFIPA
|
||||
|
||||
NIFIPM: ; IP Network Mask for network interface
|
||||
IFN IMPP, NM%IMP ; Netmask for IMP interface
|
||||
IFN CHAOSP, NM%CHA ; Netmask for CHAOS interface
|
||||
IFN ETHERP, NM%ETH ; Netmask for Ethernet interface
|
||||
IFN .-NIFIPM-NNIFS, .ERR Wrong size table - NIFIPM
|
||||
|
||||
NIFIPN: ; IP Network # for network interface
|
||||
IFN IMPP, <IMPUS3>&<NM%IMP>
|
||||
IFN CHAOSP, <IMPUS4>&<NM%CHA>
|
||||
IFN ETHERP, <ETHUS>&<NM%ETH>
|
||||
IFN .-NIFIPN-NNIFS, .ERR Wrong size table - NIFIPN
|
||||
|
||||
NIFIPO: ; IP Output routine for network interface
|
||||
IFN IMPP, IPKSNA ; Send IP dgm to IMP output
|
||||
IFN CHAOSP, IPKSNC ; Send IP dgm to Chaos, may fragment
|
||||
IFN ETHERP, IPKSNE ; Send IP dgm to Ethernet, may fragment
|
||||
IFN .-NIFIPO-NNIFS, .ERR Wrong size table - NIFIPO
|
||||
|
||||
;NIFNAM: ; Interface name (in case of PEEKing someday?)
|
||||
; IFN IMPP, SIXBIT /IMP/
|
||||
; IFN CHAOSP, SIXBIT /CHA/
|
||||
; IFN ETHERP, SIXBIT /ETH/
|
||||
;IFN .-NIFNAM-NNIFS, .ERR Wrong size table - NIFNAM
|
||||
|
||||
|
||||
@@ -1288,14 +1311,18 @@ IFE ITSMCH-SIXBIT/NX/,[
|
||||
GWDEF 0,<HOSTN 139,185,5,1>,IPKSNA ; NPD cisco router, use for all.
|
||||
NIPMGW==NIPPGW ; Number of prime gateways
|
||||
].ELSE [
|
||||
IFN IMPP,[
|
||||
IFE IPUNCP,[
|
||||
GWDEF NW%LCS,<HOSTN 10,0,0,77>,IPKSNA ; MIT-GW
|
||||
GWDEF NW%AI, <HOSTN 10,3,0,6>, IPKSNA ; MIT-AI-GW
|
||||
] ;IFE IPUNCP
|
||||
] ;IFN IMPP
|
||||
IFN CHAOSP,[
|
||||
IFN IPUNCP,[
|
||||
GWDEF NW%LCS,<HOSTN 128,31,6,1>,IPKSNC ; ???
|
||||
GWDEF NW%AI, <HOSTN 128,31,6,2>,IPKSNC ; ???
|
||||
] ;IFN IPUNCP
|
||||
] ;IFN CHAOSP
|
||||
NIPMGW==NIPPGW ; Number of prime gateways
|
||||
] ; IF NOT NX
|
||||
|
||||
@@ -1407,6 +1434,13 @@ IPKSC9: MOVE A,J ; The PE
|
||||
|
||||
] ; IFN CHAOSP
|
||||
|
||||
IFN ETHERP,[
|
||||
|
||||
; FIXME write IPKSNE
|
||||
; IFE CHAOSP,with IPOGO
|
||||
|
||||
] ; IFN ETHERP
|
||||
|
||||
IPKSN5: MOVEI Q,IPUQHD+1 ; Put on System Output queue
|
||||
MOVE B,(Q) ; Save prev contents of header
|
||||
CALL PKQPL(PK.IP)
|
||||
|
||||
@@ -19512,6 +19512,7 @@ UBAIIT:
|
||||
IF2, .BAS.==UBAIIB
|
||||
|
||||
IFE TM03S, UBIDV 224 ; Tape
|
||||
;FIXME these should be conditional:
|
||||
UBIDV 300 ; NI1010 In
|
||||
UBIDV 304 ; NI1010 Out
|
||||
IFL DZ11NB-4,[
|
||||
@@ -19539,6 +19540,10 @@ UBINT 270, JSR CHXBKH ; Usual Chaosnet vector
|
||||
UBINT 230, JSR CHXBKH ; Except some interrupt here instead
|
||||
];CH11P
|
||||
|
||||
IFN UNAP,[
|
||||
UBINT %UNVEC, JSR UNABRK ; DEUNA/DELNA
|
||||
]
|
||||
|
||||
UBAIIB==:UBAIIT-.MIN.
|
||||
LOC UBAIIB+.MAX.+1
|
||||
|
||||
@@ -21645,6 +21650,9 @@ IFN CHAOSP,[ IFN T11CHP,[
|
||||
ADDI B,600000+<<T11CPA_-18.>_8>
|
||||
DPB B,[.CHSPG+EXEUMP]
|
||||
BEG8: ]] ;CHAOSP, T11CHP
|
||||
IFN UNAP,[
|
||||
PUSHJ P,UNAINI
|
||||
] ;UNAP
|
||||
IFN DL10P,[ ;INITIALIZE DL10
|
||||
CONO DLC,400000 ;MR CLR
|
||||
CONO DLB,1 ;TURN OFF EXCESS LIGHTS
|
||||
|
||||
@@ -53,6 +53,12 @@ $INSRT IMP
|
||||
|
||||
OVHMTR NET
|
||||
|
||||
IFN ETHERP,[ ; Ethernet interface code
|
||||
$INSRT ETHER
|
||||
]
|
||||
|
||||
OVHMTR NET
|
||||
|
||||
IFN NCPP,[ ; Old Arpanet NCP protocol code
|
||||
$INSRT NCP
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user