[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]