Index of /ukdwk_archive/dwkwebcomplekt/AFZ_QUASIC1_XCUBE

[ICO]NameSizeDescription
[PARENTDIR]Parent Directory -  
[   ]QUA1.DSK830K 

Источник личная коллекция дискет уч. AFZ и публикация образа на форуме http://zx-pk.ru/showthread.php?t=16861&p=859483&viewfull=1#post859483 Quasic-1 (перфоленточный) Люди, что я нашел!.. Перфоленточный QUASIC, первый. Был на перфоленте, загружался перфоленточным абсолютным загрузчиком и работал даже на машинках с 8К памяти (Э-60, голая М2 с ее набортными 4К слов). Организован по типу перфоленточного же Бейсика, т.е. включает примитивный редактор текста и исполняющую систему, но, в отличие от Бейсика, компилирующий, скорость исполнения простых операторов сравнима со скоростью процессора, в отличие от Бейсика, для которого 100 операторов в секунду - это хорошо. Имеет средства взаимодействия с аппаратурой. Я его, в свое время, прикрутил к RT-11. Он принимает строку формата CSI, входной файл - исходная программа, выходной - имя файла для сохранения исправленной программы, кажется так, не помню - увы, исходники программы адаптации с дискеты не прочитались, может где дубль есть, или винт таки прочитается, но пока - ничего нет. Где-то на дискетах точно есть оригинал - копия перфоленты в формате .LDA, как найду - тоже выложу. Собственно, QUASIC состоит из двух файлов - QUASIC.SAV и - QUPD.LDA, подробностей совсем не помню, но оно работает. Правда, в эмуляторе Патрона под RT-11 V5.07 оно запускаться не захотело, а под 5.01 - как часы. Не вникал, просто приложил этот QUASIC вместе с системой, в которой он работает.(*) Там же оригинал доки QDOC.DOC и свежеотформатированный DOC'ом листинг QUADOC.DPR. Заодно обращаю внимание на прикольный вариант Тетриса - KOMP8.SAV и игрушку, которой нигде и никогда не было. Трехмерные крестики-нолики в кубе 4х4х4 - XCUBE.SAV - это творение моего товарища Шпильмана А. А., в настоящее время занимающегося торсионными полями и прочей хиромантией. Но когда-то он был хорошим программистом. Image : QUA1.DSK Format : DSK Size : 830 Kb Volume ID: RT11A Owner : File Blocks Date Bytes ---------- ------ ----------- ---------- QDOC .DOC 77 15-Sep-1991 39'424 QUPD .LDA 5 21-Sep-1991 2'560 QUASIC.SAV 32 22-Sep-1991 16'384 DOC .SAV 42 31-Aug-1987 21'504 QUADOC.DPR 89 26-Feb-2016 45'568 TT .SYS 2 12-Mar-1985 1'024 MY .SYS 3 27-Dec-1988 1'536 KZ .SYS 3 22-Mar-1990 1'536 DW .SYS 4 27-Dec-1988 2'048 VM .SYS 3 31-Dec-1988 1'536 LD .SYS 8 08-Dec-1986 4'096 SL .SYS 10 26-Oct-1988 5'120 RT11DS.SYS 72 21-Aug-1986 36'864 SWAP .SYS 27 25-Oct-1985 13'824 NL .SYS 2 13-Oct-1982 1'024 BINCOM.SAV 24 24-Nov-1987 12'288 KOMP8 .SAV 5 21-May-1987 2'560 PIP .SAV 29 12-Mar-1985 14'848 DESS .SAV 19 24-Apr-1987 9'728 RESORC.SAV 22 30-Sep-1987 11'264 DIR .SAV 19 22-Mar-1986 9'728 LIBR .SAV 24 24-Nov-1987 12'288 SPEED .SAV 3 26-Apr-1989 1'536 SRCCOM.SAV 26 24-Nov-1987 13'312 EDK .SAV 22 27-Dec-1988 11'264 DUP .SAV 45 30-Sep-1987 23'040 VRF .SAV 3 19-Apr-1984 1'536 DUMP .SAV 8 16-Jan-1988 4'096 MACRO .SAV 60 12-Mar-1983 30'720 LINK .SAV 49 12-Mar-1983 25'088 BAS .SAV 45 20-Jan-1990 23'040 DMP .SAV 2 25-Sep-1985 1'024 DAY .SAV 4 14-Feb-1986 2'048 KMATCH.SAV 5 06-Jun-1987 2'560 CREF .SAV 6 24-Nov-1987 3'072 SP21 .SAV 21 03-Jun-1985 10'752 XCUBE .SAV 7 06-Aug-1991 3'584 BASIC .SAV 56 13-Oct-1982 28'672 HELP .SAV 161 05-Sep-1986 82'432 PITON .SAV 8 02-Mar-1991 4'096 SYSMAC.SML 49 29-Oct-1985 25'088 HD .SYS 3 01-Mar-2012 1'536 < UNUSED > 542 277'504 ---------- ------ ----------- ---------- 42 Files, 1104 Blocks 542 Free blocks (*)Образ дискеты настроен на загрузку только в эмуляторе ДВК (!) Для возможности загрузки на реальном ДВК с контроллером MY, необходимо переписать загрузку на соответствующий драйвер. Аннотация Описана система разработки программ управления аппаратурой для ЭВМ "ЭЛЕКТРОНИКА 60" без внешней памяти. Система содержит компилятор языка, близкого к языку BASIC и оснащенного средствами машинного уровня. Язык имеет средства для работы с аппаратурой в стандарте САМАС. Вычислительные средства являются дополнительными и требуют внешней памяти. Подготовка, трансляция и отладка программ производит- ся без дополнительного обращения к перфоленте. Минимальный об'ем памяти, необходимый для работы системы 8К слов. - 2 - СОДЕРЖАНИЕ Аннотация 1 1. ВВЕДЕНИЕ 3 2. ОСНОВНЫЕ ПОНЯТИЯ ЯЗЫКА 5 2.1. СТРУКТУРА ПРОГРАММЫ 5 2.2. КОНСТАНТЫ 5 2.3. ПЕРЕМЕННЫЕ 5 2.4. ВЫРАЖЕНИЯ 6 3. OПЕРАТОРЫ 8 3.1. ОПЕРАТОРЫ, БЛИЗКИЕ К BASIC 8 3.2. ОПЕРАТОРЫ PUT И GET 10 3.3. ДОПОЛНИТЕЛЬНЫЕ ОПЕРАТОРЫ 12 4. КОМПИЛЯЦИЯ, СООБЩЕНИЯ ОБ ОШИБКАХ. 16 5. ВВОД/ВЫВОД. 17 6. МОНИТОР 17 6.1. Общее описание монитора. 17 6.2. КОМАНДЫ КОМПИЛЯТОРА . 18 7. РАСПРЕДЕЛЕНИЕ ПАМЯТИ. 20 Приложение 1. Сообщения об ошибках при трансляции. 23 Приложение 2. Сообщения об ошибках, выдаваемых монитором. 24 Приложение 3. Сообщения об ошибках при выполнении программы. 25 Приложение 4. Системные ошибки. 26 - 3 - 1. ВВЕДЕНИЕ Система QUASIC предназначена для написания, отладки и выполнения программ на микро-ЭВМ в малых конфигурациях. Предполагается, что ЭВМ не имеет внешней памяти и, возможно, имеет небольшую оперативную память. Создание программ для таких ЭВМ чрезвычайно осложняется необ- ходиmостью многократно вводить и выводить перфоленты. Для того, чтобы из программы на языке ассемблера, написанной на бумаге, получить программу в памяти машины, которая может быть выполнена, необходимо сделать 12 операций с перфолентой. Для отладки это количество нужно умножить на количество ошибок. Альтернативой является программирова- ние c помощью интерпретаторов (BASIC, FOCAL), но их малое быстро- действие (порядка 100 оп/с) делает класс задач, которые они позволяют решать очень узким. Описанная система является компилирующей и позволяет отлаживать программы без промежуточных операций с перфолентой. Число этих опера- ций равно 3 на весь процесс отладки. Система состоит из трех компонент: - Mонитор (который позволяет редактировать исходный текст, управлять выполнением программы и др.); - Компилятор с языка системы; - Подпрограммы, использующиеся во время выполнения. Язык системы QUASIC в большой степени близок к языку BASIC. Наиболее принципиальные отличия сводятся к следующему: - QUASIC рaбoтaeт с 16-разрядными целыми и вещественными пере- менными; - QUASIC располагает средствами машинного уровня (байтовые и логические операции, сдвиги, обработка прерываний и т. п.); - QUASIC имеет средства для программирования аппаратуры в стандарте САМАС. Транслятор с QUASIC является компилятором, то есть он производит об'ектную программу в машинных кодах. Трансляторы, поставляемые для ЭВМ без внешней памяти, в том числе транслятор с BASIC, являются интерпретаторами, то есть они осуществляют трасляцию каждого операто- ра непосредственно перед выполнением этого оператора. В частности, если оператор выполняется несколько раз, то и трансляция этого опера- тора будет производиться несколько раз. В таком режиме на выполнение программы уходит гораздо больше времени, чем если бы она была предва- рительно скомпилирована. Удобство при работе с интерпретатором сос- тоит, однако, в том, что программист имеет дело только с исходной программой: с именами переменных вместо адресов памяти и операторами языка вместо команд машины. QUASIC предоставляет пользователю такие же возможности. Это осу- ществляется за счет того, что в памяти во время выполнения сохраняют- ся таблицы связи между об'ектной и исходной программами. Благодаря - 4 - этому программист взаимодействует с об'ектной программой на языке исходной. Для того, чтобы легче было вносить изменения в программу, в памяти остается исходный текст. Система занимает около 6К слов. Остальная память отводится под исходную и об'ектную программы. Средства программирования САМАС ориентированы на крейт-контроллер, совместимый с СС-11. В этом описании предполагается знание стандарта САМАС и крейт - контроллера СС-11 /2,3/. При описании языка, там где это возможно, делаются ссылки на BASIC. Предполагается, что стандартный BASIC хоро- шо известен /1/. В описании используются угловые скобки и прописные буквы для обозначения элементов языка. Например, оператор присваивания описывается так: LET <ПЕРЕМЕННАЯ>=<ВЫРАЖЕНИЕ> или так: LET V=E , где V - переменная, Е - выражение. Квадратные скобки используются для обозначения необязательных элементов (например, указателя шага в операторе цикла). Ниже поясняются некоторые встречающиеся в тексте обозначения. ASCII (AMERICAN STANDART CODE FOR INFORMATION INTERCHANGE) стандартный код символов; CR 15 возврат каретки (ВК); LF 12 перевод строки (ПС); FF 14 перевод формата (ПФ); DEL 177 забой (ЗБ); ESC 33 ESCAPE (AР2); CTRL/X обозначает одновременное нажатие клавиш CTRL (УС) И Х; IOX (INPUT/OUTPUT EXECUTIVE) - супервизор ввода-вывода ПЛОС. - 5 - 2. ОСНОВНЫЕ ПОНЯТИЯ ЯЗЫКА 2.1. СТРУКТУРА ПРОГРАММЫ Программа на QUASIC состоит из строк, каждая из которых имеет номер (любое целое число от 1 до 32767) и заканчивается символами ВК и ПС (при вводе нажимается только ВК, ПС добавляется автоматически). Длина строки не должна превышать 72 символа. Строки располагаются в порядке возрастания номеров независимо от той последовательности, в которой они появляются. Каждая строка содержит один или несколько операторов. Операторы в строке разделяются символом \ . Операторы нельзя переносить на другую строку. Каждый оператор начинается ключевым словом, определяющим этот оператор. Кроме того, он может содержать другие ключевые слова. Если оператор начинается с символа, отличного от буквы, цифры или пробела, вoспринимается как комментарий; часть программы, начиная с этого сим- вола до конца оператора (до первого символа \ или ПС), игнорируется. 2.2. КОНСТАНТЫ Целое число определяется как последовательность десятичных цифр. Значение числа не должно превышать 32767. Допускаются три типа констант - Десятичные - Целое число, либо целое со знаком + или -. - Восьмеричные - Последовательность восьмеричных цифр, перед которой стоит апостроф. Количество цифр может быть произ- вольным, но принимаются во внимание только младшие 16 двоич- ных разрядов. - Символьные. Символьные константы записываются в виде "LL", где L - символы. Количество символов не должно быть больше 2. Любая константа занимает в памяти одно слово. 2.3. ПЕРЕМЕННЫЕ Имя переменной - это последовательность букв и цифр, причем пер- вым символом должна быть буква. Буквами считаются большие латинские буквы и символ @. Хотя символ @ является равноправной буквой, не рекомендуется использовать его для создания новых переменных, так как он зарезервирован для служербных переменных (см. ниже). - 6 - Все переменные имеют структуру массива, то есть состоят из ком- понентов, к каждому из которых имеется доступ. Компонентами переменной являются слова и байты. Количество слов в переменной называется ее размером. Если переменная состоит из одно- го слова, она называется простой. Переменные, состоящие более чем из одного слова должны быть явно определены оператором DIMENSION. Компоненты переменной указываются с помощью индексов. Для указа- ния байтовой структуризации к имени переменной добавляется символ % . Индекс должен быть либо целым числом, либо простой переменной. Не контролируется выход индекса за веpхнюю границу, кроме тех случаев когда индекс представлен простым числом, и это обнаруживается при трансляции. Заметим, что выход индекса за границы массива может вызвать серьезные ошибки. В некоторых случаях может потребоваться даже пере- загрузка системы. Во избежание этого программист должен тщательно следить за индексами. Для удобства речи будем говорить "ФИКСИРОВАННЫЙ КОМПОНЕНТ", ког- да речь идет о простой переменной или компоненте, индекс которого является константой. Определим ранг компонента = РАЗМЕР ПЕРЕМЕННОЙ - ИНДЕКС КОМПОНЕНТА. так как QUASIC не имеет возможности работать со всей переменной в целом, а только с отдельными компонентами (кроме простых переменных), то в дальнейшем, употребляя слово переменная, часто будем иметь в виду компонент переменной. Для упрощения синтаксических конструкций языка введены служебные переменные. Эти переменные могут использоваться так же, как и обычные переменные, но имеют дополнительную служебную нагрузку. В настоящее время имеются две такие переменные: - @MOD - Oстаток после операции деления; - @FTIM - Первоначально эта переменная имеет значение 1, опе- раторы MARK и SLEEP сбрасывают ее, по истечении заданного в этих операторах времени она автоматически устанавливается в 1 (см. п. 3.3.). 2.4. ВЫРАЖЕНИЯ Выражения строятся из термов с использованием широкого набора операций, соответствующего практически всем машинным командам. Терм - это константа, переменная или адресная константа. Адресная константа записывается в виде &<ФИКСИРОВАННЫЙ КОМПОНЕНТ> и имеет значение, рав- ное адресу фиксированного компонента. Операции делятся на 1-местные и 2-местные. 1-местные операции это: + Плюс; - ИЛИ .NEG. Минус; .INC. Прибавление 1; .DEC. Вычитание 1; - 7 - .ASL. Сдвиг влево; .ASR. Сдвиг вправо; .ROL. Циклический сдвиг влево; .ROR. Циклический сдвиг вправо; .СОМ. Инвертирование; .SWAB. Перестановка байтов; .ADC. Прибавление переноса; .SBC. Вычитание переноса; 2-местные операции это: + ИЛИ .ADD. Сложение; \ - ИЛИ .SUB. Вычитание; ! * Умножение; ! Арифметические / Деление; / .BIS. Установка разрядов; .BIC. Очистка разрядов; Все операции, кроме * и / , соответствуют одной машинной коман- де, и их название совпадает с названием команды. Самый высокий прио- ритет имеют 1-местные операции, затем идут *,/ и .BIC., затем +,- и .BIS. . Примеры выражений: 1. (А+B)*(C+D) 2. STATUS(I).BIC.'177400 3. .COM.ALFA+.ASL..ASL.CODE 4. X1.BIC.M1.BIS.X2.BIC.M2 Последнее выражение эквивалентно (X1.BIC.M1).BIS.(X2.BIC.M2) - 8 - 3. OПЕРАТОРЫ Часть операторов очень близка к стандартному BASIC, но всегда имеются два отличия: - Все ключевые слова идентифицируются по первым 3 символам; - Пробелы могут присутствовать только в определенных местах. Например, пробелы, как правило, ограничивают ключевые слова. Там, где может стоять один пробел, mогут стоять и несколько пробелов. Некоторые операторы не генерируют команд в об'ектной программе. Они называются операторами описания. Это операторы DIMENSION, DECLARE, LOCATE, ON И VANISH . 3.1. ОПЕРАТОРЫ, БЛИЗКИЕ К BASIC Эти операторы описываются наиболее кратко и главным образом на примерах. REMARK - Это другой способ вставлять комментарии в прогамму. Все, что следует после remark до ближайшего символа \ или ПС, игнори- руется. DIMENSION - Оператор описывает переменные размера >1, размер переменной - любое целое число. DIM A(100),B(200) LET - Записывается в виде LET <ПЕРЕМЕННАЯ>=<ВЫРАЖЕНИЕ> . <ВЫРАЖЕНИЕ> вычисляется и его значение приписывается <ПЕРЕМЕННОЙ> . Примеры: 100 LET A(I)=K(I)+B 200 LET L="NO" 375 LET X%=A+B*C В последнем примере выражение A+B*C вычисляется и его младший байт пересылается в младший байт переменной Х . Старший байт этой переменной не изменяется. GOTO - Передает управление на строку. Записывается в виде: GOTO GOTO 10 ; GOTO .+10 - 9 - GOTO должно писаться без пробела. Значение терма должно быть номером строки, на которую осуществляется переход. Пример. 150 GOTO 60 Следует иметь ввиду, что в случае, когда номер строки задан переменной, оператор GOTO выполняется медленнее, чем в том случае, когда номер строки задан константой. IF - THEN - Оператор имеет два варианта: IF <УСЛОВИЕ> THEN <ОПЕРАТОР> IF <УСЛОВИЕ> THEN <НОМЕР СТРОКИ> Если <УСЛОВИЕ> удовлетворяется, то в первом случае выполняется <ОПЕРАТОР>, во втором - происходит переход на <СТРОКУ>. <УСЛОВИЕ> это: <ВЫРАЖЕНИЕ> <ОТНОШЕНИЕ> <ВЫРАЖЕНИЕ> Знаки отношения: = Равно > Больше < Меньше >= Больше или равно <= Меньше или равно <> >< Не равно <ОПЕРАТОР> может быть любым, в частности, возможен другой опера- тор IF. Примеры: 80 IF X=A THEN 100 300 IF X>=A THEN IF X<=B THEN LET Y=X Две формы оператора IF-THEN имеют существенное различие. В варианте IF-THEN <НОМЕР СТРОКИ> если <УСЛОВИЕ> ложно, то управление передается на следующий оператор, а в варианте IF-THEN <ОПЕРАТОР> в этом случае управление передается на следующую строку. FOR-TO-STEP - Задает цикл. Имеет вид: FOR V=T1 TO T2 [STEP T3] , где V - Простая переменная; Т1,Т2,Т3 - Константы или фиксированные компоненты. V называется переменной цикла, Т1 - Начальное значение переменной цикла, Т2 - Конечное, Т3 - Шаг. Если шаг не указан, то он равен 1. Шаг должен быть больше 0. В этом случае, если верхняя граница меньше нижней, цикл выполняется один раз. - 10 - NEXT - Заканчивает цикл. Имеет вид NEXT V , где V - переменная цик- ла. Переменная должна быть той же, что и в Соответствующем операторе FOR-TO-STEP. Допускаются вложенные циклы. Коли- чество вложений зависит от версии транслятора. Конечное значение переменной цикла должно быть меньше 32767. Значение 32767 приведет к незавершению цикла. Эта ошибка не обнаружи- вается компилятором. GOSUB - Переход на подпрограмму. Имеет вид GOSUB <терм>. Значение <терма> должно быть номером строки, на которую осуществляет- ся переход. RETURN - Возврат из подпрограммы. STOP - Прекращает выполнение программы. На терминале печатается сообщение: STOP AT LINE , где - номер строки в кото- рой стоит соответствующий STOP. ЕND - Все операторы, следующие после END при трансляции игнори- руются. При выполнении действует как STOP. Должен быть единственным в строке. Если он отсутствует, трансляция заканчивается на строке с наибольшим номером. При выполне- нии, если отсутствуют операторы STOP и END (и нет бесконеч- ных циклов) программа завершается на строке с наибольшим номером. 3.2. ОПЕРАТОРЫ PUT И GET Прототипами этих операторов служат операторы PRINT и INPUT BASIC'a. Операторы PUT и GET служат для ввода/вывода десятичной, восьмеричной и символьной информации. Общий вид такой: PUT GET [<ЛОГИЧЕСКОЕ УСТРОЙСТВО>] [<ФОРМАТ>] [(<СПИСОК>)] [:WAIT] <ЛОГИЧЕСКОЕ УСТРОЙСТВО> имеет вид #N , ГДЕ N - число от 1 до 5. (см. п. 5 о физических и логических устройствах). <ФОРМАТ> это DECIMAL, OCTAL или CHARACTER (здесь, как и всегда для ключевых слов достаточно трех букв). Если <ФОРМАТ> отсутствует, предполагается формат DECIMAL. <СПИСОК> определяет переменные, участвующие в операции ввода/вывода. Имеет различный вид для операторов PUT и GET и для форматов DEC, OCT и CHAR. Переменные, фигурирующие в списке, не должны быть байтовыми. Если <СПИСОК> отсутствует, PUT осуществляет вывод пустой строки (сим- волы ВК и ПС), а GET - паузу (ожидание произвольного ввода). Спецификатор :WAIT возможен только для оператора PUT. PUT - Служит для вывода. Если <ЛОГИЧЕСКОЕ УСТРОЙСТВО> не указано, - 11 - производится вывод на терминал. Форматы DEC и OCT . <СПИСОК> состоит из элементов, разделенных запятыми. Элементом списка вывода является переменная, текст, заключенный в кавычки, или символ / . Элемент / вызывает перевод строки (вывод символов ВК и ПС). Любой переменной при выводе отводится 7 позиций, В последней из которых содержится пробел. PUT всегда переводит строку после печати, кроме случая, когда в списке последней является , . Пример: 100 PUT (X) Переводит строку; 200 PUT (X,) Не переводит строку; Примеры операторов PUT: 100 PUT #5 (A,B,C) 200 PUT (/,"X=",X) Запятые между элементами списка не всегда обязательны. Символы / и " сами могут служить разделителями. Последний пример можно записать так: 200 PUT (/"X="X) Замечaние: при выводе в формате DECIMAL значение -32768 заме- няется шестью звездочками. Формат CHAR. В этом случае список имеет вид: V,Е , где V - переменная, Е - выраже- ние Оператор PUT CHAR передаеt последовательность байтов из памяти в устройство вывода. компонент V задает начало последовательности бай- тов. Выражение Е задает количество байтов, которые следует передать. Пример: 10 DIM LINE (40) ### 50 PUT CHAR (LINE,K) ### 120 LET I=I+12\PUT CHAR (LINE(I),24) Имется два варианта выполнения оператора PUT: - Программа не ожидает конца вывода; - Программа ожидает окончание вывода. Первый вариант реализуется по умолчанию, для второго необходимо указать спецификатор :WAIT . - 12 - GET - Служит для ввода. Если логическое устройство не указано, производится ввод с кла- виатуры. Если оператор GET производит ввод с клавиатуры, то на экран выводится символ ?, запрашивающий ввод. Ввод заканчивается при появ- лении символа ПС или ПФ (ввод символа ПС автоматически осуществляется при нажатии клавиши ВК на клавиатуре). Форматы DEC и OCT . В этом случае список состоит из переменных, разделенных запятыми. В формате DEC могут вводиться любые константы, а в формате OCT - вось- меричные числа. Каждое вводимое значение должно заканчиваться одним из символов - пробел, запятая или ВК. Формат char. В этом случае список имеет вид V[,W] , где V и W - переменные. Оператор GET CHAR передает последовательность байтов из уст- ройства ввода в память. Компонент V определяет начало области памяти, в которую передаются байты; после выполнения операции переменная W получает значение равное количеству введенных байтов. Символы ВК, ПС и ПФ , если были введены, тоже записываются в память. Пример: 20 DIM LINE(40) 20 GET CHAR(LINE,K) Если при выполнении этого оператора было введено ABC<ВК> , то LINE(0) будет содержать АВ, LINE(1) - С и ВК, LINE(2) - ПС в младшем байте, К будет иметь значение 5. Замечание. Количество байтов, передаваемое операторами PUT CHAR и GET CHAR , не должно превышать некоторой величины, зависящей от версии транслятора (см. приложение 3). 3.3. ДОПОЛНИТЕЛЬНЫЕ ОПЕРАТОРЫ DATA - Оператор служит для задания начального значения переменных. Начальные значения присваиваются при трансляции. Имеет вид: DATA V1/[K1*]D1,[K2*]D2,.../,V2/.../ , где V1,V2,... фиксированные компоненты; D1,D2,... константы; К1,К2,... кратности. Кратности могут отсутствовать, в этом случае считается, что они равны 1. Общее количество констант (сумма кратностей) не должно пре- восходить ранг компонента. - 13 - Следующие два оператора служат для работы с таймером. MARK - Oператор имеет следующий вид: MARK (T) [COMPLETE N] Здесь Т=Е или Е1,Е2 - Величина интервала времени в одном или двух словах (Е2 - старшая часть). Время измеряется в тиках, равных периоду таймера; Е,Е1,Е2 - выражения, N - номер строки. Оператор MARK устанавливает в 0 переменную @FTIM и начинает oтс- чет времени. Управление передается следующему оператору. По истечении времени Т происходит прерывание, переменная @FTIM устанавливается в 1 и в случае оператора MARK - COMPLETE выполняется подпрограмма N . После этого продолжается нормальное выполнение программы. Пример: 410 MARK (500) 420 (Этот блок будет выполняться в течение 10 с.) ### 490 IF @FTIM=0 THEN 420 SLEEP - Оператор имеет следующий вид: SLEEP [(T)] где Т=Е или Е1,Е2 - интервал времени (см. оператор MARK). Eсли Т задано, оператор эквивалентен следующему: N MARK (T) N+1 IF @FTIM=0 THEN N+1 Если Т не задано, оператор эквивалентен строке N+1 . LOCATE - Этот оператор позволяет разместить переменную по заданному адресу. При этом переменная считается массивом "бесконечно- го" размера. Имеет вид: LOC V1,A1,V2,A2... где V1,V2 - имена переменных, А1,А2 - восьмеричные адреса. Адреса должны быть четными и >= 100 . В основном этот оператор предназначен для обращения к регистрам внешних устройств. Он позво- ляет программировать нестандартные устройства на физическом уровне. Пример: 70 LOC SW,177570\REM SW РЕГИСТР ПЕРЕКЛЮЧАТЕЛЕЙ ON - Оператор on является оператором описания. Он указывает, что если произойдет прерывание по определенному вектору, то должна быть выполнена определенная подпрограмма. Местополо- - 14 - жение оператора on в программе безразлично. Оператор записы- вается так: ON A GOSUB N [:PRI I] где А - восьмеричный адрес вектора, а N - номер строки. Адрес должен быть < 400 и делиться на 4, PRI по умолчанию = 5. Пример: 30 ON 340 GOSUB 200 REQUEST - Этот оператор дает возможность пользователю управлять выполне- нием программы с помощью запросов с клавиатуры, не переходя к монито- ру. Запрос осуществляется вводом символа АР2 с клавиатуры. Оператор имеет вид: REQUEST [<НОМЕР СТРОКИ>] Если <НОМЕР СТРОКИ> указан, то после выполнения этого оператора каждый запрос пользователя вызывает прерывание программы и переход на указанную строку. При этом на экран выводится текст оператора REQUEST. Заметим, что переход не произойдет, пока не будут завершены текущие операции ввода/вывода на терминале. Следующий оператор REQUEST может установить новый адрес перехода по запросу. Оператор REQUEST без <НОМЕРА СТРОКИ> отменяет действие запросов. Пример: Этот фрагмент показывает, как можно управлять окончанием выполнения цикла. 30 REQUEST 70 40 FOR I=0 TO N ### 60 NEXT I 70 REQUEST ### VANISH - Оператор имеет вид: VANISH V1,V2,... где V1,V2 фиксированные компоненты. VANISH - оператор описания. Он указывает, что переменные должны обращаться в 0 при выходе из об'ектной программы (то есть когда выполнение программы прекращается по оператору stop или на последнем операторе программы, или когда программа прерывается по УС/Р). Главное назначение этого оператора состоит в запрещении прерыва- ний от нестандартных устройств пользователя при выходе из программы. Предполагается, что переменные V назначены на регистры внешних уст- ройств оператором LOCATE. Необходимость такого запрещения связана со следующим. Если при выходе из программы пользователя прерывания от - 15 - нестандартных устройств будут продолжать возникать, то они будут обрабатываться программой пользователя при фоновой работе монитора. Однако, если будет выполняться компиляция, то программа обработки прерываний пользователя может модифицироваться во время ее работы. Это может привести к сбоям системы. CALL - Оператор CALL служит для вызова программ, написанных на ассемблере. Программа определяется по номеру. QUASIC содержит таблицу CALLST, в которую заносятся адреса подпрограмм. Номер подпрограммы есть номер слова в этой таблице. Оператор записывается так: CALL N,V1,V1,... где N - номер подпрограммы; V1,V2 - фиксированные компоненты, являющиеся аргументами. Пример 845 CALL 7,X,F1,F2 Для того чтобы подключить ассемблерную программу надо: - Занести в нужное место таблицы CALLST адрес прогаммы; - Программу расположить в верхней части памяти, нижний адрес программы занести в ячейку MEMTOP (см. п. 7 о распределении памяти. Вызов прогаммы осуществляется следующим образом: JSR R5,@CALLST+... A1 A2 ... где А1,А2 - адреса ячеек, в которых храняться элементы. Программа должна передвинуть R5 так, чтобы он указывал на первую инструкцию после адресов аргументов. Возврат из подпрограммы по команде RTS R5. - 16 - 4. КОМПИЛЯЦИЯ, СООБЩЕНИЯ ОБ ОШИБКАХ. Для того, чтобы выполнить программу, ее надо предварительно скомпилировать. Компиляция осуществляется командой COMPILE (см. п.6). В процессе компиляции печатается листинг программы. Если какая- либо строка содержит ошибку, то вслед за этой строкой выдается знак $ указывающий местоположение ошибки, и сообщение ERROR I, где I - код ошибки. Список кодов ошибок приведен в приложении 1. Отметим, что $ указывает не только на ошибку. Можно только утверждать, что ошибка находится не правее $. Если в программе обнаружены синтаксические ошибки, то в конце трансляции печатается сообщение: SYNTAX ERRORS. Если компиляция прошла успешно, то после листинга печатается сообщение FREE CORE N WORDS где N - количество свободных слов в памяти (в десятичной систе- ме). При вводе исходной программы и компиляции может произойти пере- полнение внутренних таблиц компилятора. В этих случаях выдается сооб- щение SYS ERR I , где I - код сообщения. Список этих кодов приводится в приложении 4. Если программа успешно оттранслирована, то она может быть выполнена. Выполнение осуществляется командой RUN (см. п. 6). - 17 - 5. ВВОД/ВЫВОД. Выполняет операции ввода и вывода со стандартных физических уст- ройств. Каждое физическое устройство имеет имя. Физические устройства и их имена приведены в таблице ниже. Программа пользователя обращает- ся к внешним устройствам по логическим именам. При загрузке системы устанавливается начальное соответствие между логическими именами и физическими устройствами. Это соответствие содержится в таблице ниже. Оно может быть изменено командой монитора ASSIGN (см. п. 6). ТАБЛИЦА ====================================================== Логическое имя ! Физическое имя ! Устройство ====================================================== 1 КВ Клавиатура терминала 2 ТТ Печать на терминале 3 PR Считыватель перфоленты 4 РР Перфоратор ленты 5 LP Построчная печать ====================================================== Ввод/вывод для стандартных устройств осуществляет программа IOX. В частности, всегда можно пользоваться следующими символами: <ЗБ> - СТИРАНИЕ ОДНОГО СИМВОЛА, ИЗОБРАЖАЕТСЯ КАК \ ; УС/U - СТИРАНИЕ СТРОКИ. 6. МОНИТОР 6.1. Общее описание монитора. После загрузки системы QUASIC управление передается программе внутреннего начального диалога, который определяет размер оперативной памяти и наличие внешних устройств. Если отсутствует печатающее устройство или перфоратор (LP или PP), то соответствующее имя становится запрещенным, а логическое уст- ройство (5 или 3) назначается на терминал (ТТ). Затем управление получает монитор, который печатает QUASIC COMPILER READY Монитор имеет два режима: командный и текстовый. Признаком того, что монитор находится в командном режиме, является сообщение READY. В - 18 - ответ пользователь может вводить команды, которые описываются ниже. Команды заканчиваются нажатием <ВК>. Имеются команды управления и специальные команды для перехода в текстовый режим. Это команды NEW, OLD, APPEND. Выход из текстового режима происходит при вводе символа ПС или ПФ . Все команды идентифицируются по первым двум символам, если команда содержит ошибку, то она не выполняется и выдается сообщение ERROR I , где I - код ошибки (>=50). Сообщения ERROR I могут появляться и при вводе текста. Коды ошибок приведены в приложении 2. При вводе может появиться сообщение SYS ERR 1, которое говорит о переполнении памяти. Монитор имеет средства для редактирования текс- та. Возможны ввод новых строк в текст и стирание строк. Ввод новых строк осуществляется командой APPEND. Новые строки вводятся в текст в соответствии с их номерами. Если в тексте уже была строка с таким номером, то новая строка запишется на место старой, в противном слу- чае строка вставляется в текст так, чтобы номера строк были упорядо- чены по возрастанию. Cтирание строк осуществляется командой DELETE. Замечание. При стирании строк место в буфере текста не освобож- дается, поэтому при внесении большого количества изменений может воз- никнуть переполнение буфера текста, даже если окончательная программа небольшая. Очистка буфера текста производится только командами NEW и OLD. В любой момент нажатие УС/Р приводит к перезапуску монитора. QUASIC можно перезапустить также с адреса 0 . 6.2. КОМАНДЫ КОМПИЛЯТОРА . NEW - Стирание программы и переход в текстовый режим (ввод с кла- виатуры). OLD - Стирание программы и ввод текста с перфоленты. APPEND - Переход в текстовый режим. Команда имеет вид: AP [DEV] , где DEV - устройство ввода (КВ или PR). Если не указано, то DEV=KB. LIST - Печать исходной программы. Команда имеет вид: LI [DEV] [K,[I]] - 19 - где DEV - физическое устройство вывода. DEV=TT,LP или PP. Если не указано, то DEV=TT. K и I - номера строк. Если они отсутствуют, то выводится вся программа, если I отсутствует, то выводится строка с номером К , если присутствуют и К и I , то выводятся строки от К до I включительно. DELETE - Стирание строк. Формат: DE [K[,I]] , K и I имеют тот же смысл, что и в команде LIST SAVE - Вывод исходной программы на перфоленту. Формат: SA [K[,I]] , K и I имеют тот же смысл, что и в команде LIST . Отличие SAVE от LIST PP состоит в том, что команда SAVE выводит признак конца ленты (сим- вол ПФ) и прогоняет чистую ленту в начале и в конце. ASSIGN - Задает соответствие логических и физических устройств. Имеет вид: AS #N,DEV . Здесь N - логическое имя устройства, DEV - физическое имя (см. п. 5) COMPILE - Трансляция программы. Команда имеет вид: CO [DEV] . здесь DEV - имя физического устройства, на которое будет выводиться листинг (DEV=TT,LP или РР). Если не указано, то DEV=TT . RUN - Выполнение программы. Возможно только в том случае, если прог- рамма оттранслирована и не содержит ошибок. Следующие три команды используются главным образом при отладке, их прообразами служат три оператора языка. Эти команды возможны толь- ко в том случае, если программа оттранслирована и не содержит ошибок. PUT - Команда имеет вид: PUT [<ФОРМАТ>] (<СПИСОК>) . <ФОРМАТ> - это DEC, OCT и CHAR. Для форматов DEC и ОСТ элемента- ми списка могут быть только переменные. LET - Присвоение значения переменной. Записывается в виде: - 20 - LE <ПЕРЕМЕННАЯ>=<КОНСТАНТА> GOTO - Выполнение программы, начиная с заданной строки. Имеет вид: GO <НОМЕР СТРОКИ> Как правило, используется после выполнения оператора STOP в программе пользователя. GIVE - По этой команде производится вывод системы quasic и ассемблер- ных программ пользователя (если они имеются) на перфоленту. Команда служит для создания копии системы с заданным набором подпрограмм на одной ленте. Заметим, что программа начального диалога при этом не выводится и поэтому копия будет рассчитана на ту же конфигурацию машины, на которой она получена. 7. РАСПРЕДЕЛЕНИЕ ПАМЯТИ. QUASIC использует память следующим образом: +---------------+ ХХ7750 ! Загрузчики ! MEMTOP+2 3610 !---------------! !Подпрограммы, ! !написанные на ! !ассемблере ! MEMTOP 3606 !---------------! !Область данных ! BOTTOM 3602 !---------------! !Свободная ! !область ! TOP !---------------! !Об'ектная ! !программа ! OBJECT 3612 !---------------! !Исходный текст ! TEXT 3606 (конец текста) !---------------! !Таблицы ! TAB !---------------! !QUASIC ! START !---------------! 400 ! Стек ! !---------------! 0 !Вектора ! +---------------+ QUASIC занимает приблизительно 5К. Остальная память отводится - 21 - под программу пользователя. Исходная программа располагается выше области таблиц. Об'ектная программа располагается сразу за исходной. Адрес начала об'ектной программы содержится в ячейке object . После об'ектной программы идет свободная область, если она имеется. Нижний адрес этой области содер- жится в ячейке тор . Верхний адрес памяти, доступной компилятору, содержится в ячейке МЕМТОР . Выше этого адреса пользователь может расположить ассемблер- ные подпрограммы. Верхний адрес всей памяти, доступной системе, содержится в ячейке мемтор+2. Эти адреса заносятся либо автоматически при начальном диалоге, либо пользователем по своему усмотрению. Заме- тим, что всякое изменение содержимого ячейки МЕМТОР портит исходную программу. Область данных располагается вверху памяти, вниз от МЕМ- ТОР. Нижний адрес этой области содержится в ячейке ВОТТОМ. Как уже указывалось (см. п. 6), после редактирования исходный текст может занимать больше места в памяти, чем ему на самом деле требуется. Соответственно, меньше места остается для об'ектной прог- раммы. Следует иметь ввиду, что сообщение FREE CORE, выдаваемое после трансляции, указывает размер свободной области, расположенной после об'ектной программы, и не учитывает свободные места в области текста. Размер свободной области может увеличиться после повторного ввода исходной программы. QUASIC использует следующие вектора: 0 команда JMP START - перезапуск; 4 ошибки процессора; 10 резервные инструкции; 20 ловушка ввода/вывода (IOX) 24 ловушка питания 30 ЕМТ 34 TRAP для вызова системных подпрограмм 40 (слово) остановы программы 50 (слово) версия QUASIC 60 вектор КВ 64 вектор ТТ 70 вектор PR 74 вектор РР 100 вектор таймера 200 вектор LP Если происходит ловушка по вектору 4 или 10 , то на терминал выдается сообщение ? TRAP TO AT LINE где - ориентировочный номер строки, в которой произошло пре- рывание. Упоминавшиеся в описании ячейки имеют следующие адреса: BOTTOM ? CALLST 5262 MEMTOP 3606 OBJECT ? - 22 - TOP ? - 23 - Приложение 1 Сообщения об ошибках при трансляции. 1 Неправильная запись числа или константы или число > 32767; 2 Несуществующий оператор ; 3 Неправильная запись оператора; 4 Неправильное использование переменной; 5 Переменная не описана; 6 Переменная описана дважды; 7 Неправильная запись арифметического выражения; 8 Индекс выходит из границ 9 Несуществующий знак отношения в операторе IF; 10 Недопустимые параметры в операторе FOR; 11 Оператор NEXT не на своем месте; 12 Ошибка в списке ввода или вывода; 18 Неправильный номер подпрограммы в операторе CALL; 19 Неправильный номер логического устройства; 20 Нефиксированный компонент в операторах DATA, CALL, VANISH; 21 Переменная в списке данных в DATA; 22 Неправильный формат в PUT или GET; 23 Нечетный адрес в LOC или <100 или неправ. вектор в ON; 24 Несуществующий номер строки; 25 Не закрыт цикл. - 24 - Приложение 2 Сообщения об ошибках, выдаваемых монитором. 50 Слишком длинная строка; 51 Неправильная запись числа или число >32767; 52 Несуществующая команда; 53 Неправильная запись команды; 54 Неправильная запись переменной; 55 Переменная не существует; 56 Ошибка считывателя перфоленты При вводе исходной программы; 57 Недопустимая правая часть в команде LET; 58 Индекс выходит из границ; 59 Номер строки не существует; 60 Ошибка в команде PUT; 63 Попытка обратиться к неоттранслированной программе; 66 Неправильное физическое устройство ввода; 67 Неправильное физическое устройство вывода; 68 Неправильное физическое устройство; 69 Неправильное логическое устройство; 70 Количество байтов в PUT <0 или >480; 72 Неправильный формат в PUT. - 25 - Приложение 3 Сообщения об ошибках при выполнении программы. 100 Неправильное устройство (ввод с устройства вывода или вывод на устройство ввода). Управление возвращается монитору. Нужно сделать правильное назначение и продолжить выполнение. 101 Устройство не готово. Система переходит в ожидание. Нужно подготовить устройство и нажать <ВК>. Выполнение программы продолжится. 102 Переполнение буфера при вводе. Делается повторная попытка ввода. 103 Неправильные символы при вводе. Делается повторная попытка ввода. 105 Ошибка оператора call. Адрес подпрограммы не был записан в таблицу CALLST. Управление возвращается монитору. 108 Переполнение при умножении или делении на 0. Выполнение программы продолжается. 110 Количество байтов в операторе put char <0 или >480. Выполнение программы продолжается. 111 Количество байтов, введенных GET CHAR , больше ранга компонентов. Выполнение программы продолжается. - 26 - Приложение 4 Системные ошибки. Эти ошибки связаны с переполнением внутренних таблиц компилято- ра. Размеры этих таблиц зависят от версии компилятора. В следующем списке в скобках приведены размеры таблиц для основной версии. 1 Больше нет свободной памяти; 5 Слишком много переменных в VANISH (7); 6 Слишком много обращений к меткам (170); 7 Слишком много вложенных циклов (12).