Subversion Repositories Kolibri OS

Rev

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

  1. ; Date : 1st April 2001
  2. ; TETRIS for MENUET
  3. ; Author : Paolo Minazzi (email paolo.minazzi@inwind.it)
  4. ;
  5. ; -Note-
  6. ; 1. This program requires a PENTIUM or higher because uses the RDTSC
  7. ;    instrucion for get a random number.
  8. ; 2. You must use NASM to compile. Compiling is OK with NASM 0.98, I
  9. ;    don't know what happen with other versions.
  10. ; 3. You must use the arrow key to move and rotate a block.
  11. ; 4. In the near future there will be a new version of TETRIS. This is
  12. ;    only the beginning.
  13. ;
  14. ; Thanks to Ville, the author of this wonderful OS !
  15. ; Join with us to code !
  16. ;
  17. ;
  18. ; Changelog:
  19. ; 09.11.2005 - fix for work under MeosDebug & better random - Andrey Halyavin
  20. ; 23.09.2005 - fixed bug, when 011111111111111-like sequence interpreted
  21. ;              as _11111111111111 in check_full_line - Sergey Kuzmin aka Wildwest
  22. ; 18.09.2005 - added 'Pause' button and made appropriate code and interface redesign
  23. ;              BTW, you can MOVE and ROTATE block during Pause ;)  - Sergey Kuzmin aka Wildwest
  24. ; 03.11.2003 - added new blocks & random - Ivan Poddubny
  25. ; 31.10.2001 - rdtsc replaced            - quickcode <quickcode@mail.ru>
  26. ; 28.06.2001 - fasm port & framed blocks - Ville Turjanmaa
  27. ;
  28. ;
  29.  
  30. LEN_X equ 19  ;width of table
  31. LEN_Y equ 29  ; height of table
  32. BORDER_LEFT equ 1
  33. BORDER_RIGHT equ 1
  34. BORDER_TOP equ 1
  35. BORDER_BOTTOM equ 1
  36. ADOBE_SIZE equ 12
  37.  
  38. X_LOCATION equ 30 ; distance to table from left side
  39. Y_LOCATION equ 50 ; distance to table from header
  40.  
  41. UP_KEY equ 130+48
  42. DOWN_KEY equ 129+48
  43. LEFT_KEY equ 128+48
  44. RIGHT_KEY equ 131+48
  45. ;BACKGROUND equ 03000080h
  46.  
  47. _MAXBLOCKS_ = 7*4
  48.  
  49. use32
  50.  
  51.                 org     0x0
  52.  
  53.                 db      'MENUET01'    ; 8 byte id
  54.                 dd      0x01          ; header version
  55.                 dd      START         ; program start
  56.                 dd      I_END         ; program image size
  57.                 dd      I_END+1024    ; reguired amount of memory
  58.                 dd      I_END+1024    ; esp
  59.                 dd      0x0,0x0       ; I_PARAM, I_ICON
  60.  
  61. include 'lang.inc'
  62. include '..\..\..\macros.inc'
  63.  
  64.  
  65. START:                          ; start of execution
  66.  
  67.  
  68.     ; --  quickcode - start
  69.  
  70.     mov   eax,3
  71.     mcall
  72.     mov   cl,16
  73.     ror   eax,cl ; to make seconds more significant
  74.     mov   [generator],eax
  75.     call  random
  76.  
  77.     ; --  quickcode - end
  78.  
  79.  
  80.     call clear_table_tetris
  81.     call new_block
  82.     call draw_window            ; at first, draw the window
  83.  
  84. still:
  85.     xor  edx,edx
  86.     call draw_block
  87.  
  88. attesa:
  89.  
  90.     mov  eax,11                 ; get event
  91.     mcall
  92.  
  93.     cmp  eax,1                  ; redraw request ?
  94.     jz   red
  95.     cmp  eax,2                  ; key in buffer ?
  96.     jnz  check_button
  97.     jmp  key
  98. check_button:
  99.     cmp  eax,3                  ; button in buffer ?
  100.     jnz  scendi
  101.     jmp  button
  102.  
  103.   red:                          ; redraw
  104.     call draw_window
  105.     jmp  still
  106.  
  107.  
  108.  
  109. scendi:
  110. ;///////////////////////////////////////////////// Wildwest
  111.                  cmp dword [pauses], 0
  112.                  je ok
  113.                  jne not_ok
  114. not_ok:  
  115.                 inc   dword [current_block_y]
  116.                 dec  dword [current_block_y]
  117.                 call  check_crash
  118.                 jne   block_crash
  119.                 jmp draw            
  120. ok:  
  121.  ;/////////////////////////////////////////////////  
  122.                 inc   dword [current_block_y]
  123.                 call  check_crash
  124.                 jne   block_crash
  125. draw:           movzx edx,byte [current_block_color]
  126.                 call  draw_block
  127.                 mov   eax,5
  128.                 movzx ebx,byte [delay]
  129.                 mcall
  130.                 jmp   still
  131.  
  132. block_crash:    dec dword [current_block_y]
  133.                 movzx edx,byte [current_block_color]
  134.                 call draw_block
  135.                 call fix_block
  136.                 call check_full_line
  137.                 call draw_table
  138.                 call new_block
  139.                 inc dword [score]
  140.                 call write_score
  141.                 call check_crash
  142.                 jz adr400
  143. aspetta:        mov eax,10
  144.                 mcall
  145.                 cmp eax,1
  146.                 jne adr10000
  147.                 call draw_window
  148. adr10000:       cmp eax,3
  149.                 jne aspetta
  150. new_game:       mov eax,17
  151.                 mcall
  152.                 cmp ah,1
  153.                 jnz adr401
  154.                 jmp end_program
  155. adr401:      
  156. ;///////////////////////////////////////////////////// Wildwest
  157.                 mov dword [pauses], 0  
  158. ;////////////////////////////////////////////////////
  159.                 mov dword [score],0
  160.                 call clear_table_tetris
  161.                 call new_block
  162.                 call draw_window
  163.  
  164. adr400:         movzx edx,byte [current_block_color]
  165.                 call draw_block
  166.                 mov eax,5
  167.                 movzx ebx,byte [delay]
  168.                 mcall
  169.                 jmp still
  170.  
  171. key:            mov  eax,2
  172.                 mcall
  173.  
  174. adr32:          cmp ah,LEFT_KEY
  175.                 jne adr_30
  176.                 dec dword [current_block_x]
  177.                 call check_crash
  178.                 jz adr4000
  179.                 inc dword [current_block_x]
  180. adr4000:        jmp scendi
  181.  
  182. adr_30:         cmp ah,RIGHT_KEY
  183.                 jne adr_31
  184.                 inc dword [current_block_x]
  185.                 call check_crash
  186.                 jz adr3000
  187.                 dec dword [current_block_x]
  188. adr3000:        jmp scendi
  189.  
  190. adr_31:         cmp ah,UP_KEY
  191.                 jne adr51
  192.                 mov edx,[current_block_pointer]
  193.                 mov edx,[edx+16]
  194.                 mov esi,[current_block_pointer]
  195.                 mov [current_block_pointer],edx
  196.                 call check_crash
  197.                 jz adr50
  198.                 mov [current_block_pointer],esi
  199. adr50:          jmp scendi
  200.  
  201. adr51:          cmp ah,DOWN_KEY
  202.                 jne adr61
  203.                 mov byte [delay],5  ;!!! 2
  204. adr52:          jmp scendi
  205.  
  206. adr61:          cmp ah,' '
  207.                 jne adr62
  208.                 mov byte [delay],5  ;!!! 2
  209. adr62:          jmp scendi
  210.  
  211.  
  212. button:                       ; button
  213.     mov  eax,17
  214.     mcall
  215.     cmp  ah,1                   ; button id=1 ?
  216.     jz  end_program
  217.     cmp ah,2
  218.     jz go_new_game
  219.     cmp  ah,3                   ; button id=3 ? ///Wildwest's  'Pause' button
  220.     jz  pause_program
  221.     jmp still
  222.  
  223. end_program:
  224.     or   eax,-1                ; close this program
  225.     mcall
  226.  
  227. go_new_game:
  228.     jmp new_game
  229. ;//////////////////////////////////////////////////// Wildwest
  230. pause_program:
  231. cmp dword [pauses], 0
  232. je incr
  233. mov dword [pauses], 0
  234.  jmp still
  235. incr:
  236. mov dword [pauses], 1
  237. jmp still
  238. ;////////////////////////////////////////////////////
  239. ;   *********************************************
  240. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  241. ;   *********************************************
  242. draw_window:
  243.  
  244.  
  245.     mov  eax,48
  246.     mov  ebx,3
  247.     mov  ecx,sc
  248.     mov  edx,sizeof.system_colors
  249.     mcall
  250.  
  251.     mov  eax,12                    ; function 12:tell os about windowdraw
  252.     mov  ebx,1                     ; 1, start of draw
  253.     mcall
  254.  
  255.                                  ; DRAW WINDOW
  256.   xor  eax,eax                   ; function 0 : define and draw window
  257.   mov  ebx,320*65536+(LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2
  258.   mov  ecx,25*65536+ (LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+30
  259.   mov  edx,[sc.work]             ; color of work area RRGGBB
  260.   or   edx,0x14000000
  261.   mov  edi,title                ; WINDOW LABEL
  262.   mcall
  263.  
  264.                                    
  265.     mov eax,8
  266.     mov ebx,30*65536+100
  267.     mov ecx,378*65536+18
  268.     mov edx,2
  269.     mov esi,[sc.work_button]
  270.     mcall
  271. ;/////////////////////////////////////////////// Wildwest's  'Pause' button
  272.     ;mov eax,8
  273.     mov ebx,132*65536+102
  274.     mov ecx,378*65536+18
  275.     mov edx,3
  276.     mov esi,[sc.work_button];
  277.     mcall
  278.  
  279.     mov  eax,4                      ; function 4 : write text to window
  280.     mov  ebx,164*65536+384          ; [x start] *65536 + [y start]
  281.     mov  ecx,[sc.work_button_text]  ; color of text RRGGBB
  282.     or   ecx,0x90000000
  283.     mov  edx,labe                   ; pointer to text
  284.     mcall
  285. ;///////////////////////////////////////////////
  286.     ;mov eax,4
  287.     mov ebx,49*65536+384
  288.     mov edx,game_finished
  289.     mcall
  290.     call draw_table
  291.  
  292.     movzx edx,byte [current_block_color]
  293.     call draw_block
  294.  
  295.     cld
  296.     mov  ebx,38*65536+35           ; draw info text with function 4
  297.     mov  ecx,[sc.work_text]              ; color
  298.     or   ecx,0x90000000    
  299.     mov  edx,text
  300.     mov  eax,4
  301.     mcall
  302.  
  303.     call write_score
  304.  
  305.     mov  eax,12                    ; function 12:tell os about windowdraw
  306.     mov  ebx,2                     ; 2, end of draw
  307.     mcall
  308.  
  309.     ret
  310.  
  311. ;-------------------------------------------------------------
  312. ; CHECK CRASH
  313. ; output        Z  flag => OK
  314. ;               NZ flag => NO
  315. ;-------------------------------------------------------------
  316.  
  317. check_crash:    mov ebx,[current_block_pointer]
  318.  
  319.                 mov edx,[current_block_y]
  320.                 imul edx,LEN_X
  321.                 add edx,[current_block_x]          ;find the offset in tetris_t
  322.  
  323.                 add edx,table_tetris
  324.  
  325.                 mov ecx,4
  326.                 xor ax,ax
  327.  
  328. adr_1:          cmp byte [ebx],1
  329.                 jne adr_2
  330.                 add al,[edx]
  331.                 adc ah,0
  332. adr_2:          inc ebx
  333.                 inc edx
  334.  
  335.                 cmp byte [ebx],1
  336.                 jne adr_3
  337.                 add al,[edx]
  338.                 adc ah,0
  339. adr_3:          inc ebx
  340.                 inc edx
  341.  
  342.                 cmp byte [ebx],1
  343.                 jne adr_4
  344.                 add al,[edx]
  345.                 adc ah,0
  346. adr_4:          inc ebx
  347.                 inc edx
  348.  
  349.                 cmp byte [ebx],1
  350.                 jne adr_5
  351.                 add al,[edx]
  352.                 adc ah,0
  353. adr_5:          inc ebx
  354.                 add edx,LEN_X-3
  355.  
  356.                 loop adr_1
  357.                 or ax,ax
  358.                 ret
  359. ;-------------------------------------------------------------
  360. ;NEW BLOCK
  361. ;-------------------------------------------------------------
  362. new_block:      mov dword [current_block_y],1
  363.                 mov dword [current_block_x],7
  364.  
  365.                 call random
  366.                 and al,7
  367.                 setz ah
  368.                 add al,ah
  369.                 mov [current_block_color],al
  370.  
  371.                 call random
  372.                 ;and eax,15
  373.             ; ---- Ivan ----
  374.                 and eax,0xff
  375.               @@:
  376.                 cmp eax,_MAXBLOCKS_
  377.                 jl  @f
  378.                 add eax,-(_MAXBLOCKS_)
  379.                 jmp @b
  380.               @@:
  381.             ; ---- Ivan ----
  382.                 mov edx,[block_table+eax*4]
  383.                 mov [current_block_pointer],edx
  384.  
  385.                 mov byte [delay],22 ;19 ;!!! 15
  386.                 ret
  387. ;-------------------------------------------------------------
  388. ; FIX BLOCK
  389. ;-------------------------------------------------------------
  390. fix_block:      mov ebx,[current_block_pointer]
  391.  
  392.                 mov edx,[current_block_y]
  393.                 imul edx,LEN_X
  394.                 add edx,[current_block_x]       ;find the offset in tetris_t
  395.  
  396.                 add edx,table_tetris
  397.  
  398.                 mov ecx,4
  399.                 mov al,[current_block_color]
  400.  
  401. adr_21:         cmp byte [ebx],1
  402.                 jne adr_22
  403.                 mov [edx],al
  404. adr_22:         inc ebx
  405.                 inc edx
  406.  
  407.                 cmp byte [ebx],1
  408.                 jne adr_23
  409.                 mov [edx],al
  410. adr_23:         inc ebx
  411.                 inc edx
  412.  
  413.                 cmp byte [ebx],1
  414.                 jne adr_24
  415.                 mov [edx],al
  416. adr_24:         inc ebx
  417.                 inc edx
  418.  
  419.                 cmp byte [ebx],1
  420.                 jne adr_25
  421.                 mov [edx],al
  422. adr_25:         inc ebx
  423.                 add edx,LEN_X-3
  424.  
  425.                 loop adr_21
  426.                 ret
  427.  
  428. ;--------------------------------------------------------------
  429. ; DRAW_TABLE
  430. ;--------------------------------------------------------------
  431. draw_table:     mov esi,table_tetris+LEN_X*BORDER_TOP+BORDER_LEFT
  432.  
  433.                 mov ebx,X_LOCATION*65536+ADOBE_SIZE
  434.                 mov ecx,Y_LOCATION*65536+ADOBE_SIZE
  435.                 mov edi,LEN_Y-BORDER_TOP-BORDER_BOTTOM
  436. y_draw:         push edi
  437.  
  438.                 mov edi,LEN_X-BORDER_LEFT-BORDER_RIGHT
  439. x_draw:         push edi
  440.               ;  pusha
  441.               ;  mov eax,5
  442.               ;  mov ebx,10
  443.               ;  mcall
  444.               ;  popa
  445.                 mov eax,13
  446.                 movzx edx,byte [esi]
  447.                 mov edx,[color_table+edx*4]
  448.                 mcall
  449.                 call draw_frames
  450.                 inc esi
  451.                 add ebx,65536*ADOBE_SIZE
  452.                 pop edi
  453.                 dec edi
  454.                 jnz x_draw
  455.  
  456.                 add esi,BORDER_LEFT+BORDER_RIGHT
  457.                 mov ebx,X_LOCATION*65536+ADOBE_SIZE
  458.                 add ecx,65536*ADOBE_SIZE
  459.                 pop edi
  460.                 dec edi
  461.                 jnz y_draw
  462.  
  463.                 ret
  464. ;--------------------------------------------------------------
  465. ;DRAW BLOCK
  466. ;
  467. ; ebx=x [0..LEN_X-1]
  468. ; ecx=y [0..LEN_Y-1]
  469. ; edi=pointer block
  470. ;--------------------------------------------------------------
  471. draw_block:
  472.              
  473.                 mov eax,13
  474.                 mov edx,[color_table+edx*4]
  475.  
  476.                 mov ebx,[current_block_x]
  477.                 mov ecx,[current_block_y]
  478.                 mov edi,[current_block_pointer]
  479.  
  480.                 sub ebx,BORDER_LEFT
  481.                 imul ebx,ADOBE_SIZE
  482.                 add ebx,X_LOCATION
  483.                 shl ebx,16
  484.                 mov bx,ADOBE_SIZE
  485.  
  486.                 sub ecx,BORDER_TOP
  487.                 imul ecx,ADOBE_SIZE
  488.                 add ecx,Y_LOCATION
  489.                 shl ecx,16
  490.                 mov cx,ADOBE_SIZE
  491.  
  492.                 mov dword [TMP_1],4
  493. adr_122:        mov dword [TMP_0],4
  494. adr_121:        cmp byte [edi],0
  495.                 je adr_120
  496.  
  497.                 mcall
  498.  
  499.                 call draw_frames
  500.  
  501. adr_120:        inc edi
  502.                 add ebx,ADOBE_SIZE*65536
  503.                 dec dword [TMP_0]
  504.                 jnz adr_121
  505.                 sub ebx,4*ADOBE_SIZE*65536
  506.                 add ecx,ADOBE_SIZE*65536
  507.                 dec dword [TMP_1]
  508.                 jnz adr_122
  509.  
  510.                 ret
  511.  
  512. draw_frames:
  513.                  cmp edx,0
  514.                  jne df1
  515.                  ret
  516.              df1:
  517.                  pusha
  518.                  mov bx,1
  519.                  add edx,0x282828
  520.                  mov eax,13
  521.                  mcall
  522.                  popa
  523.  
  524.                  pusha
  525.                  mov cx,1
  526.                  add edx,0x282828
  527.                  mov eax,13
  528.                  mcall
  529.                  popa
  530.  
  531.                  pusha
  532.                  push ebx
  533.                  sub  bx,1
  534.                  add  [esp+2],bx
  535.                  pop  ebx
  536.                  mov  bx,1
  537.                  shr  edx,1
  538.                  and  edx,0x7f7f7f
  539.                  mov  eax,13
  540.                  mcall
  541.                  popa
  542.  
  543.                  pusha
  544.                  push ecx
  545.                  sub  cx,1
  546.                  add  [esp+2],cx
  547.                  pop  ecx
  548.                  mov  cx,1
  549.                  shr  edx,1
  550.                  and  edx,0x7f7f7f
  551.                  mov  eax,13
  552.                  mcall
  553.                  popa
  554.  
  555.                  ret
  556.  
  557.  
  558. ;--------------------------------------------------------------
  559. clear_table_tetris:
  560.                 cld
  561.                 mov al,1
  562.                 mov edi,table_tetris
  563.                 mov ecx,LEN_X*BORDER_TOP
  564.                 rep stosb
  565.  
  566.                 mov edx,LEN_Y-BORDER_TOP-BORDER_BOTTOM
  567. adr300:         mov cl,BORDER_LEFT
  568.                 rep stosb
  569.                 dec ax  ;AL=0
  570.                 mov cl,LEN_X-BORDER_LEFT-BORDER_RIGHT
  571.                 rep stosb
  572.                 inc ax  ;AL=1
  573.                 mov cl,BORDER_RIGHT
  574.                 rep stosb
  575.                 dec dx
  576.                 jne adr300
  577.  
  578.                 mov ecx,LEN_X*BORDER_BOTTOM
  579.                 rep stosb
  580.                 ret
  581. ;--------------------------------------------------------------
  582. ;edx = pointer
  583. ;ebx = contatore
  584. check_full_line:
  585.                 std
  586.                 mov al,0
  587.                 mov edx,table_tetris+LEN_X*(LEN_Y-BORDER_BOTTOM)-1
  588.                 mov ebx,(LEN_Y-BORDER_TOP-BORDER_BOTTOM-1)*LEN_X
  589.  
  590. adr_5000:       mov edi,edx
  591.                 mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT+1;Wildwest's fix for bug
  592.                                  ;(was LEN_X-BORDER_LEFT-BORDER_RIGHT)
  593.                 repne scasb
  594.                 jz no_full_line
  595.  
  596.                 lea esi,[edx-LEN_X]
  597.                 mov edi,edx
  598.                 mov ecx,ebx
  599.                 rep movsb
  600.                 sub edi,BORDER_RIGHT
  601.                 mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT
  602.                 rep stosb
  603.                 add dword [score],50
  604.                 jmp adr_5000
  605.  
  606. no_full_line:   sub edx,LEN_X
  607.                 sub ebx,LEN_X
  608.                 jnz adr_5000
  609.  
  610.                 ret
  611. ;--------------------------------------------------------------
  612. random:         mov eax,[generator]
  613.                 add eax,-43ab45b5h
  614.                 ror eax,1
  615.                 xor eax,32c4324fh
  616.                 ror eax,1
  617.                 mov [generator],eax
  618.                 ; --- IVAN ---
  619.                 push ebx
  620.                 mov eax,26
  621.                 mov ebx,9
  622.                 mcall
  623.                 pop ebx
  624.                 xor eax,0xdeadbeef
  625.                 add eax,[generator]
  626.                 ; --- IVAN ---
  627.                 mov [generator],eax ; Halyavin
  628.                 ret
  629. ;--------------------------------------------------------------
  630. number_to_str:  mov edi,end_number_str-1
  631.                 mov ecx,9;size_of_number_str
  632.                 mov ebx,10
  633.                 cld
  634. new_digit:      xor edx,edx
  635.                 div ebx
  636.                 add dl,'0'
  637.                 mov [edi],dl
  638.                 dec edi
  639.                 loop new_digit
  640.                 ret
  641. ;--------------------------------------------------------------
  642. write_score:
  643.     mov  eax,[score]
  644.     call number_to_str
  645.  
  646.     mov  ebx,90*65536+35          ; draw info text with function 4
  647.     mov  ecx,[sc.work_text]        ; color
  648.     or   ecx,0x50000000    
  649.     mov  edx,number_str
  650.     mov  esi,[size_of_number_str]
  651.     mov  edi,[sc.work]
  652.     mov  eax,4
  653.     mcall
  654.     ret
  655.  
  656. ; DATA AREA
  657.  
  658. ;--------------------------------------------------------------
  659. ;DEFINITION BLOCKS
  660. ;--------------------------------------------------------------
  661. t_block_0:  db 0,0,0,0
  662.                 db 1,1,1,0
  663.                 db 0,1,0,0
  664.                 db 0,0,0,0
  665.                 dd t_block_3
  666.  
  667. t_block_1:  db 0,1,0,0
  668.                 db 1,1,0,0
  669.                 db 0,1,0,0
  670.                 db 0,0,0,0
  671.                 dd t_block_0
  672.  
  673. t_block_2:  db 0,1,0,0
  674.                 db 1,1,1,0
  675.                 db 0,0,0,0
  676.                 db 0,0,0,0
  677.                 dd t_block_1
  678.  
  679. t_block_3   db 0,1,0,0
  680.                 db 0,1,1,0
  681.                 db 0,1,0,0
  682.                 db 0,0,0,0
  683.                 dd t_block_2
  684. ;--------------------------------------------------------------
  685. i_block_0:  db 0,1,0,0
  686.                 db 0,1,0,0
  687.                 db 0,1,0,0
  688.                 db 0,1,0,0
  689.                 dd i_block_1
  690.  
  691. i_block_1:  db 0,0,0,0
  692.                 db 1,1,1,1
  693.                 db 0,0,0,0
  694.                 db 0,0,0,0
  695.                 dd i_block_0
  696. ;--------------------------------------------------------------
  697. q_block_0: db 0,1,1,0
  698.                 db 0,1,1,0
  699.                 db 0,0,0,0
  700.                 db 0,0,0,0
  701.                 dd q_block_0
  702. ;--------------------------------------------------------------
  703. s_block_0:
  704.       db 0,0,0,0
  705.       db 0,1,1,0
  706.       db 1,1,0,0
  707.       db 0,0,0,0
  708.       dd s_block_1
  709.  
  710. s_block_1: db 1,0,0,0
  711.                 db 1,1,0,0
  712.                 db 0,1,0,0
  713.                 db 0,0,0,0
  714.                 dd s_block_0
  715. ;--------------------------------------------------------------
  716. l_block_0:  db 0,0,0,0
  717.                 db 1,1,1,0
  718.                 db 1,0,0,0
  719.                 db 0,0,0,0
  720.                 dd l_block_3
  721.  
  722. l_block_1:  db 1,1,0,0
  723.                 db 0,1,0,0
  724.                 db 0,1,0,0
  725.                 db 0,0,0,0
  726.                 dd l_block_0
  727.  
  728. l_block_2:  db 0,0,1,0
  729.                 db 1,1,1,0
  730.                 db 0,0,0,0
  731.                 db 0,0,0,0
  732.                 dd l_block_1
  733.  
  734. l_block_3:  db 0,1,0,0
  735.                 db 0,1,0,0
  736.                 db 0,1,1,0
  737.                 db 0,0,0,0
  738.                 dd l_block_2
  739. ;-----------------------------------------------
  740.  
  741. g_block_0:
  742.  
  743. db 0,1,0,0
  744. db 0,1,0,0
  745. db 1,1,0,0
  746. db 0,0,0,0
  747. dd g_block_1
  748.  
  749. g_block_1:
  750. db 0,0,0,0
  751. db 1,1,1,0
  752. db 0,0,1,0
  753. db 0,0,0,0
  754. dd g_block_2
  755.  
  756. g_block_2:
  757. db 0,1,1,0
  758. db 0,1,0,0
  759. db 0,1,0,0
  760. db 0,0,0,0
  761. dd g_block_3
  762.  
  763. g_block_3:
  764. db 1,0,0,0
  765. db 1,1,1,0
  766. db 0,0,0,0
  767. db 0,0,0,0
  768. dd g_block_0
  769.  
  770. ;-----------------------------------
  771.  
  772. k_block_0:
  773.       db 0,0,0,0
  774.       db 1,1,0,0
  775.       db 0,1,1,0
  776.       db 0,0,0,0
  777.       dd k_block_1
  778.  
  779. k_block_1:
  780.       db 0,1,0,0
  781.       db 1,1,0,0
  782.       db 1,0,0,0
  783.       db 0,0,0,0
  784.       dd k_block_0
  785.  
  786. ;-----------------------------------
  787.  
  788. color_table: dd 00000000h    ;black      0
  789.                   dd 00cccccch    ;white      1
  790.                   dd 00cc0000h    ;red         2
  791.                   dd 0000cc00h    ;green     3
  792.                   dd 000000cch    ;blue        4
  793.                   dd 00cccc00h    ;yellow     5
  794.                   dd 0000cccch    ;cyan      6
  795.                   dd 00cc00cch    ;pink        7
  796.  
  797. block_table:
  798.     dd t_block_0 ; t
  799.     dd t_block_1
  800.     dd t_block_2
  801.     dd t_block_3
  802.     dd i_block_0 ; i
  803.     dd i_block_1
  804.     dd i_block_0
  805.     dd i_block_1
  806.     dd q_block_0 ; q
  807.     dd q_block_0
  808.     dd q_block_0
  809.     dd q_block_0
  810.     dd s_block_0 ; s
  811.     dd s_block_1
  812.     dd s_block_0
  813.     dd s_block_1
  814.     dd l_block_0 ; l
  815.     dd l_block_1
  816.     dd l_block_2
  817.     dd l_block_3
  818.     dd g_block_0 ; g
  819.     dd g_block_1
  820.     dd g_block_2
  821.     dd g_block_3
  822.     dd k_block_0 ; k
  823.     dd k_block_1
  824.     dd k_block_0
  825.     dd k_block_1
  826.  
  827. if lang eq ru
  828.  
  829.   title         db '’…’ˆ‘ 1.61 - ‘’…‹Šˆ ˆ Ž…‹',0
  830.   labe           db '€“‡€',0
  831.   text           db 'Žçª¨:',0
  832.   game_finished: db 'Ž‚€Ÿ',0
  833.  
  834. else
  835.  
  836.   title         db 'TETRIS 1.61 - ARROWS & SPACE',0
  837.   labe           db 'PAUSE',0
  838.   text           db 'Score:',0
  839.   game_finished: db 'NEW GAME',0
  840.  
  841. end if
  842.  
  843. pauses dd 0  ;/// Wildwest
  844. parallel dd 1
  845. score:                  dd 0
  846. TMP_0:                  dd 0
  847. TMP_1:                  dd 0
  848. generator:              dd 0
  849. current_block_x:        dd 0
  850. current_block_y:        dd 0
  851. current_block_pointer:  dd 0
  852. current_block_color:    db 0
  853. number_str:             db 0,0,0,0,0,0,0,0,0
  854. end_number_str:
  855. size_of_number_str      dd 9
  856. delay:                  db 40
  857. sc     system_colors
  858. table_tetris:
  859.  
  860. I_END:
  861.  
  862.