Subversion Repositories Kolibri OS

Rev

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: