Subversion Repositories Kolibri OS

Rev

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