Subversion Repositories Kolibri OS

Rev

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