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