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