Subversion Repositories Kolibri OS

Rev

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