Subversion Repositories Kolibri OS

Rev

Rev 2076 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; --------------------------------------------------------
  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)
  14. ;
  15. ; Последние изменения в исходном коде: 24.07.2010 21:15 GMT+6
  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. ;---------------------------------------------------------------------
  32. ;Код программы
  33. START:
  34. ;Инициализируем кучу
  35.         mcall   68,11
  36. ;       call    get_screen_params
  37.         mov     eax,params
  38.         cmp     [eax],byte 0x0
  39.         je      start_with_internal_text  ; Параметры не заданы
  40.  
  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
  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.  
  87.         test    eax,eax
  88.         jnz     initialize_variables
  89. start_with_internal_text:
  90.         mov     edx, string
  91.         mov     [datastart], edx
  92. ;       mov     edx, string         ; Используем встроенный текст
  93. initialize_variables:
  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. ;---------------------------------------------------------------------
  107. ;Основной цикл
  108. event_wait:
  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. ;---------------------------------------------------------------------
  118. key:
  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
  131. not_first_symbol:
  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. ;---------------------------------------------------------------------
  170. not_new_line:
  171.         cmp     ah, al
  172.         jne     not_this_key
  173. correct_key:
  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. ;---------------------------------------------------------------------
  186. not_this_key:
  187.         mov     esi, [mistakes]
  188.         inc     esi
  189.         mov     [mistakes], esi
  190.         call    redraw_mistakes
  191.         jmp     event_wait
  192. ;---------------------------------------------------------------------
  193. text_end:
  194. ; /// Препятствует миганию окна по окончании урока
  195. ; при нажатии клавиш
  196.         mov     esi, [startline]
  197.         cmp     esi, lessoncomplete
  198.         je      text_end_already_shown
  199.         ; ///////////////////////////
  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
  207. text_end_already_shown:
  208.         jmp     event_wait
  209. ;---------------------------------------------------------------------
  210. button:
  211.         mcall   17      ;Идентификатор нажатой кнопки возвращён в ah
  212.         cmp     ah, 1    ;это кнопка закрытия
  213.         jne     no_close
  214.         mcall   -1
  215. no_close:
  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
  233. init_level_after_fe:
  234. ;Ежели да, то проверим, не попал ли случайно следующим символом 0xFF
  235.         inc     esi
  236.         mov     al, [esi]
  237.         cmp     al, 0xFF
  238. ;Ежели нет - это и есть следующий урок
  239.         jne     set_lesson_start_from_esi
  240. start_1st_lesson:
  241.         mov     esi, [datastart]
  242. set_lesson_start_from_esi:
  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. ;---------------------------------------------------------------------
  266. no_button_2:
  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. ;---------------------------------------------------------------------
  283. no_button_3:
  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. ;---------------------------------------------------------------------
  307. ;"Сердце" программы - функция рисования окна (всё остальное - туловище Ж-)) )
  308. draw_window:
  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
  332. ;Нарисуем кнопку СЛЕДУЮЩИЙ УРОК и текст на ней
  333.         mcall   8,<295,145>,<8,18>,2,0x0099CC99
  334. ;Нарисуем кнопку ПОВТОРИТЬ УПРАЖНЕНИЕ
  335.         mcall   ,<450,145>,,3,0x00CC9999
  336. ;Нарисуем кнопку НАЧАТЬ КУРС ЗАНОВО
  337.         mcall   ,<605,145>,,4,0x00DD7777
  338. ;Выводим текст на кнопках
  339.         mcall   4,<310,14>,0x80000000,buttontext
  340.         mcall   ,<465,14>,,retrybuttontext     
  341.         mcall   ,<626,14>,,restartbuttontext
  342. ; Нарисуем логотип
  343.         xor     ebp,ebp
  344.         mcall   65,logo,<32,12>,<12,12>,1,green_text
  345. ;Получим текущие параметры окна
  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. ;---------------------------------------------------------------------
  372. draw_text:
  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
  474. end_draw_text:
  475.         ret
  476. ;---------------------------------------------------------------------
  477. ;ПРОЦЕДУРА ПЕРЕРИСОВКИ ДВУХ СИМВОЛОВ (ДАБЫ МИНИМИЗИРОВАТЬ МИГАНИЕ)
  478. redraw_2_symbols:
  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. ;---------------------------------------------------------------------
  499. r2s_horizontal_check_ok:
  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
  533. return_from_redraw_2_symbols:
  534.         ret
  535. ;---------------------------------------------------------------------
  536. redraw_mistakes:
  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
  543.         ret
  544. ;---------------------------------------------------------------------
  545. count_lines:
  546.         xor     ecx, ecx                ; В ecx - счётчик строк
  547.         inc     ecx             ; У нас 1 строка
  548. ; Начинаем разбор...
  549.         mov     eax, [startline]
  550.         dec     eax
  551. cl_next_step:
  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. ;---------------------------------------------------------------------
  559. cl_not_new_line:
  560.         cmp     bh, 0xFE
  561.         je      cl_end
  562.         cmp     bh, 0xFF
  563.         je      cl_end
  564.         jmp     cl_next_step
  565. ;---------------------------------------------------------------------
  566. cl_end:
  567.         mov     [linecount],ecx
  568.         ret
  569. ;---------------------------------------------------------------------
  570. reset_speed_counters:
  571.         xor     eax,eax
  572.         mov     [symbtyped],eax
  573.         mov     [typestarttime],eax
  574.         mov     [currenttime],eax
  575.         mov     [typingspeed],eax
  576.         ret
  577. ;---------------------------------------------------------------------
  578. count_speed:
  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
  587. cs_all_ok:
  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
  594. cs_all_ok_2:
  595.         xor     edx, edx
  596.         mov     eax, 6000
  597.         div     ecx
  598.         mov     [typingspeed], eax ;Вот и всё. В [typingspeed] - средняя скорость набора
  599.         ret
  600. ;---------------------------------------------------------------------
  601. speed_to_string:
  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:
  628.         ret
  629. ;---------------------------------------------------------------------
  630. get_screen_params:
  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
  646.         ret
  647. ;---------------------------------------------------------------------
  648. ;draw_speed:
  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. ;---------------------------------------------------------------------
  661. par:
  662. params:
  663.         rb 1024
  664. ;---------------------------------------------------------------------
  665. procinfo:
  666.         rb 1024
  667. ;---------------------------------------------------------------------
  668.         rb 1024
  669. stacktop:
  670. ;---------------------------------------------------------------------
  671. I_END: