Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 131 → Rev 130

/programs/games/c4/trunk/c4.asm
69,7 → 69,7
LABEL_STATUS_X equ 14
LABEL_STATUS_Y equ 279
LABEL_STATUS_WIDTH equ 220
LABEL_STATUS_HEIGHT equ 12
LABEL_STATUS_HEIGHT equ 8
 
 
 
/programs/games/tetris/trunk/block.inc
0,0 → 1,376
;--------------------------------------------------------------
;DRAW BLOCK
;
;--------------------------------------------------------------
draw_block: mov eax,13
mov edx,[color_table+edx*4]
 
mov ebx,[current_block_x]
mov ecx,[current_block_y]
mov edi,[current_block_pointer]
 
sub ebx,BORDER_LEFT
imul ebx,ADOBE_SIZE
add ebx,X_LOCATION
shl ebx,16
mov bx,ADOBE_SIZE
 
sub ecx,BORDER_TOP
imul ecx,ADOBE_SIZE
add ecx,Y_LOCATION
shl ecx,16
mov cx,ADOBE_SIZE
 
mov dword [TMP_1],4
adr_122: mov dword [TMP_0],4
adr_121: cmp byte [edi],0
je adr_120
 
int 040h
 
call draw_frames
 
adr_120: inc edi
add ebx,ADOBE_SIZE*65536
dec dword [TMP_0]
jnz adr_121
sub ebx,4*ADOBE_SIZE*65536
add ecx,ADOBE_SIZE*65536
dec dword [TMP_1]
jnz adr_122
 
ret
 
draw_frames:
cmp edx,0
jne df1
ret
df1:
pusha
mov bx,1
add edx,0x282828
mov eax,13
int 0x40
popa
 
pusha
mov cx,1
add edx,0x282828
mov eax,13
int 0x40
popa
 
pusha
push ebx
sub bx,1
add [esp+2],bx
pop ebx
mov bx,1
shr edx,1
and edx,0x7f7f7f
mov eax,13
int 0x40
popa
 
pusha
push ecx
sub cx,1
add [esp+2],cx
pop ecx
mov cx,1
shr edx,1
and edx,0x7f7f7f
mov eax,13
int 0x40
popa
 
ret
 
;-------------------------------------------------------------
; FIX BLOCK
;-------------------------------------------------------------
fix_block: mov ebx,[current_block_pointer]
 
mov edx,[current_block_y]
imul edx,LEN_X
add edx,[current_block_x] ;find the offset in tetris_t
 
add edx,table_tetris
 
mov ecx,4
mov al,[current_block_color]
 
adr_21: cmp byte [ebx],1
jne adr_22
mov [edx],al
adr_22: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_23
mov [edx],al
adr_23: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_24
mov [edx],al
adr_24: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_25
mov [edx],al
adr_25: inc ebx
add edx,LEN_X-3
 
loop adr_21
ret
 
;-------------------------------------------------------------
;NEW BLOCK
;-------------------------------------------------------------
new_block: mov dword [current_block_y],1
mov dword [current_block_x],7
 
mov eax,dword [next_block_pointer]
mov dword [current_block_pointer],eax
 
mov eax,dword [next_block_color]
mov dword [current_block_color],eax
 
call random
and al,7
setz ah
add al,ah
mov [next_block_color],al
 
call random
;and eax,15
; ---- Ivan ----
and eax,0xff
@@:
cmp eax,_MAXBLOCKS_
jl @f
add eax,-(_MAXBLOCKS_)
jmp @b
@@:
; ---- Ivan ----
mov edx,[block_table+eax*4]
mov [next_block_pointer],edx
 
mov dword[delay],5
sub dword[delay],speed
 
ret
 
 
;-------------------------------------------------------------
;DRAW TITLE BLOCK
;-------------------------------------------------------------
draw_title_block:
; movzx edx,byte [current_block_color]
mov eax,13
 
; mov edx,[color_table+edx*4]
 
; mov ebx,[current_block_x]
; mov ecx,[current_block_y]
; mov edi,[current_block_pointer]
 
sub ebx,BORDER_LEFT
imul ebx,ADOBE_SIZE
add ebx,X_LOCATION
shl ebx,16
mov bx,ADOBE_SIZE
 
sub ecx,BORDER_TOP
imul ecx,ADOBE_SIZE
add ecx,Y_LOCATION
shl ecx,16
mov cx,ADOBE_SIZE
 
mov dword [TMP_1],5
call adr_122
 
ret
 
;-------------------------------------------------------------
;FIRST BLOCK
;-------------------------------------------------------------
first_block: call random
and al,7
setz ah
add al,ah
mov [next_block_color],al
 
call random
;and eax,15
; ---- Ivan ----
and eax,0xff
@@:
cmp eax,_MAXBLOCKS_
jl @f
add eax,-(_MAXBLOCKS_)
jmp @b
@@:
; ---- Ivan ----
mov edx,[block_table+eax*4]
mov [next_block_pointer],edx
 
; call draw_next_block
 
; mov byte [delay],5 ;19 ;!!! 15
ret
ret
 
;-------------------------------------------------------------
;DRAW NEXT BLOCK
;-------------------------------------------------------------
 
draw_next_block:
movzx edx,byte [next_block_color]
mov eax,13
mov edx,[color_table+edx*4]
 
mov ebx,LEN_X+1
mov ecx,5
mov edi,[next_block_pointer]
 
sub ebx,BORDER_LEFT
imul ebx,ADOBE_SIZE
add ebx,X_LOCATION
shl ebx,16
mov bx,ADOBE_SIZE
 
sub ecx,BORDER_TOP
imul ecx,ADOBE_SIZE
add ecx,Y_LOCATION
shl ecx,16
mov cx,ADOBE_SIZE
 
mov dword [TMP_1],4
jmp adr_122
 
ret
 
;-------------------------------------------------------------
; ROTATE BLOCK
;-------------------------------------------------------------
 
rotate_block:
mov edx,[current_block_pointer]
mov edx,[edx+16]
mov esi,[current_block_pointer]
mov [current_block_pointer],edx
call check_crash
call attesa
mov [current_block_pointer],esi
 
ret
 
 
;-------------------------------------------------------------
; CHECK CRASH
; output Z flag => OK
; NZ flag => NO
;-------------------------------------------------------------
 
check_crash: mov ebx,[current_block_pointer]
 
mov edx,[current_block_y]
imul edx,LEN_X
add edx,[current_block_x] ;find the offset in tetris_t
 
add edx,table_tetris
 
mov ecx,4
xor ax,ax
 
adr_1: cmp byte [ebx],1
jne adr_2
add al,[edx]
adc ah,0
adr_2: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_3
add al,[edx]
adc ah,0
adr_3: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_4
add al,[edx]
adc ah,0
adr_4: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_5
add al,[edx]
adc ah,0
adr_5: inc ebx
add edx,LEN_X-3
 
loop adr_1
or ax,ax
ret
 
;--------------------------------------------------------------
;CHECK LINE
;--------------------------------------------------------------
;edx = pointer
;ebx = contatore
check_full_line:
std
mov al,0
mov edx,table_tetris+LEN_X*(LEN_Y-BORDER_BOTTOM)-1
mov ebx,(LEN_Y-BORDER_TOP-BORDER_BOTTOM-1)*LEN_X
 
adr_5000: mov edi,edx
mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT
repne scasb
jz no_full_line
 
lea esi,[edx-LEN_X]
mov edi,edx
mov ecx,ebx
rep movsb
sub edi,BORDER_RIGHT
mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT
rep stosb
 
add dword [score],100
add dword [lines],1
 
; mov esi,dword[score]
;
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; mov esi,dword [speed]
; imul esi,linestonewlevel
; add esi,linestonewlevel
; cmp dword [lines],esi
; jne adr_5000 1 line : 100
; cmp dword[speed],4 2 lines: 300
; je adr_51 3 lines: 700
; inc dword[speed] 4 lines:1500
; jmp adr_5000
; adr_51:
; mov dword[speed],0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
jmp adr_5000
 
no_full_line: sub edx,LEN_X
sub ebx,LEN_X
jnz adr_5000
 
ret
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/games/tetris/trunk/blocks.inc
0,0 → 1,235
;+---------------------------------+
;| DEFINITION BLOCKS |
;+---------------------------------+
 
t_block_0:
db 0,0,0,0
db 1,1,1,0
db 0,1,0,0
db 0,0,0,0
dd t_block_3
 
t_block_1:
db 0,1,0,0
db 1,1,0,0
db 0,1,0,0
db 0,0,0,0
dd t_block_0
 
t_block_2:
db 0,1,0,0
db 1,1,1,0
db 0,0,0,0
db 0,0,0,0
dd t_block_1
 
t_block_3:
db 0,1,0,0
db 0,1,1,0
db 0,1,0,0
db 0,0,0,0
dd t_block_2
 
;-----------------------------------
 
i_block_0:
db 0,1,0,0
db 0,1,0,0
db 0,1,0,0
db 0,1,0,0
dd i_block_1
 
i_block_1:
db 0,0,0,0
db 1,1,1,1
db 0,0,0,0
db 0,0,0,0
dd i_block_0
;-----------------------------------
 
q_block_0:
db 0,1,1,0
db 0,1,1,0
db 0,0,0,0
db 0,0,0,0
dd q_block_0
 
;-----------------------------------
 
s_block_0:
db 0,0,0,0
db 0,1,1,0
db 1,1,0,0
db 0,0,0,0
dd s_block_1
 
s_block_1:
db 1,0,0,0
db 1,1,0,0
db 0,1,0,0
db 0,0,0,0
dd s_block_0
 
;-----------------------------------
 
l_block_0:
db 0,0,0,0
db 1,1,1,0
db 1,0,0,0
db 0,0,0,0
dd l_block_3
 
l_block_1:
db 1,1,0,0
db 0,1,0,0
db 0,1,0,0
db 0,0,0,0
dd l_block_0
 
l_block_2:
db 0,0,1,0
db 1,1,1,0
db 0,0,0,0
db 0,0,0,0
dd l_block_1
 
l_block_3:
db 0,1,0,0
db 0,1,0,0
db 0,1,1,0
db 0,0,0,0
dd l_block_2
 
;-----------------------------------
 
g_block_0:
 
db 0,1,0,0
db 0,1,0,0
db 1,1,0,0
db 0,0,0,0
dd g_block_1
 
g_block_1:
db 0,0,0,0
db 1,1,1,0
db 0,0,1,0
db 0,0,0,0
dd g_block_2
 
g_block_2:
db 0,1,1,0
db 0,1,0,0
db 0,1,0,0
db 0,0,0,0
dd g_block_3
 
g_block_3:
db 1,0,0,0
db 1,1,1,0
db 0,0,0,0
db 0,0,0,0
dd g_block_0
 
;-----------------------------------
 
k_block_0:
db 0,0,0,0
db 1,1,0,0
db 0,1,1,0
db 0,0,0,0
dd k_block_1
 
k_block_1:
db 0,1,0,0
db 1,1,0,0
db 1,0,0,0
db 0,0,0,0
dd k_block_0
 
;-----------------------------------
;logo blocks
;-----------------------------------
 
tetris_t:
db 1,1,1,0
db 0,1,0,0
db 0,1,0,0
db 0,1,0,0
db 0,1,0,0
 
tetris_e:
db 1,1,1,0
db 1,0,0,0
db 1,1,0,0
db 1,0,0,0
db 1,1,1,0
 
tetris_r:
db 1,1,0,0
db 1,0,1,0
db 1,1,0,0
db 1,0,1,0
db 1,0,1,0
 
tetris_i:
db 0,1,0,0
db 0,0,0,0
db 0,1,0,0
db 0,1,0,0
db 0,1,0,0
 
tetris_s:
db 0,1,1,1
db 1,0,0,0
db 0,1,1,0
db 0,0,0,1
db 1,1,1,0
 
tetris_II:
db 1,1,1,1
db 0,1,1,0
db 0,1,1,0
db 0,1,1,0
db 1,1,1,1
 
;-----------------------------------
block_table:
dd t_block_0 ; t
dd t_block_1
dd t_block_2
dd t_block_3
dd i_block_0 ; i
dd i_block_1
dd i_block_0
dd i_block_1
dd q_block_0 ; q
dd q_block_0
dd q_block_0
dd q_block_0
dd s_block_0 ; s
dd s_block_1
dd s_block_0
dd s_block_1
dd l_block_0 ; l
dd l_block_1
dd l_block_2
dd l_block_3
dd g_block_0 ; g
dd g_block_1
dd g_block_2
dd g_block_3
dd k_block_0 ; k
dd k_block_1
dd k_block_0
dd k_block_1
 
color_table:
dd 00000000h ;black 0
dd 00cccccch ;white 1
dd 00cc0000h ;red 2
dd 0000cc00h ;green 3
dd 000000cch ;blue 4
dd 00cccc00h ;yellow 5
dd 0000cccch ;cyan 6
dd 00cc00cch ;pink 7
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/games/tetris/trunk/key.inc
0,0 → 1,161
UP_KEY equ 178 ; the ascii keycodes of some keys
DOWN_KEY equ 177
LEFT_KEY equ 176
RIGHT_KEY equ 179
ENTER_KEY equ 13
ESCAPE_KEY equ 27
 
key:
mov eax,2 ; Read key ascii and store it into ah
int 0x40
 
cmp ah,LEFT_KEY ; Check if left key is pressed
jne no_left
 
cmp byte[status],'1'
jne no_left
go_left:
dec dword [current_block_x]
call check_crash
jz no_left
inc dword [current_block_x]
 
no_left:
cmp ah,RIGHT_KEY ; Check if right key is pressed
jne no_right
 
cmp byte[status],'1'
jne no_right
go_right:
inc dword [current_block_x]
call check_crash
jz no_right
dec dword [current_block_x]
 
no_right:
cmp ah,UP_KEY ; Compare pressed key with up key
jne no_up ; Jump to nu_up if up key isnt pressed
 
cmp byte[status],'0' ; Check if menu is running
jne no_menu2 ; Jump to no_up ifgame isnt running
 
cmp byte[menu],'0' ; Compare menu state with 0
jne no_menu0 ; Jump to no_menu0 if menu state isnt zero
 
mov byte[menu],'3' ; Change menu state to 2
call draw_window ; Redraw the window
jmp no_menu2 ; Jump to no_menu2
 
no_menu0:
dec byte[menu] ; menu state = menu state - 1
call draw_window ; Redraw the window
 
no_menu2:
cmp byte[status],'1' ; Compare game state with 1
jne no_up ; Jump to no_up if game state isnt 1 (if game isnt running)
 
call rotate_block
 
no_up:
cmp ah,DOWN_KEY ; Check if down key is pressed
jne no_down
 
cmp byte[status],'0'
jne no_menu3
 
cmp byte[menu],'3'
jne no_menu1
 
mov byte[menu],'0'
call draw_window
jmp no_menu3
 
no_menu1:
inc byte[menu]
call draw_window
 
no_menu3:
cmp byte[status],'1'
jne no_down
 
inc dword [current_block_y]
call check_crash
jne block_crash
jmp still
 
 
no_down:
cmp ah,'n' ; Check if n key is pressed
jne no_n
jmp new_game
 
no_n:
cmp ah,'p' ; Check if p key is pressed
jne no_p
cmp byte[status],'2'
je unpause
cmp byte[status],'1' ; add this two line or p will work
jne no_p ; when your still in the menu
mov byte[status],'2'
call draw_window
jmp attesa
unpause:
mov byte[status],'1'
call draw_window
jmp still
 
no_p:
cmp byte[status],'0'
jne no_menu
 
no_menu:
cmp byte[status],'1'
jne no_game
 
no_game:
cmp byte[status],'2'
jne no_pause1
 
no_pause1:
cmp ah,ENTER_KEY ; Check if enter key is pressed
jne no_enter
cmp byte[status],'0'
jne no_enter
call exemenu
 
no_enter:
cmp ah,ESCAPE_KEY ; Check if escape key is pressed
jne no_escape
 
 
cmp byte[status],'0'
jne no_instr1
mov eax,-1
int 0x40
 
no_instr1:
cmp byte[status],'1'
jne no_menu4
mov byte[status],'0'
call draw_window
 
no_menu4:
cmp byte[status],'3'
jne no_menu5
mov byte[status],'0'
call draw_window
 
no_menu5:
cmp byte[status],'4'
jne no_escape
mov byte[status],'0'
call draw_window
 
no_escape:
 
cmp byte[status],'1'
jne still
jmp scendi
 
ret
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/games/tetris/trunk/menu.inc
0,0 → 1,137
draw_menu:
 
cmp byte[menu],'0'
jne menu1
 
mov eax,4
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-39)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*4)
mov ecx,0x10ffff00
mov edx,startgame
mov esi,instr-startgame
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-84)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*5)
mov ecx,0x10ff0000
mov edx,instr
mov esi,hist-instr
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-50)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*6)
mov ecx,0x10ff0000
mov edx,hist
mov esi,quit-hist
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-26)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*7)
mov ecx,0x10ff0000
mov edx,quit
mov esi,paused-quit
int 0x40
 
menu1:
cmp byte[menu],'1'
jne menu2
 
 
mov eax,4
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-39)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*4)
mov ecx,0x10ff0000
mov edx,startgame
mov esi,instr-startgame
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-84)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*5)
mov ecx,0x10ffff00
mov edx,instr
mov esi,hist-instr
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-50)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*6)
mov ecx,0x10ff0000
mov edx,hist
mov esi,quit-hist
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-26)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*7)
mov ecx,0x10ff0000
mov edx,quit
mov esi,paused-quit
int 0x40
 
menu2:
cmp byte[menu],'2'
jne menu3
 
mov eax,4
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-39)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*4)
mov ecx,0x10ff0000
mov edx,startgame
mov esi,instr-startgame
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-84)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*5)
mov ecx,0x10ff0000
mov edx,instr
mov esi,hist-instr
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-50)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*6)
mov ecx,0x10ffff00
mov edx,hist
mov esi,quit-hist
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-26)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*7)
mov ecx,0x10ff0000
mov edx,quit
mov esi,paused-quit
int 0x40
 
menu3:
cmp byte[menu],'3'
jne menu4
 
mov eax,4
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-39)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*4)
mov ecx,0x10ff0000
mov edx,startgame
mov esi,instr-startgame
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-84)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*5)
mov ecx,0x10ff0000
mov edx,instr
mov esi,hist-instr
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-50)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*6)
mov ecx,0x10ff0000
mov edx,hist
mov esi,quit-hist
int 0x40
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98-26)/2*65536+(((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-2)/8*7)
mov ecx,0x10ffff00
mov edx,quit
mov esi,paused-quit
int 0x40
 
menu4:
 
 
ret
 
exemenu:
cmp byte[menu],'0' ;start
jne exemenu1
call new_game
 
exemenu1:
cmp byte[menu],'1' ;instr
jne exemenu2
mov byte[status],'4'
call draw_window
 
exemenu2:
cmp byte[menu],'2' ;history
jne exemenu3
mov byte[status],'3'
call draw_window
 
exemenu3:
cmp byte[menu],'3' ;exit
jne exemenu4
mov eax,-1
int 0x40
 
exemenu4:
 
ret
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/games/tetris/trunk/mouse.inc
0,0 → 1,87
mouse:
 
 
mov eax,37 ; get mouse position ; EXPERIMENTAL !!!
mov ebx,1 ; window relative ;
int 0x40 ; ;
shr eax,16 ; we only need to know the x position ;
sub eax,X_LOCATION ;
;
cmp eax,ADOBE_SIZE*(LEN_X-2) ; check to see if mouse is in field ;
jg no_mouse ; ;
cmp eax,0 ; ;
jl no_mouse ; ;
;
mov ebx,0 ;
;
mouseloop: ;
cmp eax,ADOBE_SIZE ;
jl yes_mouse ;
sub eax,ADOBE_SIZE ;
inc ebx ;
jmp mouseloop ;
;
yes_mouse: ;
cmp ebx,[current_block_x]
jg go_right
jl go_left
; mov dword[current_block_x],ebx ;
 
mov eax,37 ; get mouse position ;
mov ebx,2 ; buttons pressed (1=left, 2=right, 3=both) ;
int 0x40 ;
;
cmp eax,0 ;
jne yes_mouse_button ;
mov byte[lastmousebutton],0 ;
jmp no_mouse ;
yes_mouse_button: ;
;
cmp eax,2 ;
jne no_left_mouse ;
cmp byte[status],'1' ;
jne no_left_mouse ;
mov byte[lastmousebutton],2 ;
inc dword [current_block_y] ;
call check_crash ;
jne block_crash ;
jmp no_mouse ;
;
no_left_mouse: ;
;
;
cmp eax,1 ;
jne no_right_mouse ;
cmp byte[status],'1' ;
jne no_right_mouse ;
cmp byte[lastmousebutton],1 ;
mov byte[lastmousebutton],1 ;
je no_right_mouse ;
call rotate_block ;
call check_crash ;
jne block_crash ;
call draw_block ;
jmp scendi ;
;
no_right_mouse: ;
;
;
cmp eax,3 ;
jne no_mouse ;
cmp byte[lastmousebutton],3 ;
mov byte[lastmousebutton],3 ;
je no_mouse ;
cmp byte[status],'2' ;
je unpause ;
mov byte[status],'2' ;
call draw_window ;
jmp attesa ;
; unpause: ;
; mov byte[status],'1' ;
; call draw_window ;
; jmp still ;
;
; ;
no_mouse: ;
 
ret
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/games/tetris/trunk/random.inc
0,0 → 1,18
;--------------------------------------------------------------
 
random: mov eax,[generator]
add eax,-43ab45b5h
ror eax,1
xor eax,32c4324fh
ror eax,1
mov [generator],eax
; --- IVAN ---
push ebx
mov eax,22
mov ebx,9
int 0x40
pop ebx
xor eax,0xdeadbeef
add eax,[generator]
; --- IVAN ---
ret
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/games/tetris/trunk/score.inc
0,0 → 1,100
write_score:
 
mov eax,13
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2-3)*65536+95 ;clear box to write new score
mov ecx,20*65536+((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION-20)
mov edx,0x00000000
int 40h
 
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2)*65536+25 ; draw info text with function 4
mov ecx,0xffff00 ; color
mov edx,scoretext
mov esi,linestext-scoretext
mov eax,4
int 0x40
 
mov eax,[score]
call number_to_str
 
 
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+35)*65536+25 ; draw info text with function 4
mov ecx,0xffff00 ; color
mov edx,number_str
mov esi,[size_of_number_str]
mov eax,4
int 0x40
 
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2)*65536+35 ; draw info text with function 4
mov ecx,0xffff00 ; color
mov edx,linestext
mov esi,speedtext-linestext
mov eax,4
int 0x40
 
mov eax,[lines]
call number_to_str
 
 
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+35)*65536+35 ; draw info text with function 4
mov ecx,0xffff00 ; color
mov edx,number_str
mov esi,[size_of_number_str]
mov eax,4
int 0x40
 
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2)*65536+45 ; draw info text with function 4
mov ecx,0xffff00 ; color
mov edx,speedtext
mov esi,leveltext-speedtext
mov eax,4
int 0x40
 
mov eax,[speed]
call number_to_str
 
 
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+35)*65536+45 ; draw info text with function 4
mov ecx,0xffff00 ; color
mov edx,number_str
mov esi,[size_of_number_str]
mov eax,4
int 0x40
 
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2)*65536+55 ; draw info text with function 4
mov ecx,0xffff00 ; color
mov edx,leveltext
mov esi,startgame-leveltext
mov eax,4
int 0x40
 
mov eax,[level]
call number_to_str
 
 
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+35)*65536+55 ; draw info text with function 4
mov ecx,0xffff00 ; color
mov edx,number_str
mov esi,[size_of_number_str]
mov eax,4
int 0x40
 
call draw_next_block
 
ret
 
 
number_to_str:
 
mov edi,end_number_str-1
mov ecx,9;size_of_number_str
mov ebx,10
cld
new_digit:
xor edx,edx
div ebx
add dl,'0'
mov [edi],dl
dec edi
loop new_digit
 
ret
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/games/tetris/trunk/table.inc
0,0 → 1,56
;--------------------------------------------------------------
; DRAW_TABLE
;--------------------------------------------------------------
draw_table: mov esi,table_tetris+LEN_X*BORDER_TOP+BORDER_LEFT
 
mov ebx,X_LOCATION*65536+ADOBE_SIZE
mov ecx,Y_LOCATION*65536+ADOBE_SIZE
mov edi,LEN_Y-BORDER_TOP-BORDER_BOTTOM
y_draw: push edi
 
mov edi,LEN_X-BORDER_LEFT-BORDER_RIGHT
x_draw: push edi
mov ax,13
movzx edx,byte [esi]
mov edx,[color_table+edx*4]
int 0x40
call draw_frames
inc esi
add ebx,65536*ADOBE_SIZE
pop edi
dec edi
jnz x_draw
 
add esi,BORDER_LEFT+BORDER_RIGHT
mov ebx,X_LOCATION*65536+ADOBE_SIZE
add ecx,65536*ADOBE_SIZE
pop edi
dec edi
jnz y_draw
 
ret
 
;--------------------------------------------------------------
 
clear_table_tetris:
cld
mov al,1
mov edi,table_tetris
mov ecx,LEN_X*BORDER_TOP
rep stosb
 
mov edx,LEN_Y-BORDER_TOP-BORDER_BOTTOM
adr300: mov cl,BORDER_LEFT
rep stosb
dec ax ;AL=0
mov cl,LEN_X-BORDER_LEFT-BORDER_RIGHT
rep stosb
inc ax ;AL=1
mov cl,BORDER_RIGHT
rep stosb
dec dx
jne adr300
 
mov ecx,LEN_X*BORDER_BOTTOM
rep stosb
ret
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/games/tetris/trunk/tetris.asm
16,36 → 16,25
;
;
; Changelog:
; 09.11.2005 - fix for work under MeosDebug & better random - Andrey Halyavin
; 23.09.2005 - fixed bug, when 011111111111111-like sequence interpreted
; as _11111111111111 in check_full_line - Sergey Kuzmin aka Wildwest
; 18.09.2005 - added 'Pause' button and made appropriate code and interface redesign
; BTW, you can MOVE and ROTATE block during Pause ;) - Sergey Kuzmin aka Wildwest
;
; 28.06.2001 - fasm port & framed blocks - Ville Turjanmaa
; 31.10.2001 - rdtsc replaced - quickcode <quickcode@mail.ru>
; 03.11.2003 - added new blocks & random - Ivan Poddubny
; 31.10.2001 - rdtsc replaced - quickcode <quickcode@mail.ru>
; 28.06.2001 - fasm port & framed blocks - Ville Turjanmaa
;
;
 
LEN_X equ 19 ;width of table
LEN_Y equ 29 ; height of table
BORDER_LEFT equ 1
BORDER_RIGHT equ 1
LEN_X equ 14
LEN_Y equ 24
BORDER_LEFT equ 2
BORDER_RIGHT equ 2
BORDER_TOP equ 1
BORDER_BOTTOM equ 1
ADOBE_SIZE equ 12
X_LOCATION equ 6
Y_LOCATION equ 21
_MAXBLOCKS_ = 7*4
SCORE_TO_NEW_LEVEL equ 100000
 
X_LOCATION equ 30 ; distance to table from left side
Y_LOCATION equ 50 ; distance to table from header
 
UP_KEY equ 130+48
DOWN_KEY equ 129+48
LEFT_KEY equ 128+48
RIGHT_KEY equ 131+48
BACKGROUND equ 03000080h
 
_MAXBLOCKS_ = 7*4
 
use32
 
org 0x0
54,38 → 43,43
dd 0x01 ; header version
dd START ; program start
dd I_END ; program image size
dd I_END+1024 ; reguired amount of memory
dd I_END+1024 ; esp
dd IM_END ; reguired amount of memory
dd IM_END ; esp
dd 0x0,0x0 ; I_PARAM, I_ICON
include 'lang.inc'
include 'macros.inc'
 
 
START: ; start of execution
 
mov eax,3 ;
int 0x40 ;
mov cl,16 ;
ror eax,cl ; to make seconds more significant
mov [generator],eax ;
call random ;
 
; -- quickcode - start
mov byte[status],'0'
mov byte[menu],'0'
call draw_window ; at first, draw the window
 
mov eax,3
int 0x40
mov cl,16
ror eax,cl ; to make seconds more significant
mov [generator],eax
call random
still:
 
; -- quickcode - end
cmp byte[status],'2'
je attesa
 
cmp byte[status],'1'
 
call clear_table_tetris
call new_block
call draw_window ; at first, draw the window
jne attesa
xor edx,edx
 
still:
xor edx,edx
call draw_block
 
 
attesa:
 
call mouse
;disabled because of bug
;EDIT: the bug is somewhere else..
;NOTE: dont release this without fixing the bug you lazy bastard!
 
mov eax,11 ; get event
int 0x40
 
97,34 → 91,35
check_button:
cmp eax,3 ; button in buffer ?
jnz scendi
jmp button
mov eax,-1 ; close this program
int 0x40
 
red: ; redraw
call draw_window
jmp still
 
parallel dd 1
 
scendi: cmp byte[status],'1'
jne still
 
scendi:
;///////////////////////////////////////////////// Wildwest
cmp dword [pauses], 0
je ok
jne not_ok
not_ok:
cmp byte[blabla],10
je blabla_0
inc byte[blabla]
jmp blabla_1
blabla_0:
mov byte[blabla],0
inc dword [current_block_y]
dec dword [current_block_y]
call check_crash
jne block_crash
jmp draw
ok:
;/////////////////////////////////////////////////
inc dword [current_block_y]
call check_crash
jne block_crash
blabla_1:
 
 
draw: movzx edx,byte [current_block_color]
call draw_block
mov eax,5
movzx ebx,byte [delay]
mov ebx,5
sub ebx,[speed]
int 0x40
jmp still
 
135,7 → 130,6
call check_full_line
call draw_table
call new_block
inc dword [score]
call write_score
call check_crash
jz adr400
146,729 → 140,96
call draw_window
adr10000: cmp eax,3
jne aspetta
new_game: mov eax,17
int 0x40
cmp ah,1
jnz adr401
jmp end_program
adr401:
;///////////////////////////////////////////////////// Wildwest
mov dword [pauses], 0
;////////////////////////////////////////////////////
mov dword [score],0
 
new_game: mov dword [score],0
mov dword [lines],0
mov dword [level],0
mov dword [speed],0
mov byte [status],'1'
call clear_table_tetris
call first_block
call new_block
call draw_window
 
adr400: movzx edx,byte [current_block_color]
call draw_block
mov eax,5
movzx ebx,byte [delay]
int 0x40
jmp still
 
key: mov eax,2
int 0x40
include 'key.inc'
include 'mouse.inc'
include 'menu.inc'
include 'window.inc'
include 'block.inc'
include 'table.inc'
include 'random.inc'
include 'score.inc'
 
adr32: cmp ah,LEFT_KEY
jne adr_30
dec dword [current_block_x]
call check_crash
jz adr4000
inc dword [current_block_x]
adr4000: jmp scendi
 
adr_30: cmp ah,RIGHT_KEY
jne adr_31
inc dword [current_block_x]
call check_crash
jz adr3000
dec dword [current_block_x]
adr3000: jmp scendi
 
adr_31: cmp ah,UP_KEY
jne adr51
mov edx,[current_block_pointer]
mov edx,[edx+16]
mov esi,[current_block_pointer]
mov [current_block_pointer],edx
call check_crash
jz adr50
mov [current_block_pointer],esi
adr50: jmp scendi
 
adr51: cmp ah,DOWN_KEY
jne adr61
mov byte [delay],5 ;!!! 2
adr52: jmp scendi
 
adr61: cmp ah,' '
jne adr62
mov byte [delay],5 ;!!! 2
adr62: jmp scendi
 
 
button: ; button
mov eax,17
int 0x40
cmp ah,1 ; button id=1 ?
jz end_program
cmp ah,2
jz go_new_game
cmp ah,3 ; button id=3 ? ///Wildwest's 'Pause' button
jz pause_program
jmp still
 
end_program:
mov eax,0xffffffff ; close this program
int 0x40
 
go_new_game:
jmp new_game
;//////////////////////////////////////////////////// Wildwest
pause_program:
cmp dword [pauses], 0
je incr
mov dword [pauses], 0
jmp still
incr:
mov dword [pauses], 1
jmp still
;////////////////////////////////////////////////////
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window:
 
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,1 ; 1, start of draw
int 0x40
 
; DRAW WINDOW
mov eax,0 ; function 0 : define and draw window
mov ebx,320*65536+(LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2
mov ecx,25*65536+ (LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+30
mov edx,BACKGROUND ; color of work area RRGGBB
mov esi,0x006688ee;99bbff ; color of grab bar RRGGBB,8->col
mov edi,0x007799ff;99bbee ; color of frames RRGGBB
int 0x40
 
; WINDOW LABEL
mov eax,4 ; function 4 : write text to window
mov ebx,8*65536+8 ; [x start] *65536 + [y start]
mov ecx,0x10ffffff ; color of text RRGGBB
mov edx,labelt ; pointer to text beginning
mov esi,labellen-labelt ; text length
int 0x40
 
; CLOSE BUTTON
; mov eax,8 ; function 8 : define and draw button
; mov ebx,243*65536+12 ; [x start] *65536 + [x size]
; mov ecx,5*65536+12 ; [y start] *65536 + [y size]
; mov edx,1 ; button id
; mov esi,0x5580cc;22aacc ; button color RRGGBB
; int 0x40
 
mov eax,8
mov ebx,30*65536+102
mov ecx,378*65536+18
mov edx,2
mov esi,0xA24466;5580cc;22aacc
int 0x40
;/////////////////////////////////////////////// Wildwest's 'Pause' button
mov eax,8
mov ebx,132*65536+102
mov ecx,378*65536+18
mov edx,3
mov esi,0x0FA0F0;
int 0x40
 
mov eax,4 ; function 4 : write text to window
mov ebx,164*65536+384 ; [x start] *65536 + [y start]
mov ecx,0x10ffffff ; color of text RRGGBB
mov edx,labe ; pointer to text beginning
mov esi,labelen-labe ; text length
int 0x40
;///////////////////////////////////////////////
mov eax,4
mov ebx,49*65536+384
xor ecx,ecx
mov ecx,0x10ffffff
mov edx,game_finished
mov esi,size_of_game_finished-game_finished
int 0x40
 
call draw_table
 
movzx edx,byte [current_block_color]
call draw_block
 
cld
mov ebx,38*65536+35 ; draw info text with function 4
mov ecx,0x10ffffff ; color
mov edx,text
mov esi,7
mov eax,4
int 0x40
 
call write_score
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
 
ret
 
;-------------------------------------------------------------
; CHECK CRASH
; output Z flag => OK
; NZ flag => NO
;-------------------------------------------------------------
 
check_crash: mov ebx,[current_block_pointer]
 
mov edx,[current_block_y]
imul edx,LEN_X
add edx,[current_block_x] ;find the offset in tetris_t
 
add edx,table_tetris
 
mov ecx,4
xor ax,ax
 
adr_1: cmp byte [ebx],1
jne adr_2
add al,[edx]
adc ah,0
adr_2: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_3
add al,[edx]
adc ah,0
adr_3: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_4
add al,[edx]
adc ah,0
adr_4: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_5
add al,[edx]
adc ah,0
adr_5: inc ebx
add edx,LEN_X-3
 
loop adr_1
or ax,ax
ret
;-------------------------------------------------------------
;NEW BLOCK
;-------------------------------------------------------------
new_block: mov dword [current_block_y],1
mov dword [current_block_x],7
 
call random
and al,7
setz ah
add al,ah
mov [current_block_color],al
 
call random
;and eax,15
; ---- Ivan ----
and eax,0xff
@@:
cmp eax,_MAXBLOCKS_
jl @f
add eax,-(_MAXBLOCKS_)
jmp @b
@@:
; ---- Ivan ----
mov edx,[block_table+eax*4]
mov [current_block_pointer],edx
 
mov byte [delay],22 ;19 ;!!! 15
ret
;-------------------------------------------------------------
; FIX BLOCK
;-------------------------------------------------------------
fix_block: mov ebx,[current_block_pointer]
 
mov edx,[current_block_y]
imul edx,LEN_X
add edx,[current_block_x] ;find the offset in tetris_t
 
add edx,table_tetris
 
mov ecx,4
mov al,[current_block_color]
 
adr_21: cmp byte [ebx],1
jne adr_22
mov [edx],al
adr_22: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_23
mov [edx],al
adr_23: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_24
mov [edx],al
adr_24: inc ebx
inc edx
 
cmp byte [ebx],1
jne adr_25
mov [edx],al
adr_25: inc ebx
add edx,LEN_X-3
 
loop adr_21
ret
 
;--------------------------------------------------------------
; DRAW_TABLE
;--------------------------------------------------------------
draw_table: mov esi,table_tetris+LEN_X*BORDER_TOP+BORDER_LEFT
 
mov ebx,X_LOCATION*65536+ADOBE_SIZE
mov ecx,Y_LOCATION*65536+ADOBE_SIZE
mov edi,LEN_Y-BORDER_TOP-BORDER_BOTTOM
y_draw: push edi
 
mov edi,LEN_X-BORDER_LEFT-BORDER_RIGHT
x_draw: push edi
; pusha
; mov eax,5
; mov ebx,10
; int 0x40
; popa
mov ax,13
movzx edx,byte [esi]
mov edx,[color_table+edx*4]
int 0x40
call draw_frames
inc esi
add ebx,65536*ADOBE_SIZE
pop edi
dec edi
jnz x_draw
 
add esi,BORDER_LEFT+BORDER_RIGHT
mov ebx,X_LOCATION*65536+ADOBE_SIZE
add ecx,65536*ADOBE_SIZE
pop edi
dec edi
jnz y_draw
 
ret
;--------------------------------------------------------------
;DRAW BLOCK
;
; ebx=x [0..LEN_X-1]
; ecx=y [0..LEN_Y-1]
; edi=pointer block
;--------------------------------------------------------------
draw_block:
mov eax,13
mov edx,[color_table+edx*4]
 
mov ebx,[current_block_x]
mov ecx,[current_block_y]
mov edi,[current_block_pointer]
 
sub ebx,BORDER_LEFT
imul ebx,ADOBE_SIZE
add ebx,X_LOCATION
shl ebx,16
mov bx,ADOBE_SIZE
 
sub ecx,BORDER_TOP
imul ecx,ADOBE_SIZE
add ecx,Y_LOCATION
shl ecx,16
mov cx,ADOBE_SIZE
 
mov dword [TMP_1],4
adr_122: mov dword [TMP_0],4
adr_121: cmp byte [edi],0
je adr_120
 
int 040h
 
call draw_frames
 
adr_120: inc edi
add ebx,ADOBE_SIZE*65536
dec dword [TMP_0]
jnz adr_121
sub ebx,4*ADOBE_SIZE*65536
add ecx,ADOBE_SIZE*65536
dec dword [TMP_1]
jnz adr_122
 
ret
 
draw_frames:
cmp edx,0
jne df1
ret
df1:
pusha
mov bx,1
add edx,0x282828
mov eax,13
int 0x40
popa
 
pusha
mov cx,1
add edx,0x282828
mov eax,13
int 0x40
popa
 
pusha
push ebx
sub bx,1
add [esp+2],bx
pop ebx
mov bx,1
shr edx,1
and edx,0x7f7f7f
mov eax,13
int 0x40
popa
 
pusha
push ecx
sub cx,1
add [esp+2],cx
pop ecx
mov cx,1
shr edx,1
and edx,0x7f7f7f
mov eax,13
int 0x40
popa
 
ret
 
 
;--------------------------------------------------------------
clear_table_tetris:
cld
mov al,1
mov edi,table_tetris
mov ecx,LEN_X*BORDER_TOP
rep stosb
 
mov edx,LEN_Y-BORDER_TOP-BORDER_BOTTOM
adr300: mov cl,BORDER_LEFT
rep stosb
dec ax ;AL=0
mov cl,LEN_X-BORDER_LEFT-BORDER_RIGHT
rep stosb
inc ax ;AL=1
mov cl,BORDER_RIGHT
rep stosb
dec dx
jne adr300
 
mov ecx,LEN_X*BORDER_BOTTOM
rep stosb
ret
;--------------------------------------------------------------
;edx = pointer
;ebx = contatore
check_full_line:
std
mov al,0
mov edx,table_tetris+LEN_X*(LEN_Y-BORDER_BOTTOM)-1
mov ebx,(LEN_Y-BORDER_TOP-BORDER_BOTTOM-1)*LEN_X
 
adr_5000: mov edi,edx
mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT+1;Wildwest's fix for bug
;(was LEN_X-BORDER_LEFT-BORDER_RIGHT)
repne scasb
jz no_full_line
 
lea esi,[edx-LEN_X]
mov edi,edx
mov ecx,ebx
rep movsb
sub edi,BORDER_RIGHT
mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT
rep stosb
add dword [score],50
jmp adr_5000
 
no_full_line: sub edx,LEN_X
sub ebx,LEN_X
jnz adr_5000
 
ret
;--------------------------------------------------------------
random: mov eax,[generator]
add eax,-43ab45b5h
ror eax,1
xor eax,32c4324fh
ror eax,1
mov [generator],eax
; --- IVAN ---
push ebx
mov eax,26
mov ebx,9
int 0x40
pop ebx
xor eax,0xdeadbeef
add eax,[generator]
; --- IVAN ---
mov [generator],eax ; Halyavin
ret
;--------------------------------------------------------------
number_to_str: mov edi,end_number_str-1
mov ecx,9;size_of_number_str
mov ebx,10
cld
new_digit: xor edx,edx
div ebx
add dl,'0'
mov [edi],dl
dec edi
loop new_digit
ret
;--------------------------------------------------------------
write_score:
mov eax,[score]
call number_to_str
 
mov ebx,100*65536+100 ;clear box to write new score
mov ecx,35*65536+15
mov edx,BACKGROUND
mov eax,13
int 40h
 
mov ebx,100*65536+35 ; draw info text with function 4
mov ecx,0xffff00 ; color
mov edx,number_str
mov esi,[size_of_number_str]
mov eax,4
int 0x40
ret
 
; DATA AREA
 
;--------------------------------------------------------------
;DEFINITION BLOCKS
;--------------------------------------------------------------
t_block_0: db 0,0,0,0
db 1,1,1,0
db 0,1,0,0
db 0,0,0,0
dd t_block_3
include 'blocks.inc'
 
t_block_1: db 0,1,0,0
db 1,1,0,0
db 0,1,0,0
db 0,0,0,0
dd t_block_0
labelt: db 'TETRIS II'
scoretext: db 'Score:'
linestext: db 'Lines:'
speedtext: db 'Speed:'
leveltext: db 'Level:'
startgame: db 'START'
instr: db 'INSTRUCTIONS'
hist: db 'HISTORY'
quit: db 'EXIT'
paused: db 'PAUSED'
txt_end:
 
t_block_2: db 0,1,0,0
db 1,1,1,0
db 0,0,0,0
db 0,0,0,0
dd t_block_1
history:
db 'TETRIS for MENUET v2.0 '
db ' '
db ' '
db 'Originally made '
db ' by Paolo Minazzi '
db ' '
db 'Port & framed blocks '
db ' by Ville Turjanmaa '
db ' '
db 'RDTSC replaced '
db ' by quickcode '
db ' '
db 'New blocks & better random '
db ' by Ivan Poddubny '
db ' '
db 'Better control, logo, menu, pause '
db ' by Jeffrey Amelynck'
 
t_block_3 db 0,1,0,0
db 0,1,1,0
db 0,1,0,0
db 0,0,0,0
dd t_block_2
;--------------------------------------------------------------
i_block_0: db 0,1,0,0
db 0,1,0,0
db 0,1,0,0
db 0,1,0,0
dd i_block_1
db 'x <- END MARKER, DONT DELETE '
 
i_block_1: db 0,0,0,0
db 1,1,1,1
db 0,0,0,0
db 0,0,0,0
dd i_block_0
;--------------------------------------------------------------
q_block_0: db 0,1,1,0
db 0,1,1,0
db 0,0,0,0
db 0,0,0,0
dd q_block_0
;--------------------------------------------------------------
s_block_0:
db 0,0,0,0
db 0,1,1,0
db 1,1,0,0
db 0,0,0,0
dd s_block_1
instructions:
db 'TETRIS for MENUET v2.0 '
db ' '
db 'Controls: '
db ' '
db 'Use left & right key to navigate '
db 'Use up key to turn the block '
db 'Use down key to make block fall '
db 'Use P to pause game '
db 'Use N to start a new game '
db 'Use ESC to go back to menu or exit'
db 'You can also use the mouse to move'
db 'the blocks, left button to let the'
db 'blocks fall and right button to '
db 'rotate them '
db 'you can pause the game by pressing'
db 'both mouse buttons '
db ' '
db 'DONT FORGET: move mouse out of the'
db 'window if you want to use keyboard'
 
s_block_1: db 1,0,0,0
db 1,1,0,0
db 0,1,0,0
db 0,0,0,0
dd s_block_0
;--------------------------------------------------------------
l_block_0: db 0,0,0,0
db 1,1,1,0
db 1,0,0,0
db 0,0,0,0
dd l_block_3
db 'x <- END MARKER, DONT DELETE '
 
l_block_1: db 1,1,0,0
db 0,1,0,0
db 0,1,0,0
db 0,0,0,0
dd l_block_0
I_END:
 
l_block_2: db 0,0,1,0
db 1,1,1,0
db 0,0,0,0
db 0,0,0,0
dd l_block_1
 
l_block_3: db 0,1,0,0
db 0,1,0,0
db 0,1,1,0
db 0,0,0,0
dd l_block_2
;-----------------------------------------------
 
g_block_0:
 
db 0,1,0,0
db 0,1,0,0
db 1,1,0,0
db 0,0,0,0
dd g_block_1
 
g_block_1:
db 0,0,0,0
db 1,1,1,0
db 0,0,1,0
db 0,0,0,0
dd g_block_2
 
g_block_2:
db 0,1,1,0
db 0,1,0,0
db 0,1,0,0
db 0,0,0,0
dd g_block_3
 
g_block_3:
db 1,0,0,0
db 1,1,1,0
db 0,0,0,0
db 0,0,0,0
dd g_block_0
 
;-----------------------------------
 
k_block_0:
db 0,0,0,0
db 1,1,0,0
db 0,1,1,0
db 0,0,0,0
dd k_block_1
 
k_block_1:
db 0,1,0,0
db 1,1,0,0
db 1,0,0,0
db 0,0,0,0
dd k_block_0
 
;-----------------------------------
 
color_table: dd 00000000h ;black 0
dd 00cccccch ;white 1
dd 00cc0000h ;red 2
dd 0000cc00h ;green 3
dd 000000cch ;blue 4
dd 00cccc00h ;yellow 5
dd 0000cccch ;cyan 6
dd 00cc00cch ;pink 7
 
block_table:
dd t_block_0 ; t
dd t_block_1
dd t_block_2
dd t_block_3
dd i_block_0 ; i
dd i_block_1
dd i_block_0
dd i_block_1
dd q_block_0 ; q
dd q_block_0
dd q_block_0
dd q_block_0
dd s_block_0 ; s
dd s_block_1
dd s_block_0
dd s_block_1
dd l_block_0 ; l
dd l_block_1
dd l_block_2
dd l_block_3
dd g_block_0 ; g
dd g_block_1
dd g_block_2
dd g_block_3
dd k_block_0 ; k
dd k_block_1
dd k_block_0
dd k_block_1
 
if lang eq ru
 
labelt:
db '’…’ˆ‘ 1.6 - ‘’…‹Šˆ ˆ Ž…‹'
labellen:
labe:
db '€“‡€'
labelen:
text: db 'Žçª¨: '
game_finished: db ' €—€’œ'
size_of_game_finished:
 
else
 
labelt:
db 'TETRIS 1.6 - ARROWS & SPACE'
labellen:
labe:
db 'PAUSE'
labelen:
text: db 'Score: '
game_finished: db 'NEW GAME'
size_of_game_finished:
 
end if
 
pauses dd 0 ;/// Wildwest
parallel dd 1
score: dd 0
level: dd 0
speed: dd 0
lines: dd 0
TMP_0: dd 0
TMP_1: dd 0
generator: dd 0
876,10 → 237,17
current_block_y: dd 0
current_block_pointer: dd 0
current_block_color: db 0
next_block_pointer: dd 0
next_block_color: db 0
blabla dd 0
lastmousebutton dd 0
number_str: db 0,0,0,0,0,0,0,0,0
end_number_str:
size_of_number_str dd 9
delay: db 40
table_tetris:
size_of_number_str dd 7
delay: dd 5
status: dd 0 ; 0=menu, 1=playing, 2=paused, 3=history , 4=instructions
menu: dd 0 ; 0=start, 1=instructions, 2=history, 3=exit
 
I_END:
table_tetris: rb 2048+55
 
IM_END:
/programs/games/tetris/trunk/window.inc
0,0 → 1,142
draw_window:
 
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,1 ; 1, start of draw
int 0x40
 
; DRAW WINDOW
mov eax,0 ; function 0 : define and draw window
mov ebx,320*65536+(LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2+98
mov ecx,25*65536+ (LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+4
mov edx,0x03000000 ; color of work area RRGGBB
mov esi,0x006688ee ; color of grab bar RRGGBB,8->col
mov edi,0x007799ff ; color of frames RRGGBB
int 0x40
 
; WINDOW LABEL
mov eax,4 ; function 4 : write text to window
mov ebx,8*65536+5 ; [x start] *65536 + [y start]
mov ecx,0x00ffffff ; color of text RRGGBB
mov edx,labelt ; pointer to text beginning
mov esi,scoretext-labelt ; text length
int 0x40
 
cmp byte[status],'0'
jne status1
call draw_logo
call draw_menu
 
status1:
cmp byte[status],'1'
jne status2
 
call draw_game
 
status2:
cmp byte[status],'2'
jne status3
 
call draw_game
 
mov eax,4 ; function 4 : write text to window
mov ebx,80*65536+170 ; [x start] *65536 + [y start]
mov ecx,0x10ff0000 ; color of text RRGGBB
mov edx,paused ; pointer to text beginning
mov esi,txt_end-paused ; text length
int 0x40
 
status3:
cmp byte[status],'3'
jne status4
 
call draw_logo
mov edx,history
call show_text
 
status4:
cmp byte[status],'4'
jne status5
 
call draw_logo
mov edx,instructions
call show_text
 
status5:
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
 
ret
 
draw_game:
 
call draw_table
movzx edx,byte [current_block_color]
call draw_block
 
call write_score
 
mov eax,38
mov ebx,((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2-4) shl 16 + ((LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2-4)
mov ecx,20 shl 16 + ((LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+2-4)
mov edx,0x00ffffff
int 0x40
 
ret
 
draw_logo:
 
mov ebx,2
mov ecx,2
mov edx,[color_table+1*4]
mov edi,tetris_t
call draw_title_block
mov ebx,5
mov ecx,3
mov edx,[color_table+2*4]
mov edi,tetris_e
call draw_title_block
mov ebx,8
mov ecx,2
mov edx,[color_table+3*4]
mov edi,tetris_t
call draw_title_block
mov ebx,11
mov ecx,3
mov edx,[color_table+4*4]
mov edi,tetris_r
call draw_title_block
mov ebx,13
mov ecx,2
mov edx,[color_table+5*4]
mov edi,tetris_i
call draw_title_block
mov ebx,15
mov ecx,3
mov edx,[color_table+6*4]
mov edi,tetris_s
call draw_title_block
mov ebx,20
mov ecx,2
mov edx,[color_table+7*4]
mov edi,tetris_II
call draw_title_block
 
ret
 
show_text:
mov ebx,6*65536+120 ; draw info text with function 4
mov ecx,0xff0000
mov esi,34
newline:
mov eax,4
int 0x40
add ebx,10
add edx,34
cmp [edx],byte 'x'
jne newline
ret
 
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property