HISOFT PASCAL4 - VERSION 1.4 31. Oct. 1982 Тип FILE неопределен. Тип RECORD не может иметь вариантов. Процедуры и функции как параметры недопустимы. Компилятор занимает примерно 12 К памяти и 4К занимает runtimes. Могут использоваться следующие управляющие коды: ENTER - ввод строки; DELETE - удаление символа; EDIT - возврат в редактор; CS+8 - переход к следующей позиции табуляции; CS+5 - удаление всей строки; CHR(16) - переключатель экран/принтер. После загрузки HP4T на экране появится вопрос: 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' редактора. После этого HP4T Вас спросит: Table size ? То, что Вы введете будет рассматриваться как объем памяти, используемой под таблицу символов. Если сразу нажать ENTER, то table size := доступное RAM/16 (как правило, этого более чем достаточно). Если перед числом ввести символ Е, то встроенный редактор станет недоступным. Эта процедура полезна при использовании внешнего редактора Компиляция и запуск в работу Компилятор генерирует листинг вида: хххх nnnn исходный текст строки. где хххх - адрес начала кода, генерируемого этой строкой, nnnn - номер строки. Если длина строки больше 80 символов, компилятор вставляет символ 'новая строка'. Листинг может быть распечатан на принтере с помощью опции $Р. Для приостановки вывода листинга необходимо нажать CS+SPACE (BREAK). Если после этого нажать EDIT - возврат в редактор, при нажатии любой другой клавиши - продолжение вывода. Если при компиляции обнаружены ошибки, то выводятся соответствующие сообщения и распечатка листинга приостанавливается. Если при этом ввести символ Е - система переходит к редактированию индицируемой строки, если ввести Р, - к редактированию предыдущей строки. Синтаксис и семантика 1.1 Идентификаторы. Допустимая длина идентификатора не более 10 символов. Различаются маленькие и большие буквы. 1.2, 1.3. UNSIGNED INTEGER, UNSIGNED NUMBER Целые имеют абсолютную величину не более 32767. Числа с большим значением рассматриваются как REAL. Мантисса REAL имеет длину 23 бит (т.е. 7 значащих цифр). Результаты операций с REAL - приблеженные; т.е. 2.00002 - 2 <> 0.00002 . Максимальное число типа REAL равно 3.4Е38, минимальное - 5.9Е-39. Для повышения точности следует избегать лишних нулей; так 0.000123456 представляется менее точно, чем 1.23456Е-4 ( 0 - тоже число, а их может быть не более 7). Допускается Hex представление числа при обозначении адресов RAM: #03, #FF. 1.4 UNSIGNED CONSTANT ----------------------¬ -------T-------+ consnant identifier +-----T----------------------- ¦ L---------------------- ¦ ¦ ----------------------¬ ¦ +-------+ unsigned number +-----+ ¦ L---------------------- ¦ ¦ ¦ +------------ NIL -------------+ ¦ ¦ ¦ ¦ L-- , ----- character ---- , ---- Отметим, что строки не могут содержать более 255 символов. Строковым типом является ARRAY [1..N] OF CHAR, где N - целое 0-255 включительно. Литеральные строки не должны содержать символ EOL (CHR(13)) - в противном случае система генерирует *ERROR* 68. Символ null реализован не как '', а как CHR (0). 1.5. CONSTANT Допускается использование управляющих кодов дисплея в качестве констант: CONST bs=CHR(10); cr=CHR(13); 1.6. SIMPLE TYPE ----------------------¬ -------T-------+ type identifier +--------T--------------------- ¦ L---------------------- ¦ ¦ ----------------------¬ ¦ +- ( -T-+ identifier +-T ) ---+ ¦ ¦ L---------------------- ¦ ¦ ¦ L---------- , ------------- ¦ ¦ ¦ ¦ ---------¬ ---------¬ ¦ L-+constant+--- .. ---+constant+------ L--------- L--------- Тип, определенный как (identifier, identifier,....) может иметь не более 255 элементов. 1.7. TYPE Зарезервированное слово PACKED допустимо, но игнорируется т.к. массивы уже упакованы. 1.7.1 ARRAYs & SETs Базовый тип SET может иметь до 256 элементов. Допускаются массивы массивов, массивы множеств, записи с полями типа множество и т.п. В HP4T используется эквивалентность имен, а не типов, следовательно: TYPE tabela=ARRAY [1..100] OF INTEGER; tabelb=ARRAY [1..100] OF INTEGER; переменной tabela не может быть присвоено значение переменной tabelb т.к. они имеют разный тип. TYPE tabel=ARRAY [1..100] OF INTEGER; VAR tabela, tabelb : tabel; в этом случае переменные tabela и tabelb имеют одинаковый тип, т.е. присвоение tabela=tabelb не вызовет ошибки. 1.7.2. POINTERs Имеются некоторые ограничения на использование указателей: а) недопускаются указатели на необъявленный тип. Это не относится к конструкциям типа: TYPE item=RECORD value:INTEGER; next:¦item END; link=¦item; б) недопускается указатель на указатель; в) указатели одного типа считаются эквивалентными, т.е.: VAR first:link; current:¦item; г) определена константа NIL. 1.7.4. RECORDs Допускается ключевое слово WITH для более компактного обращения к полям записи. 1.7.5. FIELD LIST 1.9. VARIABLE Если переменная объявлена как ARRAY [1..10] OF ARRAY [1..10] OF INTEGER, то для доступа к элементу (1,1) этого массива можно использовать: а[1][1] или а[1,1]. 1.10. FACTOR 1.11. TERM Нижняя граница множеств всегда равна 0, а размер множества всегда равен максимальному размеру базового типа. Т.о. SET OF CHAR всегда занимает 32 байта (возможны 255 элементов по биту на элемент), SET OF 0..10 эквивалентно SET OF 0..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 -1Использование процедур и функций перед их определением-0 Процедуры и функции могут быть использованы перед их определением : PROCEDURE a(y:t); FORWARD; PROCEDURE b(x:t); BEGIN ... a(p); ... END; PROCEDURE a; BEGIN ... b(p) ... END. Предопределенные идентификаторы 2.1. Константы MAXINT - максимальное целое 32767. TRUE, FALSE - булевские константы. 2.2 Типы INTEGER REAL CHAR BOOLEAN 2.3 Процедуры и функции 2.3.1 Процедуры ввода/вывода 2.3.1.1 WRITE (e) - вывод 8-битового значения выражения е на экран или принтер. CHR(8) - (CTRL H) возврат курсора на шаг назад (BACKSPACE); CHR(12)- (CTRL L) очистка экрана или новая страница принтере; CHR(13)- (CTRL M) возврат каретки и новая строка; CHR(16)- (CTRL P) переключатель вывода экран/принтер; WRITE (p1,p2,...,pn) эквивалентно: BEGIN WRITE (p1); WRITE(p2); ... ; WRITE(pn) END; Параметры p1,р2,...,рn могут иметь один из следующих форматов: {е} или {е:m} или {е:m:n} или {e:m:H}; где e,m,n - выражения ; H - символьная константа. Рассмотрим 5 случаев: 1) е имеет тип INTEGER: используется формат {e} или {e:m}: значение выражения е преобразуется к типу character string с последующими пробелами. Длина строки может быть увеличина (с лидирующими пробелами) при использовании параметра m, определяющего общее число символов, которые должны быть выведены; 2) е имеет тип INTEGER и использован формат {e:m:H}; в этом случае е выводится в шестнадцатиричном виде. Если m=1 или m=2, то выводится значение ( e MOD 16^m ) длиной не более m символов. Если m=3 или m=4, то выводится полное значение выражения е длиной не более 4 символов. Если m>4, то перед числом вставляются пробелы. Пример WRITE (1025:m:H); если m=1, то выводится 1 m=2, 01 m=3, 0401 m=4, 0401 m=5, 0401. 3) е имеет тип REAL, формат {e}, {e:m} или {e:m:n}; значение е преобразуется в строку символов, представляющую собой число типа REAL. Форма представления определяется n. Если n отсутствует, то число выводится в "научной" форме, т.е. с мантиссой и экспонентой. Минимальная длина "научного" представления равна 8 символам, если величина m<8, то всегда будет выводиться полная длина 12 символов (если число отрицательное). WRITE (-1.23Е10:m); если m=7, то будет выведено -1.23000Е+10 m=8 -1.2Е+10 m=9 -1.23Е+10 m=10 -1.230Е+10 m=11 -1.2300Е+10 m=12 -1.23000Е+10 m=13 -1.23000Е+10 Если использован формат {e:n:m}, то число е будет выводиться с фиксированной точкой, а n будет определять число выводимых знаков после запятой. Если n=0, то число е будет выведено в виде integer. Если е значительно больше определяемого формата, то оно выводится в "научном" виде. WRITE(1E2:6:2) 100.0 WRITE(1E2:8:2) 100.00 WRITE(23.455:6:1) 23.5 WRITE(23.455:4:2) 2.34550E+01 WRITE(23.455:4:0) 23 4) е имеет тип CHAR или string; выводится либо один символ, либо m символов с лидирующими пробелами, если это необходимо. 5) е имеет тип BOOLEAN. 2.3.1.2. WRITELN WRITELN дает новую строку, что эквивалентно WRITE(CHR(13)). WRITELN (p1,p2,...,pn); эквивалентно : BEGIN WRITE(p1,p2,...,pn); WRITELN END; 2.3.1.3. PAGE Процедура PAGE эквивалентна WRITE(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, текстовое окно будет установлено на начало новой строки. -1Отметим-0, что EOLN=TRUE в начале программы. Это означает, что если переменная в первом READ имеет тип CHAR, то процедура READ возвратит значение CHR(13) с последующим вводом новой строки с клавиатуры; последующее выполнение READ типа CHAR будет возвращать первый символ этой новой строки. 2) V имеет тип string: Процедурой READ могут быть считаны строки длиной, определенной ранее типом string или до EOLN=TRUE. Если признак EOLN установлен до окончания ввода всех символов строки, количество которых определено типом string, то строка будет дополнена до полной длины символами CHR(0). Обратите внимание на замечание к п. 1). 3) V имеет тип INTEGER: Максимальное число, которое может быть введено в этом случае, равно 32767. 2.3.1.5. READLN READLN (v1, v2, ... , vn); эквивалентно BEGIN READ(v1, v2, ... , vn); READLN END; READLN просто считывает новый буфер с клавиатуры. Т.о., после выполнения READLN EOLN становится равным FALSE , если следующая строка не пустая. READLN может быть использован для пропуска пустой строки в начале выполнения объектного кода. Это полезно, если Вы желаете считать символ типа CHAR в начале программы, но не обязательно, если Вы вводите символ типа integer или real или символ из последующей строки. 2.3.2. Функции ввода 2.3.2.1. EOLN Функция EOLN является булевой функцией и возвращает значение TRUE, если следующим вводимым символом является EOL-символ. В противном случае EOLN=FALSE. 2.3.2.2. INCH Функция сканирования клавиатуры. Если ни одна из клавиш не нажата, то функция возвращает значение CHR(0), в противном случае - символ типа CHAR, соответствующий коду нажатой клавиши. 2.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; ENTIER(11.7) = 11. 2.3.3.4. ORD(X). 2.3.3.5. CHR(X). 2.3.4. Арифметические функции ABS(X) = ¦X¦; SQR(X) = X*X, результат того же типа, что и X; SQRT(X) = X, результат всегда типа real; FRAC(X) = X-ENTIER(X), FRAC(1.5) = 0.5, FRAC(-12.56) = 0.44; SIN(X) , результат типа real, X в радианах; COS(X); TAN(X); ARCTAN(X); EXP(X) = e^X, где e=2.71828; LN(X). 2.3.5. Другие функции NEW(p); MARK(v1); сохранить состояние "кучи" в переменной v1; RELEASE(v1); очистить "кучу" от адреса, указываемого переменной v1, и до конца; INLINE (c1, c2, c3 ... ), сn - Hex числа вида #XX; USER(V) вызов подпрограммы по адресу V. Для обозначения адреса, больше #7FFF (32767) необходимо использовать отрицательные значения: #C000 = (-16384). Подпрограмма должна заканчиваться командой RET. HALT останов программы с выдачей сообщения: 'Halt at PC=xxxx', где хххх - Hex адрес ЗУ в котором стоит HALT. POKE(X,Y) , X - адрес памяти типа INTEGER, V - выражение любого типа. POKE(#6000, 'A') - в ячейку #6000 записать #41. POKE(-16384, 3.6E3) - разместить 00 0В 80 70 по адресу #С000. TOUT(name, start, size) - запись переменных на ленту. Первый параметр Name должен иметь тип ARRAY [1..8] OF CHAR. Size байт данных выводится на ленту начиная с адреса Start (оба параметра типа INTEGER) Можно использовать реальные Hex величины. TIN(name, start) - ввод с ленты (см. TOUT). TIN можно использовать для ввода текстов в массив типа CHAR. OUT(p,c) - значение параметра p типа INTEGER загружается в регистр BC, символьный параметр c загружается в регистр A , выполняется команда OUT (C), A процессора Z80. 2.3.6. Другие функции RANDOM - генерация псевдослучайного числа 0-255. Функция малоэффективна, целесообразнее в некоторых случаях использовать самописные подпрограммы; SUCC(X); PRED(X); ODD(X); ADDR(V) - V параметр любого типа, результат - адрес переменной V PEEK(X, T) X имеет тип INTEGER - адрес памяти, второй аргумент - тип результата. Если в ЗУ, начиная с #5000 записано: 50 61 73 63 61 6С, то: WRITE PEEK(#5000, ARRAY [1..6] OF CHAR) напечатает Pascal PEEK(#5000, CHAR) P PEEK(#5000, INTEGER) 24912 PEEK(#5000, REAL) 2.46227Е+29 SIZE(V) - возвращает объем памяти в байтах, занимаемый переменной V. INP(p) = IN A, (C) of Z80. Коментарии и опции компиляции. 3.2 Опции компиляции Опция L (по умолчанию L+) Контроль листинга L+ печать всего листинга L- печать только строк, содержащих ошибки Опция О (по умолчанию О+) Контроль переполнения. Все операции с числами типа real и * и / с числами integer всегда подвергаются проверке на переполнение. О+ производить контроль операций + и - над числами integer О- контроль не производить Опция С (по умолчанию С+) Контроль клавиатуры при выполнении объектного кода. Нажатие EDIT вызывает возврат в систему с сообщением команды HALT. С- контроль отсутствует. Опция S (по умолчанию S+) S+ контроль переполнения стека при вызове процедур и функций. В случае переполнения стека выводится сообщение: 'Out of RAM at PC = хххх'. Опция А (по умолчанию А+) Контроль границ массивов. В случае ошибки выдается сообщение: 'Index too high' или 'Index too low'. Опция I (по умолчанию I-) При выполнении операций сравнения >, <, >=, <= над 16-разрядными целыми числами, если аргументы делятся на число >MAXINT=32767, то возникает переполнение. При этом результат сравнения становится неверным. Для правильного сравнения таких величин необходимо использовать опцию I+. Аналогичная ситуация может возникнуть и с числами типа real при попытке деления на 3.4Е38. Опция Р (используется без + и -) Переключатель принтер/экран аналогичен CTRL P в IBM PC. Опция F После имени этой опции должно через пробел следовать 8-символьное имя файла (если имя < 8 символов, его дополняют пробелами). При этом исходный текст программы из указанного файла вставляется после строки, содержащей опцию F. (См. 4Т версия 1.5) Встроенный редактор Команды редактора имют вид: С N1,N2,S1,S2 ; C - выполняемая команда, N1,N2 - числа от 1 до 32767, S1,S2 - строки до 20 символов . Редактор хранит значения параметров, использованных в предыдущих командах, т.о. в ряде случаев параметры можно опускать. Если длины строк S1 и S2 превышают 20 символов, то лишние символы игнорируются. Параметры, указанные далее в { } , должны присутствовать обязательно. Команда: I n,m Режим автонумерации строк, выход из режима - CS+1 (EDIT). Команда: L n,m Распечатка текста исходного файла со строки n до строки m порциями, которые могут быть изменены командой 'К'. При нажатии EDIT - выход в редактор. Команда: К n Установка порции вывода по команде L. n - число строк в порции. Команда: D {n,m} Удаление строк начиная от n до m. Команда: M n,m Пересылка строки с номером n в строку с номером m. При этом строка с номером n стирается, а содержимое строки m заменяется на содержимое строки n. Команда: N {n,m} Перенумерация текстового файла: первая строка получает номер n, шаг нумерации m. Команда: F n,m,f,s В исходном файле между строками n и m производится поиск текста f. При его обнаружении найденная строка отображается на экране и система переходит в режим Edit. После этого, используя команды режима Edit , можно продолжить поиск текста f или заменить найденный текст f на текст s и далее продолжить поиск. Отметим, что строки f и s могут быть определены ранее другими командами. Команда: Е n Включение режима редактирования Edit. Подкоманды: пробел - увеличение текстового указателя на +1, DELETE - уменьшение текстового указателя на -1, CS+8 - табуляция, ENTER - конец редактирования с сохранением внесенных изменений, Q - выход из редактирования. Строка остается без изменений, R - перезагрузка буфера редактирования, т.е. удаление всех изменений и повторное редактирование строки, L - печать оставшейся части строки (за текстовым указателем) и повторное редактирование, K - удаление символа в позиции указателя, Z - удаление всех символов от позиции указателя включительно и до конца строки, F - поиск следующей строки, содержащей текст f, оределеный ранее в команде F, S - замена ранее определеным текстом s текста f и автоматическое выполнение подкоманды 'F', т.е. поиск следующей строки, содержащей f. -1Необходимо отметить-0, что в данной версии подкоманда 'S' должна выполняться непосредственно после команды 'F' или подкоманд 'F' или 'S', I - вставка символа в текущюу позицию указателя. Режим сохраняется до нажатия клавиши ENTER. Допускается использование DELETE и CS+8 (удаление и табуляция), X - установка текстового указателя в конец строки. Команды обмена с магнитофоном Команда: Р n,m,s запись на ленту строк n-m исходного текста с именем s, Команда: G,,s n чтение с ленты файла с именем s. если некоторый текст уже существует в памяти, то вводимый с ленты текст пристыкуется к имеющемуся и весь файл пронумеруется с шагом 1. Для прерывания ввода можно использовать BREAK. Компиляция и запуск в работу Команда: С n компиляция со строки n, Команда: R выполнение ранее скомпилированного объектного кода, хранящегося в буфере, Команда: T n команда трансляции. Исходный текст компилируется начиная со строки n и, в случае успешной компиляции, система выводит вопрос 'OK?'. При ответе 'Y' объектный код, произведенный при компиляции, пересылается в конец runtimes (разрушая при этом компилятор), а затем runtimes и объектный код выводятся на ленту с именем, определеным ранее в качестве параметра f. После этого файл f можно загрузить в память используя команду LOAD"". Другие команды Команда: В выход в Basic, Команда: О n,m преобразование исходного текста, подготовленного в другом редакторе HP4T, в формат, принятый в HISOFT HP4T, Команда: S,,d изменение разделителя параметров на d. Пробел в качестве разделителя не допускается. ПРИЛОЖЕНИЕ 1. Сообщения об ошибках 1. Число слишком велико. 2. Ожидалось ";". 3. Необъявленный идентификатор. 4. Ожидался идентификатор. 5. Используйте в объявлении констант не ":=", а "=". 6. Ожидалось "=". 7. Выражение не может начинаться этим идентификатором. 8. Ожидалось ":=". 9. Ожидалось ")". 10. Ошибочный тип. 11. Ожидалось ".". 12. Ожидался фактор. 13. Ожидалась константа. 14. Этот идентификатор не константа. 15. Ожидалось "THEN". 16. Ожидалось "DO". 17. Ожидалось "TO" или "DOWNTO". 18. Ожидалось "(". 19. Нельзя вывести этот тип выражения. 20. Ожидалось "OF". 21. Ожидалось ",". 22. Ожидалось ":". 23. Ожидалось "PROGRAM". 24. Ожидалась переменная, т.к. параметр является параметром-переменной. 25. Ожидалось "BEGIN". 26. В вызове READ ожидалась переменная. 27. Нельзя сравнивать выражения этого типа. 28. Должен быть тип INTEGER или REAL. 29. Невозможно считать этот тип переменных. 30. Этот идентификатор не является типом. 31. В числе real ожидалась экспонента. 32. Ожидалось скалярное выражение (не числовое). 33. Пустая строка недопустима (используйте chr(0) ). 34. Ожидалось "[". 35. Ожидалось "]". 36. Инденкс массива должен иметь скалярный тип. 37. Ожидалось "..". 38. Ожидалось "]" или "," в объявлении ARRAY. 39. Нижняя граница болше верхней. 40. Множество слишком велико (больше 255 элементов). 41. Результатом функции должен быть идентификатор типа. 42. В множестве ожидалось "," или "]". 43. В множестве ожидалось ".." или "," или "]". 44. Тип параметра должен быть идентификатором типа. 45. Пустое множество не может быть первым фактором в операторе. 46. Ожидалась скалярная величина, включая real. 47. Ожидалась скалярная величина, исключая real. 48. Множества несовместимы. 49. "<" или ">" не могут использоваться для сравнения множеств. 50. Ожидались "FORWARD", "LABEL", "CONST", "VAR", "TYPE" или "BEGIN". 51. Ожидалось Hex число. 52. Нельзя применять POKE ко множествам. 53. Массив слишком велик (>64К). 54. В определении "RECORD" ожидались "END" или ";". 55. Ожидался идентификатор поля. 56. После "WITH" ожидалась переменная. 57. Переменная в "WITH" должна иметь тип "RECORD". 58. Идентификатор поля не был связан с оператором "WITH". 59. После "LABEL" ожидалось целое без знака. 60. После "GOTO" ожидалось целое без знака. 61. Метка на ошибочном уровне. 62. Необъявленная метка. 63. Параметром "SIZE" должна быть переменная. 64. Для указателей может использоваться только проверка на равенство. 67. Только выводимый параметр для целых с двумя ":" имеет форму e:m:H. 68. Строка не может содержать символ EOL. Приложение 3. Представление данных в ЗУ. 3.1. Представление данных 3.1.1. Целые Целые занимают в памяти 2 байта. 1 -- #0001 256 -- #0100 -256 -- #FF00 Для операций с целыми используется регистр HL. 3.1.2. Символьные, булевские и другие скалярные. Занимают по 1 байту в памяти. TRUE имеет значение 1, а FALSE - 0. Для операций с этими типами используется регистр А. 3.1.3. REAL. Вещественные хранятся в форме мантисса-порядок в 4х байтах. Для операций над вещественными числами используются регистры DE и HL. D - для хранения порядка, E,H,L - для хранения мантиссы, старший разряд регистра H - для хранения знака числа. Т.О. : 2 = 01000000 00000000 00000000 00000001 = #40 #00 #00 #01 1 = 01000000 00000000 00000000 00000000 = #40 #00 #00 #00 -12.5 = 11100100 00000000 00000000 00000011 = #E4 #00 #00 #03 0.1 = 01100110 01100110 01100110 11111100 = #66 #66 #66 #FC H L E D 3.1.4. Записи и массивы. Записи занимают в памяти пространство, равное сумме их компонент. Массивы занимают N*S байт, где N - размерность массива, S - число байт, занимаемое одним элементом. 3.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 байт. 3.1.6. Указатели. Указатели занимают 2 байта памяти, содержащих адрес переменной ( младший байт первый). 3.2. Хранение переменных в Runtimes 3.2.1 Глобальные переменные хранятся, начиная от 'макушки' стека runtimes вниз, т.е. если стек начинается с #В000 и глобальными переменными являются: VAR i:INTEGER; ch:CHAR; x:REAL; то i расположится в AFFE-AFFF, ch AFFD, x AFF9-AFFC. Локальные переменные. К ним нет доступа через стек. Вместо этого в начале каждого внутреннего блока устанавливается регистр IX так, чтобы (IX-4) указывало на начало блока локальных переменных. Т.о., если: PROCEDURE test; VAR i,j:INTEGER; то i будет находиться в IX-4-2 и IX-4-1, т.е. в IX-6, IX-5, j IX-8 и IX-7. 3.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 x:REAL); то ссылка на x размещается в IX+2 и IX+3 (эти ячейки содержат адрес переменной x), а 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. Если Вы вышли из Паскаля по команде 'В' ,для возврата в редактор введите GOTO 9 ('теплый' старт с сохранением исходного текста) или GOTO 12 ('холодный' старт с инициализацией). Для установки цвета INK используйте CHR(15). PRODUCT APPLICATION NOTE PS1.1 Звук и графика ZX-SPECTRUM в Паскале 4Т 1. Звук (см. пакет MPACK к HP80). Пример: BEEP(262,0.5) ; BEEP(0,1) - генерация среднего До в течение 0,5 сек., затем пауза на 1 сек. 2. Графика (см. пакет MPACK). 3. Вывод через системное ROM. Существуют ситуации, когда полезно осуществлять вывод через системную точку входа RST #10. К примеру, при использовании управляющего кода PRINT AT, за которым должны следовать 8-битные значения X и Y. Однако с помощью оператора WRITE определенные значения вывести невозможно (к примеру, код 8 соответствует BACKSPACE (DELETE)). Для этого целесообразно использовать процедуру SPOUT (C:CHAR). Использование графического пакета TURTLE Пакет по команде G,,TURTLE присоединяется к любой программе (отметим, однако, что для нормальной работы пакет должен быть снабжен PROGRAM-заголовком и VAR-декларацией, TYPE, CONST и LABEL объявлять необязательно. Кроме того, программа не должна содержать предварительно объявленных процедур и функций.). Информация о 'черепашке' хранится в глобальных переменных. Глобальные переменные HEADING Используется для хранения углового значения направления, в котором в данный момент ориентирована 'черепашка'. Принимает значения REAL в градусах и может быть установлена в 0 процедурой TURTLE. Значение 0 соответствует Востоку. XCOR, YCOR Хранят текущие координаты (X,Y) 'черепашки'. Имеют тип REAL и изначально равны 127 и 87 соответственно. PENSTATUS Имеет тип INTEGER. Используется для хранения состояния 'пера'; 0 - 'перо' опущено, 1 - поднято. Процедуры INK (C:INTEGER), C = 0 - 8; PAPER (C:INTEGER), C = 0 - 8; COPY - копирование экрана на принтер; PENDOWN (C:INTEGER) -перевод 'черепашки' в состояние, при котором она при движении будет оставлять след цветом С. PENUP - процедура, обратная PENDOWN. ( Обе процедуры устанавливают переменную PENSTATUS) SETHD (A:REAL) - назначает параметр типа REAL глобальной переменной HEADING, т.е. устанавливает направление движения. 0-East, 90-North, 180-West, 270-South. Т.е. против часовой стрелки. SETXY (X,Y: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 = до 0.5. TURTLE Инициализация глобальных переменных. Пример программы Отметим, что пакет TURTLE размещается, начиная со строки 10 и заканчивается строкой 1350. 1. Круги 1 PROGRAM CIRCLES; 2 VAR I:INTEGER; 1360 BEGIN 1370 TURTLE; 1380 FOR I:=1 TO 9 DO 1390 BEGIN 1400 ARCR (0.5,360); 1410 RIGHT (40) 1420 END 1430 END. 2. Спирали 1 PROGRAM SPIRALS ; 2 VAR 1360 PROCEDURE SPIRALS (L,A:REAL); 1370 BEGIN 1380 FWD(L); 1390 RIGHT(A); 1400 SPIRALS(L+1,A) 1410 END; 1420 BEGIN 1430 TURTLE; 1440 SPIRALS (9,95) или (9,90) или (9,121)... Ошибки в TURTLE Строка 570 USER(#EAC) должна быть изменена: INLINE (#FD, #21, #3A, #5C, #FD, #CB, 1, #CE, #CD, #AC, #E, #FD, #CB, 1, #8E, #F3); Pascal 4T Version 5 ( с 1 Апреля 1983 г.) 1. Функции могут возвращать значения POINTER (указатели); 2. Исправлена ошибка в NEW; 3. Новый редактор; добавлена команда V без аргументов, которая выдает значения разделителя, line range, Find и Substitute строк; 4 Реализована опция $F ('Include'). Если Вы хотите ее использовать, то исходный текст, который предполагается 'подкачивать', должен быть выведен на ленту с помощью команды W. W работает аналогично команде Р, за исключением того, что по W информация выводится не в HP4T формате и запись начинается сразу после окончания набора команды. Текст, записанный по W, командой G,, считать нельзя. Пример: W 50,120,PLOT - запись процедуры PLOT. Для включения PLOT: 100 END; 110 120 {$F PLOT} 'включение' процедуры plot; 130 140 PROCEDURE MORE; - оставшаяся часть программы.