Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7389 theonlymir 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4
; Compile with FASM
7402 theonlymir 5
; Version 0.3: Sep 22, 2018
7389 theonlymir 6
 
7
; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage
8
; All rights reserved.
9
; Redistribution and use in source and binary forms, with or without modification,
10
; are permitted provided that the following conditions are met:
11
;    * Redistributions of source code must retain the above copyright notice, this
12
;    list of conditions and the following disclaimer.
13
;    * Redistributions in binary form must reproduce the above copyright  notice,
14
;    this list of conditions and the following disclaimer in the documentation and/or
15
;    other materials provided with the distribution.
16
;    * Neither the name of the  nor the names of its contributors may
17
;    be used to endorse or promote products derived from this software without
18
;    specific prior written permission.
19
 
20
; THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
21
; INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
22
; PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
23
; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24
; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25
; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
; --------------------------------------------------------------------------------------
27
 
28
;P.S. Код сырой, требуется оптимизация и доработка (см. тему форума)
29
format binary as ""     ; Binary file format without extension
30
use32                   ; Tell compiler to use 32 bit instructions
31
org 0                   ; the base address of code, always 0x0
32
 
33
; Заголовок исполняемого файла Колибри ОС
34
db 'MENUET01'
35
dd 1
36
dd START
37
dd I_END
38
dd MEM
39
dd STACKTOP
40
dd 0, 0
41
 
42
; Начало области кода
7395 theonlymir 43
include 'lang.inc'       ;поддержка языков при компиляции
7389 theonlymir 44
include '../../macros.inc'
7402 theonlymir 45
include '../../proc32.inc'
46
include '../../dll.inc'
47
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
48
;;include 'editbox.inc'
49
;;use_edit_box
50
;;include 'check.inc'      ;включить файл check.inc
51
;;version_ch1              ;необходимый макрос для включения new версии check_box1
52
;;use_check_box            ;используя макросы, внести процедуры для рисования чек бокса
7389 theonlymir 53
 
54
Otstup = 30
55
 
56
START:
57
    call copyKill        ;простейшая защита от запуска второй копии приложения
58
    mcall  68, 11        ;инициализация кучи
59
 
60
    mov  eax,48          ;получить системные цвета
61
    mov  ebx,3
62
    mov  ecx, sc
63
    mov  edx, sizeof.system_colors
64
    mcall
65
 
7402 theonlymir 66
 
67
    stdcall dll.Load, @IMPORT
68
    or      eax, eax
69
    jnz     exit
70
 
71
    invoke  init_checkbox, ch1
72
 
7389 theonlymir 73
    mov  eax,40          ;установить маску для ожидаемых событий
74
    mov  ebx,0x27        ;система будет реагировать только на сообщение о перерисовке, нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
75
    mcall
76
 
77
    call  loadConfig     ;загружаем конфигурацию из файла, если нет - то выставляем параметры по умолчанию
78
    call  draw_window    ;отрисовать окно приложения
79
 
80
; Обработка цикла событий
81
event_wait:
82
    mov     eax, 10      ; function 10 : wait until event
83
    mcall                ; event type is returned in eax
84
 
85
    cmp     eax, 1       ; Event redraw request ?
86
    je      red          ; Expl.: there has been activity on screen and
87
                         ; parts of the applications has to be redrawn.
88
 
89
    cmp     eax, 2       ; Event key in buffer ?
90
    je      key          ; Expl.: User has pressed a key while the
91
                         ; app is at the top of the window stack.
92
 
93
    cmp     eax, 3       ; Event button in buffer ?
94
    je      button       ; Expl.: User has pressed one of the
95
                         ; applications buttons.
96
 
7402 theonlymir 97
    ;mouse_edit_boxes editboxes,editboxes_end
98
    ;mouse_check_boxes check_boxes,check_boxes_end  ;проверка чек бокса
99
    invoke  edit_box_mouse, editLU
100
    invoke  edit_box_mouse, editLD
101
    invoke  edit_box_mouse, editRU
102
    invoke  edit_box_mouse, editRD
103
    invoke  check_box_mouse, ch1  ;проверка чек бокса
104
 
7389 theonlymir 105
    jmp     event_wait
106
 
107
 
108
red:                     ;обработка события перерисовки окна
109
   call    draw_window
110
   jmp     event_wait
111
 
112
key:                                    ; Keypress event handler
113
        mov     eax, 2                  ; The key is returned in ah. The key must be
114
        mcall                           ; read and cleared from the system queue.
7402 theonlymir 115
        ;key_edit_boxes editboxes,editboxes_end
116
        invoke  edit_box_key, editLU
117
        invoke  edit_box_key, editLD
118
        invoke  edit_box_key, editRU
119
        invoke  edit_box_key, editRD
7389 theonlymir 120
        jmp     event_wait              ; Just read the key, ignore it and jump to event_wait.
121
 
122
button:                                 ; Buttonpress event handler
123
    mov     eax,17                  ; The button number defined in window_draw
124
    mcall                           ; is returned to ah.
125
 
126
    cmp     ah,1                    ; button id=1 ?
127
    jne     noclose
7402 theonlymir 128
exit:
7389 theonlymir 129
    mov     eax,-1                  ; Function -1 : close this program
130
    mcall
131
noclose:
132
    cmp  ah, 2         ;кнопка "Применить"
133
    jne  butend
134
    call applyButton   ;вызов нашего обработчика нажатия кнопки
135
butend:
136
    jmp  event_wait    ;this is for ignored events, useful at development
137
 
138
 
139
 
140
;имя конфигурационного файла
141
fileName: db 'SETTINGS/HOTANGLES.CFG', 0
142
 
143
;структура для создания/перезаписи файла
144
createFile:
145
  .func     dd 2    ;номер подфункции
146
  .re       dd 0, 0 ;зарезервировано
147
  .size     dd 0    ;сколько байт писать
148
  .data_adr dd 0    ;указатель на данные
149
  .path     db 0
150
  .path_adr dd fileName    ;путь
151
 
152
;строка параметров по умолчанию и её размер
153
defaultDataForConfig db 121,13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10
154
defaultDataSize = 48+19
155
 
156
 
157
copyParam:  ;копирует параметр(команду запуска) в буфер (см. дальше)
158
   push esi ebx ecx
159
   mov ecx, dword[ebx] ;читаем размер строки
160
.copy:  ;копируем символы
161
   cmp ecx, 0
162
   je copyParam.copyEnd
163
   mov bl, byte[esi]
164
   mov byte[eax], bl
165
   dec ecx
166
   inc eax
167
   inc esi
168
   jmp copyParam.copy
169
.copyEnd:
170
   pop ecx ebx esi
171
   ret
172
 
173
 
174
addPerenos:  ;добавляет перенос строки в буфер
175
   mov byte[eax], 13
176
   inc eax
177
   mov byte[eax], 10
178
   inc eax
179
   ret
180
 
181
;обработчик кнопки "Применить"
182
applyButton:
183
    push eax ebx ecx
184
        ;mov dword[createFile.data_adr], defaultDataForConfig
185
        ;mov dword[createFile.size], defaultDataSize
186
 
187
        ;вычислим размер файла конфигурации в байтах
188
        mov ecx, 5*2+1 ;1 байт на состояние активности и 5 пар переносов строк (символы 13, 10)
189
        add ecx, dword[editLU.size] ;dataBuffer.size1]      ;плюс размер каждой строки в байтах
190
        add ecx, dword[editLD.size] ;dataBuffer.size2]
191
        add ecx, dword[editRU.size] ;dataBuffer.size3]
192
        add ecx, dword[editRD.size] ;dataBuffer.size4]
193
        ;теперь размер файла конфигурации в ecx
194
        mov dword[createFile.size], ecx ;положим размер байт в структуру создания/перезаписи файла
195
        mcall 68, 12, ecx ;выделяем блок памяти под буфер содержимого
196
        mov dword[createFile.data_adr], eax ;сохраняем адрес буфера в структуру
197
 
198
        ;заполним буфер содержимого:
199
        mov byte[eax], 110; 'n' ;по умолчанию флаг снят
7402 theonlymir 200
        cmp word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle ;110b ;ch_flag_en   ;выставлен checkBox или нет?
7389 theonlymir 201
        jne applyButton.no
202
        mov byte[eax], 121 ;иначе кладём 'y'
203
.no:
204
        inc eax
205
        call addPerenos
206
 
207
        push esi ebx
208
        call UpdateEditsSizes ;обновить размеры текста в edit'ах
209
 
210
        mov esi, dataBuffer.1 ;editLU.text
211
        mov ebx, dataBuffer.size1 ;editLU.size
212
        call copyParam
213
        call addPerenos     ;добавляем перенос строки
214
 
215
        mov esi, dataBuffer.2 ;editLD.text
216
        mov ebx, dataBuffer.size2 ;editLD.size
217
        call copyParam
218
        call addPerenos     ;добавляем перенос строки
219
 
220
        mov esi, dataBuffer.3
221
        mov ebx, dataBuffer.size3
222
        call copyParam
223
        call addPerenos     ;добавляем перенос строки
224
 
225
        mov esi, dataBuffer.4
226
        mov ebx, dataBuffer.size4
227
        call copyParam
228
        call addPerenos     ;добавляем перенос строки
229
 
230
        pop ebx esi
231
 
232
 
233
    mov ebx, createFile
234
    mcall 70
235
        cmp eax, 0
236
        je .end
237
        ;иначе здесь нужно вывести окно с ошибкой !!!
238
.end:
239
        mcall 68, 13, dword[createFile.data_adr]  ;освобождаем память под буфер
240
        call restartHotAnglesApp ;перезапускаем @HOTANGLES
241
        pop ecx ebx eax
242
    ret
243
 
244
 
245
 
246
 
247
 
248
 
249
compareBytes2:
250
   push edi esi ecx ebx
251
   xor eax, eax
252
   mov ecx, 10  ;max размер строк 11
253
@@:
254
   mov bl, byte[edi]
255
   cmp bl, byte[esi]
256
   jne compareBytes.no
257
   inc edi
258
   inc esi
259
   cmp ecx, 0
260
   je @f
261
   dec ecx
262
   jmp @b
263
.no:
264
   mov eax, 1
265
@@:
266
   pop ebx ecx esi edi
267
   ret
268
 
269
 
270
restartHotAnglesApp:   ;!!!
271
   ;находим все копии приложения по имени и завершаем их
272
   push eax ebx ecx esi edi
273
   ;указатели, которые никогда не меняются:
274
   mov esi, startAppData.file_name       ;первая строка - искомое имя приложения
275
   mov edi, buf            ;вторая строка - имя текущего слота
276
   add edi, 10
277
 
278
   mov ecx, 1
279
@@:
280
   mcall 9, buf, ecx              ;получаем данные очередного слота
281
   mov dword[slotMax], eax
282
 
283
   call compareBytes2 ;сравниваем имя
284
   cmp eax, 0
285
   jne restartHotAnglesApp.next   ;если не совпало, то переходим на следующий слот
286
 
287
   ;push eax ebx ecx
288
   mcall 18, 2, ecx               ;иначе завершаем слот
289
   ;pop ecx ebx eax
290
 
291
.next:
292
   inc  ecx
293
   cmp ecx, dword[slotMax]
294
   ja @f
295
   jmp @b
296
@@:
297
   pop edi esi ecx ebx eax
298
 
299
   ;запускаем приложение заново
300
   push eax ebx
301
   mcall 70, startAppData
302
   cmp eax, 0
303
   ja @f       ;если eax>0, то успешно запущено
304
   ;!!! иначе тут печатаем ошибку
305
@@:
306
   pop ebx eax
307
   ret
308
 
309
startAppData:
310
    .subfunction dd   7
311
    .flags       dd   0
312
    .param       dd   0
313
    .rezerv      dd   0, 0
314
    .full_name   db   '/rd/1/'
315
    .file_name   db   '@HOTANGLES', 0
316
    ;db 0
317
    ;.name: dd HotAnglesAppName
318
;HotAnglesAppName db '@HOTANGLES', 0
319
 
320
 
321
UpdateEditsSizes:
322
   push eax
323
   mov eax, dword[editLU.size]
324
   mov dword[dataBuffer.size1], eax
325
 
326
   mov eax, dword[editLD.size]
327
   mov dword[dataBuffer.size2], eax
328
 
329
   mov eax, dword[editRU.size]
330
   mov dword[dataBuffer.size3], eax
331
 
332
   mov eax, dword[editRD.size]
333
   mov dword[dataBuffer.size4], eax
334
 
335
   pop eax
336
   ret
337
 
338
fileAdr dd 0
339
 
340
loadConfig:
341
   push eax ebx ecx edx
342
   mcall 68, 27, fileName   ;загружаем конфигурационный файл в ОЗУ
343
   mov dword[fileAdr], eax  ;сохраняем адрес блока памяти файла
344
   cmp eax, 0
345
   je loadConfig.default       ;если файла конфигурации нет, то ставим настройки по умолчанию
346
   ;иначе данные загружены в ОЗУ, размер в edx
347
   cmp edx, 0               ;если файл пуст, в нём нет данных, то ставим настройки по умолчанию
348
   je loadConfig.default
349
.start:
350
   add edx, eax             ;кладём в edx - адрес конца конфиг.данных
351
 
352
.chStart:
353
   cmp byte[eax], 121 ;'y'  ;выставляем checkBox - параметр активности приложения
354
   jne loadConfig.no
355
.yes:
7402 theonlymir 356
   mov word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle ;110b ;ch_flag_en
7389 theonlymir 357
   jmp loadConfig.chEnd
358
.no:
7402 theonlymir 359
   mov word[ch1.flags], 100b ;0 and ch_flag_middle ;100b
7389 theonlymir 360
.chEnd:
361
   ;jmp loadConfig.end   ;команда для удобства отладки и поиска ошибок
362
 
363
   ;копируем содержимое строк в буфер
364
   push edi esi ecx ebx eax
365
   ;инициализируем указатели на адреса буфера строки и её размера
366
   mov edi, dataBuffer.1     ;dword[dataBuffer.1]
367
   mov esi, dataBuffer.size1 ;dword[dataBuffer.size1]
368
   ;ecx - счётчик байт в строке
369
;   mov ecx, 0 ;xor ecx, ecx
370
.block:
371
   xor ecx, ecx ;обнуляем счётчик
372
   inc eax
373
   cmp byte[eax], 10         ;если очередной код символа 10 или 13, то пропускаем символы
374
   je loadConfig.block ;propusk     ;до первого отличного от них
375
   cmp byte[eax], 13
376
   je loadConfig.block ;propusk
377
 
378
   ; символ отличен от переноса строки и возврата каретки - начинаем копировать отсюда в буфер
379
   mov bl, byte[eax]
380
   mov byte[edi], bl
381
   inc edi
382
   inc eax
383
   inc ecx ;увеличиваем счётчик символов в строке
384
 
385
   ;идём до конца этой строки: пока не встретим очередной 10, 13, 0 или file end
386
.while:     ;и копируем всё в буфер
387
   cmp eax, edx           ;проверяем закончился ли файл, а конца строки не было !!!
388
   ja loadConfig.ura
389
   cmp byte[eax], 10
390
   je loadConfig.ura
391
   cmp byte[eax], 0
392
   je loadConfig.ura
393
   cmp byte[eax], 13
394
   je loadConfig.ura
395
 
396
   mov bl, byte[eax]
397
   mov byte[edi], bl
398
   inc edi
399
   inc eax
400
   inc ecx
401
   cmp ecx, 511
402
   jae loadConfig.ura
403
   jmp loadConfig.while
404
.ura:
405
   mov byte[edi], 0      ;кладём завершающий 0 в строку
406
   mov dword[esi], ecx   ;сохраняем размер строки
407
   add esi, 4            ;переходим на размер следующего буфера
408
   sub edi, ecx          ;переходим на следующий буфер
409
   add edi, 512
410
;   mov ecx, 0 ;xor ecx, ecx ;обнуляем размер строки
411
 
412
   cmp edi, dataBuffer.size1 ;если это был последний буфер (и мы вышли за адреса размеров буферов), то выходим
413
   jb loadConfig.block
414
 
415
   pop eax ebx ecx esi edi
416
 
417
   jmp loadConfig.end
418
.default:
419
   mov eax, defaultDataForConfig
420
   mov edx, defaultDataSize
421
   jmp loadConfig.start
422
.end:
423
   mov ecx, dword[fileAdr]    ;если файл был загружен, то
424
   cmp ecx, 0
425
   je @f
426
   mcall 68, 13, ecx  ;выгружаем файл из памяти
427
@@:
428
   call updateParams ;применяем настройки каждого буфера
429
   pop edx ecx ebx eax
430
   ret
431
 
432
 
433
updateParams: ;max, size, pos
434
   push eax
435
   mov eax, dword[dataBuffer.size1]
436
   mov dword[editLU.size], eax
437
   mov dword[editLU.pos], eax
438
 
439
   mov eax, dword[dataBuffer.size2]
440
   mov dword[editLD.size], eax
441
   mov dword[editLD.pos], eax
442
 
443
   mov eax, dword[dataBuffer.size3]
444
   mov dword[editRU.size], eax
445
   mov dword[editRU.pos], eax
446
 
447
   mov eax, dword[dataBuffer.size4]
448
   mov dword[editRD.size], eax
449
   mov dword[editRD.pos], eax
450
   pop eax
451
   ret
452
 
453
 
454
 
455
selfName db 'HACONFIG', 0 ;'@HOTANGLES',0
456
selfNameSize = 8;9 ;до 11 byte
457
;
458
compareBytes:
459
   push edi esi ecx ebx
460
   mov eax, 0 ;xor eax, eax
461
   mov ecx, selfNameSize ;11    ;max размер строк 11
462
@@:
463
   mov bl, byte[edi]
464
   cmp bl, byte[esi]
465
   jne compareBytes.no
466
   inc edi
467
   inc esi
468
   cmp ecx, 0
469
   je @f
470
   dec ecx
471
   jmp @b
472
.no:
473
   mov eax, 1
474
@@:
475
   pop ebx ecx esi edi
476
   ret
477
;
478
slotMax dd 0
479
selfPID dd 0
480
buf db 1024 dup(0)
481
copyKill:
482
   push eax ebx ecx esi edi
483
 
484
   ;сперва прочтём свою информацию
485
   mcall 9, buf, -1
486
   mov eax, dword[buf+30]
487
   mov dword[selfPID], eax
488
 
489
   ;указатели, которые никогда не меняются:
490
   mov esi, selfName       ;первая строка - имя текущего приложения
491
   mov edi, buf            ;вторая строка - имя текущего слота
492
   add edi, 10
493
 
494
   mov ecx, 1
495
@@:
496
   mcall 9, buf, ecx
497
   mov dword[slotMax], eax
498
 
499
   ;если это мы сами, то пропускаем проверку
500
   mov eax, dword[buf+30]
501
   cmp eax, dword[selfPID]
502
   je copyKill.propusk
503
 
504
   call compareBytes   ;сравниваем 11 байт строк, результат в eax
505
 
506
   cmp eax, 0
507
   je copyKill.selfKill
508
 
509
.propusk:
510
   inc ecx
511
   cmp ecx, dword[slotMax]
512
   ja @f
513
   jmp @b
514
 
515
.selfKill:
516
   pop edi esi ecx ebx eax
517
   mcall -1
518
   ret
519
@@:
520
   pop edi esi ecx ebx eax
521
   ret
522
 
523
 WindowsWidth  = 450
524
 WindowsHeight = 195
525
coord:      ;координаты окна приложения
526
 .y dw 0
527
 .x dw 0
528
 
529
draw_window:
530
        ;удаляем кнопку, если есть
531
        mov edx, 0x80000002
532
        mcall 8
533
 
534
        mov     eax, 12                 ; function 12: tell os about windowdraw
535
        mov     ebx, 1                  ; 1, start of draw
536
        mcall
537
 
538
        ;отобразим окно по центру экрана для этого:
539
        mcall 14 ;получим размеры экрана
540
        mov dword[coord], eax       ;положим размеры экрана в координаты
541
        shr word[coord.x], 1        ;вернее положим их половину
542
        shr word[coord.y], 1
543
 
544
        ;вычисляем координаты окна, чтобы окно было по середине экрана
545
        sub word[coord.x], WindowsWidth/2
546
        sub word[coord.y], WindowsHeight/2
547
 
548
        mov     eax, 0                  ; function 0 : define and draw window
549
        mov     ebx, 0 ;* 65536 + WindowsWidth   ; [x start] *65536 + [x size]
550
        mov bx, word[coord.x]
551
        shl  ebx, 16
552
        mov bx, WindowsWidth
553
 
554
        mov ecx, 0
555
        mov     cx, word[coord.y] ;* 65536 + WindowsHeight  ; [y start] *65536 + [y size]
556
        shl ecx, 16
557
        mov cx, WindowsHeight
558
 
559
        mov     edx, 0x14ffffff         ; color of work area RRGGBB
560
                                        ; 0x02000000 = window type 4 (fixed size, skinned window)
561
        mov     esi, 0x808899ff         ; color of grab bar  RRGGBB
562
                                        ; 0x80000000 = color glide
563
        mov     edi, title
564
        mcall
565
 
7402 theonlymir 566
        ;draw_check_boxes check_boxes,check_boxes_end ;рисование чекбоксов
567
        ;draw_edit_boxes editboxes,editboxes_end      ;рисование edit box'ов
568
        invoke  edit_box_draw, editLU  ;рисование edit box'ов
569
        invoke  edit_box_draw, editLD
570
        invoke  edit_box_draw, editRU
571
        invoke  edit_box_draw, editRD
572
 
573
        invoke  check_box_draw, ch1    ;рисование чекбоксов
7389 theonlymir 574
 
575
        ;рисуем кнопку
576
        mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;координата X, ширина кнопки
577
        mov ecx, 160*65536 + 20   ;координата Y, высота кнопки
578
        mov edx, 0x00000002 ;2    ;номер кнопки
579
        mov esi, 0x00AABBCC       ;цвет кнопки
580
        mcall 8
581
        ;рисуем текст кнопки
7395 theonlymir 582
        mov     ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + 166    ;координаты текста (x, y)
7389 theonlymir 583
        mov     ecx, 0xFFFFFF     ;белый цвет текста
584
        mov     edx, buttonText
7395 theonlymir 585
        mov     esi, buttonTextSize ;5            ;размер текста в символах
586
        mcall 4
7389 theonlymir 587
 
588
        call draw_super_text
589
 
590
        LineLength = 62 ;42
591
        mov     ebx, 40 * 65536 + 36    ; draw info text with function 4 (x, y)
592
        mov     ecx, 0x224466
593
        mov     edx, text
594
        mov     esi, LineLength
595
        mov     eax, 4
596
 
597
  .newline:                             ; text from the DATA AREA
598
        mcall
599
        add     ebx, 12
600
        add     edx, LineLength
601
        cmp     byte[edx], 0
602
        jne     .newline
603
 
604
        mov     eax, 12                 ; function 12:tell os about windowdraw
605
        mov     ebx, 2                  ; 2, end of draw
606
        mcall
607
 
608
        ret
609
 
610
 
611
 
7395 theonlymir 612
 
7402 theonlymir 613
align 16
614
@IMPORT:
615
 
616
library box_lib, 'box_lib.obj'
617
 
618
import  box_lib,\
619
        edit_box_draw,          'edit_box',\
620
        edit_box_key,           'edit_box_key',\
621
        edit_box_mouse,         'edit_box_mouse',\
622
        init_checkbox,          'init_checkbox2',\
623
        check_box_draw,         'check_box_draw2',\
624
        check_box_mouse,        'check_box_mouse2',\
625
        option_box_draw,        'option_box_draw',\
626
        option_box_mouse,       'option_box_mouse'
627
 
628
 
629
 
7389 theonlymir 630
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
631
;DATA данные  для check_box1 - использует системные цвета
632
;Формат данных чек бокса:
633
;   координата х, координата у, указатель на начало строки, длина строки
634
;состояние работы утилиты: активна/нет
7402 theonlymir 635
;check_boxes:
636
;   ch1 check_box1 30,160,ch_text.1,ch_text.e1-ch_text.1,ch_flag_en
637
;check_boxes_end:
7389 theonlymir 638
 
7402 theonlymir 639
;координаты (x,y) = (30, 160) размер чекбокса 12, цвет текста 0x224466
640
ch1     check_box2 30 shl 16 + 12, 160 shl 16 + 12, 6, 0xFFFFFFFF, 0xAABBCC, 0x224466, ch_text, 110b ; ch_flag_en and ch_flag_middle
7395 theonlymir 641
 
7402 theonlymir 642
 
7395 theonlymir 643
if lang eq ru  ;если язык сборки русский
644
 
645
text    db  "Љ®­дЁЈга в®а Hot Angles ®вўҐз Ґв §  ­ бва®©Єг  ЄвЁў­ле гЈ«®ў. "
646
        db  "Ќ бвன⥠Ї а ¬Ґвал Ї®¤ бҐЎп Ё«Ё ®вЄ«озЁвҐ нвг ®ЇжЁо.         "
647
        db  "                                                              ", 0
648
 hed:
649
title   db  "Љ®­дЁЈга в®а гвЁ«Ёвл Hot Angles", 0
650
buttonText db "ЏаЁ¬Ґ­Ёвм", 0
651
buttonTextSize = 9
652
buttonTextXoffset = 12
653
 
7402 theonlymir 654
ch_text db '‚Є«озЁвм/ ЄвЁўЁа®ў вм "Hot Angles"', 0
655
;ch_text:        ;сопровождающий текст для чек боксов
656
;.1 db '‚Є«озЁвм/ ЄвЁўЁа®ў вм "Hot Angles"'
657
;.e1:
7395 theonlymir 658
 
659
superText:
660
  .lu db 'Љ®¬ ­¤  «Ґў®Ј® ўҐае­ҐЈ® гЈ« : ', 0
661
  .ld db 'Љ®¬ ­¤  «Ґў®Ј® ­Ё¦­ҐЈ® гЈ« :  ', 0
662
  .ru db 'Љ®¬ ­¤  Їа ў®Ј® ўҐае­ҐЈ® гЈ« :', 0
663
  .rd db 'Љ®¬ ­¤  Їа ў®Ј® ­Ё¦­ҐЈ® гЈ« : ', 0
664
superTextSize = 30
665
 
666
else  ;иначе английский текст
667
 
668
text    db  "This is a Hot Angles Configurator.                            "
669
        db  "Set the parameters bellow for yourself or disable this option."
670
        db  "                                                              ", 0
671
 hed:
672
title   db  "Hot Angles Configurator", 0
673
buttonText db "Apply", 0
674
buttonTextSize = 5
675
buttonTextXoffset = 0
676
 
7402 theonlymir 677
ch_text db 'Activate "Hot Angles"',0       ;сопровождающий текст для чек бокса
678
;.1 db 'Activate "Hot Angles"',0
679
;.e1:
7389 theonlymir 680
 
681
superText:
7395 theonlymir 682
  .lu db 'Left up angle command:   ', 0
683
  .ld db 'Left down angle command: ', 0
684
  .ru db 'Right up angle command:  ', 0
7389 theonlymir 685
  .rd db 'Right down angle command:', 0
7395 theonlymir 686
superTextSize = 25
7389 theonlymir 687
 
7395 theonlymir 688
end if
689
 
690
 
7389 theonlymir 691
draw_super_text:
692
   push eax ebx ecx edx edi esi
693
   mov     ebx, Otstup * 65536 + 74    ; draw info text with function 4 (x, y)
694
   mov     ecx, 0x224466
695
   mov eax, superText.lu
696
   mov     edx, eax
7395 theonlymir 697
   mov     esi, superTextSize ;22
7389 theonlymir 698
   mcall 4
699
 
700
   mov     ebx, Otstup * 65536 + 109
701
   mov     edx, superText.ld
7395 theonlymir 702
   mov     esi, superTextSize ;24
7389 theonlymir 703
   mcall 4
704
 
705
   mov     ebx, 240 * 65536 + 74
706
   mov     edx, superText.ru
7395 theonlymir 707
   mov     esi, superTextSize ;23
7389 theonlymir 708
   mcall 4
709
 
710
   mov     ebx, 240 * 65536 + 109
711
   mov     edx, superText.rd
7395 theonlymir 712
   mov     esi, superTextSize ;25
7389 theonlymir 713
   mcall 4
714
 
715
   pop esi edi edx ecx ebx eax
716
   ret
717
 
718
 
7402 theonlymir 719
edMaxSize = 510 ;теперь с новым компонентом можно и 511 указать
7389 theonlymir 720
edMax = 0 ;max, size, pos
721
 
7402 theonlymir 722
align 4
723
editLU   edit_box 180,Otstup,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax  ;ed_focus
724
editLD   edit_box 180,Otstup,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax
725
editRU   edit_box 180,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax
726
editRD   edit_box 180,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax
7389 theonlymir 727
 
7402 theonlymir 728
;editboxes:
729
;editLU edit_box 180,Otstup,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.1,ed_focus,edMax,edMax
730
;editLD edit_box 180,Otstup,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.2,0,edMax,edMax
731
;editRU edit_box 180,240,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.3,0,edMax,edMax
732
;editRD edit_box 180,240,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.4,0,edMax,edMax
733
;editboxes_end:
7389 theonlymir 734
 
7402 theonlymir 735
;data_of_code dd 0
736
;mouse_flag dd 0x0
737
 
7389 theonlymir 738
dataBuffer:
739
.1: rb 512
740
.2: rb 512
741
.3: rb 512
742
.4: rb 512
743
.size1: rd 1
744
.size2: rd 1
745
.size3: rd 1
746
.size4: rd 1
747
;255+255+2
748
;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0
749
dataBufferEnd:
750
 
7402 theonlymir 751
mouse_dd  dd ?
7389 theonlymir 752
sc  system_colors
753
 
754
I_END:
755
        rb 4096
756
align 16
757
STACKTOP:
758
 
759
MEM: