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 - Розыск программ... |
Реклама - Реклама и объявления ... |
Похожие статьи:
В этот день... 21 ноября