Нет, но речь шла о компьютерах, а не о процах :)
Вид для печати
Тогда не зачёт.
Говоря про PDP-11, думаю, не сильно ошибусь, если скажу, что подавляющее количество людей будет подразумевать как компы, так и процессора. Семейство PDP-11. Rainbow к нему не относится.
Так что по прежнему один - и на порядок, а то и больше коммерчески самый успешный - на втором месте - семейство (процессоров и компов) PDP-8.
И тогда нам повезло - мы наняли Гарольда Макфарланда, протеже К. Гордона Белла, что бы он работал со мной. Гарольд работал над несколькими архитектурами в институте Карнеги-Меллона. Одна из них, нравившаяся ему, была настолько сложной и запутанной, что я не мог понять, как писать для неё программы - кто знает, она могла быть самой лучшей, но этого мы никогда не узнаем. Другая архитектура Гарольда была по существу тем, что стало PDP-11. Когда мы представили эту архитектуру в качестве нашей рекомендации для первой 16-разрядной машины DEC, менеджеры по аппаратным средствам (например, Роджер Кэди) просто выгнали нас из комнаты, потому что не было 16-битных инструкций, с данными, закодированными непосредственно в них! И коротких адресов не было! Эти и другие подобные идеи были в значительной степени важны, для достижения низкой нагрузки на канал обмена с памятью и компактного кода. Вскоре мы смогли преодолеть эти предвзятые понятия, и внезапно проект Desk Calculator стал горячим. Всевозможные архитекторы (в том числе К. Гордон Белл и Билл Вульф как консультанты), а также инженеры по аппаратным и программным средствам, участвовали в быстром описании деталей машины. Основываясь на материалах Гарольда и других, я написал оригинальную спецификацию языка ассемблера, и Боб Бауэрс (если я правильно помню) написал кросс-ассемблер на PDP-10 в течение выходных. (И, хотя это не было указано, у него так же был и макропроцессор!) Я начал нанимать разработчиков программного обеспечения (всего 3), и я написал SIM-11 - полное моделирование PDP-11 на базе PDP-10 на FORTRAN (не мой язык!). С ассемблером и симулятором мы смогли спроектировать и протестировать исходное программное обеспечение для перфоленты (ассемблер, редактор, IOX, компоновщик, ....) и разработать простые тестовые программы до того, как будет доступен первый прототип.
Самая первая программа, выполненная PDP-11, была набрана на консоли, и это был простой цикл для заполнения слов памяти собственным адресом. Это делается элементарно с помощью цикла MOV R0, (R0) +, где R0 начинается с небольшого чётного числа. Как известно, PDP-11/20 неправильно помещал A+2 в слово A. Однако SIM-11 правильно помещал A в слово A. Следующее событие было предсказуемым и повторялось снова и снова в моем личном опыте. То есть - мне пришлось реализовать аппаратную ошибку в SIM-11!
Одно из моих любимых воспоминаний - личное упаковывание первой коробки с программным обеспечением на перфоленте для первого PDP-11, доставленного клиенту. К сожалению, я не помню, кем был клиент.
Я также помню, как на меня давили маркетологи, чтобы минимальный объём памяти был 2 килобайта. Я им ответил: «Тогда не будет ассемблера» - так что теперь у нас 4 килобайта минимальной памяти.
И маркетологи хотели, чтобы комментарий начинался с косой черты (а ля PDP-8?), на что я сказал: «Тогда я буду использовать точку с запятой для деления».
Первый диск, подключенный к PDP-11, имел ёмкость 64 килослов и каждое слово было индивидуально адресуемым. Расскажите о коротких секторах!
Позже я был основным участником внедрения RSX-11C (вся система в памяти) и RSX-11B (добавлено массовое хранилище, то есть диск).
Я бы сказал, что это документированное поведение многих процессоров, в частности, всех J11-based. У меня на 11/83 именно так и будет.
Поэтому MACRO-11 генерит Z на такую команду :)
Собственно согласно таблицы разностей поведения, так ведут себя 23, 24, 15, 20, 35, 40, 60, 73, 83, 84, 93, 94 и все M :)
"Дисплеи - это отдельная история - кубинские не работали, когда было жарко, советские, когда холодно..."
Моя первая работа - на химфаке МГУ - привезли нам это чудо, порядки десяти штук. Не завёлся ни один :) Приехали два спеца с Кубы, вводить в эксплуатацию :) С ними приехали две здоровых коробки, набитые платами. Метод ремонт на 90 процентов - замены плат :) Не помню насчёт работоспособности в жару или в холод :)
Третья работа - в Саратове - был комплекс СМ-1600 (если мне не изменяет память - четыре стойки, мегабайт памяти). Крутая особенность - полная неработоспособность холодной. Помещение зимой сильно остывало, я приходил часам к восьми, включал СМ-ку, включал пару обогревателей и.... мы ждали примерно до обеда - пока в помещении не станет достаточно тепло для работы нашего ЧУДА. Зато летом было всё тип-топ - какая бы жара не стояла (окна нараспашку, потом был кондиционер, но он не сильно спасал) - ни малейшего сбоя :) И были на этой СМ-ке диски типа RK06 (не помню их советское название) - вот с ними была полная жопа. Сам дисковод продувался воздухом, что бы обеспечить достаточную подъёмную силу для головок - должен был быть определённый напор воздуха, а что бы всякая пыль не царапнула поверхность - были воздушные фильтры, в том числе - предварительный фильтр, который в нашем помещении быстро забивался, напор воздуха падал и... головка садилась на блин. После чего - диск можно было выбрасывать. Сколько мы тогда дисков угробили, пока поняли в чём причина... И что самое противное - вроде как в диске два блина.. но пересобрать из живых не получится - на одной из поверхностей был на заводе прописан серво-сигнал - по нему позиционировались головки - разобрал диск - и все.. Отъюстировать уже никак.. Жаль не оставил себе на память хотя бы испорченных парочку :)
Похоже, судя по тому, что увидел на фотках :) В общем, барахло редкостное в пыльной атмосфере.
Потом работал на СМ-1420, там стояли, опять же, судя по фоткам СМ5407 - 20-ти мб-ные монстрики :) У этих было аппаратное позиционирование головок (гребёнка), так то проблем с разборкой сборкой особо не было - но у них площадь головки была больше, поэтому посадить её на диск было сложней. Зато была проблема совместимости самих дисков между накопителями - периодически нужно было выставлять положение головок по эталонному диску, у которого на каждой поверхности была записана всего одна дорожка :) Опять же - жаль не упёр хотя бы один на память :)
Из RT-11 V02CКод:C RT-11 OBJECT MODULE PATCH UTILITY (PATCHO)
C
C DEC-11-ORPOA-E
C
C ECP, RRB, BAM
C APRIL 1974
C BC SEP 1975
C
C COPYRIGHT (C) 1974,1975
C DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
C
C THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
C ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
C THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE,
C OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE
C AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO
C ONE WHO AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
C SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
C
C THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO
C CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED
C AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
C
C DEC ASSUMES NO RESPONSIBILITY FOR THE USE
C OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT
C WHICH IS NOT SUPPLIED BY DEC.
C
C
C MAIN DRIVER ROUTINE FOR PATCHO
C
IMPLICIT INTEGER*2 (A-Z)
LOGICAL*1 IBUF(512),OBUF(512),FBBUF(50),B1(2),B2(2),ERROR,EOF
LOGICAL*4 WORD,DECSW
INTEGER*2 IFBBUF(25),MODNAM(2),CMBLK(12)
COMMON FBBUF,FBLEN,FBPTR,FBCODE,IBUF,OBUF,IPTR,OPTR,ERROR,EOF,
1IREC,OREC,MODNAM,LSTMOD,BUFFUL,PREVIREC,PREVIPTR
COMMON /CS/ NAME1(2),VALUE1,NAME2(2),VALUE2,RELATV,WORD,CMDNMB
COMMON /CS/ CHKSUM,DECSW
COMMON /SECTBL/ SECMAX !TO PULL SECTBL INTO THE ROOT
COMMON /CHGTBL/ CHGMAX !AND ALSO CHGTBL
EQUIVALENCE (CMBLK,NAME1)
DATA OPENFL/-1/ !INDICATES IF A FILE IS OPEN YET
DATA BUFFUL/0/ !INDICATES WHETHER A BLOCK IS PRESENT IN FBBUF
DATA CHANGE/0/ !INDICATES IF A CHANGE HAS BEEN MADE
DATA CMBLK/12*0/ !INITIALIZE SCAN COMMON BLOCK
DATA LSTMOD /-1/ !LIST MODE SWITCH, INITIALLY OFF
DATA ERROR,EOF /F,F/ !ERROR AND END-OF-FILE FLAGS
DATA IPTR,OPTR /513,1/ !BUFFER POINTERS
DATA IREC,OREC /1,1/ !AND RECORD NUMBERS
DATA SECMAX/0/, CHGMAX/0/ !INIT # OF CSECTS, CHANGES
C
C
10 CALL GETCMD !GET NEXT COMMAND
IF (CMDNMB.NE.6.AND.OPENFL) GOTO 900 !OOPS - NO FILE OPEN
GOTO (100,200,300,400,400,600,700),CMDNMB
100 IF (CHANGE) CALL CLOSEF !DUMP ANY CHANGES MADE SO FAR
CHANGE = 0 !INDICATE CLEAN STATE
CALL POINT
GOTO 10
200 CALL LIST
GOTO 10
300 CALL DUMP
GOTO 10
400 CALL WRDBYT
CHANGE = -1 !INDICATE A CHANGE PENDING
GOTO 10
600 DEFINE FILE 1(0,256,U,IREC)
DEFINE FILE 2(0,256,U,OREC)
CALL INBLK !GET FIRST BLOCK
CALL NEXT !AND SET UP NAME OF MODULE
OPENFL = 0 !ALLOW OTHER COMMANDS NOW
GOTO 10
700 IF (CHANGE) CALL CLOSEF
710 IF (EOF) GOTO 720 !UNTIL DONE
CALL OUTBLK !ELSE KEEP COPYING
CALL INBLK
GOTO 710
720 IF (BUFFUL) CALL OUTBLK !DUMP LAST BUFFER IF NECESSARY
IF (OPTR.EQ.1) GOTO 740 !IF OUTPUT BUFFER EMPTY
DO 730 L=OPTR,512 !ZERO REMAINDER OF BUFFER
730 OBUF(L) = .FALSE.
WRITE (2'OREC) OBUF !AND WRITE IT
740 TYPE 1010 !CHECKSUM TO ASSURE PATCH TYPED CORRECTLY
1010 FORMAT('+ENTER CHECKSUM: ',$)
IF (DECSW) GOTO 800 !IF HE DOESN'T KNOW THE CHECKSUM
ACCEPT 1020,CHK1 !ELSE READ IT FROM THE CONSOLE
1020 FORMAT(O6)
IF (CHK1.NE.CHKSUM) PAUSE '?BAD PATCH?'
STOP
800 TYPE 1030,CHKSUM !TYPE OUT CALCULATED CHECKSUM
1030 FORMAT('+',O6)
STOP
900 TYPE 1000
1000 FORMAT('+?NO FILE OPEN?',/)
GOTO 10
END
Ну прям моя молодость - всё что можем, пишем на фортране :) Всё что не можем - ... тоже на фортране :)
Всё было круче :)
- - - Добавлено - - -
Дедушка SYSGEN.COM
- - - Добавлено - - -Код:SYSGEN.CND V02.11B RT-11 SYSGEN SCRIPT FILE
;
; COPYRIGHT (C) 1978
;
; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;
#NAME SYCND
#FILE SYCND.MAC
.SBTTL SYSTEM CONDITIONAL FILE
; SYCND.MAC--SYSTEM CONDITIONAL FILE
;
; COPYRIGHT (C) 1978
;
; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
#SET MONITR=N
#SET MTTY=N
#SET BLSJFB=N
#SET FBXM=N
#SET TIME=N
#PRINT RT-11 SYSTEM GENERATION PROGRAM V02.11B
#ASK Do you want the expanded form of dialogue [Y/N] (Y)?LONG/Y=Y
#IF LONG
#PRINT All answers requiring a choice are indicated by [Y/N]
#PRINT and require you to type either 'Y' for yes or 'N'
#PRINT for no followed by a carriage return. Answers requiring
#PRINT numeric input are indicated by [D] for decimal input and
#PRINT [O] for octal input. Answers requiring a device name
#PRINT response are indicated by [DD]; answers requiring a
#PRINT device name followed by a unit number are indicated
#PRINT by [DDU]. If you enter no response (just a CARRIAGE RETURN),
#PRINT your answer will default to the response indicated in
#PRINT parentheses before the question mark (e.g. [DD] (RK)?).
#PRINT Your responses are checked for validity wherever possible.
#PRINT The outputs of this SYSGEN program are two conditional
#PRINT files (SYCND.MAC and SYSTBL.MAC) and three indirect
#PRINT command files (SYSBLD.COM, MONBLD.COM and DEVBLD.COM)
#PRINT which are used to assemble and link the monitor(s) and
#PRINT device handlers for the target system. The assembly
#PRINT and linking process requires a machine with at least
#PRINT 16K words of memory and mass storage with at least 500
#PRINT free blocks on the output device and 128 free blocks
#PRINT on the system device.
#PRINT The following dialogue asks questions about
#PRINT the configuration for which the system is being
#PRINT generated, and about monitor and device support
#PRINT options you may desire. You should have read the
#PRINT RT-11 System Generation Manual before proceeding.
#PRINT You can terminate SYSGEN at any time by typing CTRL/C.
#PRINT The RT-11 system includes a variety of monitors, allowing
#PRINT you to select the monitor best suited to your
#PRINT application. The monitors are customized to your configuration
#PRINT by this SYSGEN process, and, while you may build any number of
#PRINT monitors, you should realize that SYSGEN places a large
#PRINT demand on time and data storage.
#PRINT If you elect to build the base-line
#PRINT single-job (SJ) monitor, no other monitors
#PRINT may be built during the same SYSGEN pass.
#PRINT The base-line single-job (SJ) monitor is the minimal monitor
#PRINT necessary to execute standard system functions. It is intended
#PRINT for systems with only 8K words of memory, or for larger
#PRINT systems that require the lowest possible monitor overhead.
#PRINT Device support is limited, and some features of the
#PRINT SJ monitor usable in larger configurations are omitted,
#PRINT such as BATCH and VT11 support.
#ENDC LONG
SYSG$N = 1 ;INDICATE SYSGENED MONITOR
#ASK Do you want the base-line single-job monitor [Y/N] (N)?BLSJ/Y=N
#IF BLSJ
#SET SJ=N
#SET FB=N
#SET XM=N
#SET TIME$R=N
#SET DS=N
#SET DM=N
#SET RF=N
#SET RX2=N
#SET DP=N
#SET RP3=N
#SET MTSP=N
#SET TM=N
#SET TJU=N
#SET GRAFX=N
#SET CT=N
#SET CR=N
#SET BATC$H=N
#SET ERL$G=N
#SET MONITR=Y
#SET BLSJFB=Y
#SET MTTY=N
; BASE-LINE SJ MONITOR
TIME$R = 0 ;NO TIMER SUPPORT
MPT$Y = 0 ;NO MEMORY PARITY SUPPORT
BATC$H = 0 ;NO BATCH SUPPORT
ERL$G = 0 ;NO ERROR LOG SUPPORT
ESC$P = 0 ;NO ESCAPE SEQUENCE SUPPORT
RDF$L = 0 ;NO MESSAGE ON SYS I/O ERRORS (SJ)
#IFF
#IF LONG
#PRINT The single-job (SJ) monitor provides an environment suitable
#PRINT for the development of simple applications in FORTRAN or
#PRINT BASIC. It provides a subset of the foreground/background
#PRINT (FB) features and offers maximum ability for minimum size.
#PRINT Some additional features may be added during SYSGEN, but at
#PRINT the cost of increased monitor size.
#ENDC LONG
#ASK Do you want the single-job (SJ) monitor [Y/N] (Y)?SJ/Y=Y
#IF SJ
#SET BLSJFB=Y
#SET MONITR=Y
#ENDC SJ
#IF LONG
#PRINT The foreground/background (FB) monitor offers an extended
#PRINT set of facilities which are helpful for applications
#PRINT involving real-time or data acquisition. These
#PRINT include timer support, serialized asynchronous I/O, and
#PRINT support for a foreground job.
#ENDC LONG
#ASK Do you want the foreground/background (FB) monitor [Y/N] (Y)?FB/Y=Y
#IF FB
#SET BLSJFB=Y
#SET MONITR=Y
#SET FBXM=Y
#ENDC FB
#IF LONG
#PRINT The extended memory (XM) monitor is a version of the FB
#PRINT monitor which supports up to 128K words of memory. It is
#PRINT useful for advanced applications that require an extended
#PRINT addressing space. The XM monitor is larger than FB and
#PRINT requires a resident USR and drivers.
#ENDC LONG
#ASK Do you want the extended memory (XM) monitor [Y/N] (N)?XM/Y=N
#IF XM
#SET MONITR=Y
#SET FBXM=Y
#ENDC XM
#ENDC BLSJ
#IFN MONITR
#PRINT ?SYSGEN-F-No monitor requested
#EXIT
#ENDC MONITR
#IFN BLSJ
#IF LONG
#PRINT There are a number of monitor options you may select:
#ENDC LONG
#IF SJ
#IF LONG
#PRINT The following options apply only to the SJ monitor.
#PRINT The SJ monitor normally does not have timer support.
#PRINT You may optionally include the .MRKT and .CMKT requests.
#ENDC LONG
#ASK Do you want timer support in the SJ monitor [Y/N] (N)?TIME$R/Y=N
#IF TIME$R
TIME$R = 1 ;ADD TIMER SUPPORT (SJ)
#ENDC TIME$R
#IF LONG
#PRINT The device time-out option permits device drives to issue
#PRINT mark time requests. This feature is currently not used
#PRINT by any RT-11 drivers, but is necessary for DECNET support.
#PRINT Select this option if you are planning to use DECNET
#PRINT with your monitor.
#ENDC LONG
#ASK Do you want device time-out support [Y/N] (N)?DEVTO/Y=N
#IF DEVTO
#IFN TIME
TIM$IT = 1 ;ADD DEVICE TIMER SUPPORT
#SET TIME=Y
#ENDC TIME
#IF SJ
#IFN TIME$R
TIME$R = 1 ;ADD TIMER SUPPORT (SJ)
#ENDC TIME$R
#ENDC SJ
#ENDC DEVTO
#IF LONG
#PRINT The SJ monitor will normally halt at the "system halt"
#PRINT if there is a fatal system I/O error. This halt can
#PRINT be replaced with a system error message at the cost of
#PRINT about 30 words additional code in the resident
#PRINT monitor. This option is highly recommended if the system
#PRINT is going to be used by anyone other than the expert.
#ENDC LONG
#ASK Do you want an error message on system I/O errors [Y/N] (Y)?RDF$L/Y=Y
#IF RDF$L
RDF$L = 1 ;ADD SYSTEM I/O ERROR MESSAGE (SJ)
#IFF
RDF$L = 0 ;NO SYSTEM I/O ERROR MESSAGE (SJ)
#ENDC RDF$L
#ENDC SJ
#IF FBXM
#IF LONG
#PRINT The following options apply only to the FB and XM monitors.
#PRINT The FB and XM monitors' scheduler idle loop will display
#PRINT a moving light pattern in the display register of any
#PRINT PDP-11/45, 11/50, 11/55 or 11/70 processor.
#ENDC LONG
#ASK Do you want idle loop light pattern [Y/N] (N)?LIGH$T/Y=N
#IF LIGH$T
LIGH$T = 1 ;IDLE LOOP LIGHT PATTERN (FB,XM)
#ENDC LIGH$T
#IF LONG
#PRINT RT-11 normally supports a single terminal interfaced through
#PRINT the console KL11 or DL11, which is shared by both background
#PRINT and foreground jobs. You may optionally select multi-
#PRINT terminal support of up to 16 terminals interfaced through
#PRINT a choice of DL11 and DZ11 interfaces.
#ENDC LONG
#ASK Do you want support of more than one terminal [Y/N] (N)?MTTY/Y=N
#IF MTTY
MTT$Y = 1 ;MULTIPLE TERMINAL SUPPORT (FB,XM)
#ENDC MTTY
#ENDC FBXM
#ENDC BLSJ
#IF LONG
#PRINT The following options apply to all monitors.
#PRINT RT-11 assumes a 60 Hz power line frequency, but can
#PRINT optionally support a 50 Hz frequency.
#ENDC LONG
#ASK Do you want the optional 50 Hz clock support [Y/N] (N)?CLOCK/Y=N
#IF CLOCK
CLOCK = 50. ;POWER LINE FREQUENCY (SJ,FB,XM)
#IFF
CLOCK = 60. ;POWER LINE FREQUENCY (SJ,FB,XM)
#ENDC CLOCK
#IFN BLSJ
#IF LONG
#PRINT RT-11 normally uses a line clock for the system clock.
#PRINT You may substitute the KW11-P programmable clock if you wish,
#PRINT in which case the KW11-P is not available for program use.
#ENDC LONG
#ASK Do you want to use the KW11-P clock as the system clock [Y/N] (N)?KW11$P/Y=N
#IF KW11$P
KW11$P = 1 ;USE KW11-P CLOCK AS SYSTEM CLOCK (SJ,FB,XM)
#ENDC KW11$P
#ENDC BLSJ
#IF LONG
#PRINT The bootstrap optionally executes an indirect file when
#PRINT starting the system.
#ENDC LONG
#ASK Do you want the startup indirect file [Y/N] (Y)?START/Y=Y
#IF START
STAR$T = 1 ;STARTUP COMMAND FILE (SJ,FB,XM)
#ENDC START
#IFN BLSJ
#IF LONG
#PRINT RT-11 supports parity memory and processes memory
#PRINT parity errors. If error logging is present, parity errors
#PRINT are also logged.
#ENDC LONG
#ASK Do you want memory parity support [Y/N] (N)?MPT$Y/Y=N
#IF MPT$Y
MPT$Y = 1 ;MEMORY PARITY (SJ,FB,XM)
#ENDC MPT$Y
#IF LONG
#PRINT The monitor normally halts on power recovery startup
#PRINT after a power failure. You may elect to have the monitor
#PRINT print a message explaining that power failure caused the halt.
#ENDC LONG
#ASK Do you want power failure messages [Y/N] (Y)?PWF$L/Y=Y
#IF PWF$L
PWF$L = 1 ;POWER FAIL (SJ,FB,XM)
#ENDC PWF$L
#IF LONG
#PRINT RT-11 supports BATCH as an option. Indirect command
#PRINT file support is separately available in all monitors,
#PRINT and BATCH support need not be selected to obtain
#PRINT indirect command file support.
#ENDC LONG
#ASK Do you want BATCH support [Y/N] (N)?BATC$H/Y=N
#IF BATC$H
BATC$H = 1 ;BATCH SUPPORT (SJ,FB,XM)
#ENDC BATC$H
#IF LONG
#PRINT The RT-11 terminal service is capable of recognizing
#PRINT ANSI or DEC standard escape sequences and processing
#PRINT those sequences according to application instructions.
#PRINT This support is not necessary for normal system operation;
#PRINT if your application does not make special use of escape
#PRINT sequences, do not select this support.
#ENDC LONG
#ASK Do you want escape sequence processing [Y/N] (N)?ESC/Y=N
#IF ESC
#ASK Do you want ANSI standard escape sequences [Y/N] (N)?ANSI/Y=N
#IF ANSI
ESC$P = 2 ;ANSI ESCAPE SEQUENCES (SJ,FB,XM)
#IFF
ESC$P = 1 ;DEC ESCAPE SEQUENCES (SJ,FB,XM)
#PRINT DEC standard escape sequences assumed.
#ENDC ANSI
#IFF
ESC$P = 0 ;NO ESCAPE SEQUENCES (SJ,FB,XM)
#ENDC ESC
#IF LONG
#PRINT Selection of error logging creates the error logging
#PRINT driver EL and incorporates error logging into the device
#PRINT handlers. When EL is loaded and initialized, logging of
#PRINT disk, DECtape and memory parity errors will occur.
#ENDC LONG
#ASK Do you want error logging [Y/N] (N)?ERL$G/Y=N
#IF ERL$G
ERL$G = 1 ;ERROR LOGGING (SJ,FB,XM)
#IF SJ
#IFN TIME$R
TIME$R = 1 ;ADD TIMER SUPPORT (SJ)
#ENDC TIME$R
#ENDC SJ
#IF LONG
#PRINT The error logger can capture either initial errors
#PRINT or the most recent errors that have occured. For most
#PRINT types of problems, information concerning initial
#PRINT errors is most useful.
#ENDC LONG
#ASK Should the error logger capture the most recent errors [Y/N] (N)?ERLW/Y=N
#IF ERLW
ERL$W = 1 ;LOG MOST RECENT ERROR (SJ,FB,XM)
#ENDC ERLW
#IF LONG
#PRINT Normal error logging usage requires the utility ERRUTL
#PRINT to be run occasionally from the console
#PRINT to write the error information out to the error log file. If
#PRINT an application is to be run continuously for a long period
#PRINT of time, however, the error logger has a facility that
#PRINT allows the application program to dump the error log buffer
#PRINT to the error file at regular intervals. Unless your
#PRINT application specifically uses this feature, you do not need
#PRINT this support.
#ENDC LONG
#PRINT Do you want a program other than ERRUTL
#ASK - to write the error log buffer [Y/N] (N)?ERLA/Y=N
#IF ERLA
ERL$A = 1 ;AUTOMATIC ERROR LOG DUMPING (SJ,FB,XM)
#ENDC ERLA
#IF LONG
#PRINT The error logger requires a resident buffer to collect
#PRINT errors. The buffer size may be increased to accomodate
#PRINT an unusual error load.
#ENDC LONG
#PRINT How many 256 word memory blocks should be
#ASK - set aside for the error buffer [D] (1)?ERLB/D=1,1,4
#SUBS "ER.B"ERLB
ERL$B = ER.B. ;NUMBER OF BLOCKS IN ERROR LOG BUFFER
#ENDS
#IF LONG
#PRINT The error logger can handle up to 35 individual device
#PRINT units. Space can be conserved by reducing the number
#PRINT of units the logger can handle to the specific number
#PRINT of units present on the target configuration. Only disk
#PRINT and DECtape units need be included.
#ENDC LONG
#ASK How many disk and DECtape device units can be logged [D] (10)?ERLU/D=10,1,35
#SUBS "ER.U"ERLU
ERL$U = ER.U. ;NUMBER OF UNITS TO BE LOGGED
#ENDS
#ENDC ERL$G
#ENDC BLSJ
#SET RK=N
#SET RF=N
#SET DT=N
#SET DX=N
#SET DS=N
#SET DP=N
#SET DM=N
#SET DL=N
#SET DY=N
#SET DD=N
#SET PD=N
#IF LONG
#PRINT The following questions ask about the
#PRINT peripheral devices that are to be supported by the
#PRINT generated system. By selecting support for a specific
#PRINT device, you make the device known to the monitor's
#PRINT device tables, and you cause a device handler
#PRINT to be generated for the device. If you do not select
#PRINT a specific device, you will have to create the
#PRINT device handler separately and use the monitor
#PRINT INSTALL command when device access is desired.
#PRINT RT-11 supports the following devices as system devices:
#IF BLSJ
#PRINT RK RK05 Cartridge Disk
#PRINT DT DECtape
#PRINT DX Flexible Diskette
#PRINT PD PDT Intelligent Terminal
#IFF
#PRINT RK RK05 Cartridge Disk
#PRINT DL RL01 Cartridge Disk
#PRINT RF RF11 Fixed-head Disk
#PRINT DT DECtape
#PRINT DX RX01 Flexible Diskette
#PRINT DY RX02 Double Density Diskette
#PRINT DS RJS03/4 Massbus Fixed-head Disk
#PRINT DP RP11 Disk Pack
#PRINT DM RK06/RK07 Cartridge Disk
#PRINT DD DECtape II Data Cartridge
#PRINT PD PDT Intelligent Terminal
#ENDC BLSJ
#PRINT You must select one as your system device; use the
#PRINT two character device name as indicated above.
#ENDC LONG
#ASK What is the name of the system device [DD] (RK)?SYSDV/A=RK
#SUBS "S$D."SYSDV
$S$D.SYS = 1 ;SYSTEM DEVICE
#SET S$D.=Y
#ENDS
#IF BLSJ
#IFN RK
#IFN DT
#IFN DX
#IFN PD
#PRINT ?SYSGEN-F-Illegal system device for base-line monitor
#EXIT
#ENDC PD
#ENDC DX
#ENDC DT
#ENDC RK
#ENDC BLSJ
#IFN BLSJ
#IFN DS
#IFN RF
#ASK Do you want RJS03 or RJS04 disk support [Y/N] (N)?DS/Y=N
#ENDC RF
#ENDC DS
#IF DS
#ASK Do you want RJS03 support (as opposed to RJS04 support) [Y/N] (Y)?DS3/Y=Y
#IF DS3
RJS0$3 = 1 ;RJS DISK IS RJS03
#IFF
#PRINT RJS04 support assumed.
RJS0$3 = 0 ;RJS DISK IS RJS04
#ENDC DS3
#ENDC DS
#IFN DS
#IFN RF
#ASK Do you want RF11 fixed-head disk support [Y/N] (N)?RF/Y=N
#ENDC RF
#IF RF
#ASK How many disk platters are installed on the RF11 controller [D] (1)?RFP/D=1,1,8
#SUBS "RF.P"RFP
$RFNUM = RF.P. ;NUMBER OF RS11 PLATTERS
#ENDS
#ENDC RF
#ENDC DS
#IFN DP
#ASK Do you want RP11/RPR02 or RP11/RP03 disk support [Y/N] (N)?DP/Y=N
#ENDC DP
#IF DP
#ASK Do you want RPR02 support (as opposed to RPR02/RP03) [Y/N] (Y)?DP2/Y=Y
#IF DP2
RP0$3 = 0 ;RP11 DISK IS RP02/RPR02
#IFF
RP0$3 = 1 ;RP11 DISK IS RP03
#PRINT RPR02 and RP03 support assumed.
#ENDC DP2
#ENDC DP
#ENDC BLSJ
#IFN DX
#ASK Do you want RX01/RX11 flexible diskette support [Y/N] (N)?DX/Y=N
#ENDC DX
#IF DX
#IF LONG
#PRINT The RX11 flexible diskette subsystem supports only two
#PRINT drives for each controller. If your system contains four
#PRINT diskette drives, there is a second controller present
#PRINT supporting the third and fourth units.
#ENDC LONG
#ASK Do you want support for a second RX11 controller [Y/N] (N)?DX2/Y=N
#PRINT What is the CSR address for the
#ASK - first RX11 controller [O] (177170)?DXC1/O=177170,160000,177570
#ASK What is the vector address for the first RX11 controller [O] (264)?DXV1/O=264,100,770
#SUBS "R.C"DXC1
DX$CSR = R.C ;CSR OF FIRST RX11
#SUBS "R.V"DXV1
DX$VEC = R.V ;VECTOR OF FIRST RX11
#ENDS
#IF DX2
DXT$O = 1 ;SECOND RX11 CONTROLLER
#PRINT What is the CSR address for the
#ASK - second RX11 controller [O] (177150)?DXC/O=177150,160000,177570
#ASK What is the vector address for the second RX11 controller [O] (270)?DXV/O=270,100,770
#SUBS "R.C"DXC
DX$CS2 = R.C ;CSR OF SECOND RX11
#SUBS "R.V"DXV
DX$VC2 = R.V ;VECTOR OF SECOND RX11
#ENDS
#ENDC DX2
#ENDC DX
#IFN BLSJ
#IFN DY
#ASK Do you want RX02 diskette support [Y/N] (N)?DY/Y=N
#ENDC DY
#IF DY
#IF LONG
#PRINT The RX02 diskette subsystem supports only two drives for
#PRINT each controller. If your system contains four drives,
#PRINT there is a second controller present supporting the
#PRINT third and fourth units.
#ENDC LONG
#ASK Do you want support for a second RX02 controller [Y/N] (N)?DY2/Y=N
#IF LONG
#PRINT The RX02 diskette supports both single and double densities
#PRINT by default. You can obtain a slight performance
#PRINT enhancement and a reduction in the size of the device
#PRINT handler by specifying double density support only.
#ENDC LONG
#ASK Do you want RX02 double density support only [Y/N] (N)?DYD/Y=N
#IF DYD
DY$DD = 1 ;RX02 DOUBLE DENSITY ONLY
#ENDC DYD
#PRINT What is the CSR address for the
#ASK - first RX02 controller [O] (177170)?DYC1/O=177170,160000,177570
#ASK What is the vector address for the first RX02 controller [O] (264)?DYV1/O=264,100,770
#SUBS "R.C"DYC1
DY$CSR = R.C ;CSR OF FIRST RX02
#SUBS "R.V"DYV1
DY$VEC = R.V ;VECTOR OF FIRST RX02
#ENDS
#IF DY2
DYT$O = 1 ;SECOND RX02 CONTROLLER
#PRINT What is the CSR address for the
#ASK - second RX02 controller [O] (177150)?DYC/O=177150,160000,177564
#ASK What is the vector address for the second RX02 controller [O] (270)?DYV/O=270,100,770
#SUBS "R.C"DYC
DY$CS2 = R.C ;CSR OF SECOND RX02
#SUBS "R.V"DYV
DY$VC2 = R.V ;VECTOR OF SECOND RX02
#ENDS
#ENDC DY2
#ENDC DY
#IFN DD
#ASK Do you want DECtape II Data Cartridge support [Y/N] (N)?DD/Y=N
#ENDC DD
#IF DD
#PRINT What is the CSR address for the
#ASK - DECtape II controller [O] (176500)?DDC/O=176500,160000,177570
#ASK What is the vector address for the DECtape II controller [O] (300)?DDV/O=300,100,770
#SUBS "R.C"DDC
DD$CSR = R.C ;CSR OF DECTAPE II
#SUBS "R.V"DDV
DD$VEC = R.V ;VECTOR OF DECTAPE II
#ENDS
#ENDC DD
#IFN DL
#ASK Do you want RL01 disk support [Y/N] (N)?DL/Y=N
#ENDC DL
#IF DL
#ASK How many RL01 units are to be supported [D] (2)?DLUNIT/D=2,1,4
#SUBS "U.N"DLUNIT
DL$UN = U.N ;NUMBER OF RL01 UNITS
#ENDC DL
#ENDC BLSJ
#IFN RK
#ASK Do you want RK05/RK05F disk support [Y/N] (N)?RK/Y=N
#ENDC RK
#IFN DT
#ASK Do you want TC11 DECtape support [Y/N] (N)?DT/Y=N
#ENDC DT
#IFN BLSJ
#IFN DM
#ASK Do you want RK06/RK07 disk support [Y/N] (N)?DM/Y=N
#ENDC DM
#ASK Do you want magnetic tape support [Y/N] (N)?MTSP/Y=N
#IFN MTSP
#SET TM=N
#SET TJU=N
#IFF
#IF LONG
#PRINT RT-11 magtape support is available in two forms. The standard
#PRINT form is file-structured magtape, which supports a subset of
#PRINT ANSI file format. The file-structured handler may be used to
#PRINT store and retrieve data in a file format usable with most
#PRINT RT-11 system programs. The second form of magtape support
#PRINT omits file structuring and reads and writes data directly in variable
#PRINT length records. This type of support is called the "hardware
#PRINT handler", and while this handler is significantly smaller than
#PRINT the file-structured handler, it can not be used with any
#PRINT system programs. The file-structured handler is also
#PRINT capable of performing direct hardware functions.
#ENDC LONG
#ASK Do you want the file-structured magtape handler [Y/N] (Y)?MTF/Y=Y
#IF MTF
FILES = 1 ;MAGTAPE FILES SUPPORT
#IF LONG
#PRINT The file-structured handler requires table space for
#PRINT each magtape unit. You can minimize the size of
#PRINT the magtape handler by limiting the number of units it can
#PRINT simultaneously handle to the number actually present on the
#PRINT target machine.
#ENDC LONG
#ASK How many magtape units are to be supported [D] (2)?DRIVEN/D=2,1,8
#SUBS "D.N"DRIVEN
DRIVEN = D.N. ;NUMBER OF MAGTAPE UNITS
#ENDS
#ENDC MTF
#ASK Do you want TM11 (UNIBUS) magtape support [Y/N] (Y)?TM/Y=Y
#IF TM
#SET TJU=N
#IFF
#ASK Do you want TJU16 (MASSBUS) magtape support [Y/N] (Y)?TJU/Y=Y
#IFN TJU
#PRINT ?SYSGEN-F-Magtape specification error
#EXIT
#ENDC TJU
#ENDC TM
#ENDC MTSP
#ASK Do you want TA11 cassette support [Y/N] (N)?CT/Y=N
#ASK Do you want VT11 or VS60 graphics support [Y/N] (N)?GRAFX/Y=N
#IF GRAFX
#ASK Do you want VS60 support [Y/N] (N)?VS60$/Y=N
#IF VS60$
VS60$ = 1 ;SUPPORT VS60 DISPLAY
#IFF
VT11$ = 1 ;SUPPORT VT11 DISPLAY
#PRINT VT11 hardware is assumed.
#ENDC VS60$
#IF LONG
#PRINT The VT11/VS60 is normally installed at vector 320 with
#PRINT its CSR address at 172000, but these addresses may float.
#ENDC LONG
#ASK What is the CSR address for the VT11/VS60 [O] (172000)?VC/O=172000,160000,177570
#ASK What is the vector address for the VT11/VS60 [O] (320)?VV/O=320,300,770
#SUBS "V.C"VC
VT.CSR = V.C ;VT11/VS60 CSR
#SUBS "V.V"VV
VT.VEC = V.V ;VT11/VS60 VECTOR
#ENDS
#ENDC GRAFX
#ENDC BLSJ
#ASK Do you want line printer support [Y/N] (Y)?LP/Y=Y
#IF LP
#IF LONG
#PRINT The line printer vector address is normally 200
#PRINT and the CSR address is normally 177514. If your printer
#PRINT is installed at another vector or CSR address, you
#PRINT must specify the correct values.
#ENDC LONG
#ASK Does your printer have a non-standard vector or CSR address [Y/N] (N)?NSLP/Y=N
#IF NSLP
#ASK What is the CSR address for the printer [O] (177514)?LPCS/O=177514,160000,177570
#ASK What is the vector address for the printer [O] (200)?LPVC/O=200,100,770
#SUBS "LPC$"LPCS
LP$CSR = LPC$ ;LINE PRINTER CSR
#SUBS "LPV$"LPVC
LP$VEC = LPV$ ;LINE PRINTER VECTOR
#ENDS
#ENDC NSLP
#ENDC LP
#IF LONG
#PRINT The PC11 is a high speed paper tape reader/punch unit.
#PRINT The PR11 is a similar unit with a high speed reader but no punch.
#ENDC LONG
#ASK Do you want PC11 high-speed paper tape reader/punch support [Y/N] (N)?PC/Y=N
#IF PC
#SET PR=N
PR11$X = 0 ;PC11 HI-SPEED READER/PUNCH
#IFF
#ASK Do you want PR11 high-speed paper tape reader support [Y/N] (N)?PR/Y=N
#IF PR
PR11$X = 1 ;PR11 HI-SPEED READER
#ENDC PR
#ENDC PC
#IFN BLSJ
#ASK Do you want card reader support [Y/N] (N)?CR/Y=N
#ENDC BLSJ
#IF LONG
#PRINT The null handler is a mechanism that allows logical
#PRINT input and output to take place without actual physical
#PRINT data transfers. It is most useful in debugging applications.
#ENDC LONG
#ASK Do you want the null handler [Y/N] (Y)?NULL/Y=Y
#IF LONG
#PRINT This completes the device query. Space in the monitor is allocated
#PRINT only for the devices specified, but you may allocate additional
#PRINT space by requesting empty device slots. Allocate
#PRINT one empty slot for each device you intend to add to
#PRINT the system after it is built.
#ENDC LONG
#ASK How many extra device slots do you want [D] (0)?EMPTY/D=0,0,10
#IF LONG
#PRINT The indirect command files generated by the SYSGEN program
#PRINT contain commands that will delete the object modules
#PRINT from which the system is built when they are
#PRINT no longer needed. This measure serves to conserve disk
#PRINT space while the system is being built. It is often useful,
#PRINT however, to keep the object modules for later use in
#PRINT patching the system. If your output device
#PRINT has sufficient free space,you can elect to retain all
#PRINT system object modules for future use.
#ENDC LONG
#ASK Do you want to retain the system OBJ's [Y/N] (N)?OBJ/Y=N
#IF MTTY
#IF LONG
#PRINT The following questions ask about the terminal
#PRINT interfaces installed in your system. RT-11 supports a
#PRINT combination of serial asynchronous interfaces which include
#PRINT the KL11, DLV11, DLV11-E, DLV11-F, DLV11-J, and the DL11
#PRINT series. It also supports DL11-E and DLV11-E interfaces with
#PRINT modem capabilities, and the DZ11 and DZV11 series of
#PRINT asynchronous line multiplexors.
#PRINT The dialogue asks first for the number of local DL11
#PRINT lines, then the number of remote DL11 lines. The total
#PRINT number of lines is the sum of local and remote
#PRINT lines. Physical unit numbers of the DL11 lines are assigned
#PRINT first to local lines and then to remote lines. This assignment
#PRINT is permanent and its order cannot be changed.
#PRINT After the dialogue has established the number of lines of each
#PRINT type, the CSR and vector addresses for each line must be
#PRINT established. The first question corresponds to the first
#PRINT local line (the console), the second to the second local
#PRINT line, etc. until all local lines are accounted for. At that
#PRINT point, the next response applies to the first remote
#PRINT line, the second to the second remote line, etc. until all
#PRINT remote lines are accounted for.
#ENDC LONG
#ASK How many local DL11's, including the console [D] (1)?DLNUM/D=1,1,8
#SUBS "DLN$"DLNUM
DL11$L = DLN$. ;# OF LOCAL DL11 INTERFACES (MULTI-TERM SUPPORT)
#ASK How many remote DL11 lines [D] (0)?DLMDM/D=0,0,7
#SUBS "DLM$"DLMDM
DL11$M = DLM$. ;# OF REMOTE DL11-E LINES (MULTI-TERM SUPPORT)
DL11$N = DLN$. + DLM$. ;TOTAL # OF DL11 LINES (MULTI-TERM SUPPORT)
#ENDS
#PRINT What is the CSR address for the
#ASK - first (console) DL11 [O] (177560)?DLC/O=177560,160000,177570
#ASK What is the vector address for the first (console) DL11 [O] (60)?DLV/O=60,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$0 = DL.C ;CSR OF 1ST (CONSOLE) DL11 (MULTI-TERM SUPPORT)
DLV$0 = DL.V ;VECTOR OF 1ST (CONSOLE) DL11 (MULTI-TERM SUPPORT)
#ENDS
#DECR DLNUM
#IFGT DLNUM
#ASK What is the CSR address for the next (local) DL11 [O] (176500)?DLC/O=176500,160000,177570
#ASK What is the vector address for the next (local) DL11 [O] (300)?DLV/O=300,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$1 = DL.C ;CSR OF 2ND (LOCAL) DL11 (MULTI-TERM SUPPORT)
DLV$1 = DL.V ;VECTOR OF 2ND (LOCAL) DL11 (MULTI-TERM SUPPORT)
#ENDS
#IFF
#IFGT DLMDM
#ASK What is the CSR address for the next (remote) DL11 [O] (175610)?DLC/O=175610,160000,177570
#ASK What is the vector address for the next (remote) DL11 [O] (300)?DLV/O=300,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$1 = DL.C ;CSR OF 2ND (REMOTE) DL11 (MULTI-TERM SUPPORT)
DLV$1 = DL.V ;VECTOR OF 2ND (REMOTE) DL11 (MULTI-TERM SUPPORT)
#ENDS
#DECR DLMDM
#ENDC DLMDM
#ENDC DLNUM
#DECR DLNUM
#IFGT DLNUM
#ASK What is the CSR address for the next (local) DL11 [O] (176510)?DLC/O=176510,160000,177570
#ASK What is the vector address for the next (local) DL11 [O] (310)?DLV/O=310,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$2 = DL.C ;CSR OF 3RD (LOCAL) DL11 (MULTI-TERM SUPPORT)
DLV$2 = DL.V ;VECTOR OF 3RD (LOCAL) DL11 (MULTI-TERM SUPPORT)
#ENDS
#IFF
#IFGT DLMDM
#ASK What is the CSR address for the next (remote) DL11 [O] (175620)?DLC/O=175620,160000,177570
#ASK What is the vector address for the next (remote) DL11 [O] (310)?DLV/O=310,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$2 = DL.C ;CSR OF 3RD (REMOTE) DL11 (MULTI-TERM SUPPORT)
DLV$2 = DL.V ;VECTOR OF 3RD (REMOTE) DL11 (MULTI-TERM SUPPORT)
#ENDS
#DECR DLMDM
#ENDC DLMDM
#ENDC DLNUM
#DECR DLNUM
#IFGT DLNUM
#ASK What is the CSR address for the next (local) DL11 [O] (176520)?DLC/O=176520,160000,177570
#ASK What is the vector address for the next (local) DL11 [O] (320)?DLV/O=320,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$3 = DL.C ;CSR OF 4TH (LOCAL) DL11 (MULTI-TERM SUPPORT)
DLV$3 = DL.V ;VECTOR OF 4TH (LOCAL) DL11 (MULTI-TERM SUPPORT)
#ENDS
#IFF
#IFGT DLMDM
#ASK What is the CSR address for the next (remote) DL11 [O] (175630)?DLC/O=175630,160000,177570
#ASK What is the vector address for the next (remote) DL11 [O] (320)?DLV/O=320,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$3 = DL.C ;CSR OF 4TH (REMOTE) DL11 (MULTI-TERM SUPPORT)
DLV$3 = DL.V ;VECTOR OF 4TH (REMOTE) DL11 (MULTI-TERM SUPPORT)
#ENDS
#DECR DLMDM
#ENDC DLMDM
#ENDC DLNUM
#DECR DLNUM
#IFGT DLNUM
#ASK What is the CSR address for the next (local) DL11 [O] (176530)?DLC/O=176530,160000,177570
#ASK What is the vector address for the next (local) DL11 [O] (330)?DLV/O=330,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$4 = DL.C ;CSR OF 5TH (LOCAL) DL11 (MULTI-TERM SUPPORT)
DLV$4 = DL.V ;VECTOR OF 5TH (LOCAL) DL11 (MULTI-TERM SUPPORT)
#ENDS
#IFF
#IFGT DLMDM
#ASK What is the CSR address for the next (remote) DL11 [O] (175640)?DLC/O=175640,160000,177570
#ASK What is the vector address for the next (remote) DL11 [O] (330)?DLV/O=330,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$4 = DL.C ;CSR OF 5TH (REMOTE) DL11 (MULTI-TERM SUPPORT)
DLV$4 = DL.V ;VECTOR OF 5TH (REMOTE) DL11 (MULTI-TERM SUPPORT)
#ENDS
#DECR DLMDM
#ENDC DLMDM
#ENDC DLNUM
#DECR DLNUM
#IFGT DLNUM
#ASK What is the CSR address for the next (local) DL11 [O] (176540)?DLC/O=176540,160000,177570
#ASK What is the vector address for the next (local) DL11 [O] (340)?DLV/O=340,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$5 = DL.C ;CSR OF 6TH (LOCAL) DL11 (MULTI-TERM SUPPORT)
DLV$5 = DL.V ;VECTOR OF 6TH (LOCAL) DL11 (MULTI-TERM SUPPORT)
#ENDS
#IFF
#IFGT DLMDM
#ASK What is the CSR address for the next (remote) DL11 [O] (175650)?DLC/O=175650,160000,177570
#ASK What is the vector address for the next (remote) DL11 [O] (340)?DLV/O=340,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$5 = DL.C ;CSR OF 6TH (REMOTE) DL11 (MULTI-TERM SUPPORT)
DLV$5 = DL.V ;VECTOR OF 6TH (REMOTE) DL11 (MULTI-TERM SUPPORT)
#ENDS
#DECR DLMDM
#ENDC DLMDM
#ENDC DLNUM
#DECR DLNUM
#IFGT DLNUM
#ASK What is the CSR address for the next (local) DL11 [O] (176550)?DLC/O=176550,160000,177570
#ASK What is the vector address for the next (local) DL11 [O] (350)?DLV/O=350,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$6 = DL.C ;CSR OF 7TH (LOCAL) DL11 (MULTI-TERM SUPPORT)
DLV$6 = DL.V ;VECTOR OF 7TH (LOCAL) DL11 (MULTI-TERM SUPPORT)
#ENDS
#IFF
#IFGT DLMDM
#ASK What is the CSR address for the next (remote) DL11 [O] (175660)?DLC/O=175660,160000,177570
#ASK What is the vector address for the next (remote) DL11 [O] (350)?DLV/O=350,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$6 = DL.C ;CSR OF 7TH (REMOTE) DL11 (MULTI-TERM SUPPORT)
DLV$6 = DL.V ;VECTOR OF 7TH (REMOTE) DL11 (MULTI-TERM SUPPORT)
#ENDS
#DECR DLMDM
#ENDC DLMDM
#ENDC DLNUM
#DECR DLNUM
#IFGT DLNUM
#ASK What is the CSR address for the next (local) DL11 [O] (176560)?DLC/O=176560,160000,177570
#ASK What is the vector address for the next (local) DL11 [O] (360)?DLV/O=360,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$7 = DL.C ;CSR OF 8TH (LOCAL) DL11 (MULTI-TERM SUPPORT)
DLV$7 = DL.V ;VECTOR OF 8TH (LOCAL) DL11 (MULTI-TERM SUPPORT)
#ENDS
#IFF
#IFGT DLMDM
#ASK What is the CSR address for the next (remote) DL11 [O] (175670)?DLC/O=175670,160000,177570
#ASK What is the vector address for the next (remote) DL11 [O] (360)?DLV/O=360,60,770
#SUBS "DL.C"DLC
#SUBS "DL.V"DLV
DLC$7 = DL.C ;CSR OF 8TH (REMOTE) DL11 (MULTI-TERM SUPPORT)
DLV$7 = DL.V ;VECTOR OF 8TH (REMOTE) DL11 (MULTI-TERM SUPPORT)
#ENDS
#DECR DLMDM
#ENDC DLMDM
#ENDC DLNUM
#IF LONG
#PRINT RT-11 supports one DZ11-A or -B eight line multiplexor
#PRINT with an additional DZ11-C or -D eight line multiplexor
#PRINT for a maximum of 16 lines,or one DZV11 four line
#PRINT multiplexor. Modem support is available on
#PRINT remote lines, but is limited to Bell 103 type modems or
#PRINT equivalent with the "common clear to send and carrier"
#PRINT option installed to operate the modem in an auto-answer mode.
#ENDC LONG
#ASK Do you want DZ11 or DZV11 multiplexor support [Y/N] (N)?DZNEED/Y=N
#IFN DZNEED
DZ11$N = 0 ;NO DZ11 OR DZV11 SUPPORT (MULTI-TERM SUPPORT)
#IFF
#ASK Do you want DZ11 multiplexor support [Y/N] (Y)?DZ11/Y=Y
#IF DZ11
#ASK Do you want support for two DZ11's [Y/N] (N)?DZTWO/Y=N
#IF DZTWO
DZ11$N = 2 ;# OF DZ11 MULTIPLEXORS (MULTI-TERM SUPPORT)
#IFF
DZ11$N = 1 ;# OF DZ11 MULTIPLEXORS (MULTI-TERM SUPPORT)
#ENDC DZTWO
#IFF
#PRINT One DZV11 four line multiplexor assumed.
DZ11$N = 1 ;# OF DZV11 MULTIPLEXORS (MULTI-TERM SUPPORT)
#ENDC DZ11
#IF LONG
#PRINT The lines must be initialized to a specific baud
#PRINT rate. The choices are 300, 150, and 110 baud.
#ENDC LONG
#ASK Do you want the lines initialized to 300 baud [Y/N] (Y)?B300/Y=Y
#IF B300
DZSP$D = 2400 ;INIT TO 300 BAUD (MULTI-TERM SUPPORT)
DZST$P = 0 ;1 STOP UNIT (MULTI-TERM SUPPORT)
#IFF
#ASK Do you want the lines initialized to 150 baud [Y/N] (Y)?B150/Y=Y
#IF B150
DZSP$D = 2000 ;INIT TO 150 BAUD (MULTI-TERM SUPPORT)
DZST$P = 0 ;1 STOP UNIT (MULTI-TERM SUPPORT)
#IFF
DZSP$D = 1000 ;INIT TO 110 BAUD (MULTI-TERM SUPPORT)
DZST$P = 40 ;2 STOP UNITS (MULTI-TERM SUPPORT)
#PRINT 110 baud is assumed.
#ENDC B150
#ENDC B300
#IF LONG
#PRINT The vectors and CSR addresses are assigned to the floating
#PRINT device region and will vary with each installation.
#ENDC LONG
#IFN DZ11
#ASK What is the CSR address for the DZV11 [O] (160010)?DZ1/O=160010,160000,177570
#ASK What is the vector address for the DZV11 [O] (300)?DZV1/O=300,60,770
#SUBS "DZCS1"DZ1
#SUBS "DZVEC1"DZV1
DZVC$0 = DZVEC1 ;VECTOR OF FIRST DZ11 (MULTI-TERM SUPPORT)
DZCS$0 = DZCS1 ;CSR OF FIRST DZ11 (MULTI-TERM SUPPORT)
#ENDS
#IFF
#ASK What is the CSR address for the first DZ11 [O] (160010)?DZ1/O=160010,160000,177570
#ASK What is the vector address for the first DZ11 [O] (300)?DZV1/O=300,60,770
#SUBS "DZCS1"DZ1
#SUBS "DZVEC1"DZV1
DZVC$0 = DZVEC1 ;VECTOR OF FIRST DZ11 (MULTI-TERM SUPPORT)
DZCS$0 = DZCS1 ;CSR OF FIRST DZ11 (MULTI-TERM SUPPORT)
#ENDS
#IF DZTWO
#ASK What is the CSR address for the second DZ11 [O] (160020)?DZ2/O=160020,160000,177570
#ASK What is the vector address of the second DZ11 [O] (310)?DZV2/O=310,60,770
#SUBS "DZCS2"DZ2
#SUBS "DZVEC2"DZV2
DZVC$1 = DZVEC2 ;VECTOR OF SECOND DZ11 (MULTI-TERM SUPPORT)
DZCS$1 = DZCS2 ;CSR OF SECOND DZ11 (MULTI-TERM SUPPORT)
#ENDS
#ENDC DZTWO
#ENDC DZ11
#IF LONG
#PRINT The following dialogue will ask for the number of local
#PRINT DZ11 or DZV11 lines, then the number of remote lines.
#PRINT The total number of lines is the sum of local and remote
#PRINT lines. Physical unit numbers of the DZ11 or DZV11 lines
#PRINT are assigned first to local lines and then to remote
#PRINT lines. This assignment is permanent and its order cannot
#PRINT be changed.
#ENDC LONG
#IF DZ11
#ASK How many DZ11 lines are local terminals [D] (0)?DZLCL/D=0,0,16
#ASK How many remote DZ11 lines [D] (0)?DZM/D=0,0,16
#IFF
#ASK How many DZV11 lines are local terminals [D] (0)?DZLCL/D=0,0,4
#ASK How many remote DZV11 lines [D] (0)?DZM/D=0,0,4
#ENDC DZ11
#SUBS "DZL$"DZLCL
DZ11$L = DZL$. ;# OF LOCAL DZ11 LINES (MULTI-TERM SUPPORT)
#ENDS
#SUBS "DZM$"DZM
DZ11$M = DZM$. ;# OF REMOTE DZ11 LINES (MULTI-TERM SUPPORT)
#ENDS
#IFGT DZM
#IFN TIME
TIM$IT = 1 ;GENERAL DEVICE TIME OUT (MULTI-TERM SUPPORT)
#SET TIME=Y
#ENDC TIME
#ENDC DZM
#ENDC DZNEED
#IF LONG
#PRINT The terminal service requires a set of input and output
#PRINT ring buffers for each terminal supported. The output ring
#PRINT buffer default size is 40 characters. The input ring size
#PRINT depends on terminal width and amount of type-ahead
#PRINT expected. The default size is 82 characters.
#ENDC LONG
#ASK Size of the output buffers in characters [D] (40)?ORNG/D=40,10,132
#ASK Size of the input buffers in characters [D] (82)?IRNG/D=82,74,132
#SUBS "O.R"ORNG
#SUBS "I.R"IRNG
TTYOUT = O.R. ;SIZE OF OUTPUT RING BUFFERS(MULTI-TERM SUPPORT)
TTYIN = I.R. ;SIZE OF INPUT RING BUFFERS (MULTI-TERM SUPPORT)
#ENDS
#IF LONG
#PRINT Terminal status may be obtained by doing an .MTGET request
#PRINT but some applications require asynchronous notification of
#PRINT changes in terminal status. RT-11 supports asynchronous
#PRINT terminal status as an option to the .MTATCH
#PRINT request and provides information on buffer and modem
#PRINT status as well as double CTRL/C.
#ENDC LONG
#ASK Do you want asynchronous terminal status [Y/N] (Y)?MATS/Y=Y
#IF MATS
MAT$S = 1 ;ASYNCHRONOUS TERMINAL STATUS (MULTI-TERM SUPPORT)
#ENDC MATS
#IF LONG
#PRINT Time-out support will cause the monitor to reset at regular
#PRINT intervals any terminal that may have gone off-line. This
#PRINT helps to minimize the impact of static (and similar)
#PRINT problems, and is recommended if maximum availability
#PRINT is important to the application.
#ENDC LONG
#ASK Do you want multi-terminal time-out support [Y/N] (Y)?MTTO/Y=Y
#IF MTTO
MTI$M = 1 ;TERMINAL TIME OUT (MULTI-TERM SUPPORT)
#IFN TIME
TIM$IT = 1 ;GENERAL DEVICE TIME OUT (MULTI-TERM SUPPORT)
#SET TIME=N
#ENDC TIME
#ENDC MTTO
#ENDC MTTY
#CALL SYSTBL.CND
#NAME SYSBLD
#FILE SYSBLD.COM
@MONBLD
@DEVBLD
#NAME MONBLD
#FILE MONBLD.COM
! MONBLD.COM
!
#IF LONG
#PRINT The SYSGEN assembling and linking process requires a
#PRINT source input and a binary output device, as well as an
#PRINT output device for monitor link maps. You must specify
#PRINT the physical name and unit number for each (for example,
#PRINT RK1, DP4, etc.). For more explanation, see
#PRINT Section 3.6.1 of the RT-11 System Generation Manual.
#ENDC LONG
#PRINT What is the PHYSICAL name and unit of the
#ASK - source input device [DDU] (RK1)?IN/A=RK1
#SUBS "IN$"IN
ASS IN$ SRC
#PRINT What is the PHYSICAL name and unit of the
#ASK - binary output device [DDU] (RK0)?OUT/A=RK0
#SUBS "OUT$"OUT
ASS OUT$ BIN
#PRINT What is the PHYSICAL name and unit of the
#ASK - map output device [DDU] (TT)?MAP/A=TT
#SUBS "MAP$"MAP
ASS MAP$ MAP
#ENDS
#IF BLSJ
MACRO/OBJ:BIN:KMBL SRC:(SJ+SYCND+EDTGBL+KMON+KMOVLY)
MACRO/OBJ:BIN:RMBL SRC:(SJ+SYCND+EDTGBL+USR+RMONSJ)
#SUBS "S$D."SYSDV
MACRO/OBJ:BIN:SYBL SRC:(SJ+SYCND+SYSDEV+S$D.)
#ENDS
MACRO/OBJ:BIN:TBBL SRC:(SJ+SYCND+SYSTBL)
MACRO/OBJ:BIN:BTBL SRC:(SJ+SYCND+BSTRAP)
#SUBS "S$D."SYSDV
LINK/EXE:BIN:S$D.MNSJ.BLG/BOU:1000/MAP:MAP:S$D.MNSJ
BIN:(BT,RM,KM,TB,SY)BL
#ENDS
OVLY0
#IFN OBJ
DELETE/NOQ BIN:(BT,RM,KM,TB,SY)BL.OBJ
#ENDC OBJ
#ENDC BLSJ
#IF SJ
MACRO/OBJ:BIN:KMSJ SRC:(SJ+SYCND+EDTGBL+KMON+KMOVLY)
MACRO/OBJ:BIN:RMSJ SRC:(SJ+SYCND+EDTGBL+USR+RMONSJ)
#SUBS "S$D."SYSDV
MACRO/OBJ:BIN:SYSJ SRC:(SJ+SYCND+SYSDEV+S$D.)
#ENDS
MACRO/OBJ:BIN:TBSJ SRC:(SJ+SYCND+SYSTBL)
MACRO/OBJ:BIN:BTSJ SRC:(SJ+SYCND+BSTRAP)
#SUBS "S$D."SYSDV
LINK/EXE:BIN:S$D.MNSJ.SYG/BOU:1000/MAP:MAP:S$D.MNSJ
BIN:(BT,RM,KM,TB,SY)SJ
#ENDS
OVLY0
#IFN OBJ
DELETE/NOQ BIN:(BT,RM,KM,TB,SY)SJ.OBJ
#ENDC OBJ
#ENDC SJ
#IF FB
MACRO/OBJ:BIN:KMFB SRC:(FB+SYCND+EDTGBL+KMON+KMOVLY)
MACRO/OBJ:BIN:RMFB SRC:(FB+SYCND+EDTGBL+USR+RMONFB)
#SUBS "S$D."SYSDV
MACRO/OBJ:BIN:SYFB SRC:(FB+SYCND+SYSDEV+S$D.)
#ENDS
MACRO/OBJ:BIN:TBFB SRC:(FB+SYCND+SYSTBL)
MACRO/OBJ:BIN:BTFB SRC:(FB+SYCND+BSTRAP)
#IF MTTY
MACRO/OBJ:BIN:MEFB SRC:(FB+SYCND+MTTEMT)
MACRO/OBJ:BIN:MIFB SRC:(FB+SYCND+MTTINT)
#SUBS "S$D."SYSDV
LINK/EXE:BIN:S$D.MNFB.SYG/BOU:1000/PROMPT/MAP:MAP:S$D.MNFB BIN:BTFB
BIN:RMFB,KMFB,MEFB,MIFB,TBFB,SYFB//
#ENDS
OVLY0
#IFN OBJ
DELETE/NOQ BIN:(BT,RM,ME,MI,TB,SY)FB.OBJ
DELETE/NOQ BIN:KMFB.OBJ
#ENDC OBJ
#IFF
#SUBS "S$D."SYSDV
LINK/EXE:BIN:S$D.MNFB.SYG/BOU:1000/MAP:MAP:S$D.MNFB
BIN:(BT,RM,KM,TB,SY)FB
#ENDS
OVLY0
#IFN OBJ
DELETE/NOQ BIN:(BT,RM,KM,TB,SY)FB.OBJ
#ENDC OBJ
#ENDC MTTY
#ENDC FB
#IF XM
MACRO/OBJ:BIN:KMXM SRC:(XM+SYCND+EDTGBL+KMON+KMOVLY)
MACRO/OBJ:BIN:RMXM SRC:(XM+SYCND+EDTGBL+USR+RMONFB)
#SUBS "S$D."SYSDV
MACRO/OBJ:BIN:SYXM SRC:(XM+SYCND+SYSDEV+S$D.)
#ENDS
MACRO/OBJ:BIN:TBXM SRC:(XM+SYCND+SYSTBL)
MACRO/OBJ:BIN:BTXM SRC:(XM+SYCND+BSTRAP)
#IF MTTY
MACRO/OBJ:BIN:MEXM SRC:(XM+SYCND+MTTEMT)
MACRO/OBJ:BIN:MIXM SRC:(XM+SYCND+MTTINT)
#SUBS "S$D."SYSDV
LINK/EXE:BIN:S$D.MNXM.SYG/BOU:1000/PROMPT/MAP:MAP:S$D.MNXM BIN:BTXM
BIN:RMXM,KMXM,MEXM,MIXM,TBXM,SYXM//
#ENDS
OVLY0
#IFN OBJ
DELETE/NOQ BIN:(BT,RM,ME,MI,TB,SY)XM.OBJ
DELETE/NOQ BIN:KMXM.OBJ
#ENDC OBJ
#IFF
#SUBS "S$D."SYSDV
LINK/EXE:BIN:S$D.MNXM.SYG/BOU:1000/MAP:MAP:S$D.MNXM
BIN:(BT,RM,KM,TB,SY)XM
#ENDS
OVLY0
#IFN OBJ
DELETE/NOQ BIN:(BT,RM,KM,TB,SY)XM.OBJ
#ENDC OBJ
#ENDC MTTY
#ENDC XM
#NAME DEVBLD
#FILE DEVBLD.COM
! DEVBLD.COM
!
#SUBS "IN$"IN
ASS IN$ SRC
#SUBS "OUT$"OUT
ASS OUT$ BIN
#ENDS
#IF SJ
MACRO/OBJ:BIN:TT SRC:(SYCND+TT)
LINK/EXE:BIN:TT.SYG BIN:TT
#IFN OBJ
DELETE/NOQ BIN:TT.OBJ
#ENDC OBJ
#ENDC SJ
#IF BLSJ
MACRO/OBJ:BIN:TT SRC:(SYCND+TT)
LINK/EXE:BIN:TT.SYG BIN:TT
#IFN OBJ
DELETE/NOQ BIN:TT.OBJ
#ENDC OBJ
#ENDC BLSJ
#IF ERL$G
#IF BLSJFB
MACRO/OBJ:BIN:EL SRC:(SYCND+EL)
LINK/EXE:BIN:EL.SYG BIN:EL
#IFN OBJ
DELETE/NOQ BIN:EL.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:ELX SRC:(XM+SYCND+EL)
LINK/EXE:BIN:ELX.SYG BIN:ELX
#IFN OBJ
DELETE/NOQ BIN:ELX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC ERL$G
#IF BATC$H
#IF BLSJFB
MACRO/OBJ:BIN:BA SRC:(SYCND+BA)
LINK/EXE:BIN:BA.SYG BIN:BA
#IFN OBJ
DELETE/NOQ BIN:BA.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:BAX SRC:(XM+SYCND+BA)
LINK/EXE:BIN:BAX.SYG BIN:BAX
#IFN OBJ
DELETE/NOQ BIN:BAX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC BATC$H
#IF LP
#IF BLSJFB
MACRO/OBJ:BIN:LP SRC:(SYCND+LP)
LINK/EXE:BIN:LP.SYG BIN:LP
#IFN OBJ
DELETE/NOQ BIN:LP.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:LPX SRC:(XM+SYCND+LP)
LINK/EXE:BIN:LPX.SYG BIN:LPX
#IFN OBJ
DELETE/NOQ BIN:LPX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC LP
#IF RK
#IF BLSJFB
MACRO/OBJ:BIN:RK SRC:(SYCND+RK)
LINK/EXE:BIN:RK.SYG BIN:RK
#IFN OBJ
DELETE/NOQ BIN:RK.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:RKX SRC:(XM+SYCND+RK)
LINK/EXE:BIN:RKX.SYG BIN:RKX
#IFN OBJ
DELETE/NOQ BIN:RKX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC RK
#IF DL
#IF BLSJFB
MACRO/OBJ:BIN:DL SRC:(SYCND+DL)
LINK/EXE:BIN:DL.SYG BIN:DL
#IFN OBJ
DELETE/NOQ BIN:DL.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:DLX SRC:(XM+SYCND+DL)
LINK/EXE:BIN:DLX.SYG BIN:DLX
#IFN OBJ
DELETE/NOQ BIN:DLX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC DL
#IF DT
#IF BLSJFB
MACRO/OBJ:BIN:DT SRC:(SYCND+DT)
LINK/EXE:BIN:DT.SYG BIN:DT
#IFN OBJ
DELETE/NOQ BIN:DT.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:DTX SRC:(XM+SYCND+DT)
LINK/EXE:BIN:DTX.SYG BIN:DTX
#IFN OBJ
DELETE/NOQ BIN:DTX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC DT
#IF DS
#IF BLSJFB
MACRO/OBJ:BIN:DS SRC:(SYCND+DS)
LINK/EXE:BIN:DS.SYG BIN:DS
#IFN OBJ
DELETE/NOQ BIN:DS.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:DSX SRC:(XM+SYCND+DS)
LINK/EXE:BIN:DSX.SYG BIN:DSX
#IFN OBJ
DELETE/NOQ BIN:DSX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC DS
#IF PC
#IF BLSJFB
MACRO/OBJ:BIN:PC SRC:(SYCND+PC)
LINK/EXE:BIN:PC.SYG BIN:PC
#IFN OBJ
DELETE/NOQ BIN:PC.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:PCX SRC:(XM+SYCND+PC)
LINK/EXE:BIN:PCX.SYG BIN:PCX
#IFN OBJ
DELETE/NOQ BIN:PCX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC PC
#IF PR
#IF BLSJFB
MACRO/OBJ:BIN:PC SRC:(SYCND+PC)
LINK/EXE:BIN:PC.SYG BIN:PC
#IFN OBJ
DELETE/NOQ BIN:PC.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:PCX SRC:(XM+SYCND+PC)
LINK/EXE:BIN:PCX.SYG BIN:PCX
#IFN OBJ
DELETE/NOQ BIN:PCX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC PR
#IF DM
#IF BLSJFB
MACRO/OBJ:BIN:DM SRC:(SYCND+DM)
LINK/EXE:BIN:DM.SYG BIN:DM
#IFN OBJ
DELETE/NOQ BIN:DM.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:DMX SRC:(XM+SYCND+DM)
LINK/EXE:BIN:DMX.SYG BIN:DMX
#IFN OBJ
DELETE/NOQ BIN:DMX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC DM
#IF DX
#IF BLSJFB
MACRO/OBJ:BIN:DX SRC:(SYCND+DX)
LINK/EXE:BIN:DX.SYG BIN:DX
#IFN OBJ
DELETE/NOQ BIN:DX.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:DXX SRC:(XM+SYCND+DX)
LINK/EXE:BIN:DXX.SYG BIN:DXX
#IFN OBJ
DELETE/NOQ BIN:DXX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC DX
#IF DY
#IF BLSJFB
MACRO/OBJ:BIN:DY SRC:(SYCND+DY)
LINK/EXE:BIN:DY.SYG BIN:DY
#IFN OBJ
DELETE/NOQ BIN:DY.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:DYX SRC:(XM+SYCND+DY)
LINK/EXE:BIN:DYX.SYG BIN:DYX
#IFN OBJ
DELETE/NOQ BIN:DYX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC DY
#IF CR
#IF BLSJFB
MACRO/OBJ:BIN:CR SRC:(SYCND+CR)
LINK/EXE:BIN:CR.SYG BIN:CR
#IFN OBJ
DELETE/NOQ BIN:CR.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:CRX SRC:(XM+SYCND+CR)
LINK/EXE:BIN:CRX.SYG BIN:CRX
#IFN OBJ
DELETE/NOQ BIN:CRX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC CR
#IF NULL
#IF BLSJFB
MACRO/OBJ:BIN:NL SRC:(SYCND+NL)
LINK/EXE:BIN:NL.SYG BIN:NL
#IFN OBJ
DELETE/NOQ BIN:NL.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:NLX SRC:(XM+SYCND+NL)
LINK/EXE:BIN:NLX.SYG BIN:NLX
#IFN OBJ
DELETE/NOQ BIN:NLX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC NULL
#IF DP
#IF BLSJFB
MACRO/OBJ:BIN:DP SRC:(SYCND+DP)
LINK/EXE:BIN:DP.SYG BIN:DP
#IFN OBJ
DELETE/NOQ BIN:DP.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:DPX SRC:(XM+SYCND+DP)
LINK/EXE:BIN:DPX.SYG BIN:DPX
#IFN OBJ
DELETE/NOQ BIN:DPX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC DP
#IF CT
#IF BLSJFB
MACRO/OBJ:BIN:CT SRC:(SYCND+CT)
LINK/EXE:BIN:CT.SYG BIN:CT
#IFN OBJ
DELETE/NOQ BIN:CT.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:CTX SRC:(XM+SYCND+CT)
LINK/EXE:BIN:CTX.SYG BIN:CTX
#IFN OBJ
DELETE/NOQ BIN:CTX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC CT
#IF RF
#IF BLSJFB
MACRO/OBJ:BIN:RF SRC:(SYCND+RF)
LINK/EXE:BIN:RF.SYG BIN:RF
#IFN OBJ
DELETE/NOQ BIN:RF.OBJ
#ENDC OBJ
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:RFX SRC:(XM+SYCND+RF)
LINK/EXE:BIN:RFX.SYG BIN:RFX
#IFN OBJ
DELETE/NOQ BIN:RFX.OBJ
#ENDC OBJ
#ENDC XM
#ENDC RF
#IF MTSP
#IF TM
#IF BLSJFB
MACRO/OBJ:BIN:MT SRC:(SYCND+TM)
#IF MTF
MACRO/OBJ:BIN:FSM SRC:(SYCND+FSM)
LINK/EXE:BIN:MT.SYG BIN:(MT,FSM)
#IFN OBJ
DELETE/NOQ BIN:(FSM.OBJ,MT.OBJ)
#ENDC 0BJ
#IFF
LINK/EXE:BIN:MTHD.SYG BIN:MT
#IFN OBJ
DELETE/NOQ BIN:MT.OBJ
#ENDC OBJ
#ENDC MTF
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:MTX SRC:(XM+SYCND+TM)
#IF MTF
MACRO/OBJ:BIN:FSMX SRC:(XM+SYCND+FSM)
LINK/EXE:BIN:MTX.SYG BIN:(MTX,FSMX)
#IFN OBJ
DELETE/NOQ BIN:(FSMX.OBJ,MTX.OBJ)
#ENDC 0BJ
#IFF
LINK/EXE:BIN:MTHDX.SYG BIN:MTX
#IFN OBJ
DELETE/NOQ BIN:MTX.OBJ
#ENDC OBJ
#ENDC MTF
#ENDC XM
#ENDC TM
#IF TJU
#IF BLSJFB
MACRO/OBJ:BIN:MM SRC:(SYCND+TJ)
#IF MTF
MACRO/OBJ:BIN:FSM SRC:(SYCND+FSM)
LINK/EXE:BIN:MM.SYG BIN:(MM,FSM)
#IFN OBJ
DELETE/NOQ BIN:(FSM.OBJ,MM.OBJ)
#ENDC 0BJ
#IFF
LINK/EXE:BIN:MMHD.SYG BIN:MM
#IFN OBJ
DELETE/NOQ BIN:MM.OBJ
#ENDC OBJ
#ENDC MTF
#ENDC BLSJFB
#IF XM
MACRO/OBJ:BIN:MMX SRC:(XM+SYCND+TJ)
#IF MTF
MACRO/OBJ:BIN:FSMX SRC:(XM+SYCND+FSM)
LINK/EXE:BIN:MMX.SYG BIN:(MMX,FSMX)
#IFN OBJ
DELETE/NOQ BIN:(FSMX.OBJ,MMX.OBJ)
#ENDC 0BJ
#IFF
LINK/EXE:BIN:MMHDX.SYG BIN:MMX
#IFN OBJ
DELETE/NOQ BIN:MMX.OBJ
#ENDC OBJ
#ENDC MTF
#ENDC XM
#ENDC TJU
#ENDC MTSP
#IF LONG
#PRINT To build an entire system, mount the source and
#PRINT binary disks, copy the files SYCND.MAC and SYSTBL.MAC
#PRINT to the source disk, and type "@SYSBLD". To build just the monitors,
#PRINT type "@MONBLD". To build just the device handlers, type
#PRINT "@DEVBLD". For more information, read Section 3.6 of the
#PRINT RT-11 System Generation Manual.
#ENDC LONG
#PRINT END OF SYSGEN PROGRAM--Don't forget to copy DK:SYCND.MAC and
#PRINT DK:SYSTBL.MAC to the source disk before executing the
#PRINT command file(s). Remember that SWAP.SYS must
#PRINT be on all bootable volumes.
И дедушка IND.SAV
Код:C SYSGEN.FOR V02-07
C
C COPYRIGHT (C) 1977,1978
C DIGITAL EQUIPMENT CORPORATION
C
C THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
C ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
C INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
C COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO
C ANY OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS
C HEREBY TRANSFERRED.
C
C THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
C AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
C CORPORATION.
C
C DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
C SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
C
C R. BEAN 23-JAN-78 9:17
C MODELLED AFTER A PROGRAM BY HANK MAURER
C
C
C
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C INITIALIZE THE VARIOUS DATA AND CONSTANT ARRAYS
C
DATA LEVEL,NXTVAR,NUMSUB/1,1,0/
DATA ANSWER,VAR,VALUE/1000*0,600*0,100*0./
DATA IN,OUT,INS,LNLENG/1,2,3,1/
C CHANGE FOLLOWING TO CHANGE SCRIPT FILE NAME.
DATA FILE/'S','Y','S','G','E','N','.','C','N','D',0,0/
DATA CMDS/
1 'A','S','K',0,0,0,
1 'C','A','L','L',0,0,
1 'D','E','C','R',0,0,
1 'E','N','D','C',0,0,
1 'E','N','D','S',0,0,
1 'E','X','I','T',0,0,
1 'F','I','L','E',0,0,
1 'I','F',0,0,0,0,
1 'I','F','F',0,0,0,
1 'I','F','G','T',0,0,
1 'I','F','N',0,0,0,
1 'I','F','T',0,0,0,
1 'I','F','T','F',0,0,
1 'N','A','M','E',0,0,
1 'P','R','I','N','T',0,
1 'S','E','T',0,0,0,
1 'S','U','B','S',0,0/
DATA SUBNAM/'*','N','O','N','E','*'/
DATA INSERT,FIRST/.FALSE.,.TRUE./
DATA INCLUD/.TRUE.,10*0/
DATA COND/.TRUE.,10*0/
C
C INITIALIZE OPERATING VARIABLES
C
VARLEN=6 !NUMBER OF CHARACTERS IN VARIABLES
NUMVAR=100 !NUMBER OF VARIABLES
C
C OPEN THE SCRIPT FILE
C
CALL ASSIGN(IN,FILE)
C
C MAIN COMMAND LOOP
C AFTER PRESERVING PREVIOUS LINE IN LASTLN,
C IF NOT INSERTING FROM SECONDARY SCRIPT FILE,
C READ LINE FROM PRIMARY SCRIPT FILE
C
100 DO 105 I=1,LNLENG
105 LASTLN(I)=LINE(I) !PRESERVE PREVIOUS COMMAND LINE
LSTLEN=LNLENG !REMEMBER LENGTH OF PREV LINE
C
C NOW READ FROM PRIMARY SCRIPT
C
IF(.NOT.INSERT)
1 READ(IN,80000,END=90000,ERR=91000)LNLENG,(LINE(I),I=1,LNLENG)
C
C OTHERWISE READ FROM SECONDARY SCRIPT FILE
C
IF(INSERT)READ(INS,80000,END=90010,ERR=91010)LNLENG,(LINE(I),I=1,LNLENG)
C
C IF COMMENT LINE, IGNORE IT
C
IF(LINE(1).EQ.';')GOTO 100
C
C IF LINE BEGINS WITH A FORM FEED, IGNORE THE FORM FEED
C
IF(LINE(1).NE."14)GOTO 200
DO 110 I=2,LNLENG
110 LINE(I-1)=LINE(I) !SLIDE CHARS UP, OVER FORMF
LNLENG=LNLENG-1
C
C IF SUBSTITUTION NOT ENABLED, PROCEED TO COMMAND DISPATCH
C
200 IF(NUMSUB.EQ.0)GOTO 350
C
C SUBSTITUTION LOOP
C PERFORM SUBSTITUTIONS BEFORE PROCESSING LINE
C
DO 300 I=1,NUMSUB
II=1
C
C IF LINE SCAN FINISHED, PROCEED TO NEXT I
C
210 IF(II+PATLEN(I)-1.GT.LNLENG)GOTO 300
C
C SCAN LINE FOR A PATTERN MATCH
C
DO 220 J=1,PATLEN(I)
III=II+J-1
IF(LINE(III).NE.PATERN(I,J))GOTO 280
220 CONTINUE
K=PATLEN(I)-REPLEN(I) !K=LENGTH DIFF BETWEEN PATERN AND REPLACEMENT
C
C DETERMINE IF THERE IS ENOUGH ROOM IN LINE FOR REPLACEMENT
C
IF(K)230,240,250
C
C IF REPLACEMENT LARGER THAN PATTERN, SLIDE LINE RIGHT TO MAKE ROOM
C
230 DO 235 J=1,LNLENG-III
235 LINE(LNLENG-K+1-J)=LINE(LNLENG+1-J)
240 IF(REPLEN(I).LE.0)GOTO 248 !IF REPLACEMENT NULL, JUST COLLAPSE LINE
C
C OTHERWISE REPLACE PATTERN WITH REPLACEMENT
C
DO 245 J=1,REPLEN(I)
245 LINE(II+J-1)=REPLAC(I,J)
248 LNLENG=LNLENG-K !SHORTEN LINE LENGTH BY PATTERN/REPLACEMENT DIFFERENCE
II=II+REPLEN(I)
GOTO 290
C
C COLLAPSE LINE TO MAKE PATTERN LENGTH=REPLACEMENT LENGTH
C
250 DO 255 J=III+1,LNLENG
255 LINE(J-K)=LINE(J)
GOTO 240 !NOW REPLACE PATTERN
280 II=II+1 !START ONE CHAR TO RIGHT
290 IF(II.LE.LNLENG)GOTO 210 !AND LOOP
300 CONTINUE
350 LINE(LNLENG+1)=0 !MAKE SURE LINE STRING ZERO-TERMINATED
C
C COMMAND DISPATCHER
C IF LINE DOES NOT BEGIN WITH A <TAB>#, WRITE IT TO OUTPUT FILE
C
IF(LINE(1).NE."11.OR.LINE(2).NE.'#')GOTO 450 !"11 IS A TAB
C
C FIND THE COMMAND
C
DO 410 I=1,17
DO 400 J=1,6
IF(CMDS(J,I).EQ.0.AND.(LINE(J+2).EQ.0.OR.LINE(J+2).EQ."11)) !"11 IS A TAB
1 GOTO 500 !COMMAND FOUND - CALL COMMAND SUBROUTINE
IF(LINE(J+2).NE.CMDS(J,I))GOTO 410
400 CONTINUE
410 CONTINUE
C
C COMMAND NOT FOUND - PRINT ERROR MESSAGE
C
CALL EPRINT(6) !SYSGEN-F-UNDEFINED COMMAND
GOTO 100
C
C LINE NOT A COMMAND LINE - WRITE IT TO OUTPUT FILE
C
450 IF(INCLUD(LEVEL))WRITE(OUT,80010,END=90020,ERR=90020)(LINE(I),I=1,LNLENG)
GOTO 100
C
C COMMAND SUBROUTINE CALLS
C
500 GOTO(501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517)I
501 CALL ASK
GOTO 100
502 CALL CALLF
GOTO 100
503 CALL DECR
GOTO 100
504 CALL ENDC
GOTO 100
505 CALL ENDS
GOTO 100
506 CALL EXITS
GOTO 100
507 CALL FILES
GOTO 100
508 CALL IF0
GOTO 100
509 CALL IFF
GOTO 100
510 CALL IFGT
GOTO 100
511 CALL IFN
GOTO 100
512 CALL IFT
GOTO 100
513 CALL IFTF
GOTO 100
514 CALL NAME
GOTO 100
515 CALL PRINT0
GOTO 100
516 CALL SET
GOTO 100
517 CALL SUB
GOTO 100
C
C FORMAT STATEMENTS FOR COMMAND ROTUINE
C
80000 FORMAT(Q,100A1) !FOR SCRIPT READS
80010 FORMAT(100A1) !FOR OUTPUT WRITES
C
C ERROR PROCESSING ROUTINES FOR I/O STATEMENTS
C
90000 CALL CLOSE(IN) !EOF FOR PRIMARY INPUT FILE
IF(.NOT.FIRST)CALL CLOSE(OUT)
GOTO 99000
90010 INSERT=.FALSE. !EOF FOR SECONDARY INPUT FILE
CALL CLOSE(INS)
GOTO 100
90020 CALL EPRINT(17) !?SYSGEN-F-OUTPUT ERROR
GOTO 99000
91000 CALL EPRINT(18) !?SYSGEN-F-INPUT ERROR
GOTO 99000
91010 CALL EPRINT(16) !?SYSGEN-F-INSERT ERROR
99000 CALL EXIT
END
SUBROUTINE ASK
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLACE,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
LOGICAL*1 HIVAL(10),LOWVAL(10),ALINE(80),YES(4),NO(3)
REAL RTMP1
DATA YES/'Y','E','S',0/,NO/'N','O',0/
C
C ROUTINE TO PROCESS ASK COMMAND
C <TAB>#ASK<TAB>QUESTION?VARIABLE/T=DEF[,LOWLIM[,HILIM]]
C
IF(.NOT.INCLUD(LEVEL))GOTO 1000 !IF CONDITIONAL OFF, DON'T DO
C
C FIND QUESTION MARK AT END OF QUESTION
C
5 DO 10 LPTR=7,LNLENG
IF (LINE(LPTR).EQ.'?')GOTO 20
10 CONTINUE
15 CALL EPRINT(5) !?SYSTEN-F-BAD #ASK IN
GOTO 1000
C
C TYPE THE QUESTION ON THE TERMINAL
C
20 I=7 !QUESTION STARTS IN CHAR POSITION 7
IF(LINE(I).EQ.'-')I=I+1 !SKIP OVER CONTINUATION MARK IF PRESENT
WRITE(5,80000)(LINE(J),J=I,LPTR),"40 !"40 IS A SPACE
IF(LNLENG.EQ.LPTR)GOTO 15 !IF NO VARIABLE SPECIFIED
C
C FIND THE VARIABLE INDEX
C
LPTR=LPTR+1 !SPACE LPTR PAST ?
CALL FNDVAR(0) !SETS VIDX FOR VARIABLE, MOVES LPTR TO CHAR FOLLOWING
IF(CARRY.EQ.1)GOTO 1000
VALUE(VIDX)=0 !SET VALUE TO 0
C
C ENSURE ANSWER TYPE SPECIFIED
C
IF(LINE(LPTR).NE.'/')GOTO 15
LPTR=LPTR+1 !ADVANCE PAST "/"
C
C SET FLAG DEPENDING ON ANSWER TYPE
C
ATYPE=0
IF(LINE(LPTR).EQ.'A')ATYPE=1 !DEVICE NAME ANSWER
IF(LINE(LPTR).EQ.'O')ATYPE=2 !OCTAL ANSWER
IF(LINE(LPTR).EQ.'D')ATYPE=3 !DECIMAL ANSWER
IF(LINE(LPTR).EQ.'Y')ATYPE=4 !YES/NO ANSWER
IF(ATYPE.EQ.0)GOTO 15 !ILLEGAL TYPE CODE
LPTR=LPTR+1 !ADVANCE PAST TYPE CODE
C
C ENSURE DEFAULT PRESENT
C
IF(LINE(LPTR).NE.'=')GOTO 15
LPTR=LPTR+1 !ADVANCE PAST "="
IF(LINE(LPTR).EQ.0)GOTO 15 !NOTHING FOLLOWING "=" IS AN ERROR
C
C COPY THE DEFAULT INTO ANSWER
C
II=1
DO 30 K=LPTR,LNLENG
IF(LINE(K).EQ.',')GOTO 35
IF(II.GT.9)GOTO 15 !DEFAULT TOO LONG
ANSWER(VIDX,II)=LINE(K)
30 II=II+1
C
C PARSE LOW LIMIT
C
35 LPTR=K
LVCNT=0
IF(LINE(LPTR).EQ.0)GOTO 100 !NO RANGE VALUES
LPTR=LPTR+1 !STEP PAST COMMA
IF(LINE(LPTR).EQ.',')GOTO 15 !NO LO VALUE IS AN ERROR
DO 40 K=LPTR,LNLENG !COPY LOWVAL
IF(LINE(K).EQ.',')GOTO 45
IF(LVCNT.GT.9)GOTO 15
LVCNT=LVCNT+1
LOWVAL(LVCNT)=LINE(K)
40 CONTINUE
C
C PARSE HI LIMIT
C
45 HVCNT=0
LPTR=LPTR+LVCNT
IF(LINE(LPTR).EQ.0)GOTO 100 !NO HIGH VALUE
LPTR=LPTR+1 !STEP PAST COMMA
C
C COPY HIGH LIMIT TO HIVAL
C
DO 50 K=LPTR,LNLENG
IF(HVCNT.GT.9)GOTO 15
HVCNT=HVCNT+1
HIVAL(HVCNT)=LINE(K)
50 CONTINUE
C
C GET USER'S ANSWER
C
100 READ(5,80010)ALLENG,(ALINE(K),K=1,ALLENG)
ALINE(ALLENG+1)=0 !MAKE SURE ANSWER STRING 0 TERMINATED
C
C IF NO RESPONSE, USE DEFAULT
C
IF(ALLENG.EQ.0)GOTO 1000
IF(ALLENG.GT.9)GOTO 400 !ANSWER TOO LONG
C
C CHECK ANSWER FOR TYPE VALIDITY
C
GOTO(200,250,300,350)ATYPE
C
C ROUTINE TO CHECK ANSWER FOR ALPHA DEV NAME
C
200 IF(ALLENG.GT.3)GOTO 400 !ANSWER TOO LONG FOR DEV NAME
DO 210,I=1,2
IF(ALINE(I).LT.'A')GOTO 400
210 IF(ALINE(I).GT.'Z')GOTO 400
IF(ALINE(3).EQ.0)GOTO 500
IF(ALINE(3).LT.'0')GOTO 400
IF(ALINE(3).GT.'7')GOTO 400
GOTO 500
C
C ROUTINE TO CHECK ANSWER FOR OCTAL VALUE
C
250 DO 260 I=1,9
IF (ALINE(I).EQ.0)GOTO 450
IF(ALINE(I).LT.'0')GOTO 400
260 IF(ALINE(I).GT.'7')GOTO 400
GOTO 450
C
C ROUTINE TO CHECK ANSWER FOR DECIMAL VALUE
C
300 DO 310 I=1,9
IF (ALINE(I).EQ.0)GOTO 450
IF(ALINE(I).LT.'0')GOTO 400
310 IF(ALINE(I).GT.'9')GOTO 400
GOTO 450
C
C ROUTINE TO CHECK ANSWER FOR YES/NO
C
350 DO 355 I=1,ALLENG !TEST FOR N OR NO ANSWER
355 IF(ALINE(I).NE.NO(I))GOTO 360
GOTO 500 !ANSWER WAS A VALID NO
360 DO 365 I=1,ALLENG !TEST FOR Y OR YE OR YES ANSWER
365 IF(ALINE(I).NE.YES(I))GOTO 400
GOTO 500 !ANSWER WAS A VALID YES
C
C VALIDITY CHECK FAILED - TYPE ERROR MESSAGE
C AND RETRY
C
400 CALL EPRINT(1) !SYSGEN-F-INVALID ANSWER;RETRY
410 IF(LINE(7).NE.'-')GOTO 5 !IF NOT 2 LINE ASK,JUST REPROCESS COMMAND
WRITE(5,80030)(LASTLN(J),J=9,LSTLEN) !2 LINE ASK-ASSUME PREVIOUS LINE
C !WAS A #PRINT AND REPRINT IT
GOTO 5 !RESTART QUESTION
C
C ROUTINE TO CHECK IF OCTAL OR DECIMAL ANSWER FALLS IN RANGE
C AND STORE VALUE FOR VARIABLE
C
450 IF(LVCNT.EQ.0)GOTO 500 !NO LIMITS AVAILABLE
DECODE(LVCNT,80020,LOWVAL)RTMP1 !LOW VALUE TO TEMPORARY
DECODE(ALLENG,80020,ALINE)VALUE(VIDX) !ANSWER VALUE
IF(VALUE(VIDX)-RTMP1)455,460,460 !ANSWER - LOW LIMIT
455 CALL EPRINT(2) !SYSGEN-F-ANSWER TOO SMALL
GOTO 410 !RESTART QUESTION
460 IF(HVCNT.EQ.0)GOTO 500 !NO HILIMIT AVAL
DECODE(HVCNT,80020,HIVAL)RTMP1 !HI VALUE CONVERSION
IF(VALUE(VIDX)-RTMP1)500,500,465 !ANSWER - HI LIMIT
465 CALL EPRINT(3) !SYSGEN-F-ANSWER TOO LARGE
GOTO 410 !RETRY
C
C ANSWER IS ACCEPTABLE - STORE IT FOR VARIABLE
C
500 DO 510 K=1,ALLENG
510 ANSWER(VIDX,K)=ALINE(K)
ANSWER(VIDX,K+1)=0
C
C ROUTINE FINISHED - RETURN
C
1000 RETURN
C
C FORMAT STATEMENTS FOR ASK ROUTINE
C
80000 FORMAT('$',72A1)
80010 FORMAT(Q,80A1)
80020 FORMAT(F9.0)
80030 FORMAT(1X,100A1)
END
SUBROUTINE CALLF
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS CALL COMMAND
C <TAB>#CALL<TAB>FILNAM.EXT
C
IF(.NOT.INCLUD(LEVEL))GOTO 1000 !CONDITIONAL OFF
IF(LNLENG.GE.10)GOTO 10
CALL EPRINT(9) !SYSGEN-W-MISSING FILE NAME
GOTO 1000
10 IF(.NOT.INSERT)GOTO 20 !MAKE SURE NOT ALREADY IN SEC. SCRIPT
CALL EPRINT(10) !SYSGEN-W-NESTED #CALL?
GOTO 1000
20 INSERT=.TRUE.
CALL ASSIGN(INS,LINE(8))
C
C COMMAND DONE
C
1000 RETURN
END
SUBROUTINE DECR
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS DECR COMMAND
C <TAB>#DECR<TAB>VARIABLE
C
IF(.NOT.INCLUD(LEVEL))GOTO 1000 !MAY BE CONDITIONALIZED OUT
IF(LNLENG.GE.8)GOTO 10 !MAKE SURE CONDITIONAL NAMED
CALL EPRINT(11) !SYSGEN-W-MISSING CONDITIONAL IN
GOTO 1000
10 LPTR=8
CALL FNDVAR(1) !FIND VARIABLE
IF(CARRY.EQ.1)GOTO 1000 !VARIABLE NOT THERE
VALUE(VIDX)=VALUE(VIDX)-1. !DECREMENT VALUE
C
C COMMAND DONE
C
1000 RETURN
END
SUBROUTINE ENDC
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS ENDC COMMAND
C <TAB>#ENDC
C
IF(LEVEL.GT.1)GOTO 10 !MAKE SURE NOT AT BOTTOM LEVEL
CALL EPRINT(15) !?SYSGEN-W-TOO MANY #ENDC'S
GOTO 1000
10 LEVEL=LEVEL-1 !DROP CONDITIONAL LEVEL
C
C DONE
C
1000 RETURN
END
SUBROUTINE ENDS
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS ENDS COMMAND
C <TAB>#ENDS
C
IF(INCLUD(LEVEL))NUMSUB=0 !IF NOT CONDITIONALIZED OUT, RESET FOR NO SUBS
RETURN
END
SUBROUTINE EXITS
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS #EXIT COMMAND
C <TAB>#EXIT
C
IF(.NOT.INCLUD(LEVEL))GOTO 1000 !DON'T DO IF CONDITIONALIZED OUT
CALL EXIT
1000 RETURN
END
SUBROUTINE FILES
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS #FILE COMMAND
C <TAB>#FILE<TAB>FILNAM.EXT
C
IF(.NOT.INCLUD(LEVEL))GOTO 1000
IF(LNLENG.GE.8)GOTO 10 !MAKE SURE FILE NAME SPECIFIED
CALL EPRINT(9) !?SYSGEN-W-MISSING FILE NAME
GOTO 1000
10 IF(.NOT.FIRST)CALL CLOSE(OUT) !CLOSE PREVIOUS FILE
FIRST=.FALSE.
CALL ASSIGN(OUT,LINE(8)) !OPEN NEW OUTPUT FILE
C
C DONE
C
1000 RETURN
END
SUBROUTINE IF0
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS #IF COMMAND
C <TAB>#IF<TAB>VARIABLE
C
IF(LEVEL.LT.11)GOTO 10
CALL EPRINT(12) !SYSGEN-W-TOO MANY NESTED IF'S
GOTO 1000
10 IF(LNLENG.GE.6)GOTO 20 !CHECK FOR CONDITIONAL PRESENT
CALL EPRINT(11) !?SYSGEN-W-MISSING CONDITIONAL
GOTO 1000
20 LPTR=6
IF(.NOT.INCLUD(LEVEL))GOTO 30 !IF NOT ACTIVE,DON'T LOOKUP VARIABLE
CALL FNDVAR(1) !FIND VARIABLE
IF(CARRY.EQ.1)GOTO 1000 !OPERATION FAILED
30 LEVEL=LEVEL+1 !NEW CONDITIONAL LEVEL
COND(LEVEL)=ANSWER(VIDX,1).EQ.'Y' !COND=TRUE IF ANSWER = Y
C INCLUD TRUE IF PREVIOUS LEVEL TRUE
INCLUD(LEVEL)=COND(LEVEL).AND.INCLUD(LEVEL-1)
C
C DONE
C
1000 RETURN
END
SUBROUTINE IFF
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS THE #IFF COMMAND
C <TAB>#IFF
C
IF(LEVEL.GT.1)INCLUD(LEVEL)=.NOT.COND(LEVEL).AND.INCLUD(LEVEL-1)
RETURN
END
SUBROUTINE IFGT
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS THE #IFGT COMMAND
C <TAB>#IFGT<TAB>CONDITIONAL
C
IF(LEVEL.LT.11)GOTO 10 !TEST NESTING DEPTH
CALL EPRINT(12) !?SYSGEN-W-TOO MANY NESTED CONDITIONALS
GOTO 1000
10 IF(LNLENG.GE.8)GOTO 20 !TEST FOR CONDITIONAL PRESENSE
CALL EPRINT(11) !?SYSGEN-W-MISSING CONDITIONAL
GOTO 1000
20 LPTR=8
IF(.NOT.INCLUD(LEVEL))GOTO 30 !IF NOT ACTIVE,DON'T LOOKUP VARIABLE
CALL FNDVAR(1) !FIND THE VARIABLE
IF(CARRY.EQ.1)GOTO 1000 !ERROR
30 LEVEL=LEVEL+1 !NEW CONDITIONAL LEVEL
COND(LEVEL)=VALUE(VIDX).GT.0. !CONDITION TRUE IF VALUE >0
C INCLUDE TRUE IF PREVIOUS LEVEL TRUE
INCLUD(LEVEL)=COND(LEVEL).AND.INCLUD(LEVEL-1)
C
C DONE
C
1000 RETURN
END
SUBROUTINE IFN
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO HANDLE #IFN COMMAND
C <TAB>#IFN<TAB>VARIABLE
C
IF(LEVEL.LT.11)GOTO 10 !?SYSGEN-W-TOO MANY CONDITIONALS
CALL EPRINT(12)
GOTO 1000
10 IF(LNLENG.GE.7)GOTO 20
CALL EPRINT(11) !?SYSGEN-W-MISSING CONDITIONALS
GOTO 1000
20 LPTR=7
IF(.NOT.INCLUD(LEVEL))GOTO 30 !IF NOT ACTIVE,DON'T LOOKUP VARIABLE
CALL FNDVAR(1) !FIND VARIABLE
IF(CARRY.EQ.1)GOTO 1000 !VARIABLE NOT FOUND
30 LEVEL=LEVEL+1 !BUMP CONDITIONAL LEVEL
COND(LEVEL)=ANSWER(VIDX,1).EQ.'N' !COND TRUE IF VARIABLE="NO"
C INCLUD TRUE ONLY IF PREVIOUS LEVEL TRUE
INCLUD(LEVEL)=COND(LEVEL).AND.INCLUD(LEVEL-1)
C
C DONE
C
1000 RETURN
END
SUBROUTINE IFT
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS #IFT COMMAND
C <TAB>#IFT
C
IF(LEVEL.GT.1)INCLUD(LEVEL)=COND(LEVEL).AND.INCLUD(LEVEL-1)
RETURN
END
SUBROUTINE IFTF
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS #IFTF COMMAND
C <TAB>#IFTF
C
IF(LEVEL.GT.1)INCLUD(LEVEL)=INCLUD(LEVEL-1)
RETURN
END
SUBROUTINE NAME
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS #NAME COMMAND
C <TAB>#NAME<TAB>SECTION NAME
C
IF(LEVEL.EQ.1)GOTO 10 !CHECK TO BE SURE AT BASE LEVEL
CALL EPRINT(4) !?SYSGEN-F-TOO FEW ENDC'S
10 LEVEL=1
DO 20 KK=1,6
K=LINE(KK+7) !COPY NAME CHARS TO SUBNAME
IF(KK+7.GT.LNLENG)K="40 !"40 IS A SPACE
20 SUBNAM(KK)=K
C
C DONE
C
RETURN
END
SUBROUTINE PRINT0
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS #PRINT COMMAND
C <TAB>#PRINT<TAB>TEXT
C
IF(INCLUD(LEVEL))WRITE(5,80000)(LINE(J),J=9,LNLENG)
RETURN
80000 FORMAT(1X,100A1)
END
SUBROUTINE SET
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS #SET COMMAND
C <TAB>#SET<TAB>VARIABLE=ANSWER
C
IF(.NOT.INCLUD(LEVEL))GOTO 1000 !MAY BE CONDITIONALIZED OUT
IF(LNLENG.GE.7)GOTO 10 !MAKE SURE VARIABLE PRESENT
CALL EPRINT(11) !?SYSGEN-F-MISSING CONDITIONAL IN
GOTO 1000
10 LPTR=7
CALL FNDVAR(0) !FIND VARIABLE
IF(CARRY.EQ.1)GOTO 1000 !FAILED
IF(LINE(LPTR).EQ.'=')GOTO 20
15 CALL EPRINT(13) !?SYSGEN-F-BAD SET IN
GOTO 1000
20 IF((LNLENG-LPTR).GT.10)GOTO 15 !TOO MANY CHARS IN ANSWER
DO 30 KK=LPTR+1,LNLENG
30 ANSWER(VIDX,KK-LPTR)=LINE(KK)
C
C DONE
C
1000 RETURN
END
SUBROUTINE SUB
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PROCESS THE #SUBS COMMAND
C <TAB>#SUBS<TAB>"PATTERN"VARIABLE
C
IF(.NOT.INCLUD(LEVEL))GOTO 1000
IF(NUMSUB.LT.5)GOTO 3 !CHECK # OF SUBS ACTIVE
CALL EPRINT(12) !?SUSGEN-F-TOO MANY NESTED SUBS
GOTO 1000
3 IF(LINE(8).EQ.'"')GOTO 10
5 CALL EPRINT(14) !?SYSGEN-F-BAD SUBSTITUTE PATTERN
GOTO 1000
10 NUMSUB=NUMSUB+1
DO 20 J=1,30
PATERN(NUMSUB,J)=LINE(8+J)
IF(LINE(8+J).EQ.'"')GOTO 30
20 CONTINUE
NUMSUB=NUMSUB-1
GOTO 5 !TOO MANY CHARS IN PATTERN
30 PATLEN(NUMSUB)=J-1
LPTR=8+J+1 !POINTER TO START OF VARIABLE NAME
CALL FNDVAR(1) !FIND VARIABLE IN SYMBOL TABLE
IF(CARRY.EQ.1)GOTO 1000
DO 40 K=1,10
REPLAC(NUMSUB,K)=ANSWER(VIDX,K) !COPY ANSWER INTO REPLACE ARRAY
IF(REPLAC(NUMSUB,K).NE.0)GOTO 40
REPLEN(NUMSUB)=K-1
GOTO 1000
40 CONTINUE
C
C DONE
C
1000 RETURN
END
SUBROUTINE FNDVAR(OLD)
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO FIND A VARIABLE NAME IN THE VARIABLE TABLE
C
C INPUTS:-"LINE" ARRAY CONTAINS VARIABLE NAME
C LPTR POINTS TO VARIABLE NAME IN "LINE"
C VARIABLE NAME TERMINATED BY 0 OR "/" OR "="
C ARGUMENT "OLD"
C =0 MEANS IF VARIABLE NAME NOT IN TABLE,
C CREATE A NEW ENTRY
C =1 MEANS IF VARIABLE NAME NOT IN TABLE,
C PRINT ERROR MESSAGE
C OUTPUTS:-VIDX CONTAINS INDEX TO VARIABLE IN SYMBOL TABLE
C COMMON FLAG "CARRY"
C =0 IF OPERATION SUCCESSFUL
C =1 IF OPERATION FAILED
C
C CHECK FOR TABLE OVERFLOW
C
IF(NXTVAR.LT.NUMVAR)GOTO 10
CALL EPRINT(7) !?SYSGEN-W-TOO MANY CONDITIONALS
GOTO 1000 !FAILED
C
C SEARCH TABLE FOR NAME
C
10 DO 20 KK=1,NXTVAR
DO 15 JJ=0,VARLEN-1
IF(LINE(LPTR+JJ).EQ.0.AND.VAR(KK,JJ+1).EQ.0.OR.
1 LINE(LPTR+JJ).EQ.'/'.AND.VAR(KK,JJ+1).EQ.0.OR.
1 LINE(LPTR+JJ).EQ.'='.AND.VAR(KK,JJ+1).EQ.0)GOTO 40
IF(LINE(LPTR+JJ).NE.VAR(KK,JJ+1))GOTO 20
15 CONTINUE
GOTO 40 !INNER LOOP COMPLETE MEANS VARIABLE MATCH
20 CONTINUE
C
C IF WE GET HERE, SEARCH HAS FAILED
C
IF(OLD.EQ.0)GOTO 30 !CREATE NEW ENTRY
CALL EPRINT(8) !?SYSGEN-W-UNDEFINED VARIABLE IN
GOTO 1000 !FAILED
C
C CREATE NEW ENTRY FROM VARIABLE NAME
C
30 DO 35 JJ=0,VARLEN-1
IF(LINE(LPTR+JJ).EQ.0.OR.LINE(LPTR+JJ).EQ.'/'.OR.LINE(LPTR+JJ).EQ.'=')
1 GOTO 37
35 VAR(NXTVAR,JJ+1)=LINE(LPTR+JJ)
37 VIDX=NXTVAR
NXTVAR=NXTVAR+1
GOTO 45 !SUCCESS
C
C SEARCH SUCCEEDED
C
40 VIDX=KK
45 LPTR=LPTR+JJ
GOTO 1010
C
C RETURN AFTER SETTING FLAG
C
1000 CARRY=1 !OPERATION FAILED
RETURN
1010 CARRY=0 !OPERATION FAILED
RETURN
END
SUBROUTINE EPRINT(ERRNUM)
IMPLICIT INTEGER*2(A-Z)
COMMON ANSWER,VAR,LINE,COND,INCLUD
COMMON SUBNAM,VALUE,CARRY,SUBFLG
COMMON PATERN,REPLAC,PATLEN,REPLEN
COMMON LEVEL,NXTVAR,NUMSUB,LPTR
COMMON VARLEN,NUMVAR,LNLENG,VIDX
COMMON INSERT,FIRST,I,J,K,II,JJ,KK,III
COMMON CMDS,FILE,IN,OUT,INS,LASTLN,LSTLEN
LOGICAL*1 ANSWER(100,10),VAR(100,6),LINE(100),CMDS(6,17),FIRST,
1 COND(11),INCLUD(11),SUBNAM(6),PATERN(5,30),REPLAC(5,30),
1 FILE(12),INSERT,SUBFLG,CARRY,LASTLN(100)
REAL VALUE(100)
INTEGER PATLEN(5),REPLEN(5)
C
C SUBROUTINE TO PRINT AN ERROR MESSAGE
C USES ERRNUM AS INDICATOR FOR WHICH
C ERROR TO PRINT
WRITE(5,10)
10 FORMAT (/,'$?SYSGEN-')
GOTO(101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,
1 117,118)ERRNUM
C
101 WRITE(5,201)
GOTO 1000
201 FORMAT ('+F-Inappropriate answer',/)
C
102 WRITE(5,202)
GOTO 1000
202 FORMAT ('+F-Answer value too small',/)
C
103 WRITE(5,203)
GOTO 1000
203 FORMAT ('+F-Answer value too large',/)
C
104 WRITE(5,204)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
204 FORMAT ('+W-Too few #ENDC''s in ',6A1,/,1X,80A1)
C
105 WRITE(5,205)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
205 FORMAT ('+W-Bad #ASK in ',6A1,/,1X,80A1)
C
106 WRITE(5,206)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
206 FORMAT ('+W-Undefined command in ',6A1,/,1X,80A1)
C
107 WRITE(5,207)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
207 FORMAT ('+W-Too many variables in ',6A1,/,1X,80A1)
C
108 WRITE(5,208)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
208 FORMAT ('+W-Undefined variable in ',6A1,/,1X,80A1)
C
109 WRITE(5,209)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
209 FORMAT ('+W-Missing file name in ',6A1,/,1X,80A1)
C
110 WRITE(5,210)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
210 FORMAT ('+W-Nested #CALL in ',6A1,/,1X,80A1)
C
111 WRITE(5,211)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
211 FORMAT ('+W-Missing variable in ',6A1,/,1X,80A1)
C
112 WRITE(5,212)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
212 FORMAT ('+W-Too many nested #IFs or #SUBs in ',6A1,/,1X,80A1)
C
113 WRITE(5,213)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
213 FORMAT ('+W-Bad #SET in ',6A1,/,1X,80A1)
C
114 WRITE(5,214)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
214 FORMAT ('+W-Bad substitute pattern in ',6A1,/,1X,80A1)
C
115 WRITE(5,215)SUBNAM,(LINE(K),K=1,LNLENG)
GOTO 1000
215 FORMAT ('+W-Too many #ENDC''s in ',6A1,/,1X,80A1)
C
116 WRITE(5,216)
GOTO 1000
216 FORMAT ('+F-Insert error',/)
C
117 WRITE(5,217)
GOTO 1000
217 FORMAT ('+F-Output error',/)
C
118 WRITE(5,218)
218 FORMAT ('+F-Input error',/)
C
C DONE
C
1000 RETURN
END