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