TITLE COMDEV - MONITOR DEVICE DEPENDENT CODE, SYMBOLS, AND DATA - V1500 SUBTTL T. HASTINGS/PH/TWE/DAL/JBS/EGF 30-AUGUST-88 SEARCH F,S,DEVPRM IFN FTNET!M.ANF, IFN M.KL10, IFN FTDECNET!M.DECN, $RELOC $LOW ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION ; 1973,1974,1975,1976,1977,1978,1979,1980,1982,1984,1986,1988. ;ALL RIGHTS RESERVED. .CPYRT<1973,1988> XP VCOMDV,1500 ;PUT VERSION NUMBER IN GLOB AND LOADER STORAGE MAP SUBTTL TABLE OF CONTENTS ; TABLE OF CONTENTS FOR COMDEV ; ; ; SECTION PAGE ; 1. TABLE OF CONTENTS......................................... 2 ; 2. CONVERT MONGEN SYMBOLS.................................... 5 ; 3. DEFAULT SYMBOLS........................................... 8 ; 4. TERMINAL DATA BASE........................................ 10 ; 5. TERMINAL DATA BASE ; 5.1 TERMINAL CHARACTERISTICS DEFINITION............... 22 ; 5.2 POINTERS FOR CURSOR SEQUENCES..................... 23 ; 5.3 CURSOR CONTROL SEQUENCES.......................... 24 ; 6. NETWORK SYMBOLS FOR NON-NETWORK SYSTEMS................... 25 ; 7. HARDWARE DEVICES ; 7.1 CARD PUCHES....................................... 26 ; 7.2 CARD READERS...................................... 27 ; 7.3 DECTAPES.......................................... 29 ; 7.4 DISKS............................................. 30 ; 7.5 DEC TEN-ELEVEN INTERFACE.......................... 31 ; 7.6 ETHERNET.......................................... 32 ; 7.7 LINE PRINTERS..................................... 33 ; 7.8 MAGTAPES.......................................... 34 ; 7.9 PAPER TAPE PUNCHES................................ 35 ; 7.10 PAPER TAPE READERS................................ 36 ; 7.11 PLOTTERS.......................................... 37 ; 7.12 SYSTEM COMMUNICATIONS ARCHITECTURE................ 38 ; 8. SOFTWARE DEVICES/FUNCTIONS/PROTOCOLS ; 8.1 LOCAL AREA TERMINALS.............................. 39 ; 8.2 PSEUDO TERMINALS.................................. 40 ; 9. GLOBAL NETWORK DEFINITIONS................................ 41 ; 10. ANF-10 NETWORK DATA BASE ; 10.1 FEATURE TEST CHECK................................ 43 ; 10.2 PROTOTYPE DDB..................................... 44 ; 10.3 PROTOTYPE NDB..................................... 45 ; 10.4 NDT GENERATION.................................... 46 ; 10.5 CARD READERS...................................... 47 ; 10.6 DDCMP DEVICE...................................... 48 ; 10.7 LINE PRINTERS..................................... 49 ; 10.8 MCR............................................... 50 ; 10.9 REMOTE DATA ENTRY TERMINALS....................... 51 ; 10.10 PAPER TAPE PUNCH.................................. 52 ; 10.11 PAPER TAPE READER................................. 53 ; 10.12 PLOTTER........................................... 54 ; 10.13 TASKS............................................. 55 ; 10.14 VIRTUAL TERMINALS................................. 56 ; 10.15 ETHERNET SUPPORT.................................. 57 ; 10.16 MONGEN PARAMETERS................................. 58 ; 10.17 OBJECT TABLES..................................... 60 ; 10.18 MISCELLANEOUS STORAGE............................. 61 ; 10.19 DUMMY GLOBALS..................................... 62 ; 11. DECNET NETWORK DATA BASE ; 11.1 FEATURE TEST CHECK................................ 63 ; 11.2 MONGEN PARAMETERS................................. 64 ; 11.3 NOTES ON MONGEN PARAMETER SELECTION............... 66 ; 11.4 INTERLOCKS........................................ 67 ; 11.5 LINE INITIALIZATION............................... 68 ; 11.6 THE "NOBODY" KONTROLLER........................... 69 ; 11.7 DUMMY GLOBALS..................................... 70 ; 12. DECTAPE DATA BASE FOR DTASER.............................. 71 ; 13. INTERRUPT HEAD FOR DT'X................................... 72 ; 14. DA28 DATA BASE (XTCSER)................................... 78 ; 15. Database for RX20s on 2020s............................... 79 ; 16. DEFINITIONS FOR DISPLAY AND LIGHT PEN..................... 80 ; 17. ROUTINES COMMON TO PDP11 COMM FRONT-END'S ON DL10'S....... 83 SUBTTL CONVERT TO OLD-STYLE MONGEN SYMBOLS IFNDEF MONORG, ;MAY APPEAR IN SYSCNF.MAC XP JOBN,M.JOB+1 IFE M.XTC, DEFINE TDMAC(X),< XP DT'X'N,M.DT'X M.DTXN==M.DTXN+M.DT'X > ZZ=="A" M.DTXN==0 REPEAT M.TD10,< TDMAC(\"ZZ) ZZ==ZZ+1 > IFN FTKS10,< DEFINE RX2MAC(X),< XP RX'X'N,M.RX'X M.RXXN==M.RXXN+M.RX'X > ZZ=="A" M.RXXN==0 REPEAT M.RX20,< RX2MAC(\"ZZ) ZZ==ZZ+1 > >;End FTKS10 ND TTXTRA,0 XP TTD28N,M.XTL ND M.TTDN,0 IFN M.KS10,< XP KLILIN,M.TLTL+M.RTTY ;LINE NO. FOR KS10 KLINIK > XP CTYLIN,> XP FRCLIN,CTYLIN-M.CPU DEFINE OPRL(LINE),< IFIDN , IFDIF , > DEFINE DSASOC,< XLIST DEFINE L(M,N,P),< IFIDN ,< ZZBEG==CTYLIN ZZDATA==CTYLIN > IFDIF ,< ZZBEG==M ZZDATA==M > IFB

,< ZZEND==ZZBEG ZZLINE==N > IFNB

,< ZZEND==N ZZLINE==P > REPEAT ZZEND-ZZBEG+1,< GENLIN (\ZZDATA,ZZLINE) ZZDATA==ZZDATA+1 ZZLINE==ZZLINE+1 >> ;END REPEAT AND DEFINITION OF L LIST > ;END DEFINITION OF DSASOC SUBTTL DEFAULT SYMBOLS ;THE FOLLOWING STANDARD SYMBOLS CAN BE SUPERSEDED BY A CUSTOMER HAVING ; PREVIOUSLY DEFINED THEM ON THE HDWGEN.MAC FILE USING THE MONGEN PROGRAM.... ;********************************************************************** ;ADD NEW SYMBOLS AT END SO EASY TO UPDATE MONGEN APPENDIX * ;********************************************************************** ND FLCDEF,1 ;FILLER CLASS CODE TO USE IF NOT SPECIFIED ;FOR A TTY LINE ND TTYWID,^D80 ;DEFAULT SETTING OF TTY WIDTH IS 80. ND TTYRMT,1 ;DEFAULT SETTING OF TTY REMOTE IS ON ND TTYLCT,1 ;DEFAULT SETTING OF TTY LC IS OFF ND CTYLCT,TTYLCT ;MATCH DEFAULT SETTING OF CTY LC WITH TTY LC XP CTYLTB, ;CTY 'LINTAB' BITS XP TTYLTB, ;TTY 'LINTAB' BITS ;PARAMETERS THAT CONTROL THE AUTO-DISCONNECT FEATURE. ND IDLSEC,^D90 ;ANY TERMINAL IDLE THIS LONG GETS DISCONNECTED ND M.AIDL,IDLSEC ;ANF-10 DEFAULT IDLE TIME ND M.NIDL,IDLSEC ;NRT/CTERM DEFAULT IDLE TIME ND M.DIDL,IDLSEC ;DATASET MAXIMUM IDLE TIME ND M.LIDL,IDLSEC ;LAT TERMINAL IDLE-MAX SUBTTL TERMINAL DATA BASE ;THE FOLLOWING SECTION DESCRIBES THE TELETYPE LINES,GLOBALS, AND ;DATA STRUCTURES OF THE MONITOR. ;THE FOLLOWING ARE SUPPLIED BY MONGEN ;M.DC10 =NUMBER OF DC10'S ;M.DC68 =NUMBER OF DC68'S ;M.DC76 =NUMBER OF DC76'S ;M.D7KN =NUMBER OF LINES ON DC76 K ;M.68LK =NUMBER OF LINES ON DC68 K ;M.TTGK =NUMBER OF LINES ON DC10 K ;M.DSGK =NUMBER OF DC10E'S ON DC10 K ;M.TLTL =TOTAL LOCAL TTY LINES ND M.LCST,0 ;DEFAULT TO NO CUSTOMER WORDS IFG M.LCST,< LDBCST==:LDBLEN##-M.LCST ;DEFINE START OF CUSTOMER AREA > ;DEFINE SYMBOLS FOR CPUS OTHER THAN 0 UNTIL WE GET MONGEN WORKING DEFINE CXDEF(SYM)< IRP SYM,< IFNDEF M0'SYM, IFNDEF M1'SYM, IFNDEF M2'SYM, IFNDEF M3'SYM, IFNDEF M4'SYM, IFNDEF M5'SYM, >> CXDEF() CXDEF() ;THE FOLLOWING MAY BE SUPPLIED FOR LINTAB, WHERE THE LINE NUMBER ; IS CONCATENATED ON THE END (0 IN THIS CASE): ;DSD0 MEANS LINE 0 IS A DATASET LINE ;ALSO A MACRO IS DEFINED FOR DC10E-CONTROLLED DATASETS, WHICH ;DEFINES THE CORRESPONDENCE BETWEEN THE DC10E CONTROL LINE NUMBER ;(WHICH CONTROLS THE DATASET ENABLES, RINGING, ETC) AND THE ;CORRESPONDING DC10B LINE NUMBER (I.E., TTYN AS THE SYSTEM SEES ;IT). FOR EXAMPLE, FOR A SYSTEM WITH TWO DATASETS CONTROLLED ;BY DC10E LINES 27 AND 26, AND WITH DATA ON TTY17 AND TTY16 RESPECTIVELY, ; DEFINE DSASOC < ; GENLIN 27,17 ; GENLIN 26,16 ; > ;THE FOLLOWING ARE USED IN THE PREDEFINED LINE TABLES DEFINE LINMAC (BITS) < IRP BITS,< LINMC1 (BITS,\LIN) > LIN==LIN+1 > DEFINE LINMC1 (B,N) < B'N==:1 > ;THE FOLLOWING GLOBALS ARE USED IN VARIOUS ROUTINES SUCH AS ;ONCE,SCNSER,DLSINT,BTHINT,ETC. ND M.DTEN,0 XP HGHLIN,M.TLTL+M.XTL ;HIGHEST LINE ON SCANNERS, BEFORE TCONLN XP TCONLN,CTYLIN ;LINE NUMBER FOR CTY (NOT ON SCANNER) XP DL0MXD,<10*M.TTG0>-1 ;HIGHEST DC10 LINE WHICH IS REAL DATA XP DL0MXL,<10*M.DSG0>+DL0MXD ;HIGHEST LINE ON DC10 (MAY BE DC10E) XP DL0OFS,0 ;OFFSET FROM LINTAB TO HARDWARE XP DL1MXD,<10*M.TTG1>-1 ;NUMBER OF DATA LINES ON DC10 #1 XP DL1MXL,<10*M.DSG1>+DL1MXD ;HIGHEST LINE ON DC10 #1 XP DL1OFS,<10*M.TTG0> ;ADD TO GO FROM HARDWARE TO LINTAB XP CC0OFS,DL1OFS+ ;OFFSET TO GET TO CCI0 XP CC1OFS,CC0OFS+M.68L0 ;OFFSET TO GET TO CCI1 XP D70OFS,CC1OFS+M.68L1 ;OFFSET FOR FIRST DC76 XP D71OFS,D70OFS+M.D70N ;OFFSET FOR SECOND DC76 XP D72OFS,D71OFS+M.D71N ;OFFSET FOR THIRD DC76 XP D73OFS,D72OFS+M.D72N ;OFFSET FOR FOURTH DC76 XP D74OFS,D73OFS+M.D73N ;OFFSET FOR FIFTH DC76 XP D75OFS,D74OFS+M.D74N ;OFFSET FOR SIXTH DC76 XP D76OFS,D75OFS+M.D75N ;OFFSET FOR SEVENTH DC76 XP D77OFS,D76OFS+M.D76N ;OFFSET FOR EIGHT DC76 XP DZOFS,D77OFS+M.D77N ;OFFSET FOR DZ11 TTY'S XP TTDLAL,DZOFS+M.DZNL ;OFFSET FOR ALL TTD (RSX-20F) LINES XP NETOFS,TTDLAL+M.TTDN ;OFFSET TO NETWORK TTY'S XP D28OFS,NETOFS+M.RTTY ;OFFSET FOR DA28 LINES XP DSCOF0,DL0MXD+1 ;NUMBER TO SUBTRACT FROM LINE # TO ; GET DCSTAB INDEX FOR DC10#0 XP DSCOF1,DL1MXD+1- ;DITTO FOR DC10 #1 IFG , XP TTPLEN,TCONLN+M.PTY+1 ;LENGTH OF TRANSLATOR TABLE ;INCLUDES ALL SCNANNERS, CTY, AND PTY'S IFG , IFN M.DZNL,< EXTERN DZINT ;LOAD SERVICE ROUTINE ;TABLE OF OUTPUT CHARACTERS FOR EACH DZ11 LINE DZCHTB::BLOCK M.DZNL ;TABLE OF DATASET STATUS FOR EACH DZ11 DZDSTB::BLOCK </10> ;TABLE OF LINE STATUS FOR AUTOBAUD FRONT END DZTTQN::EXP 0 DZMSTS::BLOCK M.DZNL DEFINE X (N) < DZ'N'VA::EXP 0 ;JSR HERE ON INTERRUPT EXP 0,IC.UOU,.+1 EXCH T1,DZ'N'VA ;GET PC WE CAME FROM MOVEM T1,SCNCHL## ;SAVE IT FOR SCNSAV MOVE T1,DZ'N'VA+1 ;SECOND WORD MOVEM T1,SCNCHL##+1 MOVE T1,DZ'N'VA ;RESTORE T1 JSR SCNSAV## ;SAVE REGISTERS MOVE P1,[DZ11BA+] JRST DZVECA## DZ'N'VB::EXP 0 ;JSR HERE ON INTERRUPT EXP 0,IC.UOU,.+1 EXCH T1,DZ'N'VB ;GET PC WE CAME FROM MOVEM T1,SCNCHL## ;SAVE IT FOR SCNSAV MOVE T1,DZ'N'VB+1 ;SECOND WORD MOVEM T1,SCNCHL##+1 MOVE T1,DZ'N'VB ;RESTORE REGISTER JSR SCNSAV## ;SAVE REGISTERS MOVE P1,[DZ11BA+] JRST DZVECB## > ZZ=0 REPEAT </10>,< X \ZZ ZZ=ZZ+1 > >;IFN M.DZNL ;DEFINE ALL DL10 SYMBOLS DLX.CK(0) ;MACRO DEFINED IN S.MAC INTERN DL10XI ;FOR UUOCON ND M.DN6S,0 ;TELETYPE LINE CHARACTERISTICS (FORMER LH OF LINTAB) ;USED BY SCNSER XP TTVRMT,1 ;REMOTE LINE XP TTVHLF,2 ;HALF DUPLEX LINE (DC10C OR TWX) XP TTVINI,4 ;RUN INITIAL CUSP XP TTVDSD,10 ;DATASET DATA LINE XP TTVDIS,20 ;2741 ON DC10 (OBSOLETE) XP TTVNFC,40 ;NO FREE CRLF AT 72 COLUMNS XP TTVFRM,100 ;FORM FEED IN HARDWARE XP TTVLCP,200 ;LOCAL COPY, BUT NOT HALF DUPLEX XP TTVTAB,400 ;TAB HARDWARE (8 COLUMNS PER) XP TTVLCT,1000 ;LOWER CASE TRANSLATE TO UPPER XP TTVSLV,2000 ;SLAVE TTY XP TTVFLC,4000 ;TWO BITS OF FILLER CLASS CODE DEFINE CALLM(NAME,LINE),< NDL NAME'LINE,1 > DEFINE TTYMAC(TYPE),< XLIST DEFINE L(A,B),< IFB ,-,< ZZBEG==FRCLIN+1 ZZEND==TCONLN> IFN -,> > IFNB ,< ZZBEG==A ZZEND==B > ZZLINE==ZZBEG IFGE ZZEND-FRCLIN, ;DON'T NEED TO INCLUDE PTYS IFG ZZEND-ZZBEG+1,< REPEAT ZZEND-ZZBEG+1,< CALLM (TYPE,\ZZLINE) ZZLINE==ZZLINE+1 >>> ;END IFG, REPEAT AND DEFINITION OF L MAC'TYPE LIST > ;END DEFINITION OF TTYMAC .XCREF TTYMAC DSD .CREF ;NOW DEFINE THE LINE TABLE FOR STORING LDB ADDRESSES. $HIGH LINTAB:: REPEAT TTPLEN,< EXP 0 XLIST> LIST $LOW ;NOW THE DATASET CONTROLLER INFO FOR ANY DC10E'S ;CONSTRUCT THE DATASET CONTROLLER TABLE DEFINE GENLIN(CON,DATA)< ZZ==0 IFLE , IFG , IFG , ;CHECK RANGE OF ARGUMENT IFN ZZ, IFE ZZ,< DSA'CON==1 DSB'CON==DATA > > IFG M.DSG0,< DSASOC MACCR0 ;INVOKE THE MACRO > DSCTAB::.INDEX==DL0MXD+1 DEFINE GENLIN(N)< ZZ==0 IFDEF DSA'N,> EXP ZZ ;DATA SET N .INDEX==.INDEX+1 > REPEAT , IFDEF MACCR1,< ;ONLY IF 2 DC10'S DEFINE GENLIN(CON,DATA)< ZZ==0 IFLE , IFG , IFG , ;CHECK RANGE OF ARGUMENT IFN ZZ, IFE ZZ,< DSA'CON==1 DSB'CON==DATA > > DSASOC MACCR1 ;INVOKE THE MACRO .INDEX==DL1MXD+1 DEFINE GENLIN(N)< ZZ==0 IFDEF DSA'N,> EXP ZZ ;DATA SET N .INDEX==.INDEX+1 > XALL DSCTB1:REPEAT , > ;END IFDEF MACCR1 ZZ==CC0OFS XP DSCNDX,<.-DSCTAB> XP CC0DSO,CC0OFS-<*10>+DSCNDX XP CC1DSO,CC1OFS-<*10>+DSCNDX XP D70DSO,D70OFS-<*10>+DSCNDX XP D71DSO,D71OFS-<*10>+DSCNDX XP D72DSO,D72OFS-<*10>+DSCNDX XP D73DSO,D73OFS-<*10>+DSCNDX XP D74DSO,D74OFS-<*10>+DSCNDX XP D75DSO,D75OFS-<*10>+DSCNDX XP D76DSO,D76OFS-<*10>+DSCNDX XP D77DSO,D77OFS-<*10>+DSCNDX XP DZDSO,DZOFS-<*10>+DSCNDX XP TTDDAL,TTDLAL-<*10>+DSCNDX REPEAT M.68L0+M.68L1+M.D70N+M.D71N+M.D72N+M.D73N+M.D74N+M.D75N+M.D76N+M.D77N+M.DZNL+M.TTDN,< EXP ZZ ZZ==ZZ+1 > MDSLN==:DSCTAB-. ;DEFINE SOME CHUNK SIZE PARAMETERS AND MASKS ND TTCHKS,8 ;DEFAULT SIZE IN WORDS OF A TTY CHUNK IFL TTCHKS-4, ;MUST BE AT LEAST 4 XP TTCHKS,<1B<^L>> ;WORDS IN A CHUNK (MUST BE POWER OF TWO) XP CK.BDY,TTCHKS-1 ;MASK FOR END OF CHUNK XP CK.BTH,-CK.BDY ;OFFSET FOR START OF CHUNK XP CK.CPC,CK.BDY*CK.CPW ;CHARACTERS PER CHUNK ;THE FOLLOWING SLIDING SCALE DEFINES THE LENGTH OF THE TTY FREE LIST IFNDEF TTCHKN,< IFNDEF TTCHKK,< XP TTCHKK,</CK.CPC>+5 ;ENSURE AT LEAST TTYWID CHARACTERS PER LDB IFL TTPLEN-40, ;MORE IF FEW LINES IFL TTPLEN-20, ;DITTO IFL TTPLEN-10, ;AND DITTO > ;END OF IFNDEF TTCHKK XP TTCHKN,TTCHKK*TTPLEN ;AT LAST, USE THIS CONSTANT TO GET TTCHKN > ;END OF IFNDEF TTCHKN TTCHKN==:TTCHKN ;MAKE SURE THIS SHOWS IN THE LISTING TTCHKK==:TTCHKN/TTPLEN ;THIS ONE, TOO ;SCNSER'S INPUT WARNING/LIMIT LEVELS ND TTYMIC,^D60 ;MAXIMUM INPUT CHARS/MESSAGE ;*** SHOULD MATCH DN8X DNCNFG.P11 *** ND TTIBRK,^D132 ;DEFAULT ASCII/IMAGE LINE "BREAK" LEVEL ND TTIWRN,^D200 ;DEFAULT ASCII/IMAGE XOFF WARNING LEVEL ND TTIMAX,> ;DEFAULT ASCII/IMAGE MAXIMUM LEVEL ND TTPBRK,^D132 ;DEFAULT PIM MODE LINE "BREAK" LEVEL ND TTPWRN,^D500 ;DEFAULT PIM MODE XOFF WARNING LEVEL ND TTPMAX,> ;DEFAULT PIM MODE MAXIMUM LEVEL IFG M.XTC,< ;GENERATE TABLE FOR DA28 POOL TTLTAB::BLOCK TTD28N ;KON,,UNIT XP MTTD28,-TTD28N ;MINUS # OF DA28 LINES > ;DEFINE A BIT TABLE SHOWING WHICH LINES WERE MONGEN'ED AS DATASETS DSDTAB:: SALL DEFINE GENLIN(N),< .XCREF IFDEF DSD'N,> .CREF > ;END DEFINE GENLIN ZZ==0 ;STARTING LINE NUMBER REPEAT /^D32,< ZZZ==1B0 DSDW==0 REPEAT ^D32,< GENLIN(\ZZ) ZZZ==ZZZ_-1 ZZ==ZZ+1 > EXP DSDW > ;END OF BUILDING DSDTAB ;SCNSER QUEUED PROTOCOL HEADERS DEFINE QHED(N)< IFN M'N'TTG0, IFN M'N'TTG1, IFN M'N'68L0, IFN M'N'68L1, IFN M'N'D70N, IFN M'N'D71N, IFN M'N'D72N, IFN M'N'D73N, IFN M'N'D74N, IFN M'N'D75N, IFN M'N'D76N, IFN M'N'D77N, IFN M'N'DZNL, > IFN M.XTL, ZZ=0 REPEAT M.CPU,< QHED(\ZZ) ZZ==ZZ+1 > IFN M.RMCR, ;NETWORK TERMINALS CAN RUN ON ANY CPU ; HENCE THEY HAVE A QUEUE OF THEIR OWN. IFN M.RVTM, ;SPECIAL QUEUE FOR NETWORK VIRTUAL TERMINALS NULQUE:: ;RANDOM QUEUE FOR UNUSED ALLOCATABLE LINES. IFN M.RTTY, FRCQUE::EXP 0,0 ;FORCE COMMAND LDB FAKE OUTPUT HEADER ;HERE ONCE A TICK TO START TERMINAL OUTPUT DEFINE TTSTRT(FT,QH,RT),< IFN FT,< IFNB ,< MOVEI T1,QH > PUSHJ P,RT## >> DEFINE STRG(N),< SC'N'TIC::SE1ENT TTSTRT(M'N'TTG0,DL0TQ'N,DL0STO) TTSTRT(M'N'TTG1,DL1TQ'N,DL1STO) TTSTRT(M'N'68L0,CC0TQ'N,CC0STO) TTSTRT(M'N'68L1,CC1TQ'N,CC1STO) TTSTRT(M'N'D70N,D70TQ'N,D76STO) TTSTRT(M'N'D71N,D71TQ'N,D76STO) TTSTRT(M'N'D72N,D72TQ'N,D76STO) TTSTRT(M'N'D73N,D73TQ'N,D76STO) TTSTRT(M'N'D74N,D74TQ'N,D76STO) TTSTRT(M'N'D75N,D75TQ'N,D76STO) TTSTRT(M'N'D76N,D76TQ'N,D76STO) TTSTRT(M'N'D77N,D77TQ'N,D76STO) TTSTRT(M'N'DZNL,DZTQ'N,DZSTO) TTSTRT(FTKS10,,CTYSTO) TTSTRT(FTKL10,,TTDSTO) TTSTRT(M.RMCR,,NETSTO) TTSTRT(M.DNVT,,NRTSTO) TTSTRT(M.LAT,,LATSTO) POPJ P, > $HIGH ZZ==0 REPEAT M.CPU,< STRG(\ZZ) ZZ==ZZ+1 > ;HERE ONCE A SECOND FROM SCNSER ;ONLY ENTRIES HERE ARE ONES WHOSE ISR DISPATCH DOES SOMETHING DEFINE TTSECN(FT,DSP),< IFN FT, > DEFINE STRG(N),< SC'N'SEC::SE1ENT TTSECN(M'N'TTG0,DL0DSP) TTSECN(M'N'TTG1,DL1DSP) TTSECN(M'N'68L0,CC0DSP) TTSECN(M'N'68L1,CC1DSP) TTSECN(M'N'DZNL,DZDSP) TTSECN(FTKL10,CTYDSP) TTSECN(M.DNVT,NRTDSP) TTSECN(M.LAT,LATDSP) POPJ P, > ZZ==0 REPEAT M.CPU,< STRG(\ZZ) ZZ==ZZ+1 > ;THE TTY COMMAND MAP HAS 1 BIT PER LINE ARRANGED 32 BITS PER WORD ;THUS LINE 0 IS BIT 0 OF WORD 0, LINE 37(8) IS BIT 31 OF WORD 0, ; LINE 40(8) IS BIT 0 OF WORD 1, AND SO ON. $LOW TTMAPN==:+1 CMDMAP::BLOCK TTMAPN ;TTY COMMAND BIT MAP $HIGH REPEAT 0,< ;FOR HISTORICAL REASONS ;TTYCMD IS CALLED ON EVERY CLOCK TICK TO LOOK FOR A COMMAND. IF THERE ; IS A COMMAND WAITING IT CALLS COMCON TO PROCESS IT. COMCON IN TURN ; CALLS TTFCOM WHICH SCANS CMDMAP TO FIND THE COMMAND. THE ENTIRE ; PROCESS IS VERY FAST AND IS NOT ERROR PRONE. TTYCMD:: ;HERE TO TEST FOR A COMMAND ZZ==0 REPEAT TTMAPN,< SKIPE CMDMAP+ZZ ;ANY COMMANDS IN THIS GROUP? PJRST COMMAND## ;YES--CALL COMCON ZZ==ZZ+1 XLIST >;END REPEAT LIST POPJ P,0 > ;END REPEAT 0 SUBTTL TERMINAL DATA BASE -- TERMINAL CHARACTERISTICS DEFINITION DEFINE CUSTRM,< ;CUSTOMER TERMINAL TYPES SPCCLS ;MONGEN CUSTOMER TERMINAL TYPES SPCCLX ;MONGEN CUSTOMER TERMINAL EXTENSIONS TERMCR (LA34,LA34,,,132,0,0,1,0,0,0,) > DEFINE DECTRM,< ;DEC TERMINAL TYPES TERMCR (.FORCE,.FORCE,<8BT>,,255,0,0,0,0,0,0,) ;;MUST BE FIRST!!** TERMCR (LT33,LT33,,,72,0,1,0,0,0,0,) TERMCR (TTY33,LT33) TERMCR (TTY,LT33) TERMCR (LT35,LT35,,,72,0,1,0,0,0,0,) TERMCR (TTY35,LT35) TERMCR (VT05,VT05,,,72,20,2,0,0,VT06EP,VTXXBP,) TERMCR (VT06,VT06,,,72,25,1,0,0,VT06EP,VT06BP,) TERMCR (VT50,VT50,,,80,12,0,0,0,VTXXEP,VTXXBP,) TERMCR (VT52,VT52,,,80,24,0,0,0,VTXXEP,VTXXBP,) TERMCR (VT61,VT52,) TERMCR (DAS21,VT52) TERMCR (LA30,LA30,,,72,0,1,0,0,0,0,) TERMCR (LA36,LA36,,,132,0,0,0,0,0,0,) TERMCR (LA38,LA38,,,132,0,0,1,1,0,0,) TERMCR (LA120,LA120,,,132,0,0,1,1,0,0,) TERMCR (LA180,LA180,,,132,0,0,1,1,0,0,) TERMCR (VT100,VT100,,,80,24,0,1,1,V100EP,VTXXBP,) TERMCR (VT101,VT100,,) TERMCR (VT102,VT100,) TERMCR (VT131,VT100,) TERMCR (VT125,VT100,) TERMCR (VT180,VT100) TERMCR (VT185,VT100,) TERMCR (VT103,VT100) TERMCR (VK100,VT100,,) TERMCR (GIGI,VT100,,) TERMCR (VT200,VT200,,,80,24,0,2,2,V100EP,VTXXBP,) TERMCR (VT220,VT200) TERMCR (VT240,VT200,) TERMCR (VT241,VT200,) TERMCR (LN01S,LN01S,,,80,66,0,1,1,0,0,) TERMCR (LN03,LN03,,,80,66,0,2,1,0,0,) TERMCR (VT300,VT300,,,80,24,0,3,3,V100EP,VTXXBP,) TERMCR (VT320,VT300,,) TERMCR (VT330,VT300) TERMCR (VT340,VT300,) > DEFINE TERMCR(NAME,CLASS,ATRON,ATROFF,WIDTH,LENGTH,FILL,ANSLVL,DECLVL,BPERAS,BPRUBO,CHARS),< IFIDN,<.'CLASS:!EXP SIXBIT |CLASS|> > ;EXPAND TERMINAL CLASS NAMES CCNTAB::CUSTRM TCNTAB::DECTRM TCNLIM==:.-1 ;FOR GETTAB DEFINE TERMCR(NAME,CLASS,ATRON,ATROFF,WIDTH,LENGTH,FILL,ANSLVL,DECLVL,BPERAS,BPRUBO,CHARS),< IFIDN,< ZZ==0 IRP ATRON, IRP ATROFF,>> EXP <%'CLASS==ZZ> >> ;EXPAND TERMINAL CLASS ATTRIBUTES CCATAB::CUSTRM TCATAB::DECTRM DEFINE TERMCR(NAME,CLASS,ATRON,ATROFF,WIDTH,LENGTH,FILL,ANSLVL,DECLVL,BPERAS,BPRUBO,CHARS),< IFIDN,< ZZ==0 IRP CHARS,< IFE -,> IFE -,> IFE -,> IFE -,> IFE -,> IFE -,> > ZZ==ZZ^!<<1_7>!<1_5>!<1_4>> ;;LCT, ALT, AND NFC ARE BACKWARDS BYTE (8)^D'WIDTH,^D'LENGTH(2)FILL(4)^D'ANSLVL,^D'DECLVL(10)ZZ >> ;EXPAND TERMINAL CLASS CHARACTERISTICS CCCTAB::CUSTRM TCCTAB::DECTRM DEFINE TERMCR(NAME,CLASS,ATRON,ATROFF,WIDTH,LENGTH,FILL,ANSLVL,DECLVL,BPERAS,BPRUBO,CHARS),< IFIDN,< IF2,< .IF BPRUBO,NEEDED, .IF BPERAS,NEEDED, > XWD BPRUBO,BPERAS >> ;EXPAND TERMINAL CLASS BYTE POINTER TABLES CCBTAB::CUSTRM TCBTAB::DECTRM DEFINE TERMCR(NAME,CLASS,ATRON,ATROFF,WIDTH,LENGTH,FILL,ANSLVL,DECLVL,BPERAS,BPRUBO,CHARS),< EXP SIXBIT |NAME| > ;EXPAND TERMINAL TYPES (FOR COMCON) CTTWDT::CUSTRM TTTWDT::DECTRM TTTWDN==:.-CTTWDT DEFINE TERMCR(NAME,CLASS,ATRON,ATROFF,WIDTH,LENGTH,FILL,ANSLVL,DECLVL,BPERAS,BPRUBO,CHARS),< ZZ==%'CLASS IRP ATRON, IRP ATROFF,>> ZZ==%'CLASS^!ZZ IFN ZZ, IFE ZZ, > ;EXPAND TERMINAL TYPE ATTRIBUTES CTATAB::CUSTRM TTATAB::DECTRM PURGE ZZ SUBTTL TERMINAL DATA BASE -- POINTERS FOR CURSOR SEQUENCES VT06BP: POINT 9,VT06TB POINT 9,VT06TB+2,8 POINT 9,VT06TB+4,17 POINT 9,VT06TB+6,26 POINT 9,VT06TB+10,35 POINT 9,VT06TB+13,8 POINT 9,VT06TB+15,17 POINT 9,VT06TB+17,26 VT06EP: POINT 9,VT06EL POINT 9,VT06E1 POINT 9,VT06E2 POINT 9,VT06E3 VTXXBP: POINT 9,VTXXTB POINT 9,VTXXTB,26 POINT 9,VTXXTB+1,17 POINT 9,VTXXTB+2,8 POINT 9,VTXXTB+2,35 POINT 9,VTXXTB+3,26 POINT 9,VTXXTB+4,17 POINT 9,VTXXTB+5,8 VTXXEP: POINT 9,VTXXEL POINT 9,VTXXE1 POINT 9,VTXXE2 POINT 9,VTXXE2,17 V100EP: POINT 9,VTXXEL POINT 9,V100E1 POINT 9,V100E2 POINT 9,V100E2,17 SUBTTL TERMINAL DATA BASE -- CURSOR CONTROL SEQUENCES VT06TB: BYTE (9) 177,177,177,010,040,177,177,177 BYTE (9) 010,177,177,177,010,040,177,177 BYTE (9) 177,010,177,177,177,010,040,177 BYTE (9) 177,177,010,177,177,177,010,040 BYTE (9) 177,177,177,010,177,177,177,010 BYTE (9) 040,177,177,177,010,177,177,177 BYTE (9) 010,040,177,177,177,010,177,177 BYTE (9) 177,010,040,177,177,177,010,177 BYTE (9) 177,177,010,040,177,177,177,010 BYTE (9) 0 VT06EL: BYTE (9) 015,177,177,177,0 VT06E1: BYTE (9) 30,177,177,177,0 VT06E2: BYTE (9) 30,177,177,177 VT06E3: BYTE (9) 36,177,177,177,0 VTXXTB: BYTE (9) 010,040,010,010,040,010,010,040 BYTE (9) 010,010,040,010,010,040,010,010 BYTE (9) 040,010,010,040,010,010,040,010 BYTE (9) 0 VTXXEL: BYTE (9) 015,0 VTXXE1: BYTE (9) 33,103,0 VTXXE2: BYTE (9) 33,103,33,113,0 V100E1: BYTE (9) 233,103,0 V100E2: BYTE (9) 233,103,233,113,0 $LOW SUBTTL NETWORK SYMBOLS FOR NON-NETWORK SYSTEMS IFE M.DN6S,< IFN M.KL10,< D6SDDS==:EATDSP## D6SUSR==:DFKUSR## > D60UP==:CPOPJ## D60DWN==:CPOPJ## > IFN M.KL10,< IFE M.DN6S,< D6SED==:ECOD2## D6SQ11==:ECOD2## DWND6S==:STOTAC## D6STMO==:CPOPJ## > IFE M.DN6D,< D6DED==:ECOD2## D6DQ11==:ECOD2## > >;END IFN M.KL10 IFN M.KL10,< IFE ,< NCLDSP==:EATDSP## D8SUSR==:DFKUSR## > ;END IFE > ;END IFN M.KL10 ND M.KDUP,0 ND M.DMRN,0 ND M.DN6K,0 ND M.DN6R,0 SUBTTL HARDWARE DEVICES -- CARD PUCHES ND CDPSIZ,41 ;DEFAULT BUFFER SIZE CDPMDT::MDCP10 ;CARD PUNCH PARAMETERS ;DUMMY GLOBALS IFE M.CDP,< > ;END IFE M.CDP SUBTTL HARDWARE DEVICES -- CARD READERS IFN M.CDR!M.RCDR,< ND DCRMAX,1 ;MAXIMUM NUMBER OF CARD READERS PER DTE PCDRAS==:700 ;ASCIZ BYTE POINTER PCDRBI==:1400 ;BINARY AND IMAGE BYTE POINTER PCDRSI==:4400 ;SUPER IMAGE BYTE POINTER CR1MDT::MDCR10 ;I/O BUS CARD READER PARAMETERS DCRMDT::MDDCR ;FRONT-END CARD READER PARAMETERS CR2MDT::MDCR20 ;UNIBUS CARD READER PARAMETERS > ;END IFN M.CDR!M.RCDR ;DUMMY GLOBALS IFE M.CR10,< > ;END IFE M.CR10 IFE M.DCR,< IFN M.KL10,)> > ;END IFE M.DCR IFE M.CR20,< > ;END IFE M.CR20 IFN M.CDR!M.RCDR,< ;LOCAL OR REMOTE CARD READERS? ;THE CHARACTER TRANSLATION TABLES: $HIGH CRCVPT::XWD 350700+T2,CRCVTB XWD 260700+T2,CRCVTB XWD 170700+T2,CRCVTB XWD 100700+T2,CRCVTB ;CODE CONVERSION FOR THE 029 KEYPUNCH ;THE FOLLOWING EQUIVALENCES ARE ARTIFICIALLY DEFINED ;029 KEYTOP ;ASCII 35 ;ASCII 37 ;CENT [ [ ;0-8-2 ] ] ;VERT BAR ^ HAT = L.C. VERT BAR ;UNDERBAR _ UNDERBAR ;NEGATION \ TILDE = L.C. NEGATION ;CHARACTERS ;ZONE/DIGITS CRCVTB: ASCII / 123/ ;N/N-3 ASCII .0/ST. ;0/N-3 ASCII /-JKL/ ;11/N-3 ASCII /HI[./ ;12,8/N-3 ASCII /&ABC/ ;12/N-3 ASCII /QR]$/ ;11,8/N-3 ASCII /YZ\,/ ;0,8/N-3 ASCII /89:#/ ;8/N-3 ASCII /4567/ ;N/4-7 ASCII /UVWX/ ;0/4-7 ASCII /MNOP/ ;11/4-7 ASCII /<(+!/ ;12,8/4-7 ASCII /DEFG/ ;12/4-7 ASCII /*);^/ ;11,8/4-7 ASCII /%_>?/ ;0,8/4-7 ASCII /@'="/ ;8/4-7 ;CODE FOR THE 026 KEYPUNCH A LA H HYMAN ASCII / 123/ ;N/N-3 ASCII .0/ST. ;0/N-3 ASCII /-JKL/ ;11/N-3 ASCII /HI?./ ;12,8/N-3 ASCII /+ABC/ ;12/N-3 ASCII /QR:$/ ;11,8/N-3 ASCII /YZ;,/ ;0,8/N-3 ASCII /89_=/ ;8/N-3 ASCII /4567/ ;N/4-7 ASCII /UVWX/ ;0/4-7 ASCII /MNOP/ ;11/4-7 ASCII /)]&/ ;11,8/4-7 ASCII /("#%/ ;0,8/4-7 ASCII /@^'\/ ;8/4-7 $LOW > ;END OF IFN RCDRN+M.RCDR SUBTTL HARDWARE DEVICES -- DECTAPES REPEAT 0,< IFN M.TD10,< IFNDEF SAVDMP, ;EXTENSION FOR SAVED FILES TD1MDT::MDTD10 ;TD10 PARAMETERS > ;END OF IFN M.TD10 IFE M.TD10,< ;DUMMY GLOBALS EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,0,) UNWDTC::SETZ T3, POPJ P, > ;END IFE M.TD10 > ;END REPEAT 0 SUBTTL HARDWARE DEVICES -- DISKS EXTERN FILFND, FILIO, FILUUO ;LOAD DRIVER INTERFACE AND UUO SERVICE ;GENERATE MONGEN'ED DEVICE TABLES FOR DISKS DPXMDT::MDDPX ;DP (RP10 MEMOREX) DRXMDT::MDDRX ;DR (FUTURE DRUM) FHXMDT::MDFHX ;FH (RC10/RM10B BURROUGHS DISK OR BRYANT DRUM) FSXMDT::MDFSX ;FS (RH10) MDXMDT::MDMDX ;MD (BRYANT MASS [MOBY] DISK) RAXMDT::MDRAX ;RA (CI20/HSC) RNXMDT::MDRNX ;RN (RH20/DX20/RP20CT) RPXMDT::MDRPX ;RP (RH10/RH11/RH20) ;*** EXAMPLE OF CUSTOMER DEFINITION DSXMDT::MDDSX ;DS (SA10/IBM 3330/3331) ;DUMMY GLOBALS IFE M.DPX,< > ;END IFE M.DPX IFE M.DRX,< > ;END IFE M.DRX IFE M.FHX,< > ;END IFE M.FHX IFE M.FSX,< > ;END IFE M.FSX IFE M.MDX,< > ;END IFE M.MDX IFE M.RAX,< EQUATE (GLOBAL,0,) > ;END IFE M.RAX IFE M.RNX,< EQUATE (GLOBAL,0,) > ;END IFE M.RNX IFE M.RPX,< > ;END IFE M.RPX SUBTTL HARDWARE DEVICES -- DEC TEN-ELEVEN INTERFACE IFN M.KL10,< .XCREF PRMMIN==65 IFL VDTPRM-PRMMIN, ;GENERATE FRONT END DEVICE BLOCKS FEDGEN ;GENERATE HEADER FOR COMM REGION ETHEAD ;GENERATE COMM REGION ITSELF ETREGN ;GENERATE DTE CONTROL BLOCKS ETDGEN ;GENERATE TABLE OF CORRESPONDENCE BETWEEN CPU#,DTE# AND DTE CONTROL BLOCKS .CREF ETDTBX ;TABLE FOR MASTER DTE CONTROL BLOCK ADDRESS FOR EACH CPU DEFINE DFLMAS (C), DTEMAS:: N10==0 REPEAT M.CPU,< DFLMAS \N10 N10==N10+1 > ;MACROS FOR RSX-20F DEVICE SYMBOLS AND STORAGE DEFINE RSX20F < N10==0 ;;INDEX FOR -10 CPU # REPEAT M.CPU,< ;;DO FOR EACH CPU ON SYSTEM RSXCPU \N10 ;;CALL CPU MACRO N10==N10+1 ;;STEP TO NEXT CPU > > DEFINE RSXCPU (C) < N11==0 ;;INDEX FOR -11 CPU (DTE) # REPEAT 4,< ;;DO FOR ALL DTE'S RSXDTE \C,\N11 ;;CALL CURRENT DTE MACRO N11==N11+1 ;;STEP TO NEXT -11 (DTE) > > > ;END M.KL10 SUBTTL HARDWARE DEVICES -- ETHERNET IFN M.ENET,< ND %ETUPQ,4 ;USER PORTAL JOB QUOTA ND %ETBQT,<4,,10> ;USER PORTAL DATAGRAM BUFFER QUOTAS ; (LH=TRANSMIT QUOTA, RH=RECEIVE QUOTA) ND M.ETSZ,3000 ;FREE CORE ALLOCATION POOL SIZE FOR ETHERNET IFE M.LAT, ;ALLOWANCE IF NO LAT IFN M.LAT, ;ALLOWANCE IF LAT ETHSIZ==M.ETSZ+M.LASZ ;TOTAL SIZE OF POOL ETHSIZ==:<^D144*</^D144>> ETHBTL==/^D144 ;SIZE OF THE BIT MAP IFN M.KL10,< ND M.KNSZ,3000 ;FREE CORE ALLOCATION POOL SIZE FOR KLNI KNISIZ==:<^D144*</^D144>> KNIBTL==/^D144 ;SIZE OF THE BIT MAP > ;END IFN M.KL10 EXTERN ETHUUO ;FORCE LOADING OF ETHERNET UUO SERVICE IFN M.KL10,< EXTERN KNISER ;FORCE LOADING OF KLNI DEVICE SERVICE EXTERN LLMINI ;AND KLNI MAINTENANCE PROTOCOL SERVICE > ;END IFN M.KL10 IFN M.KS10, ;FORCE LOADING OF DEUNA DEVICE SERVICE ;GENERATE MONGEN'ED DEVICE TABLES FOR ETHERNET IFN FTKL10, ;NIA20 (KLNI) IFN FTKS10, ;DEUNA IFN M.KS10,< LLMPSI::!SETZ T2, POPJ P, > ;END IFN M.KS10 ETHLOC::EXP 0 ;STARTING ADDRESS OF ETHERNET FREE CORE ETHPTR::XWD -ETHBTL,.+1 ;AOBJN POINTER TO ETHERNET FREE CORE BIT MAP BLOCK ETHBTL ;THE MAP ITSELF IFN M.KL10,< KNILOC::EXP 0 ;STARTING ADDRESS OF KLNI FREE CORE KNIPTR::XWD -KNIBTL,.+1 ;AOBJN POINTER TO KLNI FREE CORE BIT MAP BLOCK KNIBTL ;THE MAP ITSELF LLMACT::BLOCK 1 ;LLMOP IDENTIFY-SELF TIMER WORD > ;END IFN M.KL10 > ;END IFN M.ENET IFE M.ENET,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,0,) EQUATE (GLOBAL,NULGTB##,) EQUATE (GLOBAL,0,) IFN M.KL10,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,0,) > ;END IFN M.KL10 ETHSER::! DLLUNI::!MOVEI T1,1 ;RETURN ERROR UNIFC% (ILLEGAL FUNCTION) POPJ P, ;... LLMPSI::! ENTPSI::!SETZ T2, ;RETURN DUMMY STATUS CODE POPJ P, ;... IFN M.KL10,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) KNIDIA==:ECOD13## ;DIAG. UUO ERROR ILLEGAL FUNCTION > ;END IFN M.KL10 > ;END IFE M.ENET SUBTTL HARDWARE DEVICES -- LINE PRINTERS IFN M.LPT,< ND LPTSIZ,^D27+2 ;DEFAULT BUFFER SIZE ND DLPMAX,2 ;MAXIMUM NUMBER OF PRINTERS PER DTE LPTMDT::MDLP10 ;I/O BUS LINE PRINTER PARAMETERS DLPMDT::MDDLP ;FRONT-END LINE PRINTER PARAMETERS LP2MDT::MDLP20 ;UNIBUS LINE PRINTER PARAMETERS > ;END OF IFN M.LPT ;DUMMY GLOBALS IFE M.LP10,< > ;END IFE M.LP10 IFE M.DLP,< IFN M.KL10,)> > ;END IFE M.DLP IFE M.LP20,< > ;END IFE M.LP20 SUBTTL HARDWARE DEVICES -- MAGTAPES IFN M.TAPE,< ND DSETIM,^D320 ;MAXIMUM TIME TO DO A DATA SECURITY ERASE ND MTSIZ,^D128 ;DEFAULT BUFFER SIZE ND MTELOG,-1 ;LOG ERRORS THAT REQUIRED MORE THAN 1 RETRY ND MTDAEM,10 ;NUMBER OF TIMES PER REEL TO CALL DAEMON ND MTDLTP,LT.BLP ;DEFAULT LABEL TYPE ND MTFILE,1 ;USE HARDWARE SKIP FILE FUNCTIONS ND NOISE,^D12 ;NOISE RECORD LENGTH IN BYTES ND MQUANT,^D10 ;CONSECUTIVE RECORDS ND TAPTIM,^D60 ;MAXIMUM TIME TO SKIP 10 RECORDS ND TKBICT,2 ;INITIAL FAIRNESS COUNT FOR QUEUED REQUEST EXTERN TAPSER, TAPUUO ;LOAD DRIVER INTERFACE AND UUO SERVICE ;GENERATE MONGEN'ED DEVICE TABLES FOR MAGTAPES TM2MDT::MDTM02 ;TM02/TM03 TX1MDT::MDTX01 ;DX10/TX01/TX02 TD2MDT::MDDX20 ;DX20/TX01/TX02 T78MDT::MDTM78 ;TM78 TMXMDT::MDTM10 ;TM10B TCXMDT::MDTC10 ;TC10C ;*** EXAMPLE OF CUSTOMER DEFINITION TS1MDT::MDTS10 ;SA10/IBM CHANNEL MAGTAPES IFE M.TX01, ;DX10 CHANNEL GO & JUMP BITS FOR MAKLST > ;END OF IFN M.TAPE IFE M.TAPE,< ;DUMMY GLOBALS EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ1##,) EQUATE (GLOBAL,0,) EQUATE (GLOBAL,ZPOPJ##,) EQUATE (GLOBAL,COMERR##,) CCHJGO==:1B2+1B3 ;DX10 CHANNEL GO & JUMP BITS FOR MAKLST > ;END IFE M.TAPE SUBTTL HARDWARE DEVICES -- PAPER TAPE PUNCHES ND PTPSIZ,41 ;DEFAULT BUFFER SIZE PTPMDT::MDPTP ;PAPER TAPE PUNCH PARAMETERS ;DUMMY GLOBALS IFE M.PTP,< > ;END IFE M.PTP SUBTTL HARDWARE DEVICES -- PAPER TAPE READERS ND PTRSIZ,41 ;DEFAULT BUFFER SIZE PTRMDT::MDPTR ;PAPER TAPE READER PARAMETERS ;DUMMY GLOBALS IFE M.PTR,< > ;END IFE M.PTR SUBTTL HARDWARE DEVICES -- PLOTTERS IFN M.PLT,< ND PLTSIZ,^D36 ;DEFAULT BUFFER SIZE PLTMDT::MDXY10 ;I/O BUS PLOTTER PARAMETERS > ;END OF IFN M.PLT ;DUMMY GLOBALS IFE M.XY10,< > ;END IFE M.XY10 SUBTTL HARDWARE DEVICES -- SYSTEM COMMUNICATIONS ARCHITECTURE IFN M.SCA,< EXTERN MSCCOM, KLPSER ;LOAD MSC AND CI20 DRIVERS EXTERN SCSUUO ;LOAD UUO SERVICE KLPMDT::MDSCA ;CI20 PARAMETERS >; END IFN M.SCA IFE M.SCA,< ;DUMMY GLOBALS EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,DIAACI##,) EQUATE (GLOBAL,0,) SCSPSI::SETZ T2, POPJ P, BHDADR:: BSDADR::EXP 0 >; END IFE M.SCA SUBTTL HARDWARE DEVICES -- SYSTEMS CONCEPTS IBM CHANNEL IFN M.SA10,< SAXMDT::MDSA10 ;SA10 PARAMETERS >; END IFN M.SA10 IFE M.SA10,< ;DUMMY GLOBALS >; END IFE M.SCA SUBTTL SOFTWARE DEVICES/FUNCTIONS/PROTOCOLS -- LOCAL AREA TERMINALS IFE M.ENET, ;DEPENDENT UPON ETHERNET SERVICE ND M.LAT,0 ;DEFAULT IS OFF IFN M.LAT, ;FORCE LOADING OF LAT SERVICE ROUTINES IFE M.LAT,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,NOPDNC##,) EQUATE (LOCAL,0,) IFE M.ENET, ;IF NO ETHERNET SERVICE AT ALL IFN M.ENET, ;IF ETHERNET SERVICE, BUT NO LAT > ;END IFE M.LAT IFN M.LAT,< ;ONLY GENERATE IF WANT LATSER ;SOME SPACE FOR A SLOT ALLOCATION BIT TABLE FOR LAT TERMINALS NTTLAH==:M.RTTY ;SAME AS NUMBER OF NETWORK TTYS SBBWDS==:/^D36 ;ONE BIT FOR EACH SLOT WE COULD HAVE SBBITS::BLOCK SBBWDS MAXCIR==:M.LAMC ;MAXIMUM NUMBER OF CIRCUITS ;TABLE OF DESIRED INITIAL GROUPS FOR LAT SERVICE DEFINE LATGRP(ARG),> ;STRIP OFF ANGLES DEFINE LATGR1(ARG), ;MORE ANGLE BRACKETS DEFINE LATGR2(LOGRP,HIGRP,XX,YY),< .ZZ==^D'LOGRP REPEAT ^D,< .ZZW==.ZZ/^D32 ;;WORD OFFSET IN BLOCK .ZZB==1B<7-<.ZZ&7>>_-<8*<<.ZZ/8>&3>> ;;BIT TO SET CONC(LATGW,\.ZZW,<==.ZZB!LATGW>,\.ZZW) ;;SET IT .ZZ==.ZZ+1 ;;ADVANCE TO NEXT GROUP > ;;REPEAT OVER GROUPS IN LIST > ;END DEFINE LATGR? LATGW7==>>>>>> SPCGRP ;GET MONGEN'ED LAT GROUPS LATIGE::EXP LATGW0,LATGW1,LATGW2,LATGW3,LATGW4,LATGW5,LATGW6,LATGW7 IF2,< PURGE .ZZ,.ZZW,.ZZB,LATGW0,LATGW1,LATGW2,LATGW3,LATGW4,LATGW5,LATGW6,LATGW7 > > ;END IFN M.LAT SUBTTL SOFTWARE DEVICES/FUNCTIONS/PROTOCOLS -- MULTIPLEXED CHANNELS IFN M.MPX,< EXTERN MPXSER ;FORCE LOADING OF MPX SERVICE MPXMDT::MDCPUN (00,00,00,00,00,00) ;DUMMY MPX PARAMETERS MDTERM > ;END IFN M.MPX ;DUMMY GLOBALS IFE M.MPX,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ1##,) > ;END IFE M.MPX SUBTTL SOFTWARE DEVICES/FUNCTIONS/PROTOCOLS -- PSEUDO TERMINALS IFN M.PTY,< ND PTYRMT,0 ;DEFAULT TO LOCAL ND PTYLCT,0 ;NOT LOWER CASE PTYLTB==:<0*TTVFLC+PTYLCT*TTVLCT+PTYRMT*TTVRMT> ;LINTAB BITS PTYOFS==:TCONLN+1 ;OFFSET FOR PTY-DRIVEN TTY'S EXTERN PTYSER ;FORCE LOADING OF PTY SERVICE PTYMDT::MDCPUN (00,00,00,00,00,00) ;DUMMY PTY PARAMETERS MDTERM PTYTAB::BLOCK M.PTY ;ADDRESSES OF THE PTY DDBS > ;END IFN M.PTY ;DUMMY GLOBALS IFE M.PTY,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ1##,) EQUATE (GLOBAL,0,) CTLJBU::!SETZM U CTLJB::! CTLJBD::MOVNI T1,1 POPJ P, > ;END IFE M.PTY SUBTTL SOFTWARE DEVICES/FUNCTIONS/PROTOCOLS -- TERMINALS SCNN==:JOBN+TTXTRA+M.DTEN ;NUMBER OF TTY DDBS TO BE BUILT EXTERN SCNSER ;FORCE LOADING OF SCANNER SERVICE SCNMDT::MDCPUN (00,00,00,00,00,00) ;DUMMY SCANNER PARAMETERS MDTERM SUBTTL GLOBAL NETWORK DEFINITIONS IFE M.NET,< EQUATE (GLOBAL,0,) M.SNAM==: > ;END IFE M.NET IFE M.RTTY,< EQUATE (GLOBAL,0,) > IFE M.ANF,< EQUATE (GLOBAL,0,) > ;END IFE M.ANF IFE M.DECN,< EQUATE (GLOBAL,0,) > ;END IFE M.DECN $LOW STANAM::EXP M.SNAM ;SYSTEM-WIDE NODE NAME ANFNAM::EXP M.ANAM ;ANF-10 STATION NAME ANFNUM::EXP M.ANUM ;ANF-10 STATION NUMBER DCNNAM::EXP M.DNAM ;DECNET NODE NAME DCNNUM::EXP <%RTADR==:M.DNUM> ;DECNET NODE NUMBER DCNHOM::EXP <%RTHOM==:M.DHOM> ;DECNET HOME AREA NUMBER DCNRTY::EXP <%RTRTY==:M.DRTY> ;DECNET ROUTING TYPE LATNAM::EXP M.LNAM ;LAT SERVICE NAME IFE M.KS10,< EQUATE (GLOBAL,0,) > ;END IFE M.KS10 IFE M.KDUP,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,0,) > ;END IFE M.KDUP IFE M.DMRN,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,0,) > ;END IFE M.DMRN IFE M.DN6K,< EQUATE (GLOBAL,CPOPJ##,) > ;END IFE M.DN6K IFE M.DN6R,< EQUATE (GLOBAL,CPOPJ##,) > ;END IFE M.DN6R SUBTTL ANF-10 NETWORK DATA BASE -- FEATURE TEST CHECK IFN M.ANF,< IFE FTNET,< PRINTX ? ANF-10 will not work with FTNET = 0 PRINTX ? ANF-10 will not be included in this monitor M.ANF==:0 > ;END IFN FTNET EXTERN NETSER ;LOAD NETWORK SERVICE > ;END IFN M.ANF SUBTTL ANF-10 NETWORK DATA BASE -- PROTOTYPE DDB IFN M.ANF,< DEFINE X (OFFSET,EXPR),< ;;MACRO TO SET SELECTED LOCATIONS IN THE BLOCK RELOC NETDDB+OFFSET ;;GO TO THE RIGHT WORD EXPR ;;ASSEMBLE IN THE EXPRESSION > ;END DEFINE X $LOW NETDDB::X DEVCHR,+DVC2IO,0> X DEVSER, ;DEFINE NETWORK DISPATCH VECTOR X DEVSTA, ;VAR LEN BUF, NO EVM X DEVCPU, ;SET DEYPCL SO WILL RUN ON ANY CPU. X NETLEN, ;RESERVE ENOUGH SPACE FOR ENTIRE DDB PURGE X ;FLUSH THE MACRO $HIGH SUBTTL ANF-10 NETWORK DATA BASE -- PROTOTYPE NDB DEFINE X (OFFSET,EXPR),< ;;MACRO TO SET SELECTED LOCATIONS IN THE BLOCK RELOC NETNDB+OFFSET ;;GO TO THE RIGHT WORD EXPR ;;ASSEMBLE IN THE EXPRESSION > ;END DEFINE X $LOW NETNDB::X NDBSID, ;CREATION DATE,LONG-NAME X NDBSNM, ;SHORT-NAME,VERSION X NDBFLG, ;MAKE SURE WE DON'T TRY A STARTUP SEQ X NDBFEK, ;POINT TO OUR "NULL" FEK (CPU 0) X NDBMOM, ;MAXIMUM OF 10 OUTSTANDING MSGS X NDBDEV, X NDBLEN, ;RESERVE ENOUGH SPACE FOR THE ENTIRE NDB PURGE X ;FLUSH THE MACRO .GTNDA::BLOCK NODMAX+1 ;GETTAB TABLE=173 INDEXED BY NODE NUMBER NDAMXL==:<.-.GTNDA-1>_^D9 ;LENGTH OF GETTAB TABLE $HIGH SUBTTL ANF-10 NETWORK DATA BASE -- NDT GENERATION DEFINE NDT (XDEV,XIDEV,BUFSZ,CHR,DCM,DVT,SPL)< ND N'XIDEV'BSZ, NDT'XDEV: BYTE (18)<(SIXBIT /XDEV/)>,<(SIXBIT /XIDEV/)> XWD CHR,XDEV'MOD BYTE (10)DCM(8)OBJ.'XIDEV(2)0(16)DVT BYTE (6).TY'XDEV(12)N'XIDEV'BSZ(8)SPL(10)0 IFIW N'XDEV'CI## IFIW @NDEV'XIDEV##(T4) IFIW @'XDEV'NDP##(T1) .ORG NDTTBL+OBJ.'XIDEV EXP NDT'XDEV .ORG > ;END DEFINE NDT DEFINE X (A,B,C), ZZ==0 ;INIT COUNTER OBJTYP ;COUNT UP THE OBJECT TYPES NDTTBL::BLOCK ZZ ;RESERVE SPACE FOR NDT BLOCK POINTERS NDTXWD::XWD -ZZ,NDTTBL ;AOBJN POINTER TO TABLE > ;END IFN M.ANF SUBTTL ANF-10 NETWORK DATA BASE -- CARD READERS IFE M.ANF, ;NO CARD READER SERVICE IF NO ANF-10 IFN M.RCDR,< EXTERN NETCDR CDRMOD==1_A+1_AL+1_I+1_IB+1_B NDT(CDR,CD,34,,,0,.SPCDR) > ;END IFN M.RCDR ;DUMMY GLOBALS IFE M.RCDR,< > ;END IFE M.RCDR SUBTTL ANF-10 NETWORK DATA BASE -- DDCMP DEVICE IFE M.ANF, ;NO DDCMP DEVICE SERVICE IF NO ANF-10 IFN M.RDDP,< EXTERN NETDDP DDPMOD==1_BYTMOD NDT(DDP,DP,</4>,,,0,0) > ;END IFN M.RDDP IFE M.RDDP,< EQUATE (GLOBAL,CPOPJ##,) > ;END IFE M.RDDP SUBTTL ANF-10 NETWORK DATA BASE -- LINE PRINTERS IFE M.ANF, ;NO LINE PRINTER SERVICE IF NO ANF-10 IFN M.RLPT,< EXTERN NETLPT LPTMOD==1_A+1_AL+1_A8+1_I NDT(LPT,LP,33,,,0,.SPLPT) > ;END IFN M.RLPT ;DUMMY GLOBALS IFE M.RLPT,< > ;END IFE M.RLPT SUBTTL ANF-10 NETWORK DATA BASE -- MCR IFE M.ANF, ;NO MCR SERVICE IF NO ANF-10 IFN M.RMCR,< EXTERN NETMCR OBJ.MC==OBJ.TT ;DUMMY "MCR" OBJECT TYPE TO MATCH NAMES MCRMOD==0 ;NOT AVAILABLE AS I/O DEVICE NDT(MCR,MC,23,,,0,0) > ;END IFN M.RMCR ;DUMMY GLOBALS IFE M.RMCR,< EQUATE (GLOBAL,ECOD4##,) EQUATE (GLOBAL,NOPDNC##,) IFN M.ANF,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ1##,) EQUATE (GLOBAL,TTYNDP,) > ;END IFN M.ANF > ;END IFE M.RMCR SUBTTL ANF-10 NETWORK DATA BASE -- REMOTE DATA ENTRY TERMINALS IFE M.ANF, ;NO REMOTE DATA ENTRY SERVICE IF NO ANF-10 IFN M.RDX,< EXTERN NETRDX RDAMOD==1_BYTMOD+1_PIMMOD+1_A+1_AL NDT(RDA,RD,101,,,0,0) > ;END IFN M.RDX IFE M.RDX,< EQUATE (GLOBAL,CPOPJ##,) > ;END IFE M.RDX SUBTTL ANF-10 NETWORK DATA BASE -- PAPER TAPE PUNCH IFE M.ANF, ;NO PAPER TAPE PUNCH SERVICE IF NO ANF-10 IFN M.RPTP,< EXTERN NETPTP PTPMOD==1_B+1_AL+1_I+1_IB+1_A NDT(PTP,PP,41,,,0,.SPPTP) > ;END IFN M.RPTP ;DUMMY GLOBALS IFE M.RPTP,< > ;END IFE M.RPTP SUBTTL ANF-10 NETWORK DATA BASE -- PAPER TAPE READER IFE M.ANF, ;NO PAPER TAPE READER SERVICE IF NO ANF-10 IFN M.RPTR,< EXTERN NETPTR PTRMOD==1_B+1_AL+1_I+1_IB+1_A NDT(PTR,PR,41,,,0,0) > ;END IFN M.RPTR ;DUMMY GLOBALS IFE M.RPTR,< > ;END IFE M.RPTR SUBTTL ANF-10 NETWORK DATA BASE -- PLOTTER IFE M.ANF, ;NO PLOTTER SERVICE IF NO ANF-10 IFN M.RPLT,< EXTERN NETPLT PLTMOD==1_B+1_AL+1_I+1_IB+1_A NDT(PLT,PL,41,,,0,.SPPLT) > ;END IFN M.RPLT ;DUMMY GLOBALS IFE M.RPLT,< > ;END IFE M.RPLT SUBTTL ANF-10 NETWORK DATA BASE -- TASKS IFE M.ANF, ;NO TASK SERVICE IF NO ANF-10 IFN M.RJOB,< EXTERN NETTSK TSKMOD==1_B+1_I+1_IB+1_A+1_AL+1_BYTMOD NDT(TSK,TK,101,,,0,0) > ;END IFN M.RJOB ;DUMMY GLOBALS IFE M.RJOB,< EQUATE (GLOBAL,CPOPJ##,) > ;END IFE M.RJOB SUBTTL ANF-10 NETWORK DATA BASE -- VIRTUAL TERMINALS IFE M.ANF, ;NO VIRTUAL TERMINALS IF NO ANF-10 IFN M.RVTM,< EXTERN NETVTM TTYMOD==1_A+1_AL+1_A8+1_PIMMOD+1_I NDT(TTY,TY,23,,,0,0) > ;END IFN M.RVTM ;DUMMY GLOBALS IFE M.RVTM,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) IFN M.RMCR, IFN M.ANF,< REPEAT 5, TTYNDP::REPEAT 5, > ;END IFN M.ANF > ;END IFE M.RVTM SUBTTL ANF-10 NETWORK DATA BASE -- ETHERNET SUPPORT ;ANF ETHERNET PROTOCOL AND MULTICAST ADDRESS ; ; NOTE: THE ANF ETHERNET DRIVER (D8EINT) WILL BE LOADED IF AND ONLY IF ; THE SYMBOL ANFNIP IS DEFINED NON-ZERO (E.G., VIA MONGEN). ND ANFNIP,NCLNIP ;DEFAULT TO EXCLUDE ANF-10 FROM THE ETHERNET ND ANFNIM,<<B15>> ;DEFAULT MULTICAST ADDRESS IFE ANFNIP!ANFNIM,< ;IF TO BE EXCLUDED, D8EINI==:CPOPJ## ;NULL D8EINT SERVICE (SYSINI DUMMY) > ;END IFE ANFNIP SUBTTL ANF-10 NETWORK DATA BASE -- MONGEN PARAMETERS IFN M.ANF,< ;MAXIMUM MESSAGE SIZE TO BE SEEN FROM THE NETWORK ND MSGMAX,^D512 ;WHAT IT USED TO BE IN TERMS OF PCBLMX MSGMAW==:_-2 ;MAX MESSAGE SIZE MOD -10 WORD SIZE IFN M.ENET,< ;ETHERNET? MSGMAW==:MSGMAW+2 ;ALLOW FOR 2-BYTE COUNT + 4-BYTE CRC > ;END IFN M.ENET MSGMAD==:MSGMAX-20 ;MAX MESSAGE SIZE (DISCOUNTING NCL OVERHEAD) ; E.G., FOR DATA MESSAGES THIS IS HOW MUCH ; DATA CAN BE FIT IN A SINGLE MESSAGE ;MAXIMUM SIZE THE -10 WILL KNOWINGLY TRANSMIT ND MSGXMX,MSGMAX ;MAKE AS BIG AS POSSIBLE MSGXMW==:_-2 ;MAX TRANSMITTABLE MOD -10 WORD SIZE IFG MSGXMX-MSGMAX,< PRINTX ? MSGXMX greater than MSGMAX! MSGXMX==:MSGMAX ;LIMIT MAXIMUM TRANSMITTABLE > ;END IFG MSGXMX-MSGMAX IFL NETLNH-<^D36-^L>+1,< PRINTX % NETLNH too small for MSGMAX PRINTX % Network message length histogram table won't be accurate > ;END IFL NETLNH- IFN M.KDUP,< IFG MSGMAX-<4*KDLMMS>,< PRINTX ? KDLMMS too small, incoming KMC/DUP messages won't fit! > ;END IFN MSGMAX- > ;END IFN M.KDUP IFN M.DMRN,< IFG MSGMAX-<4*DMRMMS>,< PRINTX ? DMRMMS too small, incoming DMR messages won't fit! > ;END IFN MSGMAX- > ;END IFN M.DMRN > ;END IFN M.ANF IFN M.ANF,< ;ALLOCATION "GRANULARITY" (POWER OF TWO; USED FOR LSH'S) ND MSGAGN,^D03 ;ALLOCATE BY 8-WORD BLOCKS MSGAGW==:<1_MSGAGN> ;ALLOCATION GRANULARITY BY WORDS MSGALN==:_-MSGAGN ;ALLOCATION TABLE LENGTHS ;MAXIMUM NUMBER OF DATA-REQUESTS THAT MAY BE SENT (FOR INPUT DEVICES ONLY) ND MAXODR,6 ;6 SEEMS LIKE ENOUGH... ;SIZE OF A "TERMINAL PCB" MUST BE A POWER OF 2, AND .LE. ^D32 ND NTTPLN,^D32 ;SIZE OF A TERMINAL PCB > ;END IFN M.ANF ;LINK ADDRESS TABLE. ONE ENTRY FOR EACH NETWORK CONNECTION IFE M.ANF, ;NO LINK ADDRESS IF NO ANF-10 IFE M.CONN, ;LINK ADDRESS TABLE LENGTH IF NO CONNECTS IFN M.CONN, ;LENGTH OF TABLE (MAXIMUM NUMBER OF CONNECTS SUBTTL ANF-10 NETWORK DATA BASE -- OBJECT TABLES IFN M.ANF,< ;TABLE INDEXED BY OBJECT TYPE. THE FORMAT OF THIS TABLE IS: ; BYTE (12)0 (6)TYPE (18)SIXBIT/NAME/ ; DEFINE X (A,B,C),< ;;MACRO CALLED BY OBJTYP XWD C,SIXBIT / A/ ;;MAKE THE ENTRY > ;END DEFINE X OBJTAB::OBJTYP ;MAKE DEVICE DESCRIPTORS AOTMXL==:<.-OBJTAB-1>_^D9 ;LENGTH OF ANF-10 OBJECT TRANSLATION TABLE ;A BYTE POINTER TO THE TYPE FIELD IN OBJTAB. OB%TYP==: ;POINT TO TYPE FIELD IN OBJTAB ENTRY ;A TABLE OF POINTERS INTO CONFIGURATION TABLE OF AN NDB. ; INDEXED BY W (THE STANDARD NDB POINTER) DEFINE X (A,B,C),< ;;MACRO CALLED IN OBJTYP POINT 9,NDBDEV+(W),8+<<3&B>*9> > ;END DEFINE X NETCNF::OBJTYP ;MAKE THE BYTE POINTERS ;A TABLE OF NDTS BASED ON OBJECT TYPE ;ENTRIES ARE ADDRESS OF NDT FOR THAT OBJECT TYPE, OR 0 IF NOT SUPPORTED DEFINE X (A,B,C),< ;;MACRO CALLED BY OBJTYP IFDEF NDT'A, ;;ADDRESS OF NDT FOR THIS OBJECT TYPE IFNDEF NDT'A, ;;OR 0 IF UNKNOWN/UNSUPPORTED > ;END DEFINE X NDTTAB::OBJTYP ;MAKE NDT ADDRESSES > ;END IFN M.ANF SUBTTL ANF-10 NETWORK DATA BASE -- MISCELLANEOUS STORAGE $LOW NETLAT::XWD 0,NETDDB ;POINT TO THE DDB (EXEC PROCESS) BLOCK M.CONN ;REST OF THE TABLE $HIGH IFNDEF NETOFS, NETRTY::XWD -M.RTTY,NETOFS ;POINTER TO NETWORK SECTION OF LINTAB ;NETSER'S FREE-PCB MANAGEMENT LISTS (INDEXED BY BUFFER SIZE "MOD" MSGAGN) $LOW IFN M.ANF,< NTFREC::BLOCK MSGALN+1 ;COUNT OF FREE PCB'S ON EACH FREE LIST NTFREF::BLOCK MSGALN+1 ;POINTER TO FIRST FREE PCB ON EACH LIST NTFREL::BLOCK MSGALN+1 ;POINTER TO LAST FREE PCB ON EACH LIST > ;END IFN M.ANF SUBTTL ANF-10 NETWORK DATA BASE -- DUMMY GLOBALS $LOW IFE M.ANF,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ1##,) EQUATE (GLOBAL,0,) EQUATE (GLOBAL,0,) EQUATE (GLOBAL,NULGTB##,<.GTNDA,OBJTAB,NETGTT,NDBTBL>) STBOPR::PUSH P,U ;SAVE LDB MOVE U,OPRLDB## ;GET CENTRAL (ONLY) OPR LDB LDB T1,LDPLNO## ;GET LINE NUMBER PJRST UPOPJ## ;RESTORE AC AND RETURN. > ;END IFE M.ANF ;FLAG WHICH INDICATES A CATASTROPHIC ERROR HAS OCCURED (PAR ERR, ;NXM, ETC.) USED BY ERRCON AND ZAPNET TO PREVENT WEM STOPCODES ;MUST BE DEFINED AND USABLE IN ALL MONITORS NETZAP::EXP 0 SUBTTL DECNET NETWORK DATA BASE -- FEATURE TEST CHECK IFN M.DECN,< IFE FTDECNET,< PRINTX ? DECnet will not work with FTDECNET = 0 PRINTX ? DECnet will not be included in this monitor M.DECN==:0 > ;END IFN FTDECNET ;FORCE LOADING DECNET EXTERN D36INI, NTMAN, SCUUUO, SCTNSF EXTERN RTRINI, DNDINI, NSPINI IFN M.DNVT, ;FORCE LOADING NRT/CTERM IFE M.DNVT,< EQUATE (GLOBAL,CPOPJ##,) NETDID==:NOPDNC## CWHNRT==:CWHNCN## NRTCHP::! NRTSJP::EXP 0 > ;END IFE M.DNVT IFN FTCIDNET, ;FORCE LOADING DECNET/CI > ;END IFN M.DECN SUBTTL DECNET NETWORK DATA BASE -- MONGEN PARAMETERS $LOW IFN M.DECN,< ;EXTENSIBLE BITMAP MEMORY REQUIREMENTS FOR DECNET ND M.DNCS,4 ;CHUNK SIZE IN WORDS ND M.DNSZ,30000 ;INITIAL ALLOCATION AMOUNT IN WORDS ND M.DNTH,4000 ;THRESHOLD ALLOCATION AMOUNT IN WORDS ND M.DNIN,4000 ;INCREMENTAL ALLOCATION AMOUNT IN WORDS ND M.DNMN,10000 ;MINIMUM ALLOCATION AMOUNT IN WORDS ND M.DNMX,100000 ;MAXIMUM ALLOCATION AMOUNT IN WORDS XP DCNSIZ,/PAGSIZ>> XP DCNMAX,/PAGSIZ>> ;DECNET ALLOCATION CONTROL BLOCK .LINK .LKACB,DCNACB ;ADD TO SYSTEM-WIDE LINKED LIST DCNACB::EXP 0 ;ADDRESS OF NEXT ALLOCATION CONTROL BLOCK SIXBIT /DECNET/ ;ALLOCATION USER EXP M.DNCS ;CHUNK SIZE IN WORDS Z (MS.DCN) ;SECTION NUMBER OF ALLOCATION EXP 0 ;CURRENT USED AMOUNT IN WORDS EXP 0 ;HIGH WATER MARK IN WORDS EXP DCNSIZ ;INITIAL ALLOCATION AMOUNT IN WORDS EXP M.DNTH ;THRESHOLD ALLOCATION AMOUNT IN WORDS EXP M.DNIN ;INCREMENTAL ALLOCATION AMOUNT IN WORDS EXP M.DNMN ;MINIMUM ALLOCATION AMOUNT IN WORDS EXP DCNMAX ;MAXIMUM ALLOCATION AMOUNT IN WORDS EXP 0 ;ADDRESS OF ALLOCATION HEADER BLOCK > ;END IFN M.DECN IFN M.DECN,< RADIX 10 ;NETWORK MANGLEMENT IS DECIMAL ND %RTMXN,1023 ;MAXIMUM NODE NUMBER ND %RTMX3,255 ;DEFAULT MAXIMUM NODE ADDRESS FOR ROUTER ND %RTTM3,15*1000 ;DEFAULT HELLO FREQUENCY TIMER ND %RTTM4,30*1000 ;DEFAULT NODE LISTENER TIMER ND %RTITM,1*60*1000 ;INITIALIZATION TIMER ND %RTT3M,2 ;HELLO TIMER MULTIPLIER FOR NON-BROADCAST ND %RTB3M,3 ;HELLO TIMER MULTIPLIER - BROADCAST ADJACENCIES ND %RTCST,1 ;DEFAULT COST FOR CIRCUIT ND %RTMXR,16 ;DEFAULT MAXIMUM NUMBER OF ROUTERS ON AN NI ND %RTBRA,32 ;MAXIMUM NUMBER OF BROADCAST ROUTER ADJACENCIES ND %RTBEA,64 ;MAXIMUM NUMBER OF END NODE ADJACENCIES ND %RTCTO,60*1000 ;ENDNODE CACHE TIMEOUT ND %RTPRI,5 ;OUR PRIORITY TO BE THE DESIGNATED ROUTER ND %RTMXC,100 ;MAXIMUM LINE COST ND %RTMXH,16 ;MAXIMUM HOPS ND %RTMXV,20 ;DEFAULT MAXIMUM VISITS ND %RTTM1,10*60*1000 ;DEFAULT MAXIMUM ROUTING MSG INTERVAL (P-P) ND %RTBT1,40*1000 ;DEFAULT MAXIMUM ROUTING MESSAGE INTERVAL (NI) ND %RTBSZ,576 ;PUBLISHED EXECUTOR DEFAULT BLOCK SIZE (BYTES) IFNDEF %RTXPW,>> ;DEFAULT ROUTER PASSWORD DEFINE RTRPW(PW),< .ZZN==0 IRPC PW,<.ZZN==.ZZN+1>;;COUNT CHARS IN PWD IFG .ZZN-RTRXPM, .ZZW==<.ZZN>B7;; LEADING BYTE COUNT .ZZC==1;; CHAR POSITION OF NEXT CHAR IRPC PW,<.ZZW==.ZZW!<"PW">B<7+<.ZZC*8>> IFE .ZZC-3, .ZZC==.ZZC+1> IFN .ZZC, PURGE .ZZN,.ZZW,.ZZC > ;END DEFINE RTRPW RTRXPM==^D64 ;MAXIMUM NUMBER OF BYTES IN A VERIFICATION PSWD RTRXPW::%RTXPW BLOCK </4>-<.-RTRXPW>;ALLOCATE FOR MAX ;THESE ARE LLINKS DEFAULT PARAMETER VALUES: ND %NSDLY,3*16 ;DELAY FACTOR ND %NSWGT,10 ;DELAY WEIGHT ND %NSINA,120 ;INACTIVITY TIMER ND %NSRTH,10 ;RETRANSMISSION THRESHOLD ND %NSFLR,1000 ;DELAY FLOOR ND %NSRUF,10000 ;DELAY ROOF ND %NSADL,2 ;ACK DELAY IN SECONDS ;THESE ARE SESSION CONTROL DEFAULT PARAMETER VALUES: ND %SCINT,30*1000 ;INCOMING TIMER VALUE ND %SCOTT,1*60*1000 ;OUTGOING TIMER VALUE ;THESE ARE THE DATA LINK LAYER DEFAULT PARAMETER VALUES: ND %DLBSZ,576 ;DEFAULT MAXIMUM BUFFER SIZE (BYTES) RADIX 8 ;LCG IS OCTAL SUBTTL DECNET NETWORK DATA BASE -- NOTES ON MONGEN PARAMETER SELECTION COMMENT ~ This novel is intended in guiding network managers who want to fine tune their networks for performance. A word of caution before we start: The parameters as currently defaulted were what we had set during field test. We know that in the majority of cases, these parameters work to most DEC systems even though not with optimal performance. Modifying these parameters can cause disaster, so understand what you are attempting beforehand, and be conservative in modifying them. Be aware that DEC may not agree with your settings, and will request them be set back to standard values before debugging any problems in your network. The critical timer in this case is the AVERAGE DELAY to a node. This is kept by LLINKS by timestamping each data message it sends, and waiting for the ACK to come back. When it has the ack, it has the delay for that particular message, and it averages that delay into the average delay. This delay time is used as a base in computing when to retransmit, and when to decide that a link has gone sour, and as such is the single most important timer as far as performance is concerned. Below is a description of some parameters controlling how this delay is calculated. %NSFLR - Changing this will probably only affect nodes which are relatively close to this node. The desirable effect of lowering this is to speed up recovery after a lost message, since the lost message will be re-trasmitted much sooner. The undesirable effect is that links will break if the delay changes much. %NSRUF - Changing this will probably only affect problems involving congestion. Lowering this will decrease the effect that congestion has on a link, but will increase the number of messages sent, which can aggravate the congestion. If congestion gets too bad, not enough messages get through to keep the link alive, and it breaks. %NSWGT - This affects how much a single delay will affect the average delay. Increasing this causes the delay to change more slowly, lowering it causes the delay to track reality more closely. Tremble before you change this one - Lowering it can cause positive feedback in your network with delay and retransmissions oscillating out of control, while increasing it can cause links to be unable to adapt to changing conditions. %NSRTH - Retransmission threshold. This controls the number of times we re-send a message before giving up. Increasing this will give the other side a better chance of keeping your link alive, but can aggravate congestion problems. %NSDLY - Delay factor. This multiplied by the average delay to a node is used as the retransmission timer. Note that this factor is kept in 1/16ths, so the default is 3 even though network management says 48. The main theme throughout this novel is congestion. If congestion did not exist, we would recommend lowering %NSFLR and %NSWGT, and increasing %NSRTH. The term congestion, as used in this novel, indicates the situation where some node, possibly an intermediate, possibly a destination, does not have buffers for all the messages that he is receiving, and must discard some. The destination does not receive these messages, the source does not receive an ack for them, so must eventually retransmit them. The reasons congestion can occurr are numerous; Some of the more common ones are: 1) A node with a high speed line and a low speed line: Messages are coming in the high speed line to be retransmitted on the low speed line faster than the low speed line can handle. The messages pile up, and eventually some of them are dropped. 2) A node with cross-traffic. Messages going from node A to node B through node C have no trouble, until messages from node D going to node E also through node C eat up buffers. 3) Many links to same node. Since flow control is managed on a per-link basis, there is nothing to keep many links from transmitting their limit all at the same time. If the source and destination are the same type of system, often this isn't a problem since they both have the same limit on the number of buffers. When they are of different type, and the source has more buffers available than the destination, the destination cannot process them all in time. We cannot predict all situations in the field, but here are some suggested scenarios, and suggestions as to ways of improving performance: Scenario A: TOPS10 - DTE - DN20/MCB - DMR(56kb) - VAX Continual file transfer activity, spurts of NRT (terminal) activity. Occasional congestion loss caused by the spurts of NRT activity (reason 3). In this case, it could be possible to act as if congestion didn't exist, and lower %NSFLR, %NSWGT, and %NSDLY. Since congestion is fleeting, the retransmissions will occurr after the congestion has gone away (the user has stopped banging away at his terminal) and should not cause problems. Scenario B: KL - DTE - DN20/MCB - DMR(56kb) - VAX \ KDP(9600) - RSX File transfer activity from KL to RSX and VAX. NRT activity, but irrelevant. High congestion loss to RSX due to low speed line from DN20 to RSX. In this case, congestion is the dominant theme. The DN20's buffer space is always going to be busy, since every time the RSX system sends data requests (credits, permissions) the KL will be able to fill the MCB before the MCB will have a chance to finish transmitting a single message. Depending on the number of buffers in the MCB, this will probably work fine until other network activity occurs. When other network activity occurrs (such as file transfer to the vax, or terminal activity), congestion loss will start up. In this case, since the actual delay of messages isn't increasing, you want to increase %NSWGT to avoid changing wildly every time a message is retransmitted. You also want to set %NSRUF to provide an upper limit on how high the delay can get. The danger here is setting it so low that congestion hasn't been relieved by the time we retransmit, or setting it so high that performance goes to zero. Scenario C: TOPS10 - DTE - DN20/MCB - DMR(56kb) - DN20/MCB - TOPS20 File transfer activity from TOPS10 to TOPS20. Performance varies wildly depending on load on TOPS20 system, including broken links if the load gets too high on the TOPS20 system. The dominant theme here is the fact that TOPS20 (5.1 and 6.0) will vary the delay for message response. If the load is light, and the job receiving messages is runnable, the turnaround will be fast. If the job gets blocked or pages out, the acks will not be forthcoming until the job unblocks and receives the messages, which can be a long time. We have observed cases where the delay to a TOPS20 system was less that 200 milliseconds, and suddenly a message didn't receive an ack for over 20 seconds - Apparantley the job was paged out, and there were other processes with higher priority running. In this case, the only thing you can do is to protect yourself against the delay changing drastically. We would suggest that you should limit yourself to attempting to keep the link open and not worry about speed. In this case, increase %NSFLR to something large, which will cause retransmissions to take a long time, but will allow the link to survive long periods with no activity. ALso increase %NSRTH, to increase even further the odds of living through a drought of messages. These scenarios provide idealized situations. Customers are likely to have a combination of the above situations, or something else entirely, and possibly the above mentioned controls are not enough. A situation where a customer needs different controls over different nodes might occur, for example. The routine in LLINKS is UPDELAY, and the location of interest to anyone wanting to patch this is UPDLY1, where we have in T1 the new delay to the node. At this point we are about to range check against NSPFLR and NSPRUF, and then store it away. If you are attempting to insert some extra site-dependant knowledge into this algorithm, this would be the place to do it. There are two tools supplied which should help you understand what is happening in your network - DNSNUP/DNTATL and DCNSPY. DNSNUP will write out to disk EVERY message that passes through ROUTER. This output can be later be converted to readable form with DNTATL, so you can analyze where messages got lost and possibly why. DCNSPY is a DPY tool which allows you to watch links in real time. The fields displayed are defined in D36PAR, where the convention is: Five character name, first two characters are the name of the structure, last three characters are the name of the field. The structure is found as "BEGSTR xx", and the field within is found as either "WORD xxx" or "FIELD xxx", depending on its size. There are a limited number of comments/detailed descriptions for the fields available within DCNSPY with the COMMENT switch. Since these descriptions are at least two years old, it may be possible to find a more up-to-date or complete description in D36PAR itself. END COMMENT ~ SUBTTL DECNET NETWORK DATA BASE -- INTERLOCKS ;D36PIN AND D36PIF - TAKE AND RELEASE THE DECNET INTERLOCK. ;CALL: JSP CX,D36PIF/D36PIN ; ;WITH/WITHOUT THE INTERLOCK ; ;PRESERVES ALL ACS EXCEPT CX ;NOTE - CX IS A DECNET SCRATCH AC WHICH IS HARDWIRED TO BE R CX==R D36PIF::CONO PI,NETPIF## ;MAKE SURE NOONE ON THIS CPU INTERRUPTS US SKIPGE D36LCK ;GIVE OTHER CPUS A CHANCE AOSE D36LCK ;MAKE SURE NOONE ON ANOTHER CPU GETS US JRST .-2 ;WAIT APRID D36AID ;RECORD WHO HAS THE INTERLOCK MOVEM CX,D36PPC ;SAVE CALLING PC FOR TRACKING PURPOSES JRST (CX) ;RETURN TO CALLER WITH INTERLOCK SET D36PIN::SETZM D36AID ;WE NO LONGER OWN THE INTERLOCK SETOM D36LCK ;ALLOW OTHER CPU IN CONO PI,NETPIN## ;ALLOW PENDING INTERRUPTS ON THIS CPU IN JRST (CX) ;RETURN $LOW D36LCK::-1 ;ACTUAL AOSED WORD D36AID::-1 ;KEEPS TRACK OF WHICH CPU HAS THE INTERLOCK D36PPC::-1 ;KEEPS TRACK OF WHERE WE GOT THE INTERLOCK PURGE CX SUBTTL DECNET NETWORK DATA BASE -- LINE INITIALIZATION ;ROUTINES TO INITIALIZE LINES, AND ASK ROUTER TO INTIALIZE DECNET LINES DEFINE DEFLIN,< IFN FTKS10,< DEFKS > IFN FTKL10,< CPUNN=0 REPEAT M.CPU,< IFN FTKL10,DEFKL(\CPUNN) CPUNN==CPUNN+1 > ;END OF REPEAT M.CPU > ;END OF IFN FTKL10 > ;END OF DEFINE DEFLIN DEFINE DEFKL(CPU),< > ;END OF DEFINE DEFKL DEFINE DEFKS,< KDPNN==0 REPEAT M.KDUP,< DEFKDP(\KDPNN) KDPNN==KDPNN+1 > DMRNN==0 REPEAT M.DMRN,< DEFDMR(\DMRNN) DMRNN==DMRNN+1 > > ;END OF DEFINE DEFKS DEFINE DEFKDP(KDPNO),< IFE M.'KDPNO'KDP-DD.DEC,< MOVEI T1,DC.IOC ;;FUNCTION INITIATIZE CIRCUIT BLOCK SETZ T2, ;;NO DNADLL ID MOVE T3,[1B0+] ;;GET CURRENT LINE ID SNCALL (KDIPPI##,MS.HGH) ;;TELL DNADLL ABOUT THIS LINE JFCL ;;IGNORE ERROR > > ;END DEFINITION OF DEFKDP DEFINE DEFDMR(DMRNO),< IFE M.'DMRNO'DMR-DD.DEC,< MOVEI T1,DC.IOC ;;FUNCTION INITIATIZE CIRCUIT BLOCK SETZ T2, ;;NO DNADLL ID MOVSI T3,(1B0+) ;;GET CURRENT LINE ID SNCALL (DMIPPI##,MS.HGH) ;;TELL DNADLL ABOUT THIS LINE JFCL ;;IGNORE ERROR > > ;END DEFINITION OF DEFDMR $XHIGH D36LIN::DEFLIN ;DEFAULT THE LINES WHICH HAVE TO BE POPJ P, ;RETURN $HIGH SUBTTL DECNET NETWORK DATA BASE -- THE "NOBODY" KONTROLLER ;NOBDSP SERVES BASICALLY AS A PLACE-HOLDER FOR THE VARIOUS LINE ;DRIVERS TO DISPATCH TO FOR USER "NOBODY". NOBDSP:: NOBSTP: STOPCD CPOPJ##,DEBUG,NOB, ;++ "NOBODY" KONTROLLER DISPATCH GOT CALLED >;END OF IFN M.DECN SUBTTL DECNET NETWORK DATA BASE -- DUMMY GLOBALS IFE M.DECN,< EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,CPOPJ##,) EQUATE (GLOBAL,0,) EQUATE (GLOBAL,NULGTB##,) EQUATE (GLOBAL,MONORG,) EQUATE (GLOBAL,S..NDL,) EQUATE (GLOBAL,DCNZER,) ;THIS STOPCODE CALLED IF WE TRY TO CALL A DECNET ROUTINE WITH NO DECNET STOPCD .,STOP,NDL ;++ NO DECNET LOADED DCNZER: EXP 0 > ;END IFE M.DECN SUBTTL DECTAPE DATA BASE FOR DTASER $LOW ;DECTAPE ENTRY POINT AND BIT DEFINITIONS IFG M.DTXN,< ND M.DTAE,0 ;DEFAULT TO NO DECTAPE ERROR LOGGING EXTERN DTASER ;TD10 WITH NEW FORMAT > ;END IFG M.DTXN IFE M.DTXN,< ;IF NO DECTAPES, SATISFY GLOBALS BY DEFINING DUMMIES DTASEC==:CPOPJ## DTADDB==:CPOPJ## ;THIS WORKS BECAUSE SYSINI DOES A ; MOVEI W,DTADDB## DTXINI==:0 ; FOLLOWED BY AN XCT DTXINI##(W) DSCON==:0 LVFLAG==:0 USEWRD==:0 DCONS==:0 DTADSP==:0 OWNDTC==:CPOPJ## SCDDT==:CPOPJ## DTXFRE==:CPOPJ## $HIGH UNWDTC:: SETZ T3, POPJ P, $LOW > DEFINE DTDDB(X,Y,CPUN)< SUBTTL INTERRUPT HEAD FOR DT'X ;FLAGS LEVEL CODE ;CONTROL DEPENDENT PORTION OF DECTAPE SERVICE DEFINE CDC (C,B) < C=:.-DT'X'DDB ;RELATIVE LOCATION WITHIN CONTROL BLOCK B> ;MODEL DEVICE DATA BLOCK DTXDDB=:.-DT'X'DDB DT'X'DDB::SIXBIT /DT'X'0/ ;(0) - DEVNAM XWD <^D6*HUNGST>,200 ;(1) - DEVCHR 0 ;(2) - DEVIOS EXP DTADSP## ;(3) - DEVSER XWD 1107,154403 ;(4) - DEVMOD 0 ;(5) - DEVLOG 0 ;(6) - DEVBUF 0 ;(7) - DEVIAD 0 ;(10) - DEVOAD 0 ;(11) - DEVSTS XWD .TYDTA*.TYEST,0 ;(12) - DEVSTA 0 ;(13) - DEVXTR 0 ;(14) - DEVEVM 0 ;(15) - DEVPSI 0 ;(16) - DEVESE 0 ;(17) - DEVHCW BYTE (3)CPUN(33)0 ;(20) - DEVCPU 0 ;(21) - DEVISN 0 ;(22) - DEVDRV 0 ;(23) - DEVJOB 0 ; - DEVFIL 0 ; - DEVEXT 0 ; - FSTBLK DT'X'DIR+DT'X'DDB ; - DLOC 0 ; - IBLK 0 ; - OBLK 0 ; - DISPAD 0 ; - DMPLST 0 ; - SVDWRD 0 ; - DJOTOP 0 ; - DJOBOT 0 ; - BADCOM 0 ; - DTXBLK 0 ; - DTXRID 0 ; - DTXWRD 0 ; - DTXWWT DT'X'DIR==:.-DT'X'DDB BLOCK 200 XP DT'X'DDS,.-DT'X'DDB ;DATA LEVEL CODE...CHANNEL 1 OR 2 USUALLY D'X'DINT::CONSO DAS,1 ;DATA INTERRUPT FOR THIS CONTROL? JRST . ;NO- PROCEED DOWN CHAIN SKIPN DT'X'USE ;EXPECTING AN INTERRUPT? JRST D'X'DINT+1 ;NO, IGNORE IT SKIPE D'X'DSRC ;ARE WE SEARCHING FOR BLOCK NUMBERS? JRST D'X'SRCH ;YES D'X'IOWD:BLKI DAC,DT'X'PNT ;EXECUTE BLKI OR BLKO FOR THIS UNIT JRST D'X'DTHR ;POINTER RAN OUT D'X'DCTN:JFCL ;GOING REVERSE? XJEN D'X'DCHL## SOS DT'X'PNT ;YES- DECREMENT POINTER SOS DT'X'PNT ;TWICE XJEN D'X'DCHL## D'X'DTHR:SKIPE D'X'DDMP ;DUMP MODE POINTER RAN OUT? JRST D'X'DMPA ;YES- ADVANCE POINTER D'X'DFNS:CONO DAS,770001 ;SEND OUT FUNCTION STOP IF THROUGH XJEN D'X'DCHL## D'X'DSRC:CDC DTXSRC,0 ;SET NEGATIVE WHEN READING BLOCK NUMBERS ;HERE WHEN READING BLOCK NUMBERS AT DATA INTERRUPT LEVEL D'X'SRCH:JSR D'X'DSAV## ;SAVE ACS D'X'CCNC:CONI DAC,W ;READ FLAGS REGISTER HRLZS W ;PUT MOST FLAGS INTO LEFT HALF HRRI W,DT'X'DDB ;POINT TO THIS CONTROL BLOCK JRST SRCH## ;DO THE SEARCH D'X'DMPA:JSR D'X'DSAV## ;SAVE ACS HRRZI W,DT'X'DDB ;POINT TO CONTROL A JRST DMPADV## ;PROCESS THE EXHAUSTED BLKI/O XP DTSFNS,D'X'DFNS-DT'X'DDB XP DXDINT,D'X'DINT-DT'X'DDB XP DXIOWD,D'X'IOWD-DT'X'DDB XP DXDCTN,D'X'DCTN-DT'X'DDB D'X'CNUM:CDC DXCNUM,<B11>;CONTROL NUMBER ;FLAGS LEVEL INTERRUPT HEAD... DT'X'INT::CONSO DAS,770000 ;INTERRUPT FOR THIS CONTROL? JRST . ;NO- PROCEED DOWN CHAIN SKIPN DT'X'USE JRST DT'X'INT+1 JSR DT'X'SAV## ;YES- SAV ACCUMULATORS FOR THIS LEVEL CDC DXCCNT,;READ FLAGS INTO T1 CDC DTSCNI,;READ STATUS INTO T4 HRLZI W,(T1) ;PUT FLAGS (RH) INTO W (LH) HRRI W,DT'X'DDB ;ADDRESS OF CONTROL DEPENDANT BLOCK JRST DTXINT## ;TO NON-CONTROL DEPENDANT SECTION CDC DTSCN2,;STATUS REGISTER INTO T1 ;CONSTANTS REQUIRED FOR EACH CONTROL... CDC BFPNTR, DT'X'USE:CDC USEWRD,0 CDC ADRPRG,0 DT'X'PNT:CDC PNTR,0 CDC DISTNC,0 CDC BLOCK,0 CDC QUANTM,0 CDC DSCON,0 CDC RVERS,0 CDC ERRCNT,0 CDC FNDTMP,0 CDC IOWRIT,0 CDC TURNCT,0 CDC BLKWRD,0 CDC LVFLAG,0 CDC BLKCNT,0 CDC SVPNTR,0 CDC USPNTR,0 CDC DIRCTN,0 DT'X'BUF=.-DT'X'DDB D'X'BUF:CDC BUF, ;A CONTROL MONITOR BUFFER CDC DTXCON, ;CONDITIONS OUT - A CONTROL A CDC DTXSTP, ;STOP SELECTED TAPE CDC DTXTRN, ;TURN SELECTED TAPE AROUND CDC DTSCO2, CDC DTSENJ, ;ENABLE JOB DONE CDC DTXREQ,-1 ;# OF WAITERS CDC DTXWAT,0 ;REQUEST INTERLOCK FOR THIS CONTROL D'X'DDMP:CDC DTXDMP,0 ;SET TO -1 WHEN READING IN DUMP MODE XP DTXIOG,.-DT'X'DDB CONO DAC,DTBOTH##(T2) ;START UP DECTAPE CONO DAS,770000 ;ENABLE INTERRUPT CONDITIONS POPJ P, ;RETURN CDC DTXSF, ;SKIP IF GOING FORWARD CDC DTXDSL, ;STOP AND DESELECT TAPE CDC DTXDST, ;DESELECT TAPE CDC DTXSTO, ;STOP AND DESELECT CDC DTXTR2, ;TURN TAPE, SEARCH FOR BLOCKS CDC DTXINI, ;SHUT DOWN CONTROL CDC DTXDTI, ;READ A BLOCK NUMBER XP DCONS,.-DT'X'DDB >;END DEFINE DTDDB DEFINE GENDTA(CPU,CPUN)< ZZZZ==0 REPEAT M'CPU'TD10,< IFE ZZZZ&1, IFN ZZZZ&1, DAS==DAC+4 DTDDB (\"ZZZ,\,CPUN) ZZZ==ZZZ+1 ZZZZ==ZZZZ+1 >;END REPEAT M'CPU'TD10 >;END DEFINE GENDTA ZZ==0 ZZZ=="A" REPEAT M.CPU,< GENDTA (\ZZ,ZZ) ZZ==ZZ+1 >;END REPEAT M.CPU KONEND:: ;END OF KONTROLLER DATA BLOCKS ;DDB MAGIC CELLS FSTBLK==:DEVPPN DLOC==:FSTBLK+1 ;LH==BLOCK# DURING DEAD RECKONING,RH==ADDRESS OF DIR IBLK==:FSTBLK+2 ;LH==INDEX OF INPUT FILE(1-27),RH==BLOCK# TO READ NEXT OBLK==:FSTBLK+3 DISPAD==:FSTBLK+4 DMPLST==:FSTBLK+5 SVDWRD==:FSTBLK+6 DJOTOP==:FSTBLK+7 DJOBOT==:FSTBLK+10 BADCOM==:FSTBLK+11 DTXBLK==:BADCOM+1 ;NUMBER OF LAST I/O BLOCK,,CONI DTS BITS DTXRID==:DTXBLK+1 ;SIXBIT REEL ID DTXWRD==:DTXRID+1 ;WORDS READ DTXWWT==:DTXWRD+1 ;WORDS WRITTEN SUBTTL DA28 DATA BASE (XTCSER) IFN M.XTC,< XP MX11BF,^D129 ;MAXIMUM PDP-11 IMAGE BINARY BUFFER SIZE DEFINE XTCDEF (X),< IFNDEF XT'X'S, IFNDEF XT'X'C, XP XKBSKP,400450 XT'X'INT:: CONSO XT'X'C,XKBSKP ;EXTERNAL PROCESSOR INTERRUPT? JRST .-1 ;NO, GO DOWN THE SKIP CHAIN JSR XT'X'SAV## ;SAVE ALL THE AC'S PUSHJ P,SAVE4## ; .. JSP W,XTCINT## ;CALL XTCSER XP XTCCHN,XT'X'CHN## DEFINE XTLNK (A) < IFN A-M.XTC,< XKBKDB::!EXP XKB'A' ;LINK TO NEXT KDB > IFE A-M.XTC,< XKBKDB::!EXP 0 ;NO MORE KDB'S > > XP XKBINT, Z=X+1 XKB'X:: PHASE 0 ;BEGIN CONTROLLER DATA BLOCK XKBNAM::!XWD 'EPA'+X,0 ;EP NAME XTLNK \Z ;LINK TO NEXT KDB XKBUDB::!BLOCK 21 ;SPACE FOR LINKS TO UDBS XTSCNO::!CONO XT'X'S,(T1) XTCCNO::!CONO XT'X'C,(T1) XTSCNI::!CONI XT'X'S,T1 XTCCNI::!CONI XT'X'C,T1 XTSDTI::!DATAI XT'X'S,T1 XTCDTI::!DATAI XT'X'C,T1 XTCDTO::!DATAO XT'X'C,T1 XTSDTO::!DATAO XT'X'S,T2 XTCBSY::!CONSZ XT'X'C,20 XKBLOK::!EXP -1 ;INTERLOCK XKBDDB::!BLOCK 1 ;POINTER TO DDB WAITING FOR INTRPT XKBIUN::!BLOCK 1 ;POINTER TO UDB WAITING FOR INTERRUPT XKBDAC::!BLOCK 1 ;INFO FROM LAST CONI DAC XKBDAS::!BLOCK 1 ;INFO FROM LAST CONI DAS XKBTIM::!BLOCK 1 ;COUNTER FOR TIMEOUT XKBIOW::!BLOCK 1 ;IOWD FOR DAC OR PNTR TO IOLIST XKBCUR::!BLOCK 1 ;CUR PNTR TO IOLIST (KI10 ONLY) XKBGRB::!Z ;0 IF FREE 1 IF GRABBING ;CONTROL -1 IF GRABBED XKBPAC::!BLOCK 1 ;# OF PSEUDO ACTIVE DDB'S ON THIS ; CONTROLLER XKBREQ::!BLOCK 1 ;OLDEST JOB # REQUESTING USE OF UDB XKBMBF::!BLOCK /2 ;MONITOR BUFFER DEPHASE > ZZ=0 IFE M.XTC,< XTUUO==:CPOPJ## ;NO XTUUO IF NO XTCSER XTKLDB==:CPOPJ## ;ALSO NO DDB KILLER XTCTTY::AOS (P) ;DOUBLE SKIP JRST CPOPJ1## XTCTYP==:CPOPJ## > IFN M.XTC, ;LOAD XTCSER IF NEEDED REPEAT M.XTC,< XTCDEF (\ZZ) ZZ=ZZ+1 > > SUBTTL Database for RX20s on 2020s IFE M.KS10, IFN M.RX20,< EXTERN RX2SER ;Load device driver ;Macro to define prototype DDB for each RX20 CTLlr (RXA,RXB,...) DEFINE RX2DDB(x,CPU),< RX'x'INT::EXP 0,0,IC.UOU,.+1 ;Vectored interrupts XPCW here EXCH T1,RX'x'INT ;Get interrupt PC MOVEM T1,RX'x'CHL## ;Save for RESn MOVE T1,RX'x'INT+1 ;;Second word of PC MOVEM T1,RX'x'CHL##+1 ;;... MOVE T1,RX'x'INT ;Restore state JSR RX'x'SAV## ;Save ACs JSP F,RX2INT## ;Set up F and join RX2SER RX'x'DDB::PHASE 0 EXP ;(0) DEVNAM for prototype DDB this CTL XWD <^D5*HUNGST>,201 ;(1) DEVCHR EXP 0 ;(2) DEVIOS EXP RX2DSP## ;(3) DEVSER XWD DVLNG!DVIN!DVOUT,^D<1B<35-I>> ;(4) DEVMOD EXP 0 ;(5) DEVLOG EXP 0 ;(6) DEVBUF EXP 0 ;(7) DEVIAD EXP 0 ;(10) DEVOAD EXP 0 ;(11) DEVSTS XWD DEPLEN!<.TYRX2*.TYEST>,DEPEVM ;(12) DEVSTA EXP 0 ;(13) DEVXTR EXP 0 ;(14) DEVEVM EXP 0 ;(15) DEVPSI EXP 0 ;(16) DEVESE EXP 0 ;(17) DEVHCW - Hard errors,,Soft errors BYTE (3)CPU(33)0 ;(20) DEVCPU EXP 0 ;(21) DEVISN (Must leave space) EXP 0 ;(22) DEVDRV EXP 0 ;(23) DEVJOB EXP 0 ;(24) DEVFIL EXP 0 ;(25) DEVEXT EXP 0 ;(26) DEVPPN DEVRXO::!EXP 0 ;(27) DEVRXO DEVRXI::!EXP 0 ;(30) DEVRXI DEVRXQ::!EXP 0,0,0,0 ;(31) DDB and CSR queue element RX'x'DDS::! ;End of device DDB DEVRXS::!EXP 0 ;DEVRXS ;Start of CTL data DEVRXV::!EXP RX21IV+<<"x"-"A">*4> ;Interrupt vector DEVRXC::!EXP RX21BA+<<"x"-"A">*10> ;CSR address DEVRXM::!EXP 0 ;UBA mapping reg addr (2 slots/RX) DEVRXE::!EXP 0 ;11 address of mapped buffer DEVRXJ::!XPCW RX'x'INT ;Instruction to set up vector table with Dephase >;End of define RX2DDB DEFINE GENRX2(CPU,CPUN)< ZZZZ==0 REPEAT M'CPU'RX20,< RX2DDB (\"ZZZ,CPUN) ZZZ==ZZZ+1 ZZZZ==ZZZZ+1 >;;End repeat >;End define ZZ==0 ZZZ=="A" REPEAT M.CPU,< GENRX2 (\ZZ,ZZ) ZZ==ZZ+1 >;End repeat >;End M.RX20 SUBTTL DEFINITIONS FOR DISPLAY AND LIGHT PEN ;DISPLAY AND LITE PEN IFG M.DIS, < IFN M.VP10, EXTERN DISSER XP DISJSR,DISBLK##+1 ;DIS JSR LOCATION IN LOWER CORE XP ONDIS,DISBTH##+100 XP NONDIS,DISBTH## XP OFFDIS,0 XP DISPON,2000+DISBIT## ;CONO PI, TURNS DIS PI CHANNEL ON XP DISPOF,1000+DISBIT## ;CONO PI, TURNS DIS PI CHANNEL OFF DISCON: IFN M.340, ;END OF IFN M.340 IFE M.340, ;SET DISPLAY READY BIT & BRIGHTNESS = 3. MOVEM T1,DISCON JRST DISIN1## PENINT::CONSO DIS,0 ;CHECK FOR CONI FLAGS JRST PENINT ;THIS INSTRUCTION CHANGED TO LINK IN INTERRUPT CHAIN. DATAI DIS,PENLOC## ;CLEAR PEN INTERRUPT MOVEM T1,PENLOC## ;SAVE AC T1 MOVE T1,DISBKO## ;GET ABSOLUTE ADDRESS OF NEXT DATA ELEMENT SUB T1,DISREL## ;MAKE RELATIVE HRRZS T1 ;CLEAR OUT GARBAGE IN LH EXCH T1,PENLOC## ;SAVE ADDRESS IN PENLOC XJEN PENCHL## ENDCHK::JUMPE T1,EXIT1## ;END OF LIST? TRNE T1,-1 ;NO, CHANGE INTENSITY COMMAND? JRST EXIT0## ;NO MOVSS T1 ;YES, LH HAS USER CONO BITS DPB T1,INPNT ;DEPOSIT FOR CONO CONO DIS,@DISCON ;SET NEW INTENSITY JRST DISNX1## INPNT: IFN M.VP10, > ;END OF IFE M.340 DISCNA::CONO DIS,@DISCON DISCZA::CONSZ DIS,@DISCON BLKLIT::BLKO DIS,DISBKO## DISCNO::CONO DIS,OFFDIS DISCNI::CONI DIS,DISSTS## DISTST::CONO DIS,DISCHN## > ;END OF IFG M.DIS IFN M.VBXC, IFN FTKL10,<;DO THIS STUFF ONLY FOR KL CPU'S ;DEFINE SYMBOLS AND STORAGE FOR RSX-20F ASYNC TERMINALS $HIGH ;THIS PART INTO THE HIGH SEGMENT DEFINE RSXDTE(C,D),< IFE D,< EXP $TTOFS $TTOFS==$TTOFS+M'C'TTDN > > $TTOFS==TTDLAL ;INITIALIZE SYMBOL USED IN FOLLOWING MACRO TTDOFS::RSX20F ;TABLE OF TTD LINE TABLE OFFSETS EXP $TTOFS ;FIRST LINE AFTER DTE DRIVEN LINES TTDLOM==:TTDOFS+1 ;BASE OF RANGE CHECK TABLE TTDDSO==: ;TRANSLATION FOR DSCTAB ENTRIES >;END IFN FTKL10 SUBTTL ROUTINES COMMON TO PDP11 COMM FRONT-END'S ON DL10'S IFN PDP11N,< DLMAP $HIGH ;SUBROUTINE TO PROCESS THE COMMAND: ; .SET NOMESSAGE PDP11 N ;CALL WITH: ; PUSHJ P,D76SIL ; RETURN HERE OR JRST COMERA D76SIL::PUSHJ P,DECIN## ;READ A DECIMAL NUMBER JRST D76SIP ;NO NUMBER ASSUME ZERO CAIA ;ILLEGAL CHARACTER MAYBE JRST D76SIP ;OK GOT A DIGIT CAIE T3,"*" ;WILD CARD JRST COMERA## ;NO, ERROR MOVEI T2,7 ;YES, SET SIL ON ALL PDP11'S PUSHJ P,D76SIA ;CONTINUE JFCL ;IGNORE IF NOT THERE SOJGE T2,.-2 ;CONTINUE POPJ P, ;RETURN D76SIP: PUSHJ P,D76SIA ;GO SILENCE THIS 76 JRST COMERA## ;LOST, GIVE ERROR POPJ P, ;RETURN D76SIA: SKIPL T2 ;.LT. 0 IS WRONG. CAIL T2,10 ;SKIP IF PORT .LT. 8 POPJ P, ;INVALID PORT # IFN M.DAS78,< CAILE T2,M78HPO## ;SEE IF THIS PORT EXISTS ON A DAS78 JRST D76SI1 ;NO, TRY OTHER 11S SKIPE T1,M78BAT##(T2) ;IF A DAS78 THEN JRST D76SI0 ; ALL SET > ;END IFN M.DAS78 D76SI1: SKIPE T1,DLXBAT##(T2) ;IF NO KNOWN PORT OR SKIPN T1,DLXWIN##(T1) ; NO WINDOW ASSIGNED THEN POPJ P, ; COMPLAIN D76SI0: SKIPG DWN(T1) ;IS THE PDP11 DOWN? SETOM DWN(T1) ;YES--TURN OFF THE MESSAGE JRST CPOPJ1## ;RETURN $LOW > ;END OF IFN PDP11N IFN ,< ;IF ANY DL10 BASED 11S BUT NOT DAS78S ;ROUTINE TO GET ERROR STATUS AND CALL DAEMON FOR AN ERROR ;ON A DC76, DN85 OR DN60 ;ARGUMENTS T1=PORT # OF 11 WITH ERROR DLB==60 ;DEVICE CODE FOR DL10 DLC==64 ;DEVICE CODE FOR DL10 DLBREG==3 ;NUMBER OF HIGHEST CONI DLB, WE DO DLBEDT==0 ;VALUE OF R FOR DATAI DLB, WE WANT TO SAVE $HIGH DL10EL::MOVEM T1,DLEPRT ;SAVE THE PORT OF THE 11 WITH ERROR MOVE T2,DLXNMT##(P2) ;GET NAME MOVEM T2,DLEPGM ;SAVE HRLZ T2,DLXTYP##(P2) MOVEM T2,DLESTS MOVE T2,DLXWIN##(P2) MOVE T2,HLT(T2) HRRM T2,DLESTS CONI DLC,DLCCNI ;GET THE DLC CONI DATAI DLC,DLCDTI ; AND DATAI MOVEI T1,DLBREG ;GET NUMBER OF REGS TO SAVE OF DLB DLBLUP: DPB T1,[POINT 2,DLBDTO,5] ;PUT REG INTO DATAO DATAO DLB,DLBDTO ;AND DO DATAO SO CONI GETS RIGHT REG CONI DLB,DLBCNI(T1) ;GET THIS DLB CONI CAIN T1,DLBEDT ;IS THIS THE DATAI WE WANT? DATAI DLB,DLBDTI ;YES, GET IT SOJGE T1,DLBLUP ;AND LOOP BACK FOR NEXT REG MOVEI T1,.ERDLE ;GET CODE FOR ERROR RPT UUO HRLI T1,DLEBLK ;AND ADDRESS FOR DAEMON TO LOOK AT PJRST DAEEIM## ;AND GO WAKE DAEMON $LOW DLBDTO: XWD 1,0 ;BITS FOR DATAO DLB, DLEBLK:-DLELEN,,DLEPRT ;AOBJN POINTER FOR ERROR BLOCK DLEPRT: BLOCK 1 ;PORT OF 11 WITH ERROR DLCCNI: BLOCK 1 ;CONI DLC AT ERROR DLCDTI: BLOCK 1 ;DATAI DLC AT ERROR DLBCNI: BLOCK 4 ;BLOCK FOR CONI DLB'S DLBDTI: BLOCK 1 ;DATAI DLB WITH R=0 AT ERROR DLEPGM: BLOCK 1 ;SIXBIT PROGRAM NAME DLESTS: BLOCK 1 ;HALT STATUS DLELEN==.-DLEPRT > ;END IFN ;COME HERE ONCE A SECOND. IFN FTKS10*M.DN60,< DLXSEC::PUSH P,P1 ;SAVE P1 FOR A BIT IFN M.DN6K*M.KDUP,< ;IF ON A KS10 WITH IBM COMM MOVE P1,[XWD -M.KDUP,KDPBAS] ;GET AN AOBJN POINTER TO THE BASE TABLE DLXSE1: MOVE W,(P1) ;GET THE NEXT LINE PUSHJ P,D6KSEC## ;SET DN60 TIME OUT THE CALL11 FUNCTIONS AOBJN P1,DLXSE1 ;LOOP OVER ALL LINES >;M.DN6K IFN M.DN6R*M.DMRN,< ;IF ON A KS10 WITH IBM COMM MOVE P1,[XWD -M.DMRN,DMRBAS] ;GET AN AOBJN POINTER TO THE BASE TABLE DLXSE2: MOVE W,(P1) ;GET THE NEXT LINE PUSHJ P,D6KSEC## ;SET DN60 TIME OUT THE CALL11 FUNCTIONS AOBJN P1,DLXSE2 ;LOOP OVER ALL LINES >;M.DN6R POP P,P1 ;RESTORE P1 POPJ P, ; AND RETURN >; END IFN FTKS10 IFE FTKS10*M.DN60,< ;IF NOT ON A KS10 WITH IBM COMM IFE DL10XI, IFN DL10XI,< DLXSEC:: IFN M.CPU-1,< SKIPE .CPCPN## ;DL10'S CAN ONLY BE ON CPU0 POPJ P, > PUSHJ P,SAVE3## ;SAVE P1-P3 MOVSI P1,-10 ;AOBJN POINTER D76SC1: SKIPN P2,DLXBAT##(P1) ;GET BASE ADDRESS OF THIS PDP11 JRST D76S1L ;NO. SKIPN P3,DLXWIN##(P2) ;HAS IT A WINDOW? JRST D76S1L ;NO WINDOW IS NO GOOD SKIPG DLXDWN##(P3) ;IS THIS PDP11 UP? JRST D76NTR ;NO. SKIPN DLXHLT##(P3) ;YES, IS IT HALTED? JRST D76S2L ;NO. D76DWN: SKIPG DLXDWN##(P3) ;DO I THINK THE PDP11 IS UP? JRST D76S1L ;NO. XCT DLXCLR##(P2) ;YES, CLEAR ITS ENABLE. SETZM DLXDWN##(P3) ;AND MARK IT DOWN. XCT DLXPRG##(P2) ;DO ANY NECESSARY CLEAN UPS MOVE T1,P1 ;GET PORT # PUSHJ P,DL10EL ;LOG ERROR MOVSI T1,(JFCL) ;DISABLE ITS SERVICE ROUTINE MOVEM T1,DLXINI##(P2) SETZM DLXCAL##(P2) MOVEM T1,DLXPRG##(P2) D76S1L: AOBJN P1,D76SC1 ;TRY NEXT PDP11. POPJ P, ;NO MORE, ALL DONE. D76S2L: AOS T1,DLXOK##(P3) ;COUNT THE "OK" COUNTER CAIL T1,^D10 ;IS THE PDP11 STILL OK? JRST D76DWN ;NO, IT HAS GONE DOWN. JRST D76S1L ;YES, GO ON TO NEXT PDP11. ;COME HERE IF A PDP11 IS NOT RUNNING. D76NTR: XCT DLXCNI##(P2) ;CONI DLC,T1 MOVEI T2,22220 ;PORT ENABLE BITS ANDCM T2,T1 ;T2 GETS A 1 FOR EACH PDP11 ; NOT ENABLED LSH T2,-1 ;MOVE TO INTERRUPT BIT AND T2,T1 ;1 FOR EACH PDP11 LOADED BUT NOT ; YET STARTED. AND T2,DLXMSK##(P2) ;MASK OFF BITS FOR OTHER PDP11S JUMPE T2,D76S1L ;JUMP IF NOT OUR PDP11 SETZM DLXOK##(P3) ;NOT CRASHED YET SETZM DLXHLT##(P3) ;NOR HALTED SETZM TTP(P3) ;CLEAR THE Q'S SETZM TTG(P3) ;CLEAR THE Q'S SETZM TEP(P3) ;CLEAR THE Q'S SETZM TEG(P3) ;CLEAR THE Q'S SETZM DLXCEU##(P2) ;NO CAL11. USER MOVSI T1,767760 ;BUILD SIX BIT DL10 BYTE POINTER HRRI T1,DLXNMT##(P2) ;INTO DL10 BASE TABLE SETZM (T1) ;ZAP OLD NAME MOVEM T1,DLXNAM##(P3) ;STORE POINTER TO NAME MOVEI T1,2 ;KILL IF NO RESPONSE IN 2 SEC MOVEM T1,DLXDWN##(P3) ; BY MARKING PDP11 AS UP MOVE T1,[PUSHJ P,D76CKN] ;CHECK NAME ON INTERRUPT MOVEM T1,DLXINI##(P2) XCT DLXKAX##(P2) ;SPECIFY KA10 INTERRUPTS (IN CASE NOT DONE ALREADY) XCT DLXSWA##(P2) ;SET WINDOW ADDRESS XCT DLXENB##(P2) ;ENABLE PORT JRST D76S1L ;WAIT FOR INTERRUPT >; END IFN DL10XI CONDITIONAL >; END IFE FTKS10*M.DN60 IFN PDP11N,< ;COME HERE ON NEXT DL10 INTERRUPT FOR THIS PDP11. D76CKN: SKIPN T1,DLXNMT##(W) ;NAME SPECIFIED YET? POPJ P, ;NO. IFN M.DC75,< CAMN T1,[SIXBIT /DC75/] ;YES, DC75? JRST D75III## ;YES, START UP DC75. > IFN M.DC76,< CAMN T1,[SIXBIT /DC76/] ;NO, DC76? JRST D76III## ;YES, START UP DC76. > IFN DLX.60,> POPJ P, ;NO, IGNORE IT. ;COME HERE ONCE A MINUTE. IFE DL10XI, IFN DL10XI,< D76MIN::SKIPGE DEBUGF## ;DEBUGGING POPJ P, ;YES, NO MESSAGE PUSHJ P,SAVE3## ;SAVE P1-P3 MOVE P1,SYSUPT## ;GET UPTIME CAMGE P1,TICMIN## ;MORE THAN 1 MINUTE POPJ P, ;NO--TOO EARLY MOVSI P1,-10 ;MAXIMUM NUMBER OF PORTS D76MLP: SKIPE P2,DLXBAT##(P1) ;IS THIS PDP11 DEFINED? SKIPN P3,DLXWIN##(P2) ;YES, HAS IT A WINDOW? JRST D76MNX ;NO, LOOK AT NEXT PDP11 SKIPE DLXDWN##(P3) ;IS IT UP OR SILENCED? JRST D76MNX ;YES. MOVE T1,STATES## ;SCHED SETTINGS TRNE T1,ST.NOP ;IS THERE AN OPR IN ATTENDANCE? SETOM DLXDWN##(P3) ;NO, ONLY REPORT THE ERROR ONCE MOVE U,OPRLDB## ;NO, PRINT MESSAGE ON OPR'S TTY PUSHJ P,INLMES## ASCIZ / %%PDP-11 number / MOVE T1,DLXEPN##(P3) ;ELEVEN PORT NUMBER PUSHJ P,RADX10## ;PRINT THAT OUT SKIPE DLXHLT##(P3) ;HALTED? JRST D76HLT ;YES. PUSHJ P,INLMES## ;NO, JUST SAY NOT UP. ASCIZ / is not running. / JRST D76MNX ;CHECK NEXT PDP11 ;STILL IN IFN DL10XI AND IFN PDP11N CONDITIONALS ;COME HERE IF THE PDP11 IS ACTUALLY HALTED. D76HLT: PUSHJ P,INLMES## ASCIZ / halted at / MOVE T1,DLXHLT##(P3) ;GET HALT PC (OR STOP CODE) PUSHJ P,OCTPNT## ;TYPE IT OUT PUSHJ P,INLMES## ;END WITH A DOT ASCIZ /. / D76MNX: AOBJN P1,D76MLP ;CHECK THE REST OF THE PDP11S POPJ P, ;DONE THEM ALL--RETURN. $LOW > ;END OF IFN DL10XI CONDITIONAL > ;END OF IFN PDP11N SUBTTL TTY INIT SETUP TABLE $INIT ;THE FOLLOWING TABLE DESCRIBES FOR LINKTT (IN SCNSER) HOW TO SETUP ; THE LINE DATA BLOCKS FOR THEIR ASSOCIATED DRIVERS. ;FORMAT OF A TABLE ENTRY: ; -# OF LINES,,CPU # ; QUEUE HEADER,,ISR ; LDBISB BITS,,LTLUSE OR 0 EXTERN LIL7BT,LILCFE,LTLUSE ;DECLARE THE FLAGS WE CAN SET LNKTTB:: DEFINE TTDSPX(DSP,ADDON,CLEVER,ALLOC,QUEUE,CPU,DUMB),< IFN ADDON,< IF2,< .IF DSP,NEEDED, .IF QUEUE,NEEDED, > XWD -ADDON,CPU XWD QUEUE,DSP XXY== IFIDN , ;;DC76 IFIDN , ;;TOO DUMB TO HANDLE 8-BIT ASCII IFIDN , ;;NOT A REMOTE (ALLOCATABLE) LDB XWD XXY,XXZ ;;FLAGS >> ;END OF DEFINE TTDSPX DEFINE TTSPCP(CPU),< DC10N0==10*M'CPU'TTG0 DC10N1==10*M'CPU'TTG1 TTDSPX(DL0DSP,DC10N0,N,Y,DL0TQ'CPU,CPU) TTDSPX(DL1DSP,DC10N1,N,Y,DL1TQ'CPU,CPU) TTDSPX(CC0DSP,M'CPU'68L0,N,Y,CC0TQ'CPU,CPU) TTDSPX(CC1DSP,M'CPU'68L1,N,Y,CC1TQ'CPU,CPU) TTDSPX(DC760D,M'CPU'D70N,Y,Y,D70TQ'CPU,CPU) TTDSPX(DC761D,M'CPU'D71N,Y,Y,D71TQ'CPU,CPU) TTDSPX(DC762D,M'CPU'D72N,Y,Y,D72TQ'CPU,CPU) TTDSPX(DC763D,M'CPU'D73N,Y,Y,D73TQ'CPU,CPU) TTDSPX(DC764D,M'CPU'D74N,Y,Y,D74TQ'CPU,CPU) TTDSPX(DC765D,M'CPU'D75N,Y,Y,D75TQ'CPU,CPU) TTDSPX(DC766D,M'CPU'D76N,Y,Y,D76TQ'CPU,CPU) TTDSPX(DC767D,M'CPU'D77N,Y,Y,D77TQ'CPU,CPU) TTDSPX(DZDSP,M'CPU'DZNL,Y,Y,DZTQ'CPU,CPU,N) TTDSPX(TTDDSP,M'CPU'TTDN,Y,Y,.C'CPU'CTQ,CPU) > ;GENERATE LDB'S FOR LOCAL LINES ZZ==0 REPEAT M.CPU,< TTSPCP(\ZZ) ZZ==ZZ+1 > ;NOW GENERATE A POOL OF LDB'S FOR NETWORK TTYS ;ASSUME ALL ARE ON CPU0 SINCE NETWORK LDB'S ARE DYNAMICALLY ALLOCATED ; FROM THE POOL AND THE CORRECT OUTPUT QUEUE, CPU NUMBER, AND DISPATCH ; ARE FILLED IN BY THE NETWORK MODULE WHEN THE LDB IS USED TTDSPX(ERRDSP,M.RTTY,N,N,NULQUE,7,N) ;NOW GENERATE THE POOL FOR XTCSER TTDSPX(XTTDSP,M.XTL,N,Y,XTTQUE,0) ;KS10 KLINIK LINE IFN M.KS10,< DEFINE TTSPCP(CPU),< TTDSPX(CTYDSP,1,N,Y,.C'CPU'CTQ,CPU) > ZZ==M.CPU-1 REPEAT M.CPU,< TTSPCP(\ZZ) ZZ==ZZ-1 > >;END IFN M.KS10 ;NOW GENERATE AN LDB FOR INTERNAL FORCED COMMANDS TTDSPX(ERRDSP,1,N,Y,FRCQUE,7,N) ;NOW GENERATE LDB'S FOR THE CTYS DEFINE TTSPCP(CPU),< CT'CPU'LIN==:CTYLIN-CPU TTDSPX(CTYDSP,1,N,Y,.C'CPU'CTQ,CPU) > ZZ==M.CPU-1 REPEAT M.CPU,< TTSPCP(\ZZ) ZZ==ZZ-1 > IFN TCONLN-CT0LIN, ;NOW FOR THE PTYS TTDSPX(ERRDSP,M.PTY,N,Y,FRCQUE,7,N) ;FINALLY, DEFINE THE TABLE LENGTH FOR SCNSER LNKTTL==:.-LNKTTB PURGE XXY,XXZ,ZZ SUBTTL IPA20 CHANNEL I/O -- IPAICD - PROTOTYPE CONSO SKIP CHAIN CODE $CSUB IFN M.KL10&,< IPAICD::!PHASE 0 SKIPA IPABIT ;(00) A LITTLE TROUBLE TO CHECK FOR PI FLAGS IPAJRS:!JRST . ;(01) TRY NEXT DEVICE ON CHAIN MOVEM T1,IPAST1 ;(02) SAVE T1 A BIT CONI 0,T1 ;(03) GET CONI BITS TDNE T1,IPABIT ;(04) INTERRUPT FOR THIS DEVICE? JRST IPAEXC ;(05) YES MOVE T1,IPAST1 ;(06) GET SAVED T1 JRST IPAJRS ;(07) TRY NEXT DEVICE ON CHAIN IPAEXC:!EXCH T1,IPAST1 ;(10) GET SAVED T1 BACK, SAVE CONI STATUS BITS JSR PIERR## ;(11) SAVE AC'S, SET UP PDL MOVE T1,IPAST1 ;(12) GET BACK CONI STATUS BITS SKIPA W,.+1 ;(13) GET KDB ADDRESS EXP 0 ;(14) KDB ADDRESS XJRST .+1 ;(15) CALL INTERRUPT HANDLER EXP 0 ;(16) INTERRUPT HANDLER ADDRESS IPAST1:!EXP -1 ;(17) HOLDS T1 WHILE TESTING CONI BITS IPABIT:!EXP -1 ;(20) CONI BITS DEPHASE ;END OF PHASED CODE IPAICL==:.-IPAICD ;LENGTH OF CONSO SKIP CHAIN CODE > ;END IFN M.KL10& SUBTTL IPA20 CHANNEL I/O -- LDIPA - LOAD IPA20 CRAM ;ROUTINE TO LOAD AN IPA20 CRAM ;CALL: MOVE T1, ADDRESS OF MICROCODE STORAGE ; PUSHJ P,LDIPA ; ;MICROPROCESSOR IS RUNNING ; ;CHANNEL LOADED IFN M.KL10&,< $XSENT (LDIPA::) PUSHJ P,SAVE3## ;SAVE SOME ACS SETZ P1, ;INITIAL CRAM ADDRESS MOVSI P2,(!1B12) ;TWO-WORD BYTE POINTER MOVE P3,T1 ;INCLUDE MICROCODE STORAGE ADDRESS LDIPA1: MOVEI T1,5 ;5 BYTES PER CRAM MICROWORD SETZB T2,T3 ;START WITH EMPTY WORDS LDIPA2: ILDB T4,P2 ;GET A BYTE LSHC T2,^D12 ;APPEND IT TO THE WORD ADD T3,T4 ;... SOJN T1,LDIPA2 ;LOOP BACK FOR ALL 5 BYTES MOVE T1,P1 ;GET CRAM ADDRESS LSHC T2,6 ;SEPARATE CRAM HALFWORDS LSH T3,-6 ;... PUSHJ P,WTIPA ;WRITE THIS WORD INTO CRAM POPJ P, ;CHANNEL IS RUNNING CAIE P1,MAXCRA ;AT END OF IPA20 CRAM? AOJA P1,LDIPA1 ;NO, LOOP BACK FOR ENTIRE CRAM JRST CPOPJ1## ;RETURN $HIGH > ;END IFN M.KL10& SUBTTL IPA20 CHANNEL I/O -- DMPIPA - DUMP IPA20 DRAM ;ROUTINE TO DUMP THE IPA20 DRAM. ;CALL: ; W/ KDB ADDRESS ; PUSHJ P,DMPIPA ;RETURN: ; ;DUMP FAILED (MICROPROCESSOR RUNNING/NO BUFFER) ; ;DUMP SUCCEEDED IFN M.KL10&,< $XSENT (DMPIPA::) PUSHJ P,SAVE2## ;FREE UP P1 - P2 SETZ P1, ;INIT DRAM ADDRESS TO ZERO SKIPN P2,IPKDDB(W) ;IS THERE A DUMP BUFFER? POPJ P, ;NO, SORRY, WE TRIED MOVEI T1,DRMSIZ-1 ;CLEAR THE BUFFER FIRST AOS T3,P2 ;GET DESTINATION FOR XBLT SOS T2,P2 ;GET SOURCE SETZM (T2) ;CLEAR FIRST WORD EXTEND T1,[XBLT] ;ZERO REST OF BUFFER MOVEI T1,CO.CPT ;NOW FORCIBLY HALT THE CRITTER XCT KDBCNO(W) ;... DMPIP1: MOVE T1,P1 ;COPY DRAM ADDRESS PUSHJ P,READRM ;READ DRAM CONTENTS MOVEM T2,(P2) ;STORE IN BUFFER ADDI P2,1 ;BUMP BUFFER ADDRESS CAIGE P1,MAXDRA ;DONE ALL WORDS? AOJA P1,DMPIP1 ;LOOP FOR REMAINDER MOVEI T1,.ERICD ;CODE = IPA CHANNEL DUMP HRL T1,W ;DATA = KDB ADDRESS PUSH P,J ;SAVE J (NONSENSE) SNCALL (DAEEIM##,MCSEC0) ;PROD THE DEVIL JRST JPOPJ1## ;RESTORE J AND SKIP RETURN > ;END IFN M.KL10& ;ROUTINE TO READ A WORD OF THE IPA20 DRAM ;CALL: ; T1/ DRAM ADDRESS ; W/ KDB ADDRESS ; PUSHJ P,READRM ; ;T2/ DRAM CONTENTS IFN M.KL10&,< READRM: MOVE T2,[000001,,400073] ;CREATE MICRO INSTRUCTION TO READ DRAM MOVE T3,[002000,,220040] ;... DPB T1,[POINT 10,T2,29] ;INSERT DRAM ADDRESS SETZ T1, ;MAKE SURE RUN FLOP IS CLEAR XCT KDBCNO(W) ;... PUSHJ P,DRMPAR ;COMPUTE PARITY BIT MOVEI T1,0 ;CRAM ADDRESS PUSHJ P,WTIPA ;WRITE THE CRAM DATA JFCL ;SHOULDN'T FAIL MOVE T2,[000001,,600443] ;GET SECOND MICRO INSTRUCTION MOVE T3,[001000,,005040] ;... PUSHJ P,DRMPAR ;COMPUTE PARITY BIT MOVEI T1,1 ;CRAM ADDRESS PUSHJ P,WTIPA ;WRITE THE CRAM DATA JFCL ;SHOULDN'T FAIL MOVSI T2,(.DOLRA+) ;SELECT MICROCODE START ADDRESS XCT KDBDTO(W) ;... MOVEI T1,CO.MRN ;START MICROCODE XCT KDBCNO(W) SETZ T1, ;STOP MICROCODE XCT KDBCNO(W) MOVEI T1,CO.DTE ;SET DIAG_TEST_EBUF XCT KDBCNO(W) XCT KDBDTI(W) ;READ RESULTING VALUE (DRAM CONTENTS) POPJ P, ;RETURN > ;END IFN M.KL10& ;ROUTINE TO COMPUTE PARITY FOR A IPA20 MICROINSTRUCTION. ;CALL: ; T2&T3/ MICROINSTRUCTION ; PUSHJ P,DRMPAR ;ONLY RETURN IFN M.KL10&,< DRMPAR: PUSHJ P,SAVE2## ;SAVE P1-P2 DMOVE P1,T2 ;SAVE ORIGINAL MICROWORD CONTENTS TDZ P1,[000000,,400000] ;CLEAR PARITY BIT SETZ T3, ;INITIALIZE BIT COUNT MOVE T1,P1 ;GET FIRST MICROWORD MOVN T2,T1 ;NEGATE TDZE T1,T2 ;ANY ONE BITS LEFT? AOJA T3,.-2 ;YES, LOOP BACK TO COUNT THEM UP MOVE T1,P2 ;GET SECOND MICROWORD MOVN T2,T1 ;NEGATE TDZE T1,T2 ;ANY ONE BITS LEFT? AOJA T3,.-2 ;YES, LOOP BACK TO COUNT THEM UP TRNN T3,1 ;IS MICROWORD EVEN PARITY? TDO P1,[000000,,400000] ;YES, SET PARITY BIT DMOVE T2,P1 ;GET MICROWORD BACK WITH CORRECT PARITY POPJ P, ;RETURN > ;END IFN M.KL10& ;ROUTINE TO ALLOCATE A DRAM DUMP BUFFER FOR AN IPA20 DEVICE. SINCE ;THE DRAM IS 2 PAGES LONG, WE NORMALLY *DON'T* ALLOCATE THE BUFFER. ;PATCHING THE POPJ BELOW TO A JFCL WILL ENABLE DUMP BUFFERS. IFN M.KL10&,< $XSENT (IPAADB::) POPJ P, ;***PATCH TO JFCL TO ALLOCATE DUMP BUFFER MOVEI T1,(MS.MEM) ;PICK A SECTION, ANY SECTION MOVEI T2,DRMSIZ ;NUMBER OF WORDS IN BUFFER MOVEI T3,GFWNZN## ;ASSUME DONE DURING SYSTEM INITIALIZATION SKIPN DINITF## ;GOOD GUESS? MOVEI T3,GFWNZS## ;NOPE, WE DID OUR BEST PUSHJ P,(T3) ;CALL THE ROUTINE POPJ P, ;SORRY, COULDN'T HACK IT MOVEM T1,IPKDDB(W) ;STUFF AWAY THE BUFFER MOVE T2,T1 AOS T3,T1 ;BUILD A BLT WORD TO ZERO BUFFER MOVEI T1,DRMSIZ-1 ;NUMBER OF WORDS TO MOVE SETZM (T2) ;ZERO FIRST WORD EXTEND T1,[XBLT] ;ZERO REMAINDER OF BUFFER POPJ P, ;RETURN $HIGH >; END IFN FTKL10& SUBTTL IPA20 CHANNEL I/O -- RDLAR - READ LATCHED ADDRESS REGISTER ;ROUTINE CALLED TO READ CONTENTS OF LATCHED ADDRESS REGISTER ;CALL: MOVE W, KDB ADDRESS ; PUSHJ P,RDLAR ; ;CHANNEL IS RUNNING ; ;T1 CONTAINS CRAM ADDRESS IFN M.KL10&,< $XSENT (RDLAR::) PUSHJ P,AUTOWN## ;DO WE OWN THE DATA BASE INTERLOCK? JRST RDLAR1 ;NO--DO NORMAL STUFF PUSHJ P,SAVW## ;SAVE W XMOVEI W,.CPCNI##-KDBCNI ;FAKE KDB I/O INSTRUCTIONS RDLAR1: XCT KDBCNI(W) ;CONI DEV,T1 TRNE T1,CO.MRN ;CHANNEL RUNNING? POPJ P, ;ERROR MOVEI T1,CO.LAR ;SET LATCHED ADDRESS REGISTER FLAG XCT KDBCNO(W) ;CONO DEV,(T1) PUSH P,T2 ;SAVE T2 XCT KDBDTI(W) ;READ CONTENTS OF REGISTER SETZ T1, ;MAKE SURE CO.LAR IS CLEAR XCT KDBCNO(W) ;... LDB T1,[POINTR (T2,DT.LAR)] ;GET CORRECT FIELD POP P,T2 ;RESTORE T2 PJRST CPOPJ1## ;RETURN $HIGH > ;END IFN M.KL10& SUBTTL IPA20 CHANNEL I/O -- TYIPA - READ PORT TYPE ;IN THE IDEAL WORLD IT WOULD BE POSSIBLE TO INSTALL THE NIA20 OR ;CI20 IN EITHER OF THE MODIFIED INTERNAL CHANNEL BACKPLANE SLOTS ;IN THE KL10. UNFORTUNATELY, THERE IS NO EASY WAY TO TELL THE ;TWO TYPES OF DEVICES APART. THOSE WHO ARE FOOLISH ENOUGH TO ;BELIEVE THE DOCUMENTATION MIGHT DISAGREE, BUT THE ENGINEERS ;NEVER STRAPPED THE NIA20 AND CI20 TO RETURN DIFFERENT PORT TYPE ;FIELDS AS THE DOCUMENTATION LEADS ONE TO BELIEVE. ; ;DETERMINING THE PORT TYPE IS REALLY A FAIRLY STRIGHT FORWARD ;PROCESS. ON THE OFF BEAT CHANCE THAT THE PORT BOARDS ARE EVER ;ECO'ED, THE PORT TYPE FIELD IS THE FIRST THING CHECKED. IF THE ;VALUE RETURNED IS KNOWN, THEN THE APPROPRIATE CODE IS RETURNED. ;OTHERWISE, AN ATTEMPT TO FIGURE OUT THE PORT TYPE WILL BE MADE ;BASED ON THE BEHAVIOR OF THE DEVICE. IF THIS FAILS, THEN THE ;MONGEN'ED DEVICE TABLE IS USED TO INDICATE THE DEVICE CODE, ;THEREBY TELLING THE AUTOCONFIGURATION ROUTINES IF THEY HAVE ;FOUND THE RIGHT DEVICE. ;CALL: PUSHJ P,TYIPA ; ;UNKNOWN ; ;KNOWN (T1 = TYPE CODE) IFN M.KL10&,< $XSENT (TYIPA::) XCT .CPCNI## ;READ CHANNEL STATUS LDB T1,[POINTR (T1,CI.TYP)] ;GET PORT TYPE FIELD CAIE T1,.CIKNI ;KLNI? CAIN T1,.CIKLP ;KLIPA? JRST CPOPJ1## ;YES ;*** ADD CODE TO FIGURE OUT PORT TYPE POPJ P, ;RETURN $HIGH > ;END IFN M.KL10& SUBTTL IPA20 CHANNEL I/O -- RDIPA - READ CRAM ;READ THE CONTENTS OF A CRAM LOCATION ;CALL: MOVE W, KDB ADDRESS ;IF NORMAL TIMESHARING ; MOVE T1, CRAM ADDRESS ; PUSHJ P,RDIPA ; ;CHANNEL IS RUNNING ; ;T2 & T3 HAS THE CRAM CONTENTS ; ;ALL ACS ARE PRESERVED IFN M.KL10&,< $XSENT (RDIPA::) PUSHJ P,AUTOWN## ;DO WE OWN THE DATA BASE INTERLOCK? JRST RDIPA1 ;NO--DO NORMAL STUFF PUSHJ P,SAVW## ;SAVE W XMOVEI W,.CPCNI##-KDBCNI ;FAKE KDB I/O INSTRUCTIONS RDIPA1: PUSH P,T1 ;SAVE CRAM ADDRESS XCT KDBCNI(W) ;CONI DEV,T1 TRNN T1,CO.MRN ;CHANNEL RUNNING? JRST RDIPA2 ;NO--ALL IS WELL JRST TPOPJ## ;RETURN RDIPA2: SETZB T1,T2 ;MAKE SURE CO.LAR IS CLEAR XCT KDBCNO(W) ;CONO DEV,(T1) MOVE T1,(P) ;GET CRAM ADDRESS BACK DPB T1,[POINTR (T2,DO.RAR)] ;PUT ADDRESS INTO CORRECT FIELD TLO T2,(.DOLRA!DO.LHW) ;SET UP TO READ LEFT HALF CRAM MICRO-WORD PUSH P,T2 ;SAVE ARGUMENT XCT KDBDTO(W) ;SELECT LH CRAM ADDRESS XCT KDBDTI(W) ;READ LEFT HALF CRAM MICRO-WORD AND T2,[DT.CRM] ;KEEP ONLY LH CRAM DATA WORD EXCH T2,(P) ;SAVE LH CRAM MICRO-WORD & RETRIEVE ARGUMENT TLZ T2,(DO.LHW) ;SET UP TO READ RIGHT HALF CRAM MICRO-WORD XCT KDBDTO(W) ;SELECT RH CRAM ADDRESS XCT KDBDTI(W) ;READ RIGHT HALF CRAM MICRO-WORD AND T2,[DT.CRM] ;KEEP ONLY RH CRAM DATA WORD MOVE T3,T2 ;COPY RH CRAM MICRO-WORD POP P,T2 ;RETRIEVE LH CRAM MICRO-WORD POP P,T1 ;RESTORE CRAM ADDRESS PJRST CPOPJ1## ;AND RETURN $HIGH > ;END IFN M.KL10& SUBTTL IPA20 CHANNEL I/O -- WTIPA - WRITE CRAM ;WRITE THE CONTENTS OF A CRAM LOCATION ;CALL: MOVE W, KDB ADDRESS ;IF NORMAL TIMESHARING ; MOVE T1, CRAM ADDRESS ; MOVE T2, LEFT HALF CRAM MICRO-WORD ; MOVE T3, RIGHT HALF CRAM MICRO-WORD ; PUSHJ P,RDIPA ; ;CHANNEL IS RUNNING ; ;CRAM WORD WRITTEN ; ;ALL ACS ARE PRESERVED IFN M.KL10&,< $XSENT (WTIPA::) PUSHJ P,AUTOWN## ;DO WE OWN THE DATA BASE INTERLOCK? JRST WTIPA1 ;NO--DO NORMAL STUFF PUSHJ P,SAVW## ;SAVE W XMOVEI W,.CPCNI##-KDBCNI ;FAKE KDB I/O INSTRUCTIONS WTIPA1: PUSH P,T1 ;SAVE CRAM ADDRESS XCT KDBCNI(W) ;CONI DEV,T1 TRNN T1,CO.MRN ;CHANNEL RUNNING? JRST WTIPA2 ;NO--ALL IS WELL JRST TPOPJ## ;RETURN WTIPA2: PUSH P,T2 ;SAVE LH CRAM MICRO-WORD PUSH P,T3 ;SAVE RH CRAM MICRO-WORD SETZB T1,T2 ;MAKE SURE CO.LAR IS CLEAR XCT KDBCNO(W) ;CONO DEV,(T1) MOVE T1,-2(P) ;GET CRAM ADDRESS BACK DPB T1,[POINTR (T2,DO.RAR)] ;PUT ADDRESS INTO CORRECT FIELD TLO T2,(.DOLRA!DO.LHW) ;SET UP TO WRITE LEFT HALF CRAM MICRO-WORD PUSH P,T2 ;SAVE ARGUMENT XCT KDBDTO(W) ;SELECT LH CRAM ADDRESS MOVE T2,-2(P) ;GET LH CRAM MICRO-WORD AND T2,[DT.CRM] ;KEEP ONLY RH CRAM DATA WORD XCT KDBDTO(W) ;WRITE IT POP P,T2 ;GET ARGUMENT BACK TLZ T2,(DO.LHW) ;SET UP TO WRITE RIGHT HALF CRAM MICRO-WORD XCT KDBDTO(W) ;SELECT RH CRAM ADDRESS MOVE T2,(P) ;GET RH CRAM MICRO-WORD AND T2,[DT.CRM] ;KEEP ONLY RH CRAM DATA WORD XCT KDBDTO(W) ;WRITE IT POP P,T3 ;RESTORE RH CRAM MICRO-WORD POP P,T2 ;RESTORE LH CRAM MICRO-WORD POP P,T1 ;RESTORE CRAM ADDRESS JRST CPOPJ1## ;AND RETURN $HIGH > ;END IFN M.KL10& SUBTTL DX20 ADAPTER I/O -- DOCUMENTATION ;TECHNICAL INFORMATION AND TECHNIQUES FOR PROGRAMMING THE VARIOUS DEVICES ;MAY BE FOUND IN THE FOLLOWING DOCUMENTS: ; ; DX10 DATA CHANNEL MAINTENANCE MANUAL ADDENDUM, CHAPTERS 4-6, ; DOCUMENT NUMBER EK-DX10-AD-001, JUN 77 ; ; DX20 PROGRAMMED DEVICE ADAPTER TECHNICAL MANUAL, ; DOCUMENT NUMBER EK-0DX20-TM-001, FEB 78 ; ; DX20-V100 FUNCTIONAL SPECIFICATION MICROCODE, ; DOCUMENT NUMBER 105-220-001-00, MAR 78 ; ; DX20-V100 MAGNETIC TAPE SUBSYSTEM MICRO-CODE, ; DOCUMENT NUMBER MAINDEC-10-DXMCA-A-D, SEP 77 ; ; RH20 MASSBUS CONTROLLER UNIT DESCRIPTION, ; DOCUMENT NUMBER EK-RH20-UD-001, AUG 76 SUBTTL DX20 ADAPTER I/O -- REGISTER DEFINITIONS IFN M.KL10&,< .DXMTR==03B5 ;MAINTENANCE REGISTER MR.SCY==1B31 ;MICROPROCESSOR SINGLE CYCLE MR.STR==1B33 ;MICROPROCESSOR START MR.RES==1B34 ;MICROPROCESSOR RESET .DXDTR==06B5 ;DRIVE TYPE REGISTER .DXMIR==30B5 ;MICROCONTROLLER INSTRUCTION REGISTER .DXPCR==31B5 ;MICROPROCESSOR PC REGISTER PC.IRE==1B20 ;INSTRUCTION REGISTER ENABLE PC.MSE==1B21 ;MICROSTORE ENABLE PC.PCE==1B22 ;PC ENABLE PC.PCI==1B23 ;PC AUTO INCREMENT PC.MPC==7777B35 ;MICROPROCESSOR PC .DXIBR==36B5 ;DIAGNOSTIC REGISTER 7 DX.IBR==377 ;CONTENTS OF THE BR REGISTER .DXIPE==37B5 ;DIAGNOSTIC REGISTER 7 DX.IPE==1B22 ;INSTRUCTION REGISTER PARITY ERROR .CRM10==10 ;LOCATION IN THE CRAM CONTAINING A CODE ; CHECKED BY THE DRIVERS TO SEE IF THE ; MICROCODE IS VALID .DXSAD==1 ;FULL START ADDRESS FOR ALL VERSIONS ; OF THE DX20 MICROCODE >; END IFN M.KL10& SUBTTL DX20 ADAPTER I/O -- DXLOAD - LOAD DX20 MICROCODE IFN M.KL10&,< ;ROUTINE TO CLEAR, LOAD, AND VERIFY, AND START THE MICROCODE FOR A DX20. ;CALL: ; T1/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,DXLOAD ;RETURN CPOPJ IF UNSUCCESSFUL ; CPOPJ1 WITH MICROCODE LOADED BUT NOT STARTED DXLOAD::PUSHJ P,SAVE4## ;SAVE SOME ACS PUSHJ P,SAVU## ;SAVE U MOVE U,T1 ;COPY MICROCODE LOADER BLOCK ADDRESS PUSHJ P,BTUCOD## ;FIND ADDRESS JRST DXLOA1 ;NOT AVAILABLE PUSHJ P,MPRES ;RESET THE MICROPROCESSOR PUSHJ P,DXCLR ;CLEAR THE CRAM AND WORKING MEMORY PUSHJ P,LOAD ;LOAD THE MICROCODE JRST DXLOA1 ;FAILED PUSHJ P,VERIFY ;VERIFY THE MICROCODE THAT WE JUST LOADED JRST DXLOA1 ;FAILED PUSHJ P,MPCHK ;DO A FINAL CHECK ON THE MICROSTORE JRST DXLOA1 ;FAILED PUSHJ P,RDCRM0 ;READ THE VERSION NUMBER FROM CRAM LOC 0 LDB T1,[POINT 6,T2,25] ;GET MAJOR VERSION LSH T1,30 ;POSITION TRZ T2,777600 ;ISOLATE EDIT LEVEL IOR T2,T1 ;FORM STANDARD DEC-10 VERSION NUMBER PUSH P,T2 ;SAVE IT PUSHJ P,DXSTRT ;START THE DX20 POP P,.ULVER(U) ;SET VERSION IN MICROCODE LOADER BLOCK MOVE T1,U ;POINT TO THE MICROCODE LOADER BLOCK ADDRESS PUSHJ P,BTURPT## ;REPORT A SUCESSFUL LOAD JRST CPOPJ1## ;GIVE SKIP RETURN DXLOA1: MOVEI T2,.CRM10 ;WRITE A 0 INTO CRAM LOCATION 10 MOVEI T3,0 ; SO THAT ATTEMPTS TO START THIS DX20 PUSHJ P,WRCRAM ; WILL FAIL MOVE T1,U ;COPY MICROCODE LOADER BLOCK ADDRESS PJRST BTURPT## ;REPORT LOAD ERROR AND RETURN ;It might occur to someone to call BTURPT before DXSTRT to save the ;PUSH and POP of the microcode version number. It is done that way ;to waste enough KL CPU time to give the DX20 microprocessor enough ;time to get through its full initialization and get to the idle ;loop before a massbus init or a call to the reset routine stops ;it again. If the DX20 doesn't finish its initialization, the ;restart of the microprocessor (at a different start address than ;that used by DXSTRT) will cause strange things to happen. ;ROUTINE TO LOAD OR VERIFY THE MICROCODE IN A DX20. ;CALL: ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,LOAD/VERIFY ;RETURN CPOPJ IF ERROR ; CPOPJ1 WITH FUNCTION PERFORMED SUCCESSFULLY LOAD: PUSH P,[.DXPCR!PC.MSE!PC.PCE] ;DATAO BITS TO WRITE CRAM PUSH P,[IFIW LDCRAM] ;ROUTINE TO LOAD CRAM PUSH P,[IFIW LDWM] ;ROUTINE TO LOAD DRAM PUSH P,[.UEDRL,,.UECRL] ;DRAM,,CRAM ERROR CODES JRST FUNC ;ENTER COMMON CODE VERIFY: JRST CPOPJ1## PUSH P,[.DXPCR!PC.IRE!PC.PCE] ;DATAO BITS TO READ CRAM PUSH P,[IFIW VFCRAM] ;ROUTINE TO VERIFY CRAM PUSH P,[IFIW VFWM] ;ROUTINE TO VERIFY DRAM PUSH P,[.UEDRV,,.UECRV] ;DRAM,,CRAM ERROR CODES FUNC: PUSH P,[EXP 0] ;RESERVE SPACE FOR CRAM LOCATION 0 MOVSI P2,-3777 ;AOBJN POINTER MOVSI P3,(!1B12) ;MAKE A TWO WORD BYTE POINTER MOVE P4,.ULADR(U) ;GET UCODE ADDRESS FUNC1: ILDB T1,P3 ;GET A BYTE OF DATA HRRZ T2,P2 ;GET CRAM ADDRESS SKIPE T3,.ULMAG(U) ;HAVE A MAGIC NUMBER TRANSLATION TABLE? PUSHJ P,MAGIC ;YES--SEE IF A SUBSTITUTION IS NECESSARY IOR T2,-4(P) ;INCLUDE DATAO BITS TO READ/WRITE CRAM PUSHJ P,WTMBR## ;INITIALIZE ADDRESS OF CRAM LOCATIONS PUSHJ P,@-3(P) ;DISPATCH TO CRAM FUNCTION ROUTINE JRST FUNC3 ;ERROR AOBJN P2,FUNC1 ;LOOP PUSHJ P,RDCRM0 ;READ THE CONTENTS OF CRAM LOCATION 0 HRRZM T2,(P) ;SAVE ON STACK MOVSI P2,-1777 ;AOBJN POINTER MOVSI P3,(!1B12) ;MAKE A TWO WORD BYTE POINTER MOVE P4,.ULADR(U) ;GET ADDRESS OF UCODE STORAGE ADDI P4,2000 ;OFFSET TO THE DRAM DATA FUNC2: HRRZ T2,P2 ;GET WORKING MEMORY ADDRESS PUSHJ P,LDMAR ;SET MAR/MARX TO THAT VALUE ILDB T1,P3 ;GET A BYTE OF DATA ANDI T1,377 ;KEEP ONLY 8 BITS PUSHJ P,@-2(P) ;DISPATCH TO WORKING MEMORY FUNCTION ROUTINE JRST FUNC4 ;ERROR AOBJN P2,FUNC2 ;LOOP MOVEI T2,0 ;RESTORE THE VALUE THAT WAS IN CRAM LOCATION POP P,T3 ;GET PREVIOUS CONTENTS OF CRAM LOCATION 0 PUSHJ P,WRCRAM ; LOADING WORKING MEMORY ADJSP P,-4 ;PHASE STACK JRST CPOPJ1## ;RETURN FUNC3: SKIPA T1,-1(P) ;CRAM LOAD/VERIFY ERROR FUNC4: HLRZ T1,-1(P) ;DRAM LOAD/VERIFY ERROR DPB T1,ULBEBP## ;STORE ADJSP P,-5 ;PHASE STACK POPJ P, ;RETURN ;ROUTINE TO CLEAR THE CRAM AND WORKING MEMORY OF A DX20. ;CALL: ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,DXCLR ;RETURN CPOPJ ALWAYS DXCLR: POPJ P, PUSH P,F ;SAVE F MOVSI F,-4000 ;4000 LOCATIONS TO CLEAR IN THE CRAM DXCLR1: HRRZ T2,F ;GET THE ADDRESS TO WRITE MOVEI T3,0 ;PUT A ZERO IN IT PUSHJ P,WRCRAM ;WRITE THE CRAM LOCATION AOBJN F,DXCLR1 ;WRITE THEM ALL MOVEI T2,0 ;SET THE MAR/MAR EXTENSION PUSHJ P,LDMAR ; TO 0 MOVEI F,2000 ;2000 LOCATIONS IN THE WORKING MEMORY DXCLR2: MOVEI T2,11400 ;LDMEM 0,I MICROINSTRUCTION PUSHJ P,DXXCT ;CLEAR NEXT LOCATION IN WORKING MEMORY SOJG F,DXCLR2 ;DO THEM ALL JRST FPOPJ## ;RESTORE F AND RETURN ;ROUTINE TO START THE DX20 MICROPROCESSOR AT THE FULL START ENTRY ;POINT. ;CALL: ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,DXSTRT ;RETURN CPOPJ ALWAYS DXSTRT: PUSHJ P,MPRES ;MAKE SURE THE PROCESSOR IS RESET MOVE T2,[.DXPCR!PC.IRE!PC.PCE!PC.PCI!INSVL.(.DXSAD,PC.MPC)] PUSHJ P,WTMBR## ;SET THE PC TO THE FULL START ADDRESS MOVE T2,[.DXMTR!MR.STR] ;MAINTENANCE REGISTER+START BIT PJRST WTMBR## ;START THE MICROPROCESSOR AND RETURN ;ROUTINE TO READ THE CONTENTS OF CRAM LOCATION 0. ;CALL: ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,RDCRM0 ;RETURN CPOPJ ALWAYS WITH: ; T2/CONTENTS OF CRAM LOCATION 0 RDCRM0: MOVE T2,[.DXPCR!PC.IRE!PC.PCE!INSVL.(0,PC.MPC)] ;SET TO READ PUSHJ P,WTMBR## ; CRAM LOCATION 0 MOVSI T2,(.DXMIR) ;READING THIS REGISTER RETURNS THE VALUE PJRST RDMBR## ; THAT IS ADDRESSED BY THE PC REGISTER ;ROUTINE TO WRITE A WORD INTO A DX20 CRAM LOCATION. ;CALL: ; T2/ADDRESS OF LOCATION TO WRITE ; T3/DATA TO BE WRITTEN ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,WRCRAM ;RETURN CPOPJ ALWAYS WRCRAM: PUSH P,T3 ;SAVE THE DATA TO BE WRITTEN TDO T2,[.DXPCR!PC.MSE!PC.PCE] ;PC REGISTER+BITS TO ENABLE PUSHJ P,WTMBR## ; MICROSTORE AND PC WRITES POP P,T2 ;RESTORE THE DATA TO BE WRITTEN HRLI T2,(.DXMIR) ;WRITES INTO THE IR GO INTO THE CRAM LOCATION PJRST WTMBR## ; ADDRESSED BY THE PC REGISTER ;ROUTINE TO LOAD THE DX20 MEMORY ADDRESS AND ADDRESS EXTENSION REGISTERS ;(MAR AND MARX) WITH A VALUE. ;CALL: ; T2/ADDRESS TO LOAD ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,LDMAR ;RETURN CPOPJ ALWAYS LDMAR: PUSH P,T2 ;SAVE THE ADDRESS TO LOAD ANDI T2,377 ;KEEP LOW 8 BITS TRO T2,1000 ;ADD A LDMAR MICROINSTRUCTION PUSHJ P,DXXCT ;EXECUTE IT POP P,T2 ;RESTORE THE ADDRESS TO LOAD LSH T2,-^D8 ;GET 2 HIGH ORDER BITS TRO T2,400 ;ADD A LDMARX MICROINSTRUCTION PJRST DXXCT ;EXECUTE THAT AND RETURN ;ROUTINE TO CAUSE THE DX20 TO EXECUTE AN INSTRUCTION. ;CALL: ; T2/MICROINSTRUCTION TO EXECUTE ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,DXXCT ;RETURN CPOPJ ALWAYS DXXCT: PUSH P,T2 ;SAVE THE INSTRUCTION TO EXECUTE MOVE T2,[.DXMTR!MR.SCY] ;GET MAINTENANCE REGISTER AND SINGLE CYLCLE PUSHJ P,WTMBR## ;FORCE THE DX20 INTO SINGLE CYCLE MODE MOVEI T2,0 ;STORE THE INSTRUCTIN TO EXECTUTE IN CRAM LOC 0 POP P,T3 ;RESTORE THE INSTRUCTION TO EXECUTE PUSHJ P,WRCRAM ;WRITE IT INTO THE CRAM MOVE T2,[.DXPCR!PC.IRE!PC.PCI] ;PC REG+IR ENABLE+PC AUTO INCR PUSHJ P,WTMBR## ;SETUP TO EXECUTE THE INSTRUCTION MOVE T2,[.DXMTR!MR.SCY!MR.STR] ;MAINT REG+SINGLE CYCLE+START PUSHJ P,WTMBR## ;EXECUTE THE INSTRUCTION MOVSI T2,(.DXMTR) ;CLEAR SINGLE CYCLE AND LEAVE START OFF PJRST WTMBR## ;CLEAR START AND RETURN ;ROUTINE TO LOAD DATA INTO A CRAM LOCATION. ;CALL: ; T1/16 BITS OF DATA TO WRITE ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,LDCRAM ;RETURN CPOPJ1 ALWAYS LDCRAM: HRRZ T2,T1 ;MOVE DATA TO THE RIGHT AC HRLI T2,(.DXMIR) ;ADD THE REGISTER THAT WE WANT PUSHJ P,WTMBR## ;DO THE DATAO THAT CAUSES THE WRITE JRST CPOPJ1## ;GIVE SKIP RETURN ;ROUTINE TO LOAD DATA INTO A WORKING MEMORY LOCATION. ;CALL: ; T1/8 BITS OF DATA TO WRITE ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,LDWM ;RETURN CPOPJ1 ALWAYS LDWM: HRRZ T2,T1 ;GET DATA INTO THE WRITE AC TRO T2,11400 ;ADD A LDMEM N,I MICROINSTRUCTION PUSHJ P,DXXCT ;EXECUTE THE INSTRUCTION JRST CPOPJ1## ;GIVE SKIP RETURN ;ROUTINE TO VERIFY THE DATA IN A CRAM LOCATION. ;CALL: ; T1/16 BITS OF CRAM DATA ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,VFCRAM ;RETURN CPOPJ IF NO MATCH ; CPOPJ1 IF MATCH VFCRAM: MOVSI T2,(.DXMIR) ;READ THIS REGISTER TO GET THE DATA PUSHJ P,RDMBR## ;READ THE DATA CAIN T2,(T1) ;MATCH WITH WHAT IT SHOULD BE? AOS (P) ;YES--SKIP POPJ P, ;RETURN ;ROUTINE TO VERIFY THE DATA IN A WORKING MEMORY LOCATION ;CALL: ; T1/8 BITS OF DATA ; U/ADDRESS OF MICROCODE LOADER BLOCK ; PUSHJ P,VFWM ;RETURN CPOPJ IF NO MATCH ; CPOPJ1 IF MATCH VFWM: MOVEI T2,043411 ;GET A MOVMEM BR,I MICROINSTRUCTION PUSHJ P,DXXCT ;EXECUTE IT MOVSI T2,(.DXIBR) ;REGISTER TO READ THE BR PUSHJ P,RDMBR## ;READ THE REGISTER ANDI T2,DX.IBR ;KEEP ONLY THE BR OUTPUT CAIE T2,(T1) ;MATCH? POPJ P, ;NO JRST CPOPJ1## ;YES, GIVE SKIP RETURN ;ROUTINE TO SUBSTITUTE A MAGIC NUMBER ;CALL: ; T2/LOAD ADDRESS ; T3/MAGIC TRANSLATION TABLE ; PUSHJ P,MAGIC ;RETURN CPOPJ ALWAYS WITH T1 CONTAINING POSSIBLY UPDATED DATA MAGIC: MOVE T4,(T3) ;GET A WORD AOJE T4,CPOPJ## ;RETURN IF END OF TABLE HRRZ T4,(T3) ;GET AN ADDRESS CAIE T4,(T2) ;MATCH? AOJA T3,MAGIC ;LOOP HLRZ T1,(T3) ;GET ASSOCIATED MAGIC VALUE POPJ P, ;AND RETURN ;ROUTINE TO RESET THE DX20 MICROPROCESSOR ;CALL: ; U/ MICROCODE LOADER BLOCK ADDRESS ; PUSHJ P,MPRES ;RETURN CPOPJ ALWAYS MPRES: MOVE T2,[.DXMTR!MR.RES] ;SET RESET BIT IN MAINT REG PJRST WTMBR## ;RESET THE DX20 ;ROUTINE TO CHECK THE STATUS OF THE MICROPROCESSOR ;CALL: ; U/ADDRESS OF MICROCODE LOADER BLOCK ;RETURNS CPOPJ IF CONSISTANCY CHECKS FAIL OR CPOPJ1 IF OK MPCHK: MOVE T2,[.DXPCR!PC.IRE!PC.PCE!PC.PCI!7] ;REGISTER TO WRITE+ ; IR ENABLE+PC ENABLE+PC AUTO INCR+PC TO READ PUSHJ P,WTMBR## ;WRITE THE REGISTER MOVSI T2,(.DXMIR) ;POINT AT DIAGNOSTIC REGISTER 0 PUSHJ P,RDMBR## ;READ THE CONTENTS PUSH P,T2 ;SAVE FOR COMPARE MOVSI T2,(.DXDTR) ;POINT AT DRIVE TYPE REGISTER PUSHJ P,RDMBR## ;READ THAT POP P,T3 ;RESTORE CRAM LOCATION 7 CAME T2,T3 ;HAVE TO BE THE SAME POPJ P, ;ERROR IF NOT MOVSI T2,(.DXIPE) ;POINT AT DIAGNOSTIC REGISTER 7 PUSHJ P,RDMBR## ;READ IT TRNN T2,DX.IPE ;IR PARITY ERROR ON LAST READ? AOS (P) ;NO, GIVE SKIP RETURN POPJ P, ; AND RETURN >; END IFN M.KL10& $LIT COMEND: END