Subversion Repositories Kolibri OS

Rev

Rev 109 | Rev 180 | 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.     mov  eax,0xffffffff         ; 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,12                    ; function 12:tell os about windowdraw
  245.     mov  ebx,1                     ; 1, start of draw
  246.     int  0x40
  247.  
  248.                                  ; DRAW WINDOW
  249.   mov  eax,0                     ; function 0 : define and draw window
  250.   mov  ebx,320*65536+(LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2
  251.   mov  ecx,25*65536+ (LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+30
  252.   mov  edx,BACKGROUND            ; color of work area RRGGBB
  253.   mov  esi,0x006688ee;99bbff            ; color of grab bar  RRGGBB,8->col
  254.   mov  edi,0x007799ff;99bbee            ; color of frames    RRGGBB
  255.   int  0x40
  256.  
  257.                                     ; WINDOW LABEL
  258.     mov  eax,4                      ; function 4 : write text to window
  259.     mov  ebx,8*65536+8              ; [x start] *65536 + [y start]
  260.     mov  ecx,0x10ffffff             ; color of text RRGGBB
  261.     mov  edx,labelt                 ; pointer to text beginning
  262.     mov  esi,labellen-labelt        ; text length
  263.     int  0x40
  264.  
  265.                                    ; CLOSE BUTTON
  266. ;    mov  eax,8                     ; function 8 : define and draw button
  267. ;    mov  ebx,243*65536+12          ; [x start] *65536 + [x size]
  268. ;    mov  ecx,5*65536+12            ; [y start] *65536 + [y size]
  269. ;    mov  edx,1                     ; button id
  270. ;    mov  esi,0x5580cc;22aacc              ; button color RRGGBB
  271. ;    int  0x40
  272.  
  273.     mov eax,8
  274.     mov ebx,30*65536+102
  275.     mov ecx,378*65536+18
  276.     mov edx,2
  277.     mov esi,0xA24466;5580cc;22aacc
  278.     int 0x40
  279. ;/////////////////////////////////////////////// Wildwest's  'Pause' button
  280.     mov eax,8
  281.     mov ebx,132*65536+102
  282.     mov ecx,378*65536+18
  283.     mov edx,3
  284.     mov esi,0x0FA0F0;
  285.     int 0x40
  286.  
  287.     mov  eax,4                      ; function 4 : write text to window
  288.     mov  ebx,164*65536+384             ; [x start] *65536 + [y start]
  289.     mov  ecx,0x10ffffff             ; color of text RRGGBB
  290.     mov  edx,labe                ; pointer to text beginning
  291.     mov  esi,labelen-labe       ; text length
  292.     int  0x40
  293. ;///////////////////////////////////////////////
  294.     mov eax,4
  295.     mov ebx,49*65536+384
  296.     xor ecx,ecx
  297.     mov ecx,0x10ffffff
  298.     mov edx,game_finished
  299.     mov esi,size_of_game_finished-game_finished
  300.     int 0x40
  301.  
  302.     call draw_table
  303.  
  304.     movzx edx,byte [current_block_color]
  305.     call draw_block
  306.  
  307.     cld
  308.     mov  ebx,38*65536+35           ; draw info text with function 4
  309.     mov  ecx,0x10ffffff              ; color
  310.     mov  edx,text
  311.     mov  esi,7
  312.     mov  eax,4
  313.     int  0x40
  314.  
  315.     call write_score
  316.  
  317.     mov  eax,12                    ; function 12:tell os about windowdraw
  318.     mov  ebx,2                     ; 2, end of draw
  319.     int  0x40
  320.  
  321.     ret
  322.  
  323. ;-------------------------------------------------------------
  324. ; CHECK CRASH
  325. ; output        Z  flag => OK
  326. ;               NZ flag => NO
  327. ;-------------------------------------------------------------
  328.  
  329. check_crash:    mov ebx,[current_block_pointer]
  330.  
  331.                 mov edx,[current_block_y]
  332.                 imul edx,LEN_X
  333.                 add edx,[current_block_x]          ;find the offset in tetris_t
  334.  
  335.                 add edx,table_tetris
  336.  
  337.                 mov ecx,4
  338.                 xor ax,ax
  339.  
  340. adr_1:          cmp byte [ebx],1
  341.                 jne adr_2
  342.                 add al,[edx]
  343.                 adc ah,0
  344. adr_2:          inc ebx
  345.                 inc edx
  346.  
  347.                 cmp byte [ebx],1
  348.                 jne adr_3
  349.                 add al,[edx]
  350.                 adc ah,0
  351. adr_3:          inc ebx
  352.                 inc edx
  353.  
  354.                 cmp byte [ebx],1
  355.                 jne adr_4
  356.                 add al,[edx]
  357.                 adc ah,0
  358. adr_4:          inc ebx
  359.                 inc edx
  360.  
  361.                 cmp byte [ebx],1
  362.                 jne adr_5
  363.                 add al,[edx]
  364.                 adc ah,0
  365. adr_5:          inc ebx
  366.                 add edx,LEN_X-3
  367.  
  368.                 loop adr_1
  369.                 or ax,ax
  370.                 ret
  371. ;-------------------------------------------------------------
  372. ;NEW BLOCK
  373. ;-------------------------------------------------------------
  374. new_block:      mov dword [current_block_y],1
  375.                 mov dword [current_block_x],7
  376.  
  377.                 call random
  378.                 and al,7
  379.                 setz ah
  380.                 add al,ah
  381.                 mov [current_block_color],al
  382.  
  383.                 call random
  384.                 ;and eax,15
  385.             ; ---- Ivan ----
  386.                 and eax,0xff
  387.               @@:
  388.                 cmp eax,_MAXBLOCKS_
  389.                 jl  @f
  390.                 add eax,-(_MAXBLOCKS_)
  391.                 jmp @b
  392.               @@:
  393.             ; ---- Ivan ----
  394.                 mov edx,[block_table+eax*4]
  395.                 mov [current_block_pointer],edx
  396.  
  397.                 mov byte [delay],22 ;19 ;!!! 15
  398.                 ret
  399. ;-------------------------------------------------------------
  400. ; FIX BLOCK
  401. ;-------------------------------------------------------------
  402. fix_block:      mov ebx,[current_block_pointer]
  403.  
  404.                 mov edx,[current_block_y]
  405.                 imul edx,LEN_X
  406.                 add edx,[current_block_x]       ;find the offset in tetris_t
  407.  
  408.                 add edx,table_tetris
  409.  
  410.                 mov ecx,4
  411.                 mov al,[current_block_color]
  412.  
  413. adr_21:         cmp byte [ebx],1
  414.                 jne adr_22
  415.                 mov [edx],al
  416. adr_22:         inc ebx
  417.                 inc edx
  418.  
  419.                 cmp byte [ebx],1
  420.                 jne adr_23
  421.                 mov [edx],al
  422. adr_23:         inc ebx
  423.                 inc edx
  424.  
  425.                 cmp byte [ebx],1
  426.                 jne adr_24
  427.                 mov [edx],al
  428. adr_24:         inc ebx
  429.                 inc edx
  430.  
  431.                 cmp byte [ebx],1
  432.                 jne adr_25
  433.                 mov [edx],al
  434. adr_25:         inc ebx
  435.                 add edx,LEN_X-3
  436.  
  437.                 loop adr_21
  438.                 ret
  439.  
  440. ;--------------------------------------------------------------
  441. ; DRAW_TABLE
  442. ;--------------------------------------------------------------
  443. draw_table:     mov esi,table_tetris+LEN_X*BORDER_TOP+BORDER_LEFT
  444.  
  445.                 mov ebx,X_LOCATION*65536+ADOBE_SIZE
  446.                 mov ecx,Y_LOCATION*65536+ADOBE_SIZE
  447.                 mov edi,LEN_Y-BORDER_TOP-BORDER_BOTTOM
  448. y_draw:         push edi
  449.  
  450.                 mov edi,LEN_X-BORDER_LEFT-BORDER_RIGHT
  451. x_draw:         push edi
  452.               ;  pusha
  453.               ;  mov eax,5
  454.               ;  mov ebx,10
  455.               ;  int 0x40
  456.               ;  popa
  457.                 mov ax,13
  458.                 movzx edx,byte [esi]
  459.                 mov edx,[color_table+edx*4]
  460.                 int 0x40
  461.                 call draw_frames
  462.                 inc esi
  463.                 add ebx,65536*ADOBE_SIZE
  464.                 pop edi
  465.                 dec edi
  466.                 jnz x_draw
  467.  
  468.                 add esi,BORDER_LEFT+BORDER_RIGHT
  469.                 mov ebx,X_LOCATION*65536+ADOBE_SIZE
  470.                 add ecx,65536*ADOBE_SIZE
  471.                 pop edi
  472.                 dec edi
  473.                 jnz y_draw
  474.  
  475.                 ret
  476. ;--------------------------------------------------------------
  477. ;DRAW BLOCK
  478. ;
  479. ; ebx=x [0..LEN_X-1]
  480. ; ecx=y [0..LEN_Y-1]
  481. ; edi=pointer block
  482. ;--------------------------------------------------------------
  483. draw_block:
  484.              
  485.                 mov eax,13
  486.                 mov edx,[color_table+edx*4]
  487.  
  488.                 mov ebx,[current_block_x]
  489.                 mov ecx,[current_block_y]
  490.                 mov edi,[current_block_pointer]
  491.  
  492.                 sub ebx,BORDER_LEFT
  493.                 imul ebx,ADOBE_SIZE
  494.                 add ebx,X_LOCATION
  495.                 shl ebx,16
  496.                 mov bx,ADOBE_SIZE
  497.  
  498.                 sub ecx,BORDER_TOP
  499.                 imul ecx,ADOBE_SIZE
  500.                 add ecx,Y_LOCATION
  501.                 shl ecx,16
  502.                 mov cx,ADOBE_SIZE
  503.  
  504.                 mov dword [TMP_1],4
  505. adr_122:        mov dword [TMP_0],4
  506. adr_121:        cmp byte [edi],0
  507.                 je adr_120
  508.  
  509.                 int 040h
  510.  
  511.                 call draw_frames
  512.  
  513. adr_120:        inc edi
  514.                 add ebx,ADOBE_SIZE*65536
  515.                 dec dword [TMP_0]
  516.                 jnz adr_121
  517.                 sub ebx,4*ADOBE_SIZE*65536
  518.                 add ecx,ADOBE_SIZE*65536
  519.                 dec dword [TMP_1]
  520.                 jnz adr_122
  521.  
  522.                 ret
  523.  
  524. draw_frames:
  525.                  cmp edx,0
  526.                  jne df1
  527.                  ret
  528.              df1:
  529.                  pusha
  530.                  mov bx,1
  531.                  add edx,0x282828
  532.                  mov eax,13
  533.                  int 0x40
  534.                  popa
  535.  
  536.                  pusha
  537.                  mov cx,1
  538.                  add edx,0x282828
  539.                  mov eax,13
  540.                  int 0x40
  541.                  popa
  542.  
  543.                  pusha
  544.                  push ebx
  545.                  sub  bx,1
  546.                  add  [esp+2],bx
  547.                  pop  ebx
  548.                  mov  bx,1
  549.                  shr  edx,1
  550.                  and  edx,0x7f7f7f
  551.                  mov  eax,13
  552.                  int  0x40
  553.                  popa
  554.  
  555.                  pusha
  556.                  push ecx
  557.                  sub  cx,1
  558.                  add  [esp+2],cx
  559.                  pop  ecx
  560.                  mov  cx,1
  561.                  shr  edx,1
  562.                  and  edx,0x7f7f7f
  563.                  mov  eax,13
  564.                  int  0x40
  565.                  popa
  566.  
  567.                  ret
  568.  
  569.  
  570. ;--------------------------------------------------------------
  571. clear_table_tetris:
  572.                 cld
  573.                 mov al,1
  574.                 mov edi,table_tetris
  575.                 mov ecx,LEN_X*BORDER_TOP
  576.                 rep stosb
  577.  
  578.                 mov edx,LEN_Y-BORDER_TOP-BORDER_BOTTOM
  579. adr300:         mov cl,BORDER_LEFT
  580.                 rep stosb
  581.                 dec ax  ;AL=0
  582.                 mov cl,LEN_X-BORDER_LEFT-BORDER_RIGHT
  583.                 rep stosb
  584.                 inc ax  ;AL=1
  585.                 mov cl,BORDER_RIGHT
  586.                 rep stosb
  587.                 dec dx
  588.                 jne adr300
  589.  
  590.                 mov ecx,LEN_X*BORDER_BOTTOM
  591.                 rep stosb
  592.                 ret
  593. ;--------------------------------------------------------------
  594. ;edx = pointer
  595. ;ebx = contatore
  596. check_full_line:
  597.                 std
  598.                 mov al,0
  599.                 mov edx,table_tetris+LEN_X*(LEN_Y-BORDER_BOTTOM)-1
  600.                 mov ebx,(LEN_Y-BORDER_TOP-BORDER_BOTTOM-1)*LEN_X
  601.  
  602. adr_5000:       mov edi,edx
  603.                 mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT+1;Wildwest's fix for bug
  604.                                  ;(was LEN_X-BORDER_LEFT-BORDER_RIGHT)
  605.                 repne scasb
  606.                 jz no_full_line
  607.  
  608.                 lea esi,[edx-LEN_X]
  609.                 mov edi,edx
  610.                 mov ecx,ebx
  611.                 rep movsb
  612.                 sub edi,BORDER_RIGHT
  613.                 mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT
  614.                 rep stosb
  615.                 add dword [score],50
  616.                 jmp adr_5000
  617.  
  618. no_full_line:   sub edx,LEN_X
  619.                 sub ebx,LEN_X
  620.                 jnz adr_5000
  621.  
  622.                 ret
  623. ;--------------------------------------------------------------
  624. random:         mov eax,[generator]
  625.                 add eax,-43ab45b5h
  626.                 ror eax,1
  627.                 xor eax,32c4324fh
  628.                 ror eax,1
  629.                 mov [generator],eax
  630.                 ; --- IVAN ---
  631.                 push ebx
  632.                 mov eax,26
  633.                 mov ebx,9
  634.                 int 0x40
  635.                 pop ebx
  636.                 xor eax,0xdeadbeef
  637.                 add eax,[generator]
  638.                 ; --- IVAN ---
  639.                 mov [generator],eax ; Halyavin
  640.                 ret
  641. ;--------------------------------------------------------------
  642. number_to_str:  mov edi,end_number_str-1
  643.                 mov ecx,9;size_of_number_str
  644.                 mov ebx,10
  645.                 cld
  646. new_digit:      xor edx,edx
  647.                 div ebx
  648.                 add dl,'0'
  649.                 mov [edi],dl
  650.                 dec edi
  651.                 loop new_digit
  652.                 ret
  653. ;--------------------------------------------------------------
  654. write_score:
  655.     mov  eax,[score]
  656.     call number_to_str
  657.  
  658.     mov  ebx,100*65536+100         ;clear box to write new score
  659.     mov  ecx,35*65536+15
  660.     mov  edx,BACKGROUND
  661.     mov  eax,13
  662.     int  40h
  663.  
  664.     mov  ebx,100*65536+35          ; draw info text with function 4
  665.     mov  ecx,0xffff00              ; color
  666.     mov  edx,number_str
  667.     mov  esi,[size_of_number_str]
  668.     mov  eax,4
  669.     int  0x40
  670.     ret
  671.  
  672. ; DATA AREA
  673.  
  674. ;--------------------------------------------------------------
  675. ;DEFINITION BLOCKS
  676. ;--------------------------------------------------------------
  677. t_block_0:  db 0,0,0,0
  678.                 db 1,1,1,0
  679.                 db 0,1,0,0
  680.                 db 0,0,0,0
  681.                 dd t_block_3
  682.  
  683. t_block_1:  db 0,1,0,0
  684.                 db 1,1,0,0
  685.                 db 0,1,0,0
  686.                 db 0,0,0,0
  687.                 dd t_block_0
  688.  
  689. t_block_2:  db 0,1,0,0
  690.                 db 1,1,1,0
  691.                 db 0,0,0,0
  692.                 db 0,0,0,0
  693.                 dd t_block_1
  694.  
  695. t_block_3   db 0,1,0,0
  696.                 db 0,1,1,0
  697.                 db 0,1,0,0
  698.                 db 0,0,0,0
  699.                 dd t_block_2
  700. ;--------------------------------------------------------------
  701. i_block_0:  db 0,1,0,0
  702.                 db 0,1,0,0
  703.                 db 0,1,0,0
  704.                 db 0,1,0,0
  705.                 dd i_block_1
  706.  
  707. i_block_1:  db 0,0,0,0
  708.                 db 1,1,1,1
  709.                 db 0,0,0,0
  710.                 db 0,0,0,0
  711.                 dd i_block_0
  712. ;--------------------------------------------------------------
  713. q_block_0: db 0,1,1,0
  714.                 db 0,1,1,0
  715.                 db 0,0,0,0
  716.                 db 0,0,0,0
  717.                 dd q_block_0
  718. ;--------------------------------------------------------------
  719. s_block_0:
  720.       db 0,0,0,0
  721.       db 0,1,1,0
  722.       db 1,1,0,0
  723.       db 0,0,0,0
  724.       dd s_block_1
  725.  
  726. s_block_1: db 1,0,0,0
  727.                 db 1,1,0,0
  728.                 db 0,1,0,0
  729.                 db 0,0,0,0
  730.                 dd s_block_0
  731. ;--------------------------------------------------------------
  732. l_block_0:  db 0,0,0,0
  733.                 db 1,1,1,0
  734.                 db 1,0,0,0
  735.                 db 0,0,0,0
  736.                 dd l_block_3
  737.  
  738. l_block_1:  db 1,1,0,0
  739.                 db 0,1,0,0
  740.                 db 0,1,0,0
  741.                 db 0,0,0,0
  742.                 dd l_block_0
  743.  
  744. l_block_2:  db 0,0,1,0
  745.                 db 1,1,1,0
  746.                 db 0,0,0,0
  747.                 db 0,0,0,0
  748.                 dd l_block_1
  749.  
  750. l_block_3:  db 0,1,0,0
  751.                 db 0,1,0,0
  752.                 db 0,1,1,0
  753.                 db 0,0,0,0
  754.                 dd l_block_2
  755. ;-----------------------------------------------
  756.  
  757. g_block_0:
  758.  
  759. db 0,1,0,0
  760. db 0,1,0,0
  761. db 1,1,0,0
  762. db 0,0,0,0
  763. dd g_block_1
  764.  
  765. g_block_1:
  766. db 0,0,0,0
  767. db 1,1,1,0
  768. db 0,0,1,0
  769. db 0,0,0,0
  770. dd g_block_2
  771.  
  772. g_block_2:
  773. db 0,1,1,0
  774. db 0,1,0,0
  775. db 0,1,0,0
  776. db 0,0,0,0
  777. dd g_block_3
  778.  
  779. g_block_3:
  780. db 1,0,0,0
  781. db 1,1,1,0
  782. db 0,0,0,0
  783. db 0,0,0,0
  784. dd g_block_0
  785.  
  786. ;-----------------------------------
  787.  
  788. k_block_0:
  789.       db 0,0,0,0
  790.       db 1,1,0,0
  791.       db 0,1,1,0
  792.       db 0,0,0,0
  793.       dd k_block_1
  794.  
  795. k_block_1:
  796.       db 0,1,0,0
  797.       db 1,1,0,0
  798.       db 1,0,0,0
  799.       db 0,0,0,0
  800.       dd k_block_0
  801.  
  802. ;-----------------------------------
  803.  
  804. color_table: dd 00000000h    ;black      0
  805.                   dd 00cccccch    ;white      1
  806.                   dd 00cc0000h    ;red         2
  807.                   dd 0000cc00h    ;green     3
  808.                   dd 000000cch    ;blue        4
  809.                   dd 00cccc00h    ;yellow     5
  810.                   dd 0000cccch    ;cyan      6
  811.                   dd 00cc00cch    ;pink        7
  812.  
  813. block_table:
  814.     dd t_block_0 ; t
  815.     dd t_block_1
  816.     dd t_block_2
  817.     dd t_block_3
  818.     dd i_block_0 ; i
  819.     dd i_block_1
  820.     dd i_block_0
  821.     dd i_block_1
  822.     dd q_block_0 ; q
  823.     dd q_block_0
  824.     dd q_block_0
  825.     dd q_block_0
  826.     dd s_block_0 ; s
  827.     dd s_block_1
  828.     dd s_block_0
  829.     dd s_block_1
  830.     dd l_block_0 ; l
  831.     dd l_block_1
  832.     dd l_block_2
  833.     dd l_block_3
  834.     dd g_block_0 ; g
  835.     dd g_block_1
  836.     dd g_block_2
  837.     dd g_block_3
  838.     dd k_block_0 ; k
  839.     dd k_block_1
  840.     dd k_block_0
  841.     dd k_block_1
  842.  
  843. if lang eq ru
  844.  
  845.   labelt:
  846.          db '’…’ˆ‘ 1.6 - ‘’…‹Šˆ ˆ Ž…‹'
  847.   labellen:
  848.   labe:
  849.          db '€“‡€'
  850.   labelen:
  851.   text:                 db 'Žçª¨:  '
  852.   game_finished:        db ' €—€’œ'
  853.   size_of_game_finished:
  854.  
  855. else
  856.  
  857.   labelt:
  858.          db 'TETRIS 1.6 - ARROWS & SPACE'
  859.   labellen:
  860.   labe:
  861.          db 'PAUSE'
  862.   labelen:
  863.   text:                 db 'Score: '
  864.   game_finished:        db 'NEW GAME'
  865.   size_of_game_finished:
  866.  
  867. end if
  868.  
  869. pauses dd 0  ;/// Wildwest
  870. parallel dd 1
  871. score:                  dd 0
  872. TMP_0:                  dd 0
  873. TMP_1:                  dd 0
  874. generator:              dd 0
  875. current_block_x:        dd 0
  876. current_block_y:        dd 0
  877. current_block_pointer:  dd 0
  878. current_block_color:    db 0
  879. number_str:             db 0,0,0,0,0,0,0,0,0
  880. end_number_str:
  881. size_of_number_str      dd 9
  882. delay:                  db 40
  883. table_tetris:
  884.  
  885. I_END:
  886.