Subversion Repositories Kolibri OS

Rev

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: