[an error occurred while processing this directive]

*==============================*
* <C> BIOCOMPUTER and FRIENDS' *
*          SOFTWARE            *
*    ИНТЕРПРЕТАЦИЯ КОМАНДЫ     *
*      ВЕРСИЯ  11.01.95        *
*   [ процедуры и функции ]    *
*------------------------------*
*   Волков И.М. Серков С.В.    *
*==============================*


*=============================*
* НАЧАЛО ОБСЛУЖИВАНИЯ КОМАНДЫ *
*=============================*

DRIVE    LDY#8         Обнулить управляющие флаги команды
         LDA#0         и флаг количества параметров
DRVINT   STA XBUF1,Y
         DEY
         BPL DRVINT
         INY           Y=0
         LDA (BAS),Y   
         CMP #¤22      Имя функции начинается с кавычек.
         BEQ INTOPER   После & не кавычки-значит это имя
         JMP FUNCTION  переменной; уйти на функции.
INTOPER  JSR RDOPER
         BCS BASERR12
         JSR SEARCH    Поиск имени функции.
         BCS BASERR12  Имя не найдено.
         JSR SETFLAG   Установить флаги команды
         JSR COMDIR    Проверить режим команды
         BCS BASERR112 "НЕ В ДИАЛОГЕ"
         JSR GETCHR
         BEQ EXEC      Если после имени ноль или запятая
         CMP #¤3A      то исполнить немедленно.
         BEQ EXEC
         BIT FUNFLAG
         BPL INTOPER1  Не функция
         CMP #¤28      Или же потом для функций обязатель-
         BNE BASERR12  на открывающая скобка (
         JSR GETCHR
INTOPER1 LDA WORKSIM   Если установлен флаг нестандартной
         BNE COMSTART  интерпретации то сразу исполнить. 
         JSR GETPARAM  Иначе -  считать параметры
         BCS BASERR57
EXEC     JSR CHECKPAR  Проверить количество входн. парам.
         BCS CHECK.ER 
COMSTART JSR COMAND    Исполнить команду.
         BIT FUNFLAG   Это функция?
         BPL INTEND    Нет, это оператор
FUNPAR   STA ZBH       Положить результаты в сумматор
         STY ZBL
         STX LONG
INTEND   RTS

COMAND   JMP (OPER)

CHECK.ER LDA BCHER
         BNE BASERR57

BASERR35  LDX#35      - мало данных
          DFB ¤2C
BASERR12  LDX#12      - синтаксическая ошибка 
          DFB ¤2C
BASERR46  LDX#46      - ошибочное значение
          DFB ¤2C
BASERR57  LDX#57      - переполнение
          DFB ¤2C
BASERR112 LDX#112     - не в диалоге


BASERR   DO ATRIBDR&:10000000

         JMP DRBASEXIT  для драйверов в банках

         ELSE
         
         JMP SYSERR     для ОЗУ-драйверов

         FIN

                      
*=====================*
* ВЗЯТЬ СИМВОЛ ИЗ BAS *
*=====================*

GETCHR   INC BAS
         BNE GETC1
         INC BAS+1
GETC1    LDY #0
         LDA (BAS),Y
         RTS

*==========================*
* УСТАНОВИТЬ ФЛАГИ КОМАНДЫ *
*==========================*

SETFLAG  LDY#0          разбор битовой карты
         LDA (MEM),Y    атрибута команды
SETFLG1  ASL A
         BCS SETFLG3
SETFLG2  INY
         CPY#8
         BNE SETFLG1
         RTS

SETFLG3  PHA            при установленном бите в
         LDA#¤80        соответствующий ему флаг
         STA FUNFLAG,Y  установливается ¤80
         PLA
         JMP SETFLG2

*=========================*
* ПРОВЕРКА РЕЖИМА КОМАНДЫ *
*=========================*

COMDIR   JSR DIALOG
         BCS COMDIR1
         ASL COMFLAG
         RTS

COMDIR1  CLC
         RTS

*=================*
* ПОИСК ОПЕРАТОРА *
*=================*

SEARCH   LDA #>MODULE    начать с метки MODULE
         LDX #<MODULE
SEAR1    STA MEM
         STX MEM+1
         LDY #5
         LDX #0
SEAR2    LDA (MEM),Y
         BEQ SEAR3
         CMP #¤A0        пробел
         BEQ SEAR3
         INY
         BNE SEAR2
SEAR3    TYA     
         SEC
         SBC#6
         STA BCALC
         LDY #5
SEAR4    LDA WORDOP,X    сравнить имя в буфере
         CMP (MEM),Y     с именем команды в тексте
         BEQ ISCHR       модуля 
SEAR5    LDY #2
         LDA (MEM),Y
         BEQ EXITERR
         TAX
         DEY
         LDA (MEM),Y
         JMP SEAR1

ISCHR    CPX BCALC
         BEQ ISCHR1
         INY
         INX
         BNE SEAR4

EXITERR  SEC
         RTS

ISCHR1   INY
         INX
         LDA WORDOP,X
         BNE SEAR5

CHENDS   LDA (MEM),Y
         BEQ FINDOK1
         ORA #¤80       От комментария имя команды должно
         CMP #¤A0       быть отделено пробелом.
         BEQ FINDOK
         BNE EXITERR
FINDOK   INY            пропустить комментарий
         LDA (MEM),Y
         BNE FINDOK     JMP
FINDOK1  INY        
         TYA
         CLC
         ADC MEM        Получить адрес исполняемой
         STA OPER       части команды и поместить
         LDA #0         его в OPER.
         ADC MEM+1
         STA OPER+1
EXITOK1  CLC
         RTS
   

*==================*
* СЧИТАТЬ ОПЕРАТОР *
*==================*

RDOPER   LDX #0
RDOP1    JSR GETCHR
         CMP #¤22
         BEQ RDOP2
         ORA #¤80       Имя команды состоит только
         STA WORDOP,X   из заглавных букв
         INX
         LDA #0
         STA WORDOP,X
         CPX #¤F        Имя команды не длиннее 15-ти
         BCC RDOP1      символов включительно.
         RTS

RDOP2    TXA
         BNE EXITOK1
         RTS

WORDOP   DS  16

*===================*
* СЧИТАТЬ ПАРАМЕТРЫ *
*===================*

GETPAR1  JSR GETCHR
GETPARAM JSR ¤DD4E    Вычислить числовое выражение
         JSR ¤E712    и отбросить дробную часть.
         LDX XBUF1
         CPX #¤20
         BCS QUITPAR  ; Error: Переполнение буфера
         LDA ¤50
         STA BUF1,X
         LDA ¤51
         STA BUF11,X
         INX
         STX XBUF1
         JSR GETC1
         BEQ GETP1
         CMP #¤3A
         BEQ GETP1
         CMP #¤2C
         BEQ GETPAR1
GETP0    CMP#¤29      Для функций должна быть закрывающая
         BNE FUNC1    скобка )
         BIT FUNFLAG
         BPL FUNC1
         JSR GETCHR
         BEQ EXITOK2
         CMP#¤3A
         BEQ EXITOK2
GETP1    BIT FUNFLAG
         BMI FUNC1
EXITOK2  CLC
QUITPAR  RTS

*=====================*
* ПРОВЕРКА КОЛИЧЕСТВА *
* ВХОДНЫХ  ПАРАМЕТРОВ *
*=====================*

CHECKPAR LDY #3
         LDA XBUF1
         CMP (MEM),Y
         BCC CH_ERR
         INY
         CMP (MEM),Y
         BCC NORMCH
         BNE CH_ERR
NORMCH   CLC
         RTS

CH_ERR   CPY#3
         BNE CH_MANY
         LDA#¤00
         DFB ¤2C
CH_MANY  LDA#¤FF 
         STA BCHER 
CH_ERR2  SEC
         RTS

*====================*
* ОБРАБОТЧИК ФУНКЦИЙ *
*====================* 

FUNCTION JSR ¤E007        найти указатель переменной
         STA ¤85          или создать его если его еще нет
         STY ¤86
         JSR GETC1
         CMP #¤D0         пропустить знак "="
         BNE FUNC1
         LDA ¤12          флаг числа
         PHA
         LDA ¤11          флаг типа переменной
         PHA
         JSR GETCHR
         CMP #¤22
         BEQ FUNC2
FUNC1    JMP BASERR12
FUNC2    JSR INTOPER      интерпретировать функцию 
         
FUNRET   BIT FUNFLAG      присваивание
         BPL FUNC1        не функция, присваивать нельзя
         LDX FUNTYPE
FUNRET1  STX ¤11          Установить тип функции
         PLA              0-число,¤80-строка
         ROL A
         JSR ¤DD54        сверить тип переменной с типом
         BNE FUNSTR       результата функции
FUNNUM   LDA ZBH
         LDY ZBL          взять результат числовой функции
         JSR ¤E305        преобразовать в формат с 
         PLA              плавающей запятой и
         JMP ¤D9D7        присвоить его переменной
FUNSTR   PLA
         LDA#<LONG        Присвоить результат строковой
         LDY#>LONG        функции указанной переменной
         STA ¤A1          с выделением необходимой
         STY ¤A0          памяти и переносом текста в
         JMP ¤DA15        область хранения переменных
;                         интерпретатором "Бейсик"

;-СУММАТОР ДЛЯ РЕЗУЛЬТАТА ФУНКЦИИ-

LONG     DS 1  длина текста или 0
ZBL      DS 1  адрес текста или значение целого числа
ZBH      DS 1  младший/старший


*------ СЛУЖЕБНЫЕ ЯЧЕЙКИ ------*

BCHER    DS  1       служебная
BCALC    DS  1       служебная
XBUF1    DS  1       количество найденных параметров

*------ ФЛАГИ -------*

FUNFLAG  DS  1       признак функции
WORKSIM  DS  1       признак нестандартной интерпретации
COMFLAG  DS  1       режим команды
FUNTYPE  DS  1       тип результата функции (для функций)
         DS  4       резерв

*------ БУФЕРЫ ДЛЯ НАКОПЛЕНИЯ ПАРАМЕТРОВ ------*

BUF1     DS  ¤20     буфер для младших байтов параметров
BUF11    DS  ¤20     буфер для старших байтов параметров

MODULE

;--------------------------------------------------------
;         ОПИСАНИЕ ФОРМАТА КОМАНД МОДУЛЯ
;--------------------------------------------------------
;
; Модуль должен начинаться с метки NEXTOPER и распола-   
;    гаться после команды "LIST". Его описание включает:
; 
; -  1 байт - атрибут команды в битах.
;
;  ! номер !               значение
;  !-------!--------------------------------------------
;  !   7   !  "1"-функция, "0"-процедура
;  !   6   !  "1"-нестандартная интерпретация параметров,
;  !       !  "0"-обычная
;  !   5   !  "1"-запрещена в режиме диалога, "0"-нет 
;  !   4   !  "1"-результат функции-строка, "0"-число
;  !  3-0  !  резерв (в наст. версии не используются)
;
; -  2 байта ссылка на следующий оператор
;    (если следующего оператора нет то 0,0)
; -  2 байта минимальное и максимальное количество вход-
;    ных параметров (если их нет, то 0,0), допустимо 31.
; -  Имя оператора, которое не содержит пробелов, записано
;    заглавными буквами и имеет длину не более 15-ти
;    символов.
; -  После имени оператора, может идти комментарий, отде-
;    ленный от команды пробелом и должен заканчиваться 
;    нулевым байтом.
;
; Функция должна вернуть:
; -----------------------
;  X - длина текста (для числовых функций не используется
;  A,Y - адрес хранения текста в ОП или значение целого
;        числа в формате младший/старший.
;
; Например:
;    
;    DFB ¤00                      Простая процедура.
;    DW  NEXTFUN
;    DFB ¤04,¤05
;    ASC "OPER.ONE vt,ht,xl,yl,color"
;    DFB 0
;
;NEXTFUN DFB:11100000             Функция с параметрами
;        DW NEXTOPER2             по нестандартной интер-
;        DFB ¤00,¤00              претации, запрещенная
;        ASC "FUN.ONE x1,y1,STR¤" в режиме диалога с чис-
;        DFB ¤00                  ловым результатом.
;
;---------------------------------------------------------

*------------------------------*
*       оператор "LIST"        *
*------------------------------*

LIST     DFB:00000000
         DW  NEXTOPER
         DFB 0,0
         ASC "LIST"
         DFB 0


LST0     LDA #0
         STA ¤06
         JSR LST7 
         LDA DGW
         SEC
         SBC UGW
         STA LSSR+1
         LDX #>MODULE
         LDA #<MODULE
LST1     STX MEM
         STA MEM+1
         LDY #5
LST2     LDA (MEM),Y
         BEQ LST3
         JSR COUT1
         INY
         BNE LST2
LST3     JSR LST7 
         LDY #0
         INC ¤06
         LDA ¤06
LSSR     CMP #¤00
         BCC LST5
LST6     LDA ¤C000
         BPL LST6
         STY ¤06
LST5     LDA ¤C000
         CMP #¤9B
         BEQ LST4
         INY
         LDA (MEM),Y
         TAX
         INY
         JSR LST4
         LDA (MEM),Y
         BNE LST1
LST4     STA ¤C010
         RTS
LST7     LDA#¤8D
         JMP COUT1

.ст Раздел I:Приложение 4

[an error occurred while processing this directive]