Subversion Repositories Kolibri OS

Rev

Rev 3026 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3004 leency 1
;#___________________________________________________________________________________________________
2
;****************************************************************************************************|
3
; Program Palitra (c) Sergei Steshin (Akyltist)                                                      |
4
;----------------------------------------------------------------------------------------------------|
5
;; compiler:     FASM 1.69.31                                                                        |
6
;; version:      0.2.0                                                                               |
7
;; last update:  15/09/2012                                                                          |
8
;; e-mail:       dr.steshin@gmail.com                                                                |
9
;.....................................................................................................
10
;; History:                                                                                          |
11
;; 0.1.0 - Первая версия программы                                                                   |
12
;; 0.2.0 - Исправлено попадание в сетку, берется ближайший по диагонали пиксель.                     |
13
;;       - Добавлены ползунки, для регулирования rgb составляющих цвета и вывод этих составляющих.   |
14
;;       - Убран вывод цвета в бинарном виде (пока за не надобностью и не актуальностью).            |
15
;;       - Мелкая косметика.                                                                         |
16
;.....................................................................................................
17
;; All rights reserved.                                                                              |
18
;;                                                                                                   |
19
;; Redistribution and use in source and binary forms, with or without modification, are permitted    |
20
;; provided that the following conditions are met:                                                   |
21
;;       * Redistributions of source code must retain the above copyright notice, this list of       |
22
;;         conditions and the following disclaimer.                                                  |
23
;;       * Redistributions in binary form must reproduce the above copyright notice, this list of    |
24
;;         conditions and the following disclaimer in the documentation and/or other materials       |
25
;;         provided with the distribution.                                                           |
26
;;       * Neither the name of the  nor the names of its contributors may be used to   |
27
;;         endorse or promote products derived from this software without specific prior written     |
28
;;         permission.                                                                               |
29
;;                                                                                                   |
30
;; THIS SOFTWARE IS PROVIDED BY Sergei Steshin ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,      |
31
;; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A        |
32
;; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL  BE LIABLE FOR ANY DIRECT, |
33
;; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED    |
34
;; TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS       |
35
;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
36
;; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  |
37
;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                      |
38
;....................................................................................................|
39
 
40
 
41
;#___________________________________________________________________________________________________
42
;****************************************************************************************************|
43
; ЗАГОЛОВОК ИСПОЛНЯЕМОГО ФАЙЛА ПРИЛОЖЕНИЯ ДЛЯ КОЛИБРИ ОС                                             |
44
;----------------------------------------------------------------------------------------------------/
45
  use32
46
  org	 0x0
47
 
48
  db	 'MENUET01'
49
  dd	 0x01
50
  dd	 START
51
  dd	 I_END
52
  dd	 0x1000
53
  dd	 0x1000
54
  dd	 0x0
55
  dd	 0x0
56
 
57
include 'macros.inc'
58
 
59
START:
60
;#___________________________________________________________________________________________________
61
;****************************************************************************************************|
62
; ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ - ОБРАБОТКА СОБЫТИЙ                                                        |
63
;----------------------------------------------------------------------------------------------------/
64
red:
65
    call draw_window			  ; вызываем перерисовку окна приложения
66
still:
67
    mcall   10				  ; функция 10 - ждать события
68
    cmp     eax,1			  ; перерисовать окно ?
69
    je	    red 			  ; если да - на метку red
70
    cmp     eax,2			  ; нажата клавиша ?
71
    je	    key 			  ; если да - на key
72
    cmp     eax,3			  ; нажата кнопка ?
73
    je	    button			  ; если да - на button
74
    jmp     still			  ; если другое событие - в начало цикла
75
;end_still
76
 
77
 
78
key:					  ; нажата клавиша на клавиатуре
79
    mcall   2				  ; функция 2 - считать код символа (в ah) (тут в принципе не нужна)
80
    jmp     still			  ; вернуться к началу цикла
81
;end_key
82
 
83
button:
84
    mcall   17				  ; 17 - получить идентификатор нажатой кнопки
85
    cmp     ah, 1			  ; если нажата кнопка с номером 1,
86
    jz	    bexit			  ; выходим
87
    cmp     ah, 7
88
    jne     color_button
89
    call    mouse_get
90
    jmp     still
91
  color_button:
92
    push    eax
93
    call    mouse_local 		  ; получил локальные координаты
94
    mov     ebx,129
95
    mov     ecx,[mouse_y]
96
    sub     ebx,ecx
97
    mov     ecx,3
98
    imul    ecx,ebx
99
 
100
    ;push    ecx
101
 
102
 
103
    pop     eax
104
  red_button:
105
    cmp     ah, 8
106
    jne     green_button
107
    mov     [cred],cl
108
    call    set_spectr
109
    jmp     still
110
  green_button:
111
    cmp     ah, 9
112
    jne     blue_button
113
    mov     [cgreen],cl
114
    call    set_spectr
115
    jmp     still
116
  blue_button:
117
    cmp     ah, 10
118
    jne     still
119
    mov     [cblue],cl
120
    call    set_spectr
121
    jmp     still
122
  bexit:
123
    mcall -1				  ; иначе конец программы
124
;end_button
125
 
126
;#___________________________________________________________________________________________________
127
;****************************************************************************************************|
128
; ГЛАВНЫЙ МОДУЛЬ ОТРИСОВКИ ОКНА И ЭЛЕМЕНТОВ ПРИЛОЖЕНИЯ                                               |
129
;----------------------------------------------------------------------------------------------------/
130
draw_window:
131
    mov     eax,12			  ; функция 12: означает, что будет рисоваться окно
132
    mov     ebx,1			  ; 1,начало рисования
133
    int     0x40			  ; Прерывание
134
 
135
    mov     eax,48			  ; Функция 48 - стили отображения окон
136
    mov     ebx,3			  ; Подфункция 3 - получить стандартные цвета окон.
137
    mov     ecx,sc			  ; Указатель на буфер размером edx байт, под структуру
138
    mov     edx,sizeof.system_colors	  ; Размер таблицы цветов (должен быть 40 байт)
139
    int     0x40			  ; Прерывание
140
 
141
    mov     eax,48			  ; Функция 48 - стили отображения окон.
142
    mov     ebx,4			  ; Подфункция 4 - возвращает eax = высота скина.
143
    int     0x40			  ; Прерывание
144
    mov     ecx,eax			  ; Запоминаем высоту скина
145
 
146
    xor     eax,eax			  ; Очищаем eax (mov eax,0) (Функция 0)
147
    mov     ebx,200 shl 16+325		  ; [координата по оси x]*65536 + [размер по оси x]
148
    add     ecx,200 shl 16+168		  ; Высота скина + [координата по y]*65536 + [размер по y]
149
    mov     edx,[sc.work]		  ; Видимо стиль окна по дефолту
150
    or	    edx,0x34000000		  ; Или окно со скином фиксированных размеров
151
    mov     edi,title			  ; Заголовок окна
152
    int     0x40			  ; Прерывание
153
 
154
    call    draw_palitra		  ; РИСУЕМ ПАЛИТРУ
155
    call    draw_result 		  ; РИСУЕМ РЕЗУЛЬТАТ
156
 
157
    mov     eax,8			  ; Функция 8 - определить/удалить кнопку
158
    mov     ebx,89 shl 16+222		  ; Начальные координаты по х [к-та x]*65536 + [размер]
159
    mov     ecx,9 shl 16+147		  ; Начальные координаты по y [к-та y]*65536 + [размер]
160
    mov     edx,0x60000007		  ; Начальное ID кнопок - 0xXYnnnnnn
161
    int     0x40
162
 
163
    mov     ebx,10 shl 16+8		  ; Начальные координаты по х [к-та x]*65536 + [размер]
164
    mov     edx,0x60000008		  ; ID = 8
165
    mov     ecx,45 shl 16+85		  ; Начальные координаты по y [к-та y]*65536 + [размер]
166
    int     0x40			  ; Рисуем невидимую кнопку под слайдером red
167
    add     ebx,29 shl 16		  ; Добавляем
168
    inc     edx 			  ; ID = 9
169
    int     0x40			  ; Рисуем невидимую кнопку под слайдером green
170
    add     ebx,29 shl 16		  ; Добавляем
171
    inc     edx 			  ; ID = 10
172
    int     0x40			  ; Рисуем невидимую кнопку под слайдером blue
173
 
174
    mov     eax,12			  ; функция 12: означает, что будет рисоваться окно
175
    mov     ebx,2			  ; 1,начало рисования
176
    int     0x40			  ; Прерывание
177
 
178
    ret 				  ; Возвращаем управление
179
 
180
 
181
;#___________________________________________________________________________________________________
182
;****************************************************************************************************|
183
; БЛОК ВСПОМОГАТЕЛЬНЫХ ПРОЦЕДУР И ФУНКЦИЙ ПРИЛОЖЕНИЯ                                                 |
184
;----------------------------------------------------------------------------------------------------/
185
 
186
mouse_global:
187
    ;.................................................................................................
188
    ; Получаем координаты мыши
189
    ;.................................................................................................
190
    mov     eax,37			  ; Функция 37 - работа с мышью
191
    mov     ebx,0			  ; нам нужны глобальные координаты
192
    int     0x40			  ; eax = x*65536 + y, (x,y)=координаты курсора мыши
193
    mov     ecx,eax			  ;
194
    shr     ecx,16			  ; ecx = x+1
195
    movzx   edx,ax			  ; edx = y+1
196
    dec     ecx 			  ; ecx = x
197
    dec     edx 			  ; edx = y
198
    mov     [mouse_x],ecx		  ; mouse_x = x
199
    mov     [mouse_y],edx		  ; mouse_y = y
200
    ret 				  ; Возвращаем управление
201
;end_mouse_global
202
 
203
mouse_local:
204
    ;.................................................................................................
205
    ; Получаем координаты мыши относительно окна
206
    ;.................................................................................................
207
    mov     eax,37			  ; Функция 37 - работа с мышью
208
    mov     ebx,1			  ; нам нужны глобальные координаты
209
    int     0x40			  ; eax = x*65536 + y, (x,y)=координаты курсора мыши
210
    mov     ecx,eax			  ;
211
    shr     ecx,16			  ; ecx = x+1
212
    movzx   edx,ax			  ; edx = y+1
213
    dec     ecx 			  ; ecx = x
214
    dec     edx 			  ; edx = y
215
    mov     [mouse_x],ecx		  ; mouse_x = x
216
    mov     [mouse_y],edx		  ; mouse_y = y
217
    ret 				  ; Возвращаем управление
218
;end_mouse_local
219
 
220
desktop_get:
221
    ;.................................................................................................
222
    ; Определяем ширину экрана
223
    ;.................................................................................................
224
    mov     eax,14			  ; Определяем ширину экрана (eax = [xsize]*65536 + [ysize])
225
    int     0x40			  ; xsize = размер по горизонтали - 1
226
    mov     ebx,eax			  ;
227
    shr     ebx,16			  ; ebx = xsize-1
228
    ;movzx   edx,ax                       ;; edx = ysize-1 (лишний код)
229
    inc     ebx 			  ; ebx = xsize
230
    ;inc     edx                          ;; edx = ysize (лишний код)
231
    mov     [desctop_w],ebx
232
    ret
233
;end_desktop_get
234
 
235
mouse_get:
236
    mov     esi,2			  ; КОСТЫЛЬ: флаг для избежания зацикливания
237
    call    mouse_global
238
    call    desktop_get
239
    re_mouse_loop:			  ; КОСТЫЛЬ: метка для возврата если попали в сетку
240
      mov     ebx,[desctop_w]
241
      imul    ebx,[mouse_y]		  ; ebx = y*xsize
242
      add     ebx,[mouse_x]		  ; ebx = y*xsize+x
243
 
244
      ;.................................................................................................
245
      ; Берем цвет с палитры в переменную
246
      ;.................................................................................................
247
      mov     eax,35			  ; Функция взятия цвета
248
      ;mov     ebx,ecx                    ;; ebx = y*xsize+x (лишний код)
249
      int     0x40			  ; Получаем цвет в eax
250
      cmp     eax,[sc.work]		  ; Сравниваем с фоном приложения
251
      je      mouse_err 		  ; Если это он - то ничего не делаем
252
      cmp     eax,0x222222		  ; Сравниваем с цветом сетки
253
      je      mouse_err 		  ; Если это он - то ничего не делаем
254
      jmp     mouse_set 		  ; КОСТЫЛЬ: прыгаем чтобы не брать цвет сетки
255
    mouse_err:				  ; КОСТЫЛЬ: если попали в сетку или фон
256
      inc     [mouse_y] 		  ; КОСТЫЛЬ: смещаем по диагонали сначала по х
257
      inc     [mouse_x] 		  ; КОСТЫЛЬ: смещаем по диагонали потом по у
258
      dec     esi			  ; КОСТЫЛЬ: Уменьшаем флаг
259
      cmp     esi,0			  ; КОСТЫЛЬ: Сравниваем с нулем
260
    jz	      mouse_exit		  ; КОСТЫЛЬ: Если ноль то сделали всё что могли
261
    jmp    re_mouse_loop		  ; КОСТЫЛЬ: Если не ноль то попробуем взять соселний пиксель
262
    mouse_set:
263
    mov     [color],eax 		  ; Иначе запоминаем новый цвет
264
    call    draw_result 		  ; Выводим результат
265
    mouse_exit:
266
    ret 				  ; Возвращаем управление
267
;end_mouse_get----------------------------------------------------------------------------------------
268
 
269
draw_palitra:
270
    ;.................................................................................................
271
    ; Отрисовка фона под кнопки
272
    ;.................................................................................................
273
    mov     eax,13			  ; Функция 13 - нарисовать прямоугольник
274
    mov     edx,0x222222		  ; цвет
275
    mov     ecx,9 shl 16+73		  ; Начальные координаты по y [к-та y]*65536 + [размер]
276
    mov     esi,2			  ; Счетчик линий подложек
277
    re_draw:
278
    mov     ebx,89 shl 16+73		  ; Начальные координаты по x [к-та x]*65536 + [размер]
279
    mov     edi,3			  ; Счетчик количества подложек
280
    for_fon_loop:
281
      int     0x40			  ; Прерывание
282
      add     ebx,75 shl 16		  ; Смещаем положение линии по х
283
      dec     edi			  ; Уменьшаем счетчик кнопок
284
      cmp     edi,0			  ; Сравниваем с нулем
285
    jnz     for_fon_loop		  ; Если не ноль то в начало цикла
286
    dec     esi 			  ; Уменьшаем его
287
    cmp     esi,0			  ; Сравниваем с нулем
288
    mov     ecx,84 shl 16+73		  ; Начальные координаты по y [к-та y]*65536 + [размер]
289
    jnz     re_draw			  ; Если не ноль то в начало цикла
290
 
291
    ;.................................................................................................
292
    ; Отрисовка кнопок по циклу
293
    ;.................................................................................................
294
    mov     eax,13			  ; Функция 13 - нарисовать прямоугольник
295
    mov     edx,0x0FFFFFFF		  ; цвет
296
    mov     esi,6			  ; Счетчик количества абзацев (#4,8)
297
    mov     ebx,78 shl 16+8		  ; Начальные координаты по x [к-та x]*65536 + [размер]
298
    for_abz:
299
      ;;push    esi                       ; Сохраняем значение счетчика линий в стек
300
      cmp     esi,3
301
      jne     x2_line
302
      mov     ebx,78 shl 16+8
303
      x2_line:
304
      add     ebx,3 shl 16		  ; Смещаем положение линии по x
305
      mov     edi,8			  ; Счетчик количества кнопок в строке
306
      for_stolbik:
307
	push	edi			  ; Сохраняем значение счетчика линий в стек
308
	mov	edi,8			  ; Счетчик количества кнопок в строке
309
	mov	ecx,  1 shl 16+8	  ; Начальные координаты по y [к-та y]*65536 + [размер]
310
	cmp	esi,3
311
	jg	y2_line 		  ; Если больше 4 то игнорим
312
	mov	ecx,76 shl 16+8
313
	y2_line:
314
	add	ebx,9 shl 16		  ; Смещаем положение линии по x
315
	for_loop:
316
	  add	  ecx,9 shl 16		  ; Смещаем положение линии по y
317
	  int	  0x40			  ; Прерывание
318
	  sub	  edx,32 shl 16
319
	  dec	  edi			  ; Уменьшаем счетчик кнопок
320
	  cmp	  edi,0 		  ; Сравниваем с нулем
321
	  jnz	  for_loop		  ; Если не ноль то в начало цикла
322
      sub     edx,32 shl 8
323
      pop     edi			  ; Иначе восстанавливаем счетчик линий
324
      dec     edi			  ; Уменьшаем его
325
      cmp     edi,0			  ; Сравниваем с нулем
326
      jnz     for_stolbik		  ; Если не ноль то в начало цикла
327
    sub     edx,48			  ; (#64,32)
328
    ;;pop     esi                         ; Иначе восстанавливаем счетчик линий
329
    dec     esi 			  ; Уменьшаем его
330
    cmp     esi,0			  ; Сравниваем с нулем
331
    jnz     for_abz			  ; Если не ноль то в начало цикла
332
    ret 				  ; Возвращаем управление
333
;end_draw_palitra-------------------------------------------------------------------------------------
334
 
335
draw_result:
336
    ;.................................................................................................
337
    ; Отрисовка результата цвета в hex
338
    ;.................................................................................................
339
    mov     eax,13			  ; Функция 13 - нарисовать прямоугольник
340
    mov     edx,0x222222		  ; цвет-обводки
341
    mov     ebx,4 shl 16+15		  ; Начальные координаты по x [к-та x]*65536 + [размер]
342
    mov     ecx,9 shl 16+15		  ; Начальные координаты по y [к-та y]*65536 + [размер]
343
    int     0x40			  ; Прерывание (ос рисует прямоугольник)
344
    mov     ebx,23 shl 16+62		  ; Начальные координаты по x [к-та x]*65536 + [размер]
345
    int     0x40			  ; Прерывание (ос рисует прямоугольник)
346
 
347
    mov     edx,[color] 		  ; цвет
348
    mov     ebx,5 shl 16+13		  ; Начальные координаты по x [к-та x]*65536 + [размер]
349
    mov     ecx,10 shl 16+13		  ; Начальные координаты по y [к-та y]*65536 + [размер]
350
    int     0x40			  ; Прерывание (ос рисует прямоугольник)
351
    mov     edx,0xFFFFFF		  ; цвет-фона
352
    mov     ebx,24 shl 16+60		  ; Начальные координаты по x [к-та x]*65536 + [размер]
353
    int     0x40			  ; Прерывание (ос рисует прямоугольник)
354
 
355
    mov     eax,47			  ; Функция 47 - вывод числа в окно
356
    mov     ecx,[color] 		  ; число (при bl=0) или указатель (при bl=1)
357
    mov     esi,0x0			  ; 0xX0RRGGBB
358
    mov     ebx,256+8 shl 16		  ; параметры преобразования числа в текст (HEX)
359
    mov     edx,34 shl 16+13		  ; [координата по оси x]*65536 + [координата по оси y]
360
    int     0x40			  ; Прерывание - выводим результат в окно (HEX)
361
 
362
    mov     eax,4			  ; функция 4: написать текст в окне
363
    mov     ebx,27*65536+13		  ; [x начальный] *65536 + [y начальный]
364
    mov     ecx,0x0			  ; цвет текста RRGGBB
365
    mov     edx,hex			  ; рисуем '#'
366
    mov     esi,1			  ; длина текста в байтах
367
    int     0x40
368
 
369
    ;.................................................................................................
370
    ; Отрисовка полей для r g b значений
371
    ;.................................................................................................
372
    call    get_spectr
373
    mov     eax,13			  ; Функция 13 - нарисовать прямоугольник
374
    mov     edx,0x222222		  ; цвет-обводки
375
    mov     ebx,4 shl 16+23		  ; Начальные координаты по x [к-та x]*65536 + [размер]
376
    mov     ecx,142 shl 16+15		  ; Начальные координаты по y [к-та y]*65536 + [размер]
377
    int     0x40
378
    mov     ebx,33 shl 16+23		  ; Начальные координаты по x [к-та x]*65536 + [размер]
379
    int     0x40
380
    mov     ebx,62 shl 16+23		  ; Начальные координаты по x [к-та x]*65536 + [размер]
381
    int     0x40
382
    mov     edx,0xFFFFFF		  ; цвет-обводки
383
    mov     ebx,5 shl 16+21		  ; Начальные координаты по x [к-та x]*65536 + [размер]
384
    mov     ecx,143 shl 16+13		  ; Начальные координаты по y [к-та y]*65536 + [размер]
385
    int     0x40
386
    mov     ebx,34 shl 16+21		  ; Начальные координаты по x [к-та x]*65536 + [размер]
387
    int     0x40
388
    mov     ebx,63 shl 16+21		  ; Начальные координаты по x [к-та x]*65536 + [размер]
389
    int     0x40
390
 
391
    ;.................................................................................................
392
    ; Отрисовка r g b значений
393
    ;.................................................................................................
394
    movzx   eax,[cred]			  ; красный
395
    mov     ebx,7*65536+146		  ; [x начальный] *65536 + [y начальный]
396
    call    draw_value			  ; выводим результат
397
 
398
    movzx   eax,[cgreen]		  ; зеленый
399
    mov     ebx,36*65536+146		  ; [x начальный] *65536 + [y начальный]
400
    call    draw_value			  ; выводим результат
401
 
402
    movzx   eax,[cblue] 		  ; синий
403
    mov     ebx,65*65536+146		  ; [x начальный] *65536 + [y начальный]
404
    call    draw_value			  ; выводим результат
405
 
406
    ;.................................................................................................
407
    ; Обнуляем фон
408
    ;.................................................................................................
409
    mov     eax,13			  ; Функция 13 - нарисовать прямоугольник
410
    mov     edx,[sc.work]		  ; цвет-обводки
411
    mov     ebx,8 shl 16+66		  ; Начальные координаты по x [к-та x]*65536 + [размер]
412
    mov     ecx,40 shl 16+87		  ; Начальные координаты по y [к-та y]*65536 + [размер]
413
    int     0x40
414
 
415
    ;mov     eax,13                        ; Функция 13 - нарисовать прямоугольник
416
    ;mov     edx,0x222222                  ; цвет-обводки
417
    ;mov     ebx,4 shl 16+23               ; Начальные координаты по x [к-та x]*65536 + [размер]
418
    ;mov     ecx,30 shl 16+105             ; Начальные координаты по y [к-та y]*65536 + [размер]
419
    ;int     0x40
420
    ;add     ebx,29 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
421
    ;int     0x40
422
    ;add     ebx,29 shl 16                 ; Начальные координаты по x [к-та y]*65536 + [размер]
423
    ;int     0x40
424
 
425
    mov     eax,13			  ; Функция 13 - нарисовать прямоугольник
426
    mov     edx,[sc.work]		  ; цвет-обводки
427
    mov     ebx,5 shl 16+21		  ; Начальные координаты по x [к-та x]*65536 + [размер]
428
    mov     ecx,31 shl 16+103		  ; Начальные координаты по y [к-та y]*65536 + [размер]
429
    int     0x40
430
    add     ebx,29 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
431
    int     0x40
432
    add     ebx,29 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
433
    int     0x40
434
 
435
    ;.................................................................................................
436
    ; Выводим буквы r g b
437
    ;.................................................................................................
438
    mov     eax,4			  ; 4 - вывести строку текста в окно
439
    mov     ebx,12 shl 16+34		  ; [координата по оси x]*65536 + [координата по оси y]
440
    mov     ecx,0x0			  ; 0xX0RRGGBB (RR, GG, BB задают цвет текста)
441
    mov     edx,cname			  ; указатель на начало строки
442
    mov     esi,2			  ; выводить esi символов
443
    newline:				  ; цикл
444
      int     0x40			    ; Прерывание
445
      add     ebx,29 shl 16		    ; Добавляем
446
      add     edx,2			    ; Добавляем
447
      cmp     [edx],byte 'x'		    ; Сравнение с байтом х
448
    jne    newline			  ; Если не нуль или не равно
449
 
450
    ;.................................................................................................
451
    ; Отрисовка слайдеров
452
    ;.................................................................................................
453
    mov     eax,13			  ; Функция 13 - нарисовать прямоугольник
454
    mov     edx,0x222222		  ; цвет-обводки
455
    mov     ebx,12 shl 16+4		  ; Начальные координаты по x [к-та x]*65536 + [размер]
456
    mov     ecx,45 shl 16+85		  ; Начальные координаты по y [к-та y]*65536 + [размер]
457
    int     0x40
458
    add     ebx,29 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
459
    int     0x40
460
    add     ebx,29 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
461
    int     0x40
462
 
463
    mov     edx,0xFA0919		  ; цвет-обводки
464
    mov     ebx,13 shl 16+2		  ; Начальные координаты по x [к-та x]*65536 + [размер]
465
    mov     ecx,46 shl 16+83		  ; Начальные координаты по y [к-та y]*65536 + [размер]
466
    int     0x40
467
    mov     edx,0x08CE19		  ; цвет-обводки
468
    add     ebx,29 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
469
    int     0x40
470
    mov     edx,0x0909FF		  ; цвет-обводки
471
    add     ebx,29 shl 16		  ; Начальные координаты по x [к-та y]*65536 + [размер]
472
    int     0x40
473
 
474
    ;.................................................................................................
475
    ; Отрисовка ползунков
476
    ;.................................................................................................
477
    mov     edx,0x0			  ; цвет-ползунков
478
    mov     ebx,10 shl 16+8		  ; Начальные координаты по x [к-та x]*65536 + [размер]
479
    movzx   eax,[cred]			  ; берем значение цвета
480
    call    draw_slider
481
    add     ebx,29 shl 16
482
    movzx   eax,[cgreen]		  ; берем значение цвета
483
    call    draw_slider
484
    add     ebx,29 shl 16
485
    movzx   eax,[cblue] 		  ; берем значение цвета
486
    call    draw_slider
487
 
488
    ret 				  ; Возвращаем управление
489
;end_draw_result
490
 
491
draw_slider:
492
    xor     ecx,ecx
493
    mov     cl,0x3			  ; будем делить его на 3 так как ползунки длинной 85 пикселей
494
    div     cl				  ; делим - целое в al остаток в ah
495
    mov     cl,128			  ; нижняя точка ползунка
496
    sub     cl,al			  ; cl=cl-al
497
    shl     ecx,16
498
    add     ecx,4			  ; задаем начальное положение
499
    mov     eax,13			  ; Функция 13 - нарисовать прямоугольник
500
    int     0x40
501
    ret 				  ; Возвращаем управление
502
 
503
;end_slider
504
 
505
draw_value:
506
    ;.................................................................................................
507
    ; Вывод числа из строки в указанной области
508
    ;.................................................................................................
509
    push    ebx 			  ; сохраняем присланные координаты
510
    mov     ebx,10			  ; устанавливаем основание системы счисления
511
    mov     edi,buff			  ; указатель на строку буфера
512
    call    int2ascii			  ; конвертируем число и ложим как строку в буфер + esi длина
513
    mov     eax,4			  ; функция 4: написать текст в окне
514
    pop     ebx 			  ; достаем из стека присланные координаты
515
    mov     ecx,0x0			  ; цвет текста RRGGBB
516
    mov     edx,buff			  ; указатель на начало текста
517
    int     0x40
518
    ret 				  ; Возвращаем управление
519
;end_draw_value
520
 
521
hex_digit:
522
    ;.................................................................................................
523
    ; Преобразование в ASCII (вне зависимости от системы счисления)
524
    ;.................................................................................................
525
    cmp    dl,10			  ; в dl ожидается число от 0 до 15
526
    jb	   .less			  ; если dl<10 то переходим
527
    add    dl,'A'-10			  ; 10->A 11->B 12->C ...
528
    ret 				  ; Возвращаем управление
529
    .less:
530
    or	   dl,'0'			  ; Если система счисления 10-я и менее
531
    ret 				  ; Возвращаем управление
532
;end_hex_digit
533
 
534
int2ascii:
535
    ;.................................................................................................
536
    ; Преобразование числа в строку
537
    ;.................................................................................................
538
    ; eax - 32-х значное число
539
    ; ebx - основание системы счисления
540
    ; edi - указатель на строку буфера
541
    ; Возвращает заполненный буфер и esi - длина строки
542
    ;pushad
543
    xor     esi,esi			  ; зануляем счетчик символов
544
    convert_loop:
545
    xor     edx,edx			  ; зануляем регистр под остаток
546
    div     ebx 			  ; eax/ebx - остаток в edx
547
    call    hex_digit			  ; преобразуем символ
548
    push    edx 			  ; ложим в стек
549
    inc     esi 			  ; увеличиваем счетчик
550
    test    eax,eax			  ; если еще можно делить
551
    jnz     convert_loop		  ; то делием еще
552
    cld 				  ; ОБЯЗАТЕЛЬНО сбрасываем флаг направления DF (запись вперёд)
553
    write_loop: 			  ; иначе
554
    pop     eax 			  ; достаем из стека в еах
555
    stosb				  ; записываем в буфер по адресу ES:(E)DI
556
    dec     esi 			  ; уменьшаем счетчик
557
    test    esi,esi			  ; если есть что доставать из стека
558
    jnz     write_loop			  ; то достаём
559
    mov     byte [edi],0		  ; иначе дописыываем нулевой байт
560
    ;popad                                 ; восстанавливаем значения регистров
561
    ; код ниже не имеет ничего общего к функции, просто возвращает еще длинну полученной строки
562
    mov     edi,buff			  ; указатель на начало текста
563
    call    str_len
564
    mov     esi,eax
565
    ret 				  ; и возвращаем управление
566
;end_int2ascii
567
 
568
get_spectr:
569
    ;.................................................................................................
570
    ; возвращает r,g,b состовляющие цвета
571
    ;.................................................................................................
572
    ; get blue
573
    mov     ecx,[color]
574
    movzx   eax,cl
575
    mov     [cblue],al
576
    ; get red
577
    mov     eax,ecx
578
    xor     ax,ax
579
    shr     eax,16
580
    mov     [cred],al
581
    ; get green
582
    shl      ecx,16
583
    shr      ecx,24
584
    mov      [cgreen],cl
585
    ret 				  ; и возвращаем управление
586
;end_get_spectr
587
 
588
set_spectr:
589
    ;.................................................................................................
590
    ; устанавливает из r,g,b цвет
591
    ;.................................................................................................
592
    ; get blue
593
    movzx   eax,[cred]
594
    shl     eax,8
595
    mov     al,[cgreen]
596
    shl     eax,8
597
    mov     al,[cblue]
598
    mov     [color],eax
599
    call    draw_result 		  ; Выводим результат
600
    ret 				  ; и возвращаем управление
601
;end_get_spectr
602
 
603
str_len:
604
    ;.................................................................................................
605
    ; определяет длину строки (вход->EDI ZS offset ; выход->EAX ZS length)
606
    ;.................................................................................................
607
	push ecx
608
	push esi
609
	push edi
610
 
611
	cld
612
	xor   al, al
613
	mov ecx, 0FFFFFFFFh
614
	mov esi, edi
615
	repne scasb
616
	sub edi, esi
617
	mov eax, edi
618
	dec eax
619
 
620
	pop edi
621
	pop esi
622
	pop ecx
623
 
624
	ret
625
;end_str_len
626
;#___________________________________________________________________________________________________
627
;****************************************************************************************************|
628
; БЛОК ПЕРЕМЕННЫХ И КОНСТАНТ                                                                         |
629
;----------------------------------------------------------------------------------------------------/
630
 
631
    color	dd 00000000h		  ; хранит значение выбранного цвета
632
    mouse_x	dd 0			  ; хранит глобальную х координату мыши
633
    mouse_y	dd 0			  ; хранит глобальную у координату мыши
634
    desctop_w	dd 0			  ; хранит ширину экрана
635
    sc		system_colors		  ; хранит структуру системных цветов скина
636
    title	db 'Palitra v0.2',0	  ; хранит имя программы
637
    hex 	db '#',0		  ; для вывода решётки как текста
638
    cname	db 'R G B x'		  ; хранит разряды цветов (red,green,blue) x-метка конца
639
    cred	db 0			  ; храним красный спекрт
640
    cgreen	db 0			  ; храним зеленый спектр
641
    cblue	db 0			  ; храним синий спектр
642
    buff	db '000',0
643
I_END:
644