[an error occurred while processing this directive]
( Данная документация написана в системе ASSEMBLER ) BForth2.0( FORTH-79 ) для ЮСН В данной документации рассматриваются возможности модернизации системы и возможные пути использования. ПРИМЕЧАНИЕ: Все ниженаписанное относится только к версии BForth2.0 Содержание 1. Структура работы с внешними процедурами. 1.1 Работа с УСТРОЙСТВОМ 1.2 Работа с ПРЕРЫВАНИЕ 1.3 Работа с ВВОД/ВЫВОД 1.4 Работа с ПАМЯТЬ 2. Формат форт- слов. 3. Формат и примеры библиотеки. 4. Полный глоссарий BForth 5. Дополнения по графике ------------------ГЛАВА 1.-------------------------------- В данной главе будут рассматриваться все возможности системы, позволяющие создать то, что ВАМ нужно. 1.1 Работа с УСТРОЙСТВОМ Термин УСТРОЙСТВО обозначает некое абстрактное понятие, введенное для того, чтобы Во- первых: Пользователь не задумывался о таких мелочах как номер слоты к которой под- ключен принтер или память или дисковод, а использовал их мнемонические обозначения( a:, b: и т.д. ). Во- вторых: для наращивания мощности системы при работе с "незнако- мыми" ей контроллерами. В- третьих: потому, что форт не накладывает никаких ограничений на работу с внешними уст- ройствами( кроме стандартных ). Для того, чтобы некое УСТРОЙСТВО могло работать в систе- ме оно "обязано" выполнять некоторые соглашения по сво- ей структуре( но не по содержимому ) и должно при этом "зарегистрироваться" в системе. РЕГИСТРАЦИЯ: Для того, чтобы система могла работать с УСТРОЙСТВОМ необходимо сказать системе где на- одиться обработчик устройства. Для этого: 1. Выдать в стек адрес обработчика ( например: ' teac ) 2. Выполнить слово REGTREAT, которое зарегистрирует обработчик в области TREATERS. СОГЛАШЕНИЯ: УСТРОЙСТВО должно "уметь" ... а) ... опознать "свой" контроллер или устройство. б) ... выполнять некоторые функции из числа обязательных. в) ... подготовить для себя некоторые ячейки в области памяти, отведенной для этого УСТРОЙСТВА. Более подробно о том каким должно быть УСТРОЙСТВО: ПРИМЕР 1.1.1 Организация устройства TEAC в библиотеке SYSTEM.FRL ; Опишем связующую процедуру teac ( * ) jsr Does dw makechoice ; PFA+ 2 dw TF0 dw TF1 dw TF2 dw TF3 dw TF4 Функция записи блока есть dw TF5 Операции чтения файла( чтение, фиктивное..) dw TF6 ; ( запись, удаление, переименование и т.д. ) dw drverr Чтение байта недоступно dw drverr Запись байта недоступна dw drverr Инициализации пока нет( форматирование ) dw TFA Установка параметров Данное УСТРОЙСТВО организовано в виде <BUILDS .. DOES> Т.е. при выполнении слова TEAC на стеке должно находиться число из диапазона 0.. &A, которое в данном случае будет определять номер функции которую необходимо выполнить УСТРОЙСТВУ TEAC. Список стандартных функций: 0- Опознать свое устройство на слоте( SlotNo- True/False ) ( Если 0 функция опознала "свое" устройство на слоте, то необходимо: 1. Прописать соответствующими данными рабочую область слоты( см. ниже ) 2. Выдать в стек флаг ИСТИНА( TRUE ) иначе необходимо выдать в стек флаг ЛОЖЬ( FALSE ) ) 1- Включить устройство ( В принципе данная функция не нужна, но была введена для возможной параллельной работы( сеть ) ) 2- Выключить устройство ( то же ) 3- Считать блок данных с устройства( MemAdr TSListAdr- ) ( Данная функция считывает в память кусок данных, опреде- ляемый TS списком, в котором содержаться физические адреса устройства( для TEAC 1100, 3200, 7200 и т.д. ) Последний адрес в списке слово NULL( 2 нулевых байта ) ) 4- Записать блок данных на устройство( MemAdr TSListAdr- ) ( то же, что выше ) 5- Мультифункция работы с файловой структурой на ЧТЕНИЕ ( Данная функция является многозначной функцией, что позволяет получить обширный список функций при рабо- те с файловой системой. Для того, чтобы получить дос- туп к подфункциям необходимо выдать номер этой подфун- кции ( скажем для данной 5 функции: 0 5 OUTD т.е. будет исполнена 0 подфункция 5 функции( почти как в MSDOS )) В стандартной комплектации SYSTEM.FRL у 5 функции реализовано: 0- Есть ли файл на устройстве( FNameAdr- Flag ) 1- Выдать каталог по шаблону в память ( MemAdr PatternAdr- ) Формат выдаваемого каталога: 1б. Длина имени файла 2б.- x Само имя файла( максимум 16 символов ) x+1 Символ ENTER x+2 Тип файла ) 6- Также мультифункция для работы с файловой структурой на ЗАПИСЬ ( Как и выше. Определены стандартные подфункции: 0- Удалить файл( FileNameAdr- ) 1- Создать пустой файл ( FType FLen FNameAdr- MemAdrTSList Flag ) ) 7- Считать байт с устройства ( Данная функция не реализована в системной библиотеке ввиду ее ненужности для дисковода. Но для работы с сетью, принтером и т.д. эта функция неободима ) 8- Записать байт на устройство ( Аналогично как и выше ) 9- Разметить свое устройство ( Данная функция не реализована в системной билиотеке ввиду нехватки времени. Но необходима при работе в сети, с принтером и т.д. ) A- Установить параметры ( Данная функция введена для убыстрения работы драйвера дисковода, чтобы при работе непосредственно с дисково- дом не лазить за параметрами в слотовую область ) ПРИМЕЧАНИЕ: СЛОТОВАЯ ОБЛАСТЬ- область памяти находящаяся на адресах ¤400..¤9ff т.е. например для слоты 1- ¤400..¤4ff 2- ¤500..¤5ff .... В самой ОБЛАСТИ---------------------------------------- Смещение Значение ( Обязательная часть ) SlotHeader 0 Код устройства на слоте 1 Номер слоты *10h 2,3 Адрес обработчика слоты ----------------------------------------- Данная часть представляет собой заголовок данных для обработчика( если на слоте > 1 подустройства, то данных заголовков должно быть ровно столько же ) DeviceHeader 0( 4 ) Код логического устройства( 0- нет ) 1( 5 ) Смещение до следующего устройства( 0- нет ) 2( 6 ) Занятость устройства( id захватчика, 0- нет ) -------------------------------------------------- Все, что находится ниже на усмотрение разработчика и называется DeviceParms ПОЯСНЕНИЯ: Код устройства на слоте- это число из диапазона 1..255, которое определяет приоритет устройства при задании логичес- кого устройства. ( коды в FHEADER ) Адрес обработчика- Адрес самой процедуры ( для TEAC это * ) 1.2 Работа с ПРЕРЫВАНИЕ ПРЕРЫВАНИЕ имеет структуру подобную цепочке. Т.е. испол- няемая в текущий момент процедура "знает" только следую- щий элемент в цепочке, которому и передает управление по завершении своей работы. Структура процедуры типа ПРЕРЫВАНИЕ: Поле Команда CFA: jmp *+5 myint: PFA: dw 0 <-- Слово для перехода к следующему прерыванию в цепочке. PFA+2: Любая последовательность команд ... PFA+n: jmp (mynmi) <-- Переход к следующему прерыв. Все прерывания( NMI, IRQ ) имеют одинаковую структуру, опи- санную выше, но устанавливаются по- разному( пусть слово- прерывание имеет имя MYINT ) Прерывания NMI: ' MYINT NMISET IRQ: ' MYINT IRQSET При выполнении такой последовательности слов например на NMI слово MYINT будет помещено в цепочку прерывания NMI Т.е. это слово будет выполнятся непосредственно после поступления сигнала NMI. ВАЖНО: ВАМ НЕ нужно заботиться о сохранении и восстанов- лении регистров. Система позаботиться об этом сама. Единственно что не нужно пытаться, выполнить одно и то же слово в NMI и IRQ. 1.3 Работа с ВВОД/ВЫВОД Работа с ВВОД/ВЫВОД построена по такой же схеме цепочки, как и ПРЕРЫВАНИЕ. Поэтому при работе с ВВОД/ВЫВОД ВЫ вольны перенаправить этот поток туда куда ВАМ заблагорассудится. Структура слова для ВВОД/ВЫВОД: Аналогично как и ПРЕРЫВАНИЕ. ПРИМЕР 1.3.1 МыХотим Отмечать каждый вывод символа через OUT щелчком НадоНаписать :DEV MYBEEP &C030 C@ DROP ;DEV ' MYBEEP OUTSET ПослеЭтого При выводе любого символа будет щелчок ВАЖНО: Т.к. структура слов для ВВОД/ВЫВОД и ПРЕРЫВАНИЕ одинаковы, то их можно взаимно заменять, но не перемешивать. ПРИМЕР 1.3.2 Организация OUT в системе: OUTRESET ( сбросим весь ВЫВОД ) ' CONOUT ( выдать в стек адрес слова для ВЫВОДА не текстовую консоль ) OUTSET ( установить CONOUT на ВЫВОД ) ПРИМЕЧАНИЕ для пунктов 1.2, 1.3 Для предотвращения потерь времени связанных с прохождением цепочек в ВВОД/ВЫВОД и ПРЕРЫВАНИЕ введены специальные ячейки для сигнализации того, что обработка уже произошла( напр: при ВВОД если произошел ВВОД с клавиатуры, то нет необходи- мости обходить всю цепочку дальше ). И поэтому в каждом слове обработчике необходимо делать проверку на признак блокировки цепочки( если это необходимо ) Тип Слово ЯчейкаАссемблера IN INWAS InWas OUT OUTWAS OutWas NMI NMIWAS NmiWas IRQ IRQWAS IrqWas 1.4 Работа с ПАМЯТЬ Для того, чтобы уменьшить головную боль при работе с па- мятью, не находящейся на основном слое памяти, в системную библиотеку были введены слова работы с ДОП памятью. Основные_Принципы: 1.Любая программа для получения доступа к памяти должна указать системе- Кому будет принадлежать тот или иной блок памяти. Другими словами программа, пре- тендующая на память должна зарегистри- оваться у системы. Процесс регистрации состоит в том, что на стек выдается индентификационный номер программы из диапазона &80.. &ff и исполняется слово SETID( &80 SETID ). При выполнении этого слова происходит запоминание текущего состояния памяти. 2.После установки ID программа может захватить память. Скажем ВАМ нужно 10 кб памяти. Для ее захвата: 2 ALLOC В результате система зарезервирует для ВАШЕЙ программы 16 кб( 2 блока ) Но всю сразу ее использовать нельзя, только блоками по 8 кб. Каждый заре- зервированный блок подключается на адреса &A000-&BFFF.( например ВАМ необходим на этих адресах 2 блок из зарезервированных ВАМИ. Этот блок будет подключен после 2 SETMEM ). Может возникнуть ситуация когда в сис- теме не будет памяти для ее выделения ВАМ.Как избежать ошибок в этом случае? Для этого необходимо проанализировать число, возвращаемое ALLOC( ALLOC возв- ращает число зарезервированных блоков ) 3.После работы с памятью ВАША программа может освободить ее( FREE ) или не де- лать этого( NOFREE ) и передать управ- ление вызвавшей ВАС программе. При этом в любом случае будет восстановлена кон- фигурация памяти, предшествующая теку- щей. ПРИМЕЧАНИЕ: ID на самом деле может быть любым <>0 но ID= 1..&7F отводятся для системных применений. Так например: 1- Графика 2- Редактор 3- Загрузчик 4- Шрифты ID=1 отличается тем, что для него резер- вируется память по 16 кб. и подключается а адреса &8000.. &BFFF. ID=3 отличается тем, что при возникнове- нии ошибки вся память, занятая этим ID будет освобождена. ---------------------Глава 2.--------------------------- Форт-слово это некая процедура, которая может быть найдена по ее имени в словаре. При записи на ассемблере форт-слово определено как: dfb ¤83 Поле NFA( начало ) Этот первый байт имеет структуру: 7 6 5 4 3 2 1 0 биты ^ ^ ^ ^ ^ ^ ^ ^ ! ! ! !--+----! ! ! ! ! ! ! ! Остальные биты - длина названия слова ! ! ! ! ! +-Признак незавершенности компиляции ! +---Признак непосредственного исполнения +-----Признак начала названия asc "duP" Само название слова( все битыN7 во всех байтах, кроме последнего, сброшены ) dw Over Поле LFA. Здесь находится адрес слова, опи- санного ранее в словаре, если же такого слова нет, то LFA= 0. .... Поле PFA. Здесь записаны команды. rts Возврат в предыдущее слово. ПРИМЕР записи слова SETSCREEN( как это есть в BFORTH ) ; Установим режим отображения Setscreen dfb ¤89 ( Screen_page Screen_Mode - ) asc "setscreeN" dw Escapestr setscreen jsr dup jsr lit Выдадим на стек число 5 dw ¤5 jsr less Если номер режима < 5, то ОК jsr zbran Переход к m300, если на стеке 0 dw m300-*-2 jsr dup По таблице векторов перейдем к нужному jsr mul2 jsr scrdrivers jsr plus jsr at jmp exec m300 jsr ddrop jmp false ( вместо JSR FALSE + RTS ) ---------------------Глава 3.---------------------------- Библиотека для форт- системы это скомпилированная однажды программа, которая может быть подстыкована к системе гораздо быстрее, чем при компиляции. И при этом может быть написана целиком на ассемблере. Формат библиотечного модуля: Байты Значение ЗАГОЛОВОК 0,1 Смещение до начала самого модуля от начала ЗАГОЛОВОК 2,3 Длина самого модуля( без ЗАГОЛОВОК ) 4,¤41 Смещения входов в словарь( от начала МОДУЛЬ ) ¤42,??? Смещения на объектные метки( в LIB модуле нет абсолютных адресов, лишь смещения ) Поэтому при загрузке LIB необходимо при- бавить адрес загрузки МОДУЛЬ ???+1- Первое слово инициализация библиотеки, отражающее суть библиотеки. Все остальное на усмотрение разработчика Для того, чтобы пристыковать библиотеку к форт- системе необходимо: 1. Загрузить библиотеку на адрес HERE 2. Выполнить слово CONVERTLIB Необходимые примеры построения библиотек можно найти в файлах SYS*.* ---------------------Глава 4.---------------------------- Полный глоссарий BFORTH можно найти в файле FWORDS.ASM ---------------------Глава 5.---------------------------- 5.1 Инициализация графики Для нормального функционирования графики необходимы: а) Память б) Шрифты При инициализации графики необходимо: а) Просмотреть память системы( SYSMEM ) на наличие памяти под графику( формат SYSMEM см. ниже ) Необходимо найти память, захваченную ID= 1, и блока по номеру = PAGE* 2+ 1. Если такой памяти нет, то выйти из инициализации с флагом FALSE. б) Просмотреть всю память на наличие ID= 4. Т.е. шриф- тов. Если памяти нет, то блокировать вывод в графику символов. Иначе при выводе символов в графику подключать блок со шрифтами к адресам D000..DFFF. Таким образом за раз в памяти может сидеть 2 шрифта ( в старшей и младшей половине банка ). При инициализации библиотеки графики необходимо: а) Перехватить цепочку OUT при работе на консоль. б) Создвть возможные таблицы. в) Записать по адресам SCRDRIVERS+4..9 адреса процедур, которые будут запускаться при ыстановке соответствую- щего режима. SCRDRIVERS+4..5- MONOGRLO +6..7- COLORGRHI +8..9- MONOGRHI Для графики распределение ячеек, которые необходимо установить в первую очередь: ENDPOS Адрес начала строки ВЕРХ окна BEGPOS Адрес начала строки НИЗ окна CURRPOS Текущая позиция для вывода текста WINX Координата по X ЛЕВОВЕРХ окна( X число символов от физического угла окна ) WINY То же, но координата по Y WINWIDTH Ширина окна WINDEPTH Глубина окна POSX Текущее положение текстового курсора по X POSY --------------------------------------- Y XCOOR Координата по X для точечной графики YCOOR ------------- Y -------------------- ATRIBUTE Атрибуты вывода графики PAGE Страница графики( 0.. 3 ) MODE Режим работы( см. FHEADER.ASM ) ПРИЛОЖЕНИЕ: Структура описателя системной памяти SYSMEM Каждый блок памяти( 8 кб ) описывается 4 байтами, которые находятся в SYSMEM. Их формат: 1 б. ID программы- захватившего блок( FF- своб. 0- нет ). 2 б. Номер блока в последовательности. 3,4 б. Адрес на включение к 0 банку. Всего на данный момент система может обеспечить нормаль- ную работу 1 дополнительной слоты памяти.[an error occurred while processing this directive]