From e91eafb7ba8d4fc5a140f53d8006335152ba90fe Mon Sep 17 00:00:00 2001 From: Adam Sampson Date: Wed, 8 Aug 2018 14:28:32 +0100 Subject: [PATCH] WIP: Add Ethernet support and Unibus DEUNA/DELNA driver. --- build/simh/boot | 5 + build/simh/config.202 | 19 ++- src/system/bits.117 | 1 + src/system/core.82 | 3 +- src/system/deuna.defs1 | 135 ++++++++++++++++++ src/system/ether.1 | 313 +++++++++++++++++++++++++++++++++++++++++ src/system/inet.139 | 40 +++++- src/system/its.1648 | 8 ++ src/system/net.33 | 6 + 9 files changed, 524 insertions(+), 6 deletions(-) create mode 100644 src/system/deuna.defs1 create mode 100644 src/system/ether.1 diff --git a/build/simh/boot b/build/simh/boot index 9157c319..f6dbaa9f 100644 --- a/build/simh/boot +++ b/build/simh/boot @@ -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 diff --git a/build/simh/config.202 b/build/simh/config.202 index 40c81730..10b21820 100644 --- a/build/simh/config.202 +++ b/build/simh/config.202 @@ -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== ; IP address +DEFOPT NM%ETH== ; 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== ; # of network interfaces +DEFOPT NNIFS== ; # of network interfaces ; TTY line parameters diff --git a/src/system/bits.117 b/src/system/bits.117 index 3dac180b..7cb1317c 100755 --- a/src/system/bits.117 +++ b/src/system/bits.117 @@ -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. diff --git a/src/system/core.82 b/src/system/core.82 index 12eacdb1..85e53019 100755 --- a/src/system/core.82 +++ b/src/system/core.82 @@ -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 diff --git a/src/system/deuna.defs1 b/src/system/deuna.defs1 new file mode 100644 index 00000000..98d1df11 --- /dev/null +++ b/src/system/deuna.defs1 @@ -0,0 +1,135 @@ +;;; DEUNA/DELUA definitions -*-MIDAS-*- +;;; +;;; Copyright (C) 1999 Massachusetts Institute of Technology +;;; Copyright (C) 2018 Adam Sampson +;;; +;;; 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 . + +.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== +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 diff --git a/src/system/ether.1 b/src/system/ether.1 new file mode 100644 index 00000000..a5e500f0 --- /dev/null +++ b/src/system/ether.1 @@ -0,0 +1,313 @@ +;;; ITS Ethernet support -*-MIDAS-*- +;;; +;;; Copyright (C) 2018 Adam Sampson +;;; +;;; 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 . + +;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 diff --git a/src/system/inet.139 b/src/system/inet.139 index 316c5847..c1773fcb 100644 --- a/src/system/inet.139 +++ b/src/system/inet.139 @@ -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==: ; Damn macro generates an error inside literal NW%CHW==: ; 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, & IFN CHAOSP, & + IFN ETHERP, & 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,,IPKSNA ; NPD cisco router, use for all. NIPMGW==NIPPGW ; Number of prime gateways ].ELSE [ +IFN IMPP,[ IFE IPUNCP,[ GWDEF NW%LCS,,IPKSNA ; MIT-GW GWDEF NW%AI, , IPKSNA ; MIT-AI-GW ] ;IFE IPUNCP +] ;IFN IMPP +IFN CHAOSP,[ IFN IPUNCP,[ GWDEF NW%LCS,,IPKSNC ; ??? GWDEF NW%AI, ,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) diff --git a/src/system/its.1648 b/src/system/its.1648 index a1958d0a..1634f4f6 100644 --- a/src/system/its.1648 +++ b/src/system/its.1648 @@ -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+<_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 diff --git a/src/system/net.33 b/src/system/net.33 index 2cd23c9f..ec6907c0 100644 --- a/src/system/net.33 +++ b/src/system/net.33 @@ -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 ]