Сайт посвящен ПЭВМ АГАТ: Передовица » Макулатура » Штатная документация » Агат-9 Книга 9 (3) » имя странички

New: 01.08.2020

Форум

Общие сведения

Software

Hardware

Агат ↔ PC

Эмуляторы/утилиты

Люди

Макулатура

Всякая всячина

Ссылки

Контакты ✉

Помощь сайту

имя странички

    УТВЕРЖДЕН

Фг.00035-01 33 02-ЛУ

МАШИНА ВЫЧИСЛИТЕЛЬНАЯ ЭЛЕКТРОННАЯ

ПЕРСОНАЛЬНАЯ "АГАТ"

(исполнение 9)

Система программирования "Бейсик"

Интерпретатор языка "Бейсик"

Руководство программиста

Фг.00035-01 33 02

1991

 

* * *

АННОТАЦИЯ

В настоящем документе приведена информация о назначении и условиях применения интерпретатора языка "Бейсик" для персональной электронной вычислительной машины (ПЭВМ) "АГАТ", основные характеристики и обращения к программе. Описаны входные, выходные данные и сообщения интерпретатора.

В разделе "Дополнительные сведения" собраны сведения, которые могут оказаться полезными при разработке опытным программистом программ, использующих особенности реализации языка "Бейсик" и возможности других элементов системного программного обеспечения.

Для использования интерпретатора необходимо ознакомиться с описанием языка "Бейсик" (см. Фг.00035-01 35 01).

СОДЕРЖАНИЕ

1. Назначение и условия применения
2. Характеристики программы                
3. Обращение к программе                       
4. Входные и выходные данные
5. Сообщения об ошибках                      
6. Дополнительные сведения

1. НАЗНАЧЕНИЕ И УСЛОВИЯ ПРИМЕНЕНИЯ

Интерпретатор реализует язык "Бейсик", соответствующий стандарту АНСИ Х 30-1978.

Интерпретатор служит для выполнения программ и директив языка "Бейсик".

Интерпретатор языка "Бейсик" размещается на гибком магнитном диске (ГМД) и загружается в оперативную память (ОП).

2. ХАРАКТЕРИСТИКИ ПРОГРАММЫ

Интерпретатор работает в режиме непосредственного исполнения программ и директив языка "Бейсик". Интерпретатор обеспечивает:

ввод программы с клавиатуры и кассетного магнитофона;

возможность вычисления выражений над целыми и вещественными переменными, элементарными функциями;

возможность выполнения условных операторов, циклов и обращений к подпрограммам и функциям;

диагностику и обнаружение ошибок в программе.

3. ОБРАЩЕНИЕ К ПРОГРАММЕ

Для запуска интерпретатора необходимо разместить его в ОЗУ ПЭВМ "АГАТ", и затем передать управление на адрес ¤Е000. Все действия выполняются автоматически программой "Дисковая операционная система" (ДОС) при включении ПЭВМ.

После запуска интерпретатора на экране видеоконтрольного устройства (ВКУ) появляется символ '}' и курсор в виде мигающей черты, что определяет готовность интерпретатора к работе.

После выполнения программы эти сигналы вновь появляются на экране ВКУ.

Для обращения к интерпретатору из программы системный монитор (см. Фг.00035-01 12 01) используются следующие команды:

*E000G - для обращения к интерпретатору без сохранения программы и состояния интерпретатора;

*E003G или УПР-С, - для обращения к интерпретатору с сохранением программы и состояния интерпретатора.

4. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ

Входными данными для интерпретатора языка "Бейсик" являются тексты программ и директив языка "Бейсик", выходными данными - результаты исполнения программ и директив (программы в кодах, сообщения о результатах работы программ, сообщения об ошибках).

5. СООБЩЕНИЯ ОБ ОШИБКАХ

Сообщением об окончании исполнения программы и директив языка "Бейсик" являются сигналы: приглашение к диалогу '}' и курсор в виде мигающей черты.

Интерпретатор сообщает об ошибках в программе или директиве посредством выдачи сообщений на экран ВКУ либо на печатающее устройство.

На экран ВКУ выдается, кроме этого, текст строки, при исполнении которой обнаружена ошибка, с выделением местоположения ошибки красным цветом, а при работе в черно-белом текстовом режиме - знаком "!".

После каждой ошибки происходит останов программы, при этом приглашение и курсор вновь появляются на экране ВКУ.

В результате неправильного ввода в процессе исполнения операторов INPUT на экране ВКУ появляется сообщение ОШ.ВВОД, после этого ввод необходимо повторить.

Возможны следующие сообщения об ошибках:

NEXT БЕЗ FOR - встреченному по ходу исполнения NEXT нет соответствующего FOR;

СИНТ.ОШ. - недопустимый символ в операторе;

RETURN БЕЗ GOSUB - некуда возвращаться, как правило неверный вход в подпрограмму (GOTO вместо GOSUB);

МАЛО ДАННЫХ - выполняется READ, а списки DATA исчерпаны, возможно пропущен RESTORE;

ОШ.ТИП - несогласованы операнды, например сложение строки с числом;

ПЕРЕПОЛНЕНИЕ - засылка в целую переменную слишком большого числа, шестнадцатеричная константа длиннее 4 цифр и т.д.;

МАЛО ПАМЯТИ - нет свободной памяти под переменную или массив, либо вложенные GOSUB и FOR не оставили в стеке свободного места под выражение, либо нет места под буфер поиска/замены в директиве LIST и др.;

НЕТ НОМЕРА - отсутсвует строка с номером, указанным в GOTO, THEN или GOSUB;

ОШ.ИНДЕКС - значение индекса выходит за пределы размерности, указанной для массива в DIM;

УЖЕ ОПИСАН - при исполнении DIM обнаружен массив с таким же именем, ошибка может быть вызвана использованием имени массива раньше DIM;

Х/0 - делить на ноль нельзя;

ОШ.ЗНАЧЕНИЕ - неправильный операнд, например попытка записать с помощью POKE число больше 255, указать в PLOT координату за пределами экрана и др.;

СТРОКА ДЛИННА - в результате сложения получена строка длиннее 255 символов;

ОСТАНОВ - после одновременного нажатия клавиш УПР-Ц или выполнения STOP в программе (ошибкой не является);

НАДО RUN - перед CONT выполнено редактирование программы, была ошибочная директива или нажаты клавиши УПР, СБР - продолжить нельзя;

НЕ В ДИАЛОГЕ - команда только для программного исполнения;

НЕТ МЕТКИ - в выражении ассемблера использовано имя с неопределенным значением, выдается также при использовании отсутствующей функции;

БАЙТ НЕПОЛОН - в шестнадцатеричной загрузке памяти записано нечетное число цифр;

ОШ.МЕТКА - начало оператора ассемблирования принято за метку, но меткой служить не может, например

 ! МЕТКА+1: RTS ;  

Может быть вызвана неправильной записью операции (! TXW);

ОШ.КОД - не удается сформировать команду в ассемблере, например недопустимая адресация; выдается также при нарушении условий относительной адресации, когда метка перехода далеко отстоит от команды условного перехода; может быть вызвана повреждением заготовки объектного кода между первым и вторым проходом ассемблирования (адрес загрузки кода попал на системные буфера или, например, на адреса ПЗУ);

УЖЕ ЕСТЬ - в команде ассемблера использована метка, значение которой уже определено ко времени условного перехода.

6. ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ

При разработке программного обеспечения на языке "Бейсик" могут оказаться полезными следующие сведения:

6.1. При желании можно для вывода текста на экран ВКУ использовать не весь экран. Для этого необходимо задать текстовое окно. В ячейке памяти 32 лежит левая граница текстового окна, а в ячейке 33 - ширина (в цветном текстовом режиме 32*32 хранятся удвоенные значения горизонтальных размеров, поэтому нечетные значения недопустимы). Командами POKE 33,A , POKE 32,B  можно задавать горизонтальные размеры текстового окна. При этом А должно находиться в пределах от 1 до 64, а B - в пределах от 0 до 63. Другие значения могут привести к непредсказуемым последствиям. В ячейках 34 и 35 лежат соответственно номер первой (верхней) строки окна и номер строки, расположенной непосредственно под окном.

Командами POKE 34,C и POKE 35,D  можно задавать вертикальные размеры текстового окна. Переменные C и D должны находиться соответственно в пределах от 0 до 31 и от 1 до 32, при этом D должно быть больше C.

6.2. Для того, чтобы очистить текстовое окно от символов, можно, кроме команды HOME, нажать одновременно клавиши УПР и Л или выполнить команду PRINT CHR¤(140).

При нажатии функциональной клавиши '8' или одновременном нажатии клавиш УПР,Ч или при выполнении оператора PRINT CHR¤(158) текстовое окно очистится от символов, начиная с позиции курсора, и до конца текстового окна.

При одновременном нажатии клавиш УПР,Щ или при исполнении PRINT CHR¤(157) строка очистится от символов, начиная с позиции курсора и кончая правой границей текстового окна.

Одновременное нажатие клавиш УПР,Г или PRINT CHR¤(135) приводит к звучанию динамика.

Можно использовать и другие подпрограммы программы "Системный монитор", вызывая их с помощью оператора CALL.

6.3. В табл. 1 приведены сведения, которые могут оказаться полезными при обработке ошибок в программах (английской диагностике соответствуют коды ошибок языка Applesoft).

                                          Таблица 1  
-----------------------------------------------------
    Русская диагностика  !   Английская диагностика  
-------------------------!--------------------------
 Код!       Сообщение    !Код!  Сообщение            
-------------------------!---------------------------
  0 ! NEXT БЕЗ FOR       ! 0 ! NO FOR ERROR         
! 12! СИНТ.ОШ.           ! 6 ! SYNTAX ERROR         
! 19! RETURN без GOSUB   ! 12! NO GOSUB ERROR     
! 35! МАЛО ДАННЫХ        ! 20! NO DATA ERROR       
! 46! ОШ.ЗНАЧЕНИЕ        ! 29! ILLEGAL VALUE ERROR 
! 57! ПЕРЕПОЛНЕНИЕ       ! 40! OVERFLOW ERROR      
! 69! МАЛО ПАМЯТИ        ! 48! OUT OF MEMORY ERROR  
! 80! НЕТ НОМЕРА         ! 61! UNDEF STATEMENT ERROR
! 90! ОШ.ИНДЕКС          ! 76! SUBSCRIFT ERROR     
! 99! УЖЕ ОПИСАН         ! 85! REDIM ARRAY ERROR
!109! X/0                ! 96! DIVIZION  BY ZERO
!124! ОШ.ТИП             !126! TYPE ERROR  
!130! СТРОКА ДЛИННА      !130! LONG STRING ERROR
!165! НЕТ МЕТКИ          !157! UNDEF NAME ERROR
!174! БАЙТ НЕПОЛОН       !167! BYTE UNCOMRL ERROR
!186! ОШ.МЕТКА           !179! LABEL ERROR 
!194! ОШ.КОД             !184! OPCODE ERROR
!200! УЖЕ ЕСТЬ           !190! DOUBLE DEF NAME ERROR

При использовании в программе оператора ONERR GOTO исполнение команды X=PEEK(216)+PEEK(219)*256 приведет к тому, что в X будет номер строки, в которой была ошибка.

Команда POKE 216,0 отключает режим программной реакции на ошибки, установленный оператором  ONERR GOTO.

После выполнения команды Y=PEEK(222), Y будет равен коду ошибки. Коды ошибок и их соответсвие диагностическим сообщениям в русской и английской версиях приведены в табл.1.

Если седьмой бит ячейки с адресом 216 равен 1, это означает, что оператор ONERR GOTO  уже выполнен. Это можно использовать в программе, например, так:

  40 IF PEEK(216) > 127 THEN GOTO1000

6.4. При использовании различных областей памяти для отображения в графических и текстовых режимах (операторы TEXT=, GR=, MGR= и HGR=) необходимо следить за возможными пересечениями их с рабочими зонами СП "Бейсик" с учетом исполнения ПЭВМ "АГАТ", применяемой для эксплуатации программы. Адреса текстовых экранов приведены в табл.2. Размещение экранов графики 64*64 совпадает с размещением текстовых экранов, графические экраны 128*128 и 256*256 занимают по 4 текстовых экрана каждый, I-ый экран такого типа занимает место текстовых экранов с номерами от I*4 до I*4+3.

                                                      Таблица 2
----------------------------------------------------------
Номера:Адреса экранов 
экрана:---------------
      :Исполнение 9:
------:------------:
0??   : 0*         :
------:------------:
1     : 800***     :
------:------------:
2     :1000        :
------:------------:
3???  : 1800*      :
------:------------:
4-23  :2000-B800** :
------:------------:
24-31 :D000-F800*  :
------:------------:
------:------------:
32    : 0*         :
------:------------:
33    :800***      :
------:------------:
34    :1000        :
------:------------:
35    :1800*       :
------:------------:
36-55 :2000-B800** :
------:------------:
56-63 :D000-F800*  :
------:------------:


------------------------------

* Использование зоны приводит к нарушению работы системы.

** Зона пересекается с рабочей памятью интерпретатора "Бейсик", может испортиться программа пользователя или ее переменные. Использование зоны следует предусмотреть при размещении программы (см. п. 6.5) и/или переменных (операторы HIMEM: и LOMEM:).

*** Зона пересекается с рабочей памятью ДОС. Для ее использования необходимо отключить ДОС (директива отключения: *¤36#¤57A . ¤57DM).

6.5. Программа пользователя размещается интерпретатором при наборе и загрузке с диска с адреса ¤1901. Адрес конца программы хранится в ячейках ¤AF-¤B0, этот же адрес при отсутствии оператора LOMEM служит началом области хранения переменных. Переменные хранятся двумя участками: от адреса, указанного в ¤69-¤6A (этот адрес устанавливается LOMEM), до адреса, указанного в ¤6D-¤6E, находятся простые переменные, массивы и дескрипторы строк; от адреса, указанного в ¤6F-¤70, до адреса в ¤73-¤74 (этот адрес устанавливается HIMEM и при запуске СП "Бейсик" равен ¤C000) находятся тексты строк.

Можно изменить и адрес начала программы пользователя. Для этого требуемый адрес заносится в ячейки ¤67-¤68, записывается "0" в ячейку, предшествующую этому адресу, и выполняется NEW. Если требуется выполнить эти действия из программы, вместо NEW можно использовать директиву ДОС "RUN".

6.6. Переключать страницы экранной памяти в программах можно непосредственно обращениями по адресам переключателя с помощью команд  POKE -14592+KP+NS*Q, 0

Примечания:

1. КР - код режима работы. КР равен: 0 - в режиме GR, 1 - в режиме MGR, 2 - в текстовом режиме, 3 - в режиме HGR;

2. NS - номер страницы памяти. NS - целое и находится в интервале: от 1 до 63 - в режимах GR и текстовом, от 1 до 3 - в режимах MGR и HGR. Номера текстовых страниц от 1 до 31 соответствуют режиму 32*32, от 33 до 63 - режиму 64*32;

3. Q=4 - в режимах GR и текстовом, Q=16 - в режимах MGR и HGR.

4. Переключения не меняют содержимого экранных страниц, но не подключают к ним программные средства обращения, что обеспечивает возможность писать или рисовать на невидимом экране, после чего сразу включить готовое изображение.

6.7 Считывание с клавиатуры можно осуществить, например, так:

  100  WAIT¤C000,¤80,0
  110  X¤=CHR¤(PEEK(¤C000))
  120  POKE¤C010,0

6.8 Интерпретатор языка "Бейсик" имеет 4 оператора, позволяющие манипулировать графическими объектами в режиме графики высокого разрешения. Это операторы DRAW, XDRAW, ROT, SCALE. Однако прежде, чем эти операторы могут быть исполнены, графический объект должен быть описан посредством так называемого "описателя формы". Описатель формы состоит из последовательности закодированных векторов, определяющих форму объекта. Один или несколько таких описателей вместе с указателями составляют "таблицу образов". Коды этой таблицы могут быть набраны с блока клавиатуры и записаны на внешнем носителе для последующего использования.

Каждый байт описателя формы разделен на три секции, каждая из которых описывает вектор, указывающий направление движения воображаемого "пера", рисующего объект.

По команде DRAW или XDRAW интерпретатор просматривает секцию за секцией описателя. Если встречается байт, все биты которого нули, просмотр описателя заканчивается.

  Секции             C       B        A
  Номер бита        76      543      210
  Обозначение битов DD      PDD      PDD

Каждая пара битов, обозначенная DD, определяет направление движения "пера", а каждый бит P указывает, чертить или не чертить точку, прежде чем "перу" сместиться в указанном направлении.

Если DD=00, "перо" сместится вверх, DD=01 - вправо, DD=10 - вниз, DD=11 - влево.

P=0 вызывает смещение без черчения, а P=1 - смещение с черчением точки.

Секция C (два старших бита) не содержит поля P. Считается, что в секции C P=0, т.е. в ней можно указывать только смещение без черчения.

Таким образом, каждый байт описывает до трех векторов (по одному в секциях A, B и C).

Директивы DRAW и XDRAW обрабатывают секции справа налево (вначале секцию A, затем секцию B, далее C).

Если секции, оставшиеся до конца байта, содержат одни нули, они игнорируются.

Например: байт описателя не может заканчиваться секцией C, равной 00 (движение вверх без черчения), т.к. эта секция, содержащая одни нули, будет проигнорирована. Аналогично, если секция C содержит 00, секция B не может быть равной 000, т.к. она тоже будет пропущена. И 000 в секции A прервет описатель, если в секциях B и C нет ни одного бита, равного 1.

Предположим, нужно изобразить объект, указанный на рис.1:

   * * *  
  *     * 
  *     * 
  *     * 
   * * *  

   Рис.1  

Вначале нанесем его на клетчатую бумагу так, чтобы каждая точка занимала одну клетку. Затем выберем начальную точку. Пусть она находится в центре фигуры. Теперь нарисуем путь воображаемого "пера" через точки нашего объекта, используя только угол поворота на 90 .

Развернем эту последовательность векторов и расположим их в том порядке, в каком "перо" проходит через точки объекта (см. рис.2):

O  O  <* <* ^  ^  ^  ^  O> *> *> *> O  *  *  *  O <*
v  v        O  *  *  *              v  v  v  v       


+--+--+--+--+--+
!  !  !  !  !  !
! O->*->*->*->O!
+-^+--+--+--+-!+
! !!  !  !  ! v!
! *!  !  !  ! *!
+-^+--+--+--+-!+
! !!  !  !  ! v!
! *!  ! O!  ! *!
+-^+--+-!+--+-!+
! !!  ! v!  ! v!
! *!  ! O!  ! *!
+-^+--+-!+--+-!+
! !!  ! v!  ! v!
! O<-*<-*<-*<-O!
+--+--+--+--+--+

     Рис.2      

Рассмотрим на этом примере процесс составления таблицы образов (см. рис.3). Для каждого вектора записываем его двоичный код в следующую свободную секцию таблицы. Если код не подходит (например, вектор в секции C не может чертить точку) или равен 00 (000) в конце байта, пропускаем эту секцию и переходим к следующей.

                               Таблица образов   
------------------------------------------
Байт      Секция С   Секция В  Секция А
------------------------------------------
 12       пропуск 00  Ov 010    Ov 010
 3F       пропуск 00  <* 111    <* 111
 20       пропуск 00  *^ 100    O^ 000
 64        O>     01  *^ 100    *^ 100
 2D       пропуск 00  *> 101    *> 101
 15       пропуск 00  Ov 010    *> 101
 36       пропуск 00  *v 110    *v 110
 1E       пропуск 00  <O 011    *v 110
 07      пропуск 00 пропуск 000 <* 111

                Рис.3

Заполним теперь другую таблицу. Преобразуем последовательность нулей и единиц в шестнадцатеричный формат и добавим 00 - признак конца:

  12  3F  20  64  2D  15  36  1E 07  00 

Эта последовательность байтов должна быть загружена в память ПЭВМ "АГАТ". Необходимо закодировать еще некоторую информацию, чтобы завершить создание "таблицы образов".

    Адрес    Содержание            Формат       
      E8     S -база таблицы       адрес       
      S      N -количество образов байт      
      S+1       не используется    байт      
      S+2*I  относительный адрес,  адрес I-го  описателя  

Описатель I-ый начинается по адресу S+(S+2*I)  и заканчивается нулевым байтом. Все адреса хранятся в порядке "младший байт, старший байт".

В нашем примере таблица образов содержит только один описатель. Байт с адресом S содержит число описателей, в данном примере 01. Расположим описатель сразу после указателя, тогда, согласно таблице, адрес первого байта описателя равен  S+4 . Относительный адрес равен 4. Байт  S+2  содержит младшие две цифры (04), а байт  S+3  - старшие (00).

Выберем начальный адрес таблицы равным S . Этот адрес должен быть меньше, чем наибольший доступный адрес ОЗУ ПЭВМ "АГАТ". Таблица не должна располагаться в текстовой и графической страницах, используемых программой. Допустим, что  S=1DFC  удовлетворяет этим требованиям. Тогда необходимо в диалоге программы "Системный монитор" выполнить команду:

1DFC:01 00 04 00 12 3F 20 64 2D 15 36 1E 07 00 

По этой команде таблица будет помещена в ОЗУ, начиная с адреса ¤1DFC . Теперь мы должны сообщить интерпретатору, в каком месте ОЗУ находятся коды таблицы. Для этой цели служат ячейки памяти с адресами  ¤E8-¤E9 , причем в  ¤E8  лежит младший байт адреса, а в ¤E9 - старший.

Набрать, находясь в программе "Системный монитор"

  ¤E8:FC 1D

Таблицу можно загружать, используя команду ДОС  BLOAD , если таблица хранится на диске.

Используя команду интерпреатора  POKE , можно загружать адрес в ячейки памяти ¤E8-¤E9 (224-225), не вызывая программу "Системный монитор".

Удобно загружать таблицу с помощью средств ассемблирования, например:

   10  HIMEM:¤8000
   20  *¤8000:
   30  !M1:=1!=T1-M1
   40  !T1:123F20642D15361E0700
   50  !:
   60  *¤E8:!=M1!:
   70  HGR=2:COLOR=15
   80  SCALE=8
   90  FOR I=1 TO 64
   100 ROT=I:DRAW 1 AT 20+3*I,50+2*I
   110  NEXT

Программа загружает таблицу описанного выше примера за установленной оператором 10 верхней границей памяти под переменные, при этом таблица оказывается защищенной при выполнении программы и любых операциях ее редактирования. Так, чтобы добавить еще один описатель, достаточно при загруженной программе набрать:

  
  30  !M1:=2!=T1-M1!=T2-M1
  32   T2:¤....  код второй таблицы.

* * *