Subversion Repositories Kolibri OS

Rev

Rev 950 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. use32
  2.     org 0x0
  3.     db  'MENUET01'
  4.     dd  0x01
  5.     dd  _preSTART
  6.     dd  I_END
  7.     dd  0x4000
  8.     dd  0x4000
  9.     dd  0x0,0x0
  10.  
  11. include 'macros.inc'
  12. include 'lang.inc'
  13. include 'draw_window.inc'
  14. include 'ball_operations.inc'
  15. include 'basic_alg.inc'
  16.  
  17. _preSTART:
  18.         mcall   66, 1, 1        ;¯à¨­¨¬ ¥¬ ᪠­-ª®¤ë
  19.         mcall   3                               ;randomize
  20.         ror     eax, 16
  21.         mov     [TC_U_SYSTEM_RANDSEED], eax     ;from PPro "system.inc"
  22.  
  23. new_game:
  24.         ;®¡­ã«¥­¨¥ ¬ âà¨æë
  25.         mov     eax, 0
  26.         mov     ecx, 81 / 4
  27.         mov     edi, lineBall
  28.         rep     stosd
  29.         stosb
  30.  
  31.         mov     [score], 0
  32.         mov     [countAllBall], 0
  33.         mov     [current], 0
  34.         @@:
  35.            mov  ebx, 7
  36.            call random
  37.            inc  dl
  38.            call add_new_ball
  39.            call test_new_ball
  40.            cmp  [countAllBall], 5
  41.            jb   @b
  42.         call generate_new___new_color
  43.  
  44. START:
  45.         draw_window
  46.    still:
  47.         mcall   10
  48.  
  49.         dec     eax
  50.         jz      START   ; ¯¥à¥à¨á®¢ âì ®ª­®
  51.         dec     eax
  52.         jnz     button  ;¥á«¨ ­¥ ª« ¢¨è  - §­ ç¨â ª­®¯ª 
  53.  
  54.    key:                 ; ­ ¦ â¨¥ ª« ¢¨è¨
  55.         mcall   2       ; ¯®«ãç ¥¬ ª®¤ ª« ¢¨è¨
  56.         cmp     ah, 60
  57.         je      new_game
  58.         jmp     still
  59.  
  60.    button:              ; ­ ¦ â¨¥ ª­®¯ª¨
  61.         mcall   17
  62.         shr     eax, 8
  63.         cmp     ax, 1   ; ¥á«¨ ª­®¯ª  ¢ë室 ?
  64.         je      .exit
  65.  
  66.         ;¯à®¢¥à¨¬, ­¥ ¯ãáâ  «¨ ª«¥âª 
  67.         mov     edx, [current]
  68.         test    byte [eax + lineBall - 2], 0x7
  69.         jz      .blank
  70.  
  71.         ;¯à®¢¥à¨¬ ­¥ ¡ë«  «¨ íâ  ª«¥âª  㦥 ¢ë¡à ­ 
  72.         cmp     eax, edx
  73.         je      .double_choice
  74.  
  75.         mov     [current], eax
  76.         call    choice_ball
  77.         call    paint_ball      ;á­ ç «  ¯à®à¨á㥬 ­®¢ë© ¢ë¡à ­­ë© è à¨ª
  78.  
  79.         test    edx, edx        ;cmp [current], 0
  80.         jz      still
  81.         mov     eax, edx
  82.  
  83.    @@:
  84.         call    redraw_cell     ;  㦥 ¯®â®¬ 㡥६ à ¬ªã ®â áâ à®£®
  85.         call    paint_ball
  86.         jmp     still
  87.  
  88.    .double_choice:
  89.         mov     [current], 0
  90.         jmp     @B
  91.  
  92.    .blank:      ;­ ¦ â ï ª­®¯ª  - ¯ãáâ 
  93.         test    edx, edx        ;cmp [current], 0
  94.         jz      still
  95.         mov     [dest], eax     ;ª­®¯ªã ­ §­ ç¥­¨ï -> ¢ [dest]
  96.         mov     eax, edx        ;¯ à ¬¥âà ¢ eax
  97.         call    test_path       ;¢ë§ë¢ ¥¬ ४ãàá¨î test_path
  98.         call    zero_cheked
  99.         jnc     still
  100.  
  101. ;^^^^^^^^^^^^^^^^^ move_ball    proc
  102.         mov     eax, [current]
  103.         mov     cl, byte [eax + lineBall - 2]
  104.         mov     byte [eax + lineBall - 2], 0
  105.         mov     eax, [dest]
  106.         mov     byte [eax + lineBall - 2], cl
  107.  
  108.         mov     eax, [current]
  109.         call    redraw_cell
  110.         mov     eax, [dest]
  111.         call    paint_ball
  112.         mov     [current], 0
  113. ;^^^^^^^^^^^^^^^^^ move_ball    endp
  114.  
  115.         call    find_line
  116.         call    vanish_balls
  117.         call    zero_cheked
  118.  
  119.         cmp     [countVanishBall], 0
  120.         je      new_3_balls
  121.         movzx   eax, [countVanishBall]
  122.         inc     eax
  123.         add     [score], eax
  124.         sub     [countAllBall], al
  125.         call    redraw_score
  126.         jmp     still
  127.  
  128.    .exit:
  129.         mcall   -1      ;¢ë室¨¬
  130.  
  131. new_3_balls:
  132.  
  133.         rept    3 num
  134.         {
  135.            mov  dl, [newColor#num]
  136.            call add_new_ball
  137.            call test_new_ball
  138.            cmp  [countAllBall],81
  139.            je   .record_li
  140.         }
  141.  
  142.         call    generate_new___new_color
  143.         call    paint_new_color
  144.         jmp     still
  145.  
  146.         .record_li:
  147.            mov  eax, [score]
  148.            cmp  eax, [record]
  149.            jbe  still
  150.            mov  [record], eax
  151.            jmp  START
  152.  
  153. zero_cheked:    ;®¡­ã«¥­¨¥ ¬ âà¨æë cheked
  154.         pushfd
  155.         mov     eax, lineBall
  156.         mov     ecx, 81
  157.         @@:
  158.            and  byte [eax], 0x7
  159.            inc  eax
  160.            loop @B
  161.         popfd
  162.         ret
  163.  
  164. random:                 ; edx := random [0..(ebx-1)]
  165.         mov     eax, 134775813
  166.         mul     [TC_U_SYSTEM_RANDSEED]
  167.         inc     eax
  168.         mov     [ TC_U_SYSTEM_RANDSEED], eax
  169.         xor     edx, edx
  170.         div     ebx
  171.         ret
  172.  
  173. generate_new___new_color:
  174.         rept    3 num
  175.         {
  176.            mov  ebx, 7
  177.            call random
  178.            inc  dl
  179.            mov  [newColor#num], dl
  180.         }
  181.         ret
  182.  
  183. add_new_ball:   ;¢ dl - 梥â è à¨ª 
  184.         mov     ebp, edx
  185.         mov     ebx, 81
  186.         sub     bl, [countAllBall]
  187.         call    random
  188.         mov     ecx, edx
  189.         mov     eax, lineBall-1
  190.         inc     ecx
  191.         @@:
  192.            inc  eax
  193.            test byte [eax], 0x7
  194.            jnz  @B
  195.            loop @B
  196.  
  197.         ;⥯¥àì ã ­ á ¢ eax -  ¤à¥á ­ è¥£® è à¨ª 
  198.         mov     edx, ebp
  199.         or      byte [eax], dl
  200.         inc     [countAllBall]
  201.         ;¯®«ã稬 ID ª­®¯ª¨
  202.         sub     eax, lineBall-2
  203.         mov     [dest], eax
  204.         ret
  205.  
  206. test_new_ball:
  207.         call    paint_ball
  208.  
  209.         call    find_line
  210.         call    vanish_balls
  211.         call    zero_cheked
  212.  
  213.         cmp     [countVanishBall], 0
  214.         je      @F
  215.         movzx   eax, [countVanishBall]
  216.         inc     eax
  217.         add     [score], eax
  218.         sub     [countAllBall], al
  219.         call    redraw_score
  220.         @@:
  221.         ret
  222.  
  223. if lang eq ru
  224.         szTitle  db '–¢¥â­ë¥ «¨­¨¨ v 0.3',0
  225.         szNewGame db 'F2 - ­®¢ ï ¨£à ',0
  226.         szRecord db '¥ª®à¤',0
  227.         szScore  db 'Žçª¨',0
  228. else
  229.         szTitle  db 'Color lines v 0.3',0
  230.         szNewGame db 'F2 - new game',0
  231.         szRecord db 'Record',0
  232.         szScore  db 'Score',0
  233. end if
  234.  
  235.  
  236. blank   = 0xB8C2D3
  237. brown   = 0x804000
  238. red     = 0xff0000
  239. yellow  = 0xffff00
  240. green   = 0x008000
  241. cyan    = 0x00ffff
  242. blue    = 0x0000ff
  243. purple  = 0x800080
  244.  
  245. tableColor      dd blank,brown,red,yellow,green,cyan,blue,purple
  246.  
  247. lineCoord:
  248.                 rept    9 coory:0
  249.                 {
  250.                    rept 9 coorx:0
  251.                    \{
  252.                         dw coorx*256+coory
  253.  
  254.                    \}
  255.                 }
  256.  
  257. record  dd 25
  258.  
  259. lineBall db 81 dup ?
  260. score   dd ?
  261. baseAddr dd ?
  262. current dd ?
  263. dest    dd ?
  264.  
  265. newColor1 db ?
  266. newColor2 db ?
  267. newColor3 db ?
  268.  
  269. countVanishBall db ?
  270. countAllBall    db ?
  271.  
  272. TC_U_SYSTEM_RANDSEED    dd      ?
  273. bitID   dd ?
  274.  
  275. I_END: