Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 949 → Rev 950

/programs/games/invaders/ASCGL.INC
0,0 → 1,1388
;
; Assembler
; SMALL
; CODE
; Graphics
; Libary
;
; Ver 0.18 By Pavlushin Evgeni (RUSSIA)
; www.waptap@mail.ru
 
;InfoList
;0.01 LoadImage
;0.02 SetBmp
;0.03 Bmptoimg, Setimg ~01.03.2004
;0.04 Bug deleted, copyimg ~03.05.2004
;0.05 fullimg, collimg ~05.05.2004
;0.06 getimg ~09.05.2004
;0.07 convbmp ~13.05.2004
;0.08 fps ~14.05.2004
;0.09 drawfbox ~03.06.2004
;0.10 all macros optimized by halyavin, add at ~07.06.2004
;0.11 many macros optimized by halyavin, add at ~30.08.2004
;0.12 bmptoimg ~07.09.2004
;0.13 imgtoimg ~08.09.2004
;0.14 imgtoimg modify not brake bmp pict! ~09.09.2004
;0.15 giftoimg, giftoani ~10.09.2004
;0.16 setframe, rgbtobgr, setbmp deleted ~20.09.2004
;0.17 modification giftoimg, giftoani, getframeoff ~01.10.2004
;0.18 aframetoimg,aimgtoimg,frametoimg ~03.10.2004
 
aframetoimg_use_count=0
macro aframetoimg img, x, y, canvas,acol
{
local loo,loo2,acolor
aframetoimg_use_count=aframetoimg_use_count+1
if aframetoimg_use_count = 1
 
jmp end_aframetoimg_proc
 
acolor dd 0
aframetoimg_proc:
;getout coord
mov [acolor],ebp
 
mov edx,ebx ;img ;xsize
movzx eax,word [edx]
add eax,esi ;y cor
 
; mov eax,esi ;y cor
mul dword [ecx] ;canvas xsize
add eax,edi ;x cor
 
mov ebp,ebx ;img ;xsize
movzx edx,word [ebp]
add eax,edx
 
mov ebp,eax
shl eax,1
add ebp,eax
add ebp,ecx ;canvas+8;start
add ebp,8
;get img size
add ebx,4
mov eax,ebx ;img ;xsize
movzx esi,word [eax]
movzx edi,word [eax+2]
add ebx,4
mov edx,ebx ;img+8
loo2:
push esi
loo:
;test on alpha color
mov eax,[edx]
shl eax,8
shr eax,8
cmp eax,[acolor]
jne yx
add edx,3
add ebp,3
jmp nx
yx:
 
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
nx:
dec esi
jnz loo
pop esi
sub ebp,3
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3)
sub eax,esi
add ebp,eax
shl eax,1
add ebp,eax
 
add ebp,3
 
dec edi
jnz loo2
ret
end_aframetoimg_proc:
end if
push img
push canvas
push x
push y
push acol
pop ebp
pop esi
pop edi
pop ecx
pop ebx
call aframetoimg_proc
}
 
frametoimg_use_count=0
macro frametoimg img, x, y, canvas
{
local loo,loo2
frametoimg_use_count=frametoimg_use_count+1
if frametoimg_use_count = 1
 
jmp end_frametoimg_proc
 
frametoimg_proc:
;getout coord
mov edx,ebx ;img ;xsize
movzx eax,word [edx]
add eax,esi ;y cor
 
; mov eax,esi ;y cor
mul dword [ecx] ;canvas xsize
add eax,edi ;x cor
 
mov ebp,ebx ;img ;xsize
movzx edx,word [ebp]
add eax,edx
 
mov ebp,eax
shl eax,1
add ebp,eax
add ebp,ecx ;canvas+8;start
add ebp,8
;get img size
add ebx,4
mov eax,ebx ;img ;xsize
movzx esi,word [eax]
movzx edi,word [eax+2]
add ebx,4
mov edx,ebx ;img+8
loo2:
push esi
loo:
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
 
dec esi
jnz loo
pop esi
sub ebp,3
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3)
sub eax,esi
add ebp,eax
shl eax,1
add ebp,eax
 
add ebp,3
 
dec edi
jnz loo2
ret
end_frametoimg_proc:
end if
push img
push canvas
push x
push y
pop esi
pop edi
pop ecx
pop ebx
call frametoimg_proc
}
 
 
aimgtoimg_use_count=0
macro aimgtoimg img, x, y, canvas,acol,offset
{
local loo,loo2,acolor
aimgtoimg_use_count=aimgtoimg_use_count+1
if aimgtoimg_use_count = 1
 
jmp end_aimgtoimg_proc
 
acolor dd 0
aimgtoimg_proc:
;getout coord
mov [acolor],ebp
push eax ;;;;;;;;;;;;;;;;;;;
mov eax,esi ;y cor
mul dword [ecx] ;canvas xsize
add eax,edi ;x cor
mov ebp,eax
shl eax,1
add ebp,eax
add ebp,ecx ;canvas+8;start
add ebp,8
;get img size
mov eax,ebx ;img ;xsize
mov esi,[eax]
add ebx,4
mov eax,ebx ; img+4 ;ysize
mov edi,[eax]
add ebx,4
mov edx,ebx ;img+8
pop eax
add edx,eax
 
loo2:
push esi
loo:
 
;test on alpha color
mov eax,[edx]
shl eax,8
shr eax,8
cmp eax,[acolor]
jne yx
add edx,3
add ebp,3
jmp nx
yx:
 
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
nx:
dec esi
jnz loo
pop esi
sub ebp,3
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3)
sub eax,esi
add ebp,eax
shl eax,1
add ebp,eax
 
add ebp,3
 
dec edi
jnz loo2
ret
end_aimgtoimg_proc:
end if
push img
push canvas
push x
push y
push acol
push offset
pop eax
pop ebp
pop esi
pop edi
pop ecx
pop ebx
call aimgtoimg_proc
}
 
 
 
 
imgtoimg_use_count=0
macro imgtoimg img, x, y, canvas
{
local loo,loo2
imgtoimg_use_count=imgtoimg_use_count+1
if imgtoimg_use_count = 1
 
jmp end_imgtoimg_proc
imgtoimg_proc:
;getout coord
mov eax,esi ;y cor
mul dword [ecx] ;canvas xsize
add eax,edi ;x cor
mov ebp,eax
shl eax,1
add ebp,eax
add ebp,ecx ;canvas+8;start
add ebp,8
;get img size
mov eax,ebx ;img ;xsize
mov esi,[eax]
add ebx,4
mov eax,ebx ; img+4 ;ysize
mov edi,[eax]
add ebx,4
mov edx,ebx ;img+8
loo2:
push esi
loo:
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
mov al,byte [edx]
mov byte [ebp],al
inc ebp
inc edx
dec esi
jnz loo
pop esi
sub ebp,3
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3)
sub eax,esi
add ebp,eax
shl eax,1
add ebp,eax
 
add ebp,3
 
dec edi
jnz loo2
ret
end_imgtoimg_proc:
end if
push img
push canvas
push x
push y
pop esi
pop edi
pop ecx
pop ebx
call imgtoimg_proc
}
 
 
;DrawBox
macro drawfbox x,y,xs,ys,color
{
words2reg ebx,x,xs ;x*65536+xs
words2reg ecx,y,ys ;y*65536+ys
mov edx,color
mov eax,13
int 0x40
}
 
; FPS - Set Frame Per Second Display
fps_show_frequency=40
macro fps x,y,color,delcolor
{
local spdat,savetime,new_time,fps,fps_cntr,out_fps,new_time,ttt
local no_out_fps
jmp spdat
savetime dd 0
fps_cntr dd 0
fps dd 0
ttt dd 0
spdat:
get_time:
mov eax,3
int 0x40
cmp eax,[savetime]
jne new_time
inc [fps_cntr]
cmp dword [ttt],0
je out_fps
dec dword [ttt]
jmp no_out_fps
new_time:
mov [savetime],eax
mov ebx,[fps_cntr]
mov [fps],ebx
mov [fps_cntr],0
out_fps:
if ~(delcolor eq )
mov ebx,x*65536+30
mov ecx,y*65536+7
mov edx,delcolor
mov eax,13
int 0x40
end if
mov dword [ttt],fps_show_frequency
mov eax,47
mov ebx,5*65536
; mov bl,0
mov edx,x*65536+y
mov esi,color
mov ecx,[fps]
int 0x40
no_out_fps:
}
 
; COLLIMG - Collusion image's
_1dbounce_count=0;
macro collimg img1_off,x1,y1,img2_off,x2,y2,otv
{
local bounce,exit,anot,bc,nbc
mov esi,[img1_off] ;xs1
mov edi,[img2_off] ;ys2
mov eax,x1 ;
mov ebx,x2 ;
call _1dbounce
mov edx,ecx
mov esi,[img1_off+4] ;ys1
mov edi,[img2_off+4] ;ys2
mov eax,y1 ;
mov ebx,y2 ;
call _1dbounce
add edx,ecx
cmp edx,2
je bounce
mov otv,0
jmp exit
_1dbounce_count=_1dbounce_count+1
if _1dbounce_count = 1
_1dbounce:
cmp ebx,eax
jb anot
add eax,esi
cmp eax,ebx
jbe nbc
bc:
mov ecx,1
ret
anot:
add ebx,edi
cmp ebx,eax
ja bc
nbc:
xor ecx,ecx
ret
end if
bounce:
mov otv,1
exit:
}
 
macro rgbtobgr image
{
local loo
mov eax,[image]
mul dword [image+4]
mov ecx,eax
mov esi,image+8
; add esi,8
loo:
mov al,[esi]
mov bl,[esi+2]
mov [esi],bl
mov [esi+2],al
add esi,3
dec ecx
jnz loo
}
 
 
macro setimg x , y ,arg3
{
mov eax,7
mov ebx,arg3
add ebx,8
mov cx,[arg3]
shl ecx,16
add cx,[arg3+4]
; wordstoreg ecx,[arg3],[arg3+4]
words2reg edx, x , y ;arg1*65536+arg2
int 0x40
}
 
macro setframe x , y ,arg3
{
mov eax,7
mov ebx,arg3
add ebx,8
words2reg edx, x , y ;arg1*65536+arg2
add edx,dword [arg3]
mov ecx,dword [arg3+4]
int 0x40
}
 
 
macro getimg imgsrc,x,y,xs,ys,imgdest
{
local cyc
if xs eqtype 0
mov dword [imgdest],xs
else
mov eax,xs
mov dword [imgdest],eax
end if
if ys eqtype 0
mov dword [imgdest+4],ys
else
mov eax,ys
mov dword [imgdest+4],eax
end if
 
mov eax,dword [imgsrc] ;getx size
; lea ecx,[eax+2*eax]
mov ecx,eax
shl ecx,1
add ecx,eax
 
mov ebx,y
mul ebx
add eax,x
mov edx,ecx
lea eax,[eax+2*eax] ;eax=offset on imsrc
; mov ebp,eax
; shl eax,1
; add eax,ebp
 
mov ecx,xs
mov ebx,ys
 
mov edi,8+imgdest
lea esi,[eax+8+imgsrc]
; mov esi,eax
; add esi,8
; add esi,imgsrc
 
cld
cyc:
movsw
movsb
dec ecx
jne cyc
add esi,edx
mov ecx,xs
sub esi,ecx
sub esi,ecx
sub esi,ecx
dec ebx
jne cyc
}
 
macro copyimg img2_off,img1_off
{
mov eax,dword [img1_off]
mov ebx,dword [img1_off+4]
mul ebx
lea ecx,[eax+2*eax]
lea esi,[img1_off+8]
lea edi,[img2_off+8]
cld
rep movsb
}
 
macro fullimg img_off,xs,ys,color
{
local cop
mov eax,xs
mov ebx,ys
mov dword [img_off],eax
mov dword [img_off+4],ebx
mul ebx
lea ebp,[eax+2*eax]
mov esi,color
if color eqtype 0
mov ecx,color/65536
else
mov ecx,esi
shr ecx,16
end if
xor edi,edi
cop:
mov word [img_off+8+edi],si
add edi,2
mov byte [img_off+8+edi],cl
inc edi
cmp edi,ebp
jne cop
}
 
 
 
; number of frame in ecx
; callculatin offset of raw data
 
macro getframeoff num_of_frame,offset_of_animation,offset_of_frame
{
local loo,setpic
mov ebp,num_of_frame ;ecx
mov esi,offset_of_animation;Image
loo:
cmp ebp,0
je setpic
movzx eax,word [esi+4]
movzx ebx,word [esi+6]
mul ebx ;dword [esi+4]
mov ebx,3
mul ebx
add eax,8
add esi,eax
dec ebp
jmp loo
setpic:
mov dword offset_of_frame,esi
}
 
 
; BMPTOIMG -Convert BMP format TO IMG format
; (SYNTAX) BMPTOIMG BMP_source_offset,IMG_dest_ofset
; (SAMPLE) View BMPLS.ASM sample.
; ( NOTE ) This is macros is not brake bmp structure! Tested in 32,8,4 bits
 
 
bmptoimg_data_area_count=0
macro bmptoimg bmp_load_area,img_dest_area
{
local fileinfo,string,end_bmp,nodix
local converttable,noaddelem,nextbit,convert1bpp,convert4bpp,convert2
local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize
;local qwe,bmpfn
 
; convert:
movzx eax,word [bmp_load_area+28]
mul dword [bmp_load_area+18]
add eax,31
shr eax,5
mov dword [bmptoimg_data_area_dwps],eax ;dwps-doublewords per string
shl eax,2
mov dword [bmptoimg_data_area_bps],eax ;bps-bytes per string
 
cmp dword [bmp_load_area+34],0
jne yespicsize ;if picture size is defined
mul dword [bmp_load_area+22]
mov dword [bmp_load_area+34],eax
 
yespicsize:
mov ebp,img_dest_area+8
 
mov eax,bmp_load_area
mov ebx,eax
add ebx, [bmp_load_area+2];file size
inc ebx
mov dword [bmptoimg_soi],ebx ;soi-start of image area for drawing
 
add eax, [bmp_load_area+10]
mov dword [bmptoimg_data_area_sop],eax ;sop-start of picture in file
add eax, [bmp_load_area+34]
mov dword [bmptoimg_data_area_eop],eax ;eop-end of picture in file
mov eax, [bmp_load_area+18]
lea eax,[eax+2*eax] ;3x pixels in eax
 
mov edi,dword [bmptoimg_soi] ;initializing
mov esi,dword [bmptoimg_data_area_eop]
sub esi,dword [bmptoimg_data_area_bps]
 
 
nextstring:
push edi
push ebp
cmp word [bmp_load_area+28],24
jne convertno32
 
mov edi,ebp
mov ecx,[bmptoimg_data_area_dwps]
cld
rep movsd
 
convert1:
pop ebp
pop edi
sub esi,dword [bmptoimg_data_area_bps]
sub esi,dword [bmptoimg_data_area_bps]
cmp esi,dword [bmptoimg_data_area_sop]
jb end_bmp
add edi,eax
add ebp,eax
jmp nextstring
 
convertno32:
mov ebx,bmp_load_area
add ebx, [bmp_load_area+14]
add ebx,14 ;start of color table
push esi
add esi,dword [bmptoimg_data_area_bps]
mov dword [bmptoimg_data_area_eos],esi
pop esi
nextelem:
push eax
movzx eax,byte [esi]
cmp word [bmp_load_area+28],4
je convert4bpp
cmp word [bmp_load_area+28],1
je convert1bpp
call converttable
 
convert2:
pop eax
inc esi
cmp esi,dword [bmptoimg_data_area_eos]
jae convert1
add edi,3
 
add ebp,3
 
jmp nextelem
 
convert4bpp:
shl ax,4
shr al,4
push ax
movzx eax,ah
call converttable
add edi,3
 
add ebp,3
 
pop ax
movzx eax,al
call converttable
jmp convert2
 
convert1bpp:
mov ecx,eax
mov edx,7
nextbit:
xor eax,eax
bt ecx,edx
jnc noaddelem
inc eax
noaddelem:
push edx
call converttable
pop edx
dec edx
js convert2
add edi,3
 
add ebp,3
 
jmp nextbit
 
converttable:
shl eax,2
add eax,ebx
mov edx, dword [eax]
; mov dword [edi],edx
mov [ebp],edx
ret
 
bmptoimg_data_area_count=bmptoimg_data_area_count+1
if bmptoimg_data_area_count = 1
; DATA AREA
bmptoimg_soi dd 0
bmptoimg_data_area_bps dd 0
bmptoimg_data_area_dwps dd 0
bmptoimg_data_area_sop dd 0
bmptoimg_data_area_eop dd 0
bmptoimg_data_area_eos dd 0
end if
 
end_bmp:
mov eax,dword [bmp_load_area+18]
mov ebx,dword [bmp_load_area+22]
mov dword [img_dest_area],eax
mov dword [img_dest_area+4],ebx
}
 
; For convert RGB to BGR
COLOR_ORDER equ MENUETOS
 
macro giftoani gifsrc,imgsrc,num_of_frames
{
local hasharea, ReadGIF, nextblock,_null
local globalColor, img_count, cur_info, img_start
local codesize, compsize, bit_count, CC, EOI, Palette
local block_ofs, table_ptr, gifmacend
local no_gc, block_skip, no_comm, noextblock, uselocal
local setPal, filltable, reinit, cycle, zadd, noinc
local notintable, er, zend, nxt, continue, ex, Gif_skipmap
local Gif_get_sym, shift, nextbl, noblock, loop1, exx
local Gif_output, next, loop2
 
_null fix 1000h ; 0x1000
 
; jmp sss
; if defined gif_hash_offset
; else
; hasharea:
; times 4096 dd 0 ;4096
; end if
;sss:
 
mov esi,gifsrc ;“ª § â¥«ì ­  ƒˆ” ä ¨« ¢ ¯ ¬ïâ¨
mov edi,imgsrc ;“ª § â¥«ì ­  ᯨ᮪ ª à⨭®ª
 
if defined gif_hash_offset
mov eax,gif_hash_offset ; ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
else
mov eax,hasharea ; ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
end if
 
call ReadGIF
push ecx
pop dword num_of_frames
jmp gifmacend
 
if defined gif_hash_offset
else
hasharea:
times 4096 dd 0 ;4096
end if
 
ReadGIF:
push esi edi
mov [table_ptr],eax
mov [cur_info],edi
xor eax,eax
mov [globalColor],eax
mov [img_count],eax
inc eax
cmp dword[esi],'GIF8'
jne er ; signature
mov ecx,[esi+0xa]
inc eax
add esi,0xd
mov edi,esi
bt ecx,7
jnc nextblock
mov [globalColor],esi
call Gif_skipmap
nextblock:
cmp byte[edi],0x21
jne noextblock
inc edi
cmp byte[edi],0xf9 ; Graphic Control Ext
jne no_gc
add edi,7
jmp nextblock
no_gc:
cmp byte[edi],0xfe ; Comment Ext
jne no_comm
inc edi
block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
cmp byte[edi],0
jnz block_skip
inc edi
jmp nextblock
no_comm:
cmp byte[edi],0xff ; Application Ext
jne nextblock
add edi,13
jmp block_skip
noextblock:
cmp byte[edi],0x2c ; image beginning
jne er
inc [img_count]
inc edi
mov esi,[cur_info]
xchg esi,edi
movsd
movsd
 
push edi
movzx ecx,word[esi]
inc esi
bt ecx,7
jc uselocal
push [globalColor]
mov edi,esi
jmp setPal
uselocal:
call Gif_skipmap
push esi
setPal:
movzx ecx,byte[edi]
inc ecx
mov [codesize],ecx
dec ecx
pop [Palette]
lea esi,[edi+1]
mov edi,[table_ptr]
xor eax,eax
cld
lodsb ; eax - block_count
add eax,esi
mov [block_ofs],eax
mov [bit_count],8
mov eax,1
shl eax,cl
mov [CC],eax
inc eax
mov [EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16
filltable:
stosd
inc eax
loop filltable
pop edi
mov [img_start],edi
reinit:
mov edx,[EOI]
inc edx
push [codesize]
pop [compsize]
call Gif_get_sym
cmp eax,[CC]
je reinit
call Gif_output
cycle:
movzx ebx,ax
call Gif_get_sym
cmp eax,edx
jae notintable
cmp eax,[CC]
je reinit
cmp eax,[EOI]
je zend
call Gif_output
zadd:
push eax
mov eax,[table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF
jae cycle
inc edx
bsr ebx,edx
cmp ebx,[compsize]
jne noinc
inc [compsize]
noinc:
jmp cycle
notintable:
push eax
mov eax,ebx
call Gif_output
push ebx
movzx eax,bx
call Gif_output
pop ebx eax
jmp zadd
er:
pop edi
jmp ex
zend:
; mov eax,[.cur_info] ; skip offset to next frame
; mov [eax],edi
mov [cur_info],edi
add esi,2
xchg esi,edi
nxt:
cmp byte[edi],0
jnz continue
inc edi
jmp nxt
continue:
cmp byte[edi],0x3b ;read next frame
jne nextblock
xor eax,eax
stosd
mov ecx,[img_count]
ex:
pop edi esi
ret
 
Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
 
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
 
Gif_get_sym:
mov ecx,[compsize]
push ecx
xor eax,eax
shift:
ror byte[esi],1
rcr eax,1
dec [bit_count]
jnz loop1
inc esi
cmp esi,[block_ofs]
jb noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz nextbl
mov eax,[EOI]
sub esi,2
add esp,8
jmp exx
nextbl:
add eax,esi
mov [block_ofs],eax
pop eax
noblock:
mov [bit_count],8
loop1:
loop shift
pop ecx
rol eax,cl
exx:
xor ecx,ecx
ret
 
Gif_output:
push esi eax edx
mov edx,[table_ptr]
next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz next
shl ebx,16
mov bx,[esp]
loop2:
pop ax
 
lea esi,[eax+eax*2]
add esi,[Palette]
 
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsw
movsb
end if
 
loop loop2
pop edx eax esi
ret
 
globalColor dd 1
img_count dd 1
cur_info dd 1 ; image table pointer
img_start dd 1
codesize dd 1
compsize dd 1
bit_count dd 1
CC dd 1
EOI dd 1
Palette dd 1
block_ofs dd 1
table_ptr dd 1
 
gifmacend:
}
 
 
 
macro giftoimg gifsrc,imgsrc
{
local hasharea, ReadGIF, nextblock,_null
local globalColor, img_count, cur_info, img_start
local codesize, compsize, bit_count, CC, EOI, Palette
local block_ofs, table_ptr, gifmacend
local no_gc, block_skip, no_comm, noextblock, uselocal
local setPal, filltable, reinit, cycle, zadd, noinc
local notintable, er, zend, nxt, continue, ex, Gif_skipmap
local Gif_get_sym, shift, nextbl, noblock, loop1, exx
local Gif_output, next, loop2
 
_null fix 0x1000 ; 0x1000
 
mov esi,gifsrc ;“ª § â¥«ì ­  ƒˆ” ä ¨« ¢ ¯ ¬ïâ¨
mov edi,imgsrc ;“ª § â¥«ì ­  ᯨ᮪ ª à⨭®ª
 
if defined gif_hash_offset
mov eax,gif_hash_offset ; ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
else
mov eax,hasharea ; ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
end if
 
call ReadGIF
jmp gifmacend
 
if defined gif_hash_offset
else
hasharea:
times 4096 dd 0 ;4096
end if
 
ReadGIF:
push esi edi
mov [table_ptr],eax
mov [cur_info],edi
xor eax,eax
mov [globalColor],eax
mov [img_count],eax
inc eax
cmp dword[esi],'GIF8'
jne er ; signature
mov ecx,[esi+0xa]
inc eax
add esi,0xd
mov edi,esi
bt ecx,7
jnc nextblock
mov [globalColor],esi
call Gif_skipmap
nextblock:
cmp byte[edi],0x21
jne noextblock
inc edi
cmp byte[edi],0xf9 ; Graphic Control Ext
jne no_gc
add edi,7
jmp nextblock
no_gc:
cmp byte[edi],0xfe ; Comment Ext
jne no_comm
inc edi
block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
cmp byte[edi],0
jnz block_skip
inc edi
jmp nextblock
no_comm:
cmp byte[edi],0xff ; Application Ext
jne nextblock
add edi,13
jmp block_skip
noextblock:
cmp byte[edi],0x2c ; image beginning
jne er
inc [img_count]
inc edi
mov esi,[cur_info]
xchg esi,edi
; movsd
; movsd
 
mov bp,word[esi+4]
movzx ebx,bp
mov [edi],ebx
 
mov bp,word[esi+6]
movzx ebx,bp
mov [edi+4],ebx
 
add edi,8
add esi,8
 
push edi
movzx ecx,word[esi]
inc esi
bt ecx,7
jc uselocal
push [globalColor]
mov edi,esi
jmp setPal
uselocal:
call Gif_skipmap
push esi
setPal:
movzx ecx,byte[edi]
inc ecx
mov [codesize],ecx
dec ecx
pop [Palette]
lea esi,[edi+1]
mov edi,[table_ptr]
xor eax,eax
cld
lodsb ; eax - block_count
add eax,esi
mov [block_ofs],eax
mov [bit_count],8
mov eax,1
shl eax,cl
mov [CC],eax
inc eax
mov [EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16
filltable:
stosd
inc eax
loop filltable
pop edi
mov [img_start],edi
reinit:
mov edx,[EOI]
inc edx
push [codesize]
pop [compsize]
call Gif_get_sym
cmp eax,[CC]
je reinit
call Gif_output
cycle:
movzx ebx,ax
call Gif_get_sym
cmp eax,edx
jae notintable
cmp eax,[CC]
je reinit
cmp eax,[EOI]
je zend
call Gif_output
zadd:
push eax
mov eax,[table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF
jae cycle
inc edx
bsr ebx,edx
cmp ebx,[compsize]
jne noinc
inc [compsize]
noinc:
jmp cycle
notintable:
push eax
mov eax,ebx
call Gif_output
push ebx
movzx eax,bx
call Gif_output
pop ebx eax
jmp zadd
er:
pop edi
jmp ex
zend:
; mov eax,[.cur_info] ; skip offset to next frame
; mov [eax],edi
mov [cur_info],edi
add esi,2
xchg esi,edi
nxt:
cmp byte[edi],0
jnz continue
inc edi
jmp nxt
continue:
; cmp byte[edi],0x3b ;read next frame
; jne nextblock
xor eax,eax
stosd
mov ecx,[img_count]
ex:
pop edi esi
ret
 
Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
 
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
 
Gif_get_sym:
mov ecx,[compsize]
push ecx
xor eax,eax
shift:
ror byte[esi],1
rcr eax,1
dec [bit_count]
jnz loop1
inc esi
cmp esi,[block_ofs]
jb noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz nextbl
mov eax,[EOI]
sub esi,2
add esp,8
jmp exx
nextbl:
add eax,esi
mov [block_ofs],eax
pop eax
noblock:
mov [bit_count],8
loop1:
loop shift
pop ecx
rol eax,cl
exx:
xor ecx,ecx
ret
 
Gif_output:
push esi eax edx
mov edx,[table_ptr]
next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz next
shl ebx,16
mov bx,[esp]
loop2:
pop ax
 
lea esi,[eax+eax*2]
add esi,[Palette]
 
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsw
movsb
end if
 
loop loop2
pop edx eax esi
ret
 
globalColor dd 1
img_count dd 1
cur_info dd 1 ; image table pointer
img_start dd 1
codesize dd 1
compsize dd 1
bit_count dd 1
CC dd 1
EOI dd 1
Palette dd 1
block_ofs dd 1
table_ptr dd 1
 
gifmacend:
}
 
/programs/games/invaders/alien.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/bullet.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/bullet2.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/enemy1.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/enemy2.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/enemy3.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/enemy4.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/enemy5.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/font_capital.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/font_small.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/gameover.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/highscores.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/invaders.asm
0,0 → 1,1408
;=============================================================================;
; Hidnplayr's invaders, Compilable for DexOs and Kolibrios ;
;-----------------------------------------------------------------------------;
; ;
; Copyright (C) hidnplayr 2007. All rights reserved. ;
; ;
; Invaders is distributed in the hope that it will be useful, but WITHOUT ANY ;
; WARRANTY. No author or distributor accepts responsibility to anyone for the ;
; consequences of using it or for whether it serves any particular purpose or ;
; works at all, unless he says so in writing. Refer to the GNU General Public ;
; License (the "GPL") for full details. ;
; Everyone is granted permission to copy, modify and redistribute KolibriOS, ;
; but only under the conditions described in the GPL. A copy of this license ;
; is supposed to have been given to you along with KolibriOS so you can know ;
; your rights and responsibilities. It should be in a file named COPYING. ;
; Among other things, the copyright notice and this notice must be preserved ;
; on all copies. ;
; ;
; see copying.txt ;
; ;
; contact me on hidnplayr@gmail.com ;
; ;
;-----------------------------------------------------------------------------;
 
 
SCREEN_X equ 640
SCREEN_Y equ 480
 
SHIP_X equ 32
SHIP_Y equ 32
 
SHIP_X_POS equ (SCREEN_X-SHIP_X)/2
SHIP_Y_POS equ SCREEN_Y-SHIP_Y-27
 
ENEMY_X equ 32
ENEMY_Y equ 32
 
ALIEN_X equ 48
ALIEN_Y equ 38
ALIEN_Y_POS equ 1
 
BOUNDARY equ 10
MOVEMENT equ 7
 
TRANSPARENCY equ 0x00000000
 
WINDOW_X equ 100
WINDOW_Y equ 100
 
BULLET_X equ 10
BULLET_Y equ 10
 
STARS_ equ 226
STARLEVELS equ 3
 
ENEMY_STARTING_X equ 25
ENEMY_STARTING_Y equ 50
 
BULLETSPEED equ 12
 
SCREEN_X_POS equ 5
SCREEN_Y_POS equ 25
 
gif_hash_offset = gif_hash_area
 
include 'ascgl.inc'
include 'invaders_kolibri.inc'
 
decodegif:
giftoimg gif_bullet,bullet
giftoimg gif_bullet2,bullet2
giftoimg gif_ship,ship
giftoimg gif_enemy1,enemy1
giftoimg gif_enemy2,enemy2
giftoimg gif_enemy3,enemy3
giftoimg gif_enemy4,enemy4
giftoimg gif_enemy5,enemy5
giftoimg gif_alien,alien
giftoimg gif_menu1,menu1
giftoimg gif_menu2,menu2
giftoimg gif_menu3,menu3
giftoimg gif_menu4,menu4
giftoimg gif_logo,logo
giftoimg gif_pause,pause_
giftoimg gif_levelup,levelup
giftoimg gif_gameover,gameover
giftoimg gif_highscore,highscore
giftoimg gif_smallfont,smallfont
giftoimg gif_bigfont,bigfont
giftoimg gif_numbers,numbers
 
call createstars
call drawit
call [drawroutine]
 
mainloop:
 
cmp byte[status],3 ; if game is paused,...
je waitfordraw
 
call drawit
call [drawroutine]
call checkbullet
 
waitfordraw:
 
call waitandgetkey ;;;
test ah,ah
jz mainloop
 
cmp byte[status],1 ;
jne nogame
 
cmp ah, KEY_RIGHT
jnz noright
cmp dword[ship_x],SCREEN_X-SHIP_X-BOUNDARY
jge mainloop
add dword[ship_x],MOVEMENT
 
jmp mainloop
 
noright:
cmp ah, KEY_LEFT
jnz noleft
cmp dword[ship_x],BOUNDARY
jle mainloop
sub dword[ship_x],MOVEMENT
 
jmp mainloop
 
noleft:
cmp ah, KEY_UP
jnz noup
 
cmp dword[bullet_y],1
jg mainloop
 
mov eax,dword[ship_x]
add eax,(SHIP_X-BULLET_X)/2
mov dword[bullet_x],eax
mov dword[bullet_y],SHIP_Y_POS;-BULLET_Y
 
jmp mainloop
 
noup:
cmp ah,KEY_P
jnz no_pause1
 
mov byte[status],3
aimgtoimg pause_,150,180,vscreen,TRANSPARENCY,0
call [drawroutine]
 
jmp mainloop
 
no_pause1:
 
nogame:
cmp byte[status],0
jne nomenu
 
cmp ah, KEY_DOWN
jnz no_down
 
cmp byte[menu],3
jne no_menu1
 
mov byte[menu],0
jmp nomenu
 
no_menu1:
inc byte[menu]
 
no_down:
cmp ah, KEY_UP
jnz no_up
 
cmp byte[menu],0
jne no_menu0
 
mov byte[menu],3
jmp nomenu
 
no_menu0:
dec byte[menu]
 
no_up:
 
cmp ah, KEY_ESC
je exit
 
no_esc:
cmp ah, KEY_ENTER
jnz no_enter
 
exemenu:
cmp byte[menu],0 ;start
jne exemenu1
 
new_game:
mov dword[score],0
mov eax,[score]
call convertscore
 
mov esi, level1
mov word[levelnumb],'01'
load_level:
mov byte[enemy_speed],1
mov dword[enemy_x], ENEMY_STARTING_X
mov dword[enemy_y], ENEMY_STARTING_Y
 
mov edi, enemy_table
mov ecx, 5
rep movsd
 
mov byte[status],1
 
jmp mainloop
 
exemenu1:
cmp byte[menu],1 ;about
jne exemenu2
mov byte[status],4
jmp mainloop
 
exemenu2:
cmp byte[menu],2 ;highscores
jne exemenu3
mov byte[status],5
call load_highscores
jmp mainloop
 
exemenu3:
cmp byte[menu],3 ;exit
je exit
 
no_enter:
nomenu:
cmp byte[status],3
jne nopause
 
cmp ah, KEY_P
jnz nopause
 
mov byte[status],1
 
nopause:
cmp byte[status],6
jne nolevelup
 
cmp ah, KEY_ENTER
jne nolevelup
 
inc byte[level]
 
; cmp byte[level],5
; jne @f
; mov byte[level],0
 
;@@:
inc byte[levelnumb+1]
cmp byte[levelnumb+1],'9'
jle @f
mov byte[levelnumb+1],'0'
inc byte[levelnumb]
 
@@:
mov eax,20
mov ah,byte[level]
and ah,7
mul ah
add eax,level1
mov esi,eax
jmp load_level
 
nolevelup:
cmp byte[status],7
jne nohighscore
 
cmp ah, KEY_ENTER
jne @f
 
call load_highscores
mov eax,dword[score]
mov ebx,gif_hash_area+140
.findscore:
cmp ebx,gif_hash_area+100
je .topscore
sub ebx,4
cmp eax,dword[ebx]
jg .findscore
 
.topscore:
mov esi,name
mov edi,gif_hash_area
mov ecx,10
rep movsb
 
mov eax,dword[score]
mov dword[gif_hash_area+100],eax
 
call save_highscores
mov byte[status],5
 
@@:
cmp ah,14
jne @f
 
cmp byte[namepos],0
je @f
 
dec byte[namepos]
movzx ebx,byte[namepos]
add ebx,name
mov byte[ebx],0x11 ; this is a character we dont print
 
@@:
cmp byte[namepos],10
jge nohighscore
 
cmp al,'0'
jl nohighscore
cmp al,'9'
jle @f
 
cmp al,'z'
jg nohighscore
cmp al,'a'
jge @f
 
cmp al,'Z'
jg nohighscore
cmp al,'A'
jl nohighscore
@@:
 
movzx ebx,byte[namepos]
add ebx,name
mov byte[ebx],al
 
inc byte[namepos]
 
jmp mainloop
 
nohighscore:
cmp byte[status],2 ; gameover
jne nogameover
 
cmp ah, KEY_ENTER
jne nogameover
 
; test if score is high enough to put in highscore list...
mov byte[status],7
 
jmp mainloop
 
nogameover:
cmp byte[status],0
je mainloop
 
cmp ah, KEY_ESC
jnz mainloop
 
mov byte[status],0
mov word[intro],0
 
jmp mainloop
 
;----------------------------------------------------;
; Drawing routine: create image in buffer ;
;----------------------------------------------------;
drawit:
mov eax,0x00000000
call fillscreen
call drawstars
 
cmp byte[status],1
jne @f
 
call drawbullet
call drawenemys ; Draw the enemy's to buffer
aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0 ; Draw the ship to buffer
 
mov esi,scoretext
mov ebx,0
mov ecx,SCREEN_Y-24
call printtext
 
mov esi,leveltext
mov ebx,300
call printtext
 
ret
 
@@:
cmp byte[status],2 ; game over, dude !
jne @f
 
aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0 ; Draw the ship to buffer
 
mov esi,scoretext
mov ebx,0
mov ecx,SCREEN_Y-24
call printtext
 
mov esi,leveltext
mov ebx,300
call printtext
aimgtoimg gameover,150,180,vscreen,TRANSPARENCY,0
 
ret
 
@@:
cmp byte[status],4 ; about screen
jne @f
 
mov esi,msgAbout
mov ebx,50
mov ecx,100
call printtext
 
ret
 
@@:
cmp byte[status],6 ; level up!
jne @f
aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0 ; Draw the ship to buffer
 
mov esi,scoretext
mov ebx,0
mov ecx,SCREEN_Y-24
call printtext
 
mov esi,leveltext
mov ebx,300
call printtext
aimgtoimg levelup,150,180,vscreen,TRANSPARENCY,0
 
ret
 
@@:
cmp byte[status],0 ; menu!
jne @f
 
aimgtoimg logo,50,80,vscreen,TRANSPARENCY,0
 
 
cmp byte[menu],0
jne .menu_0
aimgtoimg menu1,30,200,vscreen,TRANSPARENCY,1
jmp .menu_1
.menu_0:
aimgtoimg menu1,30,200,vscreen,TRANSPARENCY,0
.menu_1:
cmp byte[menu],1
jne .menu_2
aimgtoimg menu2,80,250,vscreen,TRANSPARENCY,1
jmp .menu_3
.menu_2:
aimgtoimg menu2,80,250,vscreen,TRANSPARENCY,0
.menu_3:
cmp byte[menu],2
jne .menu_4
aimgtoimg menu3,120,300,vscreen,TRANSPARENCY,1
jmp .menu_5
.menu_4:
aimgtoimg menu3,120,300,vscreen,TRANSPARENCY,0
.menu_5:
cmp byte[menu],3
jne .menu_6
aimgtoimg menu4,150,350,vscreen,TRANSPARENCY,1
jmp .menu_7
.menu_6:
aimgtoimg menu4,150,350,vscreen,TRANSPARENCY,0
.menu_7:
 
cmp word[intro],200
je .menu_75
inc word[intro]
 
.menu_75:
cmp word[intro],0
jl .menu_8
aimgtoimg enemy1,390,180,vscreen,TRANSPARENCY,0
 
cmp word[intro],15
jl .menu_8
mov esi,points_50
mov ebx,470
mov ecx,180
call printtext
 
cmp word[intro],30
jl .menu_8
aimgtoimg enemy2,390,220,vscreen,TRANSPARENCY,0
 
cmp word[intro],45
jl .menu_8
mov esi,points_100
mov ebx,450
mov ecx,220
call printtext
 
cmp word[intro],60
jl .menu_8
aimgtoimg enemy3,390,260,vscreen,TRANSPARENCY,0
 
cmp word[intro],75
jl .menu_8
mov esi,points_150
mov ebx,450
mov ecx,260
call printtext
 
cmp word[intro],90
jl .menu_8
aimgtoimg enemy4,390,300,vscreen,TRANSPARENCY,0
 
cmp word[intro],105
jl .menu_8
mov esi,points_200
mov ebx,450
mov ecx,300
call printtext
 
cmp word[intro],120
jl .menu_8
aimgtoimg enemy5,390,340,vscreen,TRANSPARENCY,0
 
cmp word[intro],135
jl .menu_8
mov esi,points_250
mov ebx,450
mov ecx,340
call printtext
 
cmp word[intro],150
jl .menu_8
aimgtoimg alien,380,380,vscreen,TRANSPARENCY,0
 
cmp word[intro],165
jl .menu_8
mov esi,points_1000
mov ebx,430
mov ecx,380
call printtext
 
.menu_8:
ret
@@:
cmp byte[status],5 ;highscorelist
jne @f
 
aimgtoimg highscore,60,40,vscreen,TRANSPARENCY,0
 
mov ebx,100 ; print names
mov ecx,120
mov esi,gif_hash_area
call printtext
 
mov edi,gif_hash_area+100 ; print scores
mov esi,scorenumb
mov ebx,420
mov ecx,120
 
.highscoreloop:
mov eax,[edi]
push ecx
call convertscore
pop ecx
push esi
call printtext
pop esi
add ecx,26
add edi,4
cmp edi,gif_hash_area+140
jl .highscoreloop
 
@@:
cmp byte[status],7 ;highscore
jne @f
 
aimgtoimg highscore,60,40,vscreen,TRANSPARENCY,0
 
mov ebx,60
mov ecx,200
mov esi,entername
call printtext
 
mov ebx,250
mov ecx,250
mov esi,name
call printtext
 
mov esi,scoretext
mov ebx,0
mov ecx,SCREEN_Y-24
call printtext
 
mov esi,leveltext
mov ebx,300
call printtext
@@:
 
ret
 
 
drawenemys:
; check if direction should change
test byte[enemy_d],2
jz @f
 
add dword[enemy_y],5
 
mov eax,[enemy_y]
shr eax,5
add al, byte[level]
mov byte[enemy_speed],al
 
and byte[enemy_d],1
 
@@:
; move the aliens to left or right
movzx eax,byte[enemy_speed]
test byte[enemy_d],1
jz other_dir
 
sub dword[enemy_x],eax
jmp no_other_dir
 
other_dir:
add dword[enemy_x],eax
no_other_dir:
 
; initialization
mov byte[alldeadb],1
mov edi,enemy_table
mov eax,dword[enemy_x]
mov dword[current_enemy_x],eax
mov eax,dword[enemy_y]
mov dword[current_enemy_y],eax
 
loopit:
cmp byte[edi],1
je drawenemy1
 
cmp byte[edi],2
je drawenemy2
 
cmp byte[edi],3
je drawenemy3
 
cmp byte[edi],4
je drawenemy4
 
cmp byte[edi],5
je drawenemy5
 
jmp dead_alien
 
drawenemy1:
mov byte[alldeadb],0
pusha
aimgtoimg enemy1,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0
popa
 
jmp checknext
 
drawenemy2:
mov byte[alldeadb],0
pusha
aimgtoimg enemy2,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0
popa
 
jmp checknext
 
drawenemy3:
mov byte[alldeadb],0
pusha
aimgtoimg enemy3,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0
popa
 
jmp checknext
 
drawenemy4:
mov byte[alldeadb],0
pusha
aimgtoimg enemy4,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0
popa
 
jmp checknext
 
drawenemy5:
mov byte[alldeadb],0
pusha
aimgtoimg enemy5,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0
popa
 
; jmp checknext
 
checknext:
cmp byte[enemy_d],2
jge dont_change_dir
 
movzx eax,byte[enemy_speed]
 
cmp byte[enemy_d],0
jbe change_dir
 
cmp dword[current_enemy_x],eax
jg dont_change_dir
 
mov byte[enemy_d],2
 
jmp dont_change_dir
 
change_dir:
mov ebx, SCREEN_X-ENEMY_X
sub ebx, eax
cmp dword[current_enemy_x],ebx
jl dont_change_dir
 
mov byte[enemy_d],3
 
dont_change_dir:
cmp dword[current_enemy_y],SHIP_Y_POS-ENEMY_Y-BOUNDARY
je gameover_
 
dead_alien:
cmp edi,enemy_table+20
jge alldead
 
inc edi
add dword[current_enemy_x],ENEMY_X+BOUNDARY
mov eax,dword[current_enemy_x]
sub eax,dword[enemy_x]
cmp eax,5*(ENEMY_X+BOUNDARY)
jl no_newline
 
sub dword[current_enemy_x],5*(ENEMY_X+BOUNDARY)
add dword[current_enemy_y],ENEMY_Y+BOUNDARY
no_newline:
jmp loopit
 
alldead:
cmp byte[alldeadb],0
je enemy_end
 
mov byte[status],6
jmp mainloop
 
enemy_end:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cmp dword[alien_x],5 ;
jge @f
 
call random_generator
cmp eax,0xffffffff/50 ; one out of 500 chances that it appears during this frame
jl alien_end
 
mov dword [alien_x],SCREEN_X-ALIEN_X
 
@@:
push eax
 
mov eax, SCREEN_X ; mov eax, SCREEN_X
sub eax, dword [alien_x]
 
cmp eax, ALIEN_X
jle @f
mov eax, ALIEN_X
@@:
 
getimg alien,0,0,10,ALIEN_Y,alienpiece
aimgtoimg alien,dword [alien_x],ALIEN_Y_POS,vscreen,TRANSPARENCY,0
sub dword[alien_x],5 ;
;
pop eax ;
;
alien_end: ;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ret
 
drawbullet:
cmp dword[bullet_y],BULLETSPEED
jl nobullet
sub dword[bullet_y],BULLETSPEED
 
aimgtoimg bullet,dword[bullet_x],dword[bullet_y],vscreen,TRANSPARENCY,0
 
nobullet:
ret
 
checkbullet:
cmp dword[bullet_y],BULLETSPEED ; does the bullet hit top of the screen?
jle hidebullet ; yes, hide bullet
 
; ; check if bullet is inside the enemy field (you can disble this if you want)
; mov eax,dword[enemy_y]
; cmp dword[bullet_y],eax
; jl nohit
;
; add eax,4*(ENEMY_Y+BOUNDARY)
; cmp dword[bullet_y],eax
; jg nohit
;
; mov eax,dword[enemy_x]
; cmp dword[bullet_x],eax
; jl nohit
;
; add eax,5*(ENEMY_Y+BOUNDARY)
; cmp dword[bullet_x],eax
; jg nohit
;
mov edi,enemy_table
mov eax,dword[enemy_x]
mov dword[current_enemy_x],eax
mov eax,dword[enemy_y]
mov dword[current_enemy_y],eax
 
check:
cmp byte[edi],0 ; is the enemy at this position alive?
je nextcheck ; no, try next enemy
; check if bullet hits current enemy
 
mov eax,dword[current_enemy_y] ; move the enemy y position into eax
cmp dword[bullet_y],eax ; is the bullet's y position less than eax (enemy y pos)
jl nextcheck ; yes, bullet can't be colliding, check next enemy
 
add eax,ENEMY_Y ; add the width of the enemy to the enemy's y position (wich is still stored in eax)
cmp dword[bullet_y],eax ; is the bullet's y position greater than eax (the end of the enemy)
jg nextcheck ; yes, bullet can't be colliding, check next enemy
 
mov eax,dword[current_enemy_x] ; now do the same but for the x positions
cmp dword[bullet_x],eax ;
jl nextcheck ;
;
add eax,ENEMY_Y ;
cmp dword[bullet_x],eax ;
jg nextcheck ;
 
jmp hit
 
nextcheck:
inc edi
add dword[current_enemy_x],ENEMY_X+BOUNDARY
mov eax,dword[current_enemy_x]
sub eax,dword[enemy_x]
cmp eax,5*(ENEMY_X+BOUNDARY)
jl no_newline_
 
sub dword[current_enemy_x],5*(ENEMY_X+BOUNDARY)
add dword[current_enemy_y],ENEMY_Y+BOUNDARY
no_newline_:
 
cmp edi,enemy_table+20 ; is this the last enemy?
jg nohit ; yes, none of them was hit
jmp check ; no, check if enemy is alive and draw it
 
hit:
movzx ebx,byte[edi] ; mov the enemy number onto ebx
add dword[score],ebx ; add this number to the score dword
 
mov eax,[score]
call convertscore
 
mov byte[edi],0 ; hide the enemy
hidebullet:
mov dword[bullet_y],1 ; mov the bullet to top of screen (hide it)
jmp noalienhit
 
nohit:
mov eax,[alien_x] ; check if we hit the big alien in the ufo
cmp [bullet_x],eax
jl noalienhit
add eax,ALIEN_X-BULLET_X
cmp [bullet_x],eax
jg noalienhit
cmp [bullet_y],ALIEN_Y_POS+ALIEN_Y
jg noalienhit
 
add dword[score],100/5
mov eax,[score]
call convertscore
 
mov [alien_x],0
 
noalienhit:
 
ret
 
convertscore:
test al,1
jz .1
mov byte[scorenumb+5],'5'
jmp .2
.1:
mov byte[scorenumb+5],'0'
.2:
shr eax,1
mov ecx,10
xor edx,edx
div ecx
add dl,'0'
mov byte[scorenumb+4],dl
xor edx,edx
div ecx
add dl,'0'
mov byte[scorenumb+3],dl
xor edx,edx
div ecx
add dl,'0'
mov byte[scorenumb+2],dl
xor edx,edx
div ecx
add dl,'0'
mov byte[scorenumb+1],dl
xor edx,edx
div ecx
add dl,'0'
mov byte[scorenumb+0],dl
 
ret
 
 
fillscreen: ; eax - screen color ( 0x00RRGGBB )
 
mov edi,vscreen+8
cld
mov ecx,SCREEN_X*SCREEN_Y
.lab1:
mov [edi],eax
add edi,3
loop .lab1
 
ret
 
 
printtext:
push ebx
 
loadbyte:
movzx eax, byte[esi]
test eax, eax
jnz checkbyte
 
pop ebx
 
ret
 
checkbyte:
cmp al,13
je nextline
cmp al,' '
je space
 
cmp al,'0'
jl nextchar
cmp al,'9'
jle usenumbers
 
cmp al,'z'
jg nextchar
cmp al,'a'
jge usesmallfont
 
cmp al,'Z'
jg nextchar
cmp al,'A'
jge usebigfont
 
jmp nextchar
 
 
usesmallfont:
mov edx,eax
sub edx,'a'
mov eax,12
mul edx
mov edx,eax
 
pusha
getimg smallfont,0,edx,20,12,char
popa
 
pusha
add ecx,4
aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0
popa
 
add ebx,20
 
jmp nextchar
 
usebigfont:
mov edx,eax
sub edx,'A'
mov eax,20
mul edx
mov edx,eax
 
pusha
getimg bigfont,0,edx,28,20,char
popa
 
pusha
aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0
popa
 
add ebx,28
 
jmp nextchar
 
usenumbers:
mov edx,eax
sub edx,'0'
mov eax,20
mul edx
mov edx,eax
 
pusha
getimg numbers,0,edx,16,20,char
popa
 
pusha
aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0
popa
 
add ebx,20
 
jmp nextchar
 
space:
add ebx,20
 
nextchar:
inc esi
 
jmp loadbyte
 
nextline:
pop ebx
push ebx
add ecx,26
inc esi
 
jmp loadbyte
 
gameover_:
mov byte[status],2
 
ret
 
 
drawstars:
mov esi, STARS
 
.loop:
cmp esi, STARS+(STARS_*5)
jge .done
 
movzx eax, byte[esi] ; z (speed, brightness)
movzx ebx, word[esi+1] ; x
movzx ecx, word[esi+3] ; y
add bx , ax
cmp bx , SCREEN_X
jl .moveit
 
xor ebx,ebx
inc ebx
 
call random_generator
mov ecx, [generator]
and ecx, SCREEN_Y-1
inc ecx
mov word[esi+3],cx
 
call random_generator
and al, STARLEVELS
test al,al
jnz @f
inc al
@@:
mov [esi],al
 
.moveit:
mov word [esi+1],bx
 
movzx eax, byte[esi]
inc eax
mov edx, 0xff/(STARLEVELS+1)
mul edx
 
mov ah,al
shl eax,8
mov al,ah
mov ebp, eax
 
mov eax, SCREEN_X
mul ecx
add eax, ebx
mov edx, 3
mul edx
 
cmp eax, SCREEN_X*SCREEN_Y*3
jg @f
add eax, vscreen+8
and dword[eax],0xff000000
or dword[eax],ebp
@@:
 
add esi, 5
jmp .loop
.done:
 
ret
 
 
createstars:
 
mov ebx, STARS
.loop:
cmp ebx, STARS+(STARS_*5)
jge .done
 
call random_generator
and al, STARLEVELS
test al,al
jnz @f
inc al
@@:
mov byte[ebx],al
 
call random_generator
and eax, SCREEN_X-1
inc eax
mov word[ebx+1],ax
 
call random_generator
and eax, SCREEN_Y-1
inc eax
mov word[ebx+3],ax
 
add ebx, 5
jmp .loop
.done:
 
ret
 
 
random_generator: ; (pseudo random, actually :)
 
xor eax,[generator]
imul eax,214013
xor eax,0xdeadbeef
rol eax,9
mov [generator],eax
ror eax,16
and eax,0x7fff
 
ret
 
 
 
 
level1:
db 4,4,4,4,4
db 3,3,3,3,3
db 2,2,2,2,2
db 1,1,1,1,1
 
level2:
db 4,1,3,1,4
db 4,3,2,3,4
db 0,4,1,4,0
db 0,0,2,0,0
 
level3:
db 1,5,5,5,1
db 1,2,2,2,1
db 3,1,2,1,3
db 4,3,1,3,4
 
level4:
db 4,5,2,5,4
db 5,3,3,3,5
db 4,5,4,5,4
db 1,5,5,5,1
 
level5:
db 5,4,3,4,5
db 5,4,4,4,5
db 4,5,4,5,4
db 3,5,1,5,3
 
level6:
db 1,2,5,4,5
db 5,4,5,2,1
db 1,2,5,4,5
db 1,1,5,1,1
 
level7:
db 1,2,3,2,1
db 1,3,3,3,1
db 3,4,3,4,3
db 5,5,5,5,5
 
level8:
db 1,2,3,4,5
db 3,5,3,5,4
db 4,2,3,2,3
db 5,4,3,2,1
 
enemy_table:
db 0,0,0,0,0
db 0,0,0,0,0
db 0,0,0,0,0
db 0,0,0,0,0
 
 
msg1 db 'Vesa mode not supported',13,'Press any key to exit.',13,0
msgAbout db 'Hidnplayrs invaders',13,'DexOS version',13,13,'released under GPL',13,'make this game better',13,'if you want to',0
msgdone db 'You have saved the planet!',0
entername db 'Enter your name highscorer!',0
highscorefile db 'invaders.dat',0
points_50 db '5 pt',0
points_100 db '10 pt',0
points_150 db '15 pt',0
points_200 db '20 pt',0
points_250 db '25 pt',0
points_1000 db '100 pt',0
ship_x dd SHIP_X_POS
enemy_x dd 0
enemy_y dd 0
enemy_d db 0
current_enemy_x dd 0
current_enemy_y dd 0
bullet_x dd 0
bullet_y dd 1
score dd 0
alldeadb db 0
status db 0 ; status: 0=menu 1=game 2=gameover 3=paused 4=about 5=highscorelist 6=levelup 7=highscore...
menu db 0 ; menu: 0=start 1=about 2=highscores 3=exit...
generator dd 0x45dd4d15
alien_x dd 0
drawroutine dd 0
returnaddr dd 0
intro dw 0
scoretext db 'score '
scorenumb db 0,0,0,0,0,0,0
leveltext db 'level '
levelnumb db 0,0,0
lives db 0
level db 1
enemy_speed db 1
namepos db 0
name db 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x00
 
 
gif_bullet file 'bullet2.gif'
rb 4
 
gif_bullet2 file 'bullet2.gif'
rb 4
 
gif_ship file 'ship.gif'
rb 4
 
gif_enemy1 file 'enemy1.gif'
rb 4
 
gif_enemy2 file 'enemy2.gif'
rb 4
 
gif_enemy3 file 'enemy3.gif'
rb 4
 
gif_enemy4 file 'enemy4.gif'
rb 4
 
gif_enemy5 file 'enemy5.gif'
rb 4
 
gif_alien file 'alien.gif'
rb 4
 
gif_menu1 file 'menu1.gif'
rb 4
 
gif_menu2 file 'menu2.gif'
rb 4
 
gif_menu3 file 'menu3.gif'
rb 4
 
gif_menu4 file 'menu4.gif'
rb 4
 
gif_logo file 'logo.gif'
rb 4
 
gif_pause file 'pause.gif'
rb 4
 
gif_highscore file 'highscores.gif'
rb 4
 
gif_smallfont file 'font_small.gif'
rb 4
 
gif_bigfont file 'font_capital.gif'
rb 4
 
gif_numbers file 'numbers.gif'
rb 4
 
gif_levelup file 'nextlevel.gif'
rb 4
 
gif_gameover file 'gameover.gif'
rb 4
 
vscreen:
dd SCREEN_X
dd SCREEN_Y
rb SCREEN_X*SCREEN_Y*3+10
 
IM_END:
 
STARS:
rb STARS_*5
 
bullet:
rb BULLET_X*BULLET_Y*3+8+10
 
bullet2:
rb BULLET_X*BULLET_Y*3+8+10
 
ship:
rb SHIP_X*SHIP_Y*3+10
 
enemy1:
rb ENEMY_X*ENEMY_Y*3+10
 
enemy2:
rb ENEMY_X*ENEMY_Y*3+10
 
enemy3:
rb ENEMY_X*ENEMY_Y*3+10
 
enemy4:
rb ENEMY_X*ENEMY_Y*3+10
 
enemy5:
rb ENEMY_X*ENEMY_Y*3+10
 
alien:
rb ALIEN_X*ALIEN_Y*3+10
 
menu1:
rb 220*18*3+10
 
menu2:
rb 135*18*3+10
 
menu3:
rb 245*18*3+10
 
menu4:
rb 110*18*3+10
 
logo:
rb 40*540*3+10
 
pause_:
rb 40*320*3+10
 
levelup:
rb 40*320*3+10
 
gameover:
rb 40*320*3+10
 
highscore:
rb 40*530*3+10
 
smallfont:
rb 20*312*3+10
 
bigfont:
rb 28*520*3+10
 
numbers:
rb 16*200*3+10
 
char:
rb 28*20*3+20 ; biggest char's are 28x20
 
alienpiece:
rb ALIEN_X*ALIEN_Y*3+20
 
gif_hash_area:
rd 4096+1 ;hash area size for unpacking GIF
 
I_END:
 
;include 'dex.inc'
 
/programs/games/invaders/invaders.dat
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/invaders_kolibri.inc
0,0 → 1,108
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd IM_END ; size of image
dd I_END+1000 ; memory for app
dd I_END+1000 ; esp
dd 0x0 , 0x0 ; I_Param , I_Icon
 
 
KEY_RIGHT equ 179
KEY_LEFT equ 176
KEY_UP equ 178
KEY_P equ 'p'
KEY_DOWN equ 177
KEY_ENTER equ 13
KEY_ESC equ 27
 
START:
mov [drawroutine], draw_picture_kolibri
call draw_window
jmp decodegif
 
draw_picture_kolibri:
 
mov eax,7 ; Draw buffer to screen
mov ebx,vscreen+8
mov ecx,SCREEN_X*65536+SCREEN_Y
mov edx,SCREEN_X_POS*65536+SCREEN_Y_POS
int 0x40
 
ret
 
waitandgetkey:
 
mov eax, 5
mov ebx, 1
int 0x40
 
mov eax, 11 ; check for event (no wait)
int 0x40
 
cmp eax,1 ; redraw request ?
je red
cmp eax,2 ; key in buffer ?
je key
cmp eax,3 ; button in buffer ?
je button
 
xor ax,ax
 
ret
 
red: ; redraw
call draw_window
 
jmp waitandgetkey
 
key: ; key
mov eax,2 ; read it
int 0x40
 
mov al, ah
 
ret
 
button: ; button
mov eax,17 ; get id
int 0x40
 
cmp ah,1 ; button id=1 ?
jne noclose
 
exit:
mov eax,-1 ; close this program
int 0x40
noclose:
 
jmp waitandgetkey
 
 
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,WINDOW_X*65536+10+SCREEN_X ; [x start] *65536 + [x size]
mov ecx,WINDOW_Y*65536+30+SCREEN_Y ; [y start] *65536 + [y size]
mov edx,0x04000000 ; color of work area RRGGBB,8->color gl
mov esi,0x805080d0 ; color of grab bar RRGGBB,8->color gl
mov edi,0x005080d0 ; color of frames RRGGBB
int 0x40
 
call [drawroutine]
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
 
ret
 
load_highscores:
ret
 
save_highscores:
ret
/programs/games/invaders/logo.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/menu1.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/menu2.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/menu3.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/menu4.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/nextlevel.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/numbers.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/pause.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/ship.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/invaders/.
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property