forked from KolibriOS/kolibrios
065b8d32b2
git-svn-id: svn://kolibrios.org@31 a494cfbc-eb01-0410-851d-a64ba20cac60
376 lines
6.8 KiB
PHP
376 lines
6.8 KiB
PHP
;--------------------------------------------------------------
|
|
;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 |