Think #46
04 августа 2000

Обзор системных новинок - Некоторые замечания попрограммированию под MythOS.

       ╔══════════════════════════╗
       ║ ОБЗОР  СИСТЕМНЫХ НОВИНОК ║
       ╚══════════════════════════╝

         Некоторые замечания по
       программированию под MythOS

Данный раздел представляет некоторые главы
из проекта MythOS programming guide :)

- Файловая система

- Система   взаимодействия   с    блочными
  устройствами

- Система прерываний

- Функции системы

------------------------------------------

  Каждое  прерывание  программа  обработки
прерываний выполняет такие действия: - вы-
числяются новые координаты курсора в соот-
ветствии  с  положением мыши (либо нажатии
клавиш  курсора)  и  заносятся в системные
переменные. - нажатие клавишь мыши (а так-
же  соответствующих клавишь на клавиатуре)
отмечается  в  системной  переменной. - из
системной  переменной устанавливается цвет
бордюра.  -  просматривается таблица обра-
ботчиков  прерываний, коректируется значе-
ние  счетчиков прерываний. Выполняются об-
работчики.  Обработчик  можно настроить на
нужную  частоту  выполнений,  задав  число
прерываний,  которые необходимо пропустить
перед  выполнением обработчика. Обработчик
можно  установить при помощи процедуры 70,
которая  на выходе выдаст номер обработчи-
ка.  Для  снятия обработчика по его номеру
необходимо использовать процедуру 71.

------------------------------------------

         Система взаимодействия
        с блочными  устройствами

         (Нулевой уровень DOS)

  Взаимодействие  с блочными  устройствами
осуществляется  через  систему  драйверов,
что  позволит использовать не только стан-
дартные диски на 720 Кб., но и RAM-диск, и
даже винчестер. Размер одного блока строго
фиксирован  и  равен 256 байт, но при этом
размер  сектора определяется самим драйве-
ром и может быть любым.
  Обращение  к  любому блочному устройству
происходит  через  точку  входа 10 , перед
вызовом  нужно поместить в регистр "A" код
символа   физического  диска,  к  которому
происходит  обращение, а в регистр "B" но-
мер необходимой функции драйвера. Физичес-
кий  диск  обозначается  большим  символом
A..Z
  Таблица драйверов блочных устройств рас-
полагается  в странице (BlkDrvP) по адресу
(BlkDrvA).  Под  каждое  из  26  возможных
блочных  устройств  (от  A до Z) в таблице
зарезервировано  4 байта. Первый байт ука-
зывает   установлен-ли   драйвер   данного
устройства (0= не установлен), остальные 3
байта это адрес драйвера.

  Обращение к блочному устройству происхо-
дит таким образом:

LD B,5   ;номер функции драйвера
LD A,"A" ;имя блочного устройства

;в  остальных регистрах могут передаваться
 параметры для драйвера

CALL CallDos

DB 10 ;вызов диспетчера блочных устройств

Драйвер  блочного устройства должен выпол-
нять следующие обязательные функции:

#01 - Инициализация блочного устройства.
#05 - Чтение  в  нижнюю  память  блоков  с
      устройства.

In:C= количество блоков (1..64);

DE=номер первого блока;

HL=адрес загрузки;

#06 - запись блоков из нижней памяти.

In:C= количество блоков (1..64);

DE=номер первого блока на диске;

HL=адрес данных в нижней памяти;

------------------------------------------

             Файловая система

           (Первый уровень DOS)

  Взаимодействие   с  блочным  устройством
осуществляется через драйвер файловой сис-
темы,  которая  в  свою очередь использует
драйвера  блочных устройств. На каждое ло-
гическое  устройство можно установить свой
драйвер файловой системы, что дает возмож-
ность  работать  как с TR-DOS, так и с IS-
DOS,MS-DOS  дисками. Логическое устройство
можно   связать  с  любым  физическим  или
логическим  блочным устройством. Обращение
к  файловой системе происходит через точку
входа 9 с предварительным помещением в "B"
номера  требуемой  функции,  а в "A" имени
логического   диска   (A..Z),  к  которому
происходит  обращение.  Во  всех остальных
регистрах  драйверу  могут  быть  переданы
параметры.
  Таблица  драйверов файловой системы рас-
полагается  сразу  за  таблицей  драйверов
блочных  устройств, т.е. со смещением 26*4
байт.  В этой таблице на каждое логическое
устройство  отводится  по 8 байт. В первом
байте  находится код символа устройства, с
которым связано это логическое устройство,
причем  если  этот байт равен нулю, то это
логическое устройство свободно и его можно
связать  с  каким-либо другим устройством,
занеся  в  первый байт код символа устрой-
ства,  три байта - адрес драйвера файловой
системы.  Причем  если  символ "A".."Z" то
связывается  с  физическим  устройством, а
если  "a".."z",  то  с  логическим устрой-
ством. Следующие три байта - это адрес бу-
фера текущего пути для данного логического
устройства.  Последний байт в таблице пока
зарезервирован.  Таким образом эта таблица
займет  26*8  байт.  Если  логический диск
связан с другим логическим диском, то сис-
тема  цепляет  текущий путь диска в начало
строки,  передаваемой в качестве параметра
драйверу  файловой системы, и обращается к
другому  логическому диску с теми же пара-
метрами.
  Драйверы  блочных  устройств  и файловой
системы  могут подключаться из библиотеки,
однако  во избежание удаления их из памяти
необходимо счетчик использования библиоте-
ки установить на единицу больше.

  Обращение  к файловому устройству проис-
ходит таким образом:

LD B,1 ;номер функции драйвера
LD A,"A" ;логическое имя устройства ;в ос-
тальных регистрах могут передаваться пара-
метры для драйвера

CALL CallDos

DB 9 ;вызов диспетчера файловых устройств.

  Драйвер  файловой  системы должен выпол-
нять такие функции:

#00  - создать по адресу (CHL) список опи-
сателей  файлов, находящихся в текущем ка-
талоге.

  Признаком конца списка служит байт #00 в
первом  байте  имени файла. Созданный этой
функцией список имеет следующий формат:

+0 [Nb]  - имя файла

+N [1b]  - символ "."

+N+1[3b] - расширение файла

+N+4[1b] - #00 +N+5[1b] - атрибут файла

+N+6[4b] - длина файла в байтах

  Во  избежание  переполнения буфера жела-
тельно  предусмотреть достаточно места для
списка файлов. Если для какой-либо функции
требуется  указать имя/путь, то их необхо-
димо  помещать  в  буфер драйвера файловой
системы,  в  виде ASCIIZ-строки. Между ре-
гистрами  букв  делается  различие. вместо
символа "\" допустимо использовать "/".

#01 - Загрузка файла до 64 блоков длиной в
верхнюю память. In

In: имя в буфере.

DE= Смещение от начала файла в блоках.
HY=  количество  загружаемых  блоков, если
=0,  то грузится весь файл (но не более 64
блока).

LY,IX= адрес в верхней памяти, по которому
нужно загрузить файл.

Out:"Z"= File not found. "NZ"=Ok.

#02 - Выдать данные о файле.

In:имя в буфере.

Out:A= атрибуты  файла (для обычного файла
=0);

BCDE= длина файла в байтах;

IXHL= номер первого блока файла на диске;

"Z"= File not found; "NZ"= Ok;

#03 - Инициализация драйверов.

#04 - Резервировать пространство  под файл
на диске

In: ИИмя и расширение файла в буфере

BC,DE=длина файла в байтах
Out:

A=0 Ok

A=1 Такой файл уже есть

A=2 Нет места на диске

A=3 На диске 127 файлов

#05 - Запись в файл до 64-х блоков из вер-
хней памяти

In:Имя и расширение файла в буфере

DE=смещение от начала файла в блоках

HY=количество записываемых блоков, если=0,
   то берётся из каталога.

LY,IX=адрес данных для записи.

Out:

NZ=все записано.

Z=Файл не найден.(перед записью необходимо
зарезервировать место под файл! По умолча-
нию файл перезаписывается.)

#06 - Переименовать файл

In:в буфере старое имя файла

(CHL)= указатель  на ASCIIZ  строку, новое
имя файла

#07 - Удаление файла.

IN: имя и расширение файла находятся в бу-
фере


------------------------------------------
            Функции ядра MythOS
          (описание не закончено)

       на текущий момент 90 функций.

Управление окнами системы

OpenWin(15)  Открыть  окно,  указатель  на
описатель в AIX

CloseTopWindow(17) Закрыть верхнее окно.

GetLastWinInStack(53), EnableWinFocus(54),
EnablePassiveFocus(55),
RePaintTopWindow(59),  ReCreateWindow(68),
CloseWindow(76),       RePaintVisible(82),
ReSolveWinStack(86),   MinimizeWindow(89),
RestoreWindow(90).

Вывод в окно, работа с окном.

OutText(19) Вывод текста по адресу в (AHL)
в  окно,  описатель спрайта которого пере-
дается в регистрах LY,IX. Важно! Указывать
нужно  именно описатель спрайта, не описа-
тель окна!

OutChar(27)  Вывод символа из аккумулятора
в окно, адрес описателя спрайта которого в
LY,IX

SetOutPos(41)  Установить позицию вывода в
окне  в  значение C=X(пиксели), B=Y(знако-
место). Описатель спрайта окна в LY,IX.

GetCursorPos(48),    ChkClickOnObject(49),
OutSprite(88).

Служба событий

SendWinMessage(20)  Передать событие с но-
мером в регистре А с параметром в регистре
В  всем объектам окна, адрес описателя ко-
торого в регистрах LY,IX.
SendMessage(22) Передать событие с номером
в  регистре  А  с  параметром в регистре В
всем окнам и объектам.

SetIntHandler(70),      ResIntHandler(71),
SetGlobalHandler(77),ResGlobalHandler(78),
SendGMessage(79).

Работа с памятью

ReadMem(23) Чтение из памяти по адресу CHL
байта в аккумулятор.

WriteMem(24) Запись в память по адресу CHL
байта из аккумулятора.

MemAlloc(28)  Выделить  в одной странице В
подряд  идущих  блоков  памяти, пометив их
номером А. На выходе ZeroFlag=0, A=страни-
ца,  Н=старший байт адреса, где начинается
выделеная  память, если память выделена, и
ZeroFlag=1,  если память выделена не была.

CaptureBuffer(36) Захватить дополнительный
буфер.  После  вызова этой функции система
прекращает  использовать  основной  экран,
расположеный  в странице #05,#4000 предос-
тавляя его программе.

FreeBuffer(37)  Освободить буфер, запроше-
ный предыдущей функцией.

FindMemory(39) Найти первую группу свобод-
ных  блоков  памяти и вернуть в регистре А
их  количество  или  #00, если нет памяти.
Под  группой  свободных  блоков понимается
непрерывная область памяти в одной страни-
це.

CopyBlock(40) пересылка небольших массивов
памяти  между  страницами. адрес источника
указывается  в AHL, приемника в BDE, коли-
чество байт для пересылки в C.

RecodeMemTable(16),       CopyOPBlock(35),
CopyPBlock(38),            FreeLBlock(45),
FreeMemory(46),        TuneLibPointer(47),
GetPageMap(60),         ReadMapStatus(61),
WriteMapStatus(62),      GetMemoryNum(65),
FreeMemoryNum(66),      GetTotalPages(67).

 Архитектура и принципы построения MythOS

- Общие принципы системы

- Распределение памяти

- Структура приложений

- Библиотеки
------------------------------------------

Тип системы - псевдомногозадачная(коопера-
тивная  многозадачность), с монолитным яд-
ром, расширяемым путем подключения внешних
библиотек объектов и процедур.
 Для связи между приложениями используется
механизм  событий и общих областей памяти.
 Планируется реализация вытесняющей много-
задачности,  для предсказуемого планирова-
ния  количества времени процессора на одну
задачу.

------------------------------------------

 Доступная системе  память делится на сег-
менты   по   256   байт  и  в  таком  виде
распределяется   по  запросам  приложений.
Всего  допускается  до 254 приложений, так
как  элемент  таблицы  распределения имеет
размерность в 1 байт, код #FF зарезервиро-
ван под системные процессы, код #00 указы-
вает на свободный блок. При запуске каждо-
му  приложению  выделяется свой уникальный
номер в таблице памяти. Если требуется ис-
пользовать данные более чем в одном прило-
жении,  желательно запросить у системы от-
дельный  идентификатор  блоков и использо-
вать  его,  поскольку при случайном отказе
одного  приложения все выделеные блоки па-
мяти,  помеченые его кодом, будут освобож-
дены,  что может привести к интересным эф-
фектам.


На текущий момент карта памяти ядра выгля-
дит примерно так:

#6000-#8500  Нижняя  часть ядра. Обеспечи-
вает  управление  памятью и некоторые сис-
темные программы.

#C000,  Page  #04  Диспетчер функций ядра,
объекты графического интерфейса.

#C000,  Page #06 То, что не влезло в стра-
ницу #04 :)

------------------------------------------























  Каждое  приложение MythOS вправе исполь-
зовать  одну  страницу  верхней памяти под
непрерывную  часть  своего кода. Если тре-
буется больше памяти под код - его необхо-
димо  выделять  в  библиотеки и подгружать
диспетчером библиотек, при этом библиотеки
могут  разделятся  между  всеми  активными
приложениями системы.
  Весь код и все данные приложений хранят-
ся в верхней памяти, что накладывает неко-
торые  ограничения  на  программы и слегка
неудобно  в  использовании  :)  Приложение
должно  компилироваться  только  под адрес
#C000  и  поэтому  система  с 128КБ памяти
сможет запустить три приложения - по коли-
честву  свободных  страниц. От недостатка,
связаного  с  фиксированым расположением в
памяти,    свободны    библиотеки    - они
настраиваются на адрес размещения при заг-
рузке.  Чтобы  использовать  механизм биб-
лиотек, приложение  должно быть откомпили-
ровано в формате исполняемого файла консо-
ли  и правильно учитывать правила загрузки
и  освобождения  библиотек,  во  избежание
накладок.
  Принцип   построения   приложений  -  Вы
открываете    окно,   объявляете   объекты
интерфейса  и соответствующие им процедуры
обработки взаимодействия с пользователем -
все остальное делает система.
------------------------------------------
  Библиотеки   MythOS  представляют  собой
полностью  автономные  компоненты системы,
которые  возможно разделять между несколь-
кими приложениями. При запросе приложением
доступа к библиотеке она или загружается с
диска или увеличивается счетчик ее исполь-
зования,  если библиотека уже есть в памя-
ти.  После освобождения библиотеки счетчик
уменьшается  и  если  он становится равным
нулю - библиотека удаляется из памяти.
Примечание: Для консольных приложений, ко-
торые  также  используют  настройщик  биб-
лиотек,  необходимо помнить, что после от-
работки вызова функции #02 библиотеки дис-
петчер консоли удаляет библиотеку, поэтому
если  Ваше консольное приложение открывает
какое-либо  окно  или резервирует под себя
ресурсы  системы, то необходимо их или ос-
вободить до выхода из функции #02 програм-
мы или принудительно оставить библиотеку в
памяти путем повторного открытия самой се-
бя.

Особенность   применения  библиотек  - они
всегда грузятся в память под идентификато-
ром блока #FF(системный) поэтому необходи-
мо обязательно вызывать функцию освобожде-
ния  библиотеки  при завершении программы,
иначе  память  останется занятой. Еще один
нюанс  -  при  использовании из библиотеки
графической оболочки системы открытые окна
закрывать  нужно  соответствующей х 70 мм,
0.6  кг. Комплект поставки: БП, иложениях,
так  как неизбежно возникнут глюки распре-
деления памяти.
;Пример 01

;Разбор  по "косточкам" написания простей-
;шего приложения под MythOS , которое уме-
;ет  только  открывать  окно. (а что же вы
;хотите от приложения в котором всего лишь
;15 байт кода).
;После компиляции   необходимо  установить
;расширение "exe"

;Здесь идут некоторые полезные константы.
;Рекомендуется  их размещение в начале лю-
;бого приложения.(обещаю не изменять в да-
;льнейшем их значения)

STACK   equ #5FFF
Ker     equ #5B00
OPg     equ 4
OAd     equ #C000
Temp    equ #6000
ZadN    equ Temp+3 ;Номер текущей задачи
Border  equ Temp+6 ;Текущий цвет бордюра
PageN   equ Temp+8 ;Текущая страница
CallFn  equ Ker+6
CallDos equ Ker+9
CallPg  equ Ker+12
Return  equ Ker+15
Ret     equ Ker+18
ReturnF equ Ker+21 ;Выход без перерисовки
Zero    equ 0
Page    equ #5B21

;Приложение  всегда  загружается по адресу
;#C000 и запускается с него же.
        org #c000

        jp Start
        db "Coded by Stels/Myth corp.",0
;ASCIIZ-строка с названием приложения.
;-----------------------------------------
;Собственно само приложение
Start
      ;в AIX помещаем адрес главного опи-
       сателя окна
        ld a,(PageN)
        ld ix,MainWnd
;открываем окно
        call CallFn
        db 15         ;OpenWindow(AIX)
;возврат в систему
        jp Return

;эта процедура будет вызвана перед закры-
;тием приложения кнопкой "Close"

AppClose
         ret
;-----------------------------------------
;Главный  описатель окна (не путать с опи-
;сателем спрайта). Все  адреса в описателе
;трехбайтовые. Первый байт - это страница.
;Если значение первого байта равно #FF, то
;значит в качестве номера страницы берется
;текущая страница.
MainWnd
        db 1,1   ;+0 X,Y окна на экране (в
   ;знакоместах) меняется при  перемещении
   ;окна по экрану пользователем.

        db 16,10  ;+2 Len,Hgt окна  в зна-
                  ;коместах
        db 0      ;+4 Смещение,под которым
 ;в оконном стеке  лежит  ссылка  на  этот
 ;описатель.(Прописывается самой системой)

        db #ff:dw MainWndSpr
 ;+5  Адрес описателя спрайта
        db #ff:dw MainWndObjects
 ;+8  Адрес таблицы объектов
        db #ff:dw MainWndLight
 ;+11 Адрес таблицы подсветки
        db #ff:dw MainWndText
 ;+14 Адрес текстового оформления окна
        db #ff:dw MainWndHotKey
 ;+17 Адрес таблицы горячих клавишь
        db #ff
 ;+20 (Прописывается самой системой)

;ОПИСАТЕЛЬ СПРАЙТА
;(Для совместимости с последующими версия-
;ми должен располагаться сразу за описате-
;лем окна)
; сам спрайт имеет такую структуру:
; сначала располагаются  данные битов, ли-
; нейно по всей длине спрайта,первая стро-
; ка, вторая  строка и т.д. затем распола-
; гаются   атрибуты  знакомест, но об этом
; можно забыть, если  не ведется работа со
; спрайтом напрямую.
MainWndSpr
        db 0,0
;+21 Len,Hgt спрайта
;(Прописывается самой системой)
        dw 0
;+23 Страница,  и   старший  байт смещения
;спрайта (Прописывается самой системой)
        db #41
;+25 Байт состояния окна
;бит 0=0 печать на границах окна разрешена
;     =1 печать на границах окна запрещена
;бит 1=0 текущая система счисления DEC
;     =1 HEX система
;бит 2,3,4=0 (зарезервировано)
;бит 5=0 Нормальная печать символов
;     =1 выравнивать по знакоместам
;        (одно знакоместо - один символ)
;бит 6=0 Инверсия при печати выключена
;     =1 инверсия при печати включена
;бит 7=0 (зарезервировано)

        dw 0
;+26 Смещение от начала спрайта  до начала
;атрибутов спрайта.
;(Чтобы не вычислять каждый раз)
;(Прописывается самой системой)
        db 0
;+28 Длина всего спрайта в блоках
;(Прописывается самой системой)
        db #ff
;+29 Номер задачи (этим номером помечается
;память, занятая спрайтом)
;(Прописывается самой системой)

        db #38
;+30 Текущие атрибуты
;(которыми ведется печать)

        db 0,0
;+31 (X,Y)Координаты курсора печати в окне
; относительно верхн.левого угла окна
; позиция печати для процедур вывода
; Y измеряется в знакоместах,
; X в пикселах.

        db #ff
;+33 Номер окна
;(Прописывается самой системой)

        db 0
;+34 Логический номер текущего шрифта пе-
;чати
;#00 - шрифт 6x8
;#08 - шрифт 4x8

        db 0
;+35 стиль окна
;бит 0=0 окно с рамкой
;     =1 окно без рамки
;бит 1=0 выводить окно в нормальном полож.
;      1 выводить окно всегда  поверх дру-
;        гих окон
;бит 2=0 окно развернуто
;     =1 окно свернуто
;бит 3,4,5,6,7=0 (зарезервировано)

        db 0
;+36 Здесь начинается таблица зон окна
;   +0 номер зоны (1..254), если 0 то  ко-
;      нец таблицы
;   +1 координата X зоны относительно вер-
;     хнего левого угла окна в знакоместах
;   +2 координата Y
;   +3 длина зоны в знакоместах (1..32)
;   +4 высота зоны в знакоместах (1..24)
;при входе/выходе курсора в такую зону си-
;стемой кидается локальное событие с номе-
;ром 3/4 а в качестве параметра передается
;номер зоны.
;Но в данном случае нам зоны не нужны.
;-----------------------------------------

;Тамблица объектов.
;Все они обрабатывают локальные события
MainWndObjects
;Объект "кнопка Close"

        db 7,OPg
        dw OAd+27
        db #ff
;трехбайтовый адрес процедуры,

        dw AppClose
;которую необходимо выполнить перед закры-
;тием окна.

        db 0
;Конец таблицы объектов
;-----------------------------------------
;Таблица подсветки
MainWndLight

        db #78
;Атрибуты подсветки (0 - конец таблицы)
        db 16-1,0
;(X,Y)Координаты прямоугольника подсветки
        db 1,1
;(Len,Hgt) размеры прямоугольника подсвет-
;ки

        db 0
;Конец таблицы подсветки
;-----------------------------------------
;Текстовое оформление окна
;Далее идет строка  с  управляющими кодами
;печати, которая будет напечатана при отк-
;рытии окна

MainWndText
        db 8,#41, 9,0, 7,8,0, 10,
           "Тестовое окно",8,1
        db 13,13,"  Любой текст",13
        db 9,8,"0123456789"
        db 0
;конец строки

;далее идет  таблица графического оформле-
;ния окна
        db 3
;напечатать символ из системного шрифта
        db 16-1,0
;(X,Y)координаты размещения
        db #11
;код необходимого символа

        db 0
;конец таблицы
;-----------------------------------------
;Таблица горячих клавиш

MainWndHotKey
        db "c"
;горячая клавиша или 0
        db 16-1,0
;(X,Y) где произвести щелчек левой кнопкой
;мыши при нажатии на эту клавишу.
;Другими словами нажатие на данную клавишу
;эквивалентно щелчку левой кнопки  мыши  в
;данном знакоместе окна.

        db 0
;конец таблицы

;-----------------------------------------

;Для первого приложения наверное достаточ-
;но

   MM MM Y   Y TTTTT H  H     OOOO SSSS
   M M M  YYY    T   HHHH --- O  O Sss
   M   M   Y     T   H  H     O  O    S
   M   M   Y     T   H  H     OOOO SSSS
                        ;12.07.2000
                        ;Stels/Myth corp.



Другие статьи номера:

От автора - Лето почти пролетело...

Обзор системных новинок - Некоторые замечания попрограммированию под MythOS.

Юмор - Юмор.

WANTED - Розыск программ...

Реклама - Реклама и объявления ...


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Реклама - реклама и объявления.
Лучшее - двадцатка лучших игры для спектрума.
Кнопки - управление в газете.

В этот день...   23 июня