Subversion Repositories Kolibri OS

Rev

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

  1. ;   SQ_game for MenuetOS
  2. ;   Author:    Alexei Ershov aka ealex
  3. ;   E-mail:    e-al[at]yandex[dot]ru
  4. ;   Fidonet:   2:469/335.38
  5. ; slightly updated by leency and renamed to Lights
  6. ; https://en.wikipedia.org/wiki/Lights_Out_(game)
  7. ; slightly optimized by diamond
  8. ; english translation by diamond (two strings in end of source)
  9.  
  10.  
  11.         BtnSize     equ 36      ; à §¬¥à ª­®¯ª¨
  12.         BtnSpace    equ 0       ; ¯à®¬¥¦ã⮪ ¬¥¦¤ã ª­®¯ª ¬¨
  13.         NofBtn      equ 4   ; à §¬¥à ¯®«ï (3-15)
  14.         Color1      equ 0xcc0000
  15.         Color2      equ 0x00cc00
  16.  
  17.         FieldSize   = (BtnSize+BtnSpace)*NofBtn + BtnSpace*3
  18.         center      = FieldSize / 2
  19.         margin      = 20
  20.  
  21.  
  22.   use32              ; ¢ª«îç¨âì 32-¡¨â­ë© ०¨¬  áᥬ¡«¥à 
  23.   org    0x0         ;  ¤à¥á æ¨ï á ­ã«ï
  24.  
  25.   db     'MENUET01'  ; 8-¡ ©â­ë© ¨¤¥­â¨ä¨ª â®à MenuetOS
  26.   dd     0x01        ; ¢¥àá¨ï § £®«®¢ª  (¢á¥£¤  1)
  27.   dd     START       ;  ¤à¥á ¯¥à¢®© ª®¬ ­¤ë
  28.   dd     I_END       ; à §¬¥à ¯à®£à ¬¬ë
  29.   dd     0x1000      ; ª®«¨ç¥á⢮ ¯ ¬ïâ¨
  30.   dd     0x1000      ;  ¤à¥á ¢¥à設ë áâíª 
  31.   dd     0x0         ;  ¤à¥á ¡ãä¥à  ¤«ï ¯ à ¬¥â஢ (­¥ ¨á¯®«ì§ã¥âáï)
  32.   dd     0x0         ; § à¥§¥à¢¨à®¢ ­®
  33.  
  34. include '../../../macros.inc' ; ¬ ªà®áë ®¡«¥£ç îâ ¦¨§­ì  áᥬ¡«¥à騪®¢!
  35.  
  36.  
  37. START:
  38.     call Game_Init
  39. red:
  40.     call Draw_Window
  41.  
  42. still:
  43.     mcall 10            ; äã­ªæ¨ï 10 - ¦¤ âì ᮡëâ¨ï
  44.         dec     eax
  45.         jz      red
  46.         dec     eax
  47.         jnz     button
  48.  
  49.  key:                  ; ­ ¦ â  ª« ¢¨è  ­  ª« ¢¨ âãà¥
  50.         mov     al, 2
  51.         int     0x40
  52.         jmp     still
  53. ;---------------------------------------------------------------------
  54.  
  55. button:
  56.         mov     al, 17  ; 17 - ¯®«ãç¨âì ¨¤¥­â¨ä¨ª â®à ­ ¦ â®© ª­®¯ª¨
  57.         int     0x40
  58.     cmp   ah, 1         ; ¥á«¨ ­ ¦ â  ª­®¯ª  á ­®¬¥à®¬ 1, ¢ë室¨¬
  59.     je    .exit
  60.  
  61.     cmp   ah, 2         ; ¥á«¨ ­ ¦ â  ª­®¯ª  2, ­ ç¨­ ¥¬ ­®¢ãî ¨£àã
  62.     je    START
  63.  
  64.       ;  ¦  ª­®¯ª  ­  ¯®«¥
  65.         inc     dword [moves]     ; 㢥«¨ç¨¢ ¥¬ ç¨á«® 室®¢
  66.  
  67.         shr     eax, 8            ; ¢ eax ¨¤¥­â¨ä¨ª â®à ­ ¦ â®© ª­®¯ª¨
  68.  
  69.         mov     dh, NofBtn
  70.         div     dh            ; al = ax(­®¬¥à ª­®¯ª¨) / NofBtn
  71.                               ; ah = ®áâ â®ª  (á¬. à¨áã­®ª)
  72.         mov     ebx, eax      ; á®åà ­¨¬ ç áâ­®¥ ¨ ®áâ â®ª ¢ ebx
  73.  
  74.       ; al\ah 0   1    2    3
  75.       ;     +-+  +-+  +-+  +-+
  76.       ;  1  |4|  |5|  |6|  |7|
  77.       ;     +-+  +-+  +-+  +-+
  78.  
  79.       ;     +-+  +-+  +-+  +-+
  80.       ;  2  |8|  |9|  |10  |11
  81.       ;     +-+  +-+  +-+  +-+
  82.  
  83.       ;     +-+  +-+  +-+  +-+
  84.       ;  3  |12  |13  |14  |15
  85.       ;     +-+  +-+  +-+  +-+
  86.  
  87.       ;     +-+  +-+  +-+  +-+
  88.       ;  4  |16  |17  |18  |19
  89.       ;     +-+  +-+  +-+  +-+
  90.  
  91. ; Œ¥­ï¥¬ 梥â á⮫¡¨ª 
  92.         shr     eax, 8        ; eax = ah
  93.         mov     edi, field
  94.         add     edi, eax    ; edi 㪠§¢ë¥â ­  ¯¥à¢ãî ª­®¯ªã ¨ ¨áª®¬®¬ áâ«¡æ¥
  95.         mov     ecx, NofBtn
  96. @@:
  97.         not     byte[edi]    ; ¬¥­ï¥¬ 梥⠢® ¢á¥¬ á⮫¡¨ª¥
  98.         dec     ecx
  99.         add     edi, NofBtn
  100.         test    ecx, ecx
  101.         jnz     @r
  102.  
  103. ; Œ¥­ï¥¬ 梥â áâப¨
  104.         mov     eax, ebx      ; ¢®ááâ ­ ¢«¨¢ ¥¬ eax
  105.         dec     eax
  106.         mov     dl, NofBtn
  107.         mul     dl            ; ax = al * NofBtn
  108.         mov     edi, field
  109.         add     edi, eax     ; edi 㪠§¢ë¥â ­  ¯¥à¢ãî ª­®¯ªã ¢ ¨áª®¬®© áâப¥
  110.         mov     ecx, NofBtn
  111. @@:
  112.         not     byte [edi]    ; ¬¥­ï¥¬ 梥⠢® ¢á¥© áâப¥
  113.         dec     ecx
  114.         inc     edi
  115.         test    ecx, ecx
  116.         jnz     @r
  117. ; –¢¥â ­ ¦ â®© ª­®¯ª¨ ¬¥­ï«áï 2 à §  (ª®£¤  ®¡à ¡ â뢠«¨ áâப㠨 á⮫¡¥æ),
  118. ; â.¥. ®áâ «áï ¯¥à¢®­ ç «­ë¬
  119. ; Œ¥­ï¥¬ 梥⠭ ¦ â®© ª­®¯ª¨
  120.         shr     ebx, 8        ; ebx = ®áâ â®ª (ah ­  à¨áã­ª¥)
  121.         not     byte [field+eax+ebx]
  122.         jmp     red
  123.  
  124.  
  125.  
  126.   .exit:
  127.     mcall -1            ; ¨­ ç¥ ª®­¥æ ¯à®£à ¬¬ë
  128.  
  129.  
  130. ;----------------------------------------------------------------------------
  131. ;               Draw_Window
  132. ;----------------------------------------------------------------------------
  133. Draw_Window:
  134.  
  135.     mcall 12, 1
  136.     mcall 0, 200*65536+FieldSize+margin*2,\
  137.              200*65536+FieldSize+28+margin*3,\
  138.              0x14DDD7CF, 0x805080D0, header
  139.  
  140.     mcall 8, (BtnSpace*2+margin)*65536 + 83,\
  141.              (FieldSize+BtnSpace+margin*2+10)*65536+ 22, 2
  142.     mcall 4, (BtnSpace*2+3+margin)*65536+(FieldSize+BtnSpace+margin*2)+14,\
  143.              0x90DDEEFF, strNew
  144.     mcall 4, (center - 25+margin) * 65536 + 30, 0x80000000, strMovs
  145.     mcall 47, 4*65536+1, moves, (center + 2+margin ) * 65536 + 30, 0
  146.  
  147.  
  148.  
  149.         mov     ecx, (20+20+BtnSpace-BtnSize)*65536+BtnSize
  150.         mov     edx, NofBtn           ; ¨¤¥­â¨ä¨ª â®à ¯¥à¢®© ª­®¯ª¨ ­  ¯®«¥
  151.                                       ; ᬠà¨áã­®ª
  152.  
  153. buttons:                              ; à¨á㥬 ª­®¯®çª¨
  154.         mov     eax, edx
  155.         mov     dh, NofBtn
  156.         div     dh           ; al = ax / dh, ah - ®áâ â®ª
  157.         mov     dh, 0
  158.         test    ah, ah       ; ¥á«¨ ah = 0, ­ ç¨­ ¥¬ ­®¢ë© àï¤
  159.         jnz     @f
  160.         add     ecx, (BtnSize+BtnSpace)*65536
  161.         mov     ebx, (BtnSpace*2+margin)*65536+BtnSize+1
  162. @@:
  163.         mov     esi, Color1                    ; ¡ ©â ¯®  ¤à¥áã
  164.         cmp     byte [field-NofBtn+edx], 0      ; field-NofBtn+­®¬¥à_ª­®¯ª¨
  165.         jz      @f                              ; £®¢®à¨â ® ¥¥ 梥â¥
  166.         mov     esi, Color2
  167. @@:
  168.         mcall 8,
  169.         add     ebx, (BtnSize+BtnSpace)*65536
  170.         inc     edx                        ; ¯¥à¥å®¤¨¬ ª á«¥¤ãî饩 ª­®¯ª¥
  171.         cmp     edx, NofBtn*(NofBtn+1)
  172.         jb      buttons
  173.  
  174.     mcall 12, 2                    ; äã­ªæ¨ï 12: á®®¡é¨âì Ž‘ ®¡ ®âà¨á®¢ª¥ ®ª­ 
  175.  
  176. ret
  177.  
  178. ;----------------------------------------------------------------------------
  179. ;               Game_Init
  180. ;----------------------------------------------------------------------------
  181. Game_Init:
  182.         and     [moves], 0             ; ®¡­ã«¨¬ ª®«¨ç¥á⢮ 室®¢
  183.  
  184.         call    random                 ; ¢ eax á«ãç ©­®¥ ç¨á«®
  185.         mov     ecx, NofBtn * NofBtn   ; ¢ ecx ª®«-¢® ª­®¯®ª ­  ¯®«¥
  186.         mov     bh, 0                  ; ¤«ï ª ¦¤®© ª­®¯ª¨ ¡ã¤¥¬ ¡à âì
  187.                                        ; 1 ¡¨â ¨§ eax, bh - ᪮«ìª®
  188. button_init:                           ; ¡¨â 㦥 ¨á¯®«ì§®¢ «¨
  189.         shr     eax, 1           ; ¬« ¤è¨© ¡¨â ¯®¯ ¤ ¥â ¢ ä« £ CF
  190.                                  ; ¢ § ¢¨á¨¬®á⨠®â ¥£® §­ ç¥­¨ï
  191.                                  ; ¢ bl § ¯¨á뢠¥âáï -1 ¨«¨ 0
  192.         sbb     bl, bl
  193.         mov     [field + ecx - 1], bl
  194.  
  195.         inc     bh
  196.         cmp     bh, 32           ; ¥á«¨ ¨á¯®«ì§®¢ ­ë ¢á¥ 32 ¡¨â  ¨§ eax
  197.         jb      @f               ; ­ ® ¯®«ãç¨âì ­®¢®¥ á«ãç ©­®¥ ç¨á«®
  198.         call    random
  199.         mov     bh, 0
  200. @@:
  201.         loop    button_init
  202.  
  203. ret
  204.  
  205. ;----------------------------------------------------------------------------
  206. ;     random - ¢§ïâ  ¨§ â¥âà¨á 
  207. ;----------------------------------------------------------------------------
  208. random:         mov eax,[generator]
  209.                 add eax,-43ab45b5h
  210.                 ror eax,1
  211.                 xor eax,32c4324fh
  212.                 ror eax,1
  213.                 mov [generator],eax
  214.                 ; --- IVAN ---
  215.                 mov eax,26
  216.                 mov ebx,9
  217.                 int 0x40
  218.                 xor eax,0xdeadbeef
  219.                 add eax,[generator]
  220.                 ; --- IVAN ---
  221.                 ret
  222.  
  223. ;============================================================================
  224.  
  225. field           db NofBtn * NofBtn dup(0)
  226. moves           dd 0
  227. generator       dd 0
  228.  
  229. header          db 'Lights',0
  230.  
  231. if lang eq ru
  232. strMovs         db '•Ž„',0
  233. strNew          db '®¢ ï ¨£à ',0
  234. else
  235. strMovs         db 'MOVE',0
  236. strNew          db ' New game',0
  237. end if
  238.  
  239.  
  240.  
  241. I_END:                             ; ¬¥âª  ª®­æ  ¯à®£à ¬¬ë
  242.