Сайт посвящен ПЭВМ АГАТ: Передовица » Макулатура » Штатная документация » Агат-7 Книга 7 » Фг 00003-01 33 02

New: 01.08.2020

Форум

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

Software

Hardware

Агат ↔ PC

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

Люди

Макулатура

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

Ссылки

Контакты ✉

Помощь сайту

Фг 00003-01 33 02

    УТВЕРЖДЕН

Фг 00003-01 33 02-ЛУ

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

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

Программное обеспечение

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

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

Фг 00003-01 33 02

1985

 

* * *

АННОТАЦИЯ

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

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

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

СОДЕРЖАНИЕ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ОСТАНОВ - одновременно нажаты клавиш УПР, Ц или выполнен STOP;

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

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

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

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

ОШ.МЕТКА - начало оператора ассемблирования принято за метку, но меткой служить не может, например  ! МЕТКА+1: RTS ;   может быть вызвана неправильной записью операции (! TXW);

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

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

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.

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

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

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

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

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

3) Следующие сведения могут оказаться полезными при обработке ошибок в программах.

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

Команда POKE 216,0 отключает рвыполнение оператора  ONERR GOTO. После выполнения команды Y=PEEK(222), Y будет равен коду ошибки.

Коды ошибок и их соответсвие диагностическим сообщениям русской и английской версиях приведены в табл.1.

                                          Таблица 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

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

  40 IF PEEK(216) > 127 THEN GOTO1000

4) Переключать страницы памяти можно непосредственно в программах с помощью команд   POKE -14592+KR+NS*Q, 0

Примечания:

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

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

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

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

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

6) Интерпретатор языка "Бейсик" имеет 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.

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

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

Вначале нанесем его на бумагу так, чтобы каждая точка занимала одну клетку.

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

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

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

Развернем эту последовательность векторов и расположим их в том порядке, в каком "перо" проходит через точки объекта:
↓ ↓ ⇐ ⇐ ↑ ⇑ ⇑ ⇑ → ⇒ ⇒ ⇒ ↓ ⇓ ⇓ ⇓ ← ⇐

Поместив векторы в таблицу следующим образом:

СекцииCBACBA
Байты
0010010
1111111
2100000
301100100
4101101
5010101
6110110
7011110
8111
9 конец описания00000000

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

Заполним теперь другую таблицу. Преобразуем последовательность нулей и единиц в шестнадцатеричный формат и добавим 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:¤....  код второй таблицы.

* * *