Subversion Repositories Kolibri OS

Rev

Rev 6258 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3529 mario79 1
;   Простой пример программы для KolibriOS
2
;   озвучивает код нажатой клавиши
3528 mario79 3
;
3529 mario79 4
;   Компилировать FASM'ом
5
;        Можно открыть example.asm через программу FASM (её ярлык есть
6
;        на рабочем столе)
7
;        А можно просто нажать F9 в Tinypad'е. Лог компиляции
8
;        отображается на доске отладки (программа BOARD)
3528 mario79 9
;
3529 mario79 10
;   Что важно знать при программировании под Колибри:
11
;        Номер функции помещается в регистр eax.
12
;        Вызов системной функции осуществляется командой "int 0x40".
13
;        Все регистры, кроме явно указанных в возвращаемом значении,
14
;        включая регистр флагов eflags, сохраняются.
3528 mario79 15
;
3529 mario79 16
;    Пример:
17
;        mov eax, 1    ;Функция 1 - поставить точку в окне
18
;                      ;список сисфункций см. в DOCPACK - sysfuncr.txt
19
;        mov ebx, 10   ; координата x=10
20
;        mov ecx, 20   ; координата y=10
21
;        mov edx, 0xFFFfff ;цвет точки
22
;        int 0x40      ;вызвать функцию
3528 mario79 23
;
3529 mario79 24
;    Тоже самое с использованием макроса:
25
;        mcall 1, 10, 20, 0xFFFfff
26
;---------------------------------------------------------------------
27
 
28
  use32              ; включить 32-битный режим ассемблера
6890 IgorA 29
  org    0           ; адресация с нуля
3529 mario79 30
 
31
  db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
6890 IgorA 32
  dd     1           ; версия заголовка (всегда 1)
3529 mario79 33
  dd     START       ; адрес первой команды
34
  dd     I_END       ; размер программы
6890 IgorA 35
  dd     MEM         ; количество памяти
36
  dd     STACKTOP    ; адрес вершины стэка
37
  dd     0           ; адрес буфера для параметров
38
  dd     0           ; зарезервировано
3529 mario79 39
 
6258 leency 40
include "macros.inc" ; макросы облегчают жизнь ассемблерщиков!
3529 mario79 41
 
42
;---------------------------------------------------------------------
43
;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
44
;---------------------------------------------------------------------
45
 
46
START:
47
 
48
red:                    ; перерисовать окно
49
 
50
    call draw_window    ; вызываем процедуру отрисовки окна
51
 
52
;---------------------------------------------------------------------
53
;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
54
;---------------------------------------------------------------------
55
 
56
still:
57
    mcall 10            ; функция 10 - ждать события
58
 
59
    cmp  eax,1          ; перерисовать окно ?
60
    je   red            ; если да - на метку red
61
    cmp  eax,2          ; нажата клавиша ?
62
    je   key            ; если да - на key
63
    cmp  eax,3          ; нажата кнопка ?
64
    je   button         ; если да - на button
65
 
66
    jmp  still          ; если другое событие - в начало цикла
67
 
68
 
69
;---------------------------------------------------------------------
70
 
71
 
72
  key:                  ; нажата клавиша на клавиатуре
73
    mcall 2             ; функция 2 - считать код символа (в ah)
74
 
75
    mov  [Music+1], ah  ; записать код символа как код ноты
76
 
77
    ; функция 55-55: системный динамик ("PlayNote")
78
    ;   esi - адрес мелодии
79
 
80
    ;   mov  eax,55
81
    ;   mov  ebx,eax
82
    ;   mov  esi,Music
83
    ;   int  0x40
84
 
85
    ; или коротко:
86
    mcall 55, eax, , , Music
87
 
88
    jmp  still          ; вернуться к началу цикла
89
 
90
;---------------------------------------------------------------------
91
 
92
  button:
93
    mcall 17            ; 17 - получить идентификатор нажатой кнопки
94
 
95
    cmp   ah, 1         ; если НЕ нажата кнопка с номером 1,
96
    jne   still         ;  вернуться
97
 
98
  .exit:
99
    mcall -1            ; иначе конец программы
100
 
101
 
102
;---------------------------------------------------------------------
103
;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
104
;---------------------------------------------------------------------
105
 
106
draw_window:
107
 
6258 leency 108
    mcall 12, 1       ; функция 12: сообщить ОС о начале отрисовки
109
 
110
    mcall 48, 3, sc,sizeof.system_colors
111
 
3529 mario79 112
    ; далее: сначала длинный вариант (закомментированный)
6258 leency 113
    ; затем короткий аналог с использованием макросов
3529 mario79 114
 
6258 leency 115
;   mov  eax,0                   ; функция 0: определить окно
116
;   mov  ebx,200*65536+300       ; [x старт] *65536 + [x размер]
117
;   mov  ecx,200*65536+150       ; [y старт] *65536 + [y размер]
118
;   mov  edx, [sc.work]          ; цвет фона
119
;   or   edx, 0x33000000         ; и тип окна 3
120
;   mov  edi,header              ; ЗАГОЛОВОК ОКНА
3529 mario79 121
;   int  0x40
122
 
6258 leency 123
    mov   edx, [sc.work]         ; цвет фона
124
    or    edx, 0x33000000        ; и тип окна 3
125
    mcall 0, <200,300>, <200,150>, , ,title
3529 mario79 126
 
6258 leency 127
    ; вывод текстовой строки
128
    mov   ecx, [sc.work_text]    ; цвет фона
129
    or    ecx, 0x90000000        ; и тип строки
6890 IgorA 130
    mcall 4, <10, 20>, , message
3529 mario79 131
 
6890 IgorA 132
 
6258 leency 133
    mcall 12, 2                  ; функция 12.2, закончили рисовать
3529 mario79 134
 
6258 leency 135
    ret                          ; выходим из процедуры
3529 mario79 136
 
137
 
138
;---------------------------------------------------------------------
139
;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
140
;---------------------------------------------------------------------
141
 
142
; Вот такая вот короткая "мелодия".
143
; Второй байт изменяется нажатием клавишы
144
 
145
Music:
146
  db  0x90, 0x30, 0
147
 
6258 leency 148
sc system_colors
3529 mario79 149
 
6258 leency 150
message db 'Нажмите любую клавишу...',0
151
title db 'Пример программы',0
3529 mario79 152
 
153
;---------------------------------------------------------------------
154
 
6890 IgorA 155
I_END:                  ; метка конца программы
156
  rb 4096               ; память для стека
157
align 16
158
STACKTOP:               ; метка вершины стека (при заполнении стек
159
                        ; растет в сторону уменьшения адресов, потому
160
                        ; память для него в коде программы встречается
161
                        ; раньше чем его вершина)
162
MEM:                    ; метка указывающая на конец программы плюс
163
                        ; размер используемой ею оперативной памяти
164
; Адрес метки MEM всегда должен быть больше чем адрес метки I_END.
165
; Метка STACKTOP должна располагается после метки I_END и перед меткой
166
;   MEM. STACKTOP может находится и перед I_END, но это не правильно.
167
; Имена меток могут быть с любыми названиями, главное соблюдать
168
;   правильный порядок их расположения.