/programs/demos/3dcube2/trunk/3DCUBE2.ASM |
---|
0,0 → 1,691 |
; |
; 3D POLYGONAL CUBE - ASCL |
; |
; Pavlushin Evgeni |
; mail: waptap@mail.ru site: www.deck4.narod.ru |
; |
; Create on base 3D test sample |
; Mikolaj Felix mfelix@polbox.com |
; |
use32 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd I_END ; size of image |
dd 0x30000 ; memory for app |
dd 0x30000 ; esp |
dd 0x0 , 0x0 ; I_Param , I_Icon |
MAX_POINTS equ 8 |
MAX_TRIANGLES equ 12 |
SCREEN_X equ 320 |
SCREEN_Y equ 200 |
include 'lang.inc' |
include 'ascl.inc' |
include 'ascgl.inc' |
include 'macros.inc' |
START: |
call draw_window |
call init_sin_cos |
still: |
; mov eax,23 ; wait for system event with 10 ms timeout |
; mov ebx,1 ; wait 10 ms, then continue |
; int 0x40 |
mov eax,11 |
int 0x40 |
dec eax |
; cmp eax,1 ; window redraw request ? |
jz red |
dec eax |
; cmp eax,2 ; key in buffer ? |
jz key |
dec eax |
; cmp eax,3 ; button in buffer ? |
jz button |
fps 280,8,cl_White,cl_Black |
main_loop: |
mov esi,object |
mov edi,object_rotated |
mov ecx,MAX_POINTS*3 |
cld |
rep movsw |
mov esi,angle_x |
mov edi,object_rotated |
mov ecx,MAX_POINTS |
call rotate_points |
mov esi,object_rotated |
mov edi,object_translated |
mov ecx,MAX_POINTS |
call translate_points |
call draw_faces |
call clear_screen_buffer |
add [angle_x],2 |
add [angle_y],3 |
add [angle_z],1 |
jmp still |
red: |
call draw_window |
jmp still |
key: |
mov eax,2 |
int 0x40 |
jmp still |
button: |
mov eax,17 |
int 0x40 |
cmp ah,1 |
jne still |
exit: |
mov eax,-1 |
int 0x40 |
;Draw window |
draw_window: |
mov eax,12 ;Start |
mov ebx,1 |
int 0x40 |
mov eax,0 ;Draw window |
mov ebx,100*65536+(SCREEN_X+9) ;x start*65536+x size |
mov ecx,100*65536+(SCREEN_Y+26) ;y start*65536+y size |
mov edx,0x03000000 ;0x03 use skinned window |
int 0x40 |
mov eax,4 ;Out Text |
mov ebx,8*65536+8 ;x start*65536+y start |
mov ecx,0x00ffffff ;color White |
mov edx,head_label |
mov esi,hl_end-head_label |
int 0x40 |
mov eax,12 ;End |
mov ebx,2 |
int 0x40 |
ret |
head_label: db "3D TEST SAMPLE FOR MENUETOS" |
hl_end: |
; Draw faces procedure |
draw_faces: |
mov esi,link |
mov ecx,MAX_TRIANGLES |
df_draw: |
push ecx |
mov ecx,3 |
mov edi,@@tx1 ;bp |
df_get_point: |
xor bh,bh |
mov bl,byte [esi] |
shl bx,2 |
mov ax,word [object_translated+bx] |
mov word [edi],ax |
mov ax,word [object_translated+bx+2] |
mov word [edi+2],ax |
inc esi |
add edi,4 |
dec ecx |
jnz df_get_point |
mov ax,[@@ty1] |
sub ax,[@@ty3] |
mov bx,[@@tx2] |
sub bx,[@@tx1] |
imul bx |
shl edx,16 |
mov dx,ax |
push edx |
mov ax,[@@tx1] |
sub ax,[@@tx3] |
mov bx,[@@ty2] |
sub bx,[@@ty1] |
imul bx |
shl edx,16 |
mov dx,ax |
pop ebx |
sub ebx,edx |
or ebx,ebx |
jge df_next |
xor ah,ah |
mov al,byte [si] |
mov [@@xcol],ax |
call filled_triangle |
df_next: |
inc si |
pop ecx |
dec ecx |
jnz df_draw |
ret |
;modify |
;include graphlib.asm |
clear_screen_buffer: |
;outscrbuf |
mov ebx,scrbuf |
mov ecx,SCREEN_X*65536+SCREEN_Y |
mov edx,5*65536+22 |
mov ax,7 |
int 0x40 |
;White background |
mov edi,scrbuf |
mov ecx,(SCREEN_X*SCREEN_Y*3)/4 |
mov eax,0xffffffff |
cld |
rep stosd |
ret |
;include triangle.asm |
; Mikolaj Felix 14/5/2001 |
; mfelix@polbox.com |
;filled trangle procedure |
@@tx1 dw 0 |
@@ty1 dw 0 |
@@tx2 dw 0 |
@@ty2 dw 0 |
@@tx3 dw 0 |
@@ty3 dw 0 |
@@xcol dw 0 |
@@dx12 dw 0 |
@@dx13 dw 0 |
@@dx23 dw 0 |
filled_triangle: |
mov ax,[@@xcol] ;trnsforming color |
mov bl,al ;byte bbbggrrx |
mov dl,al ;to 3 byte |
mov dh,al ;bbbxxxxx ggxxxxxx rrxxxxxx |
and dh,00000001b |
and al,11100000b |
and bl,00011000b |
and dl,00000110b |
shl bl,3 |
shl dl,5 |
cmp dh,1 |
jne no_bitup |
or al,00011111b |
or bl,00111111b |
or dl,00111111b |
no_bitup: |
shl eax,8 ;puck colors |
mov al,bl |
shl eax,8 |
mov al,dl |
mov dword [@@rgb],eax |
mov eax,0 ; for 16 bit instructions |
mov ax,[@@ty1] |
cmp ax,[@@ty3] |
jb ft_check1 |
xchg ax,[@@ty3] |
mov [@@ty1],ax |
mov ax,[@@tx1] |
xchg ax,[@@tx3] |
mov [@@tx1],ax |
ft_check1: |
mov ax,[@@ty2] |
cmp ax,[@@ty3] |
jb ft_check2 |
xchg ax,[@@ty3] |
mov [@@ty2],ax |
mov ax,[@@tx2] |
xchg ax,[@@tx3] |
mov [@@tx2],ax |
ft_check2: |
mov ax,[@@ty1] |
cmp ax,[@@ty2] |
jb ft_check3 |
xchg ax,[@@ty2] |
mov [@@ty1],ax |
mov ax,[@@tx1] |
xchg ax,[@@tx2] |
mov [@@tx1],ax |
ft_check3: |
mov bx,[@@ty2] |
sub bx,[@@ty1] |
jnz ft_dx12_make |
mov [@@dx12],word 0 |
jmp ft_dx12_done |
ft_dx12_make: |
mov ax,[@@tx2] |
sub ax,[@@tx1] |
shl ax,7 |
cwd |
idiv bx |
mov [@@dx12],ax ; dx12 = (x2-x1)/(y2-y1) |
ft_dx12_done: |
mov bx,[@@ty3] |
sub bx,[@@ty1] |
jnz ft_dx13_make |
mov [@@dx13],word 0 |
jmp ft_dx13_done |
ft_dx13_make: |
mov ax,[@@tx3] |
sub ax,[@@tx1] |
shl ax,7 |
cwd |
idiv bx |
mov [@@dx13],ax ; dx13 = (x3-x1)/(y3-y1) |
ft_dx13_done: |
mov bx,[@@ty3] |
sub bx,[@@ty2] |
jnz ft_dx23_make |
mov [@@dx23],word 0 |
jmp ft_dx23_done |
ft_dx23_make: |
mov ax,[@@tx3] |
sub ax,[@@tx2] |
shl ax,7 |
cwd |
idiv bx |
mov [@@dx23],ax ; dx23 = (x3-x2)/(y3-y2) |
ft_dx23_done: |
mov ax,[@@tx1] |
shl ax,7 |
mov bx,ax |
mov cx,[@@ty1] |
ft_loop1: |
pushad |
mov [@@ly],cx |
mov dx,bx |
shr dx,7 |
mov [@@lx2],dx |
mov dx,ax |
shr dx,7 |
mov [@@lx1],dx |
mov ax,[@@xcol] |
mov [@@lcol],ax |
call horizontal_line |
popad |
add ax,[@@dx13] |
add bx,[@@dx12] |
inc cx |
cmp cx,[@@ty2] |
jb ft_loop1 |
mov bx,[@@tx2] |
shl bx,7 |
mov cx,[@@ty2] |
ft_loop2: |
pushad |
mov [@@ly],cx |
mov dx,bx |
shr dx,7 |
mov [@@lx2],dx |
mov dx,ax |
shr dx,7 |
mov [@@lx1],dx |
mov ax,[@@xcol] |
mov [@@lcol],ax |
call horizontal_line |
popad |
add ax,[@@dx13] |
add bx,[@@dx23] |
inc ecx |
cmp cx,[@@ty3] |
jb ft_loop2 |
ret |
;horizontal line subproc |
@@lx1 dw 0 |
@@lx2 dw 0 |
@@ly dw 0 |
@@lcol dw 0 |
@@rgb dd 0 |
horizontal_line: |
mov ecx,0 |
mov cx,[@@lx1] |
cmp cx,[@@lx2] |
ja x12 |
je ext |
; ret |
mov cx,[@@lx2] |
sub cx,[@@lx1] |
mov edi,3 |
jmp xx |
x12: |
mov cx,[@@lx1] |
sub cx,[@@lx2] |
mov edi,-3 |
jmp xx |
ext: |
mov ecx,-1 ;1 |
; sub ebp,3 |
xx: |
mov eax,0 |
mov ax,[@@ly] |
mov ebx,SCREEN_X ;320 |
mul ebx |
mov ebp,0 |
mov bp,[@@lx1] ;for correct 16 bit size |
add eax,ebp |
mov ebx,3 |
mul ebx |
mov ebp,eax |
sub ebp,3 ;for delete white dots |
add ecx,2 |
loo: |
mov eax,dword [@@rgb] |
mov bl,al |
shr eax,8 ;puck colors |
mov byte [scrbuf+ebp],ah |
mov byte [scrbuf+ebp+1],al |
mov byte [scrbuf+ebp+2],bl |
add ebp,edi |
dec ecx |
jnz loo |
ret |
;include fixed3d.asm |
; Mikolaj Felix 25/5/2001 |
; mfelix@polbox.com |
;------------------------------------------------------------ |
; ds:si - offset to angles |
; ds:di - offset to 3d points |
; cx - number of points |
;------------------------------------------------------------ |
@@sin_x dw 0 |
@@cos_x dw 0 |
@@sin_y dw 0 |
@@cos_y dw 0 |
@@sin_z dw 0 |
@@cos_z dw 0 |
@@px equ word [edi] |
@@py equ word [edi+2] |
@@pz equ word [edi+4] |
rotate_points: |
push edi |
mov edi,@@sin_x |
mov edx,3 |
rp_sin_cos: |
mov bx,word [esi] |
and bx,511 |
shl bx,1 |
mov ax,word [sin_table+bx] |
mov word [edi],ax |
mov ax,word [cos_table+bx] |
mov word [edi+2],ax |
add esi,2 |
add edi,4 |
dec edx |
jnz rp_sin_cos |
pop edi |
rp_rotate: |
; rotate around x-axis |
mov ax,@@py |
imul [@@cos_x] |
mov bx,ax |
mov si,dx |
mov ax,@@pz |
imul [@@sin_x] |
sub bx,ax |
sbb si,dx |
shrd bx,si,14 |
push bx |
mov ax,@@py |
imul [@@sin_x] |
mov bx,ax |
mov si,dx |
mov ax,@@pz |
imul [@@cos_x] |
add bx,ax |
adc si,dx |
shrd bx,si,14 |
pop @@py |
mov @@pz,bx |
; rotate around y-axis |
mov ax,@@px |
imul [@@cos_y] |
mov bx,ax |
mov si,dx |
mov ax,@@pz |
imul [@@sin_y] |
sub bx,ax |
sbb si,dx |
shrd bx,si,14 |
push bx |
mov ax,@@px |
imul [@@sin_y] |
mov bx,ax |
mov si,dx |
mov ax,@@pz |
imul [@@cos_y] |
add bx,ax |
adc si,dx |
shrd bx,si,14 |
pop @@px |
mov @@pz,bx |
; rotate around z-axis |
mov ax,@@px |
imul [@@cos_z] |
mov bx,ax |
mov si,dx |
mov ax,@@py |
imul [@@sin_z] |
sub bx,ax |
sbb si,dx |
shrd bx,si,14 |
push bx |
mov ax,@@px |
imul [@@sin_z] |
mov bx,ax |
mov si,dx |
mov ax,@@py |
imul [@@cos_z] |
add bx,ax |
adc si,dx |
shrd bx,si,14 |
pop @@px |
mov @@py,bx |
add edi,6 |
dec ecx |
jnz rp_rotate |
ret |
;------------------------------------------------------------ |
; ds:si - offset to 3d points |
; es:di - offset to 2d points |
; cx - number of points |
;------------------------------------------------------------ |
mx dw 0 |
my dw 0 |
translate_points: |
pushad |
mov eax,37 |
mov ebx,1 |
int 0x40 |
mov ebx,eax |
shr eax,16 |
and ebx,0xffff |
cmp ax,SCREEN_X |
jna x_n |
mov ax,0 ;SCREEN_X |
x_n: |
cmp bx,SCREEN_Y |
jna y_n |
mov bx,0 ;SCREEN_Y |
y_n: |
mov [mx],ax |
mov [my],bx |
popad |
mov ebx,0 ;? |
mov bx,word [esi+4] |
mov ax,[my] |
cmp ax,0 |
jng no_m |
shl ax,3 |
add bx,ax |
no_m: |
add bx,256 ; Z factor (zoom) |
mov eax,0 ;? |
mov ax,word [esi] |
shl ax,8 |
cwd |
idiv bx; bx |
add ax,(SCREEN_X/2) ;160 ;X factor (center X) |
stosw |
mov eax,0 ;? |
mov ax,word [esi+2] |
shl ax,8 |
cwd |
idiv bx |
add ax,(SCREEN_Y/2) ;100 ;Y factor (center Y) |
stosw |
add esi,6 |
dec ecx |
jnz translate_points |
ret |
init_sin_cos: |
finit |
fldz |
fstp [temp] |
xor edi,edi |
mov ecx,512 |
isc_make: |
fld [temp] |
fld st0 |
fld st0 |
fsin |
fmul [fixed_point_const] |
fistp word [sin_table+edi] |
fcos |
fmul [fixed_point_const] |
fistp word [cos_table+edi] |
fadd [inc_angle] |
fstp [temp] |
add edi,2 |
loop isc_make |
ret |
temp dd 0 |
fixed_point_const dd 16384.0 |
inc_angle dd 0.01227184630309 ; pi/256 |
angle_x dw 0 |
angle_y dw 0 |
angle_z dw 0 |
object dw -50,-50,-50, 50,-50,-50, 50,50,-50, -50,50,-50 |
dw -50,-50, 50, 50,-50, 50, 50,50, 50, -50,50, 50 |
link: |
db 0,1,2,10000011b, 0,2,3,10000011b ;purpure side |
db 5,4,7,00000111b, 5,7,6,00000111b ;soft-red side |
db 1,5,6,00011000b, 1,6,2,00011000b ;soft-lime side |
db 4,0,3,11100001b, 4,3,7,11100001b ;soft-blue side |
db 4,5,1,00011111b, 1,0,4,00011111b ;yellow side |
db 3,2,6,00000000b, 3,6,7,00000000b ;black side |
sin_table: |
rw 512 |
cos_table: |
rw 512 |
object_rotated: |
rw MAX_POINTS*3 |
object_translated: |
rw MAX_POINTS*2 |
scrbuf: |
I_END: |
/programs/demos/3dcube2/trunk/ascgl.inc |
---|
0,0 → 1,624 |
lang equ ru |
; |
; Assembler |
; SMALL |
; CODE |
; Graphics |
; Libary |
; |
; Ver 0.10 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 |
;DrawBox |
macro drawfbox x,y,xs,ys,color |
{ |
mov ecx,y |
mov ebx,x |
shl ebx,16 |
add ebx,xs |
shl ecx,16 |
add ecx,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 |
_ldbounce_count=0; |
macro collimg img1_off,x1,y1,img2_off,x2,y2,otv |
{ |
local bounce,exit,_1dbounce,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 |
_ldbounce_count=_ldbounce_count+1 |
if (_ldbounce_count = 1) |
_1dbounce: |
cmp ebx,eax |
jnae anot |
add eax,esi |
cmp eax,ebx |
jna nbc |
jmp bc |
anot: |
add ebx,edi |
cmp ebx,eax |
jna nbc |
bc: |
mov ecx,1 |
ret |
nbc: |
mov ecx,0 |
ret |
end if |
bounce: |
mov otv,1 |
exit: |
} |
; SETBMP - Set bmp to window |
; (SYNTAX) SETBMP dd xstart ,dd ystart ,BMP_offset,dd soi |
; (SAMPLE) SETBMP dword [xt],dword [yt],I_END,dword [tsoi] |
; SETBMP 15,10,I_END,dword [tsoi] |
; ( NOTE ) SOI - Start of image |
macro setbmp arg1,arg2,arg3,arg4 |
{ |
local nodi |
cmp word [arg3],word 'BM' |
jne nodi |
mov eax,7 |
mov ebx,arg4 ;[soi] |
mov ecx,dword [arg3+18] |
shl ecx,16 |
add ecx,dword [arg3+22] |
if (arg1 eqtype 0) & (arg2 eqtype 0) |
mov edx,arg1*65536+arg2 |
else |
mov edx,arg1 |
shl edx,16 |
add edx,arg2 |
end if |
int 0x40 |
nodi: |
} |
macro setimg arg1,arg2,arg3 |
{ |
local nodi |
mov eax,7 |
mov ebx,arg3 |
add ebx,8 |
mov ecx,dword [arg3] |
shl ecx,16 |
add ecx,dword [arg3+4] |
if (arg1 eqtype 0) & (arg2 eqtype 0) |
mov edx,arg1*65536+arg2 |
else |
mov edx,arg1 |
shl edx,16 |
add edx,arg2 |
end if |
int 0x40 |
} |
;Not optimiz |
macro getimg imgsrc,x,y,xs,ys,imgdest |
{ |
local cyc |
mov eax,xs |
mov dword [imgdest],eax |
mov eax,ys |
mov dword [imgdest+4],eax |
mov eax,dword [imgsrc] ;getx size |
mov edi,eax |
mov ebx,y |
mul ebx |
add eax,x |
mov ebx,3 |
mul ebx ;eax=offset on imsrc |
mov ecx,0 |
mov ebx,0 |
mov ebp,eax |
mov esi,0 |
add esi,8 |
add ebp,8 |
cyc: |
mov al,byte [imgsrc+ebp] |
mov [imgdest+esi],al |
mov al,byte [imgsrc+ebp+1] |
mov [imgdest+esi+1],al |
mov al,byte [imgsrc+ebp+2] |
mov [imgdest+esi+2],al |
add esi,3 |
add ebp,3 |
inc ecx |
cmp ecx,xs |
jne cyc |
add ebp,edi |
add ebp,edi |
add ebp,edi |
sub ebp,xs |
sub ebp,xs |
sub ebp,xs |
mov ecx,0 |
inc ebx |
cmp ebx,ys |
jne cyc |
} |
; |
macro bmptoimg bmp_off,soi,img_off |
{ |
local nodix,conv |
cmp word [bmp_off],word 'BM' |
jne nodix |
mov eax,dword [bmp_off+18] |
mov ebx,dword [bmp_off+22] |
mov dword [img_off],eax |
mov dword [img_off+4],ebx |
mul ebx |
lea ecx,[eax+2*eax] |
lea edi,[img_off+8] |
mov esi,dword [soi] |
cld |
rep movsb |
nodix: |
} |
macro copyimg img2_off,img1_off |
{ |
local cop |
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 |
} |
macro convbmp bmp_load_area,bmp_soi |
{ |
local status,bps,dwps,soi,sop,eop,eos,process,fileinfo,string,end_bmp |
local converttable,noaddelem,nextbit,convert1bpp,convert4bpp,convert2 |
local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize |
local noaddword |
;local qwe,bmpfn |
; convert: |
movzx eax,word [bmp_load_area+28] |
mul dword [bmp_load_area+18] |
mov ebx,32 |
div ebx |
test edx,edx |
je noaddword |
inc eax |
noaddword: |
mov dword [dwps],eax ;dwps-doublewords per string |
shl eax,2 |
mov dword [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 eax,bmp_load_area |
mov ebx,eax |
add ebx, [bmp_load_area+2];file size |
inc ebx |
mov dword [bmp_soi],ebx ;soi-start of image area for drawing |
add eax, [bmp_load_area+10] |
mov dword [sop],eax ;sop-start of picture in file |
add eax, [bmp_load_area+34] |
mov dword [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 [bmp_soi] ;initializing |
mov esi,dword [eop] |
sub esi,dword [bps] |
nextstring: |
push edi |
cmp word [bmp_load_area+28],24 |
jne convertno32 |
mov ecx,[dwps] |
cld |
rep movsd |
convert1: |
pop edi |
sub esi,dword [bps] |
sub esi,dword [bps] |
cmp esi,dword [sop] |
jb end_bmp;nomorestring |
add edi,eax |
jmp nextstring |
; nomorestring: |
; jmp end_bmp |
convertno32: |
mov ebx,bmp_load_area |
add ebx, [bmp_load_area+14] |
add ebx,14 ;start of color table |
push esi |
add esi,dword [bps] |
mov dword [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 [eos] |
jae convert1 |
add edi,3 |
jmp nextelem |
convert4bpp: |
shl ax,4 |
shr al,4 |
push ax |
movzx eax,ah |
call converttable |
add edi,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 |
cmp edx,0xffffffff |
je convert2 |
add edi,3 |
jmp nextbit |
converttable: |
shl eax,2 |
add eax,ebx |
mov edx, dword [eax] |
mov dword [edi],edx |
ret |
; DATA AREA |
;status dd 0 ;bit0=1 if file thread is created |
bps dd 0 |
dwps dd 0 |
;soi dd 0 |
sop dd 0 |
eop dd 0 |
eos dd 0 |
;process dd 0 |
end_bmp: |
; mov eax,dword [soi] |
; mov dword [bmp_soi],eax |
} |
; LOADBMP - Load bmp image from file |
; (SYNTAX) LOADBMP 'file_path',temp_area(rb 0x10000),load_area,dd soi |
; (SAMPLE) LOADBMP '/rd/1/menuet.bmp',temp_area,I_END,tsoi |
; ( NOTE ) Macros create on Base of |
; Picture browser by lisovin@26.ru & Ivan Poddubny |
; SOI - Start of image |
macro loadbmp bmp_file_name,bmp_temp_area,bmp_load_area,bmp_soi |
{ |
local status,bps,dwps,soi,sop,eop,eos,process,fileinfo,string,end_bmp |
local converttable,noaddelem,nextbit,convert1bpp,convert4bpp,convert2 |
local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize |
local noaddword |
;local qwe,bmpfn |
mov dword [fileinfo+8],1 ; how many blocks to read (1) |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
mov eax,[bmp_load_area+2] |
shr eax,9 ; ¯®¤¥«¨¬ 512 ¨ ¯à¨¡ ¢¨¬ 1 - ¯®«ã稬 ç¨á«® ¡«®ª®¢ |
inc eax |
mov dword [fileinfo+8],eax |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
; jmp qwe |
;bmpfn db bmp_file_name |
;qwe: |
; mov eax,6 |
; mov ebx,bmpfn |
; mov ecx,0 |
; mov edx,0xFFFFFF |
; mov esi,bmp_load_area |
; mov edi,0 |
; int 0x40 |
; convert: |
movzx eax,word [bmp_load_area+28] |
mul dword [bmp_load_area+18] |
mov ebx,32 |
div ebx |
test edx,edx |
je noaddword |
inc eax |
noaddword: |
mov dword [dwps],eax ;dwps-doublewords per string |
shl eax,2 |
mov dword [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 eax,bmp_load_area |
push eax |
add eax, [bmp_load_area+2];file size |
inc eax |
mov dword [soi],eax ;soi-start of image area for drawing |
pop eax |
add eax, [bmp_load_area+10] |
mov dword [sop],eax ;sop-start of picture in file |
add eax, [bmp_load_area+34] |
mov dword [eop],eax ;eop-end of picture in file |
mov eax, [bmp_load_area+18] |
mov ebx,3 |
mul ebx ;3x pixels in eax |
mov edi,dword [soi] ;initializing |
mov esi,dword [eop] |
sub esi,dword [bps] |
nextstring: |
push edi |
cmp word [bmp_load_area+28],24 |
jne convertno32 |
mov ecx,[dwps] |
cld |
rep movsd |
convert1: |
pop edi |
sub esi,dword [bps] |
sub esi,dword [bps] |
cmp esi,dword [sop] |
jb nomorestring |
add edi,eax |
jmp nextstring |
nomorestring: |
jmp end_bmp |
convertno32: |
mov ebx,bmp_load_area |
add ebx, [bmp_load_area+14] |
add ebx,14 ;start of color table |
push esi |
add esi,dword [bps] |
mov dword [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 [eos] |
jae convert1 |
add edi,3 |
jmp nextelem |
convert4bpp: |
shl ax,4 |
shr al,4 |
push ax |
movzx eax,ah |
call converttable |
add edi,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 |
cmp edx,0xffffffff |
je convert2 |
add edi,3 |
jmp nextbit |
converttable: |
shl eax,2 |
add eax,ebx |
mov edx, dword [eax] |
mov dword [edi],edx |
ret |
; DATA AREA |
;status dd 0 ;bit0=1 if file thread is created |
bps dd 0 |
dwps dd 0 |
soi dd 0 |
sop dd 0 |
eop dd 0 |
eos dd 0 |
;process dd 0 |
; DATA AREA |
fileinfo: |
dd 0 |
dd 0 |
dd 1 ;number of blocks of 512 bytes |
dd bmp_load_area |
dd bmp_temp_area |
string: |
db bmp_file_name,0 |
db ' ' |
db ' ' |
db ' ' |
db ' ',0 |
end_bmp: |
mov eax,dword [soi] |
mov dword [bmp_soi],eax |
} |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/demos/3dcube2/trunk/ascl.inc |
---|
0,0 → 1,499 |
lang equ ru ; ru en fr ge fi |
; |
; Assembler |
; SMALL |
; CODE |
; Libary |
; |
; Ver 0.09 By Pavlushin Evgeni (RUSSIA) |
; www.waptap@mail.ru |
;InfoList |
;0.01 scank,putpix,puttxt |
;0.02 label,random,colors |
;0.03 window,startwd,endwd,attributes |
;0.04 close,delay,scevent ~30.04.2004 |
;0.05 small random, ~04.05.2004 |
;0.06 wtevent ~09.05.2004 |
;0.07 timeevent ~23.05.2004 |
;0.08 txtput ~14.06.2004 |
;0.09 opendialog,savedialog ~20.06.2004 |
macro opendialog redproc,openoff,erroff,path,testtime |
{ |
local still, dlg_file, clip_file, redwait |
local button, key, red, zzz, still, zzz2, incf, file_is_open, zzz3 |
mov ecx,200 |
zzz3: |
mov byte [path+ecx-1],0 |
loop zzz3 |
dec byte [clip_file+7] |
incf: |
inc byte [clip_file+7] |
mov eax,6 |
mov ebx,clip_file |
mov ecx,0 |
mov edx,-1 |
mov esi,path |
int 0x40 |
cmp byte [clip_file+7],'Z' |
je erroff |
cmp eax,0xffffffff |
jne incf |
mov ecx,200 |
zzz2: |
mov byte [path+ecx],0 |
loop zzz2 |
mov ebx,clip_file |
mov ecx,path |
mov edx,100 |
mov esi,0 |
mov eax,33 |
int 0x40 |
mov ebx,dlg_file |
mov ecx,clip_file |
mov eax,19 |
int 0x40 |
still: |
scevent red,key,button |
cmp byte [path],0 |
jne file_is_open |
cmp dword [redwait],testtime ;20 |
jnae zzz |
mov eax,6 |
mov ebx,clip_file |
mov ecx,0 |
mov edx,-1 |
mov esi,path |
int 0x40 |
cmp eax,0xffffffff |
je erroff ;errexit |
mov dword [redwait],0 |
zzz: |
delay 5 |
inc dword [redwait] |
jmp still |
file_is_open: |
mov eax,32 |
mov ebx,clip_file |
int 0x40 |
jmp openoff |
key: ; key |
int 0x40 ; read (eax=2) |
jmp still |
button: ; button |
mov eax,17 ; get id |
int 0x40 |
cmp ah,1 ; button id=1 ? |
jne still |
mov eax,-1 ; close this program |
int 0x40 |
red: |
call redproc |
jmp still |
dlg_file db 'SYSXTREE ' |
clip_file db 'OPENCLPACLP' |
db 'O' ;Dialog type O-open S-save |
db 0 ;Marker |
redwait dd 0 |
} |
macro savedialog redproc,openoff,erroff,path,testtime |
{ |
local still, dlg_file, clip_file, redwait, zzz3 |
local button, key, red, zzz, still, zzz2, incf, file_is_open |
mov ecx,200 |
zzz3: |
mov byte [path+ecx-1],0 |
loop zzz3 |
dec byte [clip_file+7] |
incf: |
inc byte [clip_file+7] |
mov eax,6 |
mov ebx,clip_file |
mov ecx,0 |
mov edx,-1 |
mov esi,path |
int 0x40 |
cmp byte [clip_file+7],'Z' |
je erroff |
cmp eax,0xffffffff |
jne incf |
mov ecx,200 |
zzz2: |
mov byte [path+ecx],0 |
loop zzz2 |
mov ebx,clip_file |
mov ecx,path |
mov edx,100 |
mov esi,0 |
mov eax,33 |
int 0x40 |
mov ebx,dlg_file |
mov ecx,clip_file |
mov eax,19 |
int 0x40 |
still: |
scevent red,key,button |
cmp byte [path],0 |
jne file_is_open |
cmp dword [redwait],testtime ;20 |
jnae zzz |
mov eax,6 |
mov ebx,clip_file |
mov ecx,0 |
mov edx,-1 |
mov esi,path |
int 0x40 |
cmp eax,0xffffffff |
je erroff ;errexit |
mov dword [redwait],0 |
zzz: |
delay 5 |
inc dword [redwait] |
jmp still |
file_is_open: |
mov eax,32 |
mov ebx,clip_file |
int 0x40 |
jmp openoff |
key: ; key |
int 0x40 ; read (eax=2) |
jmp still |
button: ; button |
mov eax,17 ; get id |
int 0x40 |
cmp ah,1 ; button id=1 ? |
jne still |
mov eax,-1 ; close this program |
int 0x40 |
red: |
call redproc |
jmp still |
dlg_file db 'SYSXTREE ' |
clip_file db 'SAVECLPACLP' |
db 'S' ;Dialog type O-open S-save |
db 0 ;Marker |
redwait dd 0 |
} |
; RANDOM - generate random count (small) |
; (SYNTAX) RANDOM MaxCount,OutArgument |
; (SAMPLE) RANDOM 10000,eax |
; ( NOTE ) Maxint<65536 ; use random 65536,eax for more combinations |
randomuse = 0 |
macro random arg1,arg2 |
{ |
local rxproc |
randomuse = randomuse + 1 |
jmp rxproc |
if defined randomuse & randomuse = 1 |
randomproc: |
jmp rnj |
rsx1 dw 0x4321 |
rsx2 dw 0x1234 |
rnj: |
; mov eax,arg1 |
push bx |
push cx |
push dx |
push si |
push di |
mov cx,ax |
mov ax,word ptr rsx1 |
mov bx,word ptr rsx2 |
mov si,ax |
mov di,bx |
mov dl,ah |
mov ah,al |
mov al,bh |
mov bh,bl |
xor bl,bl |
rcr dl,1 |
rcr ax,1 |
rcr bx,1 |
add bx,di |
adc ax,si |
add bx,0x62e9 |
adc ax,0x3619 |
mov word ptr rsx1,bx |
mov word ptr rsx2,ax |
xor dx,dx |
cmp ax,0 |
je nodiv |
cmp cx,0 |
je nodiv |
div cx |
nodiv: |
mov ax,dx |
pop di |
pop si |
pop dx |
pop cx |
pop bx |
; mov arg2,0 |
; mov arg2,eax |
ret |
end if |
rxproc: |
mov eax,arg1 |
call randomproc |
mov arg2,0 |
mov arg2,eax |
} |
macro scank |
{ |
mov eax,10 |
int 0x40 |
} |
macro putpix x,y,color |
{ |
mov ebx,x |
mov ecx,y |
mov edx,color |
mov eax,1 |
int 0x40 |
} |
macro puttxt x,y,offs,size,color |
{ |
mov ebx,x |
shl ebx,16 |
add ebx,y |
mov ecx,color |
mov edx,offs |
mov esi,size |
mov eax,4 |
int 0x40 |
} |
;_ equ '____' |
;macro libtest x,y,color |
;{ |
;if x = as dword |
; mov ebx,x |
;end if |
; mov ecx,y |
; mov edx,color |
; mov eax,1 |
; int 0x40 |
;} |
macro outcount data, x, y, color, numtype |
{ |
mov ecx,data |
mov ebx,numtype |
mov bl,0 |
mov edx,x*65536+y |
mov esi,color |
mov eax,47 |
int 0x40 |
} |
; SCEVENT - Scan event |
macro scevent red,key,but |
{ |
mov eax,11 |
int 0x40 |
dec eax |
jz red |
dec eax |
jz key |
dec eax |
jz but |
} |
; WTEVENT - Wait event |
macro wtevent red,key,but |
{ |
mov eax,10 |
int 0x40 |
dec eax |
jz red |
dec eax |
jz key |
dec eax |
jz but |
} |
; TIMEEVENT - Wite for event with timeout |
macro timeevent xfps,noevent,red,key,but |
{ |
mov eax,23 |
mov ebx,xfps |
int 0x40 |
cmp eax,0 |
je noevent |
dec eax |
jz red |
dec eax |
jz key |
dec eax |
jz but |
} |
; CLOSE - Close program |
macro close |
{ |
mov eax,-1 |
int 0x40 |
} |
; DELAY - Create delay 1/100 sec |
; (SYNTAX) Delay time |
; (SAMPLE) Delay 100 ;delay 2 sec 1/100*200=2 sec |
macro delay arg1 |
{ |
mov eax,5 |
mov ebx,arg1 |
int 0x40 |
} |
; WINDOW - Draw window |
; (SYNTAX) WINDOW Xstart,Ystart,'Text',Color |
; (SAMPLE) WINDOW 10,10,640+8,480+24,window_Skinned |
macro window arg1,arg2,arg3,arg4,arg5 |
{ |
mov ebx,arg1*65536+arg3 |
mov ecx,arg2*65536+arg4 |
mov edx,arg5 |
mov eax,0 |
int 0x40 |
} |
macro colorwindow arg1,arg2,arg3,arg4,arg5,arg6,arg7 |
{ |
mov ebx,arg1*65536+arg3 |
mov ecx,arg2*65536+arg4 |
mov edx,arg5 |
mov esi,arg6 |
mov edi,arg7 |
mov eax,0 |
int 0x40 |
} |
; STARTWD - Start of window draw |
macro startwd |
{ |
mov eax,12 |
mov ebx,1 |
int 0x40 |
} |
; ENDWD - End window draw |
macro endwd |
{ |
mov eax,12 |
mov ebx,2 |
int 0x40 |
} |
; LABEL - Put text to frame |
; (SYNTAX) LABEL Xstart,Ystart,'Text',Color |
; (SAMPLE) LABEL 10,12,'Hello World!',cl_Green+font_Big |
macro label arg1,arg2,arg3,arg4 |
{ |
local asd,lab |
jmp asd |
lab db arg3 ;arg label |
asd: |
mov ebx,arg1 ;arg1=y arg2=x |
shl ebx,16 |
add ebx,arg2 |
mov ecx,arg4 ;arg4 color |
mov edx,lab |
mov esi,asd-lab ;calc size |
mov eax,4 |
int 0x40 |
} |
;Key's |
key_Up equ 178 |
key_Down equ 177 |
key_Right equ 179 |
key_Left equ 176 |
key_Esc equ 27 |
key_Space equ 32 |
key_Enter equ 13 |
key_Bspace equ 8 |
key_F1 equ 50 |
key_F2 equ 51 |
key_F3 equ 52 |
key_F4 equ 53 |
key_F5 equ 54 |
key_F6 equ 55 |
key_F7 equ 56 |
key_F8 equ 57 |
key_F9 equ 48 |
key_F10 equ 49 |
key_F11 equ 68 |
key_F12 equ 255 |
key_Home equ 180 |
key_End equ 181 |
key_PgUp equ 184 |
key_PgDown equ 183 |
;Attributes |
;Window Attributes |
window_Skinned equ 0x03000000 |
window_Type2 equ 0x02000000 |
window_Type1 equ 0x00000000 |
window_Reserve equ 0x01000000 |
;Font Attributes |
font_Big equ 0x10000000 |
;Colors |
cl_White equ 0x00ffffff |
cl_Black equ 0x00000000 |
cl_Grey equ 0x00888888 |
cl_Red equ 0x00ff0000 |
cl_Lime equ 0x0000ff00 |
cl_Green equ 0x0000af00 |
cl_Blue equ 0x000000ff |
cl_Purple equ 0x008080ff |
cl_Violet equ 0x008040ff |
cl_Cyan equ 0x0040e0ff |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/demos/3dcube2/trunk/build_en.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix en >lang.inc |
@fasm 3dcube2.asm 3dcube2 |
@pause |
/programs/demos/3dcube2/trunk/build_ru.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix ru >lang.inc |
@fasm 3dcube2.asm 3dcube2 |
@pause |
/programs/demos/3dcube2/trunk/macros.inc |
---|
0,0 → 1,266 |
; new application structure |
macro meos_app_start |
{ |
use32 |
org 0x0 |
db 'MENUET01' |
dd 0x01 |
dd __start |
dd __end |
dd __memory |
dd __stack |
if used __params & ~defined __params |
dd __params |
else |
dd 0x0 |
end if |
dd 0x0 |
} |
MEOS_APP_START fix meos_app_start |
macro code |
{ |
__start: |
} |
CODE fix code |
macro data |
{ |
__data: |
} |
DATA fix data |
macro udata |
{ |
if used __params & ~defined __params |
__params: |
db 0 |
__end: |
rb 255 |
else |
__end: |
end if |
__udata: |
} |
UDATA fix udata |
macro meos_app_end |
{ |
align 32 |
rb 2048 |
__stack: |
__memory: |
} |
MEOS_APP_END fix meos_app_end |
; macro for defining multiline text data |
struc mstr [sstring] |
{ |
forward |
local ssize |
virtual at 0 |
db sstring |
ssize = $ |
end virtual |
dd ssize |
db sstring |
common |
dd -1 |
} |
; strings |
macro sz name,[data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if used name |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
macro lsz name,[lng,data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if (used name)&(lang eq lng) |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
; easy system call macro |
macro mpack dest, hsrc, lsrc |
{ |
if (hsrc eqtype 0) & (lsrc eqtype 0) |
mov dest, (hsrc) shl 16 + lsrc |
else |
if (hsrc eqtype 0) & (~lsrc eqtype 0) |
mov dest, (hsrc) shl 16 |
add dest, lsrc |
else |
mov dest, hsrc |
shl dest, 16 |
add dest, lsrc |
end if |
end if |
} |
macro __mov reg,a { ; mike.dld |
if ~a eq |
mov reg,a |
end if |
} |
macro mcall a,b,c,d,e,f { ; mike.dld |
__mov eax,a |
__mov ebx,b |
__mov ecx,c |
__mov edx,d |
__mov esi,e |
__mov edi,f |
int 0x40 |
} |
; language for programs |
lang fix ru ; ru en fr ge fi |
; optimize the code for size |
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp> |
macro add arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
inc arg1 |
else |
add arg1,arg2 |
end if |
else |
add arg1,arg2 |
end if |
} |
macro sub arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
dec arg1 |
else |
sub arg1,arg2 |
end if |
else |
sub arg1,arg2 |
end if |
} |
macro mov arg1,arg2 |
{ |
if (arg1 in __regs) & (arg2 eqtype 0) |
if (arg2) = 0 |
xor arg1,arg1 |
else if (arg2) = 1 |
xor arg1,arg1 |
inc arg1 |
else if (arg2) = -1 |
or arg1,-1 |
else if (arg2) > -128 & (arg2) < 128 |
push arg2 |
pop arg1 |
else |
mov arg1,arg2 |
end if |
else |
mov arg1,arg2 |
end if |
} |
macro struct name |
{ |
virtual at 0 |
name name |
sizeof.#name = $ - name |
end virtual |
} |
; structures used in MeOS |
struc process_information |
{ |
.cpu_usage dd ? ; +0 |
.window_stack_position dw ? ; +4 |
.window_stack_value dw ? ; +6 |
.not_used1 dw ? ; +8 |
.process_name rb 12 ; +10 |
.memory_start dd ? ; +22 |
.used_memory dd ? ; +26 |
.PID dd ? ; +30 |
.x_start dd ? ; +34 |
.y_start dd ? ; +38 |
.x_size dd ? ; +42 |
.y_size dd ? ; +46 |
.slot_state dw ? ; +50 |
rb (1024-52) |
} |
struct process_information |
struc system_colors |
{ |
.frame dd ? |
.grab dd ? |
.grab_button dd ? |
.grab_button_text dd ? |
.grab_text dd ? |
.work dd ? |
.work_button dd ? |
.work_button_text dd ? |
.work_text dd ? |
.work_graph dd ? |
} |
struct system_colors |
; constants |
; events |
EV_IDLE = 0 |
EV_TIMER = 0 |
EV_REDRAW = 1 |
EV_KEY = 2 |
EV_BUTTON = 3 |
EV_EXIT = 4 |
EV_BACKGROUND = 5 |
EV_MOUSE = 6 |
EV_IPC = 7 |
EV_STACK = 8 |
; event mask bits for function 40 |
EVM_REDRAW = 1b |
EVM_KEY = 10b |
EVM_BUTTON = 100b |
EVM_EXIT = 1000b |
EVM_BACKGROUND = 10000b |
EVM_MOUSE = 100000b |
EVM_IPC = 1000000b |
EVM_STACK = 10000000b |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |