Системные программы для ZX-Spectrum 1992 г.

PASCAL HP4T, НР80 - введение. Описание Паскаля.


PASCAL HP4T, НР80

ВВЕДЕНИЕ

Описанная в данном документе версия компилятора с языка паскаль НР4Т является представителем группы компиляторов с паскаля фирмы HISOFT. В той или иной степени этим описанием можно пользоваться и при работе с другими версиями, описаны основные особенности реализации паскаля на ZX-SPECTRUM, стандартный строчный редактор, а также более удобный НР80 (имеется не во всех версиях).

 

1. СИНТАКСИС И СЕМАНТИКА

• 1.1. ИДЕНТИФИКАТОРЫ

Допустимая длина идентификаторов не более 10 символов. Различаются маленькие и большие буквы.

• 1.2. ЧИСЛА

Целые имеют абсолютную величину не более 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).

Допускается шестнадцатеричное представление числа: #03,

—FF.

• 1.3. СТРОКИ Строковым типом является ARRAY (1..N) JF CHAR, где N

— целое от 0 до 255 включительно. Литерные строки не должны содержать символ EOL (CHR(13)), в противном случае система генерирует <'ERROR*68. Символ NULL реализован не как пустая строка, а как CHR(0).

Допускается использование управляющих кодов дисплея в качестве констант:

CONST BS=CHR(10);

CR=CHR(13);

• 1.4. ОПРЕДЕЛЕНИЕ ТИПА

• Простой тип определяется через:

— идентификатор другого типа, либо

— (идентификатор , ..., идентификатор) — перечисляемый тип,либо

— константа .. константа — интервальный тип. Перечисляемый тип может иметь не более 255 элементов. Допускаются массивы массивов, массивы множеств, записи с палями типа множество и т.п.

В НР4Т используется эквивалентность имен, а не типов, следовательно, в следующем примере переменной TABELA не может быть присвоено значение переменной TABELB, т.к. они имеют разный тип:

VAR

TABELA: ARRAY [1..100] OF INTEGER;

TABELB: ARRAY [1..100] OF INTEGER;

В таком случае не вызовет ошибки следующая запись:

TYPE

TABEL = ARRAY [1..100] OF  INTEGER;

VAR TABELA, TABELB: TABEL;

• 1.5. УКАЗАТЕЛИ

Имеются некоторые ограничения на использование указателей:

— не допускаются указатели на необъявленный тип. Это не относится к конструкциям типа:

TYPE

ITEM   =   RECORD

VALUE: INTEGER;

NEXT:    INTEM END;

LINK = ITEM;

— не допускается указатель на указатель;

— указатели одного типа считаются эквивалентными, т.е.:

VAR

FIRST:    LINK;

CURRENT:    ITEM;

— определена константа NIT.

• 1.6. ЗАПИСИ

Допускается ключевое слово WITH для более компактного обращения к полям записи.

Тип RECORD не может иметь вариантов.

• 1.7. МАССИВЫ

Зарезервированное слово PACKED допустимо, но игнорируется, т.к. массивы уже упакованы, если переменная объявлена как

VAR

A: ARRAY [1..10] OF ARRAY [1..10] то для доступа к элементу (1,1) этого массива можно использовать: А[1] [1] или А [1,1 ].

• 1.8. МНОЖЕСТВА

Базовый тип SET (множество) может иметь до 256 элементов. Нижняя граница множества всеща равна 0, а размер множества всегда равен максимальному размеру базового типа. Таким образом SET OF CHAR всегда занимает 32 байта (возможны 255 элементов по биту на 1 элемент). SET OF 0..10 эквивалентно SET OF 0..255.

• 1.9. ОПЕРАТОР CASE

Пустой список в операторе CASE не допускается, приводит к ошибке *ERROR* 13. Операция ELSE выполняется, если сектор не обнаружен в списке констант. Если ELSE отсутствует и подходящая ветвь списка CASE не найдена, управление передается оператору, следующему за AND.

• 1.10. ОПЕРАТОР FOR

Управляющая переменная оператора FOR должна быть простой и не может являться структурной переменной или параметром.

• 1.11. ОПЕРАТОР GOTO

Оператор GOTO должен передавать управление внутри того блока, где он находится. Оператор GOTO должен находиться на одном уровне вложенности с меткой. Метка должна быть объявлена в том же блоке, где она используется. Метка может содержать от 1 до 4 цифр. Оператор GOTO не может быть использован для выхода из циклов FOR..DO, процедур или функций.

 

ПРЕДОПРЕДЕЛЕННЫЕ ИДЕНТИФИКАТОРЫ

• 2.1. КОНСТАНТЫ

MAXINT - максимальное целое = 32767

•- TRUE, FALSE.

" 2.2. ТИПЫ INTEGER —2 байта real — 4 байта

CHAR — расширенный ASCII... 256 символов BOOLEAN

ПРИМЕЧАНИЕ: Тип FILE не определен. Процедуры и функции как параметры не допустимы.

2.3. ПРОЦЕДУРЫ ВВОДА И ВЫВОДА

• 2.3.1. WRITE

WRITE(E) — вывод 8-битового значения Е на экране или

принтер;

CHR(8) - CTRL H BS на дисплее (шаг назад);

CHR(12) - ctrl L — очистка экрана (CLEAR SCREEN или NEWPAGE);

CHR(13) - CTRL M CR и LF (BK и ПС);

CHR(16) - CTRL P — переключить вывод с дисплея на принтер и наоборот.

Следующие операторы эквивалентны:

WRITE (PI, P2, ... , PN) ;

BEGIN WRITE /(PI); WRITE (P2);

. . . ;    WRITE    (PN)    END;

Параметры PI,..., PN могут иметь один из следующих форматов:

Е Е:М E:M:N E:M:H

где E,M,N — выражения; Н — символьная константа.

Рассмотрим 5 случаев:

— Е имеет тип INTEGER: используется формат Е или Е:М — значение выражения преобразуется к типу CHARACTER STRING с последующими пробелами. Длина строки может быть увеличена (с лидирующими пробелами) при использовании параметра M, определяется общее число символов, которые должны быть выведены.

— Е имеет тип INTEGER и использован формат E:M:H; в этом случае Е выводится в шестнадцатеричном виде. Если М=1 или М-2, то выводится значение Е MOD М длиной не более М символов. Если М°3 или М-4, то выводится полное значение выражения Е длиной не более 4 символов. Если М>4, то перед числом вставляют пробелы. Например:

WRITE (1025:M:H);

если m-1, to выводится: 1

если М-2, то выводится: 01

если М-3, то выводится: 0401

если М-4, то выводится: 0401

если М-5, то выводится: 0401 

Е имеет тип REAL, формат Е, Е:М, E:M:N; значение Е преобразуется в строку символов, представляющую собой число типа REAL. Форма представления определяется N. Если N отсутствует, то число выводится в "научной" форме, т.е. с мантиссой и экспонентой. Минимальная длина "научного" представления равна 8 символам. Если величина М<8, то всегда будет выводиться полная длина 12 символов (если число отрицательное). Например:

WRITE (-1 .23Е10:М);

если М-7, то выводится: -1.23000Е+10

если М-в, то выводится: -1.2Е+10

если М°9, то выводится: -1.23Е+10

если М-10,то выводится: -1.230Е+10

если М-11,то выводится: -1.2300Е+10

если М-12,то выводится: -1.23000Е+10

если М=13,то выводится: -1.23000Е+10

Если использован формат E:M:N, то число Е будет выводиться с фиксированной точкой, а N будет определять число выводимых Знаков после запятой. Если N-0, то число Е будет выведено в формате INTEGER. Если Е значительно больше определяемого формата, то оно будет выводиться в "научном" виде. Например:

WRITE (1E2:6:2) : 100.0

WRITE (1E2:8:2) : 100.0

WRITE (23.455 б 1)    23.5

WRITE (23.455 4 2)    2.34550E+01

WRITE (23.455 4 0)    23

— Е имеет тип CHAR или STRING — выводится либо один символ, либо М символов с лидирующими пробелами, если это . необходимо.

— Е имеет тип BOOLEAN.

• 2.3.2. WRITELN

WRITELN  переходит на новую строку, что эквивалентно

WRITE(CHR(13)).

WRITELN (P1, ..., PN) эквивалентно: BEGIN WRITE (PI,

..., PN); WRITELN END.

• 2.3.3. PAGE

Процедура PAGE эквивалентна WRITE(CHR(12)), т.е. это очистка экрана или новая страница принтера.

— 2.3.4. READ

READ — ввод данных с клавиатуры. Ввод осуществляется через буфер, который изначально содержит только символ EOL. Доступ к буферу осуществляется через текстовое окно размером один символ. Если текстовое окно указывает на EOL-MAPKEP, то перед окончанием операции ввода в буфер будет выведена новая строка с клавиатуры.

Рассмотрим процедуру РЕАО(У) при различных типах У:

— Е имеет тип CHAR. В этом случае READ(y) просто считывает символ из буфера ввода и присваивает его У. Если текстовое окно в буфере установлено на маркер EOL (символ CHR(13)), то признак EOLN будет возвращать значение TRUE и с клавиатуры будет считываться новая строка текста. При повторном выполнении процедуры READ текстовое окно будет установлено на начало новой строки.

Отметим, если EOLN=TRUE в начале программы. Это означает, что если переменная в первом READ имеет тип CHAR, то процедура READ возвратит значение CHR(13) с последующим вводом новой строки с клавиатуры. Последующее выполнение READ типа CHAR будет возвращать первый символ этой новой строки.

— V имеет тип STRING. Процедурой READ могут быть считаны строки длиной, определенной ранее типом STRING или до EOLN=TRUE. Если признак EOLN установлен до окончания ввода всех символов строки, количество которых определено типом STRING, то строка будет дополнена до полной длины символами CHR(O). Обратите внимание на замечание к предыдущему пункту.

— V имеет тип INTEGER. Максимальное число, которое может быть введено в этом случае, равно 32767.

• 2.3.5. READLN

READLN(V1, .... VN) ; эквивалентно BEGIN READ (VI. .... VN); READLN END;

READLN просто считывает новый буфер с клавиатуры. Таким образом после выполнения READLN EOLN становится равным FALSE, если следующая строка не пустая.

READLN может быть использован для пропуска пустой строки в начале выполнения объектного кода. Это полезно, если вы желаете считывать символ типа CHAR в начале программы, но ее обязательно, если вы вводите значение типа INTEGER или REAL или символ из последующей строки.

• 2.3.6. EOLN

Функция EOLN является булевой функцией и возвращает значение TRUE, если следующий вводимый символ является EOL-СИМВОЛ. В противном случае EOLN-FALSE.

• 2.3.7. INCH

Функция, читает символ с клавиатуры. Если не нажата ни одна клавиша, возвращает CHR(O). Если клавиша нажата, то возвращается символ типа CHAR, соответствующий коду нажатой клавиши.

• 2.4. ФУНКЦИИ ПРЕОБРАЗОВАНИЯ

TRUNC(X) — целая часть

TRUNC(-1.5) - -1; TRUNC(1.9) = 1;

ROUND(X) — округление

ROUND(-6.5) = -6; ROUND(11.7) - 12;

ROUND(-6.51) = -7; ROUND(23.5) - 24, ENTI ER (X) — функция возвращает наибольшее целое число, которое меньше или равно X. ENTIER(-6.5) - -7; ENTIERdl.7)

-11

ORD(X) — преобразует перечисляемый тип в INTEGER. CHR(X) — преобразует INTEGER в перечисляемый тип.

• 2.5. АРИФМЕТИЧЕСКИЕ ФУНКЦИИ

ABS<X) —модуль.

SOR(X) — квадрат.

SQRT(X) — корень.

FRAC(X) — дробная часть.

SIN(X) — синус. Результат типа REAL, X — в радианах.

COS(X) — косинус.

ТАN(Х) —тангенс.

ARCTAN(X) — арктангенс.

ЕХР(Х) — экспонента, Е=2.71828 в степени X.

LN (Х) — натуральный логарифм.

2.6. ДРУГИЕ ПРОЦЕДУРЫ И ФУНКЦИИ:

NEW(P) — создает динамический элемент, на который теперь указывает Р. Вместо процедуры DISPOSE используется MARK и RELEASE.

mark(v) сохранит состояние динамически распределяемой области ("кучи") в указателе V.

RELEASE(V) —очистка "кучи" от адреса, указываемого переменной V и до конца.

INLINE(C1,C2,...) — кодовая ставка. С1,С2,„. — шестнад-цатеричные числа вида #ХХ, размещаются в последовательность

байтов.

USER(V) — вызов подпрограммы по адресу V. Для обозначения адреса, большего #7FFF (32767), необходимо использовать отрицательные значения: #СОО - -16384. Подпрограмма должна завершаться инструкцией RET.

HALT — останов программы с выдачей сообщения:

'HALT AT POXXXX',

где ХХХХ — шестнадцатеричный адрес, где стоит HALT. POKE(X.V) — помещает значение V в ячейку памяти с адресом X. Х — типа INTEGER, V — любого типа. POKE (#6000, 'А' )

в ячейку #6000 записать #41. POKE (-16384,3.6ЕЗ)

— разместить 00 OB 80 70 по адресу #СООО.

TOUT (NAME, START, SIZE) — записывает данные  на магнитофонную ленту. Первый параметр NAME должен иметь тип ARRAY[L.8] OF CHAR. SIZE байт данных выводятся на ленту начиная с адреса START (оба параметра типа INTEGER). Можно использовать реальные шестнадцатеричные адреса.

TIN(NAME, START) — читает данные с магнитной ленты (см. TOUT). TIN можно использовать для ввода текста в массив тииа CHAR.

OUT(P,C) — вывод в порт. Значение параметра Р типа INTEGER загружается в регистр ВС, символьный параметр С загружается в регистр А, выполняется команда OUT (С),А процессора Z80.

RANDOM — функция, возвращает псевдослучайное число в диапазоне 0...255. функция малоэффективна, целесообразнее в некоторых случаях использовать собственные подпрограммы.

SUCC(X) — следующее значение перечисляемого типа.

PRED(X) — предыдущее значение перечисляемого типа.

ODD(X) — функция истинна при нечетном аргументе.

ADDR(V) — функция, возвращает адрес аргумента произвольного типа.

РЕЕК(Х,Т) — чтение из памяти. Х — целое, задает адрес, торой аргумент может иметь произвольный тип, задает тип результата. Если в памяти начиная с #5000 записано: 50 61 73 63 61 6С, то:

WRITE(PEEK(#5000, ARRAYtL.6] OF CHAR)) напечатает:

PASCAL

WRITE(PEEK(#5000, CHAR)) напечатает: Р WRITE(PEEK(#5000, INTEGER)) напечатает: 24912 WRITE(PEEK(#5000, REAL)) напечатает: 2.46227Е+29 SIZE(V) — функция, возвращает размер области памяти в байтах, занимаемой переменной V;

INP (Р) — функция вводит из порта с адресом Р — аналогично OUT.

 

3. КОММЕНТАРИИ И ОПЦИИ КОМПИЛЯЦИИ

• 3.1. Комментарии: "(*", "*)" или фигурные скобки.

• 3.2. Опции (ключи): размещаются внутри комментариев

вслед за символом "$". Состоят из символа, за которым

следует знак "+" или "-".

Опция L — контроль листинга

L+ : печать всего листинга (по умолчанию);

L-: печать только строк, содержащих ошибки.

Опция О — контроль переполнения в операциях * и / с числами типа INTEGER во всех операциях с REAL.

0+ : производить контроль (по умолчанию)

О- : не производить контроль.

Опция С — контроль квадратуры при выполнении объектного кода. Нажатием EDIT вызывает возврат в систему с сообщением команды HALT.

С+ : контроль есть (по умолчанию);

С-: контроль отсутствует.

Опция S — контроль переполнения стека при вызове процедур и функций (по умолчанию S+). В случае переполнения стека выводится сообщение: "OUT OF RAM AT POXXXX".

Опция А — контроль границ массивов (по умолчанию А+). В случае ошибки выдается сообщение:

"INDEX TOO HIGH" или "INDEX TOO LOW".

Опция I — при выполнении операции сравнения >, <, >-, <-, над 16-разрядными целыми числами. Если аргументы делятся на число, большее MAXINT=32767, то возникает переполнение. Для правильного сравнения таких чисел необходимо использовать опцию I+ (по умолчанию). Аналогичная ситуация может возникнуть и с числами типа REAL при попытке деления на 3.4Е38.

Опция Р — переключатель принтер/экран. Используется без знака + или -. Аналогичен CTRL/P в IBM PC.

Опция F — прочитать часть программы с магнитной ленты. После имени этой опции должно через пробел идти имя файла (если имя < 8 символов, то пополняют пробелами). Текст программы из указанного файла вставляют после строки, содержащей опцию F. Позволяет экономить память.

 




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
demos vs intros - рассуждения на тему "почему на пати так много intro и так мало дем".
Письмо №290 - Вологда
Speccy on CD - О создании CD с ПО в Самаре.
Старший брат - CD-ROM
Interface - интервью с чайковским музыкантом Riskej.

В этот день...   24 ноября