Subversion Repositories Kolibri OS

Rev

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