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