Subversion Repositories Kolibri OS

Rev

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