Subversion Repositories Kolibri OS

Rev

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

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