Trailing-Edge
-
PDP-10 Archives
-
de-10-omona-v-mc9
-
comdev.mac
There are 15 other files named comdev.mac in the archive. Click here to see a list.
TITLE COMDEV - MONITOR DEVICE DEPENDENT CODE, SYMBOLS, AND DATA - V61141
SUBTTL PART 6 COMDEV.MAC - T. HASTINGS/PH/TWE/DAL 22 AUG 78
SEARCH F,S
IFN M.KL10,<
SEARCH DTEPRM
>;END IFN M.KL10
$RELOC
$LOW
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1973,1974,1975,1976,1977,1978 BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
XP VCOMDV,61141
;PUT VERSION NUMBER IN GLOB AND LOADER STORAGE MAP
;SEE DATMAN FOR A LISTING OF S.MAC AND F.MAC
REPEAT 0, <
;THE COMDEV SUBPROGRAM CONSISTS OF 6 FILES ASSEMBLED TOGETHER AS ONE SUBPROGRAM
1. F.MAC -- FEATURE TESTS (OUTPUT OF MONGEN).
2. S.MAC - THE USUAL SYSTEM SYMBOL DEFINITIONS ASSEMBLED WITH
EVERY MONITOR SUBPROGRAM
3. HDWCNF.MAC -- HARDWARE CONFIGURATION
4. TTYCNF.MAC -- TERMINAL CONFIGURATION
5. REMCNF.MAC -- REMOTE CONFIGURATION
6. COMMON.MAC - THE REST OF THIS PROGRAM WHICH IS THE SAME SOURCE FOR
ALL CONFIGURATIONS. HOWEVER, THE ASSEMBLIES ARE CONDITIONED BY
SYMBOLS AND MACROS DEFINED IN 2.
THE FOLLOWING SYMBOLS AND TABLES ARE GENERATED BELOW:
A. CONVERSION SYMBOLS FROM NEW MONGEN(M.XXXX) TO OLD SYMBOLS(XXXXX.N)
B. TTY AND REMOTE CONVERSION SYMBOLS
C. MONGEN DEFAULT SYMBOLS
D. TTY DATA BASE
E. REMOTE STATION DATA BASE
F. ALL OTHER DEVICE SPECIFIC CODE AND DATA BASES:
(ONLY CODE WHICH CHANGES DEPENDING ON THE CONFIGURATION
SHOULD BE IN COMDEV). THE LIBARARY SEARCH FEATURE
DETERMINES WHETHER THE CONFIGURATION INDEPENDENT CODE
FOR A PARTICULAR DEVICE IS LOADED OR NOT).
EXTERNS TO CAUSE LOADING OF PROPER DEVICE MODULE
SHOULD BE HERE.
THE ONLY DEVICE SPECIFIC STUFF IN COMMON IS THE
SYMBOL DEFINITIONS WHICH INCLUDE THE PI ASSIGNMENT VALUE.
LEVEL D DISK SERVICE PARAMETERS:
ALL SYMBOLS AND LOCATIONS ARE IN A SEPARATE FILE CALLED
COMMOD.MAC WHICH IS ALSO ASSEMBLED WITH S AND CONFIG (BUT NOT WITH FEATURS FILES).
THE SEPARATE FILE IS FOR TWO REASONS:
1. ANTICIPATING MULTIPROCESSING SYSTEMS WHICH SHARE DISKS AND 1 16K MEMORY
(THE DATA MUST BE IN THE COMMON MEMORY)
2. ELIMINATE THE NEED TO ASSEMBLE COMMOD IF NOT A DISK SYSTEM
(COMMOD.MAC TAKES LOTS OF CORE FOR ITS COMPLICATED MACROS)
COMMUNICATIONS SOFTWARE
>
SUBTTL CONVERT MONGEN SYMBOLS
REPEAT 0,<
;THIS SECTION CONVERTS NEW MONGEN SYMBOLS TO OLD MONGEN SYMBOLS
;SO THAT THE REST OF COMMON AND MONITOR CAN STILL USE THE OLD
;SYMBOLS. THIS WAS DONE RATHER THAN CONVERTING ALL OF THE
;MONITOR TO NEW SYMBOLS FOR TWO REASONS:
; 1. IT IS EASIER AND FASTER AND LESS LIKELY TO INTRODUCE BUGS, AND
; 2. IT ALLOWS CUSTOMERS TO USE OLD MONGEN WITH A MINIMUM
;OF TROUBLE: ONLY A FEW EXTRA SYMBOLS MUST BE DEFINED.
;THE MONITOR WILL PROBABLY BE CONVERTED TO THE NEW MONGEN SYMBOLS
;AFTER THE 5.04 RELEASE. THE ORDER HERE PARALLELS THE OLD
;MONGEN ORDER.
>
XP SYS40N,0 ;NEW MONGEN MAKES SWAPPING SYSTEMS ONLY
XP SYS50N,1
XP DSKN,1
XP LOGINN,1
XP APRSN,M.C0SN ;APR SERIAL NUMBER (REALLY PROCESSOR 0)
XP APR0SN,M.C0SN ;PROCESSOR 0 SERIAL NUMBER
XP APR1SN,M.C1SN ;PROCESSOR 1 SERIAL NUMBER
XP CP0P6N,0 ;PROCESSOR 0 IS NOT A PDP 6
XP CP1P6N,0 ;PROCESSOR 1 IS NOT A PDP 6
XP CP0KAN,M.KA10 ;PROCESSOR 0 MAY BE A PDP 10
XP CP1KAN,M.KA10 ;PROCESSOR 1 MAY BE A PDP 10
XP CP0KIN,M.KI10 ;PROCESSOR 0 MAY BE A KI10
XP CP1KIN,M.KI10 ;PROCESSOR 1 MAY BE A KI10
XP CPUN,M.CPU ;NUMBER OF PROCESSORS
XP LEVDN,1 ;NEW MONGEN MAKES ONLY LEVEL D DISK SERVICE
XP LEVCN,0
XP CHNN,M.CHN ;NUMBER OF DATA CHANNELS FOR DISKS
DEFINE CALLF(CHN),<
XP C'CHN'FHN,M.C'CHN'FH
> ;END MACRO DEFINITION
DEFINE CHMFH(CHN),<
CALLF (\CHN)
> ;END MACRO DEFINITION
DEFINE CALLD(CHN),<
XP C'CHN'DPN,M.C'CHN'DP
> ;END MACRO DEFINITION
DEFINE CHMDP(CHN),<
CALLD (\CHN)
> ;END MACRO DEFINITION
DEFINE CALLM(CHN),<
XP C'CHN'MDN,0
>
DEFINE CHMMF(CHN),<
CALLM (\CHN)
>
ZZ==0
ZZF==0
ZZD==0
REPEAT CHNN,<
CHMFH (ZZ)
CHMDP (ZZ)
CHMMF (ZZ)
ZZ==ZZ+1
>
DEFINE UNFH(KON,LIST),<
ZZCNT==0
IRP LIST,<
IFE ZZCNT-KON,<
XP FH'LIST'UN,M.FH'LIST
> ;END IFE
ZZCNT==ZZCNT+1
> ;END IRP
> ;END MACRO DEFINITION
REPEAT M.RC10,<
UNFH (ZZF,<A,B,C,D,E,F,G,H>)
ZZF==ZZF+1
>
DEFINE UNDP(KON,LIST),<
ZZCNT==0
IRP LIST,<
IFE ZZCNT-KON,<
XP DP'LIST'UN,M.DP'LIST
> ;END IFE
ZZCNT==ZZCNT+1
> ;END IRP
> ;END MACRO DEFINITION
REPEAT M.RP10,<
UNDP (ZZD,<A,B,C,D,E,F,G,H>)
ZZD==ZZD+1
>
XP RD10N,M.RC10
XP RP10N,M.RP10
XP RH10NS,M.RH1S
XP RH10NP,M.RHP4
XP RA10N,0 ;NO MDF
DEFINE SYSDEV,<
SIXBIT /DSK/
>
XP JOBN,M.JOB+1
XP PDP10N,M.KA10!M.KI10!M.KL10N
XP PDP6N,MD.P6
XP KT10AN,MD.2RR
XP SEGN,MD.SEG
IFG KT10AN,<XP SEGN,SEGN+JOBN> ;NO. OF SEGS=NO. OF JOBS+NO. HISEGS
XP DDTN,MD.DDT
XP EDITN,0
XP PTRN,M.PTR
XP PTPN,M.PTP
XP PLTN,M.PLT
XP LPTN,M.LPT
XP DLPTN,M.DLPT
XP DCDRN,M.DCDR
XP MOVIEN,MD.MOV
XP CDRN,M.CDR
XP CR10N,MD.C10
XP CDPN,M.CDP
IFN FTXTC,<
IFE M.XTC,<
XP M.XTL,0>
XP XTCN,M.XTC
>
IFE FTXTC,<
IFN M.XTC,<
PRINTX ?NO DA28 SUPPORT WITH FTXTC=0
PRINTX ?PROCEEDING ASSUMING NO DA28
XP M.XTC,0
XP M.XTL,0
>
XP XTCN,0
>
XP DISN,M.DIS
XP PENN,M.DIS
XP T340N,M.340
XP TVP10N,M.VP10
XP T30N,0 ;NO TYPE 30
DEFINE TDMAC(KON,LIST),<
ZZCNT==0
IRP LIST,<
IFE ZZCNT-KON,<
XP DT'LIST'N,M.DT'LIST'
> ;END IFE
ZZCNT==ZZCNT+1
> ;END IRP
> ;END MACRO DEFINITION
ZZ==0
REPEAT M.TD10,<
TDMAC (ZZ,<A,B>)
ZZ==ZZ+1
>
IFNDEF M.DTA, <M.DTA==0>
IFNDEF DTAN, <DTAN==0>
IFNDEF M.DTB, <M.DTB==0>
IFNDEF DTBN, <DTBN==0>
XP DTCN,MD.DTC
IFNDEF M.TM10,<XP M.TM10,0>
IFNDEF M.TC10,<XP M.TC10,0>
IFNDEF M.TX01,<XP M.TX01,0>
XP TAPN,M.TM10+M.TC10+M.TX01+M.TM02
XP PTYN,M.PTY
XP TEMP,M.TMP
IFN M.TMP,<
XP TMPN,MD.TWJ
XP TMPLN,MD.TLJ
>
XP SYSCN,M.SYSC
XP LOKN,M.LOK
XP CMNN,M.MGC
XP RTTRPN,M.RTD
XP HPQN,M.HPQ
IFNDEF M.HRSN,<XP M.HRSN,77>
IFNDEF TTXTRA,<XP TTXTRA,0>
XP TTD28N,M.XTL
IFG M.XTL,<XP M.TLTL,M.TLTL+M.XTL>
XP M.CTY1,0 ;DEFINE M.CTY1 FOR CONVENIENCE
IFN FTMS,<IFG CPUN-1,<IFN FTCTY1,<XP M.CTY1,1>>> ;NOT REALLY CHANGABLE BY MONGEN
; M.CTY1=1 MEANS WANT CTY1(CPU1-CTY)
XP CTYLIN,M.TLTL+M.RTTY+M.CTY1
IFN M.CTY1,<XP CT1LIN,M.TLTL+M.RTTY>
DEFINE OPRL(LINE),<
IFIDN <LINE> <CTY>,<SIXBIT /CTY/>
IFIDN <LINE> <CTY1>,<SIXBIT /CTY1/>
IFDIF <LINE> <CTY>,<IFDIF <LINE><CTY1>,<SIXBIT /TTY'LINE/>>
>
DEFINE CALLM(NAME,LINE),<
NAME'LINE==1
>
DEFINE TTYMAC(TYPE),<
XLIST
DEFINE L(A,B),<
IFB <B>,<IFIDN <A> <CTY>,<
ZZLINE==CTYLIN
ZZBEG==CTYLIN
ZZEND==CTYLIN
> ;END IFIDN
IFIDN <A> <CTY1>,<
IFE M.CTY1,<PRINTX %CTY1 IN TTYCNF WHEN FTCTY1 OR FTMS=0>
IFN M.CTY1,<
ZZLINE==CT1LIN
ZZBEG==CT1LIN
ZZEND==CT1LIN
>> ;END IFN M.CTY1 END IFIDN
IFDIF <A> <CTY>,<
IFDIF <A> <CTY1>,<
ZZLINE==A
ZZBEG==A
ZZEND==A
>> ;END IFDIF IFDIF
> ;END IFB
IFNB <B>,<ZZLINE==A
ZZBEG==A
ZZEND==B
> ;END IFNB
REPEAT ZZEND-ZZBEG+1,<
CALLM (TYPE,\ZZLINE)
ZZLINE==ZZLINE+1
>> ;END REPEAT AND DEFINITION OF L
MAC'TYPE
LIST
> ;END DEFINITION OF TTYMAC
TTYMAC DSD
TTYMAC TAB
TTYMAC RMT
TTYMAC LCP
TTYMAC HLF
TTYMAC SLV
TTYMAC FRM
TTYMAC INI
TTYMAC(DIS) ;2741 TERMINALS ATTACHED TO A DC-10
DEFINE CALLM(NAME,LINE,VALUE),<
NAME'LINE==VALUE
>
DEFINE TTYMAC(TYPE),<
XLIST
DEFINE L(M,N,P),<
IFIDN <M> <CTY>,<
ZZBEG==CTYLIN
ZZLINE==CTYLIN
>
IFIDN <M> <CTY1>,<
ZZBEG==CT1LIN
ZZLINE==CT1LIN
>
IFDIF <M> <CTY>,<
IFDIF <M> <CTY1>,<
ZZBEG==M
ZZLINE==M
>>
IFB <P>,<
ZZEND==ZZBEG
ZZVAL==N
>
IFNB <P>,<
ZZEND==N
ZZVAL==P
>
REPEAT ZZEND-ZZBEG+1,<
CALLM (TYPE,\ZZLINE,ZZVAL)
ZZLINE==ZZLINE+1
>> ;END REPEAT AND DEFINITION OF L
MAC'TYPE
LIST
> ;END DEFINITION OF TTYMAC
TTYMAC FLC
DEFINE DSASOC,<
XLIST
DEFINE L(M,N,P),<
IFIDN <M> <CTY>,<
ZZBEG==CTYLIN
ZZDATA==CTYLIN
>
IFIDN <M> <CTY1>,<
ZZBEG==CT1LIN
ZZDATA==CT1LIN
>
IFDIF <M> <CTY>,<
IFDIF <M> <CTY1>,<
ZZBEG==M
ZZDATA==M
>>
IFB <P>,<
ZZEND==ZZBEG
ZZLINE==N
>
IFNB <P>,<
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 *
;**********************************************************************
IFNDEF XPANDN,<XP XPANDN,0> ;FORCE NO EXPANSION OF MACROS
; UNLESS XPANDN IS DEFINED NON-ZERO WITH MONGEN
;SIZE OF MAGTAPE RECORDS (DATA WORDS IN BUFFER)
IFNDEF MTSIZ, <XP MTSIZ,^D128> ;STANDARD == 128 WORDS PER BUFFER
;SIZE OF LPT BUFFER (NUMBER OF DATA WORDS+2)
IFNDEF LPTSIZ, <XP LPTSIZ,^D27+2> ;STANDARD == 27 WORDS PER LPT BUFFER (132 COL. PRINTER)
IFNDEF FLCDEF,<XP FLCDEF,1> ;FILLER CLASS CODE TO USE IF NOT SPECIFIED
;FOR A TTY LINE
IFNDEF TTYALT,<XP TTYALT,0> ;DEFAULT SETTING OF TTY ALTMODE
; IS NO CONVERSION OF ASCII CODES 175 AND 176 TO 33
;NOTE--IN ORDER TO RESERVE PI-CHANNELS FOR
;NON-STANDARD USAGE, FOR EACH CHANNEL (SAY N)
;DEFINE SYMBOL UNIQN==1 VIA MONGEN. FOR
;EXAMPLE, TO RESERVE CHANNEL 4, DEFINE
;UNIQ4==1.
;IF IT IS DESIRED TO LEAVE A CHANNEL FREE FOR RTTRP JOB TO USE
;THEN THE APPROPRIATE SYMBOL "RTCH'N" SHOULD BE DEFINED AS 1.
;FOR EXAMPLE:
;IF CHANNEL 2 IS TO FREE FOR RTTRP USE THE DEFINE RTCH2==1 IN MONGEN
IFNDEF MTELOG,<XP MTELOG,-1> ;ZERO TO LOG ALL RECOVERED ERRORS
;NON-ZERO TO LOG ERRORS THAT REQ'D MORE THAN ONE RETRY
IFNDEF MTDAEM,<XP MTDAEM,10> ;NUMBER OF TIMES PER REEL TO CALL DAEMON
; FOR MAGTAPE ERROR REPORTS.
IFN FTTLAB,<
IFNDEF MTDLTP,<XP MTDLTP,LT.BLP> ;DEFAULT LABEL TYPE
>
NDL M.AT01,1 ;ASYNCHRONOUS TERMINALS ON FIRST FRONT ENDL
NDL M.AT02,0 ;ON SECOND
NDL M.AT03,0
NDL M.AT04,0 ;(REPRESENTS POSSIBLE CTYS)
NDL M.FD01,2 ;NUMBER OF FRONT END DEVICES ON FIRST FRONT END
NDL M.FD02,2 ;ON SECOND
NDL M.FD03,2
NDL M.FD04,2 ;ONE FOR FILE XFER, ONE FOR DDT11
;ADD NEW MONGEN SYMBOLS HERE
SUBTTL COMPUTE SPECIAL SYMBOLS
;PERFORM TRANSLATION FROM HARDWARE TO SOFTWARE DESIGNATION
; FOR ALL DISK SYMBOLS
IFN DSKN,<
FHDN==RD10N
DPCN==RP10N
MDFN==RA10N
FSDN==RH10NS
RPXN==RH10NP
>
IFE DSKN, <
FHDN==0
DPCN==0
MDFN==0
FSDN==0
RPXN==0
>
IFN LEVDN,<
ALLDSK=FHDN+DPCN+MDFN+FSDN+RPXN ;ALLDSK = THE TOTAL # OF DSK KONTROLLERS IN THE SYSTEM
; IF YOU ADD ANOTHER KONTROLLER TYPE YOU MUST
; INCLUDE THE # OF KONTROLLERS OF THAT TYPE HERE
>
;DEFINE THE PARAMETERS WHICH CONTROL THE TYPE OF SYSTEM
XP FTDISK,-DSKN ;10/40D OR 10/50S
XP FTSWAP,-SYS50N ;10/50S
XP FTLOGIN,-DSKN ;PUT FTLOGIN IN SO LOADER WILL COMPLAIN
; IF DIFFERENT IN OTHER FILES
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
;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
;TAB0 MEANS LINE 0 HAS HARDWARE TABS
;RMT0 MEANS LINE 0 IS A REMOTE LINE, BUT NOT A DATASET.
;HLF0 MEANS LINE 0 IS HALF-DUPLEX (XMTED CHARS WILL BE RCVD)
;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.
XP SCNN,JOBN+TTXTRA ;NUMBER OF TTY DDBS TO BE BUILT
XP HGHLIN,M.TLTL ;HIGHEST LINE ON SCANNERS, BEFORE TCONLN
IFG M.CTY1 ,<XP CT1LIN,HGHLIN+M.RTTY> ;CPU1 CTY (CTY1)
IFE M.CTY1,<XP CT1LIN,-1>; ;IF DON'T WANT CTY1 MAKE SURE CT1LIN IS ILLEGAL
XP TCONLN,HGHLIN+M.RTTY+M.CTY1 ;LINE NUMBER FOR CTY (NOT ON SCANNER)
XP CTYLDB,LINTAB+TCONLN ;ADR. OF WORD CONTAINING CTY LDB
; USED TO PRINT ON CTY (AS OPPOSED TO OPR)
; WHEN NOT USING INTERRUPTS
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+<M.TTG1*10> ;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 FO 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 TTDLAL,D77OFS+M.D77N ;OFFSET FOR ALL TTD (RSX-20F) LINES
XP KLNKLN,TTDLAL ;FIRST TTD LINE IS THE KLINIK LINE
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-<DL0MXL-DL0MXD> ;DITTO FOR DC10 #1
IFG <PTYN -^D511>,<PRINTX 512. OR MORE PTY'S EXCEEDS FIELD OF DDB>
XP TTPLEN,TCONLN+PTYN+1 ;LENGTH OF TRANSLATOR TABLE
;INCLUDES ALL SCNANNERS, CTY, AND PTY'S
IFG <TTPLEN -^D511>,<PRINTX MORE THAN 511. TTYS+PTYS EXCEEDS FIELD OF DDB>
XP PTYOFS,TCONLN+1 ;OFFSET FOR PTY-DRIVEN TTY'S
;DEFINE ALL DL10 SYMBOLS
DLX.CK(0) ;MACRO DEFINED IN S.MAC
IFN FTTYPE!DLX.44,<
IFE FTTYPE,<
PRINTX ?DEFINING A DC44 REQUIRES FTTYPE TO BE ON
PRINTX ?M.DC44 HAS BEEN TURNED OFF
PDP11N=PDP11N-DLX.44
M.DC44=0 ;NUMBER OF MONGEN
DLX.44=0 ;ACTUAL NUMBER
>> ;END OF IFN FTTYPE!DLX.44
IFN FTDAS78!DLX.78,<
IFE FTDAS78,<
PRINTX ?DEFINING A DAS78 REQUIRES FTDAS78 TO BE ON
PDP11N=PDP11N-DLX.78
DLX.78=0 ;ACTUAL NUMBER
>> ;END OF IFN FTDAS78!DLX.78
IFE <DLX.78-PDP11N>,<DLXWIN=0>
IFN <DLX.78-PDP11N>,<EXTERN DLXWIN>
XP MTTYLN,-TTPLEN
XP MLTTYL,-SCNN
IFN PTYN,<
IFE FTPTYUUO,<
PRINTX ? MONITOR WITH PTY'S SHOULD HAVE FTPTYUUO==-1
>>
IFN FTKL10,< ;KL-10'S HAVE KLINIK LINE
DEFINE KLNCNF(N),<
DSD'N==1 ;; KLINIK LINE IS ALWAYS A DATASET
>
KLNCNF(\KLNKLN) ;DEFINE KLINIK LINE CONFIGURATION PARAMETERS
>; END IFN FTKL10
;SCANNER ENTRY POINTS AND BIT DEFINITIONS
EXTERNAL SCNSER ;SCANNER SERVICE ENTRY POINT
INTERNAL LINTAB
LINTAB: ;LINE CHARACTERISTICS BITS (NOT CLEARED ON SYSTEM STARTUP)
;TELETYPE LINE CHARACTERISTICS (LH OF LINTAB)
;USED BY SCNSER
XP TTVRMT,40 ;REMOTE LINE
XP TTVHLF,100 ;HALF DUPLEX LINE (DC10C OR TWX)
XP TTVINI,200 ;RUN INITIAL CUSP
XP TTVDSD,400 ;DATASET DATA LINE
XP TTVDIS,1000 ;2741 TERMINALS ON A DC-10 INTERFACE
XP TTVNFC,2000 ;NO FREE CRLF AT 72 COLUMNS
XP TTVFRM,4000 ;FORM FEED IN HARDWARE
XP TTVLCP,10000 ;LOCAL COPY, BUT NOT HALF DUPLEX
XP TTVTAB,20000 ;TAB HARDWARE (8 COLUMNS PER)
XP TTVLCT,40000 ;LOWER CASE TRANSLATE TO UPPER
XP TTVSLV,100000 ;SLAVE TTY
XP TTVFLC,200000 ;TWO BITS OF FILLER CLASS CODE
;NOW DEFINE THE LINE TABLE FOR EACH TTY'S CHARACTERISTICS
;USING THE INFO FROM MONGEN, AND DATA FROM TTYTAB AREA.
DEFINE GENLIN(LIN,LINN)<
IFE LINN-<LINN/30>*30,<PAGE>
ZZ=0
.GNLN(LIN,RMT)
.GNLN(LIN,HLF)
.GNLN(LIN,INI)
.GNLN(LIN,DSD)
.GNLN(LIN,DIS)
.GNLN(LIN,NFC)
.GNLN(LIN,FRM)
.GNLN(LIN,LCP)
.GNLN(LIN,TAB)
.GNLN(LIN,LCT)
.GNLN(LIN,SLV)
.GNLN(LIN,FLC)
XWD ZZ,0 ;LINE LIN
LINN=LINN+1
>
DEFINE .GNLN (N,BIT) <
IFDEF BIT'N,<ZZ=ZZ+BIT'N*TTV'BIT>
IFIDN <BIT><FLC>,<IFNDEF BIT'N,<ZZ=ZZ+FLCDEF*TTV'BIT>>
>
LINTAB: LIN=0
XALL
REPEAT TTPLEN,<GENLIN(\LIN,LIN)>
IFN FTMODM,<
;NOW THE DATASET CONTROLLER INFO FOR ANY DC10E'S
INTERNAL DSCTAB
;CONSTRUCT THE DATASET CONTROLLER TABLE
DEFINE GENLIN(CON,DATA)<
ZZ==0
IFLE <CON-DL0MXD>,<ZZ==1>
IFG <CON-DL0MXL>,<ZZ==1>
IFG <DATA-DL0MXD>,<ZZ==1> ;CHECK RANGE OF ARGUMENT
IFN ZZ,<PRINTX ? SPECIFICATION ERROR - DSCTAB>
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,<IFN DSA'N,<ZZ==DL0OFS+DSB'N>>
EXP ZZ ;DATA SET N
.INDEX==.INDEX+1
>
XALL
REPEAT <DL0MXL-DL0MXD>,<GENLIN(\.INDEX)>
IFDEF MACCR1,< ;ONLY IF 2 DC10'S
DEFINE GENLIN(CON,DATA)<
ZZ==0
IFLE <CON-DL1MXD>,<ZZ==1>
IFG <CON-DL1MXL>,<ZZ==1>
IFG <DATA-DL1MXD>,<ZZ==1> ;CHECK RANGE OF ARGUMENT
IFN ZZ,<PRINTX ? SPECIFICATION ERROR - DSCTAB>
IFE ZZ,<
DSA'CON==1
DSB'CON==DATA
>
>
DSASOC
MACCR1 ;INVOKE THE MACRO
.INDEX==DL1MXD+1
DEFINE GENLIN(N)<
ZZ==0
IFDEF DSA'N,<IFN DSA'N,<ZZ==DL1OFS+DSB'N>>
EXP ZZ ;DATA SET N
.INDEX==.INDEX+1
>
XALL
DSCTB1:REPEAT <DL1MXL-DL1MXD>,<GENLIN(\.INDEX)>
> ;END IFNDEF MACCR1
ZZ==CC0OFS
XP DSCNDX,<.-DSCTAB>
XP CC0DSO,CC0OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
XP CC1DSO,CC1OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
XP D70DSO,D70OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
XP D71DSO,D71OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
XP D72DSO,D72OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
XP D73DSO,D73OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
XP D74DSO,D74OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
XP D75DSO,D75OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
XP D76DSO,D76OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
XP D77DSO,D77OFS-<<M.TTG0+M.TTG1>*10>+DSCNDX
XP TTDDAL,TTDLAL-<<M.TTG0+M.TTG1>*10>+DSCNDX
REPEAT M.68L0+M.68L1+M.D70N+M.D71N+M.D72N+M.D73N+M.D74N+M.D75N+M.D76N+M.D77N+M.TTDN,< EXP ZZ
ZZ==ZZ+1
>
MDSLN==:DSCTAB-.
> ;END FTMODM
;THE FOLLOWING SLIDING SCALE DEFINES THE LENGTH OF THE TTY FREE LIST
IFNDEF TTCHKN,<IFL TTPLEN-10,<XP TTCHKN,11*TTPLEN>>
IFNDEF TTCHKN,<IFL TTPLEN-20,<XP TTCHKN,10*TTPLEN>>
IFNDEF TTCHKN,<IFL TTPLEN-40,<XP TTCHKN,7*TTPLEN>>
IFNDEF TTCHKN,<XP TTCHKN,6*TTPLEN>
XP TTCHKS,4 ;CHUNK SIZE
IFG XTCN,< ;GENERATE TABLE FOR DA28 POOL
TTLTAB::BLOCK TTD28N ;KON,,UNIT
XP MTTD28,-TTD28N ;MINUS # OF DA28 LINES
>
INTERN SYSPDL
SYSPDL: BLOCK 40 ;UNTIL FIND A BETTER PLACE FOR IT
IFNDEF MDSLN,<MDSLN==:0>
;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.
TTMAPN==<TTPLEN/^D32>+1
CMDMAP::BLOCK TTMAPN ;TTY COMMAND BIT MAP
;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.
$HIGH
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
XP TTCMPT,-TTMAPN ;AOBJN POINTER TO COMMAND MAP
TTDALT:: ;XCTED IN SCNSER TO SET TTY ALT DEFAULT
IFE TTYALT,<
IORM T1,LDBPAG##(U) ;NORMAL DEFAULT IS TTY NO ALT
>
IFN TTYALT,<
ANDCAM T1,LDBPAG##(U) ;IF LOTS OF 33S AND 35S
>
$LOW
SUBTTL DTESER DATA BASE GENERATION
IFN FTKL10,<
.XCREF
;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
XALL
.CREF
ETDTBX
;TABLE FOR MASTER DTE CONTROL BLOCK ADDRESS FOR EACH CPU
DTEMAS::BLOCK M.CPU
;USEFUL MACROS FOR DTE DEPENDENT DATA BASE
DEFINE RSX20F <
N10==0 ;;INDEX FOR -10 CPU #
REPEAT CPUN,< ;;DO FOR EACH CPU ON SYSTEM
RSXCPU \N10 ;;CALL CPU MACRO
N10==N10+1 ;;STEP TO NEXT CPU
>
>
DEFINE RSXCPU (C) <
IFDEF M.'C'DTE,< ;;DO ONLY IF DTE(S) ON THIS CPU
N11==1 ;;INDEX FOR -11 CPU (DTE) #
REPEAT M.'C'DTE,< ;;DO FOR ALL DTE'S
RSXDTE \C,\N11 ;;CALL CURRENT DTE MACRO
N11==N11+1 ;;STEP TO NEXT -11 (DTE)
>
>
>
>
SUBTTL NETWORK SYMBOLS FOR NON-NETWORK SYSTEMS
IFE M.NET,< ;IF MONGEN ANSWER IS NO THEN DEFINE SYMBOLS
NODE.U==:CPOPJ## ;ILLEGAL UUO
TSTNET==:CPOPJ## ;NO NETWORK DEVICES
GENNET==:CPOPJ##
NET2ND==:CPOPJ##
HOST.U==:CPOPJ##
SRCNDB==:CPOPJ##
NETCTC==:CPOPJ##
ZAPNET==:CPOPJ##
STBSCA==:CPOPJ##
D85DSC==:ECOD4##
RDA$IN==:CPOPJ##
CDR$IN==:CPOPJ##
NETRTY::0 ;NO NETWORK TTYS
NDBNNM==:0 ;NO STATION BLOCKS
NETDSP==:0 ;NO SERVICE ROUTINE
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.NET
IFE M.RDX,<
TSTRDX==:CPOPJ##
>;END M.RDX
IFE M.RJOB,<
TSTTSK==:CPOPJ##
>
IFN M.KL10&FTNET,<
IFE M.NET*M.D87S,<
NCLUP==:CPOPJ##
NCLDWN==:CPOPJ##
NCLDSP==:EATDSP##
>>
IFE <M.NET!M.DAS78>,< ;INCLUDE IF NO NETWORKS AND NO DAS78'S
WHERE==:CPOPJ
LOCATE==:CPOPJ
> ;END IFE <M.NET!M.DAS78>
IFN M.NET!M.DC76,< ;ANY IBM 2741 FE SUPPORT
$HIGH
;SUBROUTINE EXEINX - RETURN AN INDEX TO THE GOLF BALL NUMBER
;CALL MOVEI T3,BALL NUMBER(BINARY)
; PUSHJ P,ELEINX
;RETURN CPOPJ ;NOT IN THE TABLE
; CPOPJ1 ;FOUND T2=INDEX
ELEINX::MOVSI T2,-ELELEN ;SIZE OF TABLE
CAME T3,ELETAB(T2) ;MATCH
AOBJN T2,.-1 ;NO--LOOP FOR MORE
JUMPGE T2,CPOPJ## ;EXIT IF NOT FOUND
PJRST CPOPJ1## ;GOOD RETURN
RADIX 10
ELETAB::EXP 029,087,938,963,987,988
RADIX 8
ELELEN==.-ELETAB
$LOW
>;END M.NET!M.DC76
SUBTTL EXTERNAL PROCESSOR DEFINITIONS
IFN FTXTC,<
IFN M.XTC,<
XP MX11BF,^D129 ;MAXIMUM PDP-11 IMAGE BINARY BUFFER SIZE
DEFINE XTCDEF (X),<
IFNDEF XT'X'S,<XT'X'S==420+X*10>
IFNDEF XT'X'C,<XT'X'C==424+X*10>
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-XTCN,<
XKBKDB::!EXP XKB'A' ;LINK TO NEXT KDB
>
IFE A-XTCN,<
XKBKDB::!EXP 0 ;NO MORE KDB'S
>
>
XP XKBINT,<XT'X'INT-.>
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 <MX11BF*3>/2 ;MONITOR BUFFER
DEPHASE
>
ZZ=0
IFE XTCN,<
XTUUO==:CPOPJ ;NO XTUUO IF NO XTCSER
XTKLDB==:CPOPJ ;ALSO NO DDB KILLER
XTCTTY::AOS (P) ;DOUBLE SKIP
JRST CPOPJ1##
XTCTYP==:CPOPJ
>
IFN XTCN,<EXTERN XTCSER> ;LOAD XTCSER IF NEEDED
REPEAT XTCN,<
XTCDEF (\ZZ)
ZZ=ZZ+1
>
>> ;;END OF FTXTC FEATURE
SUBTTL MAGTAPE DATA BASE FOR TAPSER
IFG TAPN,<
EXTERNAL TAPSER,TAPUUO
;SOME GENERALLY USEFUL MACROS
DEFINE CALUNI (Y,EMACR) <
..UNI==0
REPEAT M.MT'Y,<
GENUNI (Y,\..UNI,EMACR)
..UNI==..UNI+1>
>
DEFINE TM2UNI(Y,EMACR) <
X==0
..UNI==0
REPEAT M.MT'Y'U,<
TM2UN2(Y,\X,EMACR)
X==X+1>
>
DEFINE TM2UN2(Y,Z,EMACR) <
REPEAT M.MT'Y'Z,<
GENUNI(Y,\..UNI,EMACR)
..UNI==..UNI+1>
..UNI==..UNI+10-M.MT'Y'Z
>
DEFINE UNIMAC (A,B) <
..U'A'B>
DEFINE CHNMAC (Z) <
CHN'Z'CB##>
DEFINE GENDDB (X,Y) <
MT'X'DDB::
<SIXBIT /MTA0/>+<X+OFFSET>_^D18 ;(0) DEVNAM
DVCMDA!<^D5*HUNGST>,,MTSIZ+1 ;(1) DEVCHR
0 ;(2) DEVIOS
TPMDSP## ;(3) DEVSER
1023,,154403+BYTBIT ;(4) DEVMOD
0 ;(5) DEVLOG
0 ;(6) DEVBUF
R,,0 ;(7) DEVIAD
R,,0 ;(10) DEVOAD
;;BITS 0-13 ARE USED FOR FRAME-COUNT
0 ;(11) DEVSTS
.TYMTA!DEPLEN,,Y*DEPEVM ;(12) DEVSTA
0 ;(13) DEVXTR
;BITS 22-30 = NUMBER OF INPUT BUFFERS
0 ;(14) DEVEVM
0 ;(15) DEVPSI
0 ;(16) DEVESE
0 ;(17) DEVHCW
0 ;(20) DEVJOB (6.02 AND LATER)
PHASE DEVLSD
TDVUDB::! ;LH = UDB PNTR
TDVKDB::! ..U'X'0,,MT'X'KDB ;RH = KDB PNTR (PRIME CONTROLLER)
TDVSTS::! 0 ;UNIT STATUS INFO
TDVIOR::! 0 ;IORB TO WAIT FOR
TDVSUL::! 0 ;SAVED USER UPPER LIMIT
TDVSLL::! 0 ;SAVED USER LOWER LIMIT
TDVSVM::! 0 ;SAVED M FOR DUMP MODE
TDVREM::! 0 ;REMAINDER FOR MODE 16
DEPHASE
XP MT'X'DDS,.-MT'X'DDB ;SIZE OF DDB
> ;END GENDDB MACRO
;MACRO TO GENERATE A KDB
DEFINE GENKDB (X,KMACR) <
MT'X'INT::
CONSO MT'X'S,0 ;INTERUPT INSTRUCTION
JRST .-1
JSR MT'X'SAV## ;SAVE ACS
JSP W,TAPINT##
XP TKBCSO,MT'X'INT-. ;OFFSET OF CONSO INSTR FROM KDB
MT'X'KDB:: PHASE 0
TKBNAM::! SIXBIT /MT'X/
TKBCNT::! 0 ;(1) NUMBER OF RECORDS DONE ON THIS OPERATION
TKBKDB::! IFE <X-TAPN+1>,<0> ;(2) LINK TO NEXT KDB
IFN <X-TAPN+1>,<MTLINK (\<X+1>)>
IFN M.MT'X'T-4,<
TKBIUN::! -M.MT'X,,MT'X'KDB+TKBUDB ;(3) INITIAL UNIT AOBJN PNTR
TKBCUN::! -M.MT'X,,MT'X'KDB+TKBUDB ;(4) CURRENT UNIT AOBJN PNTR
>
IFE M.MT'X'T-4,<
TKBIUN::! -M.MT'X'U*10,,MT'X'KDB+TKBUDB
TKBCUN::! -M.MT'X'U*10,,MT'X'KDB+TKBUDB
>
TKBDSP::! MT'X'DSP ;(5) KONTROLLER DISPATCH
TKBSTS::! 0 ;(6) KONTROLLER STATUS
;(RH) CONSECUTIVE OPS REMAINING
TKBICP::! ;(7) PNTR TO ICPC/ CHL INFO
IFE M.MT'X'T,<MTALOC##> ;PI CHL FOR TM10A
IFE <M.MT'X'T-1>,<
$LOCW*2+LOCOCW##
$LOCW==$LOCW+1> ;TM10B
IFE M.MT'X'T-2,<
$LOCW*2+LOCOCW##
$LOCW==$LOCW+1> ;TC10C
IFE M.MT'X'T-3,<
$LOCD*4+LOCODW##
$LOCD==$LOCD+1> ;DX10 TYPE
IFE M.MT'X'T-4,<
IFE M.T2'X'T,<
$LOCW*2+LOCOCW##
$LOCW==$LOCW+1> ;TM02 ON RH10
IFN M.T2'X'T,<
RH2IOC##+4*<M.T2'X'T-1>;TM02 ON RH20 # N
>
>
TKBTIM::! 0 ;(10) TIMER FOR SPACING OPS
TKBCDB::! IFE M.MT'X'T,<0> ;(11) PNTR TO CHL IF NOT TM11A
IFN M.MT'X'T,<CHNMAC(\M.MT'X'C)>
TKBJOB::! 0 ;(12) JOB NUMBER OF MAINT-MODE OWNER
; TKBJOB MUST IMMEDIATELY PRECEDE TKBCCL
TKBCCL::! BLOCK 5 ;(13) CHNL CMD LIST
TKBERB::! BLOCK 4 ;(21) IORB FOR ERROR RECOVERY
IFE M.TM02,<
TKBUDB::! ..UNI==0
IFN M.MT'X'T-4,<
REPEAT M.MT'X,<
UNIMAC (X,\..UNI)
..UNI==..UNI+1>
BLOCK ^D8-M.MT'X ;ALLOW FOR 8 MAX UNITS
>
>
IFG M.TM02,<
IFN M.MT'X'T-4,<BLOCK 5>
IFE M.MT'X'T-4,<
TT2CO1::!CONO MT'X'S,(T1)
TT2CI2::!CONI MT'X'S,T2
TT2CO3::!CONO MT'X'S,(T3)
TT2DI2::!DATAI MT'X'S,T2
TT2DO2::!DATAO MT'X'S,T2
>
TKBUDB::! ..UNI==0
IFE M.MT'X'T-4,<
TT2CDB (X)
>
IFN M.MT'X'T-4,<
REPEAT M.MT'X,<
UNIMAC (X,\..UNI)
..UNI==..UNI+1>
BLOCK ^D8-M.MT'X ;ALLOW FOR 8 MAX UNITS
>
>
KMACR(X) ;KONTROLLER DEPENDENT DATA
DEPHASE
>
DEFINE MTLINK (X) <MT'X'KDB>
;MACRO TO GENERATE ALL TAPE INFO
DEFINE GENTAP (KON) <
EXPNDK (KON) ;DEFINE 7 TRACK UNITS AND 6250 BPI UNITS
IFLE <M.MT'KON'T-1>,< ;ALL TM10S
MT'KON'DSP=TMXDSP##
EXTERN TMXKON
DOTM10(KON,M.MT'KON'T) ;GEN FOR APPROPRIATE TYPE
>
IFE <M.MT'KON'T-2>,< ;TC10C
MT'KON'DSP=TCXDSP##
EXTERN TCXKON
MT'KON'S==%TC10S ;TC10 STATUS REG
CALUNI(KON,ETCMAC) ;GEN UNITS
GENKDB(KON,KTCMAC) ;GE KDB
BYTBIT==0_BYTMOD
GENDDB(KON,1) ;DDB PROTOTYPE
%TC10S==%TC10S+4 ;ADVANCE TO NEXT TC10C
>
IFE <M.MT'KON'T-3>,< ;TX01
MT'KON'DSP=TX1DSP##
EXTERN TX1KON
MT'KON'S==%DX10S ;DX10 STATUS REG
CALUNI(KON,ETXMAC) ;GEN UNITS
GENKDB(KON,KTXMAC) ;GEN KDB
BYTBIT==1_BYTMOD
GENDDB(KON,1) ;DDB PROTOTYPE
%DX10S==%DX10S+4 ;ADVANCE TO NEXT DX10
IFE <%DX10S-230>,<%DX10S==034>
;TM02
>
IFE <M.MT'KON'T-4>,<
MT'KON'DSP==TM2DSP##
EXTERN TM2KON
IFE M.T2'KON'T,<
MT'KON'S==%TM02S
>
IFN M.T2'KON'T,<
MT'KON'S==540+4*<M.T2'KON'T-1>
>
TM2UNI(KON,ET2MAC)
GENKDB(KON,KT2MAC)
BYTBIT==1_BYTMOD
GENDDB(KON,1)
OFFSET==OFFSET+M.MT'KON'U-1
IFE M.T2'KON'T,<
%TM02S==%TM02S+4
>
IFE <%TM02S-300>,<%TM02S==360>
>>
DEFINE DOTM10 (KON,TYP) <
MT'KON'C==%TM10S ;TM10 COMMAND REG
MT'KON'S==%TM10S+4 ;TM10 STATUS REG
CALUNI(KON,ETMMAC) ;GEN UNITS
GENKDB(KON,KTMMAC) ;GEN KDB
BYTBIT==0_BYTMOD
GENDDB(KON,TYP) ;GEN DDB PROTOTYPE FOR UNIT 0
%TM10S==%TM10S+10 ;ADVANCE TO NEXT UNIT
>
;MACRO TO INSERT TM02 UNITS INTO TKBUDB
DEFINE TT2CDB(X) <
..UNI==0
Y==0
REPEAT M.MT'X'U,<
TM2INS(X,\Y)
Y==Y+1>
>
DEFINE TM2INS(X,Z) <
REPEAT M.MT'X'Z,<
UNIMAC(X,\..UNI)
..UNI==..UNI+1>
BLOCK ^D8-M.MT'X'Z
..UNI==..UNI+^D8-M.MT'X'Z
>
;MACROS TO FIGURE OUT WHICH UNITS ARE 7 TRACK OR CAPABLE OF 6250 BPI
DEFINE EXPNDK (K) <
..X=7
MACKN'K (K)
..X=6
MACK6'K (K)>
DEFINE KN (A,B,C<0>) <
IFIDN <B>,<ALL>,<TKREP (\..X,A,0,M.MT'A)>
IFDIF <B>,<ALL>,<TKREP (\..X,A,B,C)>
>
DEFINE TKREP (X,A,B,C) <
IFE C,<DEF'X (A,\B)>
IFN C,<
..UNI==B
REPEAT <C-B+1>,<
DEF'X (A,\..UNI)
..UNI==..UNI+1>
>
>
DEFINE DEF7 (K,U) <XP M.M7'K'U,1>
DEFINE DEF6 (K,U) <XP M.M6'K'U,1>
;MACRO TO GENERATE A UDB
DEFINE GENUNI(Y,U,EMACR) <
..U'Y'U::! PHASE 0
TUBNAM::! SIXBIT /MT'Y'U/ ;(0) UNIT NAME
TUBKDB::! 0,,MT'Y'KDB ;(1) PNTR TO OWNING KONTROLLERS
TUBADR::! 0,,U ;(2) UNIT ADDRS ON KONTROLLER
TUBAKA::! 0 ;(3) LH = UNIT ADDRS (CURRENT)
; RH = CURRENT KONTROLLER
TUBDDB::! 0 ;(4) PNTR TO DDB'S
TUBCUR::! 0 ;(5) POINTER TO CURRENT DDB
IFDEF M.M7'Y'U,<..X==TUCDR7##> ;7 TRACK TAPE
IFNDEF M.M7'Y'U,< ;NOT 7 TRACK TAPE
IFLE <M.MT'Y'T-1>,<..X==TUCDR8##> ;TM10 9 TRACK
IFE <M.MT'Y'T-2>,<..X==TUCDR6##> ;TC10C 800/1600 BPI
IFE <M.MT'Y'T-3>,<
IFNDEF M.M6'Y'U,<..X==TUCDR6##> ;TU70 800/1600 BPI
IFDEF M.M6'Y'U,<..X==TUCDR5##> ;TU72 1600/6250 BPI
>
IFE <M.MT'Y'T-4>,<..X==TUCDR6##> ;TM02 800/1600 BPI
>
TUBCNF::! ;(6) CONFIG INFO (RH)
TUBSTS::!..X+M.MT'Y'T ; UNIT STATUS (LH)
TUBQUE::! 0 ;(7) QUEUE PNTR FOR IORB'S
TUBERR::! 0 ;(10) ERROR RECOVERY INFO
TUBRID::! 0 ;(11) REELID (DAEMON KNOWS ABT THIS AREA)
TUBFIL::! 0 ;(12) # OF FILES FROM BOT
TUBREC::! 0 ;(13) # OF RECORDS FROM EOF
TUBCRD::! 0 ;(14) # CHARS READ SINCE UNLOAD
TUBCWR::! 0 ;(15) # CHARS WRITTEN SINCE UNLOAD
TUBSRE::! 0 ;(16) SOFT READ ERRORS
TUBHRE::! 0 ;(17) HARD READ ERRORS
TUBSWE::! 0 ;(20) SOFT WRITE ERRORS
TUBHWE::! 0 ;(21) HARD WRITE ERRORS
TUBTME::! 0 ;(22) TOTAL MEDIA ERRORS SINCE UNLOAD
TUBCLE==:.-1 ; END OF AREA TO CLEAR
TUBTDE::! 0 ;(23) TOTAL DEVICE ERRORS SINCE RELOAD
TUBTUN::! 0 ;(24) TOTAL UNLOADS
TUBTRY::! 0 ;(25) RETRIES TO RESOLVE ERROR
TUBCCR::! 0 ;(26) CHAR CNT ON LAST REC
TUBPBE::! 0 ;(27) POSITION BEFORE ERROR
; FILE,,RECORD
TUBFES::! 0 ;(30) FINAL ERROR STATE WORD
TPCHMX==:.-TUBRID ; MAX ARG ALLOWED FOR MTACHR UUO
TUBCHR::! 0 ;(31) STATISTICS FOR MTCHR. UUO
TUBDDA::! BLOCK TUBTME-TUBRID+1 ;SHADOW AREA FOR DAEMON
TUBDDE==:.-1 ;END OF SHADOW AREA (DAEMON KNOWS ABT)
IFN FTKI10!FTKL10&FTRDBACK,<
TUBCNI::! 0 ;ERROR STATUS FOR NEXT RECORD
>
IFN FTTLAB,<
TUBMSG::! XWD TLMSIZ,.IPCTL## ;LENGTH,,FUNCTION CODE FOR LABEL MESSAGE
TUBPHY::! 0 ;PHYSICAL NAME FOR LABEL PCS
TUBLBL::! ;LABEL STATUS WORD
IFNDEF M.M7'Y'U,<MTDLTP>
IFDEF M.M7'Y'U,<LT.BLP>
TLMSIZ==.-TUBMSG
TUBRFM::!0 ;RECORD FORMAT (FOR LABELS ONLY)
TUBRCC::!0 ;RECORD SIZE (FOR LABELS ONLY)
TUBBKL::!0 ;BLOCK SIZE (FOR LABELS ONLY)
TUBEXP::!0 ;EXPIRATION DATE (FOR LABELS ONLY)
TUBPRT::!0 ;PROTECTION (FOR LABELS ONLY)
TLPMAX==:.-TUBRFM
>
EMACR(Y) ;GENERATE ERROR INFO BLOCK
DEPHASE
>
;SPECIFIC MACROS FOR VARIOUS CONTROLLERS
IFG M.TM10,<
DEFINE ETMMAC (X) <
TUBIEP::! -2,,TTMICC ;(30) INITIAL ERROR PNTR
TUBFEP::! -2,,TTMFCC ;(31) FINAL ERROR PNTR
TTMICC::! 0 ;LAST ERROR INITIAL CONI MTC
TTMICS::! 0 ;LAST ERROR INITIAL CONI MTS
TTMFCC::! 0 ;LAST ERROR FINAL CONI MTC
TTMFCS::! 0 ;LAST ERROR FINAL CONI MTS
>
DEFINE KTMMAC (X) <
TTMCOC::! CONO MT'X'C,(T1)
TTMCOS::! CONO MT'X'S,(T1)
TTMCIC::! CONI MT'X'C,T1
TTMCIS::! CONI MT'X'S,T1
TTMDOS::! DATAO MT'X'S,T1
TTMDIC::! DATAI MT'X'C,T1
TTMBLK::!
IFE M.MT'X'T,<BLKI MT'X'C,(<BLKO MT'X'C,>)>
IFN M.MT'X'T,<0>
TTMCHE::! 0 ;-1 IF CHANNEL DETECTED ERROR
TTMJSR::! IFN M.MT'X'T,<0> ;JSR FOR TM10A BLKI/O STOP
IFE M.MT'X'T,<JSR MT'X'KDB+TTMEND
TTMEND::! 0 ;HERE AT END OF DATA XFER
CONO MT'X'S,1 ;STOP TAPE
JEN @MT'X'KDB+TTMEND ;DISMISS INTERUPT
> ;;; END IF3 MT'X'T
> ;;; END DEFINE KTMMAC
> ;;; END IFG M.TM10
IFG M.TX01,<
DEFINE ETXMAC (X) <
TUBIEP::! -^D20,,TTXIST ;(30) INITIAL ERROR PNTR
TUBFEP::! -^D20,,TTXFST ;(31) FINAL ERROR PNTR
TTXIST::! BLOCK ^D19 ;LAST ERROR INITIAL STATUS
TTXISE::! BLOCK 1 ;LAST WORD IN INTIAL STATUS
TTXFST::! BLOCK ^D20 ;LAST ERROR FINAL STATUS
>
DEFINE KTXMAC (X) <
TTXCOS::! CONO MT'X'S,(T1)
TTXCIS::! CONI MT'X'S,T1
TTXDOS::! DATAO MT'X'S,T2
TTXDIS::! DATAI MT'X'S,T2
TTXTMP::! BLOCK 1 ;TEMP LOC FOR DX10
>
> ;;; END IFG M.TX01
IFG M.TC10,<
DEFINE ETCMAC (X) <
TUBIEP::! -1,,TTCICS ;(30) INITIAL ERROR PNTR
TUBFEP::! -1,,TTCFCS ;(31) FINAL ERROR PNTR
TTCICS::! 0 ;LAST ERROR INITIAL STATUS
TTCFCS::! 0 ;LAST ERROR FINAL STATUS
>
DEFINE KTCMAC (X) <
TTCCOS::! CONO MT'X'S,(T1)
TTCCIS::! CONI MT'X'S,T1
TTCDOS::! DATAO MT'X'S,T1
TTCDIS::! DATAI MT'X'S,T1
>
> ;;; END IFG M.TC10
IFG M.TM02,<
DEFINE ET2MAC (X) <
TUBIEP::! -16,,TT2ICS
TUBFEP::! -16,,TT2REG
TT2ICS::! BLOCK 16
TT2REG::! BLOCK 16
>
DEFINE KT2MAC (X) <
TT2UVA::!0 ;TEMP LOC FOR READ-BACKWARDS
>
> ;;END IFG M.TM02
;NOW GENERATE THIS WHOLE MESS
%TM10S==340 ;INITIAL TM10 CONTROLLER DEVICE CODE
%DX10S==220 ;INITIAL DX10 CONTROLLER DEVICE CODE
%TC10S==724 ;INITIAL TC10 CONTROLLER DEVICE CODE
%TM02S==270+4*<M.RH1P+M.RH1S>
IFG <%TM02S-274>,<%TM02S==%TM02S+60>
IFNDEF TAPTIM,<XP TAPTIM,^D60> ;MAX TIME TO SKIP 10 RECORDS
XP DSETIM,^D270 ;MAX TIME TO DO DATA SECURITY ERASE
IFNDEF NOISE,<XP NOISE,^D12> ;NOISE RECORD LENGTH IN BYTES
IFNDEF MQUANT,<XP MQUANT,^D10> ;CONSECUTIVE RECORDS
XP NOISEW,NOISE/4
..KON==0 ;INITIATE LOOP
OFFSET==0
$LOCW==ALLDSK ;FIRST AVAILABLE CHL PNTR
$LOCD==0 ;DX10 CHL PNTR
TAPDST==:.
REPEAT TAPN,<
GENTAP(\..KON) ;DO A CONTROLLER
..KON==..KON+1 ;ADVANCE TO NEXT
>
TAPDEN==:.-1
;RANDOM BYTE PNTRS INTO DATA STRUCTURE
PMTCRC::POINT 9,TUBCHR(U),26 ;LAST 9TK CRC (NRZI)
PMTNCR::POINT 3,TUBCHR(U),29 ;BYTE RESIDUE OF LAST WORD
PBUFRM::POINT 14,DEVOAD(F),13
> ;;;; END OF IFG TAPN
IFE TAPN,< ;;;; GLOBAL DUMMIES
XP TPMCTT,CPOPJ
XP TAPMIN,CPOPJ
XP TAPSEC,CPOPJ
XP UTAPOP,CPOPJ
XP MTARID,CPOPJ
XP MTACHR,CPOPJ
XP TPFREE,CPOPJ
XP TPMIN,CPOPJ
XP MTAPE0,CPOPJ
TPMSIL::JRST CPOPJ1##
XP TDYDN1,0
XP TPKINI,0
XP TUBQUE,0
XP TDVKDB,0
XP TUYKTP,0
XP TKBUDB,0
XP TKBDSP,0
XP TKBCDB,0
XP TKBKDB,0
XP TDVUDB,0
XP NOISEW,0
XP TUC7TK,0
XP TUBDDB,0
XP TUBCNF,0
XP PBUFRM,0
> ;;; END IFE TAPN
IFE M.TX01,<
TTXCOS::
TTXCIS::JFCL ;DUMMY'S
CCHJGO==:0
>
IFE M.TM10,<
TTMCIC::
TTMCIS::
TTMCOC::JFCL ;DUMMY'S
>
IFE M.TM02,<
TT2CO1::
TT2CI2::JFCL
>
IFE M.TC10,<
TTCCOS::
TTCCIS::JFCL
>
;DECTAPE ENTRY POINT AND BIT DEFINITIONS
SAVN==1 ;OLD FORMAT DECTAPE SYSTEMS NO LONGER SUPPORTED BY DEC.
; MONGEN NO LONGER ASKS THE DECTAPE FORMAT QUESTIONS.
IFG M.DTA!M.DTB, <EXTERNAL DTASRN> ;TD10 WITH NEW FORMAT
IFG DTCN, <
IFG SAVN, <EXTERNAL DTCSRN> ;556 WITH NEW FORMAT
IFE SAVN, <EXTERNAL DTCSRO> ;556 WITH OLD FORMAT
>
IFG M.DTA!M.DTB, < ;DEFINE SYMBOLS IF PDP-10 DECTAPES (TD10)
>
IFG DTCN, < ;DEFINE SYMBOLS IF PDP-6 DECTAPES (556)
INTERNAL DCLOC,DCLOC1,DCON,DCOFF,DCIN,DCOUT
DCLOC==40+2*DCTCHN ;EVEN DC PI CHANNEL LOC
DCLOC1==DCLOC+1 ;NEXT LOCATION
DCBIT==1
REPEAT 7-DCTCHN, <DCBIT==DCBIT*2>
DCON==2000+DCBIT ;TURN DC PI CHANNEL ON
DCOFF==1000+DCBIT ;TURN DC PI CHANNEL OFF
DCIN==4010+DCTCHN ;SET DATA CHANNEL FOR INPUT
DCOUT==3410+DCTCHN ;SET DATA CHANNEL FOR OUTPUT
>
;DEFINE SAVE MODE AND EXTENSION FOR OLD OR NEW FORMAT
INTERNAL SAVDMP
IFE SAVN, <
SAVDMP==<SIXBIT / DMP/> ;EXTENSION FOR SAVED FILES == "DMP"
>
IFN SAVN, <
SAVDMP==<SIXBIT / SAV/> ;EXTENSION FOR SAVED FILES == "SAV"
>
IFE M.DTA!M.DTB,<
;IF NO DECTAPES, SATISFY GLOBALS BY DEFINING DUMMIES
INTERNAL DTASEC,DTADDB,DTXINI,DSCON,LVFLAG,USEWRD,DCONS,KONEND,DTADSP
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
>
DAC=320 ;CONTROL DEVICE NUMBER
DAS=DAC+4 ;CONTROL STATUS NUMBER
IFG M.DTA,<
SUBTTL INTERRUPT HEAD FOR DTA
;FLAGS LEVEL CODE
;CONTROL DEPENDENT PORTION OF DECTAPE SERVICE
DEFINE CDC (C,B) <
INTERN C
C=.-DTADDB ;RELATIVE LOCATION WITHIN CONTROL BLOCK
B>
INTERNAL DTADDB,DTADDS,DADINT,DTAINT,DTADIR,DTXDDB
;MODEL DEVICE DATA BLOCK
DTXDDB=.-DTADDB
DTADDB: SIXBIT /DTA0/ ;(0) - DEVNAM
XWD DVCMDA!<^D6*HUNGST>,200 ;(1) - DEVCHR
0 ;(2) - DEVIOS
EXP DTADSP## ;(3) - DEVSER
XWD 1107,154403 ;(4) - DEVMOD
0 ;(5) - DEVLOG
0 ;(6) - DEVBUF
XWD R,0 ;(7) - DEVIAD
XWD R,0 ;(10) - DEVOAD
0 ;(11) - DEVSTS
XWD .TYDTA,0 ;(12) - DEVSTA
0 ;(13) - DEVXTR
0 ;(14) - DEVEVM
0 ;(15) - DEVPSI
0 ;(16) - DEVESE
0 ;(17) - DEVHCW
0 ;(20) - DEVJOB
0 ; - DEVFIL
0 ; - DEVEXT
0 ; - FSTBLK
DTADIR+DTADDB ; - DLOC
0 ; - IBLK
0 ; - OBLK
0 ; - DISPAD
0 ; - DMPLST
0 ; - SVDWRD
0 ; - DJOTOP
0 ; - DJOBOT
0 ; - BADCOM
DTADIR==.-DTADDB
BLOCK 200
XP DTADDS,.-DTADDB
;DATA LEVEL CODE...CHANNEL 1 OR 2 USUALLY
DADINT: CONSO DAS,1 ;DATA INTERRUPT FOR THIS CONTROL?
JRST . ;NO- PROCEED DOWN CHAIN
SKIPN DTAUSE ;EXPECTING AN INTERRUPT?
JRST DADINT+1 ;NO, IGNORE IT
SKIPE DADSRC ;ARE WE SEARCHING FOR BLOCK NUMBERS?
JRST DASRCH ;YES
DAIOWD: BLKI DAC,DTAPNT ;EXECUTE BLKI OR BLKO FOR THIS UNIT
JRST DADTHR ;POINTER RAN OUT
DADCTN: JFCL ;GOING REVERSE?
JEN @DADCHL## ;NO- DISMISS DECTAPE DATA CHANNEL A
SOS DTAPNT ;YES- DECREMENT POINTER
SOS DTAPNT ;TWICE
JEN @DADCHL## ;DISMISS THE INTERRUPT
DADTHR: SKIPE DADDMP ;DUMP MODE POINTER RAN OUT?
JRST DADMPA ;YES- ADVANCE POINTER
DADFNS: CONO DAS,770001 ;SEND OUT FUNCTION STOP IF THROUGH
JEN @DADCHL## ;DISMISS INTERRUPT
DADSRC: CDC DTXSRC,0;SET NEGATIVE WHEN READING BLOCK NUMBERS
;HERE WHEN READING BLOCK NUMBERS AT DATA INTERRUPT LEVEL
DASRCH: MOVEM W,DTASVC ;SAV W
DACCNC: CONI DAC,W ;READ FLAGS REGISTER
HRLZS W ;PUT MOST FLAGS INTO LEFT HALF
HRRI W,DTADDB ;POINT TO THIS CONTROL BLOCK
JRST SRCH## ;DO THE SEARCH
DADXIT: MOVE W,DTASVC ;RESTORE W
JEN @DADCHL## ;DISMISS THE INTERRUPT
DADMPA: MOVEM W,DTASVC ;SAVE W
HRRZI W,DTADDB ;POINT TO CONTROL A
JRST DMPADV## ;PROCESS THE EXHAUSTED BLKI/O
XP DTSFNS,DADFNS-DTADDB
XP DXDINT,DADINT-DTADDB
XP DXIOWD,DAIOWD-DTADDB
XP DXDCTN,DADCTN-DTADDB
DACNUM: CDC DXCNUM,<<DAC>B11>;CONTROL NUMBER
XP DTXXIT,DADXIT-DTADDB
XP DTXCNC,DACCNC-DTADDB
;FLAGS LEVEL INTERRUPT HEAD...
DTAINT: CONSO DAS,770000 ;INTERRUPT FOR THIS CONTROL?
JRST . ;NO- PROCEED DOWN CHAIN
SKIPN DTAUSE
JRST DTAINT+1
JSR DTASAV## ;YES- SAV ACCUMULATORS FOR THIS LEVEL
CDC DXCCNT,<CONI DAC,T1>;READ FLAGS INTO T1
CDC DTSCNI,<CONI DAS,T4>;READ STATUS INTO T4
HRLZI W,(T1) ;PUT FLAGS (RH) INTO W (LH)
HRRI W,DTADDB ;ADDRESS OF CONTROL DEPENDANT BLOCK
JRST DTXINT## ;TO NON-CONTROL DEPENDANT SECTION
CDC DTSCN2,<CONI DAS,T1>;STATUS REGISTER INTO T1
;CONSTANTS REQUIRED FOR EACH CONTROL...
CDC BFPNTR,<IOWD 200,DABUF+1>
DTAUSE: CDC USEWRD,0
CDC ADRPRG,0
DTAPNT: CDC PNTR,0
CDC TEMP,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
DTASVC: 0
CDC BLKCNT,0
CDC SVPNTR,0
CDC USPNTR,0
CDC DIRCTN,0
DTABUF=.-DTADDB
DABUF: CDC BUF,<BLOCK 200> ;A CONTROL MONITOR BUFFER
CDC DTXCON,<CONO DAC,(T1)> ;CONDITIONS OUT - A CONTROL A
CDC DTXSTP,<CONO DAC,400000> ;STOP SELECTED TAPE
CDC DTXTRN,<CONO DAC,DTTURN##> ;TURN SELECTED TAPE AROUND
CDC DTSCO2,<CONO DAS,2(T4)>
CDC DTSENJ,<CONO DAS,670000> ;ENABLE JOB DONE
CDC DTXREQ,D1REQ## ;ADDRESS OF REQUEST COUNT FOR THIS CONTROL
CDC DTXWAT,D1WAIT## ;WAIT ROUTINE
CDC DTXFRE,D1FREE## ;FREE-UP ROUTINE
DADDMP: CDC DTXDMP,0 ;SET TO -1 WHEN READING IN DUMP MODE
XP DTXIOG,.-DTADDB
CONO DAC,DTBOTH##(T2) ;START UP DECTAPE
CONO DAS,770000 ;ENABLE INTERRUPT CONDITIONS
POPJ P, ;RETURN
CDC DTXSF,<CONSZ DAC,100000> ;SKIP IF GOING FORWARD
CDC DTXDSL,<CONO DAC,410000> ;STOP AND DESELECT TAPE
CDC DTXDST,<CONO DAC,10000> ;DESELECT TAPE
CDC DTXSTO,<CONO DAC,430000(T1)> ;STOP AND DESELECT
CDC DTXTR2,<CONO DAC,230200(T1)> ;TURN TAPE, SEARCH FOR BLOCKS
CDC DTXINI,<CONO DAC,0> ;SHUT DOWN CONTROL
CDC DTXDTI,<DATAI DAC,T1> ;READ A BLOCK NUMBER
XP DCONS,.-DTADDB
> ;END IFG M.DTA CONDITIONAL
DBC=330 ;CONTROL DEVICE NUMBER
DBS=DBC+4 ;CONTROL STATUS NUMBER
IFG M.DTB,<
SUBTTL INTERRUPT HEAD FOR DTB
INTERNAL DTBDDB,DTBDDS,DBDINT,DTBINT,DTBDIR
;FLAGS LEVEL CODE
;CONTROL DEPENDANT PORTION OF DECTAPE SERVICE
DEFINE CDC (C,B) <
INTERN C
C=.-DTBDDB ;RELATIVE LOCATION WITHIN CONTROL BLOCK
B>
;MODEL DEVICE DATA BLOCK
DTXDDB=.-DTBDDB
DTBDDB: SIXBIT /DTB0/ ;(0) - DEVNAM
XWD DVCMDA!<^D6*HUNGST>,200 ;(1) - DEVCHR
0 ;(2) - DEVIOS
EXP DTADSP## ;(3) - DEVSER
XWD 1107,154403 ;(4) - DEVMOD
0 ;(5) - DEVLOG
0 ;(6) - DEVBUF
XWD R,0 ;(7) - DEVIAD
XWD R,0 ;(10) - DEVOAD
0 ;(11) - DEVSTS
XWD .TYDTA,0 ;(12) - DEVSTA
0 ;(13) - DEVXTR
0 ;(14) - DEVEVM
0 ;(15) - DEVPSI
0 ;(16) - DEVESE
0 ;(17) - DEVHCW
0 ;(20) - DEVJOB
0 ; - DEVFIL
0 ; - DEVEXT
0 ; - FSTBLK
DTBDIR+DTBDDB ; - DLOC
0 ; - IBLK
0 ; - OBLK
0 ; - DISPAD
0 ; - DMPLST
0 ; - SVDWRD
0 ; - DJOTOP
0 ; - DJOBOT
0 ; - BADCOM
DTBDIR==.-DTBDDB
BLOCK 200
XP DTBDDS,.-DTBDDB
;DATA LEVEL CODE...CHANNEL 1 OR 2 USUALLY
DBDINT: CONSO DBS,1 ;DATA INTERRUPT FOR THIS CONTROL?
JRST . ;NO- PROCEED DOWN CHAIN
SKIPN DTBUSE
JRST DBDINT+1
SKIPE DBDSRC ;ARE WE SEARCHING FOR BLOCK NUMBERS?
JRST DBSRCH ;YES
DBIOWD: BLKI DBC,DTBPNT ;EXECUTE BLKI OR BLKO FOR THIS UNIT
JRST DBDTHR ;POINTER RAN OUT
DBDCTN: JFCL ;GOING REVERSE?
JEN @DBDCHL ;NO- DISMISS DECTAPE DATA CHANNEL A
SOS DTBPNT ;YES- DECREMENT POINTER
SOS DTBPNT ;TWICE
JEN @DBDCHL## ;DISMISS THE INTERRUPT
DBDTHR: SKIPE DBDDMP ;IN DUMP MODE?
JRST DBDMPA ;YES
DBDFNS: CONO DBS,770001 ;SEND OUT FUNCTION STOP IF THROUGH
JEN @DBDCHL ;DISMISS INTERRUPT
DBDSRC: CDC DTXSRC,0;SET NEGATIVE WHEN READING BLOCK NUMBERS
;HERE WHEN READING BLOCK NUMBERS AT DATA INTERRUPT LEVEL
DBSRCH: MOVEM W,DTBSVC ;SAV W
DBCCNC: CONI DBC,W ;READ FLAGS REGISTER
HRLZS W ;PUT IN LEFT HALF OF W
HRRI W,DTBDDB ;POINT TO THIS CONTROL BLOCK
JRST SRCH## ;DO THE SEARCH
DBDXIT: MOVE W,DTBSVC ;RESTORE W
JEN @DBDCHL ;DISMISS THE INTERRUPT
DBDMPA: MOVEM W,DTBSVC ;SAVE W
HRRZI W,DTBDDB ;ADDRESS OF THIS CONTROL BLOCK
JRST DMPADV## ;PROCESS THE EXHAUSTED BLKI/O
XP DTSFNS,DBDFNS-DTBDDB
XP DXDINT,DBDINT-DTBDDB
XP DXIOWD,DBIOWD-DTBDDB
XP DXDCTN,DBDCTN-DTBDDB
DBCNUM: CDC DCXNUM,<<DBC>B11>;DECTAPE CONTROL B DEVICE NUMBER
XP DTXXIT,DBDXIT-DTBDDB
XP DTXCNC,DBCCNC-DTBDDB
;FLAGS LEVEL INTERRUPT HEAD...
DTBINT: CONSO DBS,770000 ;INTERRUPT FOR THIS CONTROL?
JRST . ;NO- PROCEED DOWN CHAIN
SKIPN DTBUSE
JRST DTBINT+1
JSR DTBSAV## ;YES- SAV ACCUMULATORS FOR THIS LEVEL
CDC DXCCNT,<CONI DBC,T1>;READ FLAGS INTO T1
CDC DTSCNI,<CONI DBS,T4>;READ STATUS INTO T4
HRLZI W,(T1) ;PUT FLAGS (RH) INTO W (LH)
HRRI W,DTBDDB ;ADDRESS OF CONTROL DEPENDATNT BLOCK
JRST DTXINT## ;TO NON-CONTROL DEPENDANT SECTION
CDC DTSCN2,<CONI DBS,T1>;READ STATUS REGISTER INTO T1
;CONSTANTS REQUIRED FOR EACH CONTROL...
CDC BFPNTR,<IOWD 200,DBBUF+1>
DTBUSE: CDC USEWRD,0
CDC ADRPRG,0
DTBPNT: CDC PNTR,0
CDC TEMP,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
DTBSVC: 0
CDC BLKCNT,0
CDC SVPNTR,0
CDC USPNTR,0
CDC DIRCTN,0
DTBBUF=.-DTBDDB
DBBUF: CDC BUF,<BLOCK 200> ;A CONTROL MONITOR BUFFER
CDC DTXCON,<CONO DBC,(T1)> ;CONDITIONS OUT - A CONTROL A
CDC DTXSTP,<CONO DBC,400000> ;STOP SELECTED TAPE
CDC DTXTRN,<CONO DBC,DTTURN> ;TURN SELECTED TAPE AROUND
CDC DTSCO2,<CONO DBS,2(T4)>
CDC DTSENJ,<CONO DBS,670000> ;ENABLE JOB DONE
CDC DTXREQ,D2REQ## ;ADDRESS OF REQUEST COUNT FOR THIS CONTROL
CDC DTXWAT,D2WAIT## ;WAIT ROUTINE
CDC DTXFRE,D2FREE## ;FREE-UP ROUTINE
DBDDMP: CDC DTXDMP,0 ;NON-ZERO FOR DUMPMODE I/O
XP DTXIOG,.-DTBDDB
CONO DBC,DTBOTH(T2) ;START UP DECTAPE
CONO DBS,770000 ;ENABLE INTERRUPT CONDITIONS
POPJ P, ;RETURN
CDC DTXSF,<CONSZ DBC,100000> ;SKIP IF GOING FORWARD
CDC DTXDSL,<CONO DBC,410000> ;STOP AND DESELECT TAPE
CDC DTXDST,<CONO DBC,10000> ;DESELECT TAPE
CDC DTXSTO,<CONO DBC,430000(T1)> ;STOP AND DESELECT
CDC DTXTR2,<CONO DBC,230200(T1)> ;TURN TAPE, SEARCH FOR BLOCKS
CDC DTXINI,<CONO DBC,0> ;SHUT DOWN DECTAPE CONTROL
CDC DTXDTI,<DATAI DBC,T1> ;READ A BLOCK NUMBER
EXTERN D1REQ,D2REQ
XP DCONS,.-DTBDDB
> ;END IFG M.DTB CONDITIONAL
KONEND: ;END OF KONTROLLER DATA BLOCKS
INTERN DLOC,FSTBLK,IBLK,OBLK,DISPAD,DMPLST,SVDWRD
INTERN DJOTOP,DJOBOT,BADCOM,KONEND
;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
CDR2==154 ;DEVICE SELECTION CODE FOR SECOND CDR
IFG CDRN, <
SUBTTL PROTOTYPE DEFINITION FOR CARD READER DEVICE DATA BLOCKS
DEFINE CDRDDB (N) <
INTERN CR'N'DDB
CR'N'SV1==CR'N'SAC##+F ;DEFINE F SAVE LOCATION
CDRCON==.-CR'N'DDB
CR'N'INT::CONSO CR'N,0 ;(-4) SKIP IF INTERRUPT FOR THIS READER
JRST .-1 ;(-3) NOT HERE, CONTINUE DOWN THE CHAIN
MOVEM F,CR'N'SV1 ;(-2) SAVE F IN CHANNEL SAVE AREA
JSP F,CDRINT ;(-1) SET F TO DDB ADDRESS AND SERVICE INTERRUPT
CR'N'DDB:
CR'N'NAM:
CRNAM=SIXBIT/CDR/
IFE CDRN+DCDRN-1,<CRNAM> ;(0) PHYSICAL DEVICE NAME
IFN CDRN+DCDRN-1,<CRNAM+<20+$CRNUM>B23> ;(0) PHYSICAL DEVICE NAME
XWD 2*HUNGST, ;(1) DEVICE CHARACTERISTICS
CDRIOS==.-CR'N'DDB
0 ;(2) DEVIOS
CDRDSP ;(3) LH=DDB LINK, RH=CDR DISPATCH TABLE
XWD DVCDR+DVIN,14403 ;(4) DEVICE CHARACTERISTICS
0 ;(5) LOGICAL DEVICE NAME (DEVLOG)
0 ;(6) BUFFER HEADER ADDRESSES
CDRIAD==.-CR'N'DDB
XWD R,0 ;(7) ADDRESS OF CURRENT INPUT BUFFER
CDRPTR==.-CR'N'DDB
XWD R,0 ;(10) BYTE POINTER TO CURRENT INPUT BUFFER
CDRSTS==.-CR'N'DDB
CR'N'STS: 0 ;(11) LATEST CONI STATUS BITS
XWD .TYCDR!.SPCDR,0 ;SPOOLED CDR
0 ;DEVXTR
0 ;DEVEVM
0 ;DEVPSI
0 ;DEVESE
0 ;DEVHCW
0 ;DEVJOB
CDRCTR==.-CR'N'DDB
0 ;BYTE COUNTER FOR IDPB'S INTO USER'S BUFFERS
CDRCHK==.-CR'N'DDB
0 ;CHECK SUM OF CURRENT INPUT BINARY CARD
CDRCNT==:.-CR'N'DDB
0 ;# OF CARDS READ
CDRADR==.-CR'N'DDB
0 ;USER'S JOBDAT ADDRESS
CDRCOL==.-CR'N'DDB
0 ;COLUMN COUNT ON CURRENT CARD
IFN FTCDRSI, <
INTERN CDRSUP
CDRSUP==.-CR'N'DDB ;BLKI POINTER TO USER'S BUFFER
CR'N'SUP: 0 ; FOR SUPER IMAGE MODE INPUT
>
CDRMIS==.-CR'N'DDB
0 ;FLAG =-1 IF MISSED DATA ON CURRENT CARD
CDRSPU==.-CR'N'DDB ;COUNT OF SPURIOUS END-OF-CARD FLAGS
0 ; TO CHECK ON POSSIBLE HARDWARE PROBLEM
CDRSV2==.-CR'N'DDB
0 ;SAVE LOCATION FOR U
IFN FTCDRSI,<
INTERN CDRBKI
CDRBKI==.-CR'N'DDB
BLKI CR'N,CR'N'SUP
>
CDRCNO==.-CR'N'DDB
CONO CR'N,(U)
CDRCSO==.-CR'N'DDB
CONSO CR'N,(U)
CDRCSZ==.-CR'N'DDB
CONSZ CR'N,(U)
CDRDTI==.-CR'N'DDB
DATAI CR'N,U
CDRRDY==.-CR'N'DDB
EXTERN IDRDY
CONSO CR'N,IDRDY ;SKIP IF DATA READY
CDRRTR==.-CR'N'DDB
EXTERN NOTRDY
CONSZ CR'N,NOTRDY ;SKIP IF READY TO READ
CDRSVE==.-CR'N'DDB
CR'N'SVE: 0 ;ROUTINE TO SAVE AC'S
MOVE F,CR'N'SV1 ;RESTORE F
JSR CR'N'SAV## ;SAVE AC'S AND ESTABLISH P
MOVEI F,CR'N'DDB ;SET UP DDB ADDRESS
JRST @CR'N'SVE ;AND RETURN
CDREX1==.-CR'N'DDB
MOVE F,CR'N'SV1 ;RESTORE F
JEN @CR'N'CHL## ;AND DISMISS INTERRUPT
CRFCON==.-CR'N'DDB
CF'N'INT::CONSO CR'N,0 ;SKIP IF CDR FLAG
JRST .-1 ;NOT THIS, CONTINUE DOWN SKIP CHAIN
JSR CF'N'SAV## ;SAVE AC'S
MOVEI F,CR'N'DDB ;SET UP F
JRST CRFINT## ;AND SERVICE INTERRUPT
IFN FT5UUO, <
CRXSTS==.-CR'N'DDB
INTERN CRXSTS
CONI CR'N,CR'N'STS
>
INTERN CDRCNO,CDRCOL,CDRCON,CDRCSO,CDRCSZ,CDRCTR,CDRRDY
INTERN CDRADR,CDRDTI,CDRIAD,CDRIOS,CDRMIS,CDRPTR,CDRSPU
INTERN CDRSV2,CDRSVE,CDREX1,CDRCHK,CDRRTR
INTERN PCDRAS,PCDRBI,PCDRsi,crfcon
>
EXTERN CDRSRX,CDRINT,CDRDSP
IFNDEF CR0,<CR0==CR> ;DEFINE STANDARD MNEMONIC DEFINITIONS
IFNDEF CR1,<CR1==CDR2> ; BUT ALLOW FOR OVERRIDE
$CRNUM==0 ;TEMPORARY SYMBOL USED FOR MACRO EXPANSION
REPEAT CDRN, <
CDRDDB \$CRNUM
$CRNUM==$CRNUM+1
>
>
IFG DCDRN, < ;ONLY NEED THIS IF FRONT-END CARD READERS
DEFINE DCRDDB (D,U,X) <
FC'X'DDB::
CRNAM=SIXBIT/CDR/
CRNAM+<20+$CRNUM>B23 ;(0) DEVNAM
XWD 2*HUNGST, ;(1) DEVCHR
0 ;(2) DEVIOS
DCRDSP ;(3) LH=DDB LINK, RH=DISPATCH TABLE
XWD DVCDR+DVIN,14403 ;(4) DEVMOD
0 ;(5) DEVLOG
0 ;(6) DEVBUF
0 ;(7) DEVIAD
0 ;(10) DEVPTR
0 ;(11) DEVSTS
XWD .TYCDR!.SPCDR,0 ;(12) DEVSPL
0 ;(13) DEVXTR
0 ;(14) DEVEVM
0 ;(15) DEVPSI
0 ;(16) DEVESE
EXP 3B11 ;(17) DEVHCW
0 ;(20) DEVJOB
0 ;(21) DEVCTR
DCRDUX==:.-FC'X'DDB
XWD U,D ;(22) LINE NUMBER,,DTE INDEX
CDRCNT==:.-FC'X'DDB
0 ;(23) CARD COUNT
DCRBUF==:.-FC'X'DDB
BLOCK ^D40 ;(24) BUFFER FOR READING A CARD
>
EXTERN DCRSER,DCRDSP
DEFINE RSXDTE (C,D) <
ZZ=0
REPEAT M.CR'C'D,<
DCRDDB \N,\ZZ,\<$CRNUM-CDRN>
ZZ=ZZ+1
$CRNUM=$CRNUM+1
>
N==N+1
>
$CRNUM=CDRN ;START NUMBERING DCB'S AT CDRN
N==0 ;DTE INDEX STARTS AT 0
RSX20F ;GENERATE THE FRONT END READER DDB'S
> ;END IFN DCDRN
IFN M.KL10,<
IFE DCDRN,<FCRDSP==:EATDSP##>
> ;END IFN M.KL10
;IF THERE ARE REMOTE OR LOCAL READERS, CERTAIN BYTE POINTERS
; AND THE CHARACTER TRANSLATION TABLES MUST BE DEFINED.
IFN CDRN+M.RCDR+DCDRN,<
IFN M.KA10,<ZZ==R>
IFN M.KI10!M.KL10,<ZZ=0>
XP PCDRAS,700+ZZ ;ASCIZ BYTE POINTER
XP PCDRBI,1400+ZZ ;BINARY AND IMAGE BYTE POINTER
XP PCDRSI,4400+ZZ ;SUPER IMAGE BYTE POINTER
;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 /)]<!/ ;12,8/4-7
ASCII /DEFG/ ;12/4-7
ASCII /*[>&/ ;11,8/4-7
ASCII /("#%/ ;0,8/4-7
ASCII /@^'\/ ;8/4-7
$LOW
> ;END OF IFN RCDRN+M.RCDR
;CARD PUNCH ENTRY POINT
IFG CDPN, <
EXTERNAL CDPSER ;ENTRY POINT
CP10D:: EXP M.CP1D ;1 IF CP10D, 0 IF CP10A
>
;-------DK10 BITS
RTC== 070 ;DEVICE ASSIGNMENT
;CONO BITS
DK.OSO==1B23 ;SET COUNT OVERFLOW
DK.OCO==1B31 ;CLEAR COUNT OVERFLOW
DK.OSD==1B24 ;SET DONE
DK.OCD==1B32 ;CLEAR DONE
DK.OSU==1B28 ;SET USER TIME
DK.OCU==1B27 ;CLEAR USER TIME
DK.OON==1B30 ;TURN CLOCK ON
DK.OOF==1B29 ;TURN CLOCK OFF
DK.OIC==1B25 ;INCREMENT CLOCK(IF OFF)
DK.OCC==1B26 ;CLEAR CLOCK(COUNTER,DONE,OVF.,USER,PIA)
;CONI BITS
DK.IO== 1B31 ;OVERFLOW FLAG (INTERRUPT)
DK.ID== 1B32 ;DONE FLAG (INTERRUPT)
DK.IU== 1B28 ;USER TIME
DK.ION==1B30 ;CLOCK ON
DK.IXS==1B26 ;EXTERNAL SOURCE
;PROTOTYPE DK10 DDB
RTCNUM==M.RT0+M.RT1 ;# OF DK10'S
XP C0RTC,0 ;ASSUME NO DK10 ON CPU0
XP C1RTC,0 ;ASSUME NO DK10 ON CPU1
IFG M.RT0,<XP C0RTC,RT0DDB>
IFG M.RT1,<XP C1RTC,RT1DDB>
;HIGH PRECISION TIME ACCOUNTING
XP C0RTD,0 ;ASSUME NO HIGH PRECISION ACCOUNTING ON CPU0
XP C1RTD,0 ;ASSUME NO HIGH PRECISION ACCOUNTING ON CPU1
IFN M.RTCA,< ;HIGH PREC TIME ACCOUNTING?
XP C0RTD,C0RTC
XP C1RTD,C1RTC
>
DEFINE RTCDDB (N,DEVCOD)<
INTERN RTCINI,RTCTIM
RT'N'SVF==RT'N'SAC##+F ;DEFINE SAVE LOC. FOR F
RT'N'SVT==RT'N'SAC##+T1 ;SAVE LOC. FOR T1
RT'N==DEVCOD ;DEFINE DEVICE CODE
RT'N'DTI==:(DATAI RT'N,) ;DATAI FOR EXTERNAL USE (E.G. RT'N'DTI##,,ADDR)
;---- INITIALIZATION ROUTINE (JSR RTCINI(F))
RT'N'INI: 0
CONO RT'N,DK.OCC ; CLEAR THE CLOCK
DATAO RT'N,RT'N'PRD ; SET PERIOD
CONO RT'N,DK.OON+RT'N'CHN## ; & START CLOCK
JRST @RT'N'INI
;---- EXIT ROUTINE (JRST RTCXIT(F))
RT'N'XIT:CONO RT'N,DK.OCO+DK.OCD+RT'N'CHN## ;CLEAR IRP.
MOVE F,RT'N'SVF ; RESTORE F & T1
MOVE T1,RT'N'SVT
JEN @RT'N'CHL## ; & DISMISS
;---- INTERRUPT ROUTINE
RT'N'INT::CONSO RT'N,DK.IO+DK.ID ; INTERRUPT FOR THIS DK10 (OVERFLOW OR DONE?)
JRST .-1 ; NO
MOVEM F,RT'N'SVF ; YES - SAVE F & T1
MOVEM T1,RT'N'SVT
JSP F,RTCINT## ; LOAD F WITH DDB ADDR & GO TO IRP. ROUTINE
; DEFINE SOME DISPLACMENTS RELATIVE TO DDB
XP RTCINI,RT'N'INI-.
XP RTCXIT,RT'N'XIT-.
RT'N'DDB::
XP RTCNAM,.-RT'N'DDB ;(0) PHYSICAL NAME
SIXBIT/RTC'N/
XP RTCPRD,.-RT'N'DDB ;(1) PERIOD (10 USEC UNITS)
RT'N'PRD: ^D100000
XP RTCTIM,.-RT'N'DDB ;(2) TIME (10 USEC UNITS) UPDATED EVERY IRP.
RT'N'TIM:: 0
XP RTCSON,.-RT'N'DDB ;(3) SKIP IF DK10 ON
CONSO RT'N,DK.ION
XP RTCSNO,.-RT'N'DDB ;(4) SKIP IF NOT OVERFLOW
CONSZ RT'N,DK.IO
XP RTCDAI,.-RT'N'DDB ;(5) READ CLOCK INTO T1
DATAI RT'N,T1
XP RTCLGT,.-RT'N'DDB ;(6) LAST VALUE RETURNED BY GETIME
0
> ;DEFINE RTCDDB
;GENERATE DK10 DDB'S
IFG M.RT0,<RTCDDB(0,70)> ;CPU0 CLOCK
IFG M.RT1,<RTCDDB(1,70)> ;CPU1 CLOCK
IFE M.RTC,< ;IF NO DK10'S STILL DEFINE SOME SYMBOLS
XP RTCTIM,0 ;FOR SETIME (SYSINI) SO WON'T GET
XP RTCINI,0 ;UNDEFINED GLOBALS.
>
;DISPLAY AND LITE PEN
IFG DISN, <
IFN T30N!TVP10N, <DIS==134>
EXTERNAL DISSER,PENLOC,DISIN1,EXIT1,EXIT0,DISBKO,DISNX1
INTERNAL ENDCHK
INTERNAL PENINT,SETCON,DISCNO,DISCNA,DISCZA,BLKLIT,DISTST
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 T340N, <EXP ONDIS
DISBSY==77
XP PENON,7400
SETCON: CONO DIS,100 ;PARAMETER MODE
JRST DISIN1
PENINT: CONSO DIS,0 ;CHECK FOR CONI FLAGS
JRST PENINT ;THIS WILL BE PART OF THE LINKED INTERRUPT CHAIN.
CONSZ DIS,400 ;STOP FLAG UP
JRST STPFLG ;YES
CONSZ DIS,2000 ;PEN FLAG UP
DATAI DIS,PENLOC ;YES-STORE CURRENT LITE PEN LOCATION
CONO DIS,NONDIS ;CLEAR FLAGS
JEN @PENCHL## ;& DISMISS
;"STPFLG" SERVICES STOP FLAGS (DISPLAY PROGRAMMED) BY DOING A CLOSE ON THE DISPLAY
STPFLG: JSR PENSAV
JRST DISDSP+DCL ;DO A CLOSE
EXTERN DISDSP
ENDCHK: TRNN T1,-1
JRST EXIT1
JRST EXIT0
> ;END OF IFN T340N
IFE T340N, <Z
DISBSY==20000
PENON==10000
SETCON: MOVEI T1,PENCHN## ;SET UP CONO WORD
ASH T1,3 ;WITH PROPER CHANNEL ASSIGNMENTS
ADDI T1,DISCHN##
IFN T30N!TVP10N, <TRO T1,4300> ;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
JEN @PENCHL##
EXTERN DISREL
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 TVP10N, <POINT 2,DISCON,28>
IFN T30N, <POINT 3,DISCON,29>
> ;END OF IFE T340N
EXTERN DISSTS
DISCNA: CONO DIS,@DISCON
DISCZA: CONSZ DIS,@DISCON
BLKLIT: BLKO DIS,DISBKO
DISCNO: CONO DIS,OFFDIS
IFN FT5UUO,<
INTERN DISCNI
DISCNI: CONI DIS,DISSTS
>
DISTST: CONO DIS,DISCHN##
> ;END OF IFG DISN
IFG LPTN, <
;PROTOTYPE DEFINITION FOR LINE PRINTER DEVICE DATA BLOCKS
LPTDON==100
DEFINE LPTDDB (N) <
XLIST ;TURN OFF LISTING DURING EXPANSION
INTERN LP'N'DDB
LP'N'SV1==LP'N'SAC##+F ;DEFINE F SAVE LOCATION
LPTCON==.-LP'N'DDB
LP'N'INT::CONSO LP'N,0 ;(-4) SKIP IF INTERRUPT FOR THIS LPT
JRST .-1 ;(-3) GO TO NEXT SKIP CHAIN ELEMENT
MOVEM F,LP'N'SV1 ;(-2) SAVE F IN CHANNEL SAVE AREA
JSP F,LPTINT ;(-1) SET UP DDB ADDRESS AND BRANCH
LP'N'DDB:
LP'N'NAM:
LPNAM=SIXBIT /LPT/
IFE LPTN+DLPTN-1, <LPNAM> ;( 0) PHYSICAL DEVICE NAME
IFN LPTN+DLPTN-1, <LPNAM+<20+$LPNUM>B23> ;( 0) PHYSICAL DEVICE NAME
<XWD <6*HUNGST>,<N>B23+LPTSIZ>+<M.LP'N'L>B0 ;( 1) DEVICE CHARACTERISTICS
; HUNG TIME IS 63 SECS (CODE 6)
0 ;( 2) DEVICE I/O STATUS
XWD 0,LPTDSP ;( 3) LH=DDB LINK, RH=DSP TABLE ADDR.
LPTMOD==1_A+1_AL+1_I ;LPT LEGAL MODES
XWD DVOUT+DVLPT,LPTMOD ;( 4) DEVICE CHARACTERISTICS
0 ;( 5) LOGICAL DEVICE NAME
0 ;( 6) BUFFER HEADER ADDRESSES
LPTPTR==.-LP'N'DDB
LP'N'PTR: 0 ;( 7) BLOCK OUTPUT POINTER
XWD R,0 ;(10) CURRENT OUTPUT BUFFER ADDRESS
LP'N'STS: 0 ;(11) DEVICE STATUS WORD
XWD .TYLPT!.SPLPT!DEPLEN,0 ;SPOOLED LPT, VAR BUFS, DON'T DEADVANCE
0 ;DEVXTR
0 ;DEVEVM
0 ;DEVPSI
0 ;DEVESE
0 ;DEVHCW
0 ;DEVJOB
LPTCH==.-LP'N'DDB
EXP LP'N'BTH## ; INTERRUPT CHANNEL ASSIGNMENTS
LPTSVE==.-LP'N'DDB
MOVE F,LP'N'SV1 ; RESTORE F, SAVE AC'S
JSR LP'N'SAV## ; AND ESTABLISH P
MOVEI F,LP'N'NAM ; SET UP DDB ADDRESS AND RETURN
JRST LPTNXT ; TO COMMON INTERRUPT HANDLER
LPTEX1==.-LP'N'DDB
MOVE F,LP'N'SV1 ; RESTORE F AND
JEN @LP'N'CHL## ; DISMISS INTERRUPT
LPTSV2==.-LP'N'DDB
0 ; SAVE LOCATION FOR U
LPTDAP==.-LP'N'DDB
0 ;PLACE TO BUILD AOBJN POINTER
;TO ERROR BLOCK
LPTDAE==.-LP'N'DDB
BLOCK 4 ;SYSERR BLOCK
; THE REST OF THE DDB CONTAINS
LPTDNO==.-LP'N'DDB
CONSZ LP'N,CI%SKE## ; THE ACTUAL I/O INSTRUCTIONS
LPTDNZ==.-LP'N'DDB
CONSO LP'N,CI%SKE##
LPTCSO==.-LP'N'DDB
CONSO LP'N,(U) ; USED BY THE COMMON SERVICE
LPTCSZ==.-LP'N'DDB
CONSZ LP'N,(U) ; ROUTINE TO CONTROL A LINE
LPTCNI==.-LP'N'DDB
CONI LP'N,U ; PRINTER. THEY ARE EXECUTED
LPTCNO==.-LP'N'DDB
CONO LP'N,(U) ; BY MEANS OF AN XCT INSTRUCTION
LPTDTO==.-LP'N'DDB
DATAO LP'N,(U) ; INDEXED TO THE PROPER DDB
LPTBKO==.-LP'N'DDB
BLKO LP'N,LP'N'PTR ;
LPTPAG==.-LP'N'DDB
0 ;PAGE COUNTER WORD
IFN FT5UUO,<
LPXSTS==.-LP'N'DDB
INTERN LPXSTS
CONI LP'N,LP'N'STS ; DEVICE STATUS WORD CONI
>
INTERN LPTCON,LPTPTR,LPTCH,LPTSVE,LPTEX1,LPTSV2,LPTPAG
INTERN LPTCSO,LPTCSZ,LPTCNI,LPTCNO,LPTDTO,LPTBKO
INTERN LPTDNO,LPTDNZ,LPTDAP,LPTDAE
LIST ;TURN LISTING BACK ON AFTER EXPANSION
>;END DEFINE OF LPTDDB
>;END IFG LPTN
IFN M.KL10,< ;FRONT END CDR'S ON KL10'S ONLY
IFG DLPTN,<
;PROTOTYPE DEFINITION FOR RSX-20F LINEPRINTER DEVICE DATA BLOCKS
DEFINE DLPDDB (D,U,X,Y) <
XLIST ;TURN OFF LISTING DURING EXPANSION
INTERN FL'Y'DDB ;"FL" IS FOR RSX-20F LPT
;HARDWARE CHARACTERISTICS DEFAULTS
IFNDEF M.LP'X'L,<M.LP'X'L==:0> ;PRINTER IS UPPER-CASE
IFNDEF M.LP'X'P,<M.LP'X'P==:0> ;NO PAGE COUNTER
IFNDEF M.LP'X'V,<M.LP'X'V==:1> ;DAVFU
IFNDEF M.LP'X'C,<M.LP'X'C==:0> ;64-CHAR SET
IFNDEF M.LP'X'T,<M.LP'X'T==:3> ;RSX20F PRINTER
IFNDEF M.LP'X'N,<M.LP'X'N==:0> ;NO CHAR SET NAME
FL'Y'DDB:
FL'Y'NAM:
LPNAM=SIXBIT/LPT/
IFE DLPTN+LPTN-1,<LPNAM> ;(0) PHYSICAL DEVICE NAME
IFN DLPTN+LPTN-1,<LPNAM+<20+$LPNUM>B23> ;(0) PHYSICAL DEVICE NAME
<XWD <5*HUNGST>,LPTSIZ>+<M.LP'X'L>B0 ;(1) DEVICE CHARACTERISTICS
;HUNG TIME IS 63 SECONDS
0 ;(2) DEVICE I/O STATUS
XWD 0,RLPDSP ;(3) DDB LINK,,DSP TABLE ADDRESS
DLPMOD==1_A+1_AL+1_BYTMOD ;LEGAL MODES
XWD DVOUT+DVLPT,DLPMOD ;(4) DEVICE CHARACTERISTICS
0 ;(5) LOGICAL DEVICE NAME
0 ;(6) BUFFER HEADER ADDRESSES
0 ;(7) OUTPUT POINTER
XWD R,0 ;(10) CURRENT OUTPUT BUFFER ADDRESS
0 ;(11) DEVICE STATUS WORD
XWD .TYLPT!.SPLPT!DEPLEN,0 ;SPOOLED LPT, VAR BUFS, DON'T DEADVANCE
0 ;DEVXTR
0 ;DEVEVM
0 ;DEVPSI
0 ;DEVESE
BYTE (1) M.LP'X'L, M.LP'X'P, 0 (3) M.LP'X'V, M.LP'X'C, M.LP'X'T (6) 0 (18) M.LP'X'N
;DEVHCW
0 ;DEVJOB
0 ;COUNT OF OUTPUT CHARS
DLPDUX==.-FL'Y'DDB
XWD U,D ;UNIT # ON FRONT-END,,DLP DTE INDEX
DLPMLA==.-FL'Y'DDB
0 ;MAXIMUM LINE ALLOCATION
DLPRLA==.-FL'Y'DDB
0 ;REMAINING LINE ALLOCATION
DLPSNT==.-FL'Y'DDB
0 ;NUMBER OF WORDS ALREADY SENT
INTERN DLPDUX,DLPSNT,DLPMLA,DLPRLA
LIST ;TURN LISTING BACK ON AFTER EXPANSION
>;END DEFINE OF DLPDDB
EXTERNAL DLPSER,RLPDSP
>;END IFG DLPTN
>;END IFN KL10
SUBTTL GENERATION OF LPT AND DLP DDB'S
IFG LPTN,<
EXTERNAL LPTSER, LPTNXT, LPTINT, LPTDSP
LPT2==234 ;DEVICE SELECT CODE FOR SECOND LPT
IFNDEF LP2, <LP2==LPT3>
IFNDEF LP0, <LP0==LPT> ;DEFINE STANDARD MNEMONIC DEFINITIONS
IFNDEF LP1, <LP1==LPT2> ; BUT ALLOW FOR OVERRIDE
LPT3==230 ;DEVICE SELECTION CODE FOR THIRD LPT
>;END IFG LPTN
DEFINE RSXDTE (C,D) <
IFG M.LP'C'D,< ;;DO ONLY IF AT LEAST ONE LPT ON DTE
$LPUNT==0 ;;UNIT STARTS AT ZERO FOR EACH DTE
REPEAT M.LP'C'D,< ;;DO FOR EACH LPT ON DTE
DLPDDB \$DTNDX,\$LPUNT,\$LPNUM,\<$LPNUM-LPTN>
;;GENERATE DDB
$LPUNT==$LPUNT+1 ;;STEP TO NEXT UNIT ON DTE
$LPNUM==$LPNUM+1 ;;STEP TO NEXT UNIT FOR SYSTEM
>
$DTNDX==$DTNDX+1 ;;STEP TO NEXT DTE
>
>
IFN M.KL10,<
IFE DLPTN,<DLPDSP==:EATDSP##>
>;END IFN M.KL10
IFG LPTN+DLPTN,<
$LPNUM==0 ;TEMPORARY SYMBOL USED TO FACILITATE
; MACRO GENERATION
REPEAT LPTN, <
LPTDDB \$LPNUM
$LPNUM==$LPNUM+1
>
IFN DLPTN,<
$DTNDX==0 ;DTE INDEX FOR MACRO STARTS AT 0
RSX20F ;GENERATE DDB'S FOR RSX-20F LPT'S
>;END IFN DLPTN
>;END IFG LPTN+DLPTN
IFG PLTN, <
;PROTOTYPE DEFINITION FOR CALCOMP PLOTTER DEVICE DATA BLOCKS
DEFINE PLTDDB (N) <
XLIST ;TURN OFF LISTING DURING EXPANSION
INTERN PL'N'DDB
PL'N'SV1==PL'N'SAC##+F ;DEFINE F SAVE LOCATION
PLTCON==.-PL'N'DDB
PL'N'INT::CONSO PL'N,0 ; SKIP IF INTERRUPT FOR THIS PLT
JRST .-1 ; GO TO NEXT SKIP CHAIN ELEMENT
IFN FT5UUO,<
CONI PL'N,PL'N'STS > ;SAVE PLOTTER STATUS
SOSGE PL'N'CTR ;OUTPUT CHARACTERS LEFT?
JRST PL'N'IN2 ;NO
MOVEM T1,PL'N'SV1 ;SAVE T1 IN CHANNEL SAVE AREA
ILDB T1,PL'N'PTR ;GET NEXT CHARACTER
PLTDTO==.-PL'N'DDB
DATAO PL'N,T1 ;SEND TO PLOTTER
MOVE T1,PL'N'SV1 ;RESTORE T1 AND
JEN @PL'N'CHL## ; DISMISS INTERRUPT
PL'N'IN2:JSR PL'N'SAV## ;SAVE AC'S
JSP F,PLTNXT## ;SET UP F, GO TO PLOTTER SERVICE
PL'N'DDB:
PL'N'NAM:
PLNAM==SIXBIT /PLT/
IFE PLTN-1,<PLNAM> ; ( 0) PHYSICAL DEVICE NAME
IFN PLTN-1,<PLNAM+<20+$PLNUM>B23>; ( 0) PHYSICAL DEVICE NAME
XWD HUNGST*4,^D36 ;( 1) XWD (HUNG TIMEOUT),(BUFFER SIZE)
; CODE 4 - HUNG TIME=15 SECONDS
0 ;( 2) DEVICE IO STATUS
XWD 0,PLTDSP## ;( 3) LH=DDB LINK; RH=DSP TABLE ADDR.
PLTMOD==1_A+1_AL+1_I+1_IB+1_B ;PLOTTER LEGAL MODES
XWD DVOUT,PLTMOD ;( 4) XWD (OUTPUT DEV), (MODES)
0 ;( 5) LOGICAL DEVICE NAME
0 ;( 6) BUFFER HEADER ADDRESSES
PLTPTR==.-PL'N'DDB
PL'N'PTR: 0 ;( 7) OUTPUT BYTE POINTER
XWD R,0 ;(10) CURRENT OUTPUT BUFFER ADDRESS
PL'N'STS: 0 ;(11) DEVICE STATUS WORD
XWD .TYPLT!.SPPLT,0 ;(12) SPOOLED PLT
0 ;(13) DEVXTR
0 ;(14) DEVEVM
0 ;(15) DEVPSI
0 ;(16) DEVESE
0 ;(17) DEVHCW
0 ;(20) DEVJOB
PL'N'CTR: 0 ;OUTPUT BYTE COUNTER
PLTCH==.-PL'N'DDB
PL'N'CHN## ; INTERRUPT CHANNEL
PLTCNO==.-PL'N'DDB
CONO PL'N,(T1) ;XCT'D FROM PLTSER
INTERN PLTCON,PLTDTO,PLTCH,PLTCNO,PLTPTR
LIST ;TURN ON LISTING AFTER EXPANSION
> ;END OF PLTDDB MACRO DEFINITION
EXTERNAL PLTSER
PLT2==144 ;2ND PLOTTER DEVICE CODE
IFNDEF PL0,<PL0==PLT> ;DEFINE STANDARD MNEMONIC DEFINITIONS
IFNDEF PL1,<PL1==PLT2> ; BUT ALLOW FOR OVERRIDE
$PLNUM==0 ;TEMPORARY SYMBOL USED TO FACILITATE
; MACRO GENERATION
REPEAT PLTN,<
PLTDDB \$PLNUM
$PLNUM==$PLNUM+1
>
> ;END OF "IFG PLTN"
;PAPER TAPE READER ENTRY POINT AND MASK
IFG PTRN, <EXTERNAL PTRSER ;SAME ROUTINE FOR PDP-6 AND PDP-10 READER
INTERNAL PTRMSK
IFG PDP10N, <PTRMSK==0> ;MASK==0 IF PDP-10 READER
IFE PDP10N, <PTRMSK==777777> ;MASK==777777 FOR PDP-6 READER
>
;PAPER TAPE PUNCH ENTRY POINT
IFG PTPN, <EXTERNAL PTPSER>
IFN M.KA10,<ZZ==R>
IFN M.KI10!M.KL10,<ZZ==0>
INTERN PASCII,PIMAGE,PIMTTY,PBYTMD
PASCII==700+ZZ
PIMAGE==4400+ZZ
PIMTTY==1000+ZZ
PBYTMD==1000+ZZ
;PSEUDO TTY ENTRY POINT
IFE PTYN, <INTERNAL PTYPE,PTMNMZ,PTYOW,PTMNMD,PTYLST,PTYDSP
PTYPE:PTMNMZ:PTYOW:PTMNMD: HALT CPOPJ ;HALT IF SCNSER CALL PTY ROUTINES
PTYDSP==0 ; BECAUSE NONE LOADED
PTYLST==0 ;SATISFY GLOBOL IN SYSINI
;IF NO PTY'S, SATISFY GLOBALS
INTERN CTLJOB,UJBSTS
CTLJOB==CPOPJ
UJBSTS==CPOPJ
;IF NO PTY'S, JOB CAN NEVER BE CONTROLLED BY PTY, SO
; SUBSTITUTE THIS DUMMY SUBROUTINE FOR CTLJB
INTERN CTLJB,CTLJBD
CTLJBU::SETZM U ;NO LDB
CTLJB:
CTLJBD: MOVNI T1,1
POPJ P,
>
IFG PTYN, <
EXTERNAL PTYSER ;LOAD PTY SERVICE ROUTINE
>
IFN FTTYPE,<
;DEFINITION FOR DC44 FRONT END
;FIRST PROTOTYPE DDB'S ARE GENERATED
;NEXT A TABLE DC40TB IS GENERATED WITH A WORD FOR
;EACH DC44 DEVICE . THE DEVICE DATA BLOCK ADDRESS
;WILL BE STORED IN THIS TABLE BY THE LINKSR CODE
;THE ENTRY IS FOUND BY SUBTRACTING THE VALUE NTT
;FROM THE COMTEX LINE NUMBER
;THE WORD DEVCTR CONTAINS THE FOLLOWING INFORMATION:
;1. THE LEFT HALF CONTAINS THE DL-10 PORT NUMBER
;2. THE RIGHT HALF THE COMTEX LINE NUMBER
LALL
WTY0N==0
WTY1N==1
WTY2N==0
WTY3N==0
DEFINE DDB(MNEM,PORT,DISP,IOTYP,HNG),<
IFN MNEM'PORT'N,<
ENTRY MNEM'PORT'DD,MNEM'PORT'DS
EXTERN DISP
MNEM'PORT'DD:
SIXBIT /MNEM/
XWD HUNGST*HNG,41 ;;HUNG TIME IS 63 SECONDS FOR 5000 CHARACTERS
EXP 0,DISP
XWD IOTYP,407 ;IMAGE,PIM,ASCII AND ASCIL
EXP 0,0
XWD R,0
EXP 0,0
XWD .TY'MNEM+DEPLEN,DEPEVM
EXP 0,0
XWD PORT,0 ;DEVCNTR UNUSED COMMON WILL INSERT LINE NUMBER
EXP 0,0,0,0,0,0
MNEM'PORT'DS=.-MNEM'PORT'DD
> ;;END OF IFN CONDITION
>
INTYP==DVPTR+DVIN
OUTYP==DVPTP+DVOUT
DEFINE GENDDB(PORT)
< IFN TYPNU'PORT,<
DDB PAR,PORT,TYIDSP,INTYP,6
DDB PCR,PORT,TYIDSP,INTYP,6
DDB PAP,PORT,TYODSP,OUTYP,6
DDB LPC,PORT,TYODSP,OUTYP,6
DDB PCP,PORT,TYODSP,OUTYP,6
DDB WTY,PORT,TYIDSP,INTYP,0
> ;;END OF IFN ....
> ;;END OF GENDDB MACRO
ZZZ==0
IFN M.DC44,<
REPEAT 8,<
GENDDB(\ZZZ)
ZZZ==ZZZ+1
> ;;END OF REPEAT
> ;;END OF IFN
;THE FOLLOWING TABLE CORRESPONDS TO THE LINTAB TABLE OF
;SCNSER AND TYPMAX TO THE VARIABLE TCONLN
;TYPMAX IS THE MAXIMUM NON TERMINAL LINE ON A DC44 FRONT END
;INDEXING OF DC44TB WITH THE COMTEX LINE NUMBER GIVES THE
;DDB ADDRESS OF A COMTEX LINE
TPSMAX:: EXP TYPNUM ;MONGEN VALUE
;FOR EACH FRONT END A DC44TB IS GENERATED
DEFINE DC44TB(PORT)
<DC4'PORT'TB::
BLOCK TYPNU'PORT
> ;END DEFINE DC44TB
ZZZ=0
REPEAT 8,<
DC44TB(\ZZZ)
ZZZ=ZZZ+1
> ;;END OF REPEAT 4,
> ;;END OF FTTYPE CONDITION
SUBTTL STORAGE AND SYMBOL GENERATION FOR RSX-20F DEVICES
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
IFNDEF OFSDLS,<OFSDLS==:1> ;OFFSET FOR TTD TO DLS LINES
;THE FOLLOWING SYMBOL IS CURRENTLY AN ABSOLUTE CONSTANT. THE
; VALUE NOW IS INTENTIONALLY SMALL SO ALL (128) FRONT-END LINES CAN BE
; HANDLED WITHOUT EXCEEDING BUFFER SPACE AVAILABLE IN THE FRONT-END. THE
; SYMBOL VALUE SHOULD PROBABLY BE CALCULATED AT ASSEMBLY TIME AS
; A FUNCTION OF THE NUMBER OF LINES ACTUALLY PRESENT.
IFNDEF TTDMLA,<TTDMLA==:^D16> ;DEFAULT MAXIMUM LINE ALLOCATION FOR RSX-20F TERMINALS
DEFINE RSXDTE (C,D) <
IFG M.AT'C'D,<XWD C,D-1>
>
ATCPDT::RSX20F ;MAKE TABLE WITH ONE ENTRY FOR EACH
; RSX20F FRONT-END SUPPORTING ASYNC
; TERMINALS
RSXATN==:.-ATCPDT ;NUMBER OF SUCH FRONT-ENDS
DEFINE RSXDTE (C,D) <
IFG M.AT'C'D,<POINT 8,TT'C'D'BF>
>
TTDPNT::RSX20F ;POINTERS TO EACH DTE'S OUTPUT STRING AREA
DEFINE RSXDTE (C,D) <
IFG M.AT'C'D,<
EXP $TTOFS
$TTOFS==$TTOFS+M.AT'C'D
>
>
$TTOFS==TTDLAL ;INITIALIZE SYMBOL USED IN FOLLOWING MACRO
TTDOFS::RSX20F ;TABLE OF TTD LINE TABLE OFFSETS
DEFINE RSXDTE (C,D) <
IFG M.AT'C'D,<
$TTOFS==$TTOFS+M.AT'C'D
EXP $TTOFS
>
>
$TTOFS==TTDLAL ;INITIALIZE SYMBOL USED IN FOLLOWING MACRO
TTDLOM::RSX20F ;TABLE OF MAXIMUM LINTAB OFFSETS
DEFINE RSXDTE (C,D) <
IFG M.AT'C'D,<
EXP $TTOFS
$TTOFS=$TTOFS+M.AT'C'D
>
>
$TTOFS==TTDDAL ;INITIALIZE SYMBOL USED IN FOLLOWING MACRO
TTDDSO::RSX20F ;TABLE OF TTD DSCTAB OFFSETS
DEFINE RSXDTE (C,D) <
IFG M.AT'C'D,<
$TTOFS==$TTOFS+M.AT'C'D
EXP $TTOFS
>
>
$TTOFS==TTDDAL ;INITIALIZE SYMBOL USED IN FOLLOWING MACRO
TTDDOM::RSX20F ;TABLE OF MAXIMUM DSCTAB OFFSETS
$LOW ;DOWN TO LOW SEGMENT FOR FOLLOWING ITEMS
TTDCLR:: ;START OF AREA CLEARED BY TTDINI
TTDCTR::BLOCK RSXATN ;COUNTS OF CHARS IN CURRENT OUTPUT STRINGS
TTDPTR::BLOCK RSXATN ;DYNAMIC POINTERS TO BUILD OUTPUT STRINGS
IFNDEF TTDMOS,<TTDMOS==:^D16> ;DEFAULT LENGTH OF MAXIMUM OUTPUT STRING
DEFINE RSXDTE (C,D) <
IFG M.AT'C'D,<
TT'C'D'BF: BLOCK <TTDMOS+3>/4
>
>
RSX20F ;BUFFER AREA FOR DTE OUTPUT STRINGS
TTDEND==:.-1 ;END OF AREA CLEARED BY TTDINI
; ... STILL IN FTKL10 CONDITIONAL
$HIGH ;BACK TO HIGH SEGMENT
IFG DLPTN,<
;DEFINE STORAGE AND SYMBOLS FOR LINEPRINTERS ON RSX-20F FRONT-ENDS
IFNDEF DLPMLA,<DLPMLA==:^D140> ;DEFAULT MAXIMUM LINE ALLOCATION FOR RSX-20F LINEPRINTERS
DEFINE RSXDTE (C,D) <
IFG M.LP'C'D,<XWD C,D-1>
>
LPCPDT::RSX20F ;MAKE TABLE WITH ONE ENTRY FOR EACH
; RSX-20F FRONT-END SUPPORTING LINEPRINTERS
RSXLPN==:.-LPCPDT ;NUMBER OF SUCH FRONT-ENDS
LPDTDV:: ;TABLE TO CONVERT FROM CPU #, DTE #,
;AND UNIT NUMBER TO DDB ADDRESS
DEFINE LPCPDT (C) <
IFN M.'C'DTE,<Z @LP'C'DTE(P1)> ;INDEX OFF DTE NUMBER
IFE M.'C'DTE,<Z> ;NO DTE'S ON THIS CPU
>
ZZ==0
REPEAT CPUN,<
LPCPDT \ZZ
ZZ==ZZ+1
>
DEFINE RSXDTE (C,D) <
IFE D-1,<LP'C'DTE:>
IFN M.LP'C'D,<Z @LP'C'D'DV(T1)> ;INDEX OFF LINE NUMBER
IFE M.LP'C'D,<Z> ;NO LINE PRINTERS THIS DTE
>
RSX20F ;GENERATE DTE TABLE
DEFINE RSXDTE (C,D) <
IFN M.LP'C'D,<
LP'C'D'DV:
REPEAT M.LP'C'D,<
DLPDDB \ZZ
ZZ==ZZ+1
>
REPEAT <2-M.LP'C'D>,<
Z
>
>
>
DEFINE DLPDDB (X) <FL'X'DDB>
ZZ==0
RSX20F ;GENERATE THE DDB ADDRESS TABLE
>;END IFG DLPTN
; ... STILL IN FTKL10 CONDITIONAL
IFN DCDRN,<
$HIGH
;DEFINE SPECIAL TABLES FOR RSX20F CARD READERS
DEFINE RSXDTE (C,D) <
XWD C,D-1
>
CRCPDT::RSX20F ;CORRESPONDENCE TABLE BETWEEN
;DTE INDEX AND CPU#,,DTE # FOR
;DTESER
CRDTDV:: ;TABLE TO CONVERT FROM CPU #, DTE #,
;AND UNIT NUMBER TO DDB ADDRESS
DEFINE CRCPDT (C) <
IFDEF M.'C'DTE,<Z @CR'C'DTE(P1)> ;INDEX OFF DTE NUMBER
IFNDEF M.'C'DTE,<Z> ;NO DTE'S ON THIS CPU
>
ZZ==0
REPEAT CPUN,<
CRCPDT \ZZ
ZZ==ZZ+1
>
DEFINE RSXDTE (C,D) <
IFE D-1,<CR'C'DTE:>
IFN M.CR'C'D,<Z @CR'C'D'DV(T1)> ;INDEX OFF LINE NUMBER
IFE M.CR'C'D,<Z> ;NO CARD READERS THIS DTE
>
RSX20F ;GENERATE DTE TABLE
DEFINE RSXDTE (C,D) <
IFN M.CR'C'D,<
CR'C'D'DV:
REPEAT M.CR'C'D,<
DCRDDB \ZZ
ZZ==ZZ+1
>
>
>
DEFINE DCRDDB (X) <FC'X'DDB>
ZZ==0
RSX20F ;GENERATE THE DDB ADDRESS TABLE
>;END IFN DCDRN
>;END IFN FTKL10
SUBTTL COMMON CODE FOR PDP11 HANDLING
;CODE COMMON TO ALL PDP-11S, WHATEVER THEIR APPLICATION.
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 11'S.
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 <PDP11N-DLX.78>,<
SUBTTL DL10 ERROR REPORTING STORAGE AND ROUTINE
IFN FTDAEMON,<
;ROUTINE TO GET ERROR STATUS AND CALL DAEMON FOR AN ERROR
;ON EITHER A DC76 OR A DC75.
;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 OF FTDAEMON
IFE FTDAEM,<
DL10EL==CPOPJ
>
;CAL11. UUO
$HIGH
CALL11::PUSH P,T1 ;SAVE USER'S ARG
HRLOI P2,377777 ;ASSUME PRIV. JOB.
PUSHJ P,PRUSET## ;SKIP IF PRIV.
TLO P2,400000 ;NOT PRIV.
POP P,T1 ;RESTORE USER'S ARG
HRR M,T1 ;GET USER'S AC
HLRE T3,T1 ;GET COUNT
JUMPLE T3,ECOD7## ;.LE. ZERO ARGS NOT ENOUGH!
PUSHJ P,GETWDU## ;GET FUNCTION CODE INTO T1
SOJL T3,ECOD7## ;ERROR CODE 7: NOT ENUF ARGS
HLRZ P1,T1 ;COPY PDP11 NUMBER
HRRZS T1 ;AND CLEAR IT FROM T1
CAIL P1,10 ;REASONABLE PDP-11 NUMBER?
JRST ECOD3## ;NO, ERROR CODE 3.
SKIPN W,DLXBAT##(P1) ;IS THERE A BASE FOR THIS 11?
JRST ECOD3## ;NO, INVALID PDP-11 NUMBER
SKIPN P1,DLXWIN(W) ;GET WINDOW ADDRESS
PJRST ECOD3## ;NO GOOD THIS PDP11
SKIPN T2,DLXCAL##(W) ;GET CAL11. TABLE POINTER
MOVE T2,[XWD CAL11L,CAL11D] ;NONE, USE DEFAULT
HLRZ T4,T2 ;GET LENGTH OF TABLE
CAML T1,T4 ;FUNCTION TOO LARGE?
JRST ECOD2## ;YES, ERROR CODE 2.
ADD T2,T1 ;NO, POINT TO TABLE ENTRY
MOVE T1,0(T2) ;PICK UP ENTRY
AND T1,P2 ;CLEAR SIGN BIT IF PRIV
JUMPL T1,ECOD1## ;IF STILL SET, NEED PRIV.
PUSHJ P,0(T1) ;GO DO FUNCTION
POPJ P, ;NON-SKIP RETURN
PJRST CPOPJ1## ;SKIP RETURN
;TABLE FOR CAL11. UUO IF THERE IS NO SERVICE ROUTINE
CAL11D: XWD 400000,ECOD2## ;(0) DEPOSIT
XWD 400000,ECOD2## ;(1) EXAMINE
XWD 400000,ECOD2## ;(2) QUEUE A MESSAGE
XWD 0,CAL11N ;(3) RETURN NAME
XWD 0,CAL11S ;(4) UP/DOWN STATUS
CAL11L==.-CAL11D
CAL11N::MOVE T1,DLXNMT##(W) ;RETURN NAME
JRST STOTC1 ;SKIP RETURN
CAL11S::SKIPG DLXDWN##(P1) ;RETURN PDP-11 STATUS
TDZA T1,T1 ;DOWN
MOVEI T1,1 ;UP
JRST STOTC1##
;COME HERE ONCE A SECOND.
DLXSEC::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
IFN M.PSI&<M.KI10!M.KL10>,<
MOVSI T1,200001 ;KA10 INTERRUPTS
XCT DLXDAO##(P2) ;BASE ADDRESS
>
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
IFN FTDAEM,<
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 DLXSWA##(P2) ;SET WINDOW ADDRESS
XCT DLXENB##(P2) ;ENABLE PORT
JRST D76S1L ;WAIT FOR INTERRUPT
;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.
>
POPJ P, ;NO, IGNORE IT.
;COME HERE ONCE A MINUTE.
D76MIN::SKIPGE DEBUGF## ;DEBUGGINH
POPJ P, ;YES, NO MESSAGE
PUSHJ P,SAVE3## ;SAVE P1-P3
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.
HRRZ 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
;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 PDP11N
SUBTTL LOCATE & WHERE COMMAND/UUOS
IFE M.NET,<
$HIGH
NODE.C::
HOST.C::
NETASG::
IFE M.DAS78,<
CLOCAT::
CWHERE::
> ;END IFE M.DAS78
MOVSI T1,JLOG ;IF NOT
TDNN T1,JBTSTS##(J) ;LOGGED IN
DPB T1,PJOBN## ;DON'T LEAVE GHOST JOB
JSP T1,ERRMES## ;CAN'T DO THESE IF NO NETWORK
ASCIZ /no network software
/
$LOW
> ;END IFE M.NET .IF M.NET=0 & M.DAS78 #0, ONLY 1 LABEL, NETASG
; IF BOTH=0, 3 LABELS
IFN M.NET!M.DAS78,<
$HIGH
;LOCATE COMMAND TO PLACE A JOB AT A REMOTE STATION SITE
CLOCAT::PUSHJ P,CTEXT1## ;GET THE ARGUMNET IN SIXBIT
SKIPN T1,T2 ;COPY TO T1
JRST LOCTHS ;NO ARGUMNET
PUSHJ P,CVTOCT## ;TRY TO CONVERT TO OCTAL
MOVE T1,T2 ;CAN'T-GET THE NAME BACK
JUMPE T1,LOCLOC ;YES CENTRAL SITE NUMBER
LOCLC1:
IFN M.NET,<
PUSH P,T1 ;SAVE THE ARG
PUSHJ P,SRCNDB## ;SEARCH FOR THE NODE BLOCK
>;END IFN M.NET
JRST LOCNOT ;DOES NOT EXIST
IFN M.NET,<
POP P,(P) ;RESTORE THE STACK
HLRZ T1,NDBNNM##(W) ;YES, GET THE NODE NUMBER
HRRZM T1,JBTLOC##(J) ;LOCATE HIM WHERE HE WANTS
PUSHJ P,TYPNDB## ;TYPE THE NODE NAME
JSP T1,CONMES## ;EXIT TO COMDEV
ASCIZ / Located/
>;END IFN M.NET
LOCTHS: LDB T1,PDVSTA## ;GET STA NUMBER OF CONTROL TTY
JRST LOCLC1 ;AND GO LOCATE HIM
LOCLOC: MOVE T1,JBTLOC## ;GET CENTRAL SITE NUMBER
JRST LOCLC1 ;AND GO LOCATE HIM THERE
LOCNOT:
IFN M.NET,<
POP P,T1 ;RESTORE THE ARG
>;END IFN M.NET
CAIG T1,77 ;IS IT A NUMBER
IFN M.NET,<
JUMPG T1,LOCNO1 ;YES, WILL ALLOW THE LOCATE TO HAPPEN
HRRZ T1,NRTUNN## ;NO, UNDEFINE NETWORK NODE
>;END IFN M.NET
IFE M.NET,<
JUMPGE T1,LOCNO1 ;YES, WILL ALLOW THE LOCATE TO HAPPEN
HRRZI T1,[ASCIZ \Undefined Node\] ;NO, UNDEFINDED NODE
>;END IFE M.NET
PJRST ERRMES## ;TYPE IT
LOCNO1: HRRZM T1,JBTLOC##(J) ;STORE THE LOCATION
PUSHJ P,INLMES## ;TYPE A MESSAGE
ASCIZ /NODE(/
HRRZ T1,JBTLOC##(J) ;GET THE NUMBER
PUSHJ P,PRTDI8## ;PRINT THE NUMBER
PUSHJ P,INLMES## ;AND A COMMENT
IFN M.NET,<
ASCIZ /) Located but OFF-LINE
/
>;END IFN M.NET
IFE M.NET,<
ASCIZ /) Located
/
>;END IFE M.NET
POPJ P, ;RETURN
;WHERE COMMAND - SIMILAR TO WHERE UUO
;THE LOCATION OF A DEVICE IS TYPED ON THE USER'S TTY
CWHERE::SKIPN JBTADR##(J) ;ANY CORE ASSIGNED
PUSHJ P,GETMIN## ;NO, GET SOME CORE
JUMPE R,DLYCM## ;DELAY THE COMMAND
PUSHJ P,SAVCTX## ;SAVE THE CONTEXT OF THE JOB
PUSHJ P,CTEXT1## ;GET FIRST ARG = SIXBIT DEV NAME
PUSH P,T2 ;SAVE 6 BIT
PUSHJ P,FNDSTA## ;GET OUR STATION
POP P,T2 ;GET 6 BIT NAME
MOVE T1,T2 ;INTO T1
PUSH P,U ;SAVE U
PUSHJ P,DVCNSG## ;SEARCH FOR PHYSICAL DEV NAME
JRST NOTDV1## ;PRINT "NO SUCH DEVICE"
PUSHJ P,FNDDEV ;FIND LOCATION
IFN M.NET,<
MOVE U,(P)
>
IFN M.DAS78,<
IFN M.NET,<
LDB T2,[POINT 6,DEVSTA(F),9] ;GET TYPE OF DEVICE
CAIN T2,.TYD78/.TYEST ;IS IT A DAS78?
JRST WCMD78 ;YES.
>;END IFN M.NET
>;END IFN M.DAS78
IFN M.NET,<
PUSHJ P,SRCNDB## ;SEARCH FOR THE NDB
MOVEI W,NETNDB## ;USE THE LOCAL MODE
PUSHJ P,TYPNDB## ;TYPE THE NODE INFO
PUSHJ P,PRSPC##
MOVE T2,DEVNAM(F)
PUSHJ P,PRNAME##
MOVSI T1,DVTTY ;CHECK FOR A TTY
TDNN T1,DEVMOD(F) ;IS IT
JRST [MOVEI T1,ASSCON!ASSPRG ;IS IT IN USE
TDNN T1,DEVMOD(F) ;SHIP IF SO
PUSHJ P,ZAPNET## ;NO,FREE DDB
PJRST UPOPJ##] ;AND EXIT
PUSHJ P,INLMES## ;TYPE OUT
ASCIZ / LINE # /
MOVE U,DDBLDB##(F) ;YES, GET THE LDB
LDB T1,LDPLNO## ;GET THE LOCAL LINE NUMBER
MOVEI T2,LDRREM## ;NETWORK LINE
TDNN T2,LDBDCH##(U) ;CHECK A BIT
JRST CWHER1 ;LOCAL LINE
HLRZ T2,LDBREM##(U) ;GET THE NDB POINTER
JUMPE T2,[POP P,U
PUSHJ P,INLMES## ;NOT CONNECTED
ASCIZ / NOT CONNECTED /
POPJ P,] ;RETURN
LDB T1,LDPRLN## ;CONNECT NETWORK LINE
CWHER1: POP P,U ;RESTORE THE LDB
PJRST PRTDI8## ;TYPE ^T
>;END IFN M.NET
IFN M.DAS78,<
WCMD78: POP P,U ;RESTORE LDB
PUSHJ P,INLMES## ;PRINT THE MESSAGE
ASCIZ \NODE \
IFN M.NET,<
MOVE T2,STANAM## ;CENTRAL STATION NAME
PUSHJ P,PRNAME## ;PRINT CENTRAL NAME
>;END IFN M.NET
MOVEI T3,"(" ;LEFT PAREN
PUSHJ P,COMTYO## ;TYPE IT
LDB T1,PDVSTA## ;GET STATION #
PUSHJ P,PRTDI8## ;PRINT IT
PUSHJ P,INLMES## ;
ASCIZ \) \ ;
MOVEI T1,CONFIG## ;SYSTEM NAME
PUSHJ P,CONMES## ;PRINT IT
PUSHJ P,PRSPC## ;SPACE
MOVEI T1,SYSDAT## ;DATE
PJRST CONMES## ;
>;END IFN M.DAS78
;ROUTINE TO FIND LOCATION OF A DEVICE
;RETURN WITH T1=LOCATION
FNDDEV::LDB T1,PDVSTA## ;GET DDB LOCATION
MOVSI T2,DVTTY ;SEE IF
TDNN T2,DEVMOD(F) ; TTY
POPJ P, ;NO.
MOVE U,DDBLDB##(F) ;YES, SET UP U
PJRST FNDSTA## ;AND COMPUTE FROM LDB
;WHERE UUO
;IF AC CONTAINS 0 TO 17 THE CALLER WANTS THE LOCATION OF THE DEVICE
;INITED ON THE CHANNEL NUMBER SPECIFIED IN AC. LH(AC) = STA STATUS BITS
;IF AC IS GREATER THAN 17 IT IS ASSUMED TO BE A SIXBIT DEVICE NAME
;THAT THE CALLER WISHES TO KNOW THE STATION OF. LH(AC) = STA STATUS BITS
WHERE:: CAMN T1,[SIXBIT/OPR/] ;IS IT AN OPR
JRST [HRRZ T1,JBTLOC##(J) ;YES, GET THE JOB LOCATION
PJRST STOTC1##] ;RETURN LOCATION OF THE JOB
PUSHJ P,DVCNSG## ;SEARCH FOR DEVICE OR CHANNEL
JRST RTZER## ;NONE--RETURN ERROR AS 0.
PUSHJ P,FNDDEV ;GET STATION NUMBER
JUMPN T1,WHER1 ;USE IT IF NON ZERO
IFN M.DAS78,<
LDB T2,[POINT 6,DEVSTA(F),9] ;GET TYPE OF DEVICE
CAIE T2,.TYD78/.TYEST ;IF DAS78 DEV LEAVE IT 0
>;END IFN M.DAS78
MOVE T1,JBTLOC## ; OTHERWISE USE CENTRAL SITE NUMBER
WHER1:
IFN FTSPL,<
SKIPN DEVCHR(F) ;IF A "FAKE" DDB,
HRRZ T1,JBTLOC##(J) ;TELL WHERE JOB IS
>
IFN M.DAS78,<
IFN M.NET,<
LDB T2,[POINT 6,DEVSTA(F),9] ;GET DEVICE TYPE
CAIE T2,.TYD78/.TYEST ;SKIP IF DAS78 DEVICE
>;END IFN M.NET
IFE M.NET,<
JRST STOTC1## ;STATUS BITS TO 0 AND RETURN
>;END IFE M.NET
>;END IFN FTDAS78
IFN M.NET,<
CAMN T1,JBTLOC## ;CENTRAL SITE?
JRST STOTC1## ;YES, STATUS BITS ALL ZERO.
PUSHJ P,SRCNDB## ;FIND THE NODE BLOCK
JRST RTZER## ;DOES NO EXIST
HLRZ T1,NDBNNM##(W) ;GET THE NODE NUMBER
HLL T1,SCBSTS##(W) ;GET THE STATUS BITS
JRST STOTC1## ;STORE T1 IN USER'S AC
>;END IFN M.NET
;LOCATE UUO (CALLI 62)
;PLACES THE CALLER AT THE DESIRED STATION SITE
;CALL: AC HAS STATION NUMBER TO LOCATE AT
LOCATE::SKIPN F,TTYTAB##(J) ;POINT TO JOB'S TTY
JRST LOCAT3 ;NONE.
CAME T1,[EXP -1] ;IF ARG IS -1...
JRST LOCAT3 ;NO
LDB T1,PDVSTA## ;PUT JOB WHERE TTY IS
JRST LOCAT2 ;LOCATE THE JOB
LOCAT3: JUMPE T1,LOCAT1 ;0 IMPLIES LOCAL NODE
CAILE T1,77 ;IS THE STATION IN RANGE
POPJ P, ;NO, ERROR RETURN
LOCAT2: HRRZM T1,JBTLOC##(J) ;LOCATE JOB
JRST CPOPJ1## ;GIVE GOOD RETURN
LOCAT1: MOVE T1,JBTLOC## ;CENTRAL LOCATION
JRST LOCAT2 ;PUT HIM THERE.
$LOW
>;END IFN M.NET!M.DAS78
$LIT
IFNDEF FTCMBTH,<COMEND: END>