Subversion Repositories Kolibri OS

Rev

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