Обзор системных новинок - Некоторые замечания попрограммированию под 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.
|
|
|
|
|
|
|