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: