1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-22 00:59:48 +00:00

WIP: Add Ethernet support and Unibus DEUNA/DELNA driver.

This commit is contained in:
Adam Sampson
2018-08-08 14:28:32 +01:00
parent 14cab6253b
commit e91eafb7ba
9 changed files with 524 additions and 6 deletions

View File

@@ -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.

View File

@@ -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
View 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
View 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

View File

@@ -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)

View File

@@ -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

View File

@@ -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
]