Subversion Repositories Kolibri OS

Rev

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