|
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 + цифра порядкового номера пункта
горизонтального меню + цифра номера в соответ-
ствующем вертикальном меню.
─────
Другие статьи номера:
Похожие статьи:
В этот день... 29 октября