Subversion Repositories Kolibri OS

Rev

Rev 1863 | Go to most recent revision | 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,0x0000001C
  38. ;       cmp     eax,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.         test    eax,eax
  80.         je      initialize_variables
  81. start_with_internal_text:
  82.         mov     edx, string
  83.         mov     [datastart], edx
  84. ;       mov     edx, string         ; ˆá¯®«ì§ã¥¬ ¢áâ஥­­ë© ⥪áâ
  85. initialize_variables:
  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. ;---------------------------------------------------------------------
  99. ;Žá­®¢­®© 横«
  100. event_wait:
  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. ;---------------------------------------------------------------------
  110. key:
  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
  123. not_first_symbol:
  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. ;---------------------------------------------------------------------
  162. not_new_line:
  163.         cmp     ah, al
  164.         jne     not_this_key
  165. correct_key:
  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. ;---------------------------------------------------------------------
  178. not_this_key:
  179.         mov     esi, [mistakes]
  180.         inc     esi
  181.         mov     [mistakes], esi
  182.         call    redraw_mistakes
  183.         jmp     event_wait
  184. ;---------------------------------------------------------------------
  185. text_end:
  186. ; /// à¥¯ïâáâ¢ã¥â ¬¨£ ­¨î ®ª­  ¯® ®ª®­ç ­¨¨ ãப 
  187. ; ¯à¨ ­ ¦ â¨¨ ª« ¢¨è
  188.         mov     esi, [startline]
  189.         cmp     esi, lessoncomplete
  190.         je      text_end_already_shown
  191.         ; ///////////////////////////
  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
  199. text_end_already_shown:
  200.         jmp     event_wait
  201. ;---------------------------------------------------------------------
  202. button:
  203.         mcall   17      ;ˆ¤¥­â¨ä¨ª â®à ­ ¦ â®© ª­®¯ª¨ ¢®§¢à éñ­ ¢ ah
  204.         cmp     ah, 1    ;íâ® ª­®¯ª  § ªàëâ¨ï
  205.         jne     no_close
  206.         mcall   -1
  207. no_close:
  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
  225. init_level_after_fe:
  226. ;…¦¥«¨ ¤ , â® ¯à®¢¥à¨¬, ­¥ ¯®¯ « «¨ á«ãç ©­® á«¥¤ãî騬 ᨬ¢®«®¬ 0xFF
  227.         inc     esi
  228.         mov     al, [esi]
  229.         cmp     al, 0xFF
  230. ;…¦¥«¨ ­¥â - íâ® ¨ ¥áâì á«¥¤ãî騩 ãப
  231.         jne     set_lesson_start_from_esi
  232. start_1st_lesson:
  233.         mov     esi, [datastart]
  234. set_lesson_start_from_esi:
  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. ;---------------------------------------------------------------------
  258. no_button_2:
  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. ;---------------------------------------------------------------------
  275. no_button_3:
  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. ;---------------------------------------------------------------------
  299. ;"‘¥à¤æ¥" ¯à®£à ¬¬ë - äã­ªæ¨ï à¨á®¢ ­¨ï ®ª­  (¢áñ ®áâ «ì­®¥ - âã«®¢¨é¥ †-)) )
  300. draw_window:
  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
  324. ; à¨á㥬 ª­®¯ªã ‘‹…„“ž™ˆ‰ “ŽŠ ¨ ⥪áâ ­  ­¥©
  325.         mcall   8,<295,145>,<8,18>,2,0x0099CC99
  326. ; à¨á㥬 ª­®¯ªã Ž‚’Žˆ’œ “€†…ˆ…
  327.         mcall   ,<450,145>,,3,0x00CC9999
  328. ; à¨á㥬 ª­®¯ªã €—€’œ Š“‘ ‡€Ž‚Ž
  329.         mcall   ,<605,145>,,4,0x00DD7777
  330. ;‚뢮¤¨¬ ⥪áâ ­  ª­®¯ª å
  331.         mcall   4,<310,14>,0x80000000,buttontext
  332.         mcall   ,<465,14>,,retrybuttontext     
  333.         mcall   ,<626,14>,,restartbuttontext
  334. ;  à¨á㥬 «®£®â¨¯
  335.         xor     ebp,ebp
  336.         mcall   65,logo,<32,12>,<12,12>,1,green_text
  337. ;®«ã稬 ⥪ã騥 ¯ à ¬¥âàë ®ª­ 
  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. ;---------------------------------------------------------------------
  364. draw_text:
  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
  466. end_draw_text:
  467.         ret
  468. ;---------------------------------------------------------------------
  469. ;Ž–…„“€ ……ˆ‘Ž‚Šˆ „‚“• ‘ˆŒ‚Ž‹Ž‚ („€› ŒˆˆŒˆ‡ˆŽ‚€’œ Œˆƒ€ˆ…)
  470. redraw_2_symbols:
  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. ;---------------------------------------------------------------------
  491. r2s_horizontal_check_ok:
  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
  525. return_from_redraw_2_symbols:
  526.         ret
  527. ;---------------------------------------------------------------------
  528. redraw_mistakes:
  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
  535.         ret
  536. ;---------------------------------------------------------------------
  537. count_lines:
  538.         xor     ecx, ecx                ; ‚ ecx - áçñâ稪 áâப
  539.         inc     ecx             ; “ ­ á 1 áâப 
  540. ;  ç¨­ ¥¬ à §¡®à...
  541.         mov     eax, [startline]
  542.         dec     eax
  543. cl_next_step:
  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. ;---------------------------------------------------------------------
  551. cl_not_new_line:
  552.         cmp     bh, 0xFE
  553.         je      cl_end
  554.         cmp     bh, 0xFF
  555.         je      cl_end
  556.         jmp     cl_next_step
  557. ;---------------------------------------------------------------------
  558. cl_end:
  559.         mov     [linecount],ecx
  560.         ret
  561. ;---------------------------------------------------------------------
  562. reset_speed_counters:
  563.         xor     eax,eax
  564.         mov     [symbtyped],eax
  565.         mov     [typestarttime],eax
  566.         mov     [currenttime],eax
  567.         mov     [typingspeed],eax
  568.         ret
  569. ;---------------------------------------------------------------------
  570. count_speed:
  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
  579. cs_all_ok:
  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
  586. cs_all_ok_2:
  587.         xor     edx, edx
  588.         mov     eax, 6000
  589.         div     ecx
  590.         mov     [typingspeed], eax ;‚®â ¨ ¢áñ. ‚ [typingspeed] - á।­ïï ᪮à®áâì ­ ¡®à 
  591.         ret
  592. ;---------------------------------------------------------------------
  593. speed_to_string:
  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:
  620.         ret
  621. ;---------------------------------------------------------------------
  622. get_screen_params:
  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
  638.         ret
  639. ;---------------------------------------------------------------------
  640. ;draw_speed:
  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. ;---------------------------------------------------------------------
  653. par:
  654. params:
  655.         rb 1024
  656. ;---------------------------------------------------------------------
  657. procinfo:
  658.         rb 1024
  659. ;---------------------------------------------------------------------
  660.         rb 1024
  661. stacktop:
  662. ;---------------------------------------------------------------------
  663. I_END: