Описание прог Artist, Art Studio, Gens3-Mons3, Gens4, Hisoft C v1.1, Hisoft Pascal v1.4, Tasword2 и TLW 1969 г.

HISOFT Pascal 4 - version 1.4 - введение. Синтаксис и семантика. Предопределенные идентификаторы.


                    HISOFT   PASCAL4 - VERSION 1.4

                        31. Oct.  1982

                            -1Часть  0.1-0

Тип 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 (как правило, этого более чем
достаточно). Если перед числом ввести символ Е, то встроенный редактор
станет недоступным. Эта процедура полезна при использовании внешнего
редактора
..
                           -1Часть 0.2-0
                     Компиляция и запуск в работу

     Компилятор генерирует листинг вида:
        хххх nnnn  исходный текст строки.
где хххх - адрес начала кода, генерируемого этой строкой,
    nnnn - номер строки.
     Если длина строки больше 80 символов, компилятор вставляет символ
'новая строка'. Листинг может быть распечатан на принтере с помощью
опции $Р. Для приостановки вывода листинга необходимо нажать
CS+SPACE (BREAK). Если после этого нажать EDIT - возврат в редактор,
при нажатии любой другой клавиши - продолжение вывода.  Если при
компиляции обнаружены ошибки,  то выводятся соответствующие сообщения
и распечатка листинга  приостанавливается. Если при этом ввести символ
Е - система переходит к редактированию индицируемой строки, если
ввести Р, - к редактированию предыдущей строки.

                            -1Часть 1.-0
                        Синтаксис и семантика

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
               ┌─────────────────────┐
───────┬───────┤ consnant identifier ├─────┬───────────────────────
       │       └─────────────────────┘     │
       │       ┌─────────────────────┐     │
       ├───────┤ unsigned  number    ├─────┤
       │       └─────────────────────┘     │
       │                                   │
       ├────────────    NIL   ─────────────┤
       │                                   │
       │                                   │
       └── ,  ─────  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
               ┌─────────────────────┐
───────┬───────┤    type  identifier ├────────┬─────────────────────
       │       └─────────────────────┘        │
       │       ┌─────────────────────┐        │
       ├─ ( ─┬─┤    identifier       ├─┬ ) ───┤
       │     │ └─────────────────────┘ │      │
       │     └────────── , ────────────┘      │
       │                                      │
       │ ┌────────┐            ┌────────┐     │
       └─┤constant├───  ..  ───┤constant├─────┘
         └────────┘            └────────┘
     Тип, определенный как (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.

                            -1Часть 2.-0
                   Предопределенные идентификаторы

-12.1. Константы-0
        MAXINT  - максимальное целое  32767.
        TRUE, FALSE - булевские константы.

-12.2 Типы-0
        INTEGER
        REAL
        CHAR
        BOOLEAN

-12.3 Процедуры и функции-0
-12.3.1 Процедуры ввода/вывода-0

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 или символ из последующей
строки.

-12.3.2. Функции ввода.-0
2.3.2.1.  EOLN
     Функция EOLN является булевой функцией и возвращает значение

TRUE, если следующим вводимым символом является EOL-символ. В
противном случае EOLN=FALSE.

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

-12.3.3 Функции преобразования-0
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).

-12.3.4. Арифметические функции-0
     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).

-12.3.5. Другие функции-0
     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.

-12.3.6. Другие функции-0
     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.



СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Hello to - приветы.
Авторы - об авторах нового номера газеты.
Обзор новинок - Chainik in horror flat.
Железо - подключение к спектруму статической памяти (кэша).
Письмо издалека - письмо от Jоhn Ciеmgаls.

В этот день...   26 апреля