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