Rev 1863 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1863 | yogev_ezra | 1 | ; -------------------------------------------------------- |
2076 | mario79 | 2 | ; KJ|ABuIIIA - клавиатурный тренажёр для операционной системы Колибри. |
3 | ;--------------------------------------------------------------------- |
||
4 | ; version: 0.95 |
||
5 | ; last update: 19/08/2011 |
||
6 | ; changed by: Marat Zakiyanov aka Mario79, aka Mario |
||
7 | ; changes: 1) Checking for "rolled up" window |
||
8 | ; 2) Code optimization |
||
9 | ; 3) Clearing source |
||
10 | ;--------------------------------------------------------------------- |
||
11 | ; version: 0.90 |
||
12 | ; last update: 24/07/2010 |
||
13 | ; changed by: Андрей Михайлович (Dron2004) |
||
1863 | yogev_ezra | 14 | ; |
15 | ; Последние изменения в исходном коде: 24.07.2010 21:15 GMT+6 |
||
2076 | mario79 | 16 | ;--------------------------------------------------------------------- |
17 | use32 |
||
18 | org 0x0 |
||
19 | ;Заголовок |
||
20 | db 'MENUET01' |
||
21 | dd 0x01 |
||
22 | dd START |
||
23 | dd IM_END |
||
24 | dd I_END |
||
25 | dd stacktop |
||
26 | dd params |
||
27 | dd 0x0 |
||
28 | ;--------------------------------------------------------------------- |
||
29 | include 'lang.inc' |
||
30 | include '../../../macros.inc' |
||
31 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 32 | ;Код программы |
33 | START: |
||
2076 | mario79 | 34 | ;Инициализируем кучу |
35 | mcall 68,11 |
||
36 | ; call get_screen_params |
||
37 | ; mov eax,0x0000001C |
||
38 | ; cmp eax,0x0 |
||
39 | ; je start_with_internal_text ; Параметры не заданы |
||
1863 | yogev_ezra | 40 | |
2076 | mario79 | 41 | ; Параметр задан! Пытаемся этим воспользоваться |
42 | ; Необходимо определить размер файла... Вперёд!!! |
||
43 | mov eax,5 |
||
44 | mov [arg1],eax |
||
45 | xor eax,eax |
||
46 | mov [arg2],eax |
||
47 | mov [arg3],eax |
||
48 | mov [arg4],eax |
||
49 | mov eax,filedatastruct |
||
50 | mov [arg5],eax |
||
51 | mov eax,[0x0000001C] |
||
52 | mov [arg7],eax |
||
53 | mcall 70,filestruct |
||
54 | test eax,eax |
||
55 | jne start_with_internal_text ;Ошибка |
||
56 | mov eax, dword [size] |
||
57 | mov [filesize], eax ;теперь размер файла у нас в filesize |
||
58 | ;Выделяем блок памяти под файл |
||
59 | mov ecx, [filesize] |
||
60 | inc ecx ;Выделим дополнительно один байт для того, чтобы добавить 0xFF |
||
1863 | yogev_ezra | 61 | ;защита от "битых" KLA-файлов |
2076 | mario79 | 62 | mcall 68,12 |
63 | mov [datastart], eax ;В переменной ДатаСтарт теперь находится указатель |
||
64 | add eax, [filesize] |
||
65 | mov bh, 0xFF |
||
66 | mov [eax], bh |
||
67 | ;Собственно, считываем файл в память |
||
68 | xor eax,eax |
||
69 | mov [arg1],eax ;Номер подфункции |
||
70 | mov [arg2],eax ;Смещение в файле |
||
71 | mov [arg3],eax ;Старший dword смещения |
||
72 | mov eax,[filesize] |
||
73 | mov [arg4],eax ;Размер файла |
||
74 | mov eax,[datastart] |
||
75 | mov [arg5],eax ;Указатель на данные |
||
76 | mov eax,par |
||
77 | mov [arg7],eax ;Указатель на ASCIIZ-строку |
||
78 | mcall 70,filestruct |
||
79 | test eax,eax |
||
80 | je initialize_variables |
||
1863 | yogev_ezra | 81 | start_with_internal_text: |
2076 | mario79 | 82 | mov edx, string |
83 | mov [datastart], edx |
||
84 | ; mov edx, string ; Используем встроенный текст |
||
1863 | yogev_ezra | 85 | initialize_variables: |
2076 | mario79 | 86 | mov edx,[datastart] |
87 | mov [currentsymb],edx ; Начальная инициализация переменных |
||
88 | mov [startline],edx |
||
89 | mov [lastsymb],edx |
||
90 | mov [lessonstart],edx |
||
91 | xor eax,eax |
||
92 | inc eax |
||
93 | mov [currentline], eax |
||
94 | call count_lines |
||
95 | ;--------------------------------------------------------------------- |
||
96 | redraw: |
||
97 | call draw_window |
||
98 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 99 | ;Основной цикл |
100 | event_wait: |
||
2076 | mario79 | 101 | mcall 10 |
102 | cmp eax, 1 ;Перерисовка окна нужна |
||
103 | je redraw |
||
104 | cmp eax, 2 ;Клавиша нажата |
||
105 | je key |
||
106 | cmp eax, 3 ;По кнопке жмахнули |
||
107 | je button |
||
108 | jmp event_wait |
||
109 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 110 | key: |
2076 | mario79 | 111 | mcall 2 ;Теперь код нажатой клавиши в ah |
112 | push eax |
||
113 | ;Запускаем счётчик времени для последующего |
||
114 | ; определения скорости набора |
||
115 | mov eax, [currentsymb] |
||
116 | cmp eax, [lessonstart] |
||
117 | jne not_first_symbol |
||
118 | mov eax,[mistakes] |
||
119 | test eax,eax |
||
120 | jne not_first_symbol |
||
121 | mcall 26,9 |
||
122 | mov [typestarttime], eax |
||
1863 | yogev_ezra | 123 | not_first_symbol: |
2076 | mario79 | 124 | pop eax |
125 | ;Проверяем, не закончился ли текст |
||
126 | mov esi, [currentsymb] |
||
127 | mov al, byte [esi] |
||
128 | cmp al, 0xFF |
||
129 | je text_end |
||
130 | cmp al, 0xFE |
||
131 | je text_end |
||
132 | push ebx |
||
133 | mov ebx, [currentsymb] |
||
134 | mov al, byte [ebx] |
||
135 | pop ebx |
||
136 | test al,al |
||
137 | jne not_new_line |
||
138 | cmp ah, 0x0D |
||
139 | je correct_key_nl |
||
140 | cmp ah, 0x20 |
||
141 | je correct_key_nl |
||
142 | jmp not_this_key |
||
143 | ;--------------------------------------------------------------------- |
||
144 | correct_key_nl: |
||
145 | mov eax, [currentsymb] |
||
146 | inc eax |
||
147 | mov [startline], eax |
||
148 | mov eax, [currentsymb] |
||
149 | inc eax |
||
150 | mov [currentsymb], eax |
||
151 | mov [lastsymb], eax |
||
152 | mov eax, [currentline] |
||
153 | inc eax |
||
154 | mov [currentline], eax |
||
155 | mov eax, [symbtyped] ;Увеличим число введённых символов на 1 |
||
156 | inc eax |
||
157 | mov [symbtyped], eax |
||
158 | call count_speed |
||
159 | ; call draw_speed |
||
160 | jmp redraw |
||
161 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 162 | not_new_line: |
2076 | mario79 | 163 | cmp ah, al |
164 | jne not_this_key |
||
1863 | yogev_ezra | 165 | correct_key: |
2076 | mario79 | 166 | mov eax, [currentsymb] |
167 | inc eax |
||
168 | mov [currentsymb], eax |
||
169 | mov [lastsymb], eax |
||
170 | mov eax, [symbtyped] ;Увеличим число введённых символов на 1 |
||
171 | inc eax |
||
172 | mov [symbtyped], eax |
||
173 | call count_speed |
||
174 | ; call draw_speed |
||
175 | call redraw_2_symbols |
||
176 | jmp event_wait |
||
177 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 178 | not_this_key: |
2076 | mario79 | 179 | mov esi, [mistakes] |
180 | inc esi |
||
181 | mov [mistakes], esi |
||
182 | call redraw_mistakes |
||
183 | jmp event_wait |
||
184 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 185 | text_end: |
2076 | mario79 | 186 | ; /// Препятствует миганию окна по окончании урока |
187 | ; при нажатии клавиш |
||
188 | mov esi, [startline] |
||
189 | cmp esi, lessoncomplete |
||
190 | je text_end_already_shown |
||
1863 | yogev_ezra | 191 | ; /////////////////////////// |
2076 | mario79 | 192 | call speed_to_string |
193 | mov esi, lessoncomplete |
||
194 | mov [startline], esi |
||
195 | mov esi, lessoncompleteend |
||
196 | dec esi |
||
197 | mov [currentsymb], esi |
||
198 | call draw_window |
||
1863 | yogev_ezra | 199 | text_end_already_shown: |
2076 | mario79 | 200 | jmp event_wait |
201 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 202 | button: |
2076 | mario79 | 203 | mcall 17 ;Идентификатор нажатой кнопки возвращён в ah |
204 | cmp ah, 1 ;это кнопка закрытия |
||
205 | jne no_close |
||
206 | mcall -1 |
||
1863 | yogev_ezra | 207 | no_close: |
2076 | mario79 | 208 | ;Проверяем остальные кнопки |
209 | cmp ah, 0x02 |
||
210 | jne no_button_2 |
||
211 | ;Нажата кнопка 2 |
||
212 | ;--------------------------------------------------------------------- |
||
213 | ; ОЧЕНЬ СТРАШНЫЙ КОД |
||
214 | ;--------------------------------------------------------------------- |
||
215 | xor eax, eax |
||
216 | mov [mistakes], 0x0 |
||
217 | mov esi, [lastsymb] |
||
218 | mov al, [esi] |
||
219 | ;Нужно проверить, что за символ был последним. Если 0xFF - |
||
220 | ;Текст кончился, нужно начать всё сначала |
||
221 | cmp al, 0xFF |
||
222 | je start_1st_lesson |
||
223 | cmp al, 0xFE ; Мы прошли прошлый урок? |
||
224 | jne not_completed_previous |
||
1863 | yogev_ezra | 225 | init_level_after_fe: |
2076 | mario79 | 226 | ;Ежели да, то проверим, не попал ли случайно следующим символом 0xFF |
227 | inc esi |
||
228 | mov al, [esi] |
||
229 | cmp al, 0xFF |
||
230 | ;Ежели нет - это и есть следующий урок |
||
231 | jne set_lesson_start_from_esi |
||
1863 | yogev_ezra | 232 | start_1st_lesson: |
2076 | mario79 | 233 | mov esi, [datastart] |
1863 | yogev_ezra | 234 | set_lesson_start_from_esi: |
2076 | mario79 | 235 | mov [startline], esi |
236 | mov [currentsymb], esi |
||
237 | mov [lastsymb], esi |
||
238 | mov [lessonstart], esi |
||
239 | xor eax,eax |
||
240 | jmp no_button_3.2 |
||
241 | ; inc eax |
||
242 | ; mov [currentline], eax |
||
243 | ; call count_lines |
||
244 | ; call reset_speed_counters |
||
245 | ; jmp redraw |
||
246 | ;--------------------------------------------------------------------- |
||
247 | not_completed_previous: |
||
248 | inc esi |
||
249 | mov al, [esi] |
||
250 | cmp al, 0xFF |
||
251 | je start_1st_lesson |
||
252 | cmp al, 0xFE |
||
253 | je init_level_after_fe |
||
254 | jmp not_completed_previous |
||
255 | ;--------------------------------------------------------------------- |
||
256 | ; КОНЕЦ СТРАШНОГО КОДА |
||
257 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 258 | no_button_2: |
2076 | mario79 | 259 | cmp ah,0x03 |
260 | jne no_button_3 |
||
261 | ;Перезапуск уровня |
||
262 | mov edx,[lessonstart] |
||
263 | jmp no_button_3.1 |
||
264 | ; mov [currentsymb],edx |
||
265 | ; mov [startline],edx |
||
266 | ; mov [lastsymb],edx |
||
267 | ; xor eax,eax |
||
268 | ; mov [mistakes],eax |
||
269 | ; inc eax |
||
270 | ; mov [currentline],eax |
||
271 | ; call reset_speed_counters |
||
272 | ; call count_lines |
||
273 | ; jmp redraw |
||
274 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 275 | no_button_3: |
2076 | mario79 | 276 | cmp ah,0x04 |
277 | jne event_wait |
||
278 | ;Перезапуск курса упражнений |
||
279 | mov edx,[datastart] |
||
280 | mov [lessonstart],edx |
||
281 | .1: |
||
282 | mov [currentsymb],edx |
||
283 | mov [startline],edx |
||
284 | mov [lastsymb],edx |
||
285 | xor eax,eax |
||
286 | mov [mistakes],eax |
||
287 | .2: |
||
288 | inc eax |
||
289 | mov [currentline],eax |
||
290 | call reset_speed_counters |
||
291 | call count_lines |
||
292 | jmp redraw |
||
293 | ;--------------------------------------------------------------------- |
||
294 | ;Получим текущие параметры окна |
||
295 | get_window_param: |
||
296 | mcall 9,procinfo,-1 |
||
297 | ret |
||
298 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 299 | ;"Сердце" программы - функция рисования окна (всё остальное - туловище Ж-)) ) |
300 | draw_window: |
||
2076 | mario79 | 301 | mcall 12,1 |
302 | mov ax,[areawidth] ;Это первый вызов draw_window? |
||
303 | test ax,ax |
||
304 | jne .dw_not_first_call |
||
305 | call get_screen_params ;Получаем параметры экрана - ширину и высоту |
||
306 | .dw_not_first_call: |
||
307 | ;в ebx - X и ширина |
||
308 | mov bx,[windowx] |
||
309 | shl ebx,16 |
||
310 | mov bx,780 |
||
311 | ; mov ebx,10*65536+780 |
||
312 | ;в ecx - Y и высота |
||
313 | mov cx, [windowy] |
||
314 | shl ecx,16 |
||
315 | mov cx,580 |
||
316 | ; mov ecx,10*65536+580 |
||
317 | xor esi,esi |
||
318 | ;Определить и вывести окно |
||
319 | mcall 0,,,0x33CCCCCC,,text |
||
320 | call get_window_param |
||
321 | mov eax,[procinfo+70] ;status of window |
||
322 | test eax,100b |
||
323 | jne .end |
||
1863 | yogev_ezra | 324 | ;Нарисуем кнопку СЛЕДУЮЩИЙ УРОК и текст на ней |
2076 | mario79 | 325 | mcall 8,<295,145>,<8,18>,2,0x0099CC99 |
1863 | yogev_ezra | 326 | ;Нарисуем кнопку ПОВТОРИТЬ УПРАЖНЕНИЕ |
2076 | mario79 | 327 | mcall ,<450,145>,,3,0x00CC9999 |
1863 | yogev_ezra | 328 | ;Нарисуем кнопку НАЧАТЬ КУРС ЗАНОВО |
2076 | mario79 | 329 | mcall ,<605,145>,,4,0x00DD7777 |
330 | ;Выводим текст на кнопках |
||
331 | mcall 4,<310,14>,0x80000000,buttontext |
||
332 | mcall ,<465,14>,,retrybuttontext |
||
333 | mcall ,<626,14>,,restartbuttontext |
||
1863 | yogev_ezra | 334 | ; Нарисуем логотип |
2076 | mario79 | 335 | xor ebp,ebp |
336 | mcall 65,logo,<32,12>,<12,12>,1,green_text |
||
1863 | yogev_ezra | 337 | ;Получим текущие параметры окна |
2076 | mario79 | 338 | call get_window_param |
339 | add ebx,0x2A |
||
340 | mov eax,[ebx] |
||
341 | mov [windowwidth], eax |
||
342 | mov ebx,procinfo |
||
343 | add ebx,0x2E |
||
344 | mov eax,[ebx] |
||
345 | mov [windowheight], eax |
||
346 | ;draw_error_count: |
||
347 | ; Нарисуем надпись "ОШИБОК" |
||
348 | mcall 4,<60,15>,0x80AA0000,mistakestext |
||
349 | ; Выведем число ошибок |
||
350 | mcall 47,0x80040000,[mistakes],<105,15>,0x00AA0000 |
||
351 | ;draw_line_number: |
||
352 | ; Нарисуем надпись "Строка из" |
||
353 | mcall 4,<140,15>,0x8000AA00,lineistext |
||
354 | ;Выведем номер текущей строки |
||
355 | mcall 47,80040000,[currentline],<195,15>,0x0000AA00 |
||
356 | ;Выведем текущую строку |
||
357 | mcall ,,[linecount],<252,15>, |
||
358 | ;Вывести рабочий текст |
||
359 | call draw_text |
||
360 | .end: |
||
361 | mcall 12,2 |
||
362 | ret |
||
363 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 364 | draw_text: |
2076 | mario79 | 365 | ;Подготовка к выводу текста |
366 | mov edx,40 ;Начальное положение выводимого текста по вертикали |
||
367 | mov esi,[startline] |
||
368 | dec esi ;Так надо (см. *1 ниже)! |
||
369 | mov ebx,esi ;Теперь в edx - начало выводимой строки |
||
370 | .start: |
||
371 | ;Наращиваем указатель на текущий символ на единицу |
||
372 | inc ebx ;(*1) |
||
373 | .draw_text_without_inc: |
||
374 | ;Посмотрим,не выходит ли текст за границу окна |
||
375 | mov esi,[windowheight] ;Теперь в esi размер окна |
||
376 | mov eax,edx |
||
377 | and eax,0x0000FFFF |
||
378 | add eax,64 |
||
379 | cmp eax,esi |
||
380 | ja end_draw_text ;Мы выходим за пределы окна. Перестаём рисовать. |
||
381 | ;установим положение по горизонтали (+18 к текущей позиции) |
||
382 | mov esi,18*65536 |
||
383 | add edx,esi |
||
384 | ; посмотрим, не вышел ли текст за границу по горизонтали |
||
385 | ; если вышел - не рисуем этот кусок |
||
386 | mov esi,[windowwidth] ;Теперь в esi размер окна |
||
387 | shl esi,16 |
||
388 | mov eax,edx |
||
389 | and eax,0xFFFF0000 |
||
390 | add eax,40*65536 |
||
391 | cmp eax,esi |
||
392 | jna .horizontal_check_ok ;Если eax>est, то мы выходим за пределы окна. |
||
393 | .skip_line_end_step: |
||
394 | mov ah,byte [ebx] |
||
395 | cmp ah,0x00 |
||
396 | je .end_line_to_next_line |
||
397 | cmp ah,0xFE |
||
398 | je end_draw_text |
||
399 | cmp ah,0xFF |
||
400 | je end_draw_text |
||
401 | inc ebx |
||
402 | jmp .skip_line_end_step |
||
403 | ;------------------------------------------- |
||
404 | .end_line_to_next_line: |
||
405 | and edx,0x0000FFFF |
||
406 | jmp .draw_text_without_inc |
||
407 | ;------------------------------------------- |
||
408 | .horizontal_check_ok: |
||
409 | ;Проверим, не закончился ли урок |
||
410 | mov esi, [startline] |
||
411 | cmp esi, lessoncomplete |
||
412 | jne .in_process |
||
413 | ;Если закончился, текст выводить нужно ЗЕЛЕНЫМ ЦВЕТОМ |
||
414 | mov edi, green_text |
||
415 | jmp .color_set_sucessful |
||
416 | ;-------------------------------------------- |
||
417 | .in_process: |
||
418 | cmp ebx, [currentsymb] ; Рисуется текущий набираемый символ? |
||
419 | je .red ; Так точно! |
||
420 | ja .black ; Нет, Рисуется то, что мы ещё не набрали |
||
421 | mov edi, gray_text ; Нет, рисуется то, что мы уже набрали |
||
422 | jmp .color_set_sucessful |
||
423 | ;-------------------------------------------- |
||
424 | .red: |
||
425 | mov edi, red_text |
||
426 | jmp .color_set_sucessful |
||
427 | ;--------------------------------------------- |
||
428 | .black: |
||
429 | mov edi, black_text ;Шрифт и цвет |
||
430 | .color_set_sucessful: |
||
431 | xor esi,esi |
||
432 | movzx si, byte [ebx] |
||
433 | cmp si, 0x0000 |
||
434 | jne .continue_drawing |
||
435 | ; call increase_y; |
||
436 | ; Увеличим вертикальную координату вывода букв, |
||
437 | ; если кончилась строка (встретился байт 0x00) |
||
438 | and edx,0x0000FFFF |
||
439 | add edx, 33 |
||
440 | jmp .continue_text_proc |
||
441 | ;---------------------------------------------- |
||
442 | .continue_drawing: |
||
443 | cmp si, 0x00FF |
||
444 | je end_draw_text |
||
445 | cmp si, 0x00FE |
||
446 | je end_draw_text |
||
447 | ;Рисуем букву с помощью БОЛЬШОГО шрифта |
||
448 | push ebx |
||
449 | push edx |
||
450 | movzx eax, byte [ebx] |
||
451 | shl eax,6 |
||
452 | add eax, big_font |
||
453 | mov ebx, eax |
||
454 | pop edx |
||
455 | mov ecx, 16*65536+32 |
||
456 | ; В edx лежит координата |
||
457 | mov esi, 1 |
||
458 | ; В edi лежит указатель на палитру (цвет шрифта) |
||
459 | xor ebp,ebp |
||
460 | mcall 65 |
||
461 | pop ebx |
||
462 | ;На этом отрисовка буквы завершена |
||
463 | .continue_text_proc: |
||
464 | ; inc edi |
||
465 | jmp .start |
||
1863 | yogev_ezra | 466 | end_draw_text: |
467 | ret |
||
2076 | mario79 | 468 | ;--------------------------------------------------------------------- |
1863 | yogev_ezra | 469 | ;ПРОЦЕДУРА ПЕРЕРИСОВКИ ДВУХ СИМВОЛОВ (ДАБЫ МИНИМИЗИРОВАТЬ МИГАНИЕ) |
470 | redraw_2_symbols: |
||
2076 | mario79 | 471 | ;Проверим, не выйдем ли мы при рисованаии за границу допустимой |
472 | ;области внутри окна. Если выйдем - скроллим строку по горизонтали |
||
473 | mov esi, [windowwidth] ;Теперь в esi размер окна |
||
474 | mov eax, [currentsymb] |
||
475 | sub eax, [startline] |
||
476 | mov ecx, 18 |
||
477 | mul ecx |
||
478 | add eax, 20 |
||
479 | add eax, 20 |
||
480 | add eax, 40 |
||
481 | cmp eax, esi |
||
482 | jna r2s_horizontal_check_ok ;Если eax>est, то мы выходим за пределы окна. |
||
483 | ;Итак, мы выходим за границы окна... Это плохо... |
||
484 | ;Строку придётся скроллить... |
||
485 | mov eax, [currentsymb] |
||
486 | dec eax |
||
487 | mov [startline], eax |
||
488 | call draw_window |
||
489 | jmp return_from_redraw_2_symbols |
||
490 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 491 | r2s_horizontal_check_ok: |
2076 | mario79 | 492 | ;Рисуем ПРЕДЫДУЩУЮ СЕРУЮ букву с помощью БОЛЬШОГО шрифта |
493 | mov ebx, [currentsymb] |
||
494 | dec ebx |
||
495 | movzx eax, byte [ebx] |
||
496 | shl eax,6 |
||
497 | add eax, big_font |
||
498 | mov ebx, eax |
||
499 | mov ecx, 16*65536+32 |
||
500 | mov eax, [currentsymb] |
||
501 | sub eax, [startline] |
||
502 | dec eax |
||
503 | imul eax,18 |
||
504 | add eax, 18 |
||
505 | shl eax,16 |
||
506 | add eax, 40 |
||
507 | mov edx, eax |
||
508 | xor ebp,ebp |
||
509 | mcall 65,,,,1,gray_text |
||
510 | ;Рисуем ТЕКУЩУЮ БУКВУ |
||
511 | mov ebx, [currentsymb] |
||
512 | movzx eax, byte [ebx] |
||
513 | shl eax,6 |
||
514 | add eax, big_font |
||
515 | mov ebx, eax |
||
516 | mov ecx, 16*65536+32 |
||
517 | mov eax, [currentsymb] |
||
518 | sub eax, [startline] |
||
519 | imul eax,18 |
||
520 | add eax, 18 |
||
521 | shl eax,16 |
||
522 | add eax, 40 |
||
523 | mov edx, eax |
||
524 | mcall 65,,,,1,red_text |
||
1863 | yogev_ezra | 525 | return_from_redraw_2_symbols: |
526 | ret |
||
2076 | mario79 | 527 | ;--------------------------------------------------------------------- |
1863 | yogev_ezra | 528 | redraw_mistakes: |
2076 | mario79 | 529 | ;Закрасим прямоугольник |
530 | mcall 13,<59,75>,<14,10>,0x00CCCCCC |
||
531 | ; Нарисуем надпись "ОШИБОК" |
||
532 | mcall 4,<60,15>,0x80AA0000,mistakestext |
||
533 | ; Выведем число ошибок |
||
534 | mcall 47,0x80040000,[mistakes],<105,15>,0x00AA0000 |
||
1863 | yogev_ezra | 535 | ret |
2076 | mario79 | 536 | ;--------------------------------------------------------------------- |
1863 | yogev_ezra | 537 | count_lines: |
2076 | mario79 | 538 | xor ecx, ecx ; В ecx - счётчик строк |
539 | inc ecx ; У нас 1 строка |
||
540 | ; Начинаем разбор... |
||
541 | mov eax, [startline] |
||
542 | dec eax |
||
1863 | yogev_ezra | 543 | cl_next_step: |
2076 | mario79 | 544 | inc eax |
545 | mov bh, [eax] |
||
546 | cmp bh, 0x00 |
||
547 | jne cl_not_new_line |
||
548 | inc ecx |
||
549 | jmp cl_next_step |
||
550 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 551 | cl_not_new_line: |
2076 | mario79 | 552 | cmp bh, 0xFE |
553 | je cl_end |
||
554 | cmp bh, 0xFF |
||
555 | je cl_end |
||
556 | jmp cl_next_step |
||
557 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 558 | cl_end: |
2076 | mario79 | 559 | mov [linecount],ecx |
1863 | yogev_ezra | 560 | ret |
2076 | mario79 | 561 | ;--------------------------------------------------------------------- |
1863 | yogev_ezra | 562 | reset_speed_counters: |
2076 | mario79 | 563 | xor eax,eax |
564 | mov [symbtyped],eax |
||
565 | mov [typestarttime],eax |
||
566 | mov [currenttime],eax |
||
567 | mov [typingspeed],eax |
||
1863 | yogev_ezra | 568 | ret |
2076 | mario79 | 569 | ;--------------------------------------------------------------------- |
1863 | yogev_ezra | 570 | count_speed: |
2076 | mario79 | 571 | mcall 26,9 |
572 | mov [currenttime], eax |
||
573 | mov ebx, [typestarttime] |
||
574 | sub eax, ebx ;Теперь в eax - число прошедших долей секунд |
||
575 | mov ecx, [symbtyped] |
||
576 | cmp ecx, 0x00 |
||
577 | jne cs_all_ok |
||
578 | inc ecx |
||
1863 | yogev_ezra | 579 | cs_all_ok: |
2076 | mario79 | 580 | xor edx, edx; |
581 | div ecx ;Теперь в eax - средняя пауза между символами |
||
582 | mov ecx, eax |
||
583 | cmp ecx, 0x00 |
||
584 | jne cs_all_ok_2 |
||
585 | inc ecx |
||
1863 | yogev_ezra | 586 | cs_all_ok_2: |
2076 | mario79 | 587 | xor edx, edx |
588 | mov eax, 6000 |
||
589 | div ecx |
||
590 | mov [typingspeed], eax ;Вот и всё. В [typingspeed] - средняя скорость набора |
||
1863 | yogev_ezra | 591 | ret |
2076 | mario79 | 592 | ;--------------------------------------------------------------------- |
1863 | yogev_ezra | 593 | speed_to_string: |
2076 | mario79 | 594 | ; Преобразует число в строку и записывает по адрему переменной speedbytes задом наперёд |
595 | xor edx, edx |
||
596 | mov eax, [typingspeed] |
||
597 | mov ecx, 10 |
||
598 | div ecx |
||
599 | add dl, 30h |
||
600 | mov [speedbytes + 3], dl |
||
601 | xor edx, edx |
||
602 | div ecx |
||
603 | add dl, 30h |
||
604 | mov [speedbytes + 2], dl |
||
605 | xor edx, edx |
||
606 | div ecx |
||
607 | add dl, 30h |
||
608 | mov [speedbytes + 1], dl |
||
609 | xor edx, edx |
||
610 | div ecx |
||
611 | cmp dl, 0x00 |
||
612 | je sts_move_space |
||
613 | add dl, 30h |
||
614 | mov [speedbytes], dl |
||
615 | jmp sts_end |
||
616 | ;--------------------------------------------------------------------- |
||
617 | sts_move_space: |
||
618 | mov [speedbytes], 0x20 |
||
619 | sts_end: |
||
1863 | yogev_ezra | 620 | ret |
2076 | mario79 | 621 | ;--------------------------------------------------------------------- |
1863 | yogev_ezra | 622 | get_screen_params: |
2076 | mario79 | 623 | mcall 14 |
624 | mov [areaheight], ax |
||
625 | push ax |
||
626 | shr eax, 16 |
||
627 | mov [areawidth],ax |
||
628 | ;В ax по прежнему находится ширина окна. Воспользуемся этим |
||
629 | sub ax, 780 ;Вычтем начальный размер окна |
||
630 | shr ax, 1 |
||
631 | mov [windowx], ax |
||
632 | ; Переходим к высоте |
||
633 | xor ax, ax |
||
634 | pop ax ; Вытолкнем из стека значение высоты |
||
635 | sub ax, 580 |
||
636 | shr ax, 1 |
||
637 | mov [windowy], ax |
||
1863 | yogev_ezra | 638 | ret |
2076 | mario79 | 639 | ;--------------------------------------------------------------------- |
1863 | yogev_ezra | 640 | ;draw_speed: |
2076 | mario79 | 641 | ;Закрасим прямоугольник |
642 | ; mcall 13,<59,340>,<29,10>,0x00CCCCCC |
||
643 | ; Нарисуем надпись "Скорость набора (знаков в минуту):" |
||
644 | ; mcall 4,<60,30>,0x80008800,speedtext |
||
645 | ; Выведем число |
||
646 | ; mcall 47,0x80040000,[typingspeed],<305,30>,0x00008800 |
||
647 | ; ret |
||
648 | ;--------------------------------------------------------------------- |
||
649 | include 'data.inc' |
||
650 | ;--------------------------------------------------------------------- |
||
651 | IM_END: |
||
652 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 653 | par: |
2076 | mario79 | 654 | params: |
655 | rb 1024 |
||
656 | ;--------------------------------------------------------------------- |
||
657 | procinfo: |
||
658 | rb 1024 |
||
659 | ;--------------------------------------------------------------------- |
||
660 | rb 1024 |
||
661 | stacktop: |
||
662 | ;--------------------------------------------------------------------- |
||
1863 | yogev_ezra | 663 | I_END:305,30>60,30>29,10>59,340>105,15>60,15>14,10>59,75>252,15>195,15>140,15>105,15>60,15>12,12>32,12>626,14>465,14>310,14>605,145>450,145>8,18>295,145> |