Depth #00
15 октября 1997

Архив - описание Паскаля для ZX Spectrum: Hisoft Pascal4.

<b>Архив</b> - описание Паскаля для ZX Spectrum: Hisoft Pascal4.
                                        
                                        
                                        
      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                



Другие статьи номера:

Вступление - Перед вами пока только макет нового журнала.

Луганский базар - В Луганске появилась новая группа под названием Вinаry Fасtоr.

Архив - описание Паскаля для ZX Spectrum: Hisoft Pascal4.

Юмор от SOI - бородатые анекдоты.

Проходиловка - описание к игре "MESSAGE FROM ANDROMEDA".

TR-DOS - полное описание TR-DOS интерфейса.

Поэзия из ЛГМУ - Сифилиада: Pассказ историка.

От фанаря - процессоры RISC-ПУTЬ В БУДУЩEE.

От фанаря - История гибких магнитных дисков (дискет).

Реклама - студии ЛOГPOC можно купить различные периферийные устройства, к примеру модемы и мыши.


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

Похожие статьи:
Мнения - жив ли Спектрум в твоём городе?
Игротека - SNAKE-HELP2. Принципы игры и история создания.
Презентация - редактор ASCII графики для каталогов в TR-DOS.

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