Subversion Repositories Kolibri OS

Rev

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