Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | 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. ;
  20. ; 28.06.2001 - fasm port & framed blocks - Ville Turjanmaa
  21. ; 31.10.2001 - rdtsc replaced            - quickcode <quickcode@mail.ru>
  22. ; 03.11.2003 - added new blocks & random - Ivan Poddubny
  23. ;
  24.  
  25. LEN_X equ 14
  26. LEN_Y equ 24
  27. BORDER_LEFT equ 2
  28. BORDER_RIGHT equ 2
  29. BORDER_TOP equ 1
  30. BORDER_BOTTOM equ 1
  31. ADOBE_SIZE equ 12
  32. X_LOCATION equ 6
  33. Y_LOCATION equ 21
  34. _MAXBLOCKS_ = 7*4
  35. SCORE_TO_NEW_LEVEL equ 100000
  36.  
  37.  
  38. use32
  39.  
  40.                 org     0x0
  41.  
  42.                 db      'MENUET01'    ; 8 byte id
  43.                 dd      0x01          ; header version
  44.                 dd      START         ; program start
  45.                 dd      I_END         ; program image size
  46.                 dd      IM_END        ; reguired amount of memory
  47.                 dd      IM_END        ; esp
  48.                 dd      0x0,0x0       ; I_PARAM, I_ICON
  49. include 'lang.inc'
  50. START:                                ; start of execution
  51.  
  52.     mov   eax,3                       ;
  53.     int   0x40                        ;
  54.     mov   cl,16                       ;
  55.     ror   eax,cl                      ; to make seconds more significant
  56.     mov   [generator],eax             ;
  57.     call  random                      ;
  58.  
  59.     mov  byte[status],'0'
  60.     mov  byte[menu],'0'
  61.     call draw_window                  ; at first, draw the window
  62.  
  63. still:
  64.  
  65.     cmp  byte[status],'2'
  66.     je   attesa
  67.  
  68.     cmp  byte[status],'1'
  69.  
  70.     jne  attesa
  71.     xor  edx,edx
  72.  
  73.     call draw_block
  74.  
  75.  
  76. attesa:
  77.  
  78.     call mouse
  79.     ;disabled because of bug
  80.     ;EDIT: the bug is somewhere else..
  81.     ;NOTE: dont release this without fixing the bug you lazy bastard!
  82.  
  83.     mov  eax,11                       ; get event
  84.     int  0x40
  85.  
  86.     cmp  eax,1                        ; redraw request ?
  87.     jz   red
  88.     cmp  eax,2                        ; key in buffer ?
  89.     jnz  check_button
  90.     jmp  key
  91. check_button:
  92.     cmp  eax,3                        ; button in buffer ?
  93.     jnz  scendi
  94.     mov  eax,-1                       ; close this program
  95.     int  0x40
  96.  
  97.   red:                                ; redraw
  98.     call draw_window
  99.     jmp  still
  100.  
  101. parallel dd 1
  102.  
  103. scendi:         cmp  byte[status],'1'
  104.                 jne  still
  105.  
  106.                 cmp  byte[blabla],10
  107.                 je   blabla_0
  108.                 inc  byte[blabla]
  109.                 jmp  blabla_1
  110.               blabla_0:
  111.                 mov  byte[blabla],0
  112.                 inc  dword [current_block_y]
  113.                 call  check_crash
  114.                 jne   block_crash
  115.               blabla_1:
  116.  
  117.  
  118. draw:           movzx edx,byte [current_block_color]
  119.                 call  draw_block
  120.                 mov   eax,5
  121.                 mov   ebx,5
  122.                 sub   ebx,[speed]
  123.                 int   0x40
  124.                 jmp   still
  125.  
  126. block_crash:    dec dword [current_block_y]
  127.                 movzx edx,byte [current_block_color]
  128.                 call draw_block
  129.                 call fix_block
  130.                 call check_full_line
  131.                 call draw_table
  132.                 call new_block
  133.                 call write_score
  134.                 call check_crash
  135.                 jz adr400
  136. aspetta:        mov eax,10
  137.                 int 0x40
  138.                 cmp eax,1
  139.                 jne adr10000
  140.                 call draw_window
  141. adr10000:       cmp eax,3
  142.                 jne aspetta
  143.  
  144. new_game:       mov dword [score],0
  145.                 mov dword [lines],0
  146.                 mov dword [level],0
  147.                 mov dword [speed],0
  148.                 mov byte [status],'1'
  149.                 call clear_table_tetris
  150.                 call first_block
  151.                 call new_block
  152.                 call draw_window
  153.  
  154. adr400:         movzx edx,byte [current_block_color]
  155.                 call draw_block
  156.                 jmp still
  157.  
  158. include 'key.inc'
  159. include 'mouse.inc'
  160. include 'menu.inc'
  161. include 'window.inc'
  162. include 'block.inc'
  163. include 'table.inc'
  164. include 'random.inc'
  165. include 'score.inc'
  166.  
  167. ; DATA AREA
  168.  
  169. include 'blocks.inc'
  170.  
  171.   labelt:               db 'TETRIS II'
  172.   scoretext:            db 'Score:'
  173.   linestext:            db 'Lines:'
  174.   speedtext:            db 'Speed:'
  175.   leveltext:            db 'Level:'
  176.   startgame:            db 'START'
  177.   instr:                db 'INSTRUCTIONS'
  178.   hist:                 db 'HISTORY'
  179.   quit:                 db 'EXIT'
  180.   paused:               db 'PAUSED'
  181.   txt_end:
  182.  
  183. history:
  184.     db 'TETRIS for MENUET v2.0            '
  185.     db '                                  '
  186.     db '                                  '
  187.     db 'Originally made                   '
  188.     db '               by Paolo Minazzi   '
  189.     db '                                  '
  190.     db 'Port & framed blocks              '
  191.     db '               by Ville Turjanmaa '
  192.     db '                                  '
  193.     db 'RDTSC replaced                    '
  194.     db '               by quickcode       '
  195.     db '                                  '
  196.     db 'New blocks & better random        '
  197.     db '               by Ivan Poddubny   '
  198.     db '                                  '
  199.     db 'Better control, logo, menu, pause '
  200.     db '               by Jeffrey Amelynck'
  201.  
  202.     db 'x <- END MARKER, DONT DELETE      '
  203.  
  204. instructions:
  205.     db 'TETRIS for MENUET v2.0            '
  206.     db '                                  '
  207.     db 'Controls:                         '
  208.     db '                                  '
  209.     db 'Use left & right key to navigate  '
  210.     db 'Use up key to turn the block      '
  211.     db 'Use down key to make block fall   '
  212.     db 'Use P to pause game               '
  213.     db 'Use N to start a new game         '
  214.     db 'Use ESC to go back to menu or exit'
  215.     db 'You can also use the mouse to move'
  216.     db 'the blocks, left button to let the'
  217.     db 'blocks fall and right button to   '
  218.     db 'rotate them                       '
  219.     db 'you can pause the game by pressing'
  220.     db 'both mouse buttons                '
  221.     db '                                  '
  222.     db 'DONT FORGET: move mouse out of the'
  223.     db 'window if you want to use keyboard'
  224.  
  225.     db 'x <- END MARKER, DONT DELETE      '
  226.  
  227. I_END:
  228.  
  229. score:                  dd 0
  230. level:                  dd 0
  231. speed:                  dd 0
  232. lines:                  dd 0
  233. TMP_0:                  dd 0
  234. TMP_1:                  dd 0
  235. generator:              dd 0
  236. current_block_x:        dd 0
  237. current_block_y:        dd 0
  238. current_block_pointer:  dd 0
  239. current_block_color:    db 0
  240. next_block_pointer:     dd 0
  241. next_block_color:       db 0
  242. blabla                  dd 0
  243. lastmousebutton         dd 0
  244. number_str:             db 0,0,0,0,0,0,0,0,0
  245. end_number_str:
  246. size_of_number_str      dd 7
  247. delay:                  dd 5
  248. status:                 dd 0 ; 0=menu, 1=playing, 2=paused, 3=history , 4=instructions
  249. menu:                   dd 0 ; 0=start, 1=instructions, 2=history, 3=exit
  250.  
  251. table_tetris:           rb 2048+55
  252.  
  253. IM_END:
  254.