HISOFT PASCALЧ - VERSION 1.4 31. Ост. 1982 Часть 1 Тип FILE неопределен. Тип RECORD не может иметь вариантов. Процедуры и функции как параметры недо- пустимы. Компилятор занимает примерно 12 К памяти и 4К занимает runtimes. Могут использоваться следующие управляющие ко- ды: ENTER - ввод строки; DELETE - удаление символа; EDIT - возврат в редактор; CS+8 - переход к следующей позиции та- буляции; CS+5 - удаление всей строки; CHR(16) - переключатель экран/принтер. После загрузки HPЧT на экране появится вопрос: TOP of RAM? Вы должны ввести либо целое десятичное число (<=65536) или сразу нажать ENTER. Если введено число, то оно используется в качестве последнего адреса RAM+1, в противном случае вершина RAM вычисляется автоматически. На этот адрес устанавли- вается стек компилятора (т.о. можно ре- зервировать RAM для каких-либо целей; RAMTOP<65536). В ZX-SPECTRUM вершина RAM является начальным адресом для UDG. Пос- ле нажатия ENTER HP4T задаст следующий вопрос: TOP of RAM for "T"? В ответ Вы можете ввести либо десятич- ное число, либо использовать ранее опре- деленное значение TOP of RAM. То, что Вы введете будет использовано как стек при выполнении объектного кода после команды "T" редактора. После этого HPЧT Вас спросит: Table size ? То, что Вы введете будет рассматри- ваться как объем памяти, используемой под таблицу символов. Если сразу нажать ENTER, то table size: = доступное RAM/16 (как правило, этого более чем достаточ- но). Если перед числом ввести символ E, то встроенный редактор станет недоступ- ным. Эта процедура полезна при использо- вании внешнего редактора Часть 2 Компиляция и запуск в работу Компилятор генерирует листинг вида: хххх nnnn исходный текст строки. где хххх - адрес начала кода, генери- руемого этой строкой, nnnn - номер стро- ки. Если длина строки больше 8O символов, компилятор вставляет символ "новая стро- ка". Листинг может быть распечатан на принтере с помощью опции $P. Для приос- тановки вывода листинга необходимо на- жать CS+SPACE (BREAK). Если после этого нажать EDIT - возврат в редактор, при нажатии любой другой клавиши - продолже- ние вывода. Если при компиляции обнару- жены ошибки, то выводятся соответствую- щие сообщения и распечатка листинга при- останавливается. Если при этом ввести символ E - система переходит к редакти- рованию индицируемой строки, если ввести P, - к редактированию предыдущей строки. Часть 1. Синтаксис и семантика 1.1 Идентификаторы. Допустимая длина идентификатора не бо- лее 1O символов. Различаются маленькие и большие буквы. 1.2, 1.3. UNSIGNED INTEGER, UNSIGNED NUMBER Целые имеют абсолютную величину не бо- лее 32767. Числа с большим значением рассматриваются как REAL. Мантисса REAL имеет длину 23 бит (т.е. 7 значащих цифр). Результаты операций с REAL - приближенные; т.е. 2.OOOO2 - 2 <> O.OOOO2 . Максимальное число типа REAL равно 3.4E38, минимальное - 5.9E-39. Для повышения точности следует избегать лиш- них нулей; так O.OOO123456 представляет- ся менее точно, чем 1.23456E-4 ( O - то- же число, а их может быть не более 7). Допускается Нех представление числа при обозначении адресов RAM: #O3, #FF. 1.4 UNSIGNED CONSTANT оооооооооооооооооооооооо ооооооооо consnant identifier ооооооооо о оооооооооооооооооооооооо о о оооооооооооооооооооооооо о ооооооооо unsigned number ооооооооо о оооооооооооооооооооооооо о о оооооооооооооооооооооооо о оооооооо NIL ооооооооо о оооооооооооооооооооооооо о о оооооооооооооооооооооооо о ооооооооо character ооооооооо оооооооооооооооооооооооо Отметим, что строки не могут содержать более 255 символов. Cтроковым типом яв- ляется ARRAY [1..N] OF CHAR, где N - це- лое O-255 включительно. Литеральные строки не должны содержать символ EOL (CHR(13)) - в противном случае система генерирует *ERROR* 68. Символ null реа- лизован не как '', а как CHR (O). 1.5. CONSTANT Допускается использование управляющих кодов дисплея в качестве констант: CONST bs=CHR(1O); сг=CHR(13); 1.6. SIMPLE ТУРЕ ооооооооооооооооооооооо ооооооооо туре identifier ооооооооо о ооооооооооооооооооооооо о о ооооооооооооооооооооооо о ооооооооо identifier ооооооооо о ооооооооооооооооооооооо о о ооооооооооооооооооооооо о оооооооо .. ооооооооо ооооооооооооооооооооооо Тип, определенный как (identifier, identifier,....) может иметь не более 255 элементов. 1.7. ТУРЕ Зарезервированное слово PACKED допус- тимо, но игнорируется т.к. массивы уже упакованы. 1.7.1 ARRAYs & SETs Базовый тип SET может иметь до 256 элементов. Допускаются массивы массивов, массивы множеств, записи с полями типа множество и т.п. В HPЧT используется эк- вивалентность имен, а не типов, следова- тельно: ТУРЕ tabela=ARRAY [1..1OO] OF INTEGER; tabelb=ARRAY [1..1OO] OF INTEGER; переменной tabela не может быть прис- воено значение переменной tabelb т.к. они имеют разный тип. ТУРЕ tabel=ARRAY [1..1OO] OF INTEGER; VAR tabela, tabelb : tabel; в этом случае переменные tabela и та- belb имеют одинаковый тип, т.е. присвое- ние tabela=tabelb не вызовет ошибки. 1.7.2. POINTERs Имеются некоторые ограничения на ис- пользование указателей: а) не допускаются указатели на необъ- явленный тип. Это не относится к конс- трукциям типа: ТУРЕ item=RECORD value:INTEGER; next:eitem END; linK=eitem; б) не допускается указатель на указа- тель; в) указатели одного типа считаются эк- вивалентными, т.е.: VAR first:linK; current:eitem; г) определена константа NIL. 1.7.4. RECORDs Допускается ключевое слово WITH для более компактного обращения к полям за- писи. 1.7.5. FIELD LIST 1.9. VARIABLE Если переменная объявлена как ARRAY [1..1O] OF ARRAY [1..1O] OF INTEGER, то для доступа к элементу (1,1) этого мас- сива можно использовать: а[1][1] или а[1,1]. 1.1O. FACTOR 1.11. TERM Нижняя граница множеств всегда равна O, а размер множества всегда равен мак- симальному размеру базового типа. T.о. SET OF CHAR всегда занимает 32 байта (возможны 255 элементов по биту на эле- мент), SET OF O..1O эквивалентно SET OF O..255. 1.12. SIMPLE EXPRESSION 1.13. EXPRESSION 1.14. PARAMETER LIST 1.15. STATEMENT CASE оператор; Нулевой CASE-список не допускается, т.е. CASE OF END генерирует ошибку *ERROR*13. Оператор ELSE выполня- ется, если селектор (список выражений) не обнаружен в списке констант. Если ис- пользован ограничитель END и селектор не обнаружен, то управление передается на оператор, стоящий после END. FOR оператор; Управляющая переменная оператора FOR не может быть структурной переменой или параметром. GOTO оператор; Переход по GOTO возмо- жен только в пределах того же блока, где используется оператор GOTO и на том же уровне. Метка должна быть объявлена в том же блоке, где она используется. Мет- ка может содержать от 1 до 4 цифр. Опе- ратор GOTO не может быть использован для выхода из циклов FOR ... DO, процедур или функций. 1.16. BLOCK Использование процедур и функций перед их определением Процедуры и функции могут быть исполь- зованы перед их определением : PROCEDURE а(y:т); FORWARD; PROCEDURE в(х:т); BEGIN ... а(р); ... END; PROCEDURE а; BEGIN ... в(р) ... END. Часть 2. Предопределенные идентификаторы 12.1. Константы MAXINT - максимальное целое 32767. TRUE, FALSE - булевские константы. 12.2 Типы INTEGER REAL CHAR BOOLEAN 12.3 Процедуры и функции 12.3.1 Процедуры ввода/вывода 2.3.1.1 WRITE (е) - вывод 8-битового значения выражения на экран или принтер. CHR(8) - (CTRL H) возврат курсора на шаг назад (BACKSPACE); CHR(12)- (CTRL L) очистка экрана или новая страница принтере; CHR(13)- (CTRL M) возврат каретки и новая строка; CHR(16)- (CTRL P) переключатель вывода экран/принтер; WRITE (р1,р2,...,рп) эквивалентно: BOOLEAN 12.3 Процедуры и функции 12.3.1 Процедуры ввода/вывода 2.3.1.1 WRITE (е) - вывод 8-битового значения выражения на экран или принтер. CHR(8) - (CTRL H) возврат курсора на шаг назад (BACKSPACE); CHR(12)- (CTRL L) очистка экрана или новая страница принтере; CHR(13)- (CTRL M) возврат каретки и новая строка; CHR(16)- (CTRL P) переключатель вывода экран/принтер; WRITE (р1,р2,...,рп) эквивалентно: BEGIN WRITE (р1); WRITE(р2); ... ; WRITE(рп) END; Параметры р1,р2,...,рп могут иметь один из следующих форматов: (е) или (е:м) или (е:м:n) или (е:м:H); где е,м,n - выражения ; H - символьная константа. Рассмотрим 5 случаев: 1) е имеет тип INTEGER: используется формат (е) или (е:м): значение выражения е преобразуется к типу character string с последующими пробелами. Длина строки может быть увеличена (с лидирующими про- белами) при использовании параметра м, определяющего общее число символов, ко- торые должны быть выведены; 2) е имеет тип INTEGER и использован формат (е:м:H); в этом случае е выводит- ся в шестнадцатиричном виде. Если м=1 или м=2, то выводится значение ( е MOD 16^м ) длиной не более м символов. Если м=3 или м=4, то выводится полное значе- ние выражения е длиной не более 4 симво- лов. Если м>4, то перед числом вставля- ются пробелы. Пример WRITE (1O25:м:H); если м=1, то выводится 1 м=2, O1 м=3, OЧO1 м=4, OЧO1 м=5, OЧO1. 3) е имеет тип REAL, формат (е), (е:м) или (е:м:n); значение е преобразуется в строку символов, представляющую собой число типа REAL. Форма представления оп- ределяется n. Если n отсутствует, то число выводится в "научной" форме, т.е. с мантиссой и экспонентой. Минимальная длина "научного" представления равна 8 символам, если величина м<8, то всегда будет выводиться полная длина 12 симво- лов (если число отрицательное). WRITE (-1.23E1O:м); если м=7, то будет выведено -1.23OOOE+1O м=8 -1.2E+1O м=9 -1.23E+1O м=1O -1.23OE+1O м=11 -1.23OOE+1O м=12 -1.23OOOE+1O м=13 -1.23OOOE+1O Eсли использован формат (е:n:м), то число е будет выводиться с фиксированной точкой, а n будет определять число выво- димых знаков после запятой. Eсли n=O, то число е будет выведено в виде inтеgеr. Eсли е значительно больше определяемого формата, то оно выводится в "научном" виде. WRITE(1E2:6:2) 1OO.O WRITE(1E2:8:2) 1OO.OO WRITE(23.455:6:1) 23.5 WRITE(23.455:4:2) 2.34SSOE+O1 WRITE(23.455:4:O) 23 4) е имеет тип CHAR или string; выво- дится либо один символ, либо м символов с лидирующими пробелами, если это необ- ходимо. 5) е имеет тип BOOLEAN. 2.3.1.2. WRITELN WRITELN дает новую строку, что эквива- лентно WRITE(CHR(13)). WRITELN (р1,р2,...,рп); эквивалентно : BEGIN WRITE(р1,р2,...,рп); WRITELN END; 2.3.1.3. PAGE Процедура PAGE эквивалентна WRI- TE(CHR(12)), т.е. очистка экрана или но- вая страница принтера. 2.3.1.4. READ READ - ввод данных с клавиатуры. Ввод осуществляется через буфер, который из- начально содержит только символ EOL. Доступ к буферу осуществляется через текстовое окно размером в один символ. Если текстовое окно указывает на EOL-маркер, то перед окончанием операции ввода в буфер будет введена новая строка с клавиатуры. Рассмотрим процедуру READ(V) при раз- личных типах V: 1) V имеет тип CHAR: В этом случае READ(V) просто считывает символ из буфера ввода и присваивает его V. Если текстовое окно в буфере установ- лено на маркер EOL (символ CHR(13)), то функция EOLN будет возвращать значение TRUE и с клавиатуры будет считываться новая строка текста. При повторном вы- полнении процедуры read, текстовое окно будет установлено на начало новой стро- ки. Отметим, что EOLN=TRUE в начале прог- раммы. Это означает, что если переменная в первом READ имеет тип CHAR, то проце- дура READ возвратит значение CHR(13) с последующим вводом новой строки с клави- атуры; последующее выполнение READ типа CHAR будет возвращать первый символ этой новой строки. 2) V имеет тип string: Процедурой READ могут быть считаны строки длиной, опре- деленной ранее типом string или до EOLN=TRUE. Если признак EOLN установлен до окончания ввода всех символов строки, количество которых определено типом string, то строка будет дополнена до полной длины символами CHR(O). Обратите внимание на замечание к п. 1). 3) V имеет тип INTEGER: Максимальное число, которое может быть введено в этом случае, равно 32767. 2.3.1.5. READLN READLN (v1, v2, ... , vn); эквивалентно BEGIN READ(v1, v2, ... , vn); READLN END READLN просто считывает новый буфер с клавиатуры. T.о., после выполнения RE- ADLN EOLN становится равным FALSE, если следующая строка не пустая. READLN может быть использован для про- пуска пустой строки в начале выполнения объектного кода. Это полезно, если Вы желаете считать символ типа CHAR в нача- ле программы, но не обязательно, если Вы вводите символ типа integer или real или символ из последующей строки. 12.3.2. Функции ввода. 2.3.2.1. EOLN Функция EOLN является булевой функцией и возвращает значение TRUE, если следую- щим вводимым символом является EOL-сим- вол. В противном случае EOLN=FALSE. 2.3.2.2. INCH Функция сканирования клавиатуры. Если ни одна из клавиш не нажата, то функция возвращает значение CHR(O), в противном случае - символ типа CHAR, соответствую- щий коду нажатой клавиши. 12.3.3 Функции преобразования 2.3.3.1. TRUNC(X): TRUNC(-1.5) = -1; TRUNC(1.9) = 1. 2.3.3.2. ROUND(X): ROUND(-6.5) = -6; ROUND(11.7) = 12; ROUND(-6.51)= -7; ROUND(23.5) = 24. 2.3.3.3. ENTIER(X): X должен иметь тип integer или real. Функция возвращает наибольшее целое число, которое меньше или равно X для любого X. ENTIER(-6.5) = -7; ENTI- ER(11.7) = 11. 2.3.3.4. ORD(X). 2.3.3.5. CHR(X). 12.3.4. Арифметические функции. ABS(X) = еХе; SQR(X) = X*X, результат того же типа, что и X; SQRT(X) = X, результат всегда типа ге- al; FRAC(X) = X-ENTIER(X), FRAC(1.5) = O.5, FRAC(-12.56) = O.44; SIN(X) = результат типа real, X в ра- дианах; COS(X); TAN(X); ARCTAN(X); EXP(X) = е^X, где е=2.71828; LN(X). 12.3.5. Другие функции. NEW(р); MARK(v1); сохранить состояние "кучи" в переменной v1; RELEASE(v1); очистить "кучу" от адре- са, указываемого переменной v1, и до конца; INLINE (с1, с2, с3 ... ), сп - Нех числа вида #XX; USER(V) вызов подпрограммы по адресу V. Для обозначения адреса, больше #7FFF (32767) необходимо использовать отрица- тельные значения: #COOO = (-16384). Подпрограмма должна заканчиваться коман- дой RET. HALT останов программы с выдачей сооб- щения: "Halt ат PC= хххх", где хххх - Нех адрес 3У в котором стоит HALT. РОКЕ(X,У) , X - адрес памяти типа IN- TEGER, V - выражение любого типа. PO- КЕ(#бOOO, "A") - в ячейку #бOOO записать #41. РОКЕ(-16384, 3.6E) - разместить OO ОВ 8O 7O по адресу #COOO. TOUT(name, start, size) - запись пере- менных на ленту. Первый параметр Name должен иметь тип ARRAY [1..8] OF CHAR. Size байт данных выводится на ленту на- чиная с адреса Start (оба параметра типа INTEGER) Можно использовать реальные Нех величины. TIN(name, start) - ввод с ленты (см. TOUT). TIN можно использовать для ввода текстов в массив типа CHAR. OUT(р,с) - значение параметра р типа INTEGER загружается в регистр ВС, сим- вольный параметр с загружается в регистр A , выполняется команда OUT (C), A про- цессора Z8O. 12.3.6. Другие функции RANDOM - генерация псевдослучайного числа O-255. Функция малоэффективна, це- лесообразнее в некоторых случаях исполь- зовать самописные подпрограммы; SUCC(X); PRED(X); ODD(X); ADDR(V) - V параметр любого типа, ре- зультат - адрес переменной V РЕЕК(X, T) X имеет тип INTEGER - адрес памяти, второй аргумент - тип результа- та. Если в 3У, начиная с #SOOO записано: 5O 61 73 63 61 6C, то: WRITE РЕЕК(#SOOO, ARRAY [1..6] OF CHAR) напечатает Pascal РЕЕК(#SOOO, CHAR) P РЕЕК(#SOOO, INTEGER) 24912 РЕЕК(#SOOO, REAL) 2.46227E+29 SIZE(V) - возвращает объем памяти в байтах, занимаемый переменной V. INP(р) = IN A, (C) of Z8O. Часть 3. Комментарии и опции компиляции. 3.2 Опции компиляции Опция L (по умолчанию L+) Контроль листинга L+ печать всего листинга L- печать только строк, содержащих ошибки Опция O (по умолчанию O+) Контроль переполнения. Все операции с числами типа real и * и / с числами in- teger всегда подвергаются проверке на переполнение. O+ производить контроль операций + и - над числами integer O- контроль не производить Опция C (по умолчанию C+) Контроль клавиатуры при выполнении объектного ко- да. Нажатие EDIT вызывает возврат в сис- тему с сообщением команды HALT. C- контроль отсутствует. Опция S (по умолчанию S+) S+ контроль переполнения стека при вы- зове процедур и функций. В случае пере- полнения стека выводится сообщение: "Out of RAM ат PC = хххх". Опция А (по умолчанию А+) Контроль границ массивов. В случае ошибки выдает- ся сообщение: "Index тоо high" или "In- dex тоо low". Опция I (по умолчанию I-) При выполнении операций сравнения >, <, >=, <= над 16-разрядными целыми чис- лами, если аргументы делятся на число >MAXINT=32767, то возникает переполне- ние. При этом результат сравнения стано- вится неверным. Для правильного сравне- ния таких величин необходимо использо- вать опцию I+. Аналогичная ситуация мо- жет возникнуть и с числами типа real при попытке деления на 3.4E. Опция P (используется без + и -) Пе- реключатель принтер/экран аналогичен CTRL P в IBM PC. Опция F После имени этой опции должно через пробел следовать 8-символьное имя файла (если имя < 8 символов, его допол- няют пробелами). При этом исходный текст программы из указанного файла вставляет- ся после строки, содержащей опцию F. (См. 4T версия 1.5) Часть 4. Встроенный редактор Команды редактора имеют вид: C N1,N2,S1,S2 ; C - выполняемая команда, N1,N2 - числа от 1 до 32767, S1,S2 - строки до 2O символов. Редактор хранит значения параметров, использованных в предыдущих командах, т.о. в ряде случаев параметры можно опускать. Если длины строк S1 и S2 пре- вышают 2O символов, то лишние символы игнорируются. Параметры, указанные далее в ( ) , должны присутствовать обязатель- но. Команда: I n,м Режим автонумерации строк, выход из режима - CS+1 (EDIT). Команда: L n,м Распечатка текста ис- ходного файла со строки n до строки м порциями, которые могут быть изменены командой 'К'. При нажатии EDIT - выход в редактор. Команда: К n Установка порции вывода по команде L. n - число строк в порции. Команда: D (n,м) Удаление строк начи- ная от n до м. Команда: M n,м Пересылка строки с но- мером n в строку с номером м. При этом строка с номером n стирается, а содержи- мое строки м заменяется на содержимое строки n. Команда: N (n,м) Перенумерация тексто- вого файла: первая строка получает номер n, шаг нумерации м. Команда: F n,м,f,s В исходном файле между строками n и м производится поиск текста f. При его обнаружении найденная строка отображается на экране и система переходит в режим Edit. После этого, ис- пользуя команды режима Edit , можно про- должить поиск текста f или заменить най- денный текст f на текст s и далее про- должить поиск. Отметим, что строки f и s могут быть определены ранее другими ко- мандами. Команда: E n Включение режима редакти- рования Edit. Подкоманды: пробел - увеличение текстового указа- теля на +1, DELETE - уменьшение текстового указа- теля на -1, CS+8 - табуляция, ENTER - конец редактирования с сохра- нением внесенных изменений, Q - выход из редактирования. Строка остается без изменений, R - перезагрузка буфера редактирова- ния, т.е. удаление всех изменений и пов- торное редактирование строки, L - печать оставшейся части строки (за текстовым указателем) и повторное редак- тирование, К - удаление символа в позиции указа- теля, Z - удаление всех символов от позиции указателя включительно и до конца стро- ки, F - поиск следующей строки, содержащей текст f, определенный ранее в команде F, S - замена ранее определенным текстом s текста f и автоматическое выполнение подкоманды "F", т.е. поиск следующей строки, содержащей f. Необходимо отметить, что в данной вер- сии подкоманда "S" должна выполняться непосредственно после команды "F" или подкоманд "F" или "S", I - вставка символа в текущую позицию указателя. Режим сохраняется до нажатия клавиши ENTER. Допускается использование DELETE и CS+8 (удаление и табуляция), X - установка текстового указателя в конец строки. Команды обмена с магнитофоном Команда: P n,м,s запись на ленту строк n-м исходного текста с именем s, Команда: G,,s n чтение с ленты файла с именем s. если некоторый текст уже су- ществует в памяти, то вводимый с ленты текст пристыкуется к имеющемуся и весь файл пронумеруется с шагом 1. Для преры- вания ввода можно использовать BREAK. Компиляция и запуск в работу Команда: C n компиляция со строки n, Команда: R выполнение ранее скомпили- рованного объектного кода, хранящегося в буфере, Команда: T n команда трансляции. Ис- ходный текст компилируется начиная со строки n и, в случае успешной компиля- ции, система выводит вопрос "ОК?". При ответе "У" объектный код, произведенный при компиляции, пересылается в конец runtimes (разрушая при этом компилятор), а затем runtimes и объектный код выво- дятся на ленту с именем, определенным ранее в качестве параметра f. После это- го файл f можно загрузить в память ис- пользуя команду LOAD"". Другие команды Команда: В выход в Basic, Команда: O n,м преобразование исходно- го текста, подготовленного в другом ре- дакторе HPЧT, в формат, принятый в HI- SOFT HPЧT, Команда: S,,d изменение разделителя параметров на d. Пробел в качестве раз- делителя не допускается. ПРИЛОЖЕНИЕ 1. Сообщения об ошибках 1. Число слишком велико. 2. Ожидалось ";". 3. Hеобъявленный идентификатор. 4. Ожидался идентификатор. 5. Используйте в объявлении констант не ":=", а "=". 6. Ожидалось "=". 7. Выражение не может начинаться этим идентификатором. 8. Ожидалось ":=". 9. Ожидалось ")". 1O. Ошибочный тип. 11. Ожидалось ".". 12. Ожидался фактор. 13. Oжидалась константа. 14. Этот идентификатор не константа. 15. Ожидалось "THEN". 16. Ожидалось "DO". 17. Ожидалось "TO" или "DOWNTO". 18. Ожидалось "(". 19. Нельзя вывести этот тип выражения. 2O. Ожидалось "OF". 21. Ожидалось ",". 22. Ожидалось ":". 23. Ожидалось "PROGRAM". 24. Oжидалась переменная, т.к. пара- метр является параметром-переменной. 25. Ожидалось "BEGIN". 26. В вызове READ ожидалась перемен- ная. 27. Нельзя сравнивать выражения этого типа. 28. Должен быть тип INTEGER или REAL. 29. Невозможно считать этот тип пере- менных. 3O. Этот идентификатор не является ти- пом. 31. В числе real ожидалась экспонента. 32. Ожидалось скалярное выражение (не числовое). 33. Пустая строка недопустима (исполь- зуйте снг(O) ). 34. Ожидалось "[". 35. Ожидалось "]". 36. Индекс массива должен иметь ска- лярный тип. 37. Ожидалось "..". 38. Ожидалось "]" или "," в объявлении ARRAY. 39. Нижняя граница больше верхней. 4O. Множество слишком велико (больше 255 элементов). 41. Результатом функции должен быть идентификатор типа. 42. В множестве ожидалось "," или "]". 43. В множестве ожидалось ".." или "," или "]". 44. Тип параметра должен быть иденти- фикатором типа. 45. Пустое множество не может быть первым фактором в операторе. 46. Oжидалась скалярная величина, включая real. 47. Oжидалась скалярная величина, иск- лючая real. 48. Множества несовместимы. 49. "<" или ">" не могут использовать- ся для сравнения множеств. 5O. Ожидались "FORWARD", "LABEL", "CONST", "VAR", "ТУРЕ" или "BEGIN". 51. Ожидалось Нех число. 52. Нельзя применять РОКЕ ко множест- вам. 53. Массив слишком велик (>64К). 54. В определении "RECORD" ожидались "END" или ";". 55. Ожидался идентификатор поля. 56. После "WITH" ожидалась переменная. 57. Переменная в "WITH" должна иметь тип "RECORD". 58. Идентификатор поля не был связан с оператором "WITH". 59. После "LABEL" ожидалось целое без знака. 6O. После "GOTO" ожидалось целое без знака. 61. Метка на ошибочном уровне. 62. Необъявленная метка. 63. Параметром "SIZE" должна быть пе- ременная. 64. Для указателей может использовать- ся только проверка на равенство. 67. Только выводимый параметр для це- лых с двумя ":" имеет форму е:м:H. 68. Строка не может содержать символ EOL. Приложение 3. Представление данных в 3У. 13.1. Представление данных 13.1.1. Целые Целые занимают в памяти 2 байта. 1 -- #OOO1 256 -- #O1OO -256 -- #FFOO Для операций с целыми используется ре- гистр HL. 13.1.2. Символьные, булевские и другие скалярные. Занимают по 1 байту в памяти. TRUE имеет значение 1, а FALSE - O. Для операций с этими типами используется регистр А. 13.1.3. REAL. Вещественные хранятся в форме мантис- са-порядок в 4х байтах. Для операций над вещественными числами используются ре- гистры DE и HL. D - для хранения поряд- ка, E,H,L - для хранения мантиссы, стар- ший разряд регистра H - для хранения знака числа. T.о.: 2 = O1OOOOOO OOOOOOOO OOOOOOOO OOOOOOO1 = #4O #OO #OO #O1 1 = O1OOOOOO OOOOOOOO OOOOOOOO OOOOOOOO = #4O #OO #OO #OO -12.5 = 111OO1OO OOOOOOOO OOOOOOOO OOOOOO11 = #E4 #OO #OO #O3 O.1 = O11OO11O O11OO11O O11OO11O 111111OO = #66 #66 #66 #FC H L E D 13.1.4. Записи и массивы. Записи занимают в памяти пространство, равное сумме их компонент. Массивы зани- мают N*S байт, где N - размерность мас- сива, S - число байт, занимаемое одним элементом. 13.1.5. Множества. Множества хранятся в виде битовых строк и, если базовый тип имеет N эле- ментов, то число занимаемых байт равно: (N-1) DIV (8+1), т. е. SET OF CHAR зай- мет 256-1 DIV 8+1 = 32 байта. SET OF (BLUE, GREEN, YELLOW) - 3-1 DIV 8+1 = 1 байт. 13.1.6. Указатели. Указатели занимают 2 байта памяти, со- держащих адрес переменной (младший байт первый). 13.2. Хранение переменных в Runtimes 13.2.1 Глобальные переменные хранятся, начиная от "макушки" стека runtimes вниз, т.е. если стек начинается с #BOOO и глобальными переменными являются: VAR i:INTEGER; сн:CHAR; х:REAL; то i расположится в AFFE-AFFF, сн AFFD, х AFF9-AFFC. Локальные переменные. К ним нет досту- па через стек. Вместо этого в начале каждого внутреннего блока устанавливает- ся регистр IX так, чтобы (IX-4) указыва- ло на начало блока локальных переменных. T.о., если: PROCEDURE test; VAR i,j:INTEGER; то i будет находиться в IX-4-2 и IX-4-1, т.е. в IX-6, IX-5, j IX-8 и IX-7. 13.2.3. Параметры и возвращаемые зна- чения Параметры-значения трактуются как ло- кальные переменные и, как и эти перемен- ные, занимают старшие адреса памяти. Од- нако, в отличие от переменных, в (IX+2) фиксируется младший адрес, а не вершина области. Если: PROCEDURE test (i:REAL; j:INTEGER); то j (располагается первым) будет на- ходиться в IX+2 и IX+3, а i от IX+4 до IX+7. Параметры-переменные рассматриваются также, как и параметры-значения, с той лишь разницей, что первые занимает 2 байта памяти, хранящих адреса этих пере- менных. Если: PROCEDURE test (i:INTEGER; VAR х:REAL); то ссылка на х размещается в IX+2 и IX+3 (эти ячейки содержат адрес перемен- ной х), а i - в IX+4, IX+5. Возвращаемые значения размещаются над первым параметром. FUNCTION test (i:INTEGER):REAL; i разместится в IX+2 , IX+3, а ячейки с IX+4 по IX+7 зарезервируются под возв- ращаемое значение. Реализация HISOFT PASCAL 4T на 48К ZX-SPECTRUM. Нельзя использовать одиночные символы <=, <>, >=, а только комбинации <, > и =. Управление осуществляется только вре- менными атрибутами знакомест посредством стандартных управляющих кодов (WRITE(CHR (17), WRITE(CHR(4) - зеленый "paper"); нельзя изменять постоянные атрибуты. Вместе с объектным кодом всегда авто- матически записывается загрузчик. Если Вы использовали команду "T" для записи объектного кода и runtimes на ленту, то для запуска кода в работу достаточно вы- полнить LOAD "" . После окончания работы кода его можно запустить повторно, введя GOTO 7. Если Вы вышли из Паскаля по команде "В" ,для возврата в редактор введите GO- TO 9 ("теплый" старт с сохранением ис- ходного текста) или GOTO 12 ("холодный" старт с инициализацией). Для установки цвета INK используйте CHR(15). PRODUCT APPLICATION NOTE PS1.1 Звук и графика ZX-SPECTRUM в Паскале 4T 1. Звук (см. пакет MPACK к HP8O). Пример: ВЕЕР(262,O.5) ; ВЕЕР(O,1) - генерация среднего До в течение O,5 сек., затем пауза на 1 сек. 2. Графика (см. пакет MPACK). 3. Вывод через системное ROM. Существуют ситуации, когда полезно осуществлять вывод через системную точку входа RST #1O. К примеру, при использо- вании управляющего кода PRINT AT, за ко- торым должны следовать 8-битные значения X и У. Однако с помощью оператора WRITE определенные значения вывести невозможно (к примеру, код 8 соответствует BACKSPA- CE (DELETE)). Для этого целесообразно использовать процедуру SPOUT (C:CHAR). Использование графического пакета TURTLE Пакет по команде G,,TURTLE присоединя- ется к любой программе (отметим, однако, что для нормальной работы пакет должен быть снабжен PROGRAM-заголовком и VAR-декларацией, ТУРЕ, CONST и LABEL объявлять необязательно. Кроме того, программа не должна содержать предвари- тельно объявленных процедур и функций.). Информация о "черепашке" хранится в гло- бальных переменных. Глобальные переменные HEADING Используется для хранения углового значения направления, в котором в данный момент ориентирована "черепашка". Прини- мает значения REAL в градусах и может быть установлена в O процедурой TURTLE. Значение O соответствует Востоку. XCOR, YCOR Хранят текущие координаты (X,У) "чере- пашки". Имеют тип REAL и изначально рав- ны 127 и 87 соответственно. PENSTATUS Имеет тип INTEGER. Используется для хранения состояния "пера"; O - "перо" опущено, 1 - поднято. Процедуры INK (C:INTEGER), C = O - 8; PAPER (C:INTEGER), C = O - 8; COPY - копирование экрана на принтер; PENDOWN (C:INTEGER) - перевод "чере- пашки" в состояние, при котором она при движении будет оставлять след цветом C. PENUP - процедура, обратная PENDOWN. (Обе процедуры устанавливают переменную PENSTATUS) SETHD (A:REAL) - назначает параметр типа REAL глобальной переменной HEADING, т.е. устанавливает направление движения. O -East, 9O-North, 18O-West, 27O-South. T.е. против часовой стрелки. SETXY (X,У:REAL) - Устанавливает абсо- лютную позицию "черепахи". FWD (L:REAL) - Двигает "черепаху" впе- ред на L единиц в направлении , опреде- ляемом переменной HEADING. BACK (L:REAL) - Двигает "черепаху" на- зад на L единиц (обратна FWD). TURN (A:REAL) - Поворот головы "чере- пахи" на А градусов. Увеличение А соот- ветствует повороту против часовой стрел- ки. VECTOR (A,L:REAL) - Смещает позицию "черепахи" на L единиц в направлении A. После перемещения голова остается в А-направлении. RIGHT (A:REAL) LEFT (A:REAL) - Поворот головы "чере- пахи" вправо/влево на А градусов. ARCR (R:REAL, A:INTEGER) - "Черепаха" идет по дуге окружности размером R, дли- на дуги определена в А. "Черепаха" идет по часовой стрелке. Обычно R = до O.5. TURTLE - Инициализация глобальных пе- ременных. Пример программы Отметим, что пакет TURTLE размещается, начиная со строки 1O и заканчивается строкой 135O. 1. Круги 1 PROGRAM CIRCLES; 2 VAR I:INTEGER; 136O BEGIN 137O TURTLE; 138O FOR I:=1 TO 9 DO 139O BEGIN 1ЧOO ARCR (O.5,36O); 141O RIGHT (4O) 142O END 143O END. 2. Спирали 1 PROGRAM SPIRALS ; 2 VAR 136O PROCEDURE SPIRALS (L,A:REAL); 137O BEGIN 138O FWD(L); 139O RIGHT(A); 1ЧOO SPIRALS(L+1,A) 141O END; 142O BEGIN 143O TURTLE; 144O SPIRALS (9,95) или (9,9O) или (9, 121)... Ошибки в TURTLE Строка 57O USER(#EAC) должна быть из- менена: INLINE (#FD, #21, #3A, #5C, #FD, #СВ, 1, #CE, #CD, #AC, #E, #FD, #СВ, 1, #8, #F3); Pascal 4T Version 5 (с 1 Апреля 1983 г.) 1. Функции могут возвращать значения POINTER (указатели); 2. Исправлена ошибка в NEW; 3. Новый редактор; добавлена команда V без аргументов, которая выдает значения разделителя, line range, Find и Substi- тите строк; 4 Реализована опция $F ("Include"). Если Вы хотите ее использовать, то ис- ходный текст, который предполагается "подкачивать", должен быть выведен на ленту с помощью команды W. W работает аналогично команде P, за исключением то- го, что по W информация выводится не в HPЧT формате и запись начинается сразу после окончания набора команды. Текст, записанный по W, командой G,, считать нельзя. Пример: W 5O,12O,PLOT - запись процедуры PLOT. Для включения PLOT: 1OO END; 11O 12O ($F PLOT) - "включение" процедуры plot; 13O 14O PROCEDURE MORE; - оставшаяся часть программы. зовать процедуру SPOUT (C:CHAR). Использование графического пакета TURTLE W 5O,12O,PLOT - запись процедуры PLOT. Для включения PLOT: 1OO END; 11O 12O ($F PLOT) - "включение" процедуры plot; 13O 14O PROCEDURE MORE; - оставшаяся часть программы. зовать процедуру SPOUT (C:CHAR). Использование графического пакета TURTLE Пакет по команде G,,TURTLE присоединя- ется к любой программе (отметим, однако, что для нормальной работы пакет должен быть снабжен PROGRAM