Spectrum Progress
#02
19 января 1997 |
|
Записи программиста - Основы программирования под API Домен ОС.
(C) Максим Ганнутин, 1997. Основы программирования под API Домен ОС Введем понятия: Объект - это логически выделенная часть кода, имеющая возможность получать и посылать сообще- ния, представленная на экране избражением и об- ъявленная системе. Фактически, речь идет об об- ъектах интерфейса пользователя. Сообщение - логическое обозначение процесса, заключаещегося в вызове объекта (call,jp) с со- держащимся в регистре A номером команды, кото- рую объект должен выполнить, а в остальных ре- гистрах параметры. Объект. Объект состоит из трех разделов: Диспетчер - код, проверяющий содержимое регист- ра A и вызывающий соответственный метод. Методы - коды, определющие реакцию на то или иное сообщение. Данные - данные, которыми оперирует объект. Пример: EXMPLobject cp 1 ;диспетчер jr z,EXMPLopen cp 22 jr z,EXMPLlight cp 23 jr z,EXMPLshadow cp 24 jr z,EXMPLselect ld a,57 ; сообщение не принято ret EXMPLopen ;метод для сообщения open ... xor a ret EXMPLlight ;метод для сообщения light ... xor a ret ... EXMPLdstruct ;данные defs 20 Сообщения. 20 init инициализация 21 close закрыть 22 light курсор перешел на объект 23 shadow курсор покинул объект 24 select пользователь кликнул объект 25 parsel объекту пришла посылка (drag&drop): d=тип посылки b,c данные (см.drag&drop) Если посылка принята, то объект должен вернуть в регистре A=33. 26 char сообщение от клавиатуры: d,e,b,c (см.проц.FKEYBOARD) Для объявления объекта необходимо: 1. Выведем на экран изображение объекта. 2. Объявим объект системе: ld e,координата x ld d,координата y ld c,len ld b,hgt ld h,class ld l,object ld a,90 ;процедура CONSTRUCTOR call 23403 Стереть объект: 1. Стереть изображение на экране 2. Уберем объект ld de,координаты ld bc,размеры ld a,91 :процедура DESTRUCTOR call 23403 Процедуры и функции. Дисковая подсистема. Термины: ^ - указатель на ... root : корневой каталог name : ^поле (11 байт) 'filenameext' можно использовать "?" шаблон : аналогично name handle : заголовок файла (32 байта) attrib : 11-ый байт заголовка FP : файловый указатель указывает смещение от начала файла, начиная с которого, читается или пишется информация FM : файловый манипулятор +0 filenameext (11) +11 attrib +12 размер записи (2) +16 FP (3) +22 время +24 дата +28 длина файла (3) BSIZE : файлы размером свыше 65 килобайт, DSS логически разбивает на блоки по 65535 байт, которые и называются BSIZE. Вызов : ld a,номер_функции ld hl,параметры ld de,параметры ld bc,параметры call 23403 cp 0 jr nz,error 1 CREAT Создание файла in: hl,name e,attrib out: a=24,26 2 OPEN Открыть файл Создается файловый манипулятор (FM) для работы процедур 3,4,5,6,7,8. in: hl,name bc,размер записи ( функ. GET и PUT) out: e,номер FM a=29 3 CLOSE Закрыть файл FM освобождается. В handle заносится новое значение размера файла. in: e,FM out: a=29 4 READ Последовательное чтение из файла. FP увеличивается на значение bc. in: e,FM hl,куда bc,сколько out: a=29 5 GET Произвольное чтение in: e,FM hl.куда d,номер записи out: a=29 6 WRITE Последовательная запись в файл in: e,FM hl,откуда bc,сколько out: a=26,27,29 7 PUT Произвольная запись в файл in: e,FM hl,откуда d,номер записи out: a=26,27,29 8 MOVEFP Изменение FP in: e,FM hl,смещение d=0 от начала файла d=1 от тенкущей позиции d=2 от конца файла d=3 перейти на следующий BSIZE d=4 вернуться на предыдущий BSIZE out; a=23,29,36 9 FINDFIST Поиск первого имени файла совпадающего с шаблоном in: hl,шаблон out: hl,^handle a=21 10 FINDNEXT Поиск следующего совпадающего файла out: hl,^handle a=21 11 LOAD Загрузка файла in: hl,name de,куда (de=0 параметр берется из handle файла) bc,сколько(bc=0 параметр берется из handle файла) out: a=21,23 12 SAVE Запись файла in: hl,name de,откуда bc,сколько out: a=24,25,26 13 DELETE Удалить файл in: hl,name out: a=21,27 14 RENAME Переименовать файл in: hl,oldname de,newname out: a=21,27 15 MOVE Переместить файл из текущего каталога в другой in: hl,name bc,первый кластер нового каталога ( bc=0 root ) out: a=21 16 ATTRIB Атрибута файла in: d=0 чтение d=1 запись hl,name e,attrib out: a=21 e=attrib 17 TIME Время файла in: hl,name d=0/1 b;c;e=час;минута;секунда out: a=21 b;c;e 18 DATE Дата файла in: hl,name d=0/1 b;c;e=год;месяц;день out: a=21 b;c;e 19 MKDIR Создать подкаталог in: hl,name out: a=24,26 20 RMDIR Стереть подкаталог in: hl,name out: a=21,30 21 CHDIR Смена каталога in: hl,^string out: a=22 bc,первый кластер нового текущего каталога string: defm "subdir1subdir2" ^символ ""-начинать с root иначе-с текущего defb 0 22 CHNDISK Смена диска in: e=0..4 out: a=1 23 VERSION DSS Версия DSS out: de=version 24 CALL_BIOS Вызов функций BIOS in,out см. руководство по bios 25 DSSVARS Системные переменные DSS in: e,номер переменной d=1/2 c=содержимое out: e,содержимое 26 VEKTORS Векторы DSS in: e,номер вектора d=0/1 hl=новое значение out: hl=значение 27 VERIFY Проверка правильности записи файла in: см. LOAD out: a=32 28 CACHE Кэш диска in: d=1 инициализаци кэша d=2 отключить кэш d=3 информация о кэше (таблица) hl,куда таблица : 8 записей с defb sec,trk defw ^буфер 29 RAMDISK Электронный диск in: d=1 загрузка таблици банков в DSS hl,откуда e,сколько банков d=2 выгрузка таблицы hl,куда d=3 создать RAMD 30 FREESPACE Свободное пространство на диске out: bc,кол-во килобайт (по 1024 байт) 33 MASKCREAT Создать шаблон in: hl,^string de,^буфер string: defm "filename.ext" defb "." можно использовать "?" и "*" Сообщения об ошибках 1 нет готовности 2 запись на защищенную дискету 3 нажата клавиша 'BREAK' 4 ошибка чтения/записи 5,6 ошибка позиционирования 8 несоответствие типов дискеты и дисковода 9 неформатированная дискета 21 файл не найден 22 неверный путь 23 невозможный параметр 24 файл с таким именем уже существует 25 переполненние root 26 переполнение диска 27 файл 'read only' 28 нет свободного FM 29 нереальный номер FM 30 в подкаталоге есть файлы 31 несуществующая функция 32 ошибка при verify 33 не тот диск 34 незапланированное событие 35 в TR-DOS операция невозможна 36 BSIZE уже на нуле Векторы DSS 1 Обработчик функций 2 BIOS 3 Обращение к клипбоарду Функции и процедуры API Сокращения и термины: len длина hgt высота char символ class см."Программирование" object там-же method метод API, в скобках обрабатываемые сообщения Так-как в большенстве процедур есть только входные параметры, слово "in" не указывется. Когда встречаются регистры d, e, b, c без описания, это значит: e,координата по x d,координата по y c,len b,hgt 40 PUTCHAR Вывести символ Домен ОС понимает все служебные символы Spectrum OS. b=char ix,^desc desc(стандартный текстовый дескриптор): defb x,y,len,hgt ;8*8 defb 0 defb цвет defb флаги defb x,y ;курсор defb "_" ;char курсора defb x ;в размерах символа defb 0 флаги 0 выводить курсор 1 изменять аттрибуты для каждого символа 3 запрет скролла 4 ножницы 5 запрет вывода 6 при скролле не трогать аттрибуты 7 перед выводом символа очищать позицию 47 PUTIMAGE Вывести изображение d,e,b,c hl,^bitmap bitmap: defb len,hgt defs len*hgt*8 ;пиксели построчно defs len*hgt ;аттрибуты 48 GETIMAGE Взять с экрана изображение d,e,b,c hl=buffer 51 FONT d=1 перенос фонта в систему e,ширина симвлов hl,откуда 52 CPIFUNC Кодовая таблица in: d=1 загрузка CPI hl,откуда d=2 информация о текущем CPI out: при d=2 b=тип 1 alt_a 2 alt_b (основная) 3 tlw2 53 TOERRWINDOW Вывод сообщения в окно ошибок ОС hl,^string 56 VIRTWINDOW Управление виртуальным окном (VW) in: h=1 VW во весь экран h=2 во все окно приложения h=3 создать VW с d,e,b,c в текцущем VW h=4 восстановить предыдущее VW (только после h=3) out: при h=3 e,d,c,b физические координаты a=23 (для d,e) 59 WALLPAPER Очистка экрана от окна приложения d,e,b,c h=1 в поле приложений h=2 в поле иконок Далее идут графические процедуры в VW 60 VWPUTLINE Вывод стринга hl=^string ix=^desc string: defm "text" defb 0 61 VWPUTCHAR Вывод символа b=char ix=^desc 62 VWSCROLL Скроллинг 63 VWCLEAR Очистка окна 64 VWDRAW Линия 65 VWBOX 66 VWIMAGE 67 VWVALFUNCTION 68 VWATTR 69 VWGETIMAGE Взять изображение d,e,b,c hl=^buffer 70 SELCUR Выбор образа курсора b=номер 1 стрелка 2 песочные часы 3 перекрестие 4 зарезервировано 71 PUTCUR Вывод курсора h=x_coord l=y_coord 73 DELTCUR Стереть курсор 74 CURSOR Работа с курсором out: d,e (8*8) h,l (pix) c,флаги направления бит 0 right 1 left 2 down 3 up 4 fire 76 IMGCURSOR Загрузка образа в текущий курсор hl= ^образ образ: defb pix_1,mask_1 defb pix_2,mask_2 ... defb pix_16,mask_16 77 HANDPORT Чтение флагов направления out: c,флаги h,l 80 FKEYBOARD Чтение клавиатуры out: e,char d,флаги модификаторов бит 0 1 0 lat rus 1 ovr ins 2 capslock с,физический код клавиши (caps) b,флаги управляющих клавиш бит 0 caps shift 1 symbol shift 82 GETABLE Загрузка таблицы раскладки клавиатуры hl,^таблица 87 BEEP Звуковой сигнал (для AY) 88 SERVICE Некоторые функции in: d=2 управление выводом VWDRAW e=0 чтение текущего режима e=1 or e=2 xor e=3 and out: e=режим 90 CONSTRUCTOR Объявление объекта d,e,b,c hl=object 91 DESTRUCTOR Стереть объект d,e,b,c 95 SESSION Передать управление системе 96 SENDMESSAGE Послать сообщение (drag&drop) in: hl,^образ курсора d,номер сообщения bc,передоваемая информация out: a=59 100 EXECUTE Запуск приложения in:d,e координаты основного окна запускаемого приложения hl,name ix,^prefix b=1 загрузить и раскрыть b=2 загрузить в иконку out: b,номер дескриптора приложения prefix: defs 64 ; любая информация, передоваемая приложению 101 TUNEEXE настройка адресов ix,^таблица адресов hl,адрес куда настраивать таблица: defb флаги (#01) defb кол-во адресов defw адрес начала кода, в котором настраиваются адреса (при компиляции) defw addr1,addr2 ... 102 TERMINATE Закончить выполнение приложения in: b,номер приложения 103 FARRUN Запуск приложения из приложения Работа FURRUN: приложение, вызвавшое эту функцию, свопируется, выполняется EXECUTE, после чего управление возвращается исход- ному приложению. in,out: аналогично EXECUTE 110 READVAR Системные переменные in: b,номер d=1 чтение d=2 запись e,содержимое out: e,содержимое 112 SETVEKTORS Векторы системы in: d,номер вектора e=1 читать e=2 писать hl,вектор out: hl,вектор Вектора: 1 APIVEKTOR процедуры api 2 KEMPORT устройство управ.курсором 3 KEYBOARD драйвер клавиатуры 4 WALLPAPER обои 5 EXEC процедура EXECUTE 6 CLOSE процедура TERMINATE 120 QUERYRESIDENT Запрос на установку ресидента in: d=1 PNT резидент d=2 IM2 резидент e=1 запрос на выделение памяти e=2 запрос на выделение памяти по определенному адресу hl,адрес bc,длина резидента out: hl,искомый адрес b,банк a=53,54 121 SETRESIDENT Установить резидент in: ix,дескриптор резидента de,^тело резидента b,банк куда hl,адрес куда out: b,номер резидента a=55 дескриптор резидента: defb 0 defb тип * 1-PNT 2-IM2 defm "resiname" * имя резидента defw длина резидента * defw кол-во тактов (для IM2)* defw адрес доступа defb банк defw адрес точки входа defb флаги * поля, которые надо заполнять вручную 122 DELRESIDENT Удалить резидент in: b,номер резидента d,тип резидента 200 VSB_INIT Полоска скроллинга вертикальная d,e b,hgt h,class 201 VSB_MOVE method(24) in: d,e b,кол-во пунктов h,общее кол-во строк c,текущая строка l=3 вверх l=4 вниз out: c,новая текущая строка 202 HSB_INIT Полоска скроллинга горизонтальная d,e b,len h,class 203 HSB_MOVE method(24) in: d,e b,кол-во пунктов h,общее кол-во столбцов c,текущий столбец l=7 влево l=8 вправо out: c,новый столбец 204 LISTBOX Окно просмотра d,e,c,b h,class l,флаги 0 кнопка close 1 рамка для заголовка 2 кнопка home 3 VSB 4 HSB 5 кнопка end 6 очистка окна 205 IBOX_INIT Окно клавиатурного ввода e,d,c h,class ix,^buffer l,флаги 0 кнопка рус/лат 2 очистка окна buffer: +0 defs 12 стандартный дескриптор окна +12 defs 4 +16 defs ? вводимая строка 206 IBOX_WORK method(24) e,d ix,^buffer 208 AWIN_INIT Основное окно приложения e,d,c,b h,class l,флаги 0 max 1 min 2 очистка окна 209 HMNU_INIT Горизонтальное меню d,e h,class l=1 ix,^desc desc: +0 defs 12 ;cтандарт.деск.окна +12 defs 2 +14 defb n ;кол-во пунктов +15 defb x_1,len_1,x_2,len_2,...,x_n,len_n +m defm "file edit ..." defb 0 210 HMNU_INSERT method(22,23) ix,^desk l,object 212 VMNU_INIT Вертикальное меню ix,^desk h,class l=1 b,флаги 0 очистка окна desk: +0 defs 12 ;станд.деск.окна +12 defs 2 +14 defb n ;кол-во пунктов +15 defb y1,y2,...,yn +m defm "load" defb 13 defm "save" ... defb 0 213 VMNU_INSERT method(22,23) ix,^desk l,object 218 BUTN_INIT Кнопки выбора ix,^desk h,class l=1 с=1 радиокнопки c=2 независимая фиксация b,флаги 0 очистка окна desk: +0 defb флаги кнопок ; бит +1 defs x ;desk верт.меню 0 1 кнопка 1 2 кнопка ... 219 BUTN_PRESS method(24) in: ix,^desk out: b,флаги кнопок 220 BUTN_INSERT method(22,23) ix,^desk c=1 или c=2 l,object 222 KEY_INIT Иконки d,e hl,object c,номер с= 1 close 2 home 3 up 4 down 5 lift 7 left 8 right 10 end 11 rus 12 lat 13 zero 15 system 16 min 17 max 18 radio_on button 19 radio_off buttonop 20 nonfixed_on button 21 nonfixed_off button 22 "O'K" 23 "ОТКАЗ" 225 VWCOLORS Системные цвета in: c,номер цвета d=1 чтение d=2 запись е,цвет out: e,цвет номера цветов: 3 LBOX 4 IBOX 5 AWIN 6 MENU 7 DBOX 228 WINMANIPULATIONS Управление окном in: e,d,c,b h=1 перемещение h=2 размеры по горизонтали h=3 по вертикали h=5 h=2 + h=3 out: d,e или c,b Библиотека классов DOMEN FOUNDATION CLASSES const - это значит, что указанные метки прог- раммист определяет сам, и они содержат данные. uses - для работы класса требуется указанный класс. SYSMES Обработка сообщений приложению Обработка всех системных сообщений, адресо- ванных приложению. Некоторые сообщения он об- рабатывает и передает управление методу, опре- деленному программистом. Вот их список: 1 open APP_OPEN 2 start_a APP_ASTART 10 exit APP_EXIT 11 help APP_HELP 12 maximize APP_MAXIMIZE 14 reopen APP_REOPEN Даже если метод программист не определяет, метка должна присутствовать. В ячейке SYSMNOMER находится номер сообщения Для работы SYSMES требуется: APPdstruct defb 0 defb X_pos,Y_pos,len,hgt defb класс объектов AWIN defb флаги1,флаги2 defb 0 флаги1 флаги2 (изменение размера) 0 max 0 1 min 1 горизонтальный 2 вертикальный const APPstart EQU ^начала appbitmap APPlenght EQU длина appbitmap APPacess EQU ^точка входа APPtitlename defm "Имя приложения" defb 0 APPiconimage defb 3,3 defs 81 ; иконка приложения Вызов: ld iy,APPdstruct call SYSMES ret nz ERRW Окно сообщений о системных ошибках ERRWopen Открыть окно с сообщением об ошибке in: a,номер ошибки d,e h,class ERRWwork method(24,26) Обработка сообщений MENU Меню MENUinit инициализация вставить в APP_ASTART MENUopen рисуем горизонтальное меню вставить в APP_OPEN MENUwork method(22,23,24,25,26) const MENUdstruct ; основное меню +0 defb x,y +2 defb кол-во пунктов(<6), класс +4 defb длины пунктов +9 defm "file edit ..." defb 0 ; первое подменю +n1 defb кол-во пунктов,ширина окна defw (адреса методов,вызываемых при выборе пунктов меню. сколько пунктов,столько адресов. Методу передается: a,сообщение l,номер выбранного пункта) defm "open" defb 13 defm "run" ... defb 0 MENUbuffer defs 160 SDBOX Простое диалоговое окно SDBOXopen in: l,номер окна Окна выводятся в середине окна приложения SDBOXwork method(24,26) SDBOXspecial in: hl,^название окна b,c a,class const SDBOXdstruct defb len,hgt,class ;первое окно defm "название первого окна" defb 0 defw метод при нажатии кнопки О'К передается в l номер окна ;второе окно1 sdboxkeys defb флаги клавиш 0 О'К 1 Отказ BUTN Панель выбора установок uses SDBOX BUTNopen in: l,номер окна h,биты кнопок BUTNwork method(22,23,24) Методу, вызываемому при O'K в d передаются новые биты кнопок. const BUTNdstruct +0 defb len,hgt,class ; Первая панель +3 defb тип кнопок ; 1-радиокнопки 2-независ. defb (метод при О'К) defm "имя окна 1" defb 0 defm "пункт 1" defb 13 defm "пункт 2" ... defb 0 ; кол-во пунктов <9 ; Вторая панель .... BUTNbuffer defs 160 DLGF Окно ввода строки uses SDBOX DLGFopen in: l,номер окна, описанного в SDBOXdstruct de,^метод при клике Внимание! В поле SDBOXdstruct адрес можно указать DLGFclick, тогда при клике на О'К метод DLGFGclick проверит правильность ввода имени файла и вызовет метод по de, иначе О'К проигнорирует DLGFwork method(22,23,24) const DLGFbuffer defs 32 Программирование приложений Сообщения посылаемые приложению: 1 OPEN раскрыть окно приложения 2 START A стартовые процендуры in: hl,^prefix de,координаты расккрытия окна c,номер дескриптора приложения out: hl,^диспетчера приложения de,^bitmap приложени bc,длина приложения Если приложение не хочет стартовать (например, если это приложение-резидент), то a=100. 3 START B out: d,e,b,c окна приложения 4 CLOSE Закрыть окно приложения in: e,d куда вывести иконку 5 LIGHT приложение стало активным 6 SHADOW приложение стало неактивным 10 EXIT закончить выполнение приложения 11 HELP вывести контекстную подскзку 12 MINIMIZE свернуть окно приложения в иконку in: e,d куда вывести икон 13 MAXIMIZE Развернуть окно на максимальный размер out: b,c 14 REOPEN перерисовать окно 15 MOVE переместить окно out: d,e 16 SIZE изменить размеры out: b,c Структура приложения Диспетчер Классы + объекты приложения Данные приложения Классы DFC (нет смысла программисту самому определять системные сообщения 1-19, поэтому используйте класс SYSMES) Диспетчер ld iy,APPdstruct call SYSMES ;см.описание DFC ld a,h ; a=class cp 10 jr z,CLASS1work cp 11 jr z,CLASS2work ... ld a,57 ; сообщение не принято ret Классы и объекты CLASS1work ld a,l ; a=object cp 1 jr z,OBJ11work cp 2 jr z,OBJ12work ... ld a,37 ret OBJ11work ld a,(SYSMNOMER) ; a=message cp 23 jr z,OBJ11shadow cp 24 jr z,OBJ11select ... ret OBJ11select ... xor a ret ... ... CLASS2work ld a,l ... ld a,57 ret Данные APPdstruct defb 0,0,32,19 defs 64 Классы DFC *F 1:SYSMES() *F 1:MENU() ... Теперь добавим в начало ассемблерного текста метку APPS, а в конец APPE. Определим методы класса SYSMES: APP_OPEN call MENUopen ;Выводим основное меню ... xor a ret APP_REOPEN call SYSM01 ; Выполним open ... ; а далее дополнительные ; действия xor a ret APP_HELP ;Остальные методы не определяем APP_ASTART APP_EXIT ld a,37 ret Стиль программирования приложений в ДОМЕН ОС 1 Объекты и классы Латинскме заглавные. Например: BUTN 2 Методы Лат.заглав. имя объекта, к которому метод от- носится, затем название метод. Например: BUTNopen, BUTNwork call BUTNopen 3 Данные объекта или класса Имя объекта + dstruct Например: BUTNdstruct ld ix,BUTNdstruct 4 Метки перехода в коде объекта имя объекта + два знака цифр Например: butn01, butn02 jr butn01, djnz butn02 5 Подпрограммы в коде объекта Имя объекта + два знака цифр Например: BUTN10, BUTN11 call BUTN10 6 Локальные переменные имя объекта + d + цифра Например: butnd1, butnd2 ld a,(butnd1), ld (butnd2),hl Кроме того, существуют правила для оформления меток, относящихся к классам DFC. 7 MENU Имена методов, вставляемые в MENUdstruct Menu + цифра порядкового номера пункта горизонтального меню + цифра номера в соответ- ствующем вертикальном меню. ─────
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября