Subversion Repositories Kolibri OS

Rev

Rev 7443 | Rev 7459 | 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
7443 theonlymir 5
; Version 0.3.6: Oct 9, 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
7443 theonlymir 48
include '../../develop/libraries/box_lib/load_lib.mac'      ;макрос для загрузки библиотек
7436 theonlymir 49
@use_library
7443 theonlymir 50
 
51
KMENUITEM_NORMAL    equ 0
52
KMENUITEM_SUBMENU   equ 1
53
KMENUITEM_SEPARATOR equ 2
54
 
7389 theonlymir 55
Otstup = 30
56
 
57
START:
58
    call copyKill        ;простейшая защита от запуска второй копии приложения
59
    mcall  68, 11        ;инициализация кучи
60
 
7436 theonlymir 61
    ;mcall 48,3,sc,sizeof.system_colors ;получить системные цвета
7389 theonlymir 62
    mov  eax,48          ;получить системные цвета
63
    mov  ebx,3
64
    mov  ecx, sc
65
    mov  edx, sizeof.system_colors
66
    mcall
67
 
7402 theonlymir 68
    stdcall dll.Load, @IMPORT
69
    or      eax, eax
70
    jnz     exit
71
 
7389 theonlymir 72
    mov  eax,40          ;установить маску для ожидаемых событий
73
    mov  ebx,0x27        ;система будет реагировать только на сообщение о перерисовке, нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
74
    mcall
75
 
7436 theonlymir 76
    load_libraries l_libs_start,load_lib_end ;загрузка библиотек(и)
77
    stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
78
 
7443 theonlymir 79
    ;mode menu
80
    stdcall [kmenu_init], sc    ;kmenu initialisation
81
    stdcall [ksubmenu_new]
82
    mov [modeMenu], eax
83
    stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu0, 110
84
    stdcall [ksubmenu_add], [modeMenu], eax
85
    stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu1, 111
86
    stdcall [ksubmenu_add], [modeMenu], eax
87
    stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu2, 112
88
    stdcall [ksubmenu_add], [modeMenu], eax
89
    stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu3, 113
90
    stdcall [ksubmenu_add], [modeMenu], eax
91
        stdcall [kmenuitem_new], KMENUITEM_SUBMENU, valueModeMenu1, [modeMenu]
92
 
7389 theonlymir 93
    call  loadConfig     ;загружаем конфигурацию из файла, если нет - то выставляем параметры по умолчанию
94
    call  draw_window    ;отрисовать окно приложения
95
 
96
; Обработка цикла событий
97
event_wait:
98
    mov     eax, 10      ; function 10 : wait until event
99
    mcall                ; event type is returned in eax
100
 
101
    cmp     eax, 1       ; Event redraw request ?
102
    je      red          ; Expl.: there has been activity on screen and
103
                         ; parts of the applications has to be redrawn.
104
 
105
    cmp     eax, 2       ; Event key in buffer ?
106
    je      key          ; Expl.: User has pressed a key while the
107
                         ; app is at the top of the window stack.
108
 
109
    cmp     eax, 3       ; Event button in buffer ?
110
    je      button       ; Expl.: User has pressed one of the
111
                         ; applications buttons.
112
 
7408 theonlymir 113
    invoke  edit_box_mouse, editLU   ;проверка событий мыши для editBox'ов
7402 theonlymir 114
    invoke  edit_box_mouse, editLD
115
    invoke  edit_box_mouse, editRU
116
    invoke  edit_box_mouse, editRD
7443 theonlymir 117
    ;stdcall [kmainmenu_dispatch_cursorevent], [modeMenu] ;проверка мыши для комбобокса
7402 theonlymir 118
 
7389 theonlymir 119
    jmp     event_wait
120
 
121
 
122
red:                     ;обработка события перерисовки окна
123
   call    draw_window
124
   jmp     event_wait
125
 
126
key:                                    ; Keypress event handler
127
        mov     eax, 2                  ; The key is returned in ah. The key must be
128
        mcall                           ; read and cleared from the system queue.
7408 theonlymir 129
 
7402 theonlymir 130
        invoke  edit_box_key, editLU
131
        invoke  edit_box_key, editLD
132
        invoke  edit_box_key, editRU
133
        invoke  edit_box_key, editRD
7389 theonlymir 134
        jmp     event_wait              ; Just read the key, ignore it and jump to event_wait.
135
 
136
button:                                 ; Buttonpress event handler
137
    mov     eax,17                  ; The button number defined in window_draw
138
    mcall                           ; is returned to ah.
139
 
140
    cmp     ah,1                    ; button id=1 ?
141
    jne     noclose
7402 theonlymir 142
exit:
7389 theonlymir 143
    mov     eax,-1                  ; Function -1 : close this program
144
    mcall
145
noclose:
146
    cmp  ah, 2         ;кнопка "Применить"
7436 theonlymir 147
    jne  @f ;butend
7389 theonlymir 148
    call applyButton   ;вызов нашего обработчика нажатия кнопки
7436 theonlymir 149
    jmp event_wait
150
@@:
151
    cmp ah, 4
152
    jne @f
153
    mov byte[editID], 4
154
    call but_open_dlg
155
    jmp  event_wait
156
@@:
157
    cmp ah, 5
158
    jne @f
159
    mov byte[editID], 5
160
    call but_open_dlg
161
    jmp  event_wait
162
@@:
163
    cmp ah, 6
164
    jne @f
165
    mov byte[editID], 6
166
    call but_open_dlg
167
    jmp  event_wait
168
@@:
169
    cmp ah, 7
170
    jne @f
171
    mov byte[editID], 7
172
    call but_open_dlg
173
    jmp  event_wait
174
@@:
7443 theonlymir 175
    cmp ah, 8
176
    jne @f
177
    push eax ebx ecx
178
    mcall 9, pi, -1 ;get window coord
179
 
180
                mov eax, dword[pi+34]
181
                add eax, buttonModeX ;+ 5
182
                mov word[coordModeMenu.x], ax
183
 
184
                mov eax, dword[pi+38]
185
                add eax, buttonModeY + 17 ;20 ;42
186
                mov word[coordModeMenu.y], ax
187
 
188
                stdcall [ksubmenu_draw], [modeMenu], coordModeMenu
189
    pop ecx ebx eax
190
    jmp  event_wait
191
@@:
192
    cmp ah, 110
193
    jne @f
194
    mov byte[mode], 48 ;'0'
195
    jmp  event_wait
196
@@:
197
    cmp ah, 111
198
    jne @f
199
    mov byte[mode], 49 ;'1'
200
    jmp  event_wait
201
@@:
202
    cmp ah, 112
203
    jne @f
204
    mov byte[mode], 50 ;'2'
205
    jmp  event_wait
206
@@:
207
    cmp ah, 113
208
    jne @f
209
    mov byte[mode], 51 ;'3'
210
    jmp  event_wait
211
@@:
7389 theonlymir 212
butend:
213
    jmp  event_wait    ;this is for ignored events, useful at development
214
 
215
 
216
 
217
;имя конфигурационного файла
218
fileName: db 'SETTINGS/HOTANGLES.CFG', 0
219
 
220
;структура для создания/перезаписи файла
221
createFile:
222
  .func     dd 2    ;номер подфункции
223
  .re       dd 0, 0 ;зарезервировано
224
  .size     dd 0    ;сколько байт писать
225
  .data_adr dd 0    ;указатель на данные
226
  .path     db 0
227
  .path_adr dd fileName    ;путь
228
 
229
;строка параметров по умолчанию и её размер
230
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
231
defaultDataSize = 48+19
232
 
233
 
234
copyParam:  ;копирует параметр(команду запуска) в буфер (см. дальше)
235
   push esi ebx ecx
236
   mov ecx, dword[ebx] ;читаем размер строки
7412 theonlymir 237
 
238
   cmp ecx, 0          ;пуста ли строка?
239
   jne copyParam.copy  ;если нет, то переходим к копированию содержимого строки (к  циклу)
240
 
241
   mov byte[eax], '-'  ;если же пусто, то заменяем символом минус '-'
242
   inc eax
243
   ;jmp copyParam.copyEnd ;и выходим
244
   ;далее в начале цикла произойдёт сравнение и выход
245
 
7389 theonlymir 246
.copy:  ;копируем символы
247
   cmp ecx, 0
248
   je copyParam.copyEnd
249
   mov bl, byte[esi]
250
   mov byte[eax], bl
251
   dec ecx
252
   inc eax
253
   inc esi
254
   jmp copyParam.copy
255
.copyEnd:
256
   pop ecx ebx esi
257
   ret
258
 
259
 
260
addPerenos:  ;добавляет перенос строки в буфер
261
   mov byte[eax], 13
262
   inc eax
263
   mov byte[eax], 10
264
   inc eax
265
   ret
266
 
267
;обработчик кнопки "Применить"
268
applyButton:
269
    push eax ebx ecx
270
        ;mov dword[createFile.data_adr], defaultDataForConfig
271
        ;mov dword[createFile.size], defaultDataSize
272
 
273
        ;вычислим размер файла конфигурации в байтах
274
        mov ecx, 5*2+1 ;1 байт на состояние активности и 5 пар переносов строк (символы 13, 10)
7408 theonlymir 275
        add ecx, dword[editLU.size] ;плюс размер каждой строки в байтах
276
        add ecx, dword[editLD.size]
277
        add ecx, dword[editRU.size]
7389 theonlymir 278
        add ecx, dword[editRD.size] ;dataBuffer.size4]
7412 theonlymir 279
 
280
        ;если заданы пустые строки, то мы автоматически добавляем знак минус, значит размер +1 байт
281
        cmp dword[editLU.size], 0
282
        jne @f
283
        inc ecx
284
@@:
285
        cmp dword[editLD.size], 0
286
        jne @f
287
        inc ecx
288
@@:
289
        cmp dword[editRU.size], 0
290
        jne @f
291
        inc ecx
292
@@:
293
        cmp dword[editRD.size], 0
294
        jne @f
295
        inc ecx
296
@@:
297
 
7389 theonlymir 298
        ;теперь размер файла конфигурации в ecx
299
        mov dword[createFile.size], ecx ;положим размер байт в структуру создания/перезаписи файла
300
        mcall 68, 12, ecx ;выделяем блок памяти под буфер содержимого
301
        mov dword[createFile.data_adr], eax ;сохраняем адрес буфера в структуру
302
 
303
        ;заполним буфер содержимого:
7436 theonlymir 304
        ;cmp byte[mode], 0
305
        ;jne @f
306
        ;@@:
307
        ;
7443 theonlymir 308
 
309
        push ebx    ;сохраняем выбранный режим
310
        mov bl, byte[mode]
311
        mov byte[eax], bl
312
        pop ebx
313
 
7389 theonlymir 314
        inc eax
315
        call addPerenos
316
 
317
        push esi ebx
318
        call UpdateEditsSizes ;обновить размеры текста в edit'ах
319
 
7408 theonlymir 320
        mov esi, dataBuffer.1     ;editLU.text
7389 theonlymir 321
        mov ebx, dataBuffer.size1 ;editLU.size
322
        call copyParam
323
        call addPerenos     ;добавляем перенос строки
324
 
7408 theonlymir 325
        mov esi, dataBuffer.2
326
        mov ebx, dataBuffer.size2
7389 theonlymir 327
        call copyParam
328
        call addPerenos     ;добавляем перенос строки
329
 
330
        mov esi, dataBuffer.3
331
        mov ebx, dataBuffer.size3
332
        call copyParam
333
        call addPerenos     ;добавляем перенос строки
334
 
335
        mov esi, dataBuffer.4
336
        mov ebx, dataBuffer.size4
337
        call copyParam
338
        call addPerenos     ;добавляем перенос строки
339
 
340
        pop ebx esi
341
 
342
 
343
    mov ebx, createFile
344
    mcall 70
345
        cmp eax, 0
346
        je .end
347
        ;иначе здесь нужно вывести окно с ошибкой !!!
348
.end:
349
        mcall 68, 13, dword[createFile.data_adr]  ;освобождаем память под буфер
7412 theonlymir 350
        call finishHotAnglesApp ;завершаем работу всех копий сервиса @HOTANGLES
351
        call loadConfig         ;перезагружаем файл конфига
352
        call draw_window        ;перерисовываем окно
353
        call startHotAnglesApp  ;перезапускаем @HOTANGLES
7389 theonlymir 354
        pop ecx ebx eax
355
    ret
356
 
357
 
358
 
359
 
360
 
361
 
362
compareBytes2:
363
   push edi esi ecx ebx
364
   xor eax, eax
365
   mov ecx, 10  ;max размер строк 11
366
@@:
367
   mov bl, byte[edi]
368
   cmp bl, byte[esi]
369
   jne compareBytes.no
370
   inc edi
371
   inc esi
372
   cmp ecx, 0
373
   je @f
374
   dec ecx
375
   jmp @b
376
.no:
377
   mov eax, 1
378
@@:
379
   pop ebx ecx esi edi
380
   ret
381
 
382
 
7412 theonlymir 383
finishHotAnglesApp:
7389 theonlymir 384
   ;находим все копии приложения по имени и завершаем их
385
   push eax ebx ecx esi edi
386
   ;указатели, которые никогда не меняются:
387
   mov esi, startAppData.file_name       ;первая строка - искомое имя приложения
388
   mov edi, buf            ;вторая строка - имя текущего слота
389
   add edi, 10
390
 
391
   mov ecx, 1
392
@@:
393
   mcall 9, buf, ecx              ;получаем данные очередного слота
394
   mov dword[slotMax], eax
395
 
396
   call compareBytes2 ;сравниваем имя
397
   cmp eax, 0
7412 theonlymir 398
   jne finishHotAnglesApp.next   ;если не совпало, то переходим на следующий слот
7389 theonlymir 399
 
400
   mcall 18, 2, ecx               ;иначе завершаем слот
401
.next:
402
   inc  ecx
403
   cmp ecx, dword[slotMax]
404
   ja @f
405
   jmp @b
406
@@:
407
   pop edi esi ecx ebx eax
7412 theonlymir 408
   ret
7389 theonlymir 409
 
7412 theonlymir 410
startHotAnglesApp:
7389 theonlymir 411
   ;запускаем приложение заново
412
   push eax ebx
413
   mcall 70, startAppData
414
   cmp eax, 0
415
   ja @f       ;если eax>0, то успешно запущено
416
   ;!!! иначе тут печатаем ошибку
417
@@:
418
   pop ebx eax
419
   ret
420
 
421
startAppData:
422
    .subfunction dd   7
423
    .flags       dd   0
424
    .param       dd   0
425
    .rezerv      dd   0, 0
426
    .full_name   db   '/rd/1/'
427
    .file_name   db   '@HOTANGLES', 0
428
 
429
UpdateEditsSizes:
430
   push eax
431
   mov eax, dword[editLU.size]
432
   mov dword[dataBuffer.size1], eax
433
 
434
   mov eax, dword[editLD.size]
435
   mov dword[dataBuffer.size2], eax
436
 
437
   mov eax, dword[editRU.size]
438
   mov dword[dataBuffer.size3], eax
439
 
440
   mov eax, dword[editRD.size]
441
   mov dword[dataBuffer.size4], eax
442
 
443
   pop eax
444
   ret
445
 
446
fileAdr dd 0
447
 
448
loadConfig:
449
   push eax ebx ecx edx
450
   mcall 68, 27, fileName   ;загружаем конфигурационный файл в ОЗУ
451
   mov dword[fileAdr], eax  ;сохраняем адрес блока памяти файла
452
   cmp eax, 0
453
   je loadConfig.default       ;если файла конфигурации нет, то ставим настройки по умолчанию
454
   ;иначе данные загружены в ОЗУ, размер в edx
455
   cmp edx, 0               ;если файл пуст, в нём нет данных, то ставим настройки по умолчанию
456
   je loadConfig.default
457
.start:
458
   add edx, eax             ;кладём в edx - адрес конца конфиг.данных
459
 
460
.chStart:
7443 theonlymir 461
 
462
   push ebx
463
   mov bl, byte[eax]
464
   cmp bl, 48          ; если значение выходит за допустимые пределы, то проверяем на 'n' (для совместимости)
465
   jb loadConfig.checkN
466
   cmp bl, 51
467
   ja loadConfig.checkN
468
 
469
   mov byte[mode], bl  ;иначе устанавливаем этот режим как есть
470
   jmp loadConfig.modeEnd   ;и идём дальше
471
.checkN:
472
   cmp bl, 'n'             ;если n - то режим "отключено"
473
   jne @f
474
   mov byte[mode], 48 ;'0'
475
   jmp loadConfig.modeEnd
7436 theonlymir 476
@@:
7443 theonlymir 477
   mov byte[mode], 49 ;'1' иначе по умолчанию включён классический режим работы
478
.modeEnd:
479
   pop ebx
7389 theonlymir 480
   ;jmp loadConfig.end   ;команда для удобства отладки и поиска ошибок
481
 
482
   ;копируем содержимое строк в буфер
483
   push edi esi ecx ebx eax
484
   ;инициализируем указатели на адреса буфера строки и её размера
7408 theonlymir 485
   mov edi, dataBuffer.1
486
   mov esi, dataBuffer.size1
7389 theonlymir 487
   ;ecx - счётчик байт в строке
488
.block:
489
   xor ecx, ecx ;обнуляем счётчик
490
   inc eax
491
   cmp byte[eax], 10         ;если очередной код символа 10 или 13, то пропускаем символы
7408 theonlymir 492
   je loadConfig.block       ;до первого отличного от них
7389 theonlymir 493
   cmp byte[eax], 13
7408 theonlymir 494
   je loadConfig.block
7389 theonlymir 495
 
496
   ; символ отличен от переноса строки и возврата каретки - начинаем копировать отсюда в буфер
497
   mov bl, byte[eax]
498
   mov byte[edi], bl
499
   inc edi
500
   inc eax
501
   inc ecx ;увеличиваем счётчик символов в строке
502
 
503
   ;идём до конца этой строки: пока не встретим очередной 10, 13, 0 или file end
504
.while:     ;и копируем всё в буфер
505
   cmp eax, edx           ;проверяем закончился ли файл, а конца строки не было !!!
506
   ja loadConfig.ura
507
   cmp byte[eax], 10
508
   je loadConfig.ura
509
   cmp byte[eax], 0
510
   je loadConfig.ura
511
   cmp byte[eax], 13
512
   je loadConfig.ura
513
 
514
   mov bl, byte[eax]
515
   mov byte[edi], bl
516
   inc edi
517
   inc eax
518
   inc ecx
519
   cmp ecx, 511
520
   jae loadConfig.ura
521
   jmp loadConfig.while
522
.ura:
523
   mov byte[edi], 0      ;кладём завершающий 0 в строку
524
   mov dword[esi], ecx   ;сохраняем размер строки
525
   add esi, 4            ;переходим на размер следующего буфера
526
   sub edi, ecx          ;переходим на следующий буфер
527
   add edi, 512
7408 theonlymir 528
   ;xor ecx, ecx          ;обнуляем размер строки
7389 theonlymir 529
 
530
   cmp edi, dataBuffer.size1 ;если это был последний буфер (и мы вышли за адреса размеров буферов), то выходим
531
   jb loadConfig.block
532
 
533
   pop eax ebx ecx esi edi
534
 
535
   jmp loadConfig.end
536
.default:
537
   mov eax, defaultDataForConfig
538
   mov edx, defaultDataSize
539
   jmp loadConfig.start
540
.end:
541
   mov ecx, dword[fileAdr]    ;если файл был загружен, то
542
   cmp ecx, 0
543
   je @f
544
   mcall 68, 13, ecx  ;выгружаем файл из памяти
545
@@:
546
   call updateParams ;применяем настройки каждого буфера
547
   pop edx ecx ebx eax
548
   ret
549
 
550
 
551
updateParams: ;max, size, pos
552
   push eax
553
   mov eax, dword[dataBuffer.size1]
554
   mov dword[editLU.size], eax
555
   mov dword[editLU.pos], eax
556
 
557
   mov eax, dword[dataBuffer.size2]
558
   mov dword[editLD.size], eax
559
   mov dword[editLD.pos], eax
560
 
561
   mov eax, dword[dataBuffer.size3]
562
   mov dword[editRU.size], eax
563
   mov dword[editRU.pos], eax
564
 
565
   mov eax, dword[dataBuffer.size4]
566
   mov dword[editRD.size], eax
567
   mov dword[editRD.pos], eax
568
   pop eax
569
   ret
570
 
571
 
572
 
7408 theonlymir 573
selfName db 'HACONFIG', 0
574
selfNameSize = 8 ;до 11 byte
7389 theonlymir 575
;
576
compareBytes:
577
   push edi esi ecx ebx
578
   mov eax, 0 ;xor eax, eax
7408 theonlymir 579
   mov ecx, selfNameSize    ;max размер строк 11
7389 theonlymir 580
@@:
581
   mov bl, byte[edi]
582
   cmp bl, byte[esi]
583
   jne compareBytes.no
584
   inc edi
585
   inc esi
586
   cmp ecx, 0
587
   je @f
588
   dec ecx
589
   jmp @b
590
.no:
591
   mov eax, 1
592
@@:
593
   pop ebx ecx esi edi
594
   ret
595
;
596
slotMax dd 0
597
selfPID dd 0
598
buf db 1024 dup(0)
599
copyKill:
600
   push eax ebx ecx esi edi
601
 
602
   ;сперва прочтём свою информацию
603
   mcall 9, buf, -1
604
   mov eax, dword[buf+30]
605
   mov dword[selfPID], eax
606
 
607
   ;указатели, которые никогда не меняются:
608
   mov esi, selfName       ;первая строка - имя текущего приложения
609
   mov edi, buf            ;вторая строка - имя текущего слота
610
   add edi, 10
611
 
612
   mov ecx, 1
613
@@:
614
   mcall 9, buf, ecx
615
   mov dword[slotMax], eax
616
 
617
   ;если это мы сами, то пропускаем проверку
618
   mov eax, dword[buf+30]
619
   cmp eax, dword[selfPID]
620
   je copyKill.propusk
621
 
622
   call compareBytes   ;сравниваем 11 байт строк, результат в eax
623
 
624
   cmp eax, 0
625
   je copyKill.selfKill
626
 
627
.propusk:
628
   inc ecx
629
   cmp ecx, dword[slotMax]
630
   ja @f
631
   jmp @b
632
 
633
.selfKill:
634
   pop edi esi ecx ebx eax
635
   mcall -1
636
   ret
637
@@:
638
   pop edi esi ecx ebx eax
639
   ret
640
 
641
 WindowsWidth  = 450
642
 WindowsHeight = 195
643
coord:      ;координаты окна приложения
644
 .y dw 0
645
 .x dw 0
646
 
647
draw_window:
648
        ;удаляем кнопку, если есть
649
        mov edx, 0x80000002
650
        mcall 8
651
 
7436 theonlymir 652
        ;удаляем ещё 4 кнопки если они есть
653
        mov edx, 0x80000004
654
        mcall 8
655
        mov edx, 0x80000005
656
        mcall 8
657
        mov edx, 0x80000006
658
        mcall 8
659
        mov edx, 0x80000007
660
        mcall 8
661
 
7389 theonlymir 662
        mov     eax, 12                 ; function 12: tell os about windowdraw
663
        mov     ebx, 1                  ; 1, start of draw
664
        mcall
665
 
666
        ;отобразим окно по центру экрана для этого:
667
        mcall 14 ;получим размеры экрана
668
        mov dword[coord], eax       ;положим размеры экрана в координаты
669
        shr word[coord.x], 1        ;вернее положим их половину
670
        shr word[coord.y], 1
671
 
672
        ;вычисляем координаты окна, чтобы окно было по середине экрана
673
        sub word[coord.x], WindowsWidth/2
674
        sub word[coord.y], WindowsHeight/2
675
 
676
        mov     eax, 0                  ; function 0 : define and draw window
7408 theonlymir 677
        mov     ebx, 0                  ; [x start] *65536 + [x size]
7389 theonlymir 678
        mov bx, word[coord.x]
679
        shl  ebx, 16
680
        mov bx, WindowsWidth
681
 
682
        mov ecx, 0
7408 theonlymir 683
        mov     cx, word[coord.y]       ; [y start] *65536 + [y size]
7389 theonlymir 684
        shl ecx, 16
685
        mov cx, WindowsHeight
686
 
687
        mov     edx, 0x14ffffff         ; color of work area RRGGBB
688
                                        ; 0x02000000 = window type 4 (fixed size, skinned window)
689
        mov     esi, 0x808899ff         ; color of grab bar  RRGGBB
690
                                        ; 0x80000000 = color glide
691
        mov     edi, title
692
        mcall
693
 
7402 theonlymir 694
        invoke  edit_box_draw, editLU  ;рисование edit box'ов
695
        invoke  edit_box_draw, editLD
696
        invoke  edit_box_draw, editRU
697
        invoke  edit_box_draw, editRD
7389 theonlymir 698
 
699
        ;рисуем кнопку
700
        mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;координата X, ширина кнопки
701
        mov ecx, 160*65536 + 20   ;координата Y, высота кнопки
702
        mov edx, 0x00000002 ;2    ;номер кнопки
703
        mov esi, 0x00AABBCC       ;цвет кнопки
704
        mcall 8
705
        ;рисуем текст кнопки
7395 theonlymir 706
        mov     ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + 166    ;координаты текста (x, y)
7389 theonlymir 707
        mov     ecx, 0xFFFFFF     ;белый цвет текста
708
        mov     edx, buttonText
7448 theonlymir 709
        mov     esi, buttonTextSize  ;размер текста в символах
7395 theonlymir 710
        mcall 4
7389 theonlymir 711
 
7436 theonlymir 712
        ;рисуем ещё 4 кнопки для диалогового окна выбора файла
713
        ;номера 4,5,6 и 7
7448 theonlymir 714
        buttonH = 14
7436 theonlymir 715
        buttonW = 30
716
        ;левый верхний угол
717
        mov ebx, Otstup*65536 + buttonW ;координата X, ширина кнопки
718
        mov ecx, 85*65536 + buttonH   ;координата Y, высота кнопки
719
        mov edx, 0x00000004       ;номер кнопки
720
        mov esi, 0x00AABBCC       ;цвет кнопки
721
        mcall 8
722
        ;левый нижний угол
723
        mov ebx, Otstup*65536 + buttonW ;координата X, ширина кнопки
724
        mov ecx, 120*65536 + buttonH   ;координата Y, высота кнопки
725
        mov edx, 0x00000005       ;номер кнопки
726
        mov esi, 0x00AABBCC       ;цвет кнопки
727
        mcall 8
728
        ;правый верхний угол
729
        mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;координата X, ширина кнопки
730
        mov ecx, 85*65536 + buttonH   ;координата Y, высота кнопки
731
        mov edx, 0x00000006       ;номер кнопки
732
        mov esi, 0x00AABBCC       ;цвет кнопки
733
        mcall 8
734
        ;правый нижний угол
735
        mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;координата X, ширина кнопки
736
        mov ecx, 120*65536 + buttonH   ;координата Y, высота кнопки
737
        mov edx, 0x00000007       ;номер кнопки
738
        mov esi, 0x00AABBCC       ;цвет кнопки
739
        mcall 8
740
 
741
        ;рисуем тексты для этих 4 кнопок
742
        mov     ecx, 0xFFFFFF              ;белый цвет текста
743
        mov     edx, commonButtonText      ;строка текста
744
        mov     esi, commonButtonTextSize  ;размер текста в символах
745
        ;координаты текста (x, y)
746
        deltaCommonTextX = 7
747
        deltaCommonTextY = 2
748
        mov     ebx, (Otstup+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
749
        mcall 4
750
        mov     ebx, (Otstup+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
751
        mcall 4
752
        mov     ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
753
        mcall 4
754
        mov     ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
755
        mcall 4
756
 
7443 theonlymir 757
        ;delete mode button, if it exist
758
        mov edx, 0x80000008
759
        mcall 8
760
        ;draw button Mode
761
        buttonModeX = 30 ;433
762
        buttonModeY = 160 ;50
763
        buttonModeWidth = 221
764
        buttonModeHeight = 20
765
        buttonModeTextXoffset = 5
766
        mov ebx, buttonModeX*65536 + buttonModeWidth  ;X + Width
7448 theonlymir 767
        mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height
768
        mov edx, 0x00000008    ;button id
769
        mov esi, 0x00FFFFFF    ;color button
7443 theonlymir 770
        mcall 8
7448 theonlymir 771
        mov ebx, (buttonModeX+2+buttonModeWidth-20)*65536 + (20-2)  ;X + Width
772
        mov ecx, (buttonModeY+1)*65536 + buttonModeHeight-2   ;Y + Height
773
        mov edx, 0xAABBCC
774
        mcall 13
7443 theonlymir 775
        ;draw text for button Mode
776
        mov     ebx, (buttonModeX+buttonModeTextXoffset) * 65536 + (buttonModeY+6)    ;(x, y)
7448 theonlymir 777
        mov     ecx, 0x000000
7443 theonlymir 778
        call setTextModeMenu
779
        mov     esi, valueModeMenuSize
780
        mcall 4
7448 theonlymir 781
        mov     ebx, (buttonModeX+buttonModeWidth-12) * 65536 + (buttonModeY+6)
782
        mov     ecx, 0x80FFFFFF
783
        mov     edx, symbolDownArrow
784
        mcall 4
7443 theonlymir 785
 
7389 theonlymir 786
        call draw_super_text
787
 
7408 theonlymir 788
        LineLength = 62
7389 theonlymir 789
        mov     ebx, 40 * 65536 + 36    ; draw info text with function 4 (x, y)
790
        mov     ecx, 0x224466
791
        mov     edx, text
792
        mov     esi, LineLength
793
        mov     eax, 4
794
 
795
  .newline:                             ; text from the DATA AREA
796
        mcall
797
        add     ebx, 12
798
        add     edx, LineLength
799
        cmp     byte[edx], 0
800
        jne     .newline
801
 
802
        mov     eax, 12                 ; function 12:tell os about windowdraw
803
        mov     ebx, 2                  ; 2, end of draw
804
        mcall
805
 
806
        ret
807
 
808
 
7443 theonlymir 809
setTextModeMenu:
810
   cmp byte[mode], 48
811
   jne @f
812
        mov edx, valueModeMenu0
813
        ret
814
@@:
815
   cmp byte[mode], 49
816
   jne @f
817
        mov edx, valueModeMenu1
818
        ret
819
@@:
820
   cmp byte[mode], 50
821
   jne @f
822
        mov edx, valueModeMenu2
823
        ret
824
@@:
825
   cmp byte[mode], 51
826
   jne @f
827
        mov edx, valueModeMenu3
828
        ret
829
@@:
830
   mov edx, valueModeMenu1
831
   ret
7389 theonlymir 832
 
7395 theonlymir 833
 
7402 theonlymir 834
align 16
835
@IMPORT:
836
 
837
library box_lib, 'box_lib.obj'
838
 
839
import  box_lib,\
840
        edit_box_draw,          'edit_box',\
841
        edit_box_key,           'edit_box_key',\
842
        edit_box_mouse,         'edit_box_mouse',\
843
        init_checkbox,          'init_checkbox2',\
844
        check_box_draw,         'check_box_draw2',\
845
        check_box_mouse,        'check_box_mouse2',\
846
        option_box_draw,        'option_box_draw',\
847
        option_box_mouse,       'option_box_mouse'
848
 
7436 theonlymir 849
commonButtonText db '...', 0  ;текст для кнопок вызова OpenDial
850
commonButtonTextSize = 3
7402 theonlymir 851
 
7395 theonlymir 852
if lang eq ru  ;если язык сборки русский
853
 
854
text    db  "Љ®­дЁЈга в®а Hot Angles ®вўҐз Ґв §  ­ бва®©Єг  ЄвЁў­ле гЈ«®ў. "
855
        db  "Ќ бвன⥠Ї а ¬Ґвал Ї®¤ бҐЎп Ё«Ё ®вЄ«озЁвҐ нвг ®ЇжЁо.         "
856
        db  "                                                              ", 0
857
 hed:
858
title   db  "Љ®­дЁЈга в®а гвЁ«Ёвл Hot Angles", 0
859
buttonText db "ЏаЁ¬Ґ­Ёвм", 0
860
buttonTextSize = 9
861
buttonTextXoffset = 12
862
 
7402 theonlymir 863
ch_text db '‚Є«озЁвм/ ЄвЁўЁа®ў вм "Hot Angles"', 0
7395 theonlymir 864
 
865
superText:
866
  .lu db 'Љ®¬ ­¤  «Ґў®Ј® ўҐае­ҐЈ® гЈ« : ', 0
867
  .ld db 'Љ®¬ ­¤  «Ґў®Ј® ­Ё¦­ҐЈ® гЈ« :  ', 0
868
  .ru db 'Љ®¬ ­¤  Їа ў®Ј® ўҐае­ҐЈ® гЈ« :', 0
869
  .rd db 'Љ®¬ ­¤  Їа ў®Ј® ­Ё¦­ҐЈ® гЈ« : ', 0
870
superTextSize = 30
871
 
7443 theonlymir 872
valueModeMenuSize = 32
873
ModeMenu  db 'ђҐ¦Ё¬ а Ў®вл:',0
874
valueModeMenu0  db '®вЄ«о祭®                       ',0
875
valueModeMenu1  db 'Є« ббЁзҐбЄЁ© ०Ё¬              ',0
876
valueModeMenu2  db '०Ё¬ Ј®ап祩 Є« ўЁиЁ           ',0
877
valueModeMenu3  db '०Ё¬ ¦Ґбв  Ї® Є« ўЁиҐ  ЄвЁў жЁЁ',0
878
 
7448 theonlymir 879
head_f_i:
880
        head_f_l  db '‘Ёб⥬­ п ®иЁЎЄ ',0
881
        err_message_found_lib0 db 'ЌҐ ­ ©¤Ґ­  ЎЁЎ«Ё®вҐЄ  ',39,'proc_lib.obj',39,0
882
        err_message_import0 db 'ЋиЁЎЄ  ЇаЁ Ё¬Ї®а⥠ЎЁЎ«Ё®вҐЄЁ ',39,'proc_lib.obj',39,0
883
        err_message_found_lib1 db 'ЌҐ ­ ©¤Ґ­  ЎЁЎ«Ё®вҐЄ  ',39,'kmenu.obj',39,0
884
        err_message_import1 db 'ЋиЁЎЄ  ЇаЁ Ё¬Ї®а⥠ЎЁЎ«Ё®вҐЄЁ ',39,'kmenu',39,0
885
 
7395 theonlymir 886
else  ;иначе английский текст
887
 
888
text    db  "This is a Hot Angles Configurator.                            "
889
        db  "Set the parameters bellow for yourself or disable this option."
890
        db  "                                                              ", 0
891
 hed:
892
title   db  "Hot Angles Configurator", 0
893
buttonText db "Apply", 0
894
buttonTextSize = 5
895
buttonTextXoffset = 0
896
 
7402 theonlymir 897
ch_text db 'Activate "Hot Angles"',0       ;сопровождающий текст для чек бокса
7389 theonlymir 898
 
899
superText:
7395 theonlymir 900
  .lu db 'Left up angle command:   ', 0
901
  .ld db 'Left down angle command: ', 0
902
  .ru db 'Right up angle command:  ', 0
7389 theonlymir 903
  .rd db 'Right down angle command:', 0
7395 theonlymir 904
superTextSize = 25
7389 theonlymir 905
 
7443 theonlymir 906
valueModeMenuSize = 32
907
ModeMenu  db 'Mode:',0
908
valueModeMenu0  db 'disabled                        ',0
909
valueModeMenu1  db 'classic mode                    ',0
910
valueModeMenu2  db 'hot key mode                    ',0
911
valueModeMenu3  db 'activation key gesture mode     ',0
912
 
7448 theonlymir 913
head_f_i:
914
        head_f_l  db 'System error',0
915
        err_message_found_lib0 db 'Could not find library ',39,'proc_lib.obj',39,0
916
        err_message_import0 db 'Error importing library ',39,'proc_lib.obj',39,0
917
        err_message_found_lib1 db 'Could not find library ',39,'kmenu.obj',39,0
918
        err_message_import1 db 'Error importing library ',39,'kmenu',39,0
919
 
7395 theonlymir 920
end if
921
 
922
 
7389 theonlymir 923
draw_super_text:
924
   push eax ebx ecx edx edi esi
925
   mov     ebx, Otstup * 65536 + 74    ; draw info text with function 4 (x, y)
926
   mov     ecx, 0x224466
927
   mov eax, superText.lu
928
   mov     edx, eax
7408 theonlymir 929
   mov     esi, superTextSize
7389 theonlymir 930
   mcall 4
931
 
932
   mov     ebx, Otstup * 65536 + 109
933
   mov     edx, superText.ld
7408 theonlymir 934
   mov     esi, superTextSize
7389 theonlymir 935
   mcall 4
936
 
937
   mov     ebx, 240 * 65536 + 74
938
   mov     edx, superText.ru
7408 theonlymir 939
   mov     esi, superTextSize
7389 theonlymir 940
   mcall 4
941
 
942
   mov     ebx, 240 * 65536 + 109
943
   mov     edx, superText.rd
7408 theonlymir 944
   mov     esi, superTextSize
7389 theonlymir 945
   mcall 4
946
 
7443 theonlymir 947
   mov     ebx, Otstup * 65536 + (buttonModeY-11)
948
   or ecx, 0x80000000
949
   mov     edx, ModeMenu
950
   mov     esi, 3
951
   mcall 4
952
 
7389 theonlymir 953
   pop esi edi edx ecx ebx eax
954
   ret
955
 
7436 theonlymir 956
editID db 0
957
initEBX:
958
   cmp byte[editID], 4
959
   jne @f
960
   mov ebx, dataBuffer.1
961
   ret
962
@@:
963
   cmp byte[editID], 5
964
   jne @f
965
   mov ebx, dataBuffer.2
966
   ret
967
@@:
968
   cmp byte[editID], 6
969
   jne @f
970
   mov ebx, dataBuffer.3
971
   ret
972
@@:
973
   cmp byte[editID], 7
974
   jne @f
975
   mov ebx, dataBuffer.4
976
   ret
977
@@:
978
   ret
979
setRESULT:
980
   cmp byte[editID], 4
981
   jne @f
982
   mov dword[dataBuffer.size1], ecx
983
   mov dword[editLU.size], ecx
984
   mov dword[editLU.pos], ecx
985
   ret
986
@@:
987
   cmp byte[editID], 5
988
   jne @f
989
   mov dword[dataBuffer.size2], ecx
990
   mov dword[editLD.size], ecx
991
   mov dword[editLD.pos], ecx
992
   ret
993
@@:
994
   cmp byte[editID], 6
995
   jne @f
996
   mov dword[dataBuffer.size3], ecx
997
   mov dword[editRU.size], ecx
998
   mov dword[editRU.pos], ecx
999
   ret
1000
@@:
1001
   cmp byte[editID], 7
1002
   jne @f
1003
   mov dword[dataBuffer.size4], ecx
1004
   mov dword[editRD.size], ecx
1005
   mov dword[editRD.pos], ecx
1006
   ret
1007
@@:
1008
   ret
1009
copyPath:
1010
   push eax ebx ecx edx ;copy file name path
1011
        mov eax, openfile_path ;dword[OpenDialog_data.openfile_path]
1012
        call initEBX ;mov ebx, dataBuffer.1 ;.data
1013
        mov ecx, 0
1014
      @@:
1015
        mov dl, byte[eax]
1016
        cmp dl, 0 ;byte[eax], 0
1017
        je @f
1018
        mov byte[ebx], dl
1019
        inc eax
1020
        inc ebx
1021
        inc ecx
1022
        jmp @b
1023
      @@:
1024
        mov byte[ebx], 0
1025
        call setRESULT
1026
   pop edx ecx ebx eax
1027
   ret
7389 theonlymir 1028
 
7436 theonlymir 1029
 
1030
align 4
1031
but_open_dlg:
1032
        pushad
1033
        copy_path open_dialog_name,communication_area_default_path,file_name,0
1034
        mov [OpenDialog_data.type],0
1035
        stdcall[OpenDialog_Start], OpenDialog_data
1036
        cmp [OpenDialog_data.status],2
1037
        je @f
1038
        cmp [OpenDialog_data.status],0 ;пользователь нажал Cancel?
1039
        je .end_open
1040
                ;код при удачном открытии диалога
1041
                call copyPath
1042
                jmp .end_open
1043
        @@:
1044
                ;код при не удачном открытии диалога
1045
                ;...
1046
        .end_open:
1047
        popad
1048
        ret
1049
 
7448 theonlymir 1050
;данные для диалога открытия файлов
7436 theonlymir 1051
align 4
1052
OpenDialog_data:
1053
.type                   dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать директорию
1054
.procinfo               dd procinfo
1055
.com_area_name          dd communication_area_name ;+8
7443 theonlymir 1056
.com_area               dd 0           ;+12
7436 theonlymir 1057
.opendir_path           dd plugin_path ;+16
1058
.dir_default_path       dd default_dir ;+20
7443 theonlymir 1059
.start_path             dd file_name   ;+24 путь к диалогу открытия файлов
7436 theonlymir 1060
.draw_window            dd draw_window ;+28
7443 theonlymir 1061
.status                 dd 0           ;+32
7436 theonlymir 1062
.openfile_path          dd openfile_path ;+36 путь к открываемому файлу
1063
.filename_area          dd filename_area ;+40
1064
.filter_area            dd Filter
1065
.x:
1066
.x_size                 dw 420 ;+48 ; Window X size
7443 theonlymir 1067
.x_start                dw 10  ;+50 ; Window X position
7436 theonlymir 1068
.y:
1069
.y_size                 dw 320 ;+52 ; Window y size
7443 theonlymir 1070
.y_start                dw 10  ;+54 ; Window Y position
7436 theonlymir 1071
 
1072
default_dir db '/rd/1',0 ;директория по умолчанию
1073
communication_area_name: db 'FFFFFFFF_open_dialog',0
1074
open_dialog_name:  db 'opendial',0
1075
communication_area_default_path: db '/rd/1/File managers/',0
1076
 
1077
Filter:
1078
dd Filter.end - Filter.1
1079
.1:
1080
;db 'KEX',0
1081
.end:
1082
db 0
7443 theonlymir 1083
 
1084
mode db 49 ;'1'
1085
modeMenu dd 0
1086
coordModeMenu:
1087
  .x dw 100
1088
  .y dw 200
1089
 
1090
 
7436 theonlymir 1091
align 4
1092
proclib_import: ;описание экспортируемых функций
1093
        OpenDialog_Init dd aOpenDialog_Init
1094
        OpenDialog_Start dd aOpenDialog_Start
1095
dd 0,0
1096
        aOpenDialog_Init db 'OpenDialog_init',0
1097
        aOpenDialog_Start db 'OpenDialog_start',0
1098
 
1099
system_dir0 db '/sys/lib/'
1100
lib0_name db 'proc_lib.obj',0
7443 theonlymir 1101
lib1_name db 'kmenu.obj',0
1102
 
7448 theonlymir 1103
symbolDownArrow db 25,0
1104
 
7436 theonlymir 1105
;library structures
1106
l_libs_start:
7443 theonlymir 1107
    lib0 l_libs lib0_name, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, proclib_import,err_message_import0, head_f_i
1108
    lib1 l_libs lib1_name, sys_path, file_name, system_dir0, err_message_found_lib1, head_f_l, import_libkmenu,err_message_import1,head_f_i
7436 theonlymir 1109
load_lib_end:
1110
 
7448 theonlymir 1111
 
7402 theonlymir 1112
edMaxSize = 510 ;теперь с новым компонентом можно и 511 указать
7389 theonlymir 1113
edMax = 0 ;max, size, pos
1114
 
7402 theonlymir 1115
align 4
7436 theonlymir 1116
editLU   edit_box 180-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax  ;ed_focus
1117
editLD   edit_box 180-buttonW,Otstup+buttonW,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax
1118
editRU   edit_box 180-buttonW,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax
1119
editRD   edit_box 180-buttonW,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax
7389 theonlymir 1120
 
7443 theonlymir 1121
align 4
1122
import_libkmenu:
1123
        kmenu_init      dd akmenu_init
1124
        kmainmenu_draw  dd akmainmenu_draw
1125
        kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
1126
        ksubmenu_new    dd aksubmenu_new
1127
        ksubmenu_delete dd aksubmenu_delete
1128
        ksubmenu_draw   dd aksubmenu_draw
1129
        ksubmenu_add    dd aksubmenu_add
1130
        kmenuitem_new   dd akmenuitem_new
1131
        kmenuitem_delete dd akmenuitem_delete
1132
        kmenuitem_draw  dd akmenuitem_draw
1133
dd 0,0
1134
        akmenu_init     db 'kmenu_init',0
1135
        akmainmenu_draw db 'kmainmenu_draw',0
1136
        akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
1137
        aksubmenu_new   db 'ksubmenu_new',0
1138
        aksubmenu_delete db 'ksubmenu_delete',0
1139
        aksubmenu_draw  db 'ksubmenu_draw',0
1140
        aksubmenu_add   db 'ksubmenu_add',0
1141
        akmenuitem_new  db 'kmenuitem_new',0
1142
        akmenuitem_delete db 'kmenuitem_delete',0
1143
        akmenuitem_draw  db 'kmenuitem_draw',0
1144
 
7436 theonlymir 1145
mouse_dd  dd ?
1146
sc  system_colors
1147
 
7443 theonlymir 1148
button_press  rd 0     ;for kmenu
1149
 
1150
sys_path:      rb 4096
1151
file_name:     rb 4096
1152
plugin_path:   rb 4096
1153
openfile_path: rb 4096
1154
filename_area: rb 256
1155
rb 1024
1156
procinfo process_information
1157
pi rb 1024
1158
 
1159
 
7389 theonlymir 1160
dataBuffer:
1161
.1: rb 512
1162
.2: rb 512
1163
.3: rb 512
1164
.4: rb 512
1165
.size1: rd 1
1166
.size2: rd 1
1167
.size3: rd 1
1168
.size4: rd 1
7448 theonlymir 1169
;255+255+2 = 512
7389 theonlymir 1170
;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0
1171
dataBufferEnd:
1172
 
1173
 
1174
I_END:
1175
        rb 4096
1176
align 16
1177
STACKTOP:
1178
 
1179
MEM: