Subversion Repositories Kolibri OS

Rev

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