Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Ignore whitespace Rev 108 → Rev 109

/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
/programs/demos/3detx60b/trunk/3DETX60B.ASM
0,0 → 1,2539
;
; 3D ’…Š‘’“ˆŽ‚€›‰ „‚ˆ†ŽŠ 3D TEXTURED ENGINE
; €‚’Ž:  ¢«î設 …¢£¥­¨© AUTOR: Pavlushin Evgeni
;
; Š®¬¯¨«¨àã¥âáï á ¯®¬®éìî FASM  áᥬ¡«¥à  ¤«ï MenuetOS
; Compile with FASM assembler for MenuetOS
;
; 20.11.04 Fast point calc & triangle draw
; Little matrix no (trangle massive)
; Fast triangle, del triangle out of screen
; 16.12.04 Fast triangle with MMX
; 20.12.04 Out triangle fatal bug's deleted, "black zones" deleted
; Matrix move support
; 24.12.04 Fast keyboard scanning
; Z-ground level map work
; Texture draw correction deleted "black zones"
; 04.01.05 Moveing texture
; 05.01.05 Water dynamic texture
; 06.01.05 Texture pack (many textures in one file)
; 07.01.05 Z-sorting
; 08.01.05 Triangle good clipping calculating (speed up)
; 4 byte Z-sorting, more dynamic of water
; 09.01.05 Texture map from 256 color bmp file
; Pixel Z-buffer, good speed!
; 21.01.05 Models buffer add.
; 25.01.05 Models buffer update, Add 2 new models.
; 29.01.05 Dynamic model array
; 01.02.05 1 picture MipMap calculation
; 04.02.05 All picture MipMap calculation, proc speed up.
; Simple Triangel MipMap chose.
; 05.02.05 Normal Triangel MipMap chose.
; 12.02.05 Best QUALITY of Textured TRIANGEL!
; 13.02.05 add new models. All camera axis calculating
; 16.02.05 Simple model turning
; 17.02.05 Advanced model turning, model tmpoints massive deleted
; New map size 128, add new models.
; 25.02.05 Left side clipping bug deleted
; 26.02.05 Optimization of textured line algorythm
; 24.04.05 Test pixel z-buffer it's work. Use new textri algorythm
; 30.04.05 Fast Y-clipping
 
use32
 
SCREEN_X equ 800 ;320 ;Screen size easy change
SCREEN_Y equ 600 ;200
DSCREEN_X equ SCREEN_X-1 ;320 ;For triangle clipping
DSCREEN_Y equ SCREEN_Y-1 ;200
MATRIX_XSIZE equ 64;32;64;100 ;Ground matrix size
MATRIX_YSIZE equ 64;32;64;100
SECTOR_SIZE equ 100 ;Size of matrix sector
MAP_XSIZE equ 128 ;Rezolution of map file
MAP_YSIZE equ 128
 
org 0x0
db 'MENUET01' ; 8 ¡ ©â ¨­â¤¥ä¨ª â®à
dd 0x01 ; ¢¥àá¨ï § £®«®¢ª 
dd START ;  ¤à¥áá ­ ç «  ª®¤ 
dd I_END ; à §¬¥à ¯à®£à ¬¬ë
dd I_END+(SCREEN_X*SCREEN_Y*3+50000) ; à §¬¥à ¯ ¬ï⨠¤«ï ¯à®££à ¬¬ë
dd I_END+(SCREEN_X*SCREEN_Y*3+10000) ; esp
dd 0x0 , 0x0 ; I_Param , I_Icon
 
include 'lang.inc'
include 'ascgl.inc'
include 'ascl.inc'
 
START: ; ­ ç «® ¯à¨«®¦¥­¨ï
; Draw window at first
call draw_window
 
; Decoding groud texture and ground level map
gif_hash_offset = gif_hash_area
;texture's
giftoimg texpack_gif,texpack_img-8
;ground level map
giftoimg gif_file_area5,glm_img_area
 
;get 8bitmap from 256 colors bmp file
mov ebp,128;64
mov esi,0x043a+128*128-4;64*64-4
sub esi,128;64
mov edi,0
mov ecx,128;64
texmap_unp:
mov al,[bmp_texmap+esi]
mov [img_area+edi],al
inc esi
inc edi
dec ecx
jnz texmap_unp
mov ecx,128;64
sub esi,256;128
dec ebp
jnz texmap_unp
 
 
;Unpack textures
 
mov esi,texpack_img
mov edi,texture_img
mov edx,16
mov ecx,16
tpuckloop:
pushad
call unpuck
popad
add esi,32*3
add edi,4095
dec ecx
jnz tpuckloop
add esi,31*32*16*3
mov ecx,16
dec edx
jnz tpuckloop
 
;
; Unpuck one texture procendure
;
jmp skip_unpuck
unpuck:
mov ecx,32
mov edx,32
tunploop:
mov ax,[esi]
mov [edi],ax
mov al,[esi+2]
mov [edi+2],al
add esi,3
add edi,3
dec ecx
jnz tunploop
mov ecx,32
add esi,(32*16*3)-(32*3)
dec edx
jnz tunploop
ret
skip_unpuck:
 
 
;calculating all mipmaps
mov esi,texture_img
mov ecx,256 ;quantity of textures
mmaploop:
mov ebp,32 ;max mipmap texture
pusha
call texgen
popa
add esi,4095 ;next mipmap block
dec ecx
jnz mmaploop
 
jmp skip_texgen
 
;********************************
; MIPMAP TEXTURE GENERATION
;
; in put:
; esi - offset to texture
; ebp - mipmap max size (32 for this sample)
;********************************
 
texgen:
push esi
mov eax,ebp
imul eax,ebp
imul eax,3
add eax,esi
mov edi,eax
 
mov eax,ebp
shr eax,1
mov dh,al
mov dl,al
mov cl,dl
 
mov ecx,ebp
mov eax,ebp
shl eax,1
add ecx,eax
 
miploop:
; Red
xor bx,bx ;for add
xor ax,ax ;for add
mov al,[esi+0]
add bx,ax
mov al,[esi+3+0]
add bx,ax
mov al,[esi+ecx+0]
add bx,ax
mov al,[esi+ecx+3+0]
add bx,ax
shr bx,2 ;/4
mov [edi+0],bl
;Green
xor bx,bx ;for add
xor ax,ax ;for add
mov al,[esi+1]
add bx,ax
mov al,[esi+3+1]
add bx,ax
mov al,[esi+ecx+1]
add bx,ax
mov al,[esi+ecx+3+1]
add bx,ax
shr bx,2 ;/4
mov [edi+1],bl
;Blue
xor bx,bx ;for add
xor ax,ax ;for add
mov al,[esi+2]
add bx,ax
mov al,[esi+3+2]
add bx,ax
mov al,[esi+ecx+2]
add bx,ax
mov al,[esi+ecx+3+2]
add bx,ax
shr bx,2 ;/4
mov [edi+2],bl
 
add esi,6
add edi,3
dec dl
jnz miploop
mov ax,bp
shr ax,1
mov dl,al
add esi,ecx
dec dh
jnz miploop
pop esi
 
mov eax,ebp
imul eax,ebp
imul eax,3
add esi,eax
shr ebp,1
cmp ebp,1
jne texgen
ret
skip_texgen:
 
 
;Copy dynamic water texture
; ????????????
mov ecx,32*32*3
mov esi,texture_img+4095 ;32*32*3
mov edi,texture_limg
cld
rep movsb
 
; init sine wave for dynamic water texture
finit
mov edi,sinwave
mov ecx,32;256
isv_loop:
fld [angle]
fld st
fsin
fmul [mul_wave]
fistp word [edi]
fadd [d_angle]
fstp [angle]
add edi,2
dec ecx
jnz isv_loop
 
 
;Initalize keyboard
mov eax,66
mov ebx,1
mov ecx,1
int 0x40
 
mov eax,26
mov ebx,2
mov ecx,1
mov edx,keymap+100
int 0x40
 
;Build triangle matrix
mov esi,points
mov eax,-(MATRIX_XSIZE/2)*SECTOR_SIZE
mov ebx,-(MATRIX_YSIZE/2)*SECTOR_SIZE
mov ebp,img_area+8
loomat:
mov [esi],eax ;x-set
mov [esi+4],ebx ;y-set
mov [esi+8],ecx ;z-set
add ebp,3
add esi,4*3
add eax,SECTOR_SIZE
cmp eax,((MATRIX_YSIZE/2)+1)*SECTOR_SIZE
jnge loomat
mov eax,-(MATRIX_YSIZE/2)*SECTOR_SIZE
add ebx,SECTOR_SIZE
cmp ebx,((MATRIX_XSIZE/2)+1)*SECTOR_SIZE
jnge loomat
 
; Create z-ground good algorythm not already yet (64x64 map)
mov esi,glm_img_area+8
mov edi,ground_level_map
loox:
; draw_courner_points
mov eax,[esi]
call get_z
; mov [edi],eax
 
mov eax,[esi+((MATRIX_XSIZE-1)*4)]
call get_z
; mov [edi+((MATRIX_XSIZE)*4)],eax
 
mov eax,[esi+(((MATRIX_XSIZE)*(MATRIX_YSIZE-1)+1)*4)]
call get_z
; mov [edi+(((MATRIX_XSIZE+1)*(MATRIX_YSIZE)-0)*4)],eax
 
mov eax,[esi+(((MATRIX_XSIZE)*(MATRIX_YSIZE)-1)*4)]
call get_z
; mov [edi+(((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)-1)*4)],eax
 
 
jmp skip_gz
get_z:
xor ebx,ebx
xor ecx,ecx
mov bl,al
add ecx,ebx
mov bl,ah
add ecx,ebx
shr eax,16
mov bl,al
add ecx,ebx
mov eax,ecx
xor edx,edx
mov ebx,3
cdq
div ebx
neg eax
ret
skip_gz:
 
; z-ground livel facking method (65x65 map)
mov esi,glm_img_area+8
mov edi,ground_level_map
mov ebp,(MAP_XSIZE+1)*(MAP_YSIZE+1)
looglm:
mov eax,[esi]
; and eax,0x000000ff
call get_z
mov [edi],eax
add esi,3
add edi,1
dec ebp
jnz looglm
 
;Fill model massive
mov ecx,[model_mas_start]
imul ecx,8
add ecx,4
mov esi,model_mas_start
mov edi,model_mas
cld
rep movsd
 
jmp skip_moddata
model_mas_start:
dd 12 ;quantity of models
dd 0,0,-150,0,0,0,0,bunker
dd 60,-250,-190,0,0,64,0,tank
dd 0,180,-150,0,0,0,0,cannon
dd 0,480,-150,0,0,0,0,outpost
dd 260,60,-150,0,0,0,0,bunker
dd 60,260,-150,0,0,0,0,outpost
dd 210,410,-150,0,0,0,0,cannon
dd 160,260,-150,0,0,0,0,tree
dd 100,-360,-150,0,0,192,0,gqfa
dd 10,580,-150,0,0,0,0,repear
dd 460,160,-100,0,0,0,0,red_flag
dd 60,360,-170,0,0,40,0,cannon
skip_moddata:
 
 
;Main loop
still: ; ®á­®¢­®© 横«
mov eax,11 ; ¯à®¢¥àª  á®áâ®ï­¨ï ®ª­ 
int 0x40
 
cmp eax,1 ; ®ª­® ᤢ¨­ã«¨ ¥£® ­ã¦­® ¯¥à¥à¨á®¢ âì
je red
cmp eax,2 ; ­ ¦ â  ª« ¢¨è  ­  ª« ¢¨ âãà¥
je key
cmp eax,3 ; ­ ¦ â  ª­®¯ª  ¢ ®ª­¥
je button
 
; delay 10
; cmp [autorot],0 ;frize no fps show when autorot off
; je still
 
cycle:
call clrscr ; clear screen buffer
call clrzbuf ; clear z-buffer
call render_scene ; calculating scene
call dispimg ; show buffer
 
fps_show_frequency=0
fps 10,10,cl_White,cl_Black
 
 
;turn model on z-axis
inc dword [model_mas+4*6]
and dword [model_mas+4*6],011111111b
 
 
; Sin wave dynamic texture for water
; jmp ndt
xor edi,edi
mov dx,32
mov bp,word [sin_pos]
dp_ver:
mov cx,32 ;320
mov si,word [sin_pos]
dp_hor:
and ebp,0000ffffh
mov ax,word [sinwave+ebp]
add ax,cx
and ax,31
 
and esi,0000ffffh
mov bx,word [sinwave+esi]
add bx,dx
and bx,31
shl bx,5
add bx,ax
 
push bx
imul bx,3
and ebx,0000ffffh
mov ax,[texture_limg+ebx]
mov [texture_img2+edi],ax
mov al,[texture_limg+ebx+2]
mov [texture_img2+edi+2],al
pop bx
 
add edi,3
add si,2
and si,63;511
dec cx
jnz dp_hor
add bp,2
and bp,63;511
dec dx
jnz dp_ver
 
; update sine position for next frame
add word [sin_pos],2
and word [sin_pos],63;511
 
;Move water texture
jmp ndt
mov esi,texture_limg
mov ecx,32*32-1
loodt:
mov al,byte [esi]
mov bl,byte [esi+1]
mov dl,byte [esi+2]
mov ah,byte [esi+3]
mov bh,byte [esi+4]
mov dh,byte [esi+5]
mov byte [esi],ah
mov byte [esi+1],bh
mov byte [esi+2],dh
mov byte [esi+3],al
mov byte [esi+4],bl
mov byte [esi+5],dl
add esi,3
dec ecx
jnz loodt
ndt:
 
;Creat mipmap pack for dynamic texture
mov ebp,32
mov esi,texture_img+4095
call texgen
 
 
mov eax,4 ; function 4 : write text to window
mov ebx,8*65536+8 ; [x start] *65536 + [y start]
mov ecx,0x0000ff00 ; font 1 & color ( 0xF0RRGGBB )
mov edx,keymap ; pointer to text beginning
mov esi,100 ; text length
int 0x40
add edx,100
add ebx,10
mov esi,60 ; text length
mov ecx,0x00dddddd ; font 1 & color ( 0xF0RRGGBB )
int 0x40
mov edx,usemap
mov esi,60 ; text length
mov ecx,0x0000ff00
int 0x40
jmp rx
;01234567890123456789012345678901234567890123456789
usemap db ' E wer u [] asd zxc '
db ' '
rx:
 
cmp byte [keymap+1],0
je n_esc
jmp exit
n_esc:
 
cmp byte [keymap+22],0
je n_u
mov [Xangle],0
mov [Yangle],0
mov [Zangle],0
n_u:
 
; t,y - mipmap cntrol
cmp byte [keymap+20],0
je n_t
inc [mipzoom]
n_t:
cmp byte [keymap+21],0
je n_y
dec [mipzoom]
n_y:
cmp byte [keymap+23],0
je n_i
mov byte [keymap+23],0 ; reset key
cmp [mipmapwork],1
je i_1
i_0:
mov [mipmapwork],1
jmp n_i
i_1:
mov [mipmapwork],0
n_i:
 
 
cmp byte [keymap+26],0
je n_lsk
add [Xcam],1
n_lsk:
cmp byte [keymap+27],0
je n_rsk
sub [Xcam],1
n_rsk:
cmp byte [keymap+18],0
je n_e
add [Yangle],1
n_e:
cmp byte [keymap+45],0
je n_x
sub [Yangle],1
n_x:
cmp byte [keymap+31],0
je n_s
add [Xangle],1
n_s:
cmp byte [keymap+32],0
je n_d
sub [Xangle],1
n_d:
cmp byte [keymap+44],0
je n_z
add [Zangle],1
n_z:
cmp byte [keymap+46],0
je n_c
sub [Zangle],1
n_c:
cmp byte [keymap+17],0
je n_w
add [Zcam],25 ;250
n_w:
cmp byte [keymap+19],0
je n_r
sub [Zcam],25 ;250
n_r:
 
cmp byte [keymap+75],0
je n_lk
add [Zcamangle],1
and [Zcamangle],011111111b
n_lk:
cmp byte [keymap+77],0
je n_rk
sub [Zcamangle],1
and [Zcamangle],011111111b
n_rk:
 
cmp byte [keymap+79],0
je n_num1
add [Xcamangle],1
and [Xcamangle],011111111b
n_num1:
cmp byte [keymap+81],0
je n_num3
sub [Xcamangle],1
and [Xcamangle],011111111b
n_num3:
cmp byte [keymap+71],0
je n_num7
add [Ycamangle],1
and [Ycamangle],011111111b
n_num7:
cmp byte [keymap+73],0
je n_num9
sub [Ycamangle],1
and [Ycamangle],011111111b
n_num9:
 
 
 
cmp byte [keymap+30],0
je n_a
mov byte [keymap+30],0 ; reset key
cmp [autorot],1
je a_1
a_0:
mov [autorot],1
jmp n_a
a_1:
mov [autorot],0
n_a:
 
; for camera
; mov ebx,[Xcamangle]
; call GetSinCos
; mov [Xcamsin],eax
; mov [Xcamcos],ebx
 
; mov ebx,[Ycamangle]
; call GetSinCos
; mov [Ycamsin],eax
; mov [Ycamcos],ebx
 
mov ebx,[Zcamangle]
call GetSinCos
mov [Zcamsin],eax
mov [Zcamcos],ebx
 
mov eax,[Zcamsin]
mov ebx,[Zcamcos]
; mov ecx,[Xcamsin]
; mov edx,[Xcamcos]
; mov esi,[Ycamsin]
; mov edi,[Ycamcos]
 
sar eax,4
sar ebx,4
; sar ecx,4
; sar edx,4
; sar esi,4
; sar edi,4
 
cmp byte [keymap+72],0
je n_uk
sub [Xcam],eax
sub [Ycam],ebx
 
; sub [Zcam],ecx
; sub [Ycam],edx
 
; sub [Xcam],esi
; add [Zcam],edi
 
n_uk:
cmp byte [keymap+80],0
je n_dk
add [Xcam],eax
add [Ycam],ebx
 
; add [Zcam],ecx
; add [Ycam],edx
 
; add [Xcam],esi
; sub [Zcam],edi
 
n_dk:
 
xor ebp,ebp
move_test:
cmp [Xcam],-SECTOR_SIZE/2
jnl ok1
add [Xcam],SECTOR_SIZE
dec [Xmap]
jmp move_test
ok1:
cmp [Xcam],SECTOR_SIZE/2
jng ok2
sub [Xcam],SECTOR_SIZE
inc [Xmap]
jmp ok1
ok2:
cmp [Ycam],-SECTOR_SIZE/2
jnl ok3
add [Ycam],SECTOR_SIZE
dec [Ymap]
jmp ok2
ok3:
cmp [Ycam],SECTOR_SIZE/2
jng ok4
sub [Ycam],SECTOR_SIZE
inc [Ymap]
jmp ok3
ok4:
 
and [Xangle],011111111b
and [Yangle],011111111b
and [Zangle],011111111b
 
jmp still
 
red: ; redraw
call draw_window
jmp still
 
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
 
shr eax,8
and eax,0xff
mov ah,al
 
mov ebx,0
mov bl,ah
cmp bl,224
je noisa ; ignore Ext code
cmp bl,170
je noisa ; ignore Key Up code
cmp bl,128
ja isa
mov [keymap+ebx],byte 'X' ; set press marker to key id
jmp noisa
isa:
sub bl,128
mov [keymap+ebx],byte 0 ; reset key marker
noisa:
jmp n_a
 
jmp still ; cycle
 
button: ; button
mov eax,17 ; get id
int 0x40
cmp ah,1
jz exit
jmp cycle
 
exit:
mov eax,-1
int 0x40
 
; *********************************************
; ******* 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,0*65536+SCREEN_X-1 ; [x start] *65536 + [x size]
mov ecx,0*65536+SCREEN_Y-1 ; [y start] *65536 + [y size]
mov edx,0x03ffffff ; color of work area RRGGBB,8->color gl
mov esi,0x005080d0 ; color of grab bar RRGGBB,8->color gl
mov edi,0x005080d0 ; 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,0x10ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelt ; pointer to text beginning
mov esi,labellen-labelt ; text length
int 0x40
 
mov eax,12
mov ebx,2
int 0x40
ret
 
dispimg:
mov eax,7
mov ebx,I_END ;zbuffer
mov ecx,SCREEN_X*65536+SCREEN_Y
xor edx,edx ;0*65536+0
int 0x40
; ret
 
mov eax,8
mov ebx,(SCREEN_X-30)*65536+20
mov ecx,10*65536+20
mov edx,1
mov esi,0x0000aa00
int 0x40
ret
 
clrscr: ; clear screen buffer
; cld
; mov edi,I_END
; xor eax,eax
; mov ecx,SCREEN_X*SCREEN_Y*3/4
; rep stosd
; ret
 
; clear screen buffer with MMX technology +1,5 fps
mov edi,I_END
mov ecx,SCREEN_X*SCREEN_Y*3/32
xor eax,eax
movd mm0,eax
movd mm1,eax
movd mm2,eax
movd mm3,eax
csloo:
movq qword [edi],mm0
movq qword [edi+8],mm1
movq qword [edi+16],mm2
movq qword [edi+24],mm3
add edi,32
dec ecx
jnz csloo
ret
 
clrzbuf: ; clear zbuf
cld
mov edi,zbuffer
mov eax,-1
mov ecx,SCREEN_X*SCREEN_Y*3/4
rep stosd
ret
 
 
; mov [@@atx1],dword 0xffffffff
; mov [@@aty1],dword 0xffffffff
; movq mm0,qword [@@atx1]
; movq mm1,qword [@@atx1]
; movq mm2,qword [@@atx1]
; movq mm3,qword [@@atx1]
;czbloo:
; movq qword [edi],mm0
; movq qword [edi+8],mm1
; movq qword [edi+16],mm2
; movq qword [edi+24],mm3
; add edi,32
; dec ecx
; jnz czbloo
ret
 
@@atx1: dd 0
@@aty1: dd 0
 
;===========================================================================
;
; 3D-system example. Use the following formulas to rotate a point:
;
; Rotate around x-axis
; Y = Y * COS(xang) - Z * SIN(xang) / 256
; Z = Y * SIN(xang) + Z * COS(xang) / 256
;
; Rotate around y-axis
; X = X * COS(yang) - Z * SIN(yang) / 256
; Z = X * SIN(yang) + Z * COS(yang) / 256
;
; Rotate around z-axis
; X = X * COS(zang) - Y * SIN(zang) / 256
; Y = X * SIN(zang) + Y * COS(zang) / 256
;
; Divide by 256 coz we have multiplyd our sin values with 256 too.
; This example isn't too fast right now but it'll work just fine.
;
;===========================================================================
 
;***************************************************************************
; \\\ MAIN 3D LOOP ///
; ******************
render_scene:
 
;********************
; Turn matrix points
;********************
 
cmp [autorot],0
je no_autorot
call UpdateAngles ; Calculate new angles
no_autorot:
call SetRotation ; Find sine & cosine of those angles
 
mov edi,tpoints
mov esi,points
mov [mapoff],-1 ;-1 at start
mov ebp,[Ymap]
imul ebp,MAP_XSIZE+1
mov eax,[Xmap]
add ebp,eax
 
mov ecx,(MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)
ShowLoop:
push ecx
push esi
mov eax,[esi]
sub eax,[Xcam]
mov [X],eax
mov eax,[esi+4]
sub eax,[Ycam]
mov [Y],eax
mov eax,[ebp+ground_level_map] ;color
and eax,0x000000ff
sub eax,[Zcam]
mov [Z],eax
push ebp
push edi
call TranslatePoint ; Rotates the point using above formulas
pop edi
mov [edi],ebp ;x
mov [edi+4],eax ;y
mov eax,[Z] ;z
add eax,[Zoff]
mov [edi+8],eax
pop ebp
pop esi
pop ecx
 
add esi,4*3 ;next in point
add edi,4*3 ;next out point
 
inc [mapoff]
cmp [mapoff],MATRIX_XSIZE+1
jne no_shift_glm
mov [mapoff],dword 0
add ebp,(MAP_XSIZE-MATRIX_XSIZE)
no_shift_glm:
add ebp,1
 
dec ecx
jnz ShowLoop
 
 
; Show, how many polygons on screen.
outcount [massize],50,10,cl_White,8*65536
 
 
;*****************
; out triangles
;*****************
 
mov [mapoff],-1 ;-1 at start
mov [massize],0 ;restet triangle massive counter
 
mov ebp,[Ymap]
imul ebp,MAP_XSIZE;64;3*64 ;MAP_XSIZE
mov eax,[Xmap]
add ebp,eax
 
mov edi,tpoints
mov ecx,MATRIX_YSIZE ;64
lootpy:
push ecx
mov ecx,MATRIX_XSIZE ;64
lootpx:
;draw four angle (two triangles)
 
Z_MAX = 10 ;maximal z range for triangles
 
; get texture offset at start
inc [mapoff]
cmp [mapoff],MATRIX_XSIZE
jne no_shift
mov [mapoff],dword 0
add ebp,(MAP_XSIZE-MATRIX_XSIZE)
no_shift:
xor eax,eax
mov al,[ebp+img_area];+8]
inc ebp
imul eax,4095;32*32*3
add eax,texture_img
mov ebx,eax
 
;first triangle
mov eax,[edi+8] ;z1
cmp eax,Z_MAX
jl no_add1
mov [@@tz1],eax
mov eax,[edi+8+12] ;z2
cmp eax,Z_MAX
jl no_add1
mov [@@tz2],eax
mov eax,[edi+8+(4*3*(MATRIX_XSIZE+2))] ;z3
cmp eax,Z_MAX
jl no_add1
mov [@@tz3],eax
 
cmp dword [edi],SCREEN_X
ja p11
cmp dword [edi+4],SCREEN_Y
jna yes_add1
p11:
cmp dword [edi+12],SCREEN_X
ja p12
cmp dword [edi+4+12],SCREEN_Y
jna yes_add1
p12:
cmp dword [edi+(4*3*(MATRIX_XSIZE+2))],SCREEN_X
ja p13
cmp dword [edi+4+(4*3*(MATRIX_XSIZE+2))],SCREEN_Y
jna yes_add1
p13:
jmp no_add1
yes_add1:
 
movq mm0,qword [edi] ;x1
movq mm1,qword [edi+12] ;x2
movq mm2,qword [edi+(4*3*(MATRIX_XSIZE+2))] ;x3
movq qword [@@tx1],mm0
movq qword [@@tx2],mm1
movq qword [@@tx3],mm2
 
mov eax,ebx;+1 shl 31;[ebp]
mov [@@tex_off],eax ;0x0000ff00
inc [massize]
pushad
mov [@@tex_x1],0
mov [@@tex_y1],0
mov [@@tex_x3],(32 shl 16) -1;128
mov [@@tex_y3],(32 shl 16) -1;128
mov [@@tex_x2],0
mov [@@tex_y2],(32 shl 16) -1;128
call textured_triangle
popad
 
no_add1:
 
 
 
;second triangle
mov eax,[edi+8] ;z1
cmp eax,Z_MAX
jl no_add2
mov [@@tz1],eax
mov eax,[edi+8+(4*3*(MATRIX_XSIZE+1))] ;z2
cmp eax,Z_MAX
jl no_add2
mov [@@tz2],eax
mov eax,[edi+8+(4*3*(MATRIX_XSIZE+2))] ;z3
cmp eax,Z_MAX
jl no_add2
mov [@@tz3],eax
 
cmp dword [edi],SCREEN_X
ja p21
cmp dword [edi+4],SCREEN_Y
jna yes_add2
p21:
cmp dword [edi+(4*3*(MATRIX_XSIZE+1))],SCREEN_X
ja p22
cmp dword [edi+4+(4*3*(MATRIX_XSIZE+1))],SCREEN_Y
jna yes_add2
p22:
cmp dword [edi+(4*3*(MATRIX_XSIZE+2))],SCREEN_X
ja p23
cmp dword [edi+4+(4*3*(MATRIX_XSIZE+2))],SCREEN_Y
jna yes_add2
p23:
jmp no_add2
yes_add2:
 
movq mm0,qword [edi] ;x1
movq mm1,qword [edi+(4*3*(MATRIX_XSIZE+1))] ;x2
movq mm2,qword [edi+(4*3*(MATRIX_XSIZE+2))] ;x3
movq qword [@@tx1],mm0
movq qword [@@tx2],mm1
movq qword [@@tx3],mm2
 
 
mov eax,ebx
mov [@@tex_off],eax ;0x0000ff00
inc [massize]
; add esi,4*10
 
pushad
mov [@@tex_x1],0
mov [@@tex_y1],0
mov [@@tex_x3],(32 shl 16) -1;128
mov [@@tex_y3],(32 shl 16) -1;128
mov [@@tex_x2],(32 shl 16) -1
mov [@@tex_y2],0
call textured_triangle
popad
 
 
no_add2:
 
add edi,4*3 ;next triangle
dec ecx
jnz lootpx
add edi,4*3 ;next string
pop ecx
dec ecx
jnz lootpy
 
;**********************************
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;**********************************
; For good models quality -5% speed
; call clrzbuf
 
jmp skip_modmas
mmcnt dd 0 ;counter of model read number
modeloff dd 0 ;offset of model structure
modelmoff dd 0 ;offset in model mas
modeltmpoff dd 0 ;tmpoints offset
; massive of models
; format: X,Y,Z coordoinats,offset to model structure
 
skip_modmas:
 
; Rendering models on map
 
mov eax,[model_mas]
mov [mmcnt],eax
 
ModelRenderLoop:
 
mov ebx,[mmcnt]
dec ebx
imul ebx,4*8
add ebx,model_mas+4
mov ebp,ebx ;edi=model offset X,Y,Z,Xturn,Yturn,Zturn,zero,modeloff
 
mov ebx,[ebp+4*3];[Xangle] ; Grab angle
call GetSinCos ; Get the sine&cosine
mov [Xsin],eax ; Save sin
mov [Xcos],ebx ; Save cos
mov ebx,[ebp+4*4];[Yangle]
call GetSinCos
mov [Ysin],eax
mov [Ycos],ebx
mov ebx,[ebp+4*5];[Zangle]
call GetSinCos
mov [Zsin],eax
mov [Zcos],ebx
 
mov ebx,[mmcnt]
imul ebx,4*8
add ebx,model_mas+4-4
mov eax,[ebx]
 
mov [modeloff],eax
sub ebx,4*7;3
mov [modelmoff],ebx
 
mov edi,modelpoints
mov esi,eax ;bunker+8
add esi,8
mov ecx,[eax] ;[bunker] ;MODEL_POINTS
 
TurnModelLoop:
push ecx
push esi
mov eax,[esi]
mov [X],eax
mov eax,[esi+4]
mov [Y],eax
mov eax,[esi+8]
mov [Z],eax
push ebp
push edi
 
;RotatePoint
 
mov esi,[Y]
mov ebx,[Xcos]
mov edi,[Z]
mov ecx,[Xsin]
call math
mov [Y],esi
mov [Z],edi
mov esi,[X]
mov ebx,[Ycos]
mov ecx,[Ysin]
call math
mov [X],esi
mov [Z],edi
mov ebx,[Zcos]
mov edi,[Y]
mov ecx,[Zsin]
call math
mov [X],esi
mov [Y],edi
 
pop edi
 
mov eax,[X]
mov [edi],eax
mov eax,[Y]
mov [edi+4],eax
 
mov eax,[Z] ;z
; add eax,[Zoff]
mov [edi+8],eax
pop ebp
pop esi
pop ecx
 
add esi,4*3 ;next in point
add edi,4*3 ;next out point
 
dec ecx
jnz TurnModelLoop
 
modxxx:
 
 
;Turn model off map
 
call SetRotation
 
mov ebx,[mmcnt]
imul ebx,4*8
add ebx,model_mas+4-4
mov eax,[ebx]
 
mov [modeloff],eax
sub ebx,4*7;3
mov [modelmoff],ebx
 
mov edi,modelpoints
mov ecx,[eax] ;[bunker] ;MODEL_POINTS
 
ShowModelLoop:
push ecx
mov eax,[edi] ;esi]
 
mov ebx,[modelmoff]
sub eax,[ebx] ;[Xmod]
 
sub eax,[Xcam]
mov ebx,[Xmap]
imul ebx,SECTOR_SIZE
sub eax,ebx
mov [X],eax
mov eax,[edi+4] ;esi+4]
 
mov ebx,[modelmoff]
sub eax,[ebx+4] ;[Ymod]
 
sub eax,[Ycam]
mov ebx,[Ymap]
imul ebx,SECTOR_SIZE
sub eax,ebx
mov [Y],eax
mov eax,[edi+8];esi+8]
 
mov ebx,[modelmoff]
sub eax,[ebx+8] ;[Zmod]
 
sub eax,[Zcam]
mov [Z],eax
push ebp
push edi
call TranslatePoint ; Rotates the point using above formulas
pop edi
mov [edi],ebp ;x
mov [edi+4],eax ;y
mov eax,[Z] ;z
add eax,[Zoff]
mov [edi+8],eax
pop ebp
pop ecx
 
add edi,4*3 ;next out point
 
dec ecx
jnz ShowModelLoop
 
 
; add [model_mas+8],dword 3
 
 
 
mov esi,[massize]
imul esi,4*10
 
mov eax,[modeloff]
mov ecx,[eax+4] ;MODEL_TRIANGELS
 
;calc tmpoints offset
mov edi,modelpoints
mov [modeltmpoff],edi
 
;calc postlink offset
mov edi,[eax]
imul edi,3*4;*2 ;X,Y,Z (3) points dd format (4) 2 masives (2)
add edi,eax
add edi,8 ;skip dd points, dd triangels
msloo:
 
mov ebx,[edi]
imul ebx,4*3
add ebx,[modeltmpoff] ;tmpoints
mov eax,[ebx]
mov [@@tx1],eax
mov eax,[ebx+4]
mov [@@ty1],eax
mov eax,[ebx+8]
mov [@@tz1],eax
 
mov ebx,[edi+4]
imul ebx,4*3
add ebx,[modeltmpoff] ;tmpoints
mov eax,[ebx]
mov [@@tx2],eax
mov eax,[ebx+4]
mov [@@ty2],eax
mov eax,[ebx+8]
mov [@@tz2],eax
 
mov ebx,[edi+8]
imul ebx,4*3
add ebx,[modeltmpoff] ;tmpoints
mov eax,[ebx]
mov [@@tx3],eax
mov eax,[ebx+4]
mov [@@ty3],eax
mov eax,[ebx+8]
mov [@@tz3],eax
 
 
cmp dword [@@tz1],Z_MAX
jl no_add
cmp dword [@@tz2],Z_MAX
jl no_add
cmp dword [@@tz3],Z_MAX
jl no_add
cmp dword [@@tx1],SCREEN_X
ja pm1
cmp dword [@@ty1],SCREEN_Y
jna yes_madd
pm1:
cmp dword [@@tx2],SCREEN_X
ja pm2
cmp dword [@@ty2],SCREEN_Y
jna yes_madd
pm2:
cmp dword [@@tx3],SCREEN_X
ja pm3
cmp dword [@@ty3],SCREEN_Y
jna yes_madd
pm3:
jmp no_add
yes_madd:
 
 
 
 
mov ebx,[edi+12]
dec ebx
js ttex
mov eax,1 shl 31
jmp posit
ttex:
add ebx,2
mov eax,0
neg ebx
posit:
imul ebx,4095;32*32*3
add ebx,texture_img
mov [@@tex_off],ebx
 
pushad
mov [@@tex_x1],0
mov [@@tex_y1],0
mov [@@tex_x3],(32 shl 16) -1;128
mov [@@tex_y3],(32 shl 16) -1;128
cmp eax,0
je nez
mov [@@tex_x2],0
mov [@@tex_y2],(32 shl 16) -1
jmp isz
nez:
mov [@@tex_x2],(32 shl 16) -1
mov [@@tex_y2],0
isz:
call textured_triangle
popad
 
; mov [esi+8+24+4],eax
; add esi,4*10
inc [massize]
no_add:
add edi,4*4; *9
dec ecx
jnz msloo
 
dec [mmcnt]
jnz ModelRenderLoop
 
 
jmp skip_mdata
 
bunker:
dd 8 ;model points
dd 10 ;model triagels
;mpoints:
dd -105,-105,0, -105,105,0, 105,105,0, 105,-105,0
dd -70,-70,-50, -70,70,-50, 70,70,-50, 70,-70,-50
 
; 4-------7 Points structure
; |\0---3/|
; | | | |
; | | | |
; |/1---2\|
; 5-------6
 
;pointslink:
;dd 0,1,2, -3, 0,3,2, 3 ;far side
dd 4,0,1, -5, 4,5,1, 5 ;left side
dd 6,2,3, -5, 6,7,3, 5 ;right side
dd 4,0,3, -5, 4,7,3, 5 ;up side
dd 5,1,2, -5, 5,6,2, 5 ;down side
dd 4,5,6, -6, 4,7,6, 6 ;far side
 
;model 2 outpost
outpost:
dd 8 ;model points
dd 10 ;model triagels
;mpoints:
dd -45,-45,0, -45,45,0, 45,45,0, 45,-45,0
dd -30,-30,-20, -30,30,-20, 30,30,-20, 30,-30,-20
;pointslink:
;dd 0,1,2, -3, 0,3,2, 3 ;far side
dd 4,0,1, -8, 4,5,1, 8 ;left side
dd 6,2,3, -8, 6,7,3, 8 ;right side
dd 4,0,3, -8, 4,7,3, 8 ;up side
dd 5,1,2, -8, 5,6,2, 8 ;down side
dd 4,5,6, -7, 4,7,6, 7 ;near side
 
;model 3 cannon
cannon:
dd 12 ;model points
dd 12 ;model triagels
;mpoints:
dd -10,-20,0, -10,20,0, 10,20,0, 10,-20,0
dd -10,-10,-15, -10,10,-15, 10,10,-15, 10,-10,-15
dd -2,15,-8, 2,15,-8, -2,45,-8, 2,45,-8
;pointslink:
;dd 0,1,2, -3, 0,3,2, 3 ;far side
dd 4,0,1, -10, 4,5,1, 10 ;left side
dd 6,2,3, -10, 6,7,3, 10 ;right side
dd 4,0,3, -10, 4,7,3, 10 ;up side
dd 5,1,2, -10, 5,6,2, 10 ;down side
dd 4,5,6, -11, 4,7,6, 11 ;near side
dd 8,9,10,-10, 9,10,11,10 ;cannon 1
 
;model 4 red flag
red_flag:
dd 12 ;model points
dd 6*2 ;model triagels
;mpoints:
dd -1,-1,0, -1,1,0, 1,1,0, 1,-1,0
dd -1,-1,-30, -1,1,-30, 1,1,-30, 1,-1,-30
dd 1,1,-30, 10,1,-30, 10,1,-20, 1,1,-20
;pointslink:
dd 4,0,1, -10, 4,5,1, 15 ;left side
dd 6,2,3, -10, 6,7,3, 15 ;right side
dd 4,0,3, -10, 4,7,3, 15 ;up side
dd 5,1,2, -10, 5,6,2, 15 ;down side
dd 4,5,6, -10, 4,7,6, 15 ;near side
dd 8,11,10,-49, 8,9,10,49 ;flag
 
repear:
dd 8 ;model points
dd 10 ;model triagels
;mpoints:
dd -45,-45,0, -45,45,0, 45,45,0, 45,-45,0
dd -30,-30,-20, -30,30,-20, 30,30,-20, 30,-30,-20
;pointslink:
dd 4,0,1, -5, 4,5,1, 5 ;left side
dd 6,2,3, -5, 6,7,3, 5 ;right side
dd 4,0,3, -5, 4,7,3, 5 ;up side
dd 5,1,2, -5, 5,6,2, 5 ;down side
dd 4,5,6, -3, 4,7,6, 3 ;far side
 
;model 5 tree (elka)
tree:
dd 16 ;model points
dd 8*2 ;model triagels
;mpoints:
dd -2,-2,0, -2,2,0, 2,2,0, 2,-2,0
dd -1,-1,-8, -1,1,-8, 1,1,-8, 1,-1,-8
dd -10,-10,-8, -10,10,-8, 10,10,-8, 10,-10,-8
dd -1,-1,-40, -1,1,-40, 1,1,-40, 1,-1,-40
;pointslink:
dd 4,0,1, -16, 4,5,1, 16 ;left side
dd 6,2,3, -16, 6,7,3, 16 ;right side
dd 4,0,3, -16, 4,7,3, 16 ;up side
dd 5,1,2, -16, 5,6,2, 16 ;down side
 
dd 12,8,9, -14, 12,13,9, 14 ;left side
dd 14,10,11, -14, 14,15,11, 14 ;right side
dd 12,8,11, -14, 12,15,11, 14 ;up side
dd 13,9,10, -14, 13,14,10, 14 ;down side
 
;model tank
tank:
dd 20 ;model points
dd 12+10 ;model triagels
;mpoints:
dd -10,-20,-10, -10,20,-10, 10,20,-10, 10,-20,-10
dd -10,-10,-20, -10,10,-20, 10,10,-20, 10,-10,-20
dd -2,15,-15, 2,15,-15, -2,45,-15, 2,45,-15
 
dd -20,-20,0, -20,20,0, 20,20,0, 20,-20,0
dd -20,-30,-10, -20,30,-10, 20,30,-10, 20,-30,-10
 
;pointslink:
;dd 0,1,2, -3, 0,3,2, 3 ;far side
dd 4,0,1, -10, 4,5,1, 10 ;left side
dd 6,2,3, -10, 6,7,3, 10 ;right side
dd 4,0,3, -10, 4,7,3, 10 ;up side
dd 5,1,2, -10, 5,6,2, 10 ;down side
dd 4,5,6, -11, 4,7,6, 11 ;near side
dd 8,9,10,-10, 9,10,11,10 ;cannon 1
 
dd 16,12,13, -11, 16,17,13, 11 ;left side
dd 18,14,15, -11, 18,19,15, 11 ;right side
dd 16,12,15, -11, 16,19,15, 11 ;up side
dd 17,13,14, -11, 17,18,14, 11 ;down side
dd 16,17,18, -11, 16,19,18, 11 ;near side
 
;Test model
gqfa: ;Good quality four angle
dd 5 ;model points
dd 4 ;model triagels
;mpoints:
;dd -45,-145,0, -45,145,0, 45,45,0, 45,-45,0
dd -0,-105,0, -0,105,0, 45,45,0, 45,-45,0
dd 30,0,0
;pointslink:
dd 1,4,0, 50 ;left side
dd 1,4,2, 51 ;right side
dd 3,4,2, -50 ;up side
dd 3,4,0, -51 ;down side
 
skip_mdata:
 
;***************
; Add new models
;***************
; jmp no_addmodel
 
random 20,eax
sub eax,10
imul eax,SECTOR_SIZE
add eax,SECTOR_SIZE/2
mov [temp1],eax
random 20,eax
sub eax,10
imul eax,SECTOR_SIZE
add eax,SECTOR_SIZE/2
mov [temp2],eax
 
mov eax,dword [model_mas]
cmp eax,40;00
jae no_addmodel
imul eax,4*8;
add eax,4+model_mas
inc dword [model_mas]
mov ebx,[temp1]
mov [eax],ebx
mov ebx,[temp2]
mov [eax+4],ebx
mov [eax+8],dword -170
mov ebx,0
mov [eax+12],ebx
mov [eax+16],ebx
mov [eax+20],ebx
mov ebx,tree;red_flag
mov [eax+28],ebx
jmp skip_mdata ;use for auto filling at start
no_addmodel:
 
ret
 
 
UpdateAngles:
; Calculates new x,y,z angles
; to autorotate around
 
mov eax,[Xangle] ; Load current angles
mov ebx,[Yangle]
mov ecx,[Zangle]
 
add eax,[DeltaX] ; Add velocity
and eax,011111111b ; Range from 0..255
mov [Xangle],eax ; Update X
add ebx,[DeltaY] ; Add velocity
and ebx,011111111b ; Range from 0..255
mov [Yangle],ebx ; Update Y
add ecx,[DeltaZ] ; Add velocity
and ecx,011111111b ; Range from 0..255
mov [Zangle],ecx ; Update Z
ret
 
GetSinCos:
; Needed : bx=angle (0..255)
; Returns: ax=Sin bx=Cos
push ebx ; Save angle (use as pointer)
shl ebx,2 ; Grab a word so bx=bx*2
mov eax,[SinCos + ebx] ; Get sine
pop ebx ; Restore pointer into bx
push eax ; Save sine on stack
add ebx,64 ; Add 64 to get cosine
and ebx,11111111b ; Range from 0..255
shl ebx,2 ; *2 coz it's a word
mov eax,[SinCos + ebx] ; Get cosine
mov ebx,eax ; Save it bx=Cos
pop eax ; Restore ax=Sin
ret
 
; Get sin & cos of x,y,z angle
SetRotation:
mov ebx,[Xangle] ; Grab angle
call GetSinCos ; Get the sine&cosine
mov [Xsin],eax ; Save sin
mov [Xcos],ebx ; Save cos
 
mov ebx,[Yangle]
call GetSinCos
mov [Ysin],eax
mov [Ycos],ebx
 
mov ebx,[Zangle]
call GetSinCos
mov [Zsin],eax
mov [Zcos],ebx
; for camera
mov ebx,[Xcamangle]
call GetSinCos
mov [Xcamsin],eax
mov [Xcamcos],ebx
 
mov ebx,[Ycamangle]
call GetSinCos
mov [Ycamsin],eax
mov [Ycamcos],ebx
 
mov ebx,[Zcamangle]
call GetSinCos
mov [Zcamsin],eax
mov [Zcamcos],ebx
 
ret
 
TranslatePoint: ; Rotates the point around x,y,z
; Gets original x,y,z values
; This can be done elsewhere
 
mov esi,[X]
mov edi,[Y]
mov ebx,[Zcamcos]
mov ecx,[Zcamsin]
call math
mov [X],esi
mov [Y],edi
 
mov esi,[Y]
mov edi,[Z]
mov ebx,[Xcamcos]
mov ecx,[Xcamsin]
call math
mov [Y],esi
mov [Z],edi
 
mov esi,[X]
mov edi,[Z]
mov ebx,[Ycamcos]
mov ecx,[Ycamsin]
call math
mov [X],esi
mov [Z],edi
 
mov esi,[Y]
mov ebx,[Xcos]
mov edi,[Z]
mov ecx,[Xsin]
call math
mov [Y],esi
mov [Z],edi
mov esi,[X]
mov ebx,[Ycos]
mov ecx,[Ysin]
call math
mov [X],esi
mov [Z],edi
mov ebx,[Zcos]
mov edi,[Y]
mov ecx,[Zsin]
call math
 
;*************
; ShowPoint
;*************
 
; Calculates screenposition and
; plots the point on the screen
mov eax,[Xoff] ; Xoff*X / Z+Zoff = screen x
mov ecx,esi
imul ecx
 
mov ebx,[Z]
add ebx,[Zoff] ; Distance
 
cmp ebx,0
je notout
idiv ebx
add eax,[Mx] ; Center on screen
mov ebp,eax ;ebp =Xp
 
mov eax,[Yoff] ; Yoff*Y / Z+Zoff = screen y
mov ecx,edi
imul ecx
 
cmp ebx,0
je notout
idiv ebx ;eax =Yp
add eax,[My] ; Center on screen
 
notout:
ret
 
math:
mov eax,esi
imul ebx ; ax = X * Cos(zang)
mov ebp,eax
mov eax,edi
imul ecx ; ax = Y * Sin(zang)
sub ebp,eax ; bp = X * Cos(zang) - Y * Sin(zang)
sar ebp,8 ; bp = X * Cos(zang) - Y * Sin(zang) / 256
 
mov eax,esi
mov esi,ebp
imul ecx ; ax = X * Sin(zang)
mov ebp,eax
mov eax,edi
imul ebx ; ax = Y * Cos(zang)
add ebp,eax ; bp = X * SIN(zang) + Y * COS(zang)
sar ebp,8 ; bp = X * SIN(zang) + Y * COS(zang) / 256
mov edi,ebp
ret
 
SinCos:
dd 0,6,13,19,25,31,38,44,50,56
dd 62,68,74,80,86,92,98,104,109,115
dd 121,126,132,137,142,147,152,157,162,167
dd 172,177,181,185,190,194,198,202,206,209
dd 213,216,220,223,226,229,231,234,237,239
dd 241,243,245,247,248,250,251,252,253,254
dd 255,255,256,256,256,256,256,255,255,254
dd 253,252,251,250,248,247,245,243,241,239
dd 237,234,231,229,226,223,220,216,213,209
dd 206,202,198,194,190,185,181,177,172,167
dd 162,157,152,147,142,137,132,126,121,115
dd 109,104,98,92,86,80,74,68,62,56
dd 50,44,38,31,25,19,13,6,0,-6
dd -13,-19,-25,-31,-38,-44,-50,-56,-62,-68
dd -74,-80,-86,-92,-98,-104,-109,-115,-121,-126
dd -132,-137,-142,-147,-152,-157,-162,-167,-172,-177
dd -181,-185,-190,-194,-198,-202,-206,-209,-213,-216
dd -220,-223,-226,-229,-231,-234,-237,-239,-241,-243
dd -245,-247,-248,-250,-251,-252,-253,-254,-255,-255
dd -256,-256,-256,-256,-256,-255,-255,-254,-253,-252
dd -251,-250,-248,-247,-245,-243,-241,-239,-237,-234
dd -231,-229,-226,-223,-220,-216,-213,-209,-206,-202
dd -198,-194,-190,-185,-181,-177,-172,-167,-162,-157
dd -152,-147,-142,-137,-132,-126,-121,-115,-109,-104
dd -98,-92,-86,-80,-74,-68,-62,-56,-50,-44
dd -38,-31,-25,-19,-13,-6
 
mipzoom dd 0
mipmapwork dd 0
temp1 dd 0
temp2 dd 0
 
; 4.24.2005 Textured triangle algorythm
; created by Pavlushin Evgeni waptap[at]mail.ru
; on base tex3 from Mikolaj Felix mfelix@polbox.com
 
align 512
@@tx1 dd 0 ;equ [bp+4]
@@ty1 dd 0 ;equ [bp+6]
align 512
@@tx2 dd 0 ;equ [bp+8]
@@ty2 dd 0 ;equ [bp+10]
align 512
@@tx3 dd 0 ;equ [bp+12]
@@ty3 dd 0 ;equ [bp+14]
 
@@tz1 dd 0
@@tz2 dd 0
@@tz3 dd 0
 
@@z_dy12 dd 0
@@z_dy13 dd 0
@@z_dy23 dd 0
 
@@tex_off dd 0 ;equ [bp+16]
@@tex_x1 dd 0 ;equ [bp+18]
@@tex_y1 dd 0 ;equ [bp+20]
@@tex_x2 dd 0 ;equ [bp+22]
@@tex_y2 dd 0 ;equ [bp+24]
@@tex_x3 dd 0 ;equ [bp+26]
@@tex_y3 dd 0 ;equ [bp+28]
 
@@dx12 dd 0 ;equ [bp-2]
@@dx13 dd 0 ;equ [bp-4]
@@dx23 dd 0 ;equ [bp-6]
 
@@tex_dx12 dd 0 ;equ [bp-8]
@@tex_dy12 dd 0 ;equ [bp-10]
@@tex_dx13 dd 0 ;equ [bp-12]
@@tex_dy13 dd 0 ;equ [bp-14]
@@tex_dx23 dd 0 ;equ [bp-16]
@@tex_dy23 dd 0 ;equ [bp-18]
 
@@scan_x1 dd 0
@@scan_y1 dd 0
@@scan_x2 dd 0
@@scan_y2 dd 0
 
@@scan_z1 dd 0
@@scan_z2 dd 0
 
SHIFT=16
 
textured_triangle:
 
mov eax,[@@ty1]
cmp eax,[@@ty3]
jle tt_check1
 
xchg eax,[@@ty3]
mov [@@ty1],eax
 
mov eax,[@@tx1]
xchg eax,[@@tx3]
mov [@@tx1],eax
 
mov eax,[@@tz1]
xchg eax,[@@tz3]
mov [@@tz1],eax
 
mov eax,[@@tex_y1]
xchg eax,[@@tex_y3]
mov [@@tex_y1],eax
 
mov eax,[@@tex_x1]
xchg eax,[@@tex_x3]
mov [@@tex_x1],eax
tt_check1:
mov eax,[@@ty2]
cmp eax,[@@ty3]
jle tt_check2
 
xchg eax,[@@ty3]
mov [@@ty2],eax
 
mov eax,[@@tx2]
xchg eax,[@@tx3]
mov [@@tx2],eax
 
mov eax,[@@tz2]
xchg eax,[@@tz3]
mov [@@tz2],eax
 
mov eax,[@@tex_y2]
xchg eax,[@@tex_y3]
mov [@@tex_y2],eax
 
mov eax,[@@tex_x2]
xchg eax,[@@tex_x3]
mov [@@tex_x2],eax
tt_check2:
mov eax,[@@ty1]
cmp eax,[@@ty2]
jle tt_check3
 
xchg eax,[@@ty2]
mov [@@ty1],eax
 
mov eax,[@@tx1]
xchg eax,[@@tx2]
mov [@@tx1],eax
 
mov eax,[@@tz1]
xchg eax,[@@tz2]
mov [@@tz1],eax
 
mov eax,[@@tex_y1]
xchg eax,[@@tex_y2]
mov [@@tex_y1],eax
 
mov eax,[@@tex_x1]
xchg eax,[@@tex_x2]
mov [@@tex_x1],eax
tt_check3:
 
mov ebx,[@@ty2]
sub ebx,[@@ty1]
jnz tt_dx12_make
 
mov [@@dx12],0
mov [@@tex_dx12],0
mov [@@tex_dy12],0
mov [@@z_dy12],0
jmp tt_dx12_done
tt_dx12_make:
mov eax,[@@tx2]
sub eax,[@@tx1]
shl eax,SHIFT
cdq
idiv ebx
mov [@@dx12],eax ; dx12 = (x2-x1)/(y2-y1)
 
mov eax,[@@tex_x2]
sub eax,[@@tex_x1]
cdq
idiv ebx
mov [@@tex_dx12],eax ; tex_dx12 = (tex_x2-tex_x1)/(y2-y1)
 
mov eax,[@@tex_y2]
sub eax,[@@tex_y1]
cdq
idiv ebx
mov [@@tex_dy12],eax ; tex_dy12 = (tex_y2-tex_y1)/(y2-y1)
 
mov eax,[@@tz2]
sub eax,[@@tz1]
shl eax,SHIFT
cdq
idiv ebx
mov [@@z_dy12],eax
 
tt_dx12_done:
 
mov ebx,[@@ty3]
sub ebx,[@@ty1]
jnz tt_dx13_make
 
mov [@@dx13],0
mov [@@tex_dx13],0
mov [@@tex_dy13],0
mov [@@z_dy13],0
jmp tt_dx13_done
tt_dx13_make:
mov eax,[@@tx3]
sub eax,[@@tx1]
shl eax,SHIFT
cdq
idiv ebx
mov [@@dx13],eax ; dx13 = (x3-x1)/(y3-y1)
 
mov eax,[@@tex_x3]
sub eax,[@@tex_x1]
cdq
idiv ebx
mov [@@tex_dx13],eax ; tex_dx13 = (tex_x3-tex_x1)/(y3-y1)
 
mov eax,[@@tex_y3]
sub eax,[@@tex_y1]
cdq
idiv ebx
mov [@@tex_dy13],eax ; tex_dy13 = (tex_y3-tex_x1)/(y3-y1)
 
mov eax,[@@tz3]
sub eax,[@@tz1]
shl eax,SHIFT
cdq
idiv ebx
mov [@@z_dy13],eax
tt_dx13_done:
 
mov ebx,[@@ty3]
sub ebx,[@@ty2]
jnz tt_dx23_make
 
mov [@@dx23],0
mov [@@tex_dx23],0
mov [@@tex_dy23],0
mov [@@z_dy23],0
jmp tt_dx23_done
tt_dx23_make:
mov eax,[@@tx3]
sub eax,[@@tx2]
shl eax,SHIFT
cdq
idiv ebx
mov [@@dx23],eax ; dx23 = (x3-x2)/(y3-y2)
 
mov eax,[@@tex_x3]
sub eax,[@@tex_x2]
cdq
idiv ebx
mov [@@tex_dx23],eax ; tex_dx23 = (tex_x3-tex_x2)/(y3-y2)
 
mov eax,[@@tex_y3]
sub eax,[@@tex_y2]
cdq
idiv ebx
mov [@@tex_dy23],eax ; tex_dy23 = (tex_y3-tex_y2)/(y3-y2)
 
mov eax,[@@tz3]
sub eax,[@@tz2]
shl eax,SHIFT
cdq
idiv ebx
mov [@@z_dy23],eax
tt_dx23_done:
 
 
mov eax,[@@tx1]
shl eax,SHIFT
mov ebx,eax
mov ecx,[@@ty1]
 
mov edx,[@@tz1]
shl edx,SHIFT
mov [@@scan_z1],edx
mov [@@scan_z2],edx
 
mov edx,[@@tex_x1]
mov [@@scan_x1],edx
mov [@@scan_x2],edx
mov edx,[@@tex_y1]
mov [@@scan_y1],edx
mov [@@scan_y2],edx
 
; ****************
mov edx,[@@ty1] ;skip equals
cmp [@@ty2],edx
je tt_loop1_end
 
mov ebp,[@@ty1]
cmp ebp,0
jg no_up_clip
neg ebp
mov edx,[@@ty2]
cmp edx,0
jg no_sbx
neg edx
sub ebp,edx
no_sbx:
 
mov edx,[@@tex_dx13]
imul edx,ebp
add [@@scan_x1],edx
mov edx,[@@tex_dx12]
imul edx,ebp
add [@@scan_x2],edx
mov edx,[@@tex_dy13]
imul edx,ebp
add [@@scan_y1],edx
mov edx,[@@tex_dy12]
imul edx,ebp
add [@@scan_y2],edx
 
mov edx,[@@z_dy13]
imul edx,ebp
add [@@scan_z1],edx
mov edx,[@@z_dy12]
imul edx,ebp
add [@@scan_z2],edx
 
mov edx,[@@dx13]
imul edx,ebp
add eax,edx
mov edx,[@@dx12]
imul edx,ebp
add ebx,edx
add ecx,ebp
no_up_clip:
 
cmp [@@ty2],0
jl tt_loop1_end
 
tt_loop1:
cmp ecx,SCREEN_Y
jge tt_loop2_end
 
pushad
mov edx,[@@scan_y2]
mov [@@tex_ly2],edx ;push dx
mov edx,[@@scan_x2]
mov [@@tex_lx2],edx ;push dx
mov edx,[@@scan_y1]
mov [@@tex_ly1],edx ;push dx
mov edx,[@@scan_x1]
mov [@@tex_lx1],edx ;push dx
 
mov edx,[@@scan_z1]
mov [@@lz1],edx
mov edx,[@@scan_z2]
mov [@@lz2],edx
 
mov [@@ly],ecx ;push cx
mov edx,ebx
sar edx,SHIFT
mov [@@lx2],edx ;push dx
mov edx,eax
sar edx,SHIFT
mov [@@lx1],edx ; push dx
call textured_horizontal_line
popad
 
mov edx,[@@tex_dx13]
add [@@scan_x1],edx
mov edx,[@@tex_dx12]
add [@@scan_x2],edx
mov edx,[@@tex_dy13]
add [@@scan_y1],edx
mov edx,[@@tex_dy12]
add [@@scan_y2],edx
 
mov edx,[@@z_dy13]
add [@@scan_z1],edx
mov edx,[@@z_dy12]
add [@@scan_z2],edx
 
add eax,[@@dx13]
add ebx,[@@dx12]
inc ecx
cmp ecx,[@@ty2]
jl tt_loop1
 
tt_loop1_end:
 
mov ebx,[@@tx2]
shl ebx,SHIFT
mov ecx,[@@ty2]
 
mov edx,[@@tz2]
shl edx,SHIFT
mov [@@scan_z2],edx
 
mov edx,[@@tex_x2]
mov [@@scan_x2],edx
mov edx,[@@tex_y2]
mov [@@scan_y2],edx
 
mov ebp,[@@ty2]
cmp ebp,0
jg no_down_clip
neg ebp
dec ebp
 
mov edx,[@@tex_dx13]
imul edx,ebp
add [@@scan_x1],edx
mov edx,[@@tex_dx23]
imul edx,ebp
add [@@scan_x2],edx
mov edx,[@@tex_dy13]
imul edx,ebp
add [@@scan_y1],edx
mov edx,[@@tex_dy23]
imul edx,ebp
add [@@scan_y2],edx
 
mov edx,[@@z_dy13]
imul edx,ebp
add [@@scan_z1],edx
mov edx,[@@z_dy23]
imul edx,ebp
add [@@scan_z2],edx
 
mov edx,[@@dx13]
imul edx,ebp
add eax,edx
mov edx,[@@dx23]
imul edx,ebp
add ebx,edx
add ecx,ebp
no_down_clip:
 
tt_loop2:
cmp ecx,SCREEN_Y
jge tt_loop2_end
 
pushad
mov edx,[@@scan_y2]
mov [@@tex_ly2],edx ;push dx
mov edx,[@@scan_x2]
mov [@@tex_lx2],edx ;push dx
mov edx,[@@scan_y1]
mov [@@tex_ly1],edx ;push dx
mov edx,[@@scan_x1]
mov [@@tex_lx1],edx ;push dx
 
mov edx,[@@scan_z1]
mov [@@lz1],edx
mov edx,[@@scan_z2]
mov [@@lz2],edx
 
mov [@@ly],ecx ;push cx
mov edx,ebx
sar edx,SHIFT
mov [@@lx2],edx ;push dx
mov edx,eax
sar edx,SHIFT
mov [@@lx1],edx ; push dx
call textured_horizontal_line
popad
 
mov edx,[@@tex_dx13]
add [@@scan_x1],edx
mov edx,[@@tex_dx23]
add [@@scan_x2],edx
mov edx,[@@tex_dy13]
add [@@scan_y1],edx
mov edx,[@@tex_dy23]
add [@@scan_y2],edx
 
mov edx,[@@z_dy13]
add [@@scan_z1],edx
mov edx,[@@z_dy23]
add [@@scan_z2],edx
 
add eax,[@@dx13]
add ebx,[@@dx23]
inc ecx
cmp ecx,[@@ty3]
jl tt_loop2
 
tt_loop2_end:
ret
 
align 512
@@lx1 dd 0
align 512
@@lx2 dd 0
align 512
@@ly dd 0
 
@@lz1 dd 0
@@lz2 dd 0
@@z_dx dd 0
 
align 512
@@tex_loff dd 0 ;equ [bp+10]
@@tex_lx1 dd 0 ;equ [bp+12]
@@tex_ly1 dd 0 ;equ [bp+14]
@@tex_lx2 dd 0 ;equ [bp+16]
@@tex_ly2 dd 0 ;equ [bp+18]
 
align 512
@@tex_ldx dd 0 ;equ [bp-2]
@@tex_ldy dd 0 ;equ [bp-4]
 
align 1024
textured_horizontal_line:
 
mov eax,[@@lx1]
cmp eax,[@@lx2]
je thl_quit
jl thl_ok
 
xchg eax,[@@lx2]
mov [@@lx1],eax
 
mov eax,[@@lz1]
xchg eax,[@@lz2]
mov [@@lz1],eax
 
mov eax,[@@tex_lx1]
xchg eax,[@@tex_lx2]
mov [@@tex_lx1],eax
 
mov eax,[@@tex_ly1]
xchg eax,[@@tex_ly2]
mov [@@tex_ly1],eax
 
thl_ok:
 
cmp [@@lx2],0
jle thl_quit
mov eax,SCREEN_X
cmp [@@lx1],eax
jge thl_quit
 
mov ecx,[@@lx2]
sub ecx,[@@lx1]
 
; Uneversal method
mov edi,[@@ly]
mov eax,SCREEN_X ;di = ly*320+lx1
imul edi
add eax,[@@lx1]
imul eax,3
mov edi,eax
add edi,I_END
 
;Right side clipping
mov eax,SCREEN_X
cmp [@@lx2],eax
jnge x1ok
mov edx,SCREEN_X
dec edx
sub edx,[@@lx1]
cmp edx,0
jle thl_quit
mov ecx,edx
x1ok:
 
;Left side clipping
cmp [@@lx1],0
jg x2ok
mov ecx,[@@lx2] ;cmp lx2 screen x if above cut (for future)
mov edi,[@@ly]
mov eax,SCREEN_X
imul edi,eax
imul edi,3
add edi,I_END
x2ok:
 
mov ebx,[@@lx2]
sub ebx,[@@lx1]
 
mov eax,[@@tex_lx2]
sub eax,[@@tex_lx1]
cdq
idiv ebx
mov [@@tex_ldx],eax ; tex_dx = (tex_x2-tex_x1)/(x2-x1)
 
mov eax,[@@tex_ly2]
sub eax,[@@tex_ly1]
cdq
idiv ebx
mov [@@tex_ldy],eax ; tex_dy = (tex_y2-tex_y1)/(x2-x1)
 
mov eax,[@@lz2]
sub eax,[@@lz1]
cdq
idiv ebx
mov [@@z_dx],eax ; tex_dx = (tex_x2-tex_x1)/(x2-x1)
 
; Left clipping post correction
cmp [@@lx1],0
jg no_lcpc
mov eax,[@@lx1]
neg eax
mov ebp,[@@tex_ldx]
imul ebp,eax
add [@@tex_lx1],ebp
mov ebp,[@@tex_ldy]
imul ebp,eax
add [@@tex_ly1],ebp
mov ebp,[@@z_dx]
imul ebp,eax
add [@@lz1],ebp
no_lcpc:
 
inc ecx ;for equal correction
mov edx,[@@tex_lx1]
mov ebx,[@@tex_ly1]
mov esi,[@@lz1]
 
thl_loop:
mov ebp,esi
shr ebp,SHIFT
mov eax,dword [edi-I_END+zbuffer]
cmp ax,bp
jb no_set
mov [edi-I_END+zbuffer],bp
 
mov eax,edx
; and eax,0x0fff0000
ror ebx,16
mov ax,bx
ror ebx,16
shl ax,11 ; 8 for 256*256, 9 for 128*128 ...
shr eax,11
lea eax,[eax*2+eax] ; equ imul eax,3
add eax,[@@tex_off]
mov ebp,eax
 
mov ax,word [ebp]
mov [edi],ax
mov al,byte [ebp+2]
mov [edi+2],al
 
no_set:
add edi,3
 
add esi,[@@z_dx]
add edx,[@@tex_ldx]
add ebx,[@@tex_ldy]
dec ecx
jnz thl_loop
thl_quit:
ret
 
 
@@rgb dd 0
@@rgbax dw 0
@@rgbbl db 0
 
; === DATA ===
 
d_angle dd 0.19634954 ;pi/16
angle dd 0.0
mul_wave dd 1.5
 
sin_pos dw 0
sinwave rw 256
 
Xmap dd 0
Ymap dd 0
mapoff dd 0
 
Xcam dd 0
Ycam dd 0
Zcam dd -400
 
Xcamangle dd 0
Ycamangle dd 0
Zcamangle dd 0
 
Xcamsin dd 0
Xcamcos dd 0
Ycamsin dd 0
Ycamcos dd 0
Zcamsin dd 0
Zcamcos dd 0
 
X dd ? ; X,Y,Z variable for formula
Y dd ?
Z dd ?
 
Xp dd ?
Yp dd ?
 
Xangle dd 0 ; Angle to rotate around x
Yangle dd 0
Zangle dd 0
 
DeltaX dd 1 ; x,y,z rotation angle
DeltaY dd 1
DeltaZ dd 1
 
Xoff dd 256 ; x-cord
Yoff dd 256 ; y-cord
Zoff dd 0;800 ; Distance from viewer
 
Xsin dd ? ; Sine and cosine of angle to rotate around
Xcos dd ?
Ysin dd ?
Ycos dd ?
Zsin dd ?
Zcos dd ?
 
Mx dd SCREEN_X/2 ; Center of the screen
My dd SCREEN_Y/2
 
autorot db 0 ;Auto rotation flag
massize dd 0 ;Size of triangle massive
id dd 0
temp dd 0
 
; DATA AREA
labelt:
db '3D TEXTURED ENGINE'
labellen:
 
 
;Texture pusck 32*32 256
texpack_gif:
file 'TEXPACK.gif'
rb 50
 
;Ground texture
bmp_texmap:
file 'TEXMAP.bmp'
rb 50
 
 
; Ground livel map
gif_file_area5:
file 'MAP.gif' ;level map
rb 50
 
rb 8
texture_limg:
rb 4095
texture_img:
rb 4095
texture_img2:
rb 4095
 
rb (4095)*16*16
 
img_area:
rb 128*128*3+8
 
glm_img_area:
rb (MAP_XSIZE+1)*(MAP_YSIZE+1)*3+8
 
rb 8
 
texpack_img:
rb 512*512*3+8
 
keymap:
rb 1000
 
model_mas:
rb 4+8*100
 
; Hash area for decoding GIF
gif_hash_area:
rd 4096+1
 
MAX_MODEL_POINTS = 100
modelpoints:
rb MAX_MODEL_POINTS*3*4
 
; Matrix points massive
points:
; Massive of turn matrix points
tpoints=points+((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)*3*4)
; Ground level map massive
ground_level_map=tpoints+((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)*3*4)
; zbuffer
zbuffer=ground_level_map+((MAP_XSIZE+1)*(MAP_YSIZE+1)*4)
I_END=zbuffer+(SCREEN_X*SCREEN_Y)*3
/programs/demos/3detx60b/trunk/ascgl.inc
0,0 → 1,1385
lang equ ru
 
;
; 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 A., add at ~07.06.2004
;0.11 many macros optimized by Halyavin A., 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
{
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
 
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:
 
;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
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+36
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,6*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 equ 0x1000 ; 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 equ 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:
}
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/3detx60b/trunk/ascl.inc
0,0 → 1,897
lang equ ru ; ru en fr ge fi
 
;
; Assembler
; SMALL
; CODE
; Libary
;
; Ver 0.14 By Pavlushin Evgeni (RUSSIA)
; www.waptap@mail.ru
 
;Please compile aplications on FASM ver1.54 or higer!!!
 
;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
;0.10 wordstoreg by halyavin, add at ~30.08.2004
; random bug deleted eax is use.
;0.11 loadfile from me +puttxt bug del ~07.09.2004
;0.12 open/save dialog ~13.09.2004
;0.13 dialogs bugs deleted
;0.14 drawlbut ~03.10.2004
;0.15 extendet label!
 
; LOADFILE
; (SYNTAX) LOADFILE 'full_path_to_file',file_load_area,file_temp_area
; (SAMPLE) LOADFILE '/rd/1/clock.bmp',load_area,temp_area
 
 
macro loadfile file_name,file_load_area,file_temp_area
{
local open,fileinfo,string
jmp open
fileinfo:
dd 0
dd 0
dd 1
dd file_load_area
dd file_temp_area
string:
db file_name,0
open:
mov dword [fileinfo+8],1 ; how many blocks to read (1)
mov eax,58
mov ebx,fileinfo
int 0x40
mov eax,[file_load_area+2]
shr eax,9 ; ¯®¤¥«¨¬ ­  512 ¨ ¯à¨¡ ¢¨¬ 1 - ¯®«ã稬 ç¨á«® ¡«®ª®¢
inc eax
mov dword [fileinfo+8],eax
mov eax,58
mov ebx,fileinfo
int 0x40
}
 
 
;macro wordstoreg reg,hiword,loword
;{
;if hiword eqtype 0 & loword eqtype 0
; mov reg,dword hiword*65536+loword
;else if hiword eqtype 12 & loword eqtype eax
; mov reg,dword hiword*65536
; add reg,dword loword
;else if hiword eqtype 12 & loword eqtype [123]
; mov reg,dword hiword*65536
; add reg,dword loword
;else
; mov reg,dword hiword
; shl reg,16
; add reg,dword loword
;end if
;}
 
macro dword2reg reg,doubleword
{
if doubleword eq
; not changes
else
mov reg,dword doubleword
end if
}
 
macro words2reg reg,hiword,lowword
{
if hiword eq
if lowword eq
; not changes
else
if lowword eqtype 12
and reg,dword 0xffff0000
add reg,dword lowword
else
and reg,dword 0xffff0000
add reg,dword lowword
end if
end if
else
if lowword eq
if hiword eqtype 12
and reg,dword 0x0000ffff
add reg,dword hiword*65536
else
shl reg,16
add reg,dword hiword
ror reg,16
end if
else
if lowword eqtype 12 & hiword eqtype 12
if lowword eq 0 & hiword eq 0
xor reg,reg
else
mov reg,dword hiword*65536+lowword
end if
else
mov reg,dword hiword
shl reg,16
add reg,dword lowword
end if
end if
end if
}
 
 
 
 
; DRAW BUTTON with label
 
macro drawlbut x,y,xs,ys,text,id,bcolor,tcolor
{
local asd,lab
jmp asd
lab db text ;arg label
asd:
words2reg ebx,x,xs
words2reg ecx,y,ys
mov edx,id
mov esi,bcolor
mov eax,8
int 0x40
 
mov eax,asd-lab ;calc size
mov ebx,6
mul ebx
mov esi,eax
 
mov eax,xs
sub eax,esi
shr eax,1
add eax,x
 
mov edx,ys
sub edx,7
shr edx,1
add edx,y
 
mov ebx,eax
shl ebx,16
add ebx,edx
 
mov ecx,tcolor ;arg4 color
mov edx,lab
mov esi,asd-lab ;calc size
mov eax,4
int 0x40
}
 
 
macro opendialog redproc,openoff,erroff,path
{
local new_d, get_loops, dlg_pid_get, DLGPID, num_of_proc
local run_fileinfo, param
local getmesloop, loox, mred, mkey, mbutton, mgetmes
local dlg_is_work, ready, procinfo
;
; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec,
; 1 byte space, 1 byte type of dialog (O - Open ,S - Save)
;
 
cld
;; mov esi,path
mov edi,path
mov eax,0
mov ecx,200
rep stosb
 
;mov [get_loops],0
mov [dlg_pid_get],0
 
; Get my PID in dec format 4 bytes
mov eax,9
mov ebx,procinfo
mov ecx,-1
int 0x40
 
; convert eax bin to param dec
mov eax,dword [procinfo+30] ;offset of myPID
mov edi,param+4-1 ;offset to 4 bytes
mov ecx,4
mov ebx,10
cld
new_d:
xor edx,edx
div ebx
add dl,'0'
mov [edi],dl
dec edi
loop new_d
 
; wirite 1 byte space to param
mov [param+4],byte 32 ;Space for next parametr
; and 1 byte type of dialog to param
mov [param+5],byte 'O' ;Get Open dialog (Use 'S' for Save dialog)
 
;
; STEP2 prepare IPC area for get messages
;
 
; prepare IPC area
mov [path],dword 0
mov [path+4],dword 8
 
; define IPC memory
mov eax,60
mov ebx,1 ; define IPC
mov ecx,path ; offset of area
mov edx,150 ; size 150 bytes
int 0x40
 
; change wanted events list 7-bit IPC event
mov eax,40
mov ebx,01000111b
int 0x40
 
;
; STEP 3 run SYSTEM XTREE with parameters
;
 
mov eax,58
mov ebx,run_fileinfo
int 0x40
 
call redproc
 
mov [get_loops],0
getmesloop:
mov eax,23
mov ebx,50 ;0.5 sec
int 0x40
 
cmp eax,1
je mred
cmp eax,2
je mkey
cmp eax,3
je mbutton
cmp eax,7
je mgetmes
 
; Get number of procces
mov ebx,procinfo
mov ecx,-1
mov eax,9
int 0x40
mov ebp,eax
 
loox:
mov eax,9
mov ebx,procinfo
mov ecx,ebp
int 0x40
mov eax,[DLGPID]
cmp [procinfo+30],eax ;IF Dialog find
je dlg_is_work ;jmp to dlg_is_work
dec ebp
jnz loox
 
jmp erroff
 
dlg_is_work:
cmp [procinfo+50],word 9 ;If slot state 9 - dialog is terminated
je erroff ;TESTODP2 terminated too
 
cmp [dlg_pid_get],dword 1
je getmesloop
inc [get_loops]
cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated
jae erroff
jmp getmesloop
 
mred:
call redproc
jmp getmesloop
mkey:
mov eax,2
int 0x40 ; read (eax=2)
jmp getmesloop
mbutton:
mov eax,17 ; get id
int 0x40
cmp ah,1 ; button id=1 ?
jne getmesloop
mov eax,-1 ; close this program
int 0x40
mgetmes:
 
; If dlg_pid_get then second message get jmp to still
cmp [dlg_pid_get],dword 1
je ready
 
; First message is number of PID SYSXTREE dialog
 
; convert PID dec to PID bin
movzx eax,byte [path+16]
sub eax,48
imul eax,10
movzx ebx,byte [path+16+1]
add eax,ebx
sub eax,48
imul eax,10
movzx ebx,byte [path+16+2]
add eax,ebx
sub eax,48
imul eax,10
movzx ebx,byte [path+16+3]
add eax,ebx
sub eax,48
mov [DLGPID],eax
 
; Claear and prepare IPC area for next message
mov [path],dword 0
mov [path+4],dword 8
mov [path+8],dword 0
mov [path+12],dword 0
mov [path+16],dword 0
 
; Set dlg_pid_get for get next message
mov [dlg_pid_get],dword 1
call redproc ;show DLG_PID
jmp getmesloop
 
ready:
;
; The second message get
; Second message is 100 bytes path to SAVE/OPEN file
; shl path string on 16 bytes
;
cld
mov esi,path+16
mov edi,path
mov ecx,200
rep movsb
mov [edi],byte 0
 
jmp openoff
 
 
; DATA AREA
get_loops dd 0
dlg_pid_get dd 0
DLGPID dd 0
 
param:
dd 0 ; My dec PID
dd 0,0 ; Type of dialog
 
run_fileinfo:
dd 16
dd 0
dd param
dd 0
dd procinfo ; 0x10000
;run_filepath
db '/RD/1/SYSXTREE',0
 
procinfo:
times 1024 db 0
}
 
 
macro savedialog redproc,openoff,erroff,path
{
local new_d, get_loops, dlg_pid_get, DLGPID, num_of_proc
local run_fileinfo, run_filepath, param
local getmesloop, loox, mred, mkey, mbutton, mgetmes
local dlg_is_work, ready, procinfo
;
; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec,
; 1 byte space, 1 byte type of dialog (O - Open ,S - Save)
;
 
cld
;; mov esi,path
mov edi,path
mov eax,0
mov ecx,200
rep stosb
 
;mov [get_loops],0
mov [dlg_pid_get],0
 
; Get my PID in dec format 4 bytes
mov eax,9
mov ebx,procinfo
mov ecx,-1
int 0x40
 
; convert eax bin to param dec
mov eax,dword [procinfo+30] ;offset of myPID
mov edi,param+4-1 ;offset to 4 bytes
mov ecx,4
mov ebx,10
cld
new_d:
xor edx,edx
div ebx
add dl,'0'
mov [edi],dl
dec edi
loop new_d
 
; wirite 1 byte space to param
mov [param+4],byte 32 ;Space for next parametr
; and 1 byte type of dialog to param
mov [param+5],byte 'S' ;Get Open dialog (Use 'S' for Save dialog)
 
;
; STEP2 prepare IPC area for get messages
;
 
; prepare IPC area
mov [path],dword 0
mov [path+4],dword 8
 
; define IPC memory
mov eax,60
mov ebx,1 ; define IPC
mov ecx,path ; offset of area
mov edx,150 ; size 150 bytes
int 0x40
 
; change wanted events list 7-bit IPC event
mov eax,40
mov ebx,01000111b
int 0x40
 
;
; STEP 3 run SYSTEM XTREE with parameters
;
 
mov eax,58
mov ebx,run_fileinfo
int 0x40
 
call redproc
 
mov [get_loops],0
getmesloop:
mov eax,23
mov ebx,50 ;0.5 sec
int 0x40
 
cmp eax,1
je mred
cmp eax,2
je mkey
cmp eax,3
je mbutton
cmp eax,7
je mgetmes
 
; Get number of procces
mov ebx,procinfo
mov ecx,-1
mov eax,9
int 0x40
mov ebp,eax
 
loox:
mov eax,9
mov ebx,procinfo
mov ecx,ebp
int 0x40
mov eax,[DLGPID]
cmp [procinfo+30],eax ;IF Dialog find
je dlg_is_work ;jmp to dlg_is_work
dec ebp
jnz loox
 
jmp erroff
 
dlg_is_work:
cmp [procinfo+50],word 9 ;If slot state 9 - dialog is terminated
je erroff ;TESTODP2 terminated too
 
cmp [dlg_pid_get],dword 1
je getmesloop
inc [get_loops]
cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated
jae erroff
jmp getmesloop
 
mred:
call redproc
jmp getmesloop
mkey:
mov eax,2
int 0x40 ; read (eax=2)
jmp getmesloop
mbutton:
mov eax,17 ; get id
int 0x40
cmp ah,1 ; button id=1 ?
jne getmesloop
mov eax,-1 ; close this program
int 0x40
mgetmes:
 
; If dlg_pid_get then second message get jmp to still
cmp [dlg_pid_get],dword 1
je ready
 
; First message is number of PID SYSXTREE dialog
 
; convert PID dec to PID bin
movzx eax,byte [path+16]
sub eax,48
imul eax,10
movzx ebx,byte [path+16+1]
add eax,ebx
sub eax,48
imul eax,10
movzx ebx,byte [path+16+2]
add eax,ebx
sub eax,48
imul eax,10
movzx ebx,byte [path+16+3]
add eax,ebx
sub eax,48
mov [DLGPID],eax
 
; Claear and prepare IPC area for next message
mov [path],dword 0
mov [path+4],dword 8
mov [path+8],dword 0
mov [path+12],dword 0
mov [path+16],dword 0
 
; Set dlg_pid_get for get next message
mov [dlg_pid_get],dword 1
call redproc ;show DLG_PID
jmp getmesloop
 
ready:
;
; The second message get
; Second message is 100 bytes path to SAVE/OPEN file
; shl path string on 16 bytes
;
cld
mov esi,path+16
mov edi,path
mov ecx,200
rep movsb
mov [edi],byte 0
 
jmp openoff
 
 
; DATA AREA
get_loops dd 0
dlg_pid_get dd 0
DLGPID dd 0
 
param:
dd 0 ; My dec PID
dd 0,0 ; Type of dialog
 
run_fileinfo:
dd 16
dd 0
dd param
dd 0
dd procinfo
;run_filepath:
db '/RD/1/SYSXTREE',0
 
procinfo:
times 1024 db 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
and eax,0000ffffh
; mov arg2,0
; mov arg2,eax
ret
end if
 
rxproc:
mov eax,arg1
call randomproc
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
words2reg ebx,x,y
 
dword2reg ecx,color
dword2reg edx,offs
dword2reg esi,size
 
; mov ecx,color
; mov edx,offs
; mov esi,size
mov eax,4
int 0x40
}
 
macro outcount data, x, y, color, numtype
{
mov ecx,data
mov ebx,numtype
mov bl,0
; mov edx,x*65536+y
words2reg edx,x,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
words2reg ebx,arg1,arg3
words2reg ecx,arg2,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
 
words2reg ebx,arg1,arg2
 
dword2reg ecx,arg4
 
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/3detx60b/trunk/build_en.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix en >lang.inc
@fasm 3detx60b.asm 3detx60b
@pause
/programs/demos/3detx60b/trunk/build_ru.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm 3detx60b.asm 3detx60b
@pause
/programs/demos/3detx60b/trunk/map.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/demos/3detx60b/trunk/texmap.bmp
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/demos/3detx60b/trunk/texpack.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/demos/3dtcub10/trunk/3DTCUB10.ASM
0,0 → 1,938
;
; 9 Ver Screen saver
; 5 Ver 24 bit texture.
; 23/8/2004
; Pavlushin Evgeni 3d cube screen saver
; mail: waptap@mail.ru site: www.deck4.narod.ru
;
; This programm develop on sample text3d to Mikolaj Felix 25/5/2001
; 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 0x200000 ; memory for app
dd 0x200000 ; esp
dd 0x0 , 0x0 ; I_Param , I_Icon
 
include 'lang.inc'
MAX_DEGS equ 512 ;quantity of angels 2^n.Minimize for speedup
MAX_POINTS equ 8 ;quantity of points
MAX_FACES equ 6 ;quantity of points
 
START:
finit
call draw_window
call clear_screen
call init_sincos
 
still:
mov eax,23 ; wait for system event with 2 ms timeout
mov ebx,2 ; wait 2 ms, then continue
int 0x40
 
; mov eax,11 ;If you want maximum speed! :)
; int 0x40
 
dec eax ; window redraw request ?
je red
dec eax ; key in buffer ?
je key
dec eax ; button in buffer ?
je button
 
main_loop:
call fade_texture
 
mov esi,cube
mov edi,cube_rotated
mov ecx,MAX_POINTS*3
copy_object:
fild word [esi]
fstp dword [edi]
add esi,2
add edi,4
dec ecx
jnz copy_object
 
mov esi,angle_x
mov edi,cube_rotated
mov ecx,MAX_POINTS
call rotate_points
mov esi,cube_rotated
mov edi,coord2d
mov ecx,MAX_POINTS
call translate_points
 
call draw_textured_faces
call clear_screen_buffer
 
add [angle_x],1
add [angle_y],3
add [angle_z],1
 
jmp still
 
red:
call draw_window
jmp still
key:
mov eax,2
jmp exit
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,0*65536+(799) ;x start*65536+x size
mov ecx,0*65536+(599) ;y start*65536+y size
mov edx,0x00000000 ;0x03 use skinned window
int 0x40
 
call clear_screen
 
mov eax,12 ;End
mov ebx,2
int 0x40
ret
 
head_label: db "3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR MENUETOS. USE "
db "800x600 SCREEN MODE FROM VIEW. PRESS ANY KEY FOR EXIT"
hl_end:
 
;FADE IN FADE OUT TEXTURE
 
x_step db 0
x_num db 1
 
fade_texture:
mov ecx,0
loox:
mov al,[file_texture+ecx]
mov [texture+ecx],al
inc ecx
cmp ecx,128*128*3
jnae loox
 
mov ecx,0
loox2:
mov al,[file_texture+ecx]
cmp [x_step],al
jae xxx
sub al,[x_step]
jmp nnn
xxx:
mov al,0
nnn:
mov [texture+ecx],al
inc ecx
cmp ecx,128*128*3
jnae loox2
 
cmp [x_step],255
jne no_max
mov [x_num],-1
no_max:
cmp [x_step],0
jne no_min
mov [x_num],1
no_min:
mov al,[x_num]
add [x_step],al
ret
 
; Clear Screen
clear_screen:
mov eax,13
mov ebx,0*65536+800
mov ecx,0*65536+600
mov edx,0
int 40h
 
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
ret
 
clear_screen_buffer:
mov ebx,scrbuf
mov ecx,800*65536+(600-40) ;sub 40 for antiflickering title
mov edx,0*65536+40
mov eax,7
int 0x40
 
mov eax,4 ;Out Text
mov ebx,8*65536+580 ;x start*65536+y start
mov ebp,[n_step]
shl ebp,16
sub ebx,ebp
mov ecx,0x0000ff00 ;color White
mov edx,move_text
add edx,[step]
mov esi,130 ;mt_end-move_text
int 0x40
 
inc [n_step]
cmp [n_step],6
jna t_ok
mov [n_step],0
inc [step]
cmp [step],mt_end-move_text-130
jng t_ok
mov [step],0
t_ok:
 
mov edi,scrbuf
mov eax,0 ;black background
mov ecx,800*600*3/4 ; 16000
cld
rep stosd
ret
 
n_step dd 0
step dd 0
 
move_text: db " "
db " "
db " "
db "***** 3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR "
db "MENUET OS. SET 800x600 SCREEN MODE FROM VIEW THIS SCREEN "
db "SAVER ***** "
db "SITE OF THE RUSSIAN DEVELOPERS TO MENUETOS: "
db "www.menuet.narod.ru "
db "RUSSIAN MENUET APLICATION ARCHIVE PAGE ON: "
db "www.meosfiles.narod.ru "
db "AUTOR OF THIS SCREEN SAVER Pavlushin Evgeni "
db "MY SITE: www.deck4.narod.ru (Slow update) "
db "AND MAIL BOX: waptap@mail.ru "
db "THANK YOU FOR USE! "
db " "
db " "
db " "
mt_end:
 
 
;include graphlib.asm Mikolaj Felix 9/12/2000 mfelix@polbox.com
;Draw textured faces proc
 
@@rx1 dw 0 ;equ [bp-2]
@@ry1 dw 0 ;equ [bp-4]
@@rx2 dw 0 ;equ [bp-6]
@@ry2 dw 0 ;equ [bp-8]
@@rx3 dw 0 ;equ [bp-10]
@@ry3 dw 0 ;equ [bp-12]
@@rx4 dw 0 ;equ [bp-14]
@@ry4 dw 0 ;equ [bp-16]
 
draw_textured_faces:
mov esi,link
mov ecx,MAX_FACES
dtf_loop:
push ecx
 
xor ebx,ebx
mov bl,byte [esi] ; point 1
shl bx,2
mov eax,dword [coord2d+bx] ;COPY 1 FOURANGLE POINT
mov dword [@@rx1],eax
 
xor ebx,ebx
mov bl,byte [esi+1] ; point 2
shl bx,2
mov eax,dword [coord2d+bx] ;COPY 2 FOURANGLE POINT
mov dword [@@rx2],eax
 
xor ebx,ebx
mov bl,byte [esi+2] ; point 3
shl bx,2
mov eax,dword [coord2d+bx] ;COPY 3 FOURANGLE POINT
mov dword [@@rx3],eax
 
xor bh,bh ; point 4
mov bl,byte [esi+3]
shl bx,2
mov eax,dword [coord2d+bx] ;COPY 4 FOURANGLE POINT
mov dword [@@rx4],eax
 
mov ax,[@@ry1]
sub ax,[@@ry3]
mov bx,[@@rx2]
sub bx,[@@rx1]
imul bx
shl edx,16
mov dx,ax
push edx
mov ax,[@@rx1]
sub ax,[@@rx3]
mov bx,[@@ry2]
sub bx,[@@ry1]
imul bx
shl edx,16
mov dx,ax
pop ebx
sub ebx,edx ; normal_z = (y1-y3)*(x2-x1)-(x1-x3)*(y2-y1)
or ebx,ebx
jl dtf_next_face ; normal_z < 0
 
; FIRST PICE OF FOUR ANGLE
 
; Set 3 triangel puts for texture ycoord*65536+xcoord
mov dword [@@tex_x3],127*65536+127 ;3 point
mov dword [@@tex_x2],0*65536+127 ;2 point
mov dword [@@tex_x1],0*65536+0 ;1 point
; Set texture bitmap offset
mov [@@tex_off],texture
; Set 3 triangel puts coordinates
mov eax,dword [@@rx3]
mov dword [@@x3],eax
mov eax,dword [@@rx2]
mov dword [@@x2],eax
mov eax,dword [@@rx1]
mov dword [@@x1],eax
call textured_triangle
 
; SECOND PICE OF FOUR ANGLE
 
; Set 3 triangel puts for texture ycoord*65536+xcoord
mov dword [@@tex_x3],127*65536+0 ;3 point
mov dword [@@tex_x2],127*65536+127 ;2 point
mov dword [@@tex_x1],0*65536+0 ;1 point
; Set texture bitmap offset
mov [@@tex_off],texture
; Set 3 triangel puts coordinates
mov eax,dword [@@rx4]
mov dword [@@x3],eax
mov eax,dword [@@rx3]
mov dword [@@x2],eax
mov eax,dword [@@rx1]
mov dword [@@x1],eax
call textured_triangle
 
dtf_next_face:
add esi,4
pop ecx
dec ecx
jnz dtf_loop
ret
 
;include tex3.asm Mikolaj Felix 15/5/2001 mfelix@polbox.com
 
@@x1 dw 0 ;equ [bp+4]
@@y1 dw 0 ;equ [bp+6]
@@x2 dw 0 ;equ [bp+8]
@@y2 dw 0 ;equ [bp+10]
@@x3 dw 0 ;equ [bp+12]
@@y3 dw 0 ;equ [bp+14]
 
@@tex_off dd 0 ;equ [bp+16]
@@tex_x1 dw 0 ;equ [bp+18]
@@tex_y1 dw 0 ;equ [bp+20]
@@tex_x2 dw 0 ;equ [bp+22]
@@tex_y2 dw 0 ;equ [bp+24]
@@tex_x3 dw 0 ;equ [bp+26]
@@tex_y3 dw 0 ;equ [bp+28]
 
@@dx12 dw 0 ;equ [bp-2]
@@dx13 dw 0 ;equ [bp-4]
@@dx23 dw 0 ;equ [bp-6]
 
@@tex_dx12 dw 0 ;equ [bp-8]
@@tex_dy12 dw 0 ;equ [bp-10]
@@tex_dx13 dw 0 ;equ [bp-12]
@@tex_dy13 dw 0 ;equ [bp-14]
@@tex_dx23 dw 0 ;equ [bp-16]
@@tex_dy23 dw 0 ;equ [bp-18]
 
@@scan_x1 dw 0 ;equ [bp-20]
@@scan_y1 dw 0 ;equ [bp-22]
@@scan_x2 dw 0 ;equ [bp-24]
@@scan_y2 dw 0 ;equ [bp-26]
 
 
textured_triangle:
 
mov ax,[@@y1]
cmp ax,[@@y3]
jb tt_check1
 
xchg ax,[@@y3]
mov [@@y1],ax
 
mov ax,[@@x1]
xchg ax,[@@x3]
mov [@@x1],ax
 
mov ax,[@@tex_y1]
xchg ax,[@@tex_y3]
mov [@@tex_y1],ax
 
mov ax,[@@tex_x1]
xchg ax,[@@tex_x3]
mov [@@tex_x1],ax
tt_check1:
mov ax,[@@y2]
cmp ax,[@@y3]
jb tt_check2
 
xchg ax,[@@y3]
mov [@@y2],ax
 
mov ax,[@@x2]
xchg ax,[@@x3]
mov [@@x2],ax
 
mov ax,[@@tex_y2]
xchg ax,[@@tex_y3]
mov [@@tex_y2],ax
 
mov ax,[@@tex_x2]
xchg ax,[@@tex_x3]
mov [@@tex_x2],ax
tt_check2:
mov ax,[@@y1]
cmp ax,[@@y2]
jb tt_check3
 
xchg ax,[@@y2]
mov [@@y1],ax
 
mov ax,[@@x1]
xchg ax,[@@x2]
mov [@@x1],ax
 
mov ax,[@@tex_y1]
xchg ax,[@@tex_y2]
mov [@@tex_y1],ax
 
mov ax,[@@tex_x1]
xchg ax,[@@tex_x2]
mov [@@tex_x1],ax
tt_check3:
 
mov bx,[@@y2]
sub bx,[@@y1]
jnz tt_dx12_make
 
mov word [@@dx12],0
mov word [@@tex_dx12],0
mov word [@@tex_dy12],0
jmp tt_dx12_done
tt_dx12_make:
mov ax,[@@x2]
sub ax,[@@x1]
shl ax,7
cwd
idiv bx
mov [@@dx12],ax ; dx12 = (x2-x1)/(y2-y1)
 
mov ax,[@@tex_x2]
sub ax,[@@tex_x1]
shl ax,7
cwd
idiv bx
mov [@@tex_dx12],ax ; tex_dx12 = (tex_x2-tex_x1)/(y2-y1)
 
mov ax,[@@tex_y2]
sub ax,[@@tex_y1]
shl ax,7
cwd
idiv bx
mov [@@tex_dy12],ax ; tex_dy12 = (tex_y2-tex_y1)/(y2-y1)
tt_dx12_done:
 
mov bx,[@@y3]
sub bx,[@@y1]
jnz tt_dx13_make
 
mov word [@@dx13],0
mov word [@@tex_dx13],0
mov word [@@tex_dy13],0
jmp tt_dx13_done
tt_dx13_make:
mov ax,[@@x3]
sub ax,[@@x1]
shl ax,7
cwd
idiv bx
mov [@@dx13],ax ; dx13 = (x3-x1)/(y3-y1)
 
mov ax,[@@tex_x3]
sub ax,[@@tex_x1]
shl ax,7
cwd
idiv bx
mov [@@tex_dx13],ax ; tex_dx13 = (tex_x3-tex_x1)/(y3-y1)
 
mov ax,[@@tex_y3]
sub ax,[@@tex_y1]
shl ax,7
cwd
idiv bx
mov [@@tex_dy13],ax ; tex_dy13 = (tex_y3-tex_x1)/(y3-y1)
tt_dx13_done:
 
mov bx,[@@y3]
sub bx,[@@y2]
jnz tt_dx23_make
 
mov word [@@dx23],0
mov word [@@tex_dx23],0
mov word [@@tex_dy23],0
jmp tt_dx23_done
tt_dx23_make:
mov ax,[@@x3]
sub ax,[@@x2]
shl ax,7
cwd
idiv bx
mov [@@dx23],ax ; dx23 = (x3-x2)/(y3-y2)
 
mov ax,[@@tex_x3]
sub ax,[@@tex_x2]
shl ax,7
cwd
idiv bx
mov [@@tex_dx23],ax ; tex_dx23 = (tex_x3-tex_x2)/(y3-y2)
 
mov ax,[@@tex_y3]
sub ax,[@@tex_y2]
shl ax,7
cwd
idiv bx
mov [@@tex_dy23],ax ; tex_dy23 = (tex_y3-tex_y2)/(y3-y2)
tt_dx23_done:
 
 
mov ax,[@@x1]
shl ax,7
mov bx,ax
mov cx,[@@y1]
 
mov dx,[@@tex_x1]
shl dx,7
mov [@@scan_x1],dx
mov [@@scan_x2],dx
mov dx,[@@tex_y1]
shl dx,7
mov [@@scan_y1],dx
mov [@@scan_y2],dx
tt_loop1:
pushad
; push ax
; push bx
; push cx
 
mov dx,[@@scan_y2]
shr dx,7
mov [@@tex_ly2],dx ;push dx
mov dx,[@@scan_x2]
shr dx,7
mov [@@tex_lx2],dx ;push dx
mov dx,[@@scan_y1]
shr dx,7
mov [@@tex_ly1],dx ;push dx
mov dx,[@@scan_x1]
shr dx,7
mov [@@tex_lx1],dx ;push dx
mov ebp,dword [@@tex_off] ;push word ptr @@tex_off
mov [@@tex_loff],ebp
 
mov [@@ly],cx ;push cx
mov dx,bx
shr dx,7
mov [@@lx2],dx ;push dx
mov dx,ax
shr dx,7
mov [@@lx1],dx ; push dx
call textured_horizontal_line
 
; pop cx
; pop bx
; pop ax
popad
 
mov dx,[@@tex_dx13]
add [@@scan_x1],dx
mov dx,[@@tex_dx12]
add [@@scan_x2],dx
mov dx,[@@tex_dy13]
add [@@scan_y1],dx
mov dx,[@@tex_dy12]
add [@@scan_y2],dx
 
add ax,[@@dx13]
add bx,[@@dx12]
inc cx
cmp cx,[@@y2]
jb tt_loop1
 
mov bx,[@@x2]
shl bx,7
mov cx,[@@y2]
 
mov dx,[@@tex_x2]
shl dx,7
mov [@@scan_x2],dx
mov dx,[@@tex_y2]
shl dx,7
mov [@@scan_y2],dx
tt_loop2:
 
pushad
; push ax
; push bx
; push cx
 
mov dx,[@@scan_y2]
shr dx,7
mov [@@tex_ly2],dx ;push dx
mov dx,[@@scan_x2]
shr dx,7
mov [@@tex_lx2],dx ;push dx
mov dx,[@@scan_y1]
shr dx,7
mov [@@tex_ly1],dx ;push dx
mov dx,[@@scan_x1]
shr dx,7
mov [@@tex_lx1],dx ;push dx
mov ebp,dword [@@tex_off] ;push word ptr @@tex_off
mov [@@tex_loff],ebp
 
mov [@@ly],cx ;push cx
mov dx,bx
shr dx,7
mov [@@lx2],dx ;push dx
mov dx,ax
shr dx,7
mov [@@lx1],dx ; push dx
call textured_horizontal_line
 
; pop cx
; pop bx
; pop ax
popad
 
mov dx,[@@tex_dx13]
add [@@scan_x1],dx
mov dx,[@@tex_dx23]
add [@@scan_x2],dx
mov dx,[@@tex_dy13]
add [@@scan_y1],dx
mov dx,[@@tex_dy23]
add [@@scan_y2],dx
 
add ax,[@@dx13]
add bx,[@@dx23]
inc cx
cmp cx,[@@y3]
jb tt_loop2
ret
 
@@lx1 dw 0 ;equ [bp+4]
@@lx2 dw 0 ;equ [bp+6]
@@ly dw 0 ;equ [bp+8]
 
@@tex_loff dd 0 ;equ [bp+10]
@@tex_lx1 dw 0 ;equ [bp+12]
@@tex_ly1 dw 0 ;equ [bp+14]
@@tex_lx2 dw 0 ;equ [bp+16]
@@tex_ly2 dw 0 ;equ [bp+18]
 
@@tex_ldx dw 0 ;equ [bp-2]
@@tex_ldy dw 0 ;equ [bp-4]
 
textured_horizontal_line:
 
mov ax,[@@lx1]
cmp ax,[@@lx2]
je thl_quit
jb thl_ok
 
xchg ax,[@@lx2]
mov [@@lx1],ax
 
mov ax,[@@tex_lx1]
xchg ax,[@@tex_lx2]
mov [@@tex_lx1],ax
 
mov ax,[@@tex_ly1]
xchg ax,[@@tex_ly2]
mov [@@tex_ly1],ax
thl_ok:
 
; Fast method
; mov edi,0
; mov di,[@@ly] ;edi = calculating start of line
; mov ax,di
; shl di,6 ;ly*64
; shl ax,8 ;ly*256
; add di,ax ;di = (ly*64)+(ly*256)
; add di,[@@lx1] ;di = ly*320+lx1
; mov eax,edi
; shl eax,1
; add edi,eax
; add edi,scrbuf
 
; Uneversal method
movsx edi,[@@ly]
mov eax,800 ;di = ly*320+lx1
mul edi
movsx ebx,[@@lx1]
add eax,ebx ;[@@lx1]
mov edi,3
mul edi
mov edi,eax
add edi,scrbuf
 
mov cx,[@@lx2]
sub cx,[@@lx1]
 
mov ax,[@@tex_lx2]
sub ax,[@@tex_lx1]
shl ax,7
cwd
idiv cx
mov [@@tex_ldx],ax ; tex_dx = (tex_x2-tex_x1)/(x2-x1)
 
mov ax,[@@tex_ly2]
sub ax,[@@tex_ly1]
shl ax,7
cwd
idiv cx
mov [@@tex_ldy],ax ; tex_dy = (tex_y2-tex_y1)/(x2-x1)
 
cld
inc cx
mov ax,[@@tex_lx1]
shl ax,7
mov bx,[@@tex_ly1]
shl bx,7
 
thl_loop:
mov dx,ax
push bx
 
and bx,0ff80h
shr ax,7
add bx,ax
mov ebp,0
mov bp,bx
mov eax,ebp
shl eax,1
add ebp,eax
add ebp,[@@tex_loff]
 
mov al,byte [ebp+2]
stosb
mov al,byte [ebp+1]
stosb
mov al,byte [ebp]
stosb
 
pop bx
mov ax,dx
 
add ax,[@@tex_ldx]
add bx,[@@tex_ldy]
dec cx
jnz thl_loop
thl_quit:
ret
 
;include math3d_2.asm
; Mikolaj Felix 20/06/2001
; mfelix@polbox.com
 
;------------------------------------------------------------
; ds:si - offset to angles (int)
; ds:di - offset to array of 3d points
; cx - number of points
;------------------------------------------------------------
 
@@sin_x dd 0 ;equ dword ptr [bp-4]
@@cos_x dd 0 ;equ dword ptr [bp-8]
@@sin_y dd 0 ;equ dword ptr [bp-12]
@@cos_y dd 0 ;equ dword ptr [bp-16]
@@sin_z dd 0 ;equ dword ptr [bp-20]
@@cos_z dd 0 ;equ dword ptr [bp-24]
 
@@x equ dword [edi]
@@y equ dword [edi+4]
@@z equ dword [edi+8]
 
rotate_points:
 
push edi
mov edi,@@sin_x
mov edx,3
rp_sin_cos:
mov bx,word [esi]
and bx,MAX_DEGS-1
shl bx,2
mov eax,dword [sintab+bx]
mov dword [edi],eax
mov eax,dword [costab+bx]
mov dword [edi+4],eax
add edi,8
add esi,2
dec edx
jnz rp_sin_cos
pop edi
 
rp_rotate:
fld @@y
fmul [@@cos_x]
fld @@z
fmul [@@sin_x]
fsubp st1,st
fld @@y
fxch st1
fstp @@y ; Yrotated = Cos (A)*Y - Sin (A)*Z
fmul [@@sin_x]
fld @@z
fmul [@@cos_x]
faddp st1,st
fstp @@z ; Zrotated = Sin (A)*Y + Cos (A)*Z
fld @@x
fmul [@@cos_y]
fld @@z
fmul [@@sin_y]
fsubp st1,st
fld @@x
fxch st1
fstp @@x ; Xrotated = Cos (A)*X - Sin (A)*Z
fmul [@@sin_y]
fld @@z
fmul [@@cos_y]
faddp st1,st
fstp @@z ; Zrotated = Sin (A)*X + Cos (A)*Z
fld @@x
fmul [@@cos_z]
fld @@y
fmul [@@sin_z]
fsubp st1,st
fld @@x
fxch st1
fstp @@x ; Xrotated = Cos (A)*X - Sin (A)*Y
fmul [@@sin_z]
fld @@y
fmul [@@cos_z]
faddp st1,st
fstp @@y ; Yrotated = Sin (A)*X + Cos (A)*Y
 
add edi,12
dec ecx
jnz rp_rotate
ret
;------------------------------------------------------------
; ds:si - offset to array of 3d points
; ds:di - offset to 2d points
; cx - number of points
;------------------------------------------------------------
 
translate_points:
 
fld dword [esi+8]
fadd [perspective]
 
fld dword [esi]
fmul [perspective]
fdiv st,st1
fadd [correct_x]
fistp word [edi] ; x2d = (x*persp)/(z+persp)+correct_x
 
fld dword [esi+4]
fmul [perspective]
fdivrp st1,st
fadd [correct_y]
fistp word [edi+2] ; y2d = (y*persp)/(z+persp)+correct_y
 
add esi,12
add edi,4
dec ecx
jnz translate_points
ret
 
; initalize SIN&COS table
 
@@temp1 dd 0 ;dword ptr [bp-4]
@@temp2 dd 0 ;dword ptr [bp-8]
 
init_sincos:
mov [@@temp1],0
fldpi
mov [@@temp2],MAX_DEGS/2
fidiv [@@temp2]
fstp [@@temp2]
 
xor edi,edi
mov ecx,MAX_DEGS
isc_loop:
fld [@@temp1]
fld st0
fld st0
fsin
fstp dword [sintab+edi]
fcos
fstp dword [costab+edi]
fadd [@@temp2]
fstp [@@temp1]
 
add edi,4
dec ecx
jnz isc_loop
ret
 
perspective dd 256.0
correct_x dd 400.0
correct_y dd 300.0
 
angle_x dw 0
angle_y dw 0
angle_z dw 0
 
file_texture:
file 'texture.raw'
 
cube 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,3, 5,4,7,6, 1,5,6,2, 4,0,3,7, 4,5,1,0, 3,2,6,7
 
sintab:
rd MAX_DEGS
costab:
rd MAX_DEGS
 
cube_rotated:
rd MAX_POINTS*3
coord2d:
rw MAX_POINTS*2
texture:
rb 128*128*3
scrbuf:
 
I_END:
/programs/demos/3dtcub10/trunk/build_en.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix en >lang.inc
@fasm 3dtcub10.asm 3dtcub10
@pause
/programs/demos/3dtcub10/trunk/build_ru.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm 3dtcub10.asm 3dtcub10
@pause
/programs/demos/3dtcub10/trunk/texture.raw
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/demos/aclock/trunk/Readme.txt
0,0 → 1,85
AClock 1.1
Copyright (c) 2002,2003 Thomas Mathys
killer@vantage.ch
 
 
what the hell is this ?
-----------------------
 
this is aclock, a silly analog clock application
for menuetos (http://www.menuetos.org).
 
 
why do i need it ?
------------------
 
well, this is certainly one of the last programs on
earth you'd ever need. anyway, it demonstrates how
how to do certain things:
 
- writing menuet apps that parse the command line.
includes a strtok-like function that you might
want to use in own projects. or maybe rather not.
- writing menuet apps that are aware of the current
window size and that have no problems with different
skin heights.
- how to write menuet apps with nasm instead of fasm
(there should be a gas version aswell, don't you think ?)
and how to write kick-ass code with nasm in general =)
 
 
compiling instructions
----------------------
 
yes, it's still written for nasm.
i really can't be bothered to work with fasm.
 
oh yes, you wanted to know how to compile aclock:
 
nasm -t -f bin -o aclock aclock.asm
if you get error messages like
 
nasm: unrecognised option `-t
type `nasm -h' for help
 
then you've got an old version of nasm.
get a newer version (0.98.36 or later) from
http://nasm.sourceforge.net
 
 
configuration
-------------
 
you might want to change some of the constants defined
somewhere at the top of aclock.asm. the following might
be useful:
 
- DEFAULT_XPOS
- DEFAULT_YPOS
- DEFAULT_WIDTH
- DEFAULT_HEIGHT
- MIN_WIDTH
- MIN_HEIGHT
for more info about DEFAULT_XPOS/DEFAULT_YPOS see next
section.
 
 
usage
-----
 
this version of AClock introduces command line parameters.
here's an example command line:
 
aclock w128 h128 x20 y-20
this creates a window that is 128 pixels wide and 128 pixels
high (that's for the work area, without border/title bar).
the window is placed at x=20, y=screen resolution-20
(because of the minus sign after the y).
 
all parameters are optional and may appear in any order.
you can't have any whitespaces in a parameter, e.g.
"w 128" is an invalid parameter (which will simply be ignored).
the command line parser is case sensitive.
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/aclock/trunk/aclock.asm
0,0 → 1,223
; aclock 1.1
; Copyright (c) 2002 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
bits 32
%include 'mos.inc'
section .text
 
 
;********************************************************************
; configuration stuff
;********************************************************************
 
%define APPNAME "AClock 1.1"
%define STACKSIZE 1024
 
; default window position/dimensions (work area)
%define DEFAULT_XPOS -20
%define DEFAULT_YPOS 20
%define DEFAULT_WIDTH 80
%define DEFAULT_HEIGHT 80
 
; minimal size (horizontal and vertical) of work area
%define MIN_WIDTH 80
%define MIN_HEIGHT 80
 
 
;********************************************************************
; header
;********************************************************************
MOS_HEADER01 main,image_end,memory_end,stacktop-4,cmdLine,0
 
; these includes introduce code and thus mustn't stand
; before the menuet header =)
%include 'dbgboard.inc'
%include 'strlen.inc'
%include 'str2dwrd.inc'
%include 'strtok.inc'
%include 'cmdline.inc'
%include 'adjstwnd.inc'
%include 'draw.inc'
 
;********************************************************************
; main program
;********************************************************************
main:
call getDefaultWindowColors
call parseCommandLine
 
; check minimal window dimensions
cmp dword [wndWidth],MIN_WIDTH
jae .widthok
mov dword [wndWidth],MIN_WIDTH
.widthok:
cmp dword [wndHeight],MIN_HEIGHT
jae .heightok
mov dword [wndHeight],MIN_HEIGHT
.heightok:
 
; adjust window dimensions
mov eax,ADJSTWND_TYPE_SKINNED
mov ebx,[wndXPos]
mov ecx,[wndYPos]
mov edx,[wndWidth]
mov esi,[wndHeight]
call adjustWindowDimensions
mov [wndXPos],ebx
mov [wndYPos],ecx
mov [wndWidth],edx
mov [wndHeight],esi
 
call drawWindow
.msgpump:
call drawClock
 
; wait up to a second for next event
mov eax,MOS_SC_WAITEVENTTIMEOUT
mov ebx,100
int 0x40
 
cmp eax,MOS_EVT_REDRAW
je .redraw
cmp eax,MOS_EVT_KEY
je .key
cmp eax,MOS_EVT_BUTTON
je .button
jmp .msgpump
 
.redraw:
call drawWindow
jmp .msgpump
.key:
mov eax,MOS_SC_GETKEY
int 0x40
jmp .msgpump
.button:
mov eax,MOS_SC_EXIT
int 0x40
jmp .msgpump
 
 
;********************************************************************
; get default window colors
; input : nothing
; output : wndColors contains default colors
; destroys : nothing
;********************************************************************
getDefaultWindowColors:
pushad
pushfd
mov eax,MOS_SC_WINDOWPROPERTIES
mov ebx,3
mov ecx,wndColors
mov edx,MOS_WNDCOLORS_size
int 0x40
popfd
popad
ret
 
 
;********************************************************************
; define and draw window
; input nothing
; output nothing
; destroys flags
;********************************************************************
align 4
drawWindow:
pusha
 
; start window redraw
mov eax,MOS_SC_REDRAWSTATUS
mov ebx,1
int 0x40
 
; create window
mov eax,MOS_SC_DEFINEWINDOW
mov ebx,[wndXPos]
shl ebx,16
or ebx,[wndWidth]
mov ecx,[wndYPos]
shl ecx,16
or ecx,[wndHeight]
mov edx,[wndColors+MOS_WNDCOLORS.work]
or edx,0x03000000
mov esi,[wndColors+MOS_WNDCOLORS.grab]
mov edi,[wndColors+MOS_WNDCOLORS.frame]
int 0x40
 
; draw window label
mov eax,MOS_SC_WRITETEXT
mov ebx,MOS_DWORD(8,8)
mov ecx,[wndColors+MOS_WNDCOLORS.grabText]
mov edx,label
mov esi,LABEL_LEN
int 0x40
call drawClock
; end window redraw
mov eax,MOS_SC_REDRAWSTATUS
mov ebx,2
int 0x40
popa
ret
 
 
;********************************************************************
; initialized data
;********************************************************************
 
; window position and dimensions.
; dimensions are for work area only.
wndXPos dd DEFAULT_XPOS
wndYPos dd DEFAULT_YPOS
wndWidth dd DEFAULT_WIDTH
wndHeight dd DEFAULT_HEIGHT
 
; window label
label db APPNAME,0
LABEL_LEN equ ($-label-1)
 
; token delimiter list for command line
delimiters db 9,10,11,12,13,32,0
 
; don't insert anything after this label
image_end:
 
 
;********************************************************************
; uninitialized data
;********************************************************************
section .bss
 
wndColors resb MOS_WNDCOLORS_size
procInfo resb MOS_PROCESSINFO_size
 
; space for command line. at the end we have an additional
; byte for a terminating zero, just to be sure...
cmdLine resb 257
 
alignb 4
stack resb STACKSIZE
stacktop:
 
; don't insert anything after this label
memory_end:
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/aclock/trunk/aclock.bmp
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/demos/aclock/trunk/adjstwnd.inc
0,0 → 1,147
; adjustWindowDimensions
; adjust menut window dimensions to get a certain work area size.
; or so. who on earth cares anyway, i certinaly don't, i'm just
; writing this code because i've got to kill time somehow...
;
; Copyright (c) 2002 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _ADJSTWND_INC
%define _ADJSTWND_INC
 
 
;window types
ADJSTWND_TYPE_SKINNED equ 0
 
 
;********************************************************************
; adjust window dimensions to get a certain work area size
;
; - first the window width and height are adjusted
; and clamped if they're too large for the screen.
; - then the window positions are adjusted, if the
; window goes out of the screen.
;
; input:
; eax window type, one of the ADJSTWND_TYPE_xxx constants
; ebx window x position
; ecx window y position
; edx desired work area width
; esi desired work area height
;
; output:
; eax return code. 0 = ok, -1 = invalid window type
; ebx adjusted window x position
; ecx adjusted window y position
; edx window width to get desired work area width
; esi window height to get desired work area height
;
; destroys:
; nothing
;
; normally x and y are the upper left corner of the window,
; relative to the upper left corner of the screen.
; if you pass a negative x or y it will be treated as the
; lower right corner of the window, relative to the lower
; right corner of the screen.
;********************************************************************
adjustWindowDimensions:
push edi
push ebp
pushfd
 
; adjust window dimensions, depending on the window type
cmp eax,ADJSTWND_TYPE_SKINNED
je .adjust_skinned
mov eax,-1 ; invalid window type,
jmp .bye ; return error code
 
; clamp window dimensions
.clamp:
mov eax,MOS_SC_GETSCREENMAX ; get screen dimensions
int 0x40
mov edi,eax ; edi = screen width
shr edi,16
mov ebp,eax ; ebp = screen height
and ebp,0xffff
cmp edx,edi ; window width > screen width ?
jna .widthok
mov edx,edi ; yes -> use screen width
.widthok:
cmp esi,ebp ; wnd height > screen height ?
jna .heightok
mov esi,ebp ; yes -> use screen height
.heightok:
 
; adjust x position
or ebx,ebx ; do the lower right corner
jns .foo ; stuff if x is negative.
add ebx,edi
sub ebx,edx
.foo:
or ebx,ebx ; x < 0 ?
jns .xnotnegative
xor ebx,ebx ; yes -> x = 0
.xnotnegative:
mov eax,ebx ; x + width > screen width ?
add eax,edx
cmp eax,edi
jna .xok
sub eax,edi ; yes -> adjust
sub ebx,eax
.xok:
 
; adjust y position
or ecx,ecx ; do the lower right corner
jns .bar ; stuff if y is negative.
add ecx,ebp
sub ecx,esi
.bar:
or ecx,ecx ; y < 0 ?
jns .ynotnegative
xor ecx,ecx ; yes -> y = 0
.ynotnegative:
mov eax,ecx ; y + height > screen height ?
add eax,esi
cmp eax,ebp
jna .yok
sub eax,ebp ; yes -> adjust
sub ecx,eax
.yok:
 
.done:
xor eax,eax
.bye:
popfd
pop ebp
pop edi
ret
 
.adjust_skinned:
; adjust width (edx)
add edx,MOS_WND_SKIN_BORDER_LEFT+MOS_WND_SKIN_BORDER_RIGHT
; adjust height (esi). we need the skin height to do this.
push ebx
mov eax,MOS_SC_WINDOWPROPERTIES
mov ebx,4
int 0x40
lea esi,[esi+eax+MOS_WND_SKIN_BORDER_BOTTOM]
pop ebx
jmp .clamp
 
%endif
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/aclock/trunk/cmdline.inc
0,0 → 1,151
; command line parsing code for aclock
;
; Copyright (c) 2003 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _CMDLINE_INC
%define _CMDLINE_INC
 
 
;********************************************************************
; parse the command line
; input : nothing
; output : wndXPos, wndYPos, wndWidth, wndHeight
; are changed.
; destroys : nothing
;********************************************************************
parseCommandLine:
pushad
pushfd
 
; terminate command line, just to be sure
mov byte [cmdLine + 256],0
 
; go through all tokens
mov eax,cmdLine ; eax -> command line
.parseloop:
mov ebx,delimiters ; ebx -> token delimiter list
call strtok ; get next parameter
or eax,eax ; no more parameters ?
jz .nomoretokens
mov cl,[eax] ; get 1st char of parameter
cmp cl,'x' ; which parameter is it ?
je .param_x
cmp cl,'y'
je .param_y
cmp cl,'w'
je .param_w
cmp cl,'h'
je .param_h
; if we reach this line it's an unknown parameter, ignore it
.nextparam:
xor eax,eax ; set eax = 0 to continue
jmp .parseloop ; after last token.
.nomoretokens:
DBG_BOARD_PRINTDWORD [wndXPos]
DBG_BOARD_PRINTCHAR 32
DBG_BOARD_PRINTDWORD [wndYPos]
DBG_BOARD_PRINTCHAR 32
DBG_BOARD_PRINTDWORD [wndWidth]
DBG_BOARD_PRINTCHAR 32
DBG_BOARD_PRINTDWORD [wndHeight]
DBG_BOARD_PRINTNEWLINE
popfd
popad
ret
 
; eax -> first character of the parameter
.param_x:
push eax
call parsePositionParam
mov [wndXPos],eax
pop eax
jmp .nextparam
 
; eax -> first character of the parameter
.param_y:
push eax
call parsePositionParam
mov [wndYPos],eax
pop eax
jmp .nextparam
 
; eax -> first character of the parameter
.param_w:
push eax
call parseSizeParam
mov [wndWidth],eax
pop eax
jmp .nextparam
 
; eax -> first character of the parameter
.param_h:
push eax
call parseSizeParam
mov [wndHeight],eax
pop eax
jmp .nextparam
 
; parse position parameter
; input : eax = address of first character of parameter
; output : eax contains position
; destroys : nothing
parsePositionParam:
push ebx
push esi
pushfd
 
; is the second char of the parameter a '-' ?
inc eax
xor ebx,ebx ; assume it isn't
cmp byte [eax],'-'
jne .nominus
mov ebx,1 ; yes -> set flag...
inc eax ; ...and move to next char
.nominus:
 
; convert rest of parameter to doubleword
mov esi,eax
call string2dword
 
; negate if necessary
or ebx,ebx
jz .rotationshyperboloid
neg eax
.rotationshyperboloid:
 
popfd
pop esi
pop ebx
ret
 
; parse dimension parameter
; input : eax = address of first char of parameter
; output : eax contains dimension
; destroys : nothing
parseSizeParam:
push esi
pushfd
lea esi,[eax + 1] ; esi -> 2nd char of parameter
call string2dword
popfd
pop esi
ret
 
 
%endif
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/aclock/trunk/dbgboard.inc
0,0 → 1,200
; macros to write stuff to menuet's debug message board.
; the macros don't change any registers, not even flags.
; they take only effect if DEBUG is defined.
;
; Copyright (c) 2003 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _DBGBOARD_INC
%define _DBGBOARD_INC
 
 
%ifdef DEBUG
 
 
;********************************************************************
; print newline
; no input
;********************************************************************
%macro DBG_BOARD_PRINTNEWLINE 0
call dbg_board_printnewline
%endm
 
 
;********************************************************************
; print a character
;
; examples : DBG_BOARD_PRINTCHAR '?'
; DBG_BOARD_PRINTCHAR 65
; DBG_BOARD_PRINTCHAR cl
; DBG_BOARD_PRINTCHAR [esi]
; DBG_BOARD_PRINTCHAR [somevariable]
;********************************************************************
%macro DBG_BOARD_PRINTCHAR 1
push ecx
mov cl,byte %1
call dbg_board_printchar
pop ecx
%endm
 
 
 
;********************************************************************
; print a dword (in hex)
;
; examples: DBG_BOARD_PRINTDWORD esp
; DBG_BOARD_PRINTDWORD 0xdeadbeef
; DBG_BOARD_PRINTDWORD [somevariable]
;********************************************************************
%macro DBG_BOARD_PRINTDWORD 1
push dword %1
call dbg_board_printdword
%endm
 
 
;********************************************************************
; print a string literal
; a terminating zero is automagically appended to the string.
;
; examples DBG_BOARD_PRINTSTRINGLITERAL "foo",0
; DBG_BOARD_PRINTSTRINGLITERAL "bar",10,13,0
;********************************************************************
%macro DBG_BOARD_PRINTSTRINGLITERAL 1+
jmp %%bar
%%foo db %1, 0 ; terminate string, just to be sure
%%bar:
push dword %%foo
call dbg_board_printstring
%endm
 
 
;********************************************************************
; print a string (asciiz)
;
; examples DBG_BOARD_PRINTSTRING addressofstring
; DBG_BOARD_PRINTSTRING esi
; DBG_BOARD_PRINTSTRING [ebx]
;********************************************************************
%macro DBG_BOARD_PRINTSTRING 1
push dword %1
call dbg_board_printstring
%endm
 
 
; no input
dbg_board_printnewline:
pushad
pushfd
mov eax,MOS_SC_DEBUGBOARD
mov ebx,1
mov ecx,10
int 0x40
mov ecx,13
int 0x40
popfd
popad
ret
; input : cl = character to print
dbg_board_printchar:
pushad
pushfd
mov eax,MOS_SC_DEBUGBOARD
mov ebx,1
and ecx,0xff
int 0x40
popfd
popad
ret
 
; input : dword to print on stack
dbg_board_printdword:
enter 0,0
pushad
pushfd
mov eax,MOS_SC_DEBUGBOARD
mov ebx,1
mov ecx,'0' ; print 0x prefix
int 0x40
mov ecx,'x'
int 0x40
mov edx,[ebp + 8] ; get dword to print
mov esi,8 ; iterate through all nibbles
.loop:
mov ecx,edx ; display hex digit
shr ecx,28
movzx ecx,byte [dbg_board_printdword_digits + ecx]
int 0x40
shl edx,4 ; next nibble
dec esi
jnz .loop
popfd
popad
leave
ret 4
dbg_board_printdword_digits:
db '0','1','2','3','4','5','6','7'
db '8','9','a','b','c','d','e','f'
 
; input : address of string (asciiz) to print on stack
dbg_board_printstring:
enter 0,0
pushad
pushfd
cld
mov esi,[ebp + 8] ; esi -> string
mov ebx,1
.loop:
lodsb ; get character
or al,al ; zero ?
je .done ; yeah -> get outta here
movzx ecx,al ; nope -> display character
mov eax,MOS_SC_DEBUGBOARD
int 0x40
jmp .loop
.done:
popfd
popad
leave
ret 4
%else
 
 
%macro DBG_BOARD_PRINTNEWLINE 0
%endm
 
%macro DBG_BOARD_PRINTCHAR 1
%endm
 
%macro DBG_BOARD_PRINTDWORD 1
%endm
 
%macro DBG_BOARD_PRINTSTRINGLITERAL 1+
%endm
 
%macro DBG_BOARD_PRINTSTRING 1
%endm
 
%endif
 
 
%endif
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/aclock/trunk/draw.inc
0,0 → 1,430
; drawing code for aclock
;
; Copyright (c) 2003 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _DRAW_INC
%define _DRAW_INC
 
 
TMR1_FACTOR dd 0.45
TMR2_FACTOR dd 0.426315789
SECR_FACTOR dd 0.378947368
MINR_FACTOR dd 0.355263158
HOURR_FACTOR dd 0.189473684
DATE_FACTOR dd 0.1
 
 
monthNames:
db "Jan"
db "Feb"
db "Mar"
db "Apr"
db "May"
db "Jun"
db "Jul"
db "Aug"
db "Sep"
db "Oct"
db "Nov"
db "Dec"
 
 
;********************************************************************
; draws the clock
; input : nothing
; output : nothing
; destroys : nothing
;********************************************************************
drawClock:
%push drawClock_context
%stacksize flat
%assign %$localsize 0
 
%local i:dword, \
TMR1X:dword, \
TMR1Y:dword, \
TMR2X:dword, \
TMR2Y:dword, \
SECRX:dword, \
SECRY:dword, \
MINRX:dword, \
MINRY:dword, \
HOURRX:dword, \
HOURRY:dword, \
workwidth:dword, \
workheight:dword, \
foo:dword
enter %$localsize,0
pushad
pushfd
 
; get window dimensions
mov eax,MOS_SC_GETPROCESSINFO
mov ebx,procInfo
mov ecx,-1
int 0x40
 
; calculate work area size (width/height = ecx/edx)
; if the work area is too small (maybe the window is shaded)
; we don't draw anything.
mov eax,MOS_SC_WINDOWPROPERTIES
mov ebx,4 ; get skin height (eax)
int 0x40
mov ecx,[procInfo + MOS_PROCESSINFO.wndWidth]
sub ecx,MOS_WND_SKIN_BORDER_LEFT+MOS_WND_SKIN_BORDER_RIGHT
mov edx,[procInfo + MOS_PROCESSINFO.wndHeight]
sub edx,eax
sub edx,MOS_WND_SKIN_BORDER_BOTTOM
cmp ecx,0 ; width too small ?
jle .bye
cmp edx,0 ; height too small ?
jnle .continue
.bye:
jmp .byebye
.continue:
mov [workwidth],ecx ; save for later (for fpu)
mov [workheight],edx
 
; calculate center of clock (x/y = esi/edi)
mov esi,[procInfo + MOS_PROCESSINFO.wndWidth]
shr esi,1
mov edi,[procInfo + MOS_PROCESSINFO.wndHeight]
sub edi,MOS_WND_SKIN_BORDER_BOTTOM
sub edi,eax
shr edi,1
add edi,eax
 
; clear work area
pushad
mov ebx,(MOS_WND_SKIN_BORDER_LEFT)*0x10000 ; x start
or ebx,ecx ; width
mov ecx,eax ; y start
shl ecx,16 ; (=skin height)
or ecx,edx ; height
mov edx,[wndColors + MOS_WNDCOLORS.work]
mov eax,MOS_SC_DRAWBAR
int 0x40
popad
 
; calculate second hand radii
fild dword [workwidth]
fmul dword [SECR_FACTOR]
fstp dword [SECRX]
fild dword [workheight]
fmul dword [SECR_FACTOR]
fstp dword [SECRY]
 
; calculate minute hand radii
fild dword [workwidth]
fmul dword [MINR_FACTOR]
fstp dword [MINRX]
fild dword [workheight]
fmul dword [MINR_FACTOR]
fstp dword [MINRY]
 
; calculate hour hand radii
fild dword [workwidth]
fmul dword [HOURR_FACTOR]
fstp dword [HOURRX]
fild dword [workheight]
fmul dword [HOURR_FACTOR]
fstp dword [HOURRY]
 
; calculate tick mark radii
fild dword [workwidth]
fmul dword [TMR1_FACTOR]
fstp dword [TMR1X]
fild dword [workheight]
fmul dword [TMR1_FACTOR]
fstp dword [TMR1Y]
fild dword [workwidth]
fmul dword [TMR2_FACTOR]
fstp dword [TMR2X]
fild dword [workheight]
fmul dword [TMR2_FACTOR]
fstp dword [TMR2Y]
 
; get system clock (edx)
mov eax,MOS_SC_GETSYSCLOCK
int 0x40
mov edx,eax
 
; draw second hand
push edx
mov eax,edx
shr eax,16
call bcdbin
mov ecx,eax ; save seconds for later
push ecx
push eax
fpush32 0.104719755 ; 2*pi/60
push dword [SECRX]
push dword [SECRY]
push esi
push edi
call getHandCoords
mov eax,MOS_SC_DRAWLINE
shl ebx,16
or ebx,esi
shl ecx,16
or ecx,edi
mov edx,[wndColors + MOS_WNDCOLORS.workText]
int 0x40
pop ecx
pop edx
 
; draw minute hand
push edx
mov eax,edx
shr eax,8
call bcdbin
mov edx,60
mul edx
add eax,ecx
mov ecx,eax ; save for later
push ecx
push eax
fpush32 0.001745329 ; 2*pi/60/60
push dword [MINRX]
push dword [MINRY]
push esi
push edi
call getHandCoords
mov eax,MOS_SC_DRAWLINE
shl ebx,16
or ebx,esi
shl ecx,16
or ecx,edi
mov edx,[wndColors + MOS_WNDCOLORS.workText]
int 0x40
pop ecx
pop edx
 
; draw hour hand
push edx
mov eax,edx
call bcdbin
cmp eax,11 ; % 12 (just to be sure)
jnae .hoursok
sub eax,12
.hoursok:
mov edx,60*60
mul edx
add eax,ecx
push eax
fpush32 0.000145444 ; 2*pi/60/60/12
push dword [HOURRX]
push dword [HOURRY]
push esi
push edi
call getHandCoords
mov eax,MOS_SC_DRAWLINE
shl ebx,16
or ebx,esi
shl ecx,16
or ecx,edi
mov edx,[wndColors + MOS_WNDCOLORS.workText]
int 0x40
pop edx
; draw tick marks
mov dword [i],11 ; draw 12 marks
.drawtickmarks:
push dword [i] ; calculate start point
fpush32 0.523598776 ; 2*pi/12
push dword [TMR1X]
push dword [TMR1Y]
push esi
push edi
call getHandCoords
mov eax,ebx ; save in eax and edx
mov edx,ecx
push dword [i]
fpush32 0.523598776 ; 2*pi/12
push dword [TMR2X]
push dword [TMR2Y]
push esi
push edi
call getHandCoords
shl eax,16
shl edx,16
or ebx,eax ; ebx = x start and end
or ecx,edx ; ecx = y start and end
mov edx,[wndColors + MOS_WNDCOLORS.workText]
mov eax,MOS_SC_DRAWLINE
int 0x40
dec dword [i]
jns .drawtickmarks
 
%define DATE_WIDTH 48
 
; calculate text start position
mov eax,[procInfo+MOS_PROCESSINFO.wndWidth]
sub eax,DATE_WIDTH ; x = (wndwidth-textwidth)/2
shr eax,1 ; eax = x
fild dword [workheight] ; y = DATE_FACTOR*workheight...
fmul dword [DATE_FACTOR]
mov [foo],edi ; ... + y_clockcenter
fiadd dword [foo]
fistp dword [foo]
mov ebx,[foo] ; ebx = y
 
; draw text at all ?
cmp dword [workwidth],DATE_WIDTH ; text too wide ?
jb .goodbye
mov ecx,ebx ; text too high ?
add ecx,10-1
mov edx,[procInfo+MOS_PROCESSINFO.wndHeight]
sub edx,MOS_WND_SKIN_BORDER_BOTTOM
cmp ecx,edx
jnae .yousuck
.goodbye:
jmp .bye
.yousuck:
 
 
; ebx = (x << 16) | y
shl eax,16
or ebx,eax
; get date (edi)
mov eax,MOS_SC_GETDATE
int 0x40
mov edi,eax
 
; display month
mov eax,edi ; get month
shr eax,8
call bcdbin
; ebx contains already position
mov ecx,[wndColors+MOS_WNDCOLORS.workText]
lea edx,[monthNames-3+eax*2+eax]; -3 because eax = 1..12 =]
mov esi,3 ; text length
mov eax,MOS_SC_WRITETEXT
int 0x40
 
; display date
add ebx,MOS_DWORD(3*6+3,0)
mov eax,edi ; get date
shr eax,16
call bcdbin
mov edx,ebx ; position must be in edx
mov ebx,0x00020000 ; number, display two digits
mov ecx,eax ; number to display
mov esi,[wndColors+MOS_WNDCOLORS.workText]
mov eax,MOS_SC_WRITENUMBER
int 0x40
 
; display year. the way we avoid the y2k bug is even
; simpler, yet much better than in the last version:
; now we simply display the last two digits and let the
; user decide wether it's the year 1903 or 2003 =]
add edx,MOS_DWORD(2*6+3,0)
mov eax,edi ; get year
call bcdbin
mov ebx,0x00020000 ; number, display two digits
mov ecx,eax ; number to display
; edx contains already position
mov esi,[wndColors+MOS_WNDCOLORS.workText]
mov eax,MOS_SC_WRITENUMBER
int 0x40
 
.byebye:
popfd
popad
leave
ret
%pop
 
 
;**********************************************************
; bcdbin
; converts a 8 bit bcd number into a 32 bit binary number
;
; in al = 8 bit bcd number
; out eax = 32 bit binary number
; destroys dl,flags
;**********************************************************
bcdbin:
push edx
pushfd
mov dl,al ; save bcd number
shr al,4 ; convert upper nibble
mov ah,10
mul ah
and dl,15 ; add lower nibble
add al,dl
and eax,255 ; !
popfd
pop edx
ret
 
 
;********************************************************************
; getHandCoords
; calculates the end point of a hand
;
; input (on stack, push from top to bottom):
; ANGLE angle (integer)
; DEG2RAD conversion factor for ANGLE (32 bit real)
; RADIUSX x radius (32 bit real)
; RADIUSY y radius (32 bit real)
; CENTERX x center of the clock (integer)
; CENTERY y center of the clock (integer)
;
; output:
; ebx x coordinate in bits 0..15, bits 16..31 are zero
; ecx y coordinate in bits 0..15, bits 16..31 are zero
;
; destroys:
; nothing
;********************************************************************
getHandCoords:
 
ANGLE equ 28
DEG2RAD equ 24
RADIUSX equ 20
RADIUSY equ 16
CENTERX equ 12
CENTERY equ 8
 
enter 0,0
pushfd
 
fild dword [ebp+ANGLE] ; get angle
fmul dword [ebp+DEG2RAD] ; convert to radians
fsincos
fmul dword [ebp+RADIUSY] ; -y * radius + clockcy
fchs
fiadd dword [ebp+CENTERY]
fistp dword [ebp+CENTERY]
fmul dword [ebp+RADIUSX] ; x * radius + clockcx
fiadd dword [ebp+CENTERX]
fistp dword [ebp+CENTERX]
mov ebx,[ebp+CENTERX]
mov ecx,[ebp+CENTERY]
 
popfd
leave
ret 4*6
 
 
%endif
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/aclock/trunk/make.bat
0,0 → 1,2
@rem nasm -t -f bin -o aclock -l aclock.lst aclock.asm -DDEBUG
nasm -t -f bin -o aclock aclock.asm
/programs/demos/aclock/trunk/mos.inc
0,0 → 1,334
; mos.inc 0.03
; Copyright (c) 2002 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _MOS_INC
%define _MOS_INC
 
 
;**********************************************************
; generates a menuetos 01 header
; takes 6 parameters:
;
; MOS_HEADER01 start, end, appmem, esp, i_param, i_icon
;**********************************************************
 
%macro MOS_HEADER01 6
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd %1 ; start of code
dd %2 ; image size
dd %3 ; application memory
dd %4 ; esp
dd %5 ; i_param
dd %6 ; i_icon
%endmacro
 
 
;**********************************************************
; MOS_DWORD
; packs 2 words into a double word
;**********************************************************
 
%define MOS_DWORD(hi,lo) ((((hi) & 0xffff) << 16) + ((lo) & 0xffff))
 
 
;**********************************************************
; MOS_RGB
; creates a menuet os compatible color (0x00RRGGBB)
;**********************************************************
 
%define MOS_RGB(r,g,b) ((((r) & 255) << 16) + (((g) & 255) << 8) + ((b) & 255))
 
 
;**********************************************************
; window stuff
;**********************************************************
 
; default window colors
struc MOS_WNDCOLORS
.frame: resd 1
.grab: resd 1
.grabButton: resd 1
.grabButtonText: resd 1
.grabText: resd 1
.work: resd 1
.workButton: resd 1
.workButtonText: resd 1
.workText: resd 1
.workGraphics: resd 1
endstruc
 
; skinned window borders
MOS_WND_SKIN_BORDER_LEFT equ 5
MOS_WND_SKIN_BORDER_RIGHT equ 5
MOS_WND_SKIN_BORDER_BOTTOM equ 5
 
 
;**********************************************************
; process info structure
;**********************************************************
 
struc MOS_PROCESSINFO
.CPUUsage: resd 1
.windowStackPos: resw 1
.windowStackVal: resw 1
.reserved1: resw 1
.processName: resb 12
.memStart: resd 1
.memUsed: resd 1
.pid: resd 1
.wndXPos resd 1
.wndYPos resd 1
.wndWidth resd 1
.wndHeight resd 1
.reserved2: resb (1024 - 50)
endstruc
 
 
 
;**********************************************************
; system call numbers
;**********************************************************
 
MOS_SC_EXIT equ -1
MOS_SC_DEFINEWINDOW equ 0
MOS_SC_PUTPIXEL equ 1
MOS_SC_GETKEY equ 2
MOS_SC_GETSYSCLOCK equ 3
MOS_SC_WRITETEXT equ 4
MOS_SC_DELAY equ 5
MOS_SC_OPENFILEFLOPPY equ 6 ; obsolete
MOS_SC_PUTIMAGE equ 7
MOS_SC_DEFINEBUTTON equ 8
MOS_SC_GETPROCESSINFO equ 9
MOS_SC_WAITEVENT equ 10
MOS_SC_CHECKEVENT equ 11
MOS_SC_REDRAWSTATUS equ 12
MOS_SC_DRAWBAR equ 13
MOS_SC_GETSCREENMAX equ 14
MOS_SC_SETBACKGROUND equ 15
MOS_SC_GETPRESSEDBUTTON equ 17
MOS_SC_SYSTEMSERVICE equ 18
MOS_SC_STARTPROGRAM equ 19 ; obsolete
MOS_SC_MIDIINTERFACE equ 20
MOS_SC_DEVICESETUP equ 21
MOS_SC_WAITEVENTTIMEOUT equ 23
MOS_SC_CDAUDIO equ 24
MOS_SC_SB16MIXER1 equ 25
MOS_SC_GETDEVICESETUP equ 26
MOS_SC_WSS equ 27
MOS_SC_SB16MIXER2 equ 28
MOS_SC_GETDATE equ 29
MOS_SC_READHD equ 30 ; obsolete
MOS_SC_STARTPROGRAMHD equ 31 ; obsolete
MOS_SC_DELETEFILEFLOPPY equ 32
MOS_SC_SAVEFILERAMDISK equ 33 ; obsolete
MOS_SC_READDIRRAMDISK equ 34 ; obsolete
MOS_SC_GETSCREENPIXEL equ 35
MOS_SC_GETMOUSEPOSITION equ 37
MOS_SC_DRAWLINE equ 38
MOS_SC_GETBACKGROUND equ 39
MOS_SC_SETEVENTMASK equ 40
MOS_SC_GETIRQOWNER equ 41
MOS_SC_GETDATAREADBYIRQ equ 42
MOS_SC_SENDDATATODEVICE equ 43
MOS_SC_PROGRAMIRQS equ 44
MOS_SC_RESERVEFREEIRQ equ 45
MOS_SC_RESERVEFREEPORTS equ 46
MOS_SC_WRITENUMBER equ 47
MOS_SC_WINDOWPROPERTIES equ 48
MOS_SC_SHAPEDWINDOWS equ 50
MOS_SC_CREATETHREAD equ 51
MOS_SC_STACKDRIVERSTATE equ 52
MOS_SC_SOCKETINTERFACE equ 53
MOS_SC_SOUNDINTERFACE equ 55
MOS_SC_WRITEFILEHD equ 56 ; obsolete
MOS_SC_DELETEFILEHD equ 57
MOS_SC_SYSTREEACCESS equ 58
MOS_SC_SYSCALLTRACE equ 59
MOS_SC_IPC equ 60
MOS_SC_DIRECTGRAPHICS equ 61
MOS_SC_PCI equ 62
MOS_SC_DEBUGBOARD equ 63
 
 
;**********************************************************
; event numbers
;**********************************************************
 
MOS_EVT_NONE equ 0
MOS_EVT_REDRAW equ 1
MOS_EVT_KEY equ 2
MOS_EVT_BUTTON equ 3
 
 
;**********************************************************
; event bits
;**********************************************************
 
MOS_EVTBIT_REDRAW equ (1 << 0)
MOS_EVTBIT_KEY equ (1 << 1)
MOS_EVTBIT_BUTTON equ (1 << 2)
MOS_EVTBIT_ENDREQUEST equ (1 << 3)
MOS_EVTBIT_BGDRAW equ (1 << 4)
MOS_EVTBIT_MOUSECHANGE equ (1 << 5)
MOS_EVTBIT_IPCEVENT equ (1 << 6)
MOS_EVTBIT_IRQ0 equ (1 << 16)
MOS_EVTBIT_IRQ1 equ (1 << 17)
MOS_EVTBIT_IRQ2 equ (1 << 18)
MOS_EVTBIT_IRQ3 equ (1 << 19)
MOS_EVTBIT_IRQ4 equ (1 << 20)
MOS_EVTBIT_IRQ5 equ (1 << 21)
MOS_EVTBIT_IRQ6 equ (1 << 22)
MOS_EVTBIT_IRQ7 equ (1 << 23)
MOS_EVTBIT_IRQ8 equ (1 << 24)
MOS_EVTBIT_IRQ9 equ (1 << 25)
MOS_EVTBIT_IRQ10 equ (1 << 26)
MOS_EVTBIT_IRQ11 equ (1 << 27)
MOS_EVTBIT_IRQ12 equ (1 << 28)
MOS_EVTBIT_IRQ13 equ (1 << 29)
MOS_EVTBIT_IRQ14 equ (1 << 30)
MOS_EVTBIT_IRQ15 equ (1 << 31)
 
 
;**********************************************************
; exit application (syscall -1)
;**********************************************************
 
; exit application
%macro MOS_EXIT 0
mov eax,MOS_SC_EXIT
int 0x40
%endmacro
 
; exit application, smaller version
%macro MOS_EXIT_S 0
xor eax,eax
dec eax
int 0x40
%endmacro
 
 
;**********************************************************
; wait event stuff
; (MOS_SC_WAITEVENT, syscall 10)
;**********************************************************
 
; wait for event
; destroys : nothing
; returns : eax = event type
%macro MOS_WAITEVENT 0
mov eax,MOS_SC_WAITEVENT
int 0x40
%endmacro
 
; wait for event, smaller version
; destroys : flags
; returns : eax = event type
%macro MOS_WAITEVENT_S 0
xor eax,eax
mov al,MOS_SC_WAITEVENT
int 0x40
%endmacro
 
 
;**********************************************************
; window redraw status stuff
; (MOS_SC_REDRAWSTATUS, syscall 12)
;**********************************************************
 
MOS_RS_STARTREDRAW equ 1
MOS_RS_ENDREDRAW equ 2
 
; start window redraw
; destroys: eax,ebx
%macro MOS_STARTREDRAW 0
mov ebx,MOS_RS_STARTREDRAW
mov eax,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
 
; start window redraw, smaller version
; destroys: eax,ebx,flags
%macro MOS_STARTREDRAW_S 0
xor ebx,ebx
inc ebx
xor eax,eax
mov al,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
 
; end window redraw
; destroys: eax,ebx
%macro MOS_ENDREDRAW 0
mov ebx,MOS_RS_ENDREDRAW
mov eax,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
 
; end window redraw, smaller version
; destroys: eax,ebx,flags
%macro MOS_ENDREDRAW_S 0
xor ebx,ebx
mov bl,MOS_RS_ENDREDRAW
xor eax,eax
mov al,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
 
 
;**********************************************************
; get screen max stuff (syscall 14)
;**********************************************************
 
; get screen dimensions in eax
; destroys: nothing
%macro MOS_GETSCREENMAX 0
mov eax,MOS_SC_GETSCREENMAX
int 0x40
%endmacro
 
; get screen dimensions in eax, smaller version
; destroys: flags
%macro MOS_GETSCREENMAX_S 0
xor eax,eax
mov al,MOS_SC_GETSCREENMAX
int 0x40
%endmacro
 
 
;********************************************************************
; opcode hacks
;********************************************************************
 
; nasm refuses to assemble stuff like
; push dword 4.44
; with the following macro this becomes possible:
; fpush32 9.81
; don't forget to use a decimal point. things like
; fpush32 1
; will probably not do what you expect. instead, write:
; fpush32 1.0
%macro fpush32 1
db 0x68 ; push imm32
dd %1
%endm
 
%endif
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/aclock/trunk/str2dwrd.inc
0,0 → 1,92
; string2dword - a useless string to double word conversion routine
;
; Copyright (c) 2003 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
 
 
;********************************************************************
; converts an asciiz string into an unsigned doubleword.
; (base 10 is assumed)
;
; - first, leading whitespaces are skipped
; - then the function converts the string, until it
; finds the terminating zero, another character it
; cannot convert or the number becomes too large.
;
; input : esi = pointer to string
; output : eax = unsigned doubleword
; the function tries to convert as
; many digits as possible, before it
; stops. if the value of the dword
; becomes too large, 0xffffffff is
; returned.
; destroys : nothing
;********************************************************************
string2dword:
push ebx
push ecx
push edx
push esi
pushfd
 
xor ebx,ebx ; ebx : dword
 
; skip leading whitespaces
.skipspaces:
lodsb
cmp al,32 ; space
je .skipspaces
cmp al,12 ; ff
je .skipspaces
cmp al,10 ; lf
je .skipspaces
cmp al,13 ; cr
je .skipspaces
cmp al,9 ; ht
je .skipspaces
cmp al,11 ; vt
je .skipspaces
 
; convert string
dec esi ; esi -> 1st non-whitespace
.convert:
xor eax,eax ; get character
lodsb
sub al,'0' ; convert to digit
cmp al,9 ; is digit in range [0,9] ?
ja .done ; nope -> stop conversion
mov ecx,eax ; save new digit
mov eax,10 ; dword = dword * 10
mul ebx
jc .overflow
add eax,ecx ; + new digit
jc .overflow
mov ebx,eax
jmp .convert
 
.overflow:
mov ebx,0xffffffff
.done:
mov eax,ebx
popfd
pop esi
pop edx
pop ecx
pop ebx
ret
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/aclock/trunk/strlen.inc
0,0 → 1,49
; strlen function
;
; Copyright (c) 2003 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _STRLEN_INC
%define _STRLEN_INC
 
 
;********************************************************************
; returns the length of an asciiz string
; input : esi = pointer to string
; output : eax = string length
; destroys : nothing
;********************************************************************
strlen:
push ecx
push edi
pushfd
cld ; !
mov ecx,-1
mov edi,esi ; find terminating zero
xor al,al
repne scasb
mov eax,edi ; calculate string length
sub eax,esi
dec eax
popfd
pop edi
pop ecx
ret
 
 
%endif
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/aclock/trunk/strtok.inc
0,0 → 1,125
; some strtok-like function
;
; Copyright (c) 2003 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _STRTOK_INC
%define _STRTOK_INC
 
 
;********************************************************************
; strtok
; this function works like strtok from a c runtime library.
; note that it is not threadsafe. it would be an easy task
; to make it threadsafe, though:
; .adx must be removed, instead the last search address is
; stored at some location provided by the user (passed as
; a third parameter in ecx or so)
;
; input:
;
; eax : address of string to be searched (asciiz), or
; 0 to get the next token of the current string
; ebx : address of delimiter list (asciiz)
;
; output:
;
; eax : pointer to the next token, or 0 if there
; aren't any tokens anymore.
;
; destroys: nothing
;
;********************************************************************
strtok:
pushad
pushfd
 
; get start address
; if the new start address is 0, and the old address (.adx)
; is also 0, then there's nothing to do and we return 0.
or eax,eax ; new address = 0 ?
jz .nonewstring ; nope -> use old string
mov [.adx],eax ; yeah -> store new string adx
.nonewstring:
mov esi,[.adx] ; load string address
or esi,esi ; 0 ?
jnz .startadxok ; nope -> ok
xor eax,eax ; yeah -> return 0
je .bye
.startadxok:
 
; skip leading delimiters
.skipdelimiters:
lodsb ; read character
mov edi,ebx ; edi -> delimiter list
.foo:
mov cl,[edi] ; get delimiter
inc edi
or cl,cl ; end of delimiter list
jz .endofdelimiterlist
cmp al,cl ; if AL is a delimiter, then
je .skipdelimiters ; we need to skip it too...
jmp .foo ; otherwise try next delimiter
.endofdelimiterlist:
 
; end of string reached without finding any non-delimiters ?
or al,al ; character = 0 ?
jnz .bar ; nope -> continue
mov dword [.adx],0 ; yeah -> remember this
xor eax,eax ; and return 0
jmp .bye
.bar:
 
; found the start of a token, let's store its address
mov edx,esi
dec edx ; edx = start address of token
 
; find the end of the token
.abraham:
lodsb ; get character
mov edi,ebx ; edi -> delimiter list
.bebraham:
mov cl,[edi] ; get delimiter
inc edi
cmp al,cl ; is AL a delimiter ?
jne .cebraham ; nope -> continue
or al,al ; terminating zero found ?
jnz .argle
xor esi,esi ; yeah -> remember this
jmp .bargle
.argle:
mov byte [esi-1],0 ; nope -> mark end of token
.bargle:
mov [.adx],esi ; remember search address
mov eax,edx ; return token address
jmp .bye
.cebraham:
or cl,cl ; end of delimiter list ?
jnz .bebraham ; nope -> try next delimiter
jmp .abraham
; write return value into stack, so that when popad
; gets executed, eax will receive the return value.
.bye:
mov [esp+4*8],eax
popfd
popad
ret
.adx dd 0
 
%endif
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/bcdclk/bcdclk/bcdclk.asm
0,0 → 1,157
;
; BCD CLOCK
;
; Compile with FASM for Menuet
;
;
 
use32
 
org 0x0
 
db 'MENUET01'
dd 0x01
dd START
dd I_END
dd 0x100000
dd 0x7fff0
dd 0x0 , 0x0
 
include "lang.inc"
include "macros.inc"
 
 
START:
 
call drawwindow
 
still:
 
 
mov eax,23 ; wait for timeout
mov ebx,50
int 0x40
 
cmp eax,1 ; redraw ?
je red
 
cmp eax,3 ; button in buffer ?
je button
 
call drawclock
 
jmp still
 
red: ; redraw
call drawwindow
jmp still
 
button:
mov eax,17 ; get id
int 0x40
 
cmp ah,1 ; button id=1 ?
jne noclose
mov eax,-1 ; close this program
int 0x40
noclose:
 
jmp still
 
drawclock:
 
mov eax,3 ; get time
int 0x40
bswap eax
shr eax,8
mov edi,dg1
mov ecx,6
dgtomem:
push eax
and al,15
mov [edi],al
inc edi
pop eax
shr eax,4
loop dgtomem
mov ebx,74*65536+10
mov edi,dg1
digitlp:
mov ecx,30*65536+10
xor esi,esi
plotlp:
xor edx,edx
test byte[edi],8
je nobit
mov edx,0x00ff0000
nobit:
mov eax,13 ; plot 8,4,2,1
int 0x40
add ecx,12*65536
shl byte[edi],1
inc esi
cmp esi,4
jne plotlp
shr byte[edi],4
mov edx,0x00880040
mov eax,13 ; draw digit box
int 0x40
pusha
mov edx,ebx
and edx,0xffff0000
shr ecx,16
or edx,ecx
add edx,3*65536+2
mov ebx,0x00010100
mov ecx,[edi]
mov esi,0x00ffffff
mov eax,47 ; display decimal
int 0x40
popa
sub ebx,12*65536
inc edi
cmp edi,dg1+6
jne digitlp
ret
 
 
drawwindow:
 
 
mov eax,12
mov ebx,1 ; start redraw
int 0x40
 
mov eax,0 ; window
mov ebx,100*65536+100
mov ecx,100*65536+100
mov edx,0x83400088
mov esi,0x805080d0
mov edi,0x000000ff
int 0x40
 
call drawclock
 
mov eax,4 ; text
mov ebx,8*65536+8
mov ecx,0x10ddeeff
mov edx,title
mov esi,title-titlend
int 0x40
 
 
mov eax,12
mov ebx,2 ; end redraw
int 0x40
 
ret
 
 
 
title:
db 'BCD Clock'
titlend:
 
dg1: db ?
 
I_END:
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/bcdclk/bcdclk/build_en.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix en >lang.inc
@fasm bcdclk.asm bcdclk
@pause
/programs/demos/bcdclk/bcdclk/build_ru.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm bcdclk.asm bcdclk
@pause
/programs/demos/bcdclk/bcdclk/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,b { ; mike.dld
if (~a eq)&(~b eq)
mpack reg,a,b
else if (~a eq)&(b 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
}
 
 
 
 
 
 
; 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
/programs/demos/bgitest/trunk/FONTS/EURO.CHR
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/demos/bgitest/trunk/FONTS/GOTH.CHR
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/demos/bgitest/trunk/FONTS/LCOM.CHR
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/demos/bgitest/trunk/FONTS/LITT.CHR
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/demos/bgitest/trunk/FONTS/SANS.CHR
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/demos/bgitest/trunk/FONTS/SCRI.CHR
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/demos/bgitest/trunk/FONTS/SIMP.CHR
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/demos/bgitest/trunk/FONTS/SMAL.CHR
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/demos/bgitest/trunk/FONTS/TRIP.CHR
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/demos/bgitest/trunk/FONTS/TSCR.CHR
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/demos/bgitest/trunk/bgifont.inc
0,0 → 1,691
; BGIFONT.INC v1.0 beta
;
; Written in pure assembler by Ivushkin Andrey aka Willow
;
; Created: December 16, 2004
;
; Last changed: February 2, 2005
;
; Compile with FASM
 
; BGI constants
BGI_NODRAW equ 0x10000
BGI_ITALIC equ 0x20000
BGI_BOLD equ 0x40000
BGI_HALEFT equ 0x0
BGI_HARIGHT equ 0x1000
BGI_HACENTER equ 0x2000
BGI_VABOTTOM equ 0x0
BGI_VATOP equ 0x4000
BGI_VACENTER equ 0x8000
 
BGI_FREE equ 0x80000000
BGI_HAMASK equ 0x3000
BGI_VAMASK equ 0xc000
 
; Freetext structure
struc BGIfree FontName,XY,Angle,ScaleX,ScaleY,StrPtr,StrLen,Color,Align
{
dd FontName ;0
dd XY ;4
dd Angle ;8
dd ScaleX ;12
dd ScaleY ;16
dd StrPtr ;20
dd StrLen ;24
dd Color ;28
dd Align ;32
}
 
; font options structure
struc BGIrec FontName,CharsCount,FirstChar,UpperMargin,LowerMargin,\
Widths,FirstData,EOF,font_data
{
.FontName dd ? ; 0
.CharsCount db ? ; 4
.FirstChar db ? ; 5
.UpperMargin db ? ; 6
.LowerMargin db ? ; 7
.Widths dd ? ; 8
.FirstData dd ? ; 12
.EOF dd ? ; 16
.font_data dd ? ; 20 follows (Offsets)
}
 
macro BGIfont_GetID
{
call _BGIfont_GetID
}
 
macro BGIfont_Prepare
{
call _BGIfont_Prepare
}
 
macro BGIfont_Freetext
{
call _BGIfont_Freetext
}
 
macro BGIfont_Outtext
{
call _BGIfont_Outtext
}
 
macro _FI name,_size
{
db name
if BGI_LEVEL eq KERNEL
dw _size
end if
}
 
BGIfont_names:
_FI 'LCOM',11485 ;7
_FI 'EURO',8117 ;5
_FI 'GOTH',13816 ;6
_FI 'LITT',3596 ;8
_FI 'TRIP',11932 ;14
_FI 'SCRI',8490 ;11
_FI 'SMAL',4162 ;13
_FI 'TSCR',12134 ;15
_FI 'SANS',8453 ;10
_FI 'SIMP',9522 ;12
BGIfont_names_end:
 
macro BGIfont_Init
{
; in: ecx - number of fonts to load;
; esi-> _FI structure
; edi-> where to load
push edi
if BGI_LEVEL eq KERNEL
mov edi,0x40000
end if
.nfont:
mov edx,[esi]
if BGI_LEVEL eq KERNEL
movzx ebx,word[esi+4]
mov [BGIfont_Prepare.okflag],'N'
end if
call _BGIfont_Prepare
if ~ BGI_LEVEL eq KERNEL
add esi,4
else
push esi
test eax,eax
jz .fail
mov [BGIfont_Prepare.okflag],'*'
.fail:
mov esi,BGIfont_Prepare.font
call boot_log
pop esi
add esi,6
end if
loop .nfont
dph2 _BGI_BOLD,300,550
; movzx edi,byte[0x40000]
pop edi
}
 
BGIfont_get2head:
shr ecx,28 ; font #
sub ecx,4
jb .exit2 ; invalid #
mov edi,[BGIfont_Ptr]
inc edi
cmp cl,[edi-1]
jae .exit2 ; # too large
jecxz .ex
.fnext:
mov edi,[edi+16]
loop .fnext
jmp .ex
.exit2:
xor edi,edi
.ex:
ret
 
BGIfont_GetName:
; in: ecx-fontID;
; out: edx-font name.
call BGIfont_get2head
xor edx,edx
test edi,edi
jz .ex
mov edx,[edi]
.ex:
ret
 
macro dps2 _str
{
if ~ BGI_LEVEL eq KERNEL
if LOAD_MSG eq 1
dps _str
end if
else
pusha
mov esi,BGIfont_Prepare.okflag
mov byte[esi], _str
call boot_log
popa
end if
}
 
macro dph2 num,x,y
{
if BGI_LEVEL eq KERNEL
pusha
mov eax,0x00080100
mov ebx,num
mov ecx,x shl 16+y
mov edx,0xFF0000
call display_number
popa
end if
}
 
_BGIfont_GetID:
; in: edx-font name;
; out: eax-fontID, edi->BGIrec
push ecx edi
mov edi,[BGIfont_Ptr]
movzx ecx,byte[edi] ; ecx-font count
mov eax,ecx
inc edi ; edi->FontName
jecxz .ex
.fnext:
cmp edx,[edi]
jne .floop
sub eax,ecx
add eax,4
shl eax,28
jmp .ex
.floop:
mov edi,[edi+16]
loop .fnext
.num0:
xor eax,eax
.ex:
pop edi ecx
ret
 
_BGIfont_Prepare:
; in: edx-font name, edi->pointer to load fonts (fonts_count)
; out: eax-ID of new font loaded; eax=0 error
cmp [BGIfont_Ptr],0
jne .already
mov [BGIfont_Ptr],edi
.already:
pusha
mov edi,[BGIfont_Ptr]
movzx ecx,byte[edi] ; ecx-font count
mov eax,ecx
inc edi ; edi->FontName
jecxz .fload
.fnext:
cmp edx,[edi]
jne .loop
sub eax,ecx
inc eax
jmp .cr_id
.loop:
mov edi,[edi+16]
loop .fnext
.fload:
mov dword[.font],edx ; filename
mov esi,edi ; esi->FontName
mov [.dest],edi ; ptr to load font
if ~ BGI_LEVEL eq KERNEL
mov [.fsize],1
mov eax,58
mov ebx,.fontinfo
int 0x40
test eax,eax
jnz .fail
dps2 '1'
shr ebx,9
inc ebx
mov [.fsize],ebx
mov ebx,.fontinfo
mov eax,58
int 0x40 ; ebx - file size
else
push edi esi edx
mov eax,.font
xor ebx,ebx
mov esi,12
mov ecx,ebx
mov edx,edi
call fileread
pop edx esi edi
mov ebp,edi
add ebp,ebx
cmp ebp,0x50000
ja .fail
end if
cmp dword[edi],0x08084b50 ; 'PK',8,8
jne .fail
dps2 '2'
inc edi
mov eax,26 ; #EOF
mov ecx,253
cld
repne scasb ; skip Copyright
test ecx,ecx
jz .fail
dps2 '3'
cmp edx,[edi+2] ; FontName
jne .fail
dps2 '4'
movzx ecx,word[edi] ; HeaderSize
sub ebx,ecx ; Filesize-Headersize
movzx eax,word[edi+6] ; FontSize
cmp eax,ebx
jb .fail ; file truncated
add ecx,[.dest]
dps2 '5'
cmp byte[ecx],'+' ; ParPrefix
jne .fail
; font is valid, let's fill parameter table
dps2 '>'
mov [esi],edx ; FontName
mov edx,eax
add eax,ecx
mov [esi+16],eax ; Font EOF
movzx eax,word[ecx+5]
add eax,ecx
mov [esi+12],eax
lea edi,[esi+4] ; edi->CharsCount
lea esi,[ecx+1] ; esi->ParPrefix+1
xor eax,eax
lodsw
stosb ; CharsCount
inc esi
movsb ; FirstChar
add esi,3
lodsw
stosb ; UpperMargin
movsb ; LowerMargin
add esi,5 ; esi->offsets
mov eax,[esi]
push edi ; edi->Widths
; prepare moving data
add edi,12 ; edi->offsets
lea ecx,[edx-16]
rep movsb
pop edi ; edi->Widths
mov [edi+8],esi ; EOF
; mov eax,[edi]
movzx ecx,byte[edi-4] ; CharsCount
lea eax,[edi+12+ecx*2] ; eax->widths
stosd ; edi->FirstData
add eax,ecx
stosd ; edi->EOF
mov eax,[esp] ; eax->fonts_count
inc byte[eax] ; increase font counter
movzx eax,byte[eax]
.cr_id:
add eax,0x3 ; create unique ID
shl eax,28 ; to easy use in color(ecx)
jmp .exit
.fail:
xor eax,eax
.exit:
mov [esp+28],eax
popa
ret
 
if ~ BGI_LEVEL eq KERNEL
.fontinfo:
dd 0
dd 0
.fsize dd 0
.dest dd 0
dd 0x10000
db BGIFONT_PATH
.font db 'FONT.CHR',0
else
.dest dd 0
.font db 'FONT CHR'
.okflag db ' ',0
end if
 
BGIfont_Coo:
; y->word[txt.y1], x->word[txt.x1]
fild [txt.y1] ;y
fmul st0,st0; y*y
fild [txt.x1] ;x
fmul st0,st0; x*x
faddp ; x*x+y*y
fsqrt ; sqrt, angle
fild [txt.y1];y
fabs
fild [txt.x1] ; x
fabs
fpatan ; arctg(y/x)
.skip:
cmp [txt.x1],0
jge .xplus
fchs
fadd st0,st3
.xplus:
cmp [txt.y1],0
jge .yplus
fchs
.yplus:
fadd st0,st2
fsincos
fmul st0,st2
fiadd [txt.x0]
fistp [txt.x1] ; x=r*cos a
fmulp ; y=r*sin a,angle
fiadd [txt.y0]
fistp [txt.y1]
ret
 
_BGIfont_Freetext:
; in: ebx-BGIfree structure
; out: eax-new drawing coords
mov edx,[ebx]
call _BGIfont_GetID
test eax,eax
jnz .fexists
ret
.fexists:
pusha
fninit
fldpi
fld [pi180]
fimul dword[ebx+8]
fst [BGIangle]
mov esi,[ebx+28]
and esi,0xffffff
add esi,eax
mov eax,[ebx+32]
and [deform],0
test eax,BGI_ITALIC
jz .norm
mov [deform],0.4
.norm:
mov ebp,eax
or ebp,BGI_FREE
mov eax,[ebx+12]
mov [Xscale],eax
mov eax,[ebx+16]
mov [Yscale],eax
mov ecx,[ebx+20]
mov edx,ebp
and edx,BGI_FREE+BGI_VAMASK+BGI_HAMASK
add edx,[ebx+24]
mov eax,[ebx+4]
mov ebx,esi
add ebx,0x6000000
mov [esp+4],edx
mov [esp+20],ecx
jmp txt
 
pi180 dd 0.017453
 
_BGIfont_Outtext:
; in: ebx-[x][y], ecx-color, edx-string, esi-length
pusha
mov ebp,esi
if ~ BGI_LEVEL eq KERNEL
mov eax,ebx
mov ebx,ecx
mov ecx,edx
mov edx,esi
end if
; in: eax-[x][y], ebx-color, ecx-string, edx-length
txt:
if ~ BGI_LEVEL eq KERNEL
if BGI_WINDOW_CLIP eq 1
pusha
mov eax,9
mov ebx,BGI_PRC_INFO
mov ecx,-1
int 0x40
popa
end if
end if
mov [.y0],ax
shr eax,16
mov [.x0],ax
mov ecx,ebx ; color
and ebx,0xfffffff
mov [.color],ebx
call BGIfont_get2head
test edi,edi
jz .exit
mov ecx,[esp+4]; str length
mov esi,[esp+20]; str ptr
movzx eax,byte[edi+5]
push ecx
and ecx,0xff
jnz .lenok
add esp,4
jmp .ex2
.lenok:
pusha
push dword[txt.y0]
and dword[txt.y0],0
xor edx,edx
mov ebx,[edi+8]
.next:
call txt.BGIfont_GetChar
movzx eax,byte[ebx+eax]
add edx,eax
loop .next
mov ecx,edx ; ecx - x size
movzx dx,byte[edi+6]
mov ebx,[esp+36]
and ebx,BGI_HAMASK
cmp ebx,BGI_HARIGHT
je .nova
ja .subv
xor ecx,ecx
jmp .nova
.subv:
shr cx,1
.nova:
mov ebx,[esp+36]
and ebx,BGI_VAMASK
cmp ebx,BGI_VATOP
je .def
ja .subh
xor edx,edx
jmp .def
.subh:
shr dx,1
.def:
call txt.BGIfont_Deform
pop dword[txt.y0]
popa
pop ebx
mov ax,[txt.y1]
sub [txt.y0],ax
mov ax,[txt.x1]
sub [txt.x0],ax
xor eax,eax
cld
.mloop:
push [.y0]
pop [.y]
push [.x0]
pop [.x]
call .BGIfont_GetChar
push esi
lea esi,[edi+20] ; offset
movzx edx,word[esi+eax*2] ; ofs1
add edx,[edi+12]
inc eax
cmp al,[edi+4]
je .eof
movzx eax,word[esi+eax*2]; ofs2
add eax,[edi+12]
jmp .prc_vec
.eof:
mov eax,[edi+16] ; ofs2=eof
.prc_vec: ; edx-vec cmd ifs, eax-cmd limit
mov [.vec_end],eax
push ecx
.vec_loop:
mov ax,word[edx]
push edx
mov ecx,eax
and eax,0x8080 ; op
and ecx,0x7f ; xx
mov edx,[edx+1]
and edx,0x7f ; yy
cmp edx,63
jbe .positive
sub edx,128 ; yy-=128
.positive:
cmp ecx,63
jbe .positive2
sub ecx,128 ; xx-=128
.positive2:
call .BGIfont_Deform
cmp eax,0x8080
jne .noline
test ebp,BGI_NODRAW
jnz .noline
; draw vector
if ~ BGI_LEVEL eq KERNEL
push eax
mov ebx,dword[.x1]
mov ecx,dword[.y1]
if BGI_WINDOW_CLIP eq 1
movzx eax,[.x]
cmp eax,dword[BGI_PRC_INFO+42]
ja .nobold
movzx eax,[.y]
cmp eax,dword[BGI_PRC_INFO+46]
ja .nobold
xor eax,eax
cmp ax,bx
jg .nobold
cmp ax,cx
jg .nobold
end if
mov edx,[.color]
mov eax,38
int 0x40
test ebp,BGI_BOLD
jz .nobold
test ebp,BGI_FREE
jnz .free5
.free5:
add ebx,1 shl 16+1
int 0x40
.nobold:
pop eax
else
pusha
mov eax,dword[.x1]
mov ebx,dword[.y1]
mov ecx,[.color]
; call syscall_drawline
test dword[esp+8],BGI_BOLD
jz .nobold
add eax,1 shl 16+1
; call syscall_drawline
.nobold:
popa
end if
.noline:
pop edx
test eax,eax
je .eovecs ; op=0
push [.y1]
pop [.y]
push [.x1]
pop [.x]
add edx,2
cmp edx,[.vec_end]
jb .vec_loop
.eovecs:
pop ecx esi
push [.y]
pop [.y0]
push [.x]
pop [.x0]
loop .mloop1
jmp .exit
.mloop1:
jmp .mloop
.exit:
mov eax,dword[.y0]
mov [esp+28],eax
.ex2:
popa
ret
 
.BGIfont_Deform:
test ebp,BGI_FREE
jnz .free0
movzx ebx,byte[.color+3] ;ebx=scale
imul ecx,ebx
add ecx,2
shr ecx,2
imul edx,ebx
add edx,2
shr edx,2
neg edx
mov [.x1],cx
mov [.y1],dx
jmp .add
.free0:
mov [.x1],cx
mov [.y1],dx
fild [.y1]
fld st0
fmul [Yscale]
fchs
fistp [.y1]
fmul [deform]
fiadd [.x1]
fmul [Xscale]
fistp [.x1]
cmp [BGIangle],0
je .add
call BGIfont_Coo
jmp .eax
.add:
mov cx,[.x0]
add [.x1],cx
mov cx,[.y0]
add [.y1],cx
.eax:
ret
 
.BGIfont_GetChar:
; in: esi -> string; edi -> BGIrec
; out: esi -> next char; al - char obtained
lodsb ; al - char from str
sub al,[edi+5]
jb .out
cmp al,[edi+4]
jb .in
.out:
xor al,al ; al - 1st symbol available
.in:
ret
 
.y0 dw ?
.x0 dw ?
 
.x1 dw ?
.x dw ?
.y1 dw ?
.y dw ?
 
.color dd ?
.vec_end dd ?
BGIfont_Ptr dd 0
width dd ?
deform dd ?
BGIangle dd ?
Xscale dd ?
Yscale dd ?
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/bgitest/trunk/bgitest.asm
0,0 → 1,444
; BGI Font Test
;
; Written in pure assembler by Ivushkin Andrey aka Willow
;
; Created: December 20, 2004
;
; Last changed: February 2, 2005
;
 
BGIFONT_PATH equ '/RD/1/'
_X equ 340
_Y equ 240
 
BGI_WINDOW_CLIP equ 1
BGI_PRC_INFO equ pinfo
 
macro ListFonts
{
mov eax,lf_head
call PixelPrint
mov ebx,20 shl 16+60
mov ecx,(BGIfont_names_end-BGIfont_names)/4
mov esi,BGIfont_names
.l1:
pusha
pusha
mcall 4,,0x10777fac,esi,4
popa
mov edx,[esi]
BGIfont_GetID
mov dword[_BGIfont_Prepare.font],edx
mov ecx,eax
add ebx,140 shl 16
mov edx,ebx
mcall 47,0x80100,,,0x10ffffff
jecxz .nofont
lea ebx,[edx+80 shl 16+12]
mov edx,_BGIfont_Prepare.dest+8
mov esi,BGIfont_Coo-1
sub esi,edx
add ecx,0x3b800b8
BGIfont_Outtext
sub ebx,155 shl 16+12
mcall 4,,0x1000f000,load_ok,load_fail-load_ok
jmp .pop
.nofont:
lea ebx,[edx-80 shl 16]
mcall 4,,0x10f00010,load_fail,font_msg-load_fail
.pop:
popa
add esi,4
add ebx,39
loop .l2
jmp .ex
.l2:
jmp .l1
.ex:
}
use32
org 0x0
 
db 'MENUET01'
dd 0x01
dd START
dd I_END
dd 0x100000
dd 0x0cfff0
dd 0x0
not1strun dd 0x0
 
include 'lang.inc'
include 'macros.inc'
;include 'debug.inc'
include 'bgifont.inc'
lang equ en;ru;en
 
START:
mov [help],0
mov ecx,(BGIfont_names_end-BGIfont_names)/4
mov esi,BGIfont_names
mov edi,I_END
BGIfont_Init
reset:
mov esi,[BGIfont_Ptr]
inc esi
mov edi,freeconst
movsd
mov esi,freeconst
mov edi,freetest
mov ecx,36
rep movsb
red:
mov eax,[freetest]
mov dword[title+19],eax
call draw_window
cmp [not1strun],0
jnz still
mcall 5,300
not [not1strun]
inc [help]
jmp red
still:
 
mov eax,10
int 0x40
 
cmp eax,1
je red
cmp eax,2
je key
cmp eax,3
je button
 
jmp still
 
button:
mov eax,17
int 0x40
cmp ah,1
jnz noclose
close:
xor eax,eax
dec eax
int 0x40
noclose:
jmp still
 
key:
mov eax,2
int 0x40
shr eax,8
cmp al,27 ; esc - close
je close
cmp al,32 ; Space - help
jne .noh
inc [help]
cmp [help],3
jne red
and [help],0
jmp red
.noh:
cmp [help],2
jne still
cmp al,50
jb .noff
cmp al,57
ja .noff
sub al,46
.gn:
movzx ecx,al
shl ecx,28
call BGIfont_GetName
mov [freetest],edx
jmp red
.noff:
mov ecx,4
mov edi,Fkeys
.fkey:
cmp al,[edi]
je .fndkey
inc edi
loop .fkey
jmp .notfnd
.fndkey:
lea eax,[edi-Fkeys+0xc]
jmp .gn
.notfnd:
cmp al,114 ; r - reset
je reset
cmp al,176
jne .nol ; left
sub dword[freetest+8],5
jmp red
.nol:
cmp al,179
jne .nor ; right
add dword[freetest+8],5
jmp red
.nor:
cmp al,105 ; i -italic
jne .noi
xor dword[freetest+32],BGI_ITALIC
jmp red
.noi:
cmp al,98 ; b -bold
jne .nob
xor dword[freetest+32],BGI_BOLD
jmp red
.nob:
mov ecx,2
mov esi,ali
.ol2:
cmp al,[esi]
jne .othl2
mov ax,[freetest+32]
add ax,[esi+3]
mov bx,ax
mov dx,[esi+1]
and bx,dx
cmp bx,dx
jne .ok
not dx
and ax,dx
.ok:
mov [freetest+32],ax
jmp red
.othl2:
add esi,5
loop .ol2
.other:
mov esi,delt
mov ecx,4
.ol:
cmp al,[esi]
jne .othl
fld dword[esi+1]
movzx eax,byte[esi+5]
fadd dword[freetest+eax]
fstp dword[freetest+eax]
jmp red
.othl:
add esi,6
loop .ol
jmp still
 
draw_window:
mov eax,12
mov ebx,1
int 0x40
 
xor eax,eax
mov ebx,10*65536+_X*2
mov ecx,100*65536+_Y*2
mov edx,0x03261212
mov esi,0x805080d0
mov edi,0x005080d0
int 0x40
 
mov eax,4
mov ebx,8*65536+8
mov ecx,0x10ddeeff
mov edx,title
mov esi,title_end-title
cmp [help],2
je .int
sub esi,12
.int:
int 0x40
 
cmp [help],0
jnz .help
cmp byte[I_END],0
jnz .fontsok
mov eax,font_msg
call PixelPrint
.fontsok:
ListFonts
jmp .eod
.help:
cmp [help],1
jne .nohelp
mov eax,helptxt
cmp byte[I_END],0
jnz .fontsok2
mov word[eax+2],_X-80
call PixelPrint
jmp .eod
.fontsok2:
mov word[eax+2],_X
call Print
jmp .eod
.nohelp:
mov edi,cross
mov eax,38
mov edx,0x4b331a
mov ebx,[edi]
mov ecx,[edi+4]
int 0x40
mov ebx,[edi+8]
mov ecx,[edi+12]
int 0x40
mov ebx,freetest
BGIfont_Freetext
.eod:
mov eax,12
mov ebx,2
int 0x40
ret
 
Print: ; eax-pointer to _txt struc
pusha
mov ebx,[eax]
movzx ecx,byte[eax+12]
lea edx,[eax+13]
mov edi,eax
.nextstr:
mov esi,[edx]
add edx,4
push ecx
mov ecx,[edi+8]
BGIfont_Outtext
add ebx,[edi+4]
pop ecx
and esi,0xfff
add edx,esi
loop .nextstr
popa
ret
 
PixelPrint: ; eax-pointer to _txt struc, but used differently
pusha
mov ebp,eax
mov ebx,[ebp]
movzx ecx,byte[ebp+12]
mov eax,4
lea edx,[ebp+17]
.l:
mov esi,[edx-4]
and esi,0xfff
push ecx
mov ecx,[ebp+8]
int 0x40
pop ecx
lea edx,[esi+edx+4]
add ebx,[ebp+4]
loop .l
popa
ret
 
macro _txt _xy,_vert,_color,_opt,[_str]
{
common
_counter=0
forward
_counter=_counter+1
common
dd _xy ; 0
dd _vert ; 4
dd _color ; 8
db _counter ;_str_count ; 12
forward
local .str_beg,.str_end
dd (.str_end-.str_beg) or _opt ; 13
.str_beg:
db _str ;17
.str_end:
}
 
title db 'BGIFONT.INC demo - FONT font'
title_end:
_M equ 30
cross dd _M shl 16+_X*2-_M,_Y shl 16+_Y,_X shl 16+_X,_M shl 16+_Y*2-_M
helptxt:
if lang eq ru
_txt _X shl 16+60,40,0x434ba010,BGI_HACENTER,\
"ƒŽŸ—ˆ… Š‹€‚ˆ˜ˆ:",\
"à®¡¥« - èà¨äâë/íâ®â ⥪áâ/¤¥¬ª ;",\
"<-> áâ५ª¨ - ¢à é¥­¨¥ áâப¨;",\
"V - ¢ëà ¢­¨¢ ­¨¥ ¯® ¢¥à⨪ «¨;",\
"H - ¢ëà ¢­¨¢ ­¨¥ ¯® £®à¨§®­â «¨;",\
"[,] - ¬ áèâ ¡ ¯® ®á¨ X;",\
"A,Z - ¬ áèâ ¡ ¯® ®á¨ Y;",\
"B,I - ¯®«ã¦¨à­ë© èà¨äâ ¨ ªãàᨢ;",\
"R - á¡à®á ¯ à ¬¥â஢ èà¨äâ ;",\
"F1..F12 - ¢ë¡®à èà¨äâ ;",\
"Esc - § ªàëâì ¯à®£ã :-("
alpha:
db "‚®â ¯à¨¬¥à ⥪áâ !"
lf_head:
_txt 10 shl 16+30,85 shl 16,0x6e00f7,0,"ˆ¬ï èà¨äâ ","‘â âãá","ID",\
"ãâì ª ä ©«ã"
load_ok:
db "§ £à㦥­"
load_fail:
db "­¥ ­ ©¤¥­"
font_msg:
_txt (_X+20) shl 16+180,25,0x10ff0000,0,\
"Š ᮦ «¥­¨î, ­¥ ­ ©¤¥­® ­¨ ®¤­®£®",\
"¢¥ªâ®à­®£® èà¨äâ  *.CHR. ‚®§¬®¦­®,",\
"¢ ¬ á«¥¤ã¥â ¨á¯à ¢¨âì ª®­áâ ­âã",\
"BGIFONT_PATH ¢ ­ ç «¥ ä ©«  BGITEST.ASM",\
"¨ ¯¥à¥ª®¬¯¨«¨à®¢ âì ¥£® :-("
else
_txt _X shl 16+60,40,0x434ba010, BGI_HACENTER,\
"HOT KEYS:",\
"Space - font list/this message/demo;",\
"<-> arrows - rotate text string;",\
"V - toggle vertical alignment;",\
"H - toggle horizontal alignment;",\
"[,] - scale on X axis;",\
"A,Z - scale on Y axis;",\
"B,I - toggle bold & italic mode;",\
"R - reset font options;",\
"F1..F12 - select font;",\
"Esc - close demo :-("
alpha:
db 'This is a Sample text!'
; db 'ABCDEFGHIGKLMNOPQRSTUVWXWZ'
lf_head:
_txt 10 shl 16+30,85 shl 16,0x6e00f7,0,"Font name","Status","ID",\
"Filename"
load_ok:
db "loaded"
load_fail:
db "not found"
font_msg:
_txt (_X+20) shl 16+180,25,0x10ff0000,0,\
"Sorry, no vector font *.CHR found.",\
"Maybe you should correct BGIFONT_PATH",\
"constant at the beginning of file",\
"BGITEST.ASM and recompile it :-("
end if
 
macro Deltas _key,_scale,_ofs
{
db _key
dd _scale
db _ofs
}
 
delt:
Deltas 91, -0.15,12
Deltas 93, 0.15,12
Deltas 97, 0.15,16
Deltas 122,-0.15,16
Fkeys db 48,49,68,255
 
macro Aligns _key,_mask,_add
{
db _key
dw _mask,_add
}
ali:
Aligns 118,BGI_VAMASK,BGI_VATOP
Aligns 104,BGI_HAMASK,BGI_HARIGHT
freeconst BGIfree 'FONT',_X shl 16+_Y,0, 1.0, 1.0, alpha,\
lf_head-alpha,0xb800e7,\
BGI_VACENTER or BGI_HACENTER
freetest BGIfree ?,?,?,?,?,?,?,?,?
help db ?
pinfo:
times 1024 db ?
rb 10000 ; reserve, unless process info will corrupt our fonts (why?)
I_END:
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/bgitest/trunk/build_en.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix en >lang.inc
@fasm bgitest.asm bgitest
@pause
/programs/demos/bgitest/trunk/build_ru.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm bgitest.asm bgitest
@pause
/programs/demos/bgitest/trunk/macros.inc
0,0 → 1,267
; 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,b { ; mike.dld
if (~a eq)&(~b eq)
mpack reg,a,b
else if (~a eq)&(b 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
}
 
 
 
 
 
 
 
; 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
/programs/demos/bgitest/trunk/read_eng.txt
0,0 → 1,140
BGIFONT.INC v1.0 beta
 
Written in pure assembler by Ivushkin Andrey aka Willow
 
At present Menuet operation system has poor means to draw charaters. Its
distro contains 2 raster fonts (CHAR.MT & CHAR2.MT files). The kernel supports
them internally. That is Jarek Pelczar who makes certain efforts to develop
scalable TTF-like fonts but huge Menuet C Library does not become widespread
inside our assembly-written OS. Bulgarian MenuetOS team also tries to include
third scalable font into the kernel, though, as far as I know, its characters
are still under design and are incomplete. Therefore Bulgarian developing is
not valuable for ordinary users. It is obvious that scalable fonts will help
to develop such products as browsers and word processors where character
formatting is of great importance.
Let me introduce for public domain an include file BGIFONT.INC to process
vector fonts (*.CHR) worked out by famous Borland Corporation to use in Turbo
Pascal, Turbo C and Borland C++ compilers under MS-DOS. Sorry, I still fail to
add BGI font support into kernel - deeper knowledge on memory allocation and
system calls needed. I hope that Menuet system programmers will be glad to help
me. Module compiling within kernel is supposed using constant BGI_LEVEL equ
KERNEL. By means of conditional compiling it will be possible to use the module
at both kernel and application levels. Following is concerned using the include
file while programming an application.
 
BGI fonts may reside in any folder on HD or RD. They are searched using value
of constant BGI_PATH. If constant BGI_WINDOW_CLIP is equal to 1, module routines
perform window bounds check to avoid artifacts while drawing. Use this if you
aren't sure that strings are fit in window. All BGIFONT.INC routines are
declared as macros, that is they are used without "call". To load 11 fonts into
application's memory a contiguous free space up to 120 kb is needed. When
loading, font data relocation is performed to save memory. Let us see a chart:
 
| Font | | BGIrec | | Font | | BGIrec | | Font | | BGIrec |
| counter | | structure| | data | | structure| | data | | structure| ...
| (1 byte)| | | | | |
| ------------->------ -------------->----- ----------
- referenced by [BGIfont_Ptr]
 
BGIrec structure fields have following meaning:
 
+00 dword .FontName font name (4 characters)
+04 byte .CharsCount amount of font characters
+05 byte .FirstChar code of the first character present
+06 byte .UpperMargin high bound of characters
+07 byte .LowerMargin low bound of characters
+08 dword .Widths offset to width array
+12 dword .FirstData offset to vector table
+16 dword .EOF pointer to the following BGIrec
+20 dword .font_data here font data begin
 
Font loading and verification are carried out by BGIfont_Prepare procedure.
 
BGIfont_Prepare
in: EDX - font name (4 characters) to be loaded. It must to be the same as
the font filename (without extension)
EDI - address to where font have to be loaded. Used only for the
first time. Then you may find this value in [BGIfont_Ptr]
out: EAX=0, if an error occured, otherwise EAX is identifier (ID) of the
loaded font. Later it is possible to get font ID with BGIfont_GetID
function.
 
For the simultaneous loading of few fonts you may use BGIfont_Init routine.
 
BGIfont_Init
in: ESI - pointer to array of font names (for example db 'TRIPSIMPEURO')
ECX is amount of fonts to load
EDI - see BGIfont_Prepare
out: nothing.
 
To load 10 standard fonts the module defines an array BGIfont_names (see in
BGITEST for usage demonstration).
 
For compatibility and subsequent kernel introduction, the module offers 2
routines for drawing vector characters. One of them uses registers (like sysfunc
4), another uses a structure.
 
BGIfont_Outtext
in: EAX - "pivot point" of a string [x] shl 16+[y]
ECX - text color and font size 0xXYRRGGBB,
where X - vector font ID(4..F),
Y - size of caracters divided by 4, e.g. 0x1 - 1/4 of
ordinary size, 0xC - triple size.
EDX - pointer to the string
ESI - string length + formatting flags (see below). BGI_ITALIC and
BGI_NODRAW flags are ignored.
out: EAX - coords at the end of the string drawn [x] shl 16+[y].
 
As you can see, BGIfont_Outtext is similar to the 4th system function,
but provides an extended management of drawing symbols.
 
The most complete use of vector fonts is provided by BGIfont_Freetext routine.
Parameters are passed in a BGIfree structure.
 
BGIfree structure fields have following meaning:
 
+00 dword font name (4 characters)
+04 dword "pivot point" of a string [x] shl 16+[y]
+08 dword turn angle (clockwise, 0 is horizontal)
+12 dword X scale (floating point value!)
+16 dword Y scale (floating point value!)
+20 dword pointer to the string
+24 dword string length WITHOUT formatting flags
+28 dword text color 0x00RRGGBB
+32 dword formatting flags
 
The module defines following formatting flags:
BGI_NODRAW - do not draw
BGI_ITALIC - italic
BGI_BOLD - bold
BGI_HALEFT - left alignment
BGI_HARIGHT - right alignment
BGI_HACENTER - center alignment
BGI_VABOTTOM - bottom alignment
BGI_VATOP - top alignment
BGI_VACENTER - middle vertical alignment
 
Combination of flags can be performed by addition or the OR operation.
 
BGIfont_Freetext
in: EBX - pointer to BGIfree structure
out: EAX coords at the end of the string drawn [x] shl 16+[y].
 
BGIfont_GetID routine returns font ID by its name.
 
BGIfont_GetID
in: EDX - font name (4 characters)
out: EAX - ID of the font
EDI - pointer on font's BGIrec structure.
 
Using functions of BGIFONT.INC module is demonstrated by BGITEST app.
 
Todo list:
1. An insidious bug sometimes shows up while loading multiple fonts (as in
BGITEST), that corrupts some characters. It disappears when font loading
order is changed... :-(
2. To correct a hardly reproduceable bug when moving along the font list.
3. To perfect drawing of bold fonts.
4. To add number drawing routines.
 
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/bgitest/trunk/read_rus.txt
0,0 → 1,149
BGIFONT.INC v1.0 beta for MenuetOS
Œ®¤ã«ì ¤«ï à ¡®âë á ¢¥ªâ®à­ë¬¨ èà¨äâ ¬¨ ä®à¬ â  BGI
 
 ¯¨á ­ ­  ç¨á⮬  áᥬ¡«¥à¥ ˆ¢ã誨­ë¬ €­¤à¥¥¬ aka Willow
 
‚ ­ áâ®ï饥 ¢à¥¬ï ®¯¥à æ¨®­­ ï á¨á⥬  Menuet ®¡« ¤ ¥â áªã¤­ë¬¨ á।á⢠¬¨
®â®¡à ¦¥­¨ï ᨬ¢®«®¢. ‚ ¤¨áâਡã⨢¥ ¨¬¥îâáï 2 à áâ஢ëå èà¨äâ  (ä ©«ë CHAR.MT ¨
CHAR2.MT).  ¡®â  á ­¨¬¨ ¦¥á⪮ § è¨â  ¢ ï¤à¥. Ž¯à¥¤¥«¥­­ë¥ ãᨫ¨ï ¯® ¢­¥¤à¥­¨î
¬ áèâ ¡¨à㥬ëå èà¨ä⮢ TTF-¯®¤®¡­®£® ä®à¬ â  ¯à¥¤¯à¨­¨¬ ¥â Jarek Pelczar, ®¤­ ª®
£à®¬®§¤ª ï MenuetOS C Library ­¥ ¯®«ã稫  ¤® á¨å ¯®à ¡®«ì让 ¯®¯ã«ïà­®á⨠¢
 áᥬ¡«¥à­®© Ž‘. ®«£ à᪮© ª®¬ ­¤®© Menuet ¤¥« «¨áì ¯®¯ë⪨ ¢áâநâì ¢ ï¤à®
âà¥â¨© ¬ áèâ ¡¨àã¥¬ë© èà¨äâ, ­®, ­ áª®«ìª® ¬­¥ ¨§¢¥áâ­®, ¥£® ᨬ¢®«ë ­ å®¤ïâáï ¢
áâ ¤¨¨ ¤¨§ ©­ . ’ ª¨¬ ®¡à §®¬, ࠧࠡ®âª  ¡®«£ à ¯®ª  ­¥ ¯à¥¤áâ ¢«ï¥â 業­®áâ¨
¤«ï à冷¢ëå ¯®«ì§®¢ â¥«¥©. Žç¥¢¨¤­®, çâ® ¬ áèâ ¡¨àã¥¬ë¥ èà¨äâë ¯®¬®£ãâ
ࠧࠡ®âª¥ â ª¨å ¢ ¦­ëå ª â¥£®à¨© ¯à®£à ¬¬­ëå ¯à®¤ãªâ®¢, ª ª ¡à ã§¥àë ¨
⥪áâ®¢ë¥ ¯à®æ¥áá®àë, £¤¥ ¡®«ìèãî à®«ì ¨£à ¥â ä®à¬ â¨à®¢ ­¨¥ ᨬ¢®«®¢.
à¥¤áâ ¢«ïî ¢ ®¡é¥á⢥­­®¥ ¯®«ì§®¢ ­¨¥ ¢ª«îç ¥¬ë© ä ©« BGIFONT.INC ¤«ï à ¡®âë á
¢¥ªâ®à­ë¬¨ èà¨äâ ¬¨ *.CHR, ࠧࠡ®â ­­ë¥ §­ ¬¥­¨â®© ä¨à¬®© Borland ¤«ï
¨á¯®«ì§®¢ ­¨ï ¢ ª®¬¯¨«ïâ®à å Turbo Pascal, Turbo C ¨ Borland C++ ¥é¥ ¢ á।¥ MS-
DOS. Š ᮦ «¥­¨î, ¯®ª  çâ® ¬­¥ ­¥ 㤠¥âáï ®¡¥á¯¥ç¨âì ¯®¤¤¥à¦ªã BGI-èà¨ä⮢ ­ 
ã஢­¥ ï¤à  - ­ã¦­® £«ã¡¦¥ ¨§ãç âì ­î ­áë à á¯à¥¤¥«¥­¨ï ¯ ¬ï⨠¨ ¢ë§®¢ 
á¨á⥬­ëå ä㭪権. Ÿ ­ ¤¥îáì, çâ® á¨á⥬騪¨ Menuet á £®â®¢­®áâìî ¬­¥ ¯®¬®£ãâ.
Š®¬¯¨«ïæ¨ï ¬®¤ã«ï ¢ á®áâ ¢¥ ï¤à  ¯à¥¤¯®« £ ¥âáï á ¨á¯®«ì§®¢ ­¨¥¬ ª®­áâ ­âë
BGI_LEVEL equ KERNEL. « £®¤ àï ãá«®¢­®© ª®¬¯¨«ï樨 ¬®¤ã«ì ¬®¦­® ¡ã¤¥â
¨á¯®«ì§®¢ âì á ­¥§­ ç¨â¥«ì­ë¬¨ ¨§¬¥­¥­¨ï¬¨ ­  ã஢­¥ ª ª ï¤à , â ª ¨ ¯à¨«®¦¥­¨ï.
¨¦¥¨§«®¦¥­­®¥ ª á ¥âáï à ¡®âë ¬®¤ã«ï ­  ã஢­¥ ¯à¨«®¦¥­¨ï.
 
BGI-èà¨äâë ¬®£ãâ à á¯®« £ âìáï ¢ «î¡®¬ ª â «®£¥ HD ¨«¨ RD. ˆå ¯®¨áª
®áãé¥á⢫ï¥âáï ¯® §­ ç¥­¨î ª®­áâ ­âë BGI_PATH. …᫨ ª®­áâ ­â  BGI_WINDOW_CLIP
ãáâ ­®¢«¥­  ¢ 1, ¯à®æ¥¤ãà ¬¨ ¬®¤ã«ï ¢ ¯à®æ¥áᥠ¢ë¢®¤  ¢¥ªâ®à®¢ èà¨äâ 
®áãé¥á⢫ï¥âáï ¯à®¢¥àª  ¢ë室  §  £à ­¨æë ®ª­ , çâ®¡ë ¨§¡¥¦ âì  àâ¥ä ªâ®¢.
ˆá¯®«ì§ã©â¥ íâ®, ¥á«¨ ¢ë ­¥ 㢥७ë, çâ® ­ ¤¯¨á¨ ¡ã¤ãâ ¯®¬¥é âìáï ¢ ®ª­¥. ‚
í⮬ á«ãç ¥ ­¥®¡å®¤¨¬® ¤®¯®«­¨â¥«ì­® ®¯à¥¤¥«¨âì ª®­áâ ­âã BGI_PRC_INFO -  ¤à¥á
¢ ¯ ¬ï⨠(1024 ¡ ©â ), ªã¤  ¯à¨«®¦¥­¨¥ ¬®¦¥â ¯®«ãç âì ¨­ä®à¬ æ¨î ® ᢮¥¬ ®ª­¥
ç¥à¥§ 9-î á¨á⥬­ãî äã­ªæ¨î. ‚ᥠ¯à®æ¥¤ãàë ¬®¤ã«ï BGIFONT.INC ®¡ê¥­ë ª ª
¬ ªà®áë, â.¥. ¢ë§ë¢ îâáï ¡¥§ call. „«ï § £à㧪¨ 11 èà¨ä⮢ ¢  ¤à¥á­®¥
¯à®áâà ­á⢮ ¯à¨«®¦¥­¨ï ­¥®¡å®¤¨¬ ­¥¯à¥àë¢­ë© ãç á⮪ à §¬¥à®¬ ®ª®«® 120 ª¡.
à¨ § £à㧪¥ ®áãé¥á⢫ï¥âáï ¯¥à¥¬¥é¥­¨¥ ¤ ­­ëå á 楫ìî íª®­®¬¨¨ ¯ ¬ïâ¨. ‘奬 
à §¬¥é¥­¨ï èà¨ä⮢:
 
| ‘ç¥â稪 | | ‘âàãªâãà | |„ ­­ë¥| |‘âàãªâãà | | „ ­­ë¥| |‘âàãªâãà |
| èà¨ä⮢ | | BGIrec | |èà¨äâ | | BGIrec | | èà¨äâ | | BGIrec | ...
| (1 ¡ ©â)| | | | | |
| ------------->------ -------------->----- ----------
- á ááë« ¥âáï [BGIfont_Ptr]
 
®«ï áâàãªâãàë BGIrec ¨¬¥îâ á«¥¤ãî饥 ­ §­ ç¥­¨¥:
 
+00 dword .FontName ç¥âëà¥å¡ãª¢¥­­®¥ ¨¬ï èà¨äâ 
+04 byte .CharsCount ª®«¨ç¥á⢮ ᨬ¢®«®¢ ¢ èà¨äâ¥
+05 byte .FirstChar ª®¤ ¯¥à¢®£® ॠ«¨§®¢ ­­®£® ᨬ¢®« 
+06 byte .UpperMargin ¢¥àå­ïï £à ­¨æ  ᨬ¢®« 
+07 byte .LowerMargin ­¨¦­ïï £à ­¨æ  ᨬ¢®« 
+08 dword .Widths ᬥ饭¨¥ ¬ áᨢ  è¨à¨­ ᨬ¢®«®¢
+12 dword .FirstData ᬥ饭¨¥ â ¡«¨æë ¢¥ªâ®à®¢
+16 dword .EOF 㪠§ â¥«ì ­  á«¥¤ãî騩 BGIrec
+20 dword .font_data §¤¥áì ­ ç¨­ îâáï ¤ ­­ë¥ èà¨äâ 
 
‘®¡á⢥­­® § £à㧪㠨 ¢¥à¨ä¨ª æ¨î èà¨äâ  ®áãé¥á⢫ï¥â ¯à®æ¥¤ãà 
BGIfont_Prepare.
 
BGIfont_Prepare
¢å®¤: EDX - ç¥âëà¥å¡ãª¢¥­­®¥ ¨¬ï èà¨äâ , ¯®¤«¥¦ é¥£® § £à㧪¥. „®«¦­®
ᮢ¯ ¤ âì á ¨¬¥­¥¬ ä ©«  èà¨äâ  (¡¥§ à áè¨à¥­¨ï)
EDI -  ¤à¥á ãç á⪠ ¯ ¬ïâ¨, ªã¤  á«¥¤ã¥â ¯®¬¥áâ¨âì ¤ ­­ë¥ èà¨äâ .
ˆá¯®«ì§ã¥âáï ⮫쪮 ¯à¨ § £à㧪¥ ¯¥à¢®£® èà¨äâ . â® §­ ç¥­¨¥
§ ­®á¨âáï ¢ [BGIfont_Ptr]
¢ë室: EAX=0, ¥á«¨ ¯à®¨§®è«  ®è¨¡ª , ¨­ ç¥ ¢ EAX - ¨¤¥­â¨ä¨ª â®à (ID)
§ £à㦥­­®£® èà¨äâ . ‚¯®á«¥¤á⢨¨ ID ¬®¦­® ¯®«ãç¨âì äã­ªæ¨ï¬¨
BGIfont_GetID ¨ BGIfont_GetName.
 
„«ï ¥¤¨­®¢à¥¬¥­­®© § £à㧪¨ ­¥áª®«ìª¨å èà¨ä⮢ ¬®¦­® ¨á¯®«ì§®¢ âì ¯à®æ¥¤ãàã
BGIfont_Init.
 
BGIfont_Init
¢å®¤: ESI - 㪠§ â¥«ì ­  ᯨ᮪ ¨¬¥­ èà¨ä⮢ (­ ¯à¨¬¥à db 'TRIPSIMPEURO')
ECX - ª®«¨ç¥á⢮ èà¨ä⮢ ¤«ï § £à㧪¨
EDI - á¬. BGIfont_Prepare
¢ë室: ­¨ç¥£®.
 
„«ï § £à㧪¨ 10 áâ ­¤ àâ­ëå èà¨ä⮢ ¢ ¬®¤ã«¥ ®¯à¥¤¥«¥­ ¬ áᨢ BGIfont_names
(¨á¯®«ì§®¢ ­¨¥ á¬. ¢ BGITEST).
 
‚ 楫ïå ᮢ¬¥á⨬®á⨠¨ ¯®á«¥¤ãî饣® ¢­¥¤à¥­¨ï ¢ ï¤à® ¬®¤ã«ì ¯à¥¤« £ ¥â 2
¯à®æ¥¤ãàë ¤«ï ¢ë¢®¤  ᨬ¢®«®¢ ¢¥ªâ®à­ë¬¨ èà¨äâ ¬¨. Ž¤­  ¨§ ­¨å ¨á¯®«ì§ã¥â
ॣ¨áâàë (¯®¤®¡­® 4-© á¨á⥬­®© ä㭪樨), ¤à㣠ï - áâàãªâãàã.
 
BGIfont_Outtext
¢å®¤: EAX - "â®çª  ®âáç¥â " ¯à¨ ¢ë¢®¤¥ áâப¨ [x] shl 16+[y]
ECX - 梥â ⥪áâ  ¨ à §¬¥à èà¨äâ  0xXYRRGGBB,
£¤¥ X - ID ¢¥ªâ®à­®£® èà¨äâ  (4..F),
Y - ¢¥«¨ç¨­  ᨬ¢®«®¢/4, ­ ¯à¨¬¥à 0x1 - 1/4 ®¡ëç­®£® à §¬¥à ,
0xC - âன­®© à §¬¥à.
EDX - 㪠§ â¥«ì ­  áâபã
ESI - ¤«¨­  áâப¨ + ä« £¨ ä®à¬ â¨à®¢ ­¨ï (á¬. ­¨¦¥). ”« £¨
BGI_ITALIC ¨ BGI_NODRAW ¨£­®à¨àãîâáï.
¢ë室: EAX - ª®®à¤¨­ âë ª®­æ  ­ ¤¯¨á¨ [x] shl 16+[y].
 
Š ª ¢¨¤¨¬, BGIfont_Outtext ¯® ᢮¨¬ ¯ à ¬¥âà ¬ á宦  á 4-© á¨á⥬­®© ä㭪樥©,
­® ¤®¯ã᪠¥â à áè¨à¥­­®¥ ã¯à ¢«¥­¨¥ ¢ë¢®¤®¬ ᨬ¢®«®¢.
 
 ¨¡®«¥¥ ¯®«­®¥ ¨á¯®«ì§®¢ ­¨¥ ¢¥ªâ®à­ëå èà¨ä⮢ ®¡¥á¯¥ç¨¢ ¥â äã­ªæ¨ï
BGIfont_Freetext.  à ¬¥âàë ¢ë¢®¤  áâப¨ ¯¥à¥¤ îâáï ¢ áâàãªâãॠBGIfree.
 
®«ï áâàãªâãàë BGIfree ¨¬¥îâ á«¥¤ãî饥 ­ §­ ç¥­¨¥:
 
+00 dword ç¥âëà¥å¡ãª¢¥­­®¥ ¨¬ï èà¨äâ 
+04 dword "â®çª  ®âáç¥â " ¯à¨ ¢ë¢®¤¥ áâப¨ [x] shl 16+[y]
+08 dword 㣮« ¯®¢®à®â  (0 - £®à¨§®­â «ì, ®âáç¥â ¯® ç á®¢®© áâ५ª¥)
+12 dword ¬ áèâ ¡ ¯® ®á¨ X (§­ ç¥­¨¥ á ¯« ¢ î饩 â®çª®©!)
+16 dword ¬ áèâ ¡ ¯® ®á¨ Y (§­ ç¥­¨¥ á ¯« ¢ î饩 â®çª®©!)
+20 dword 㪠§ â¥«ì ­  áâபã
+24 dword ¤«¨­  áâப¨ …‡ ä« £®¢ ä®à¬ â¨à®¢ ­¨ï
+28 dword 梥â ⥪áâ  0x00RRGGBB
+32 dword ä« £¨ ä®à¬ â¨à®¢ ­¨ï
 
Œ®¤ã«ì ®¯à¥¤¥«ï¥â á«¥¤ãî騥 ä« £¨ ä®à¬ â¨à®¢ ­¨ï:
BGI_NODRAW - ­¥ à¨á®¢ âì ᨬ¢®«ë
BGI_ITALIC - ªãàᨢ
BGI_BOLD - ¯®«ã¦¨à­ë© èà¨äâ
BGI_HALEFT - ¢ë஢­ïâì ¯® «¥¢®¬ã ªà î
BGI_HARIGHT - ¢ë஢­ïâì ¯® ¯à ¢®¬ã ªà î
BGI_HACENTER - ¢ë஢­ïâì ¯® 業âàã
BGI_VABOTTOM - ¢ë஢­ïâì ¯® ­¨¦­¥¬ã ªà î
BGI_VATOP - ¢ë஢­ïâì ¯® ¢¥àå­¥¬ã ªà î
BGI_VACENTER - ¢ë஢­ïâì ¯® á¥à¥¤¨­¥
 
Š®¬¡¨­ æ¨ï ä« £®¢ ®¡à §ã¥âáï ¨å á«®¦¥­¨¥¬ ¨«¨ ®¯¥à æ¨¥© OR.
 
BGIfont_Freetext
¢å®¤: EBX - 㪠§ â¥«ì ­  áâàãªâãàã BGIfree
¢ë室: EAX - ª®®à¤¨­ âë ª®­æ  ­ ¤¯¨á¨ [x] shl 16+[y].
 
”ã­ªæ¨ï BGIfont_GetID ¢®§¢à é ¥â ID èà¨äâ  ¯® § ¤ ­­®¬ã ¨¬¥­¨.
 
BGIfont_GetID
¢å®¤: EDX - ç¥âëà¥å¡ãª¢¥­­®¥ ¨¬ï èà¨äâ 
¢ë室: EAX - ID èà¨äâ 
EDI - 㪠§ â¥«ì ­  BGIrec èà¨äâ .
 
ˆá¯®«ì§®¢ ­¨¥ ä㭪権 ¬®¤ã«ï BGIFONT.INC ¤¥¬®­áâà¨àã¥â ¯à®£à ¬¬  BGITEST.
 
—â® ¥é¥ ­ã¦­® ᤥ« âì:
1. à¨ ¬­®¦¥á⢥­­®© § £à㧪¥ èà¨ä⮢ (ª ª ¢ BGITEST) ¨­®£¤  ¯à®ï¢«ï¥âáï
ª®¢ à­ë© ¡ £, ¯®àâï騩 ­¥áª®«ìª® ᨬ¢®«®¢. à¨ ¨§¬¥­¥­¨¨ ¯®à浪  § £à㧪¨
èà¨ä⮢ ®­ ¨á祧 ¥â... :-(
2. ˆá¯à ¢¨âì âà㤮¢®á¯à®¨§¢®¤¨¬ë© ¡ £ ¯à¨ ¤¢¨¦¥­¨¨ ¯® ᯨáªã èà¨ä⮢.
3. “ᮢ¥à襭á⢮¢ âì ¯à®à¨á®¢ªã ¯®«ã¦¨à­ëå èà¨ä⮢.
4. „®¡ ¢¨âì ä㭪樨 ¢ë¢®¤  ç¨á¥«.
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/colorref/trunk/colorref.asm
0,0 → 1,503
; COLORREF.ASM - COLOR REFERENCE
;
; Compile with FASM for Menuet
;
 
use32
org 0x0
 
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd start ; start of code
dd finis ; size of image
dd 0x1000 ; memory for app
dd 0x1000 ; esp
dd 0x0,0x0 ; I_Param , I_Icon
 
include 'lang.inc'
wide: dd 0 ; screen pixels width
mouse: dd 0 ; 1=right,2=left [mouse click]
 
 
start:
 
mov eax,14 ; get screen size
int 0x40
shr eax,16 ; get width into AX
inc eax ; not 0 based
mov [wide],eax
 
call draw_window
 
still:
mov eax,23 ; wait for event w/timeout
mov ebx,5 ; delay in hundredths
int 0x40
 
cmp eax,1 ; redraw request ?
jne s1
jmp red
s1: cmp eax,2 ; key in buffer ?
jne s2
jmp key
s2: cmp eax,3 ; button in buffer ?
jne s3
jmp button
s3: mov eax,9 ; process info function
mov ebx,stat_table ; return data table
mov ecx,-1 ; who am i
int 0x40
cmp ax,[stat_table+4] ; are we active?
je active ; yep
jmp still
 
active:
mov eax,37 ; mouse info function
mov ebx,2 ; get buttons
int 0x40
cmp eax,0 ; mouse click?
jne click
jmp still
click:
mov [mouse],eax ; save mouse click
mov eax,37 ; mouse info
xor ebx,ebx ; get screen pos for mouse
int 0x40 ; into EAX
xor ebx,ebx
mov bx,ax ; BX=y screen position
shr eax,16 ; AX=x screen position
xchg eax,ebx ; EAX=y, EBX=x
dec eax ; don't calc mouse scanline
mov ecx,[wide] ; get pixels wide
mul ecx
add ebx,eax ; add x
mov eax,35 ; get mouse pos pixel
int 0x40 ; EAX=mouse pixel color
mov ebx,eax ; EBX has color
mov esi,colors ; color table
mov ecx,72 ; total colors
xor edx,edx ; init a counter
check:
lodsd
inc edx ; update counter
cmp ebx,eax ; color match?
je _match ; yep
loop check ; check all colors
jmp still ; no match
_match:
cmp [mouse],dword 1 ; right click?
je right ; yep
left:
cmp [picks],edx ; changed left color yet?
jne l1 ; no, do it
jmp still
l1: mov [picks],edx ; update left pick color
call clear ; erase old text
call draw_picks ; redraw colors and text
jmp still
right:
cmp [picks+4],edx ; changed right color yet?
jne r1 ; no, do it
jmp still
r1: mov [picks+4],edx ; update right pick color
call clear ; erase old text
call draw_picks ; redraw colors and text
jmp still
 
red: ; redraw
call draw_window
jmp still
 
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
cmp al,0 ; key in buffer?
je k1 ; yep
jmp still
k1: cmp ah,'H' ; cap H ?
je k2 ; yep
cmp ah,'h' ; locase h ?
je k2 ; yep
jmp still
k2: call help ; show help screen
jmp still
 
button: ; button
mov eax,17 ; get id
int 0x40
cmp ah,1 ; button id=1 ?
je close
jmp still
 
close:
mov eax,-1 ; close this program
int 0x40
 
 
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
 
 
draw_window:
 
mov eax,12 ; tell os about windowdraw
mov ebx,1 ; 1, start of draw
int 0x40
 
mov eax,0 ; DRAW WINDOW
mov ebx,1*65536+200 ; [x start] *65536 + [x size]
mov ecx,200*65536+240 ; [y start] *65536 + [y size]
mov edx,0x03000000 ; work area color (type II)
mov esi,0x82a0a0a0 ; grab bar color (w/glide)
mov edi,0x82bbbbbb ; frame color
int 0x40
mov eax,4 ; WINDOW LABEL
mov ebx,8*65536+8 ; [x start] *65536 + [y start]
mov ecx,0xeeeeee ; color of text (white)
mov edx,prog_name ; pointer to header
mov esi,namelen-prog_name ; text length
int 0x40
call palette ; display color palette
 
mov eax,12 ; tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
 
ret
 
 
; *********************************************
; ******* COLOR PALETTE LAYOUT ROUTINES ******
; *********************************************
 
 
palette:
mov ebx,15*65536+18 ; LAYOUT: start x and width
mov edx,32*65536+18 ; LAYOUT: start y and depth
mov ecx,8 ; 8 rows
mov ebp,colors ; color table
p1: push ecx
mov ecx,9 ; 9 columns
p2: push ecx
push edx
mov ecx,edx ; y coord
mov edx,[ebp] ; color
mov eax,13 ; draw bar function
int 0x40
pop edx
pop ecx
add ebx,19*65536 ; next column
add ebp,4 ; next color
p3: loop p2
pop ecx
mov ebx,15*65536+18 ; restart x
add edx,19*65536 ; next row
loop p1
call draw_picks
 
ret
 
draw_picks:
mov ebx,64*65536+24 ; draw x and width
mov ecx,188*65536+42 ; draw y and depth
mov edx,0xc0c0c0 ; color grey
mov eax,13 ; draw bar function
int 0x40
mov eax,[picks] ; first picked color
mov esi,22*65536+196 ; print at x and y
call do_hex ; print color number
mov eax,[picks+4] ; second picked color
mov esi,22*65536+215 ; print at x and y
call do_hex ; print color number
mov eax,[picks] ; first picked color
mov ebx,67*65536+18 ; x and width
mov esi,191*65536+18 ; y and depth
call do_color ; paint color 1 square
mov eax,[picks+4] ; second picked color
mov ebx,67*65536+18 ; x and width
mov esi,209*65536+18 ; y and depth
call do_color ; paint color 2 square
mov eax,[picks] ; first picked color
mov ebx,96*65536+196 ; x and y
call do_name ; print color's name
mov eax,[picks+4] ; second picked color
mov ebx,96*65536+215 ; x and y
call do_name ; print color's name
 
ret
 
do_hex:
dec eax ; use 0 base
mov ecx,4 ; dword length
mul ecx ; calc pointer
mov edi,colors ; color table
add edi,eax ; add offset
mov ecx,[edi] ; save color 1
mov ebx,0x60100 ; print 6 hex digits
mov edx,esi ; copy color
mov esi,0xe1e1e1 ; use white
mov eax,47 ; print number function
int 0x40
 
ret
 
do_color:
dec eax ; use 0 base
mov ecx,4 ; dword length
mul ecx ; calc pointer
mov edi,colors ; color table
add edi,eax ; add offset
mov edx,[edi] ; color
mov ecx,esi ; recover y an depth
mov eax,13 ; draw bar function
int 0x40
 
ret
 
do_name:
dec eax ; use 0 base
mov ecx,15 ; string length
mul ecx ; calc pointer
mov edx,names ; color table
add edx,eax ; add offset
mov ecx,0xe1e1e1 ; color
mov esi,15
mov eax,4 ; print text function
int 0x40
 
ret
 
clear:
mov ebx,22*65536+36 ; x and width
mov ecx,196*65536+26 ; y and depth
mov edx,0x000000 ; color
mov eax,13 ; draw bar funx
int 0x40
mov ebx,96*65536+90 ; x and width
mov ecx,196*65536+26 ; y and depth
mov edx,0x000000 ; color
mov eax,13 ; draw bar funx
int 0x40
 
ret
 
help:
mov ebx,4*65536+192 ; x and width
mov ecx,20*65536+216 ; y and depth
mov edx,0x465e8f ; dark denim color
mov eax,13 ; write text funx
int 0x40
mov ebx,20*65536+40 ; starting x and y
mov edx,text ; start of text
mov esi,27 ; width of text
mov ecx,14 ; 14 text lines to do
mov eax,4 ; write text funx
h1: push ecx
sub ebx,65537 ; drop shadow x and y
mov ecx,0x000000 ; black shadow
int 0x40
add ebx,65537 ; original x and y
mov ecx,0xefefef ; white text
int 0x40
add edx,27 ; next line of text
add bx,12 ; next row
pop ecx
loop h1
mov eax,10 ; wait on event
int 0x40
cmp eax,2 ; got a key?
jne h2 ; nope
mov eax,2 ; yep, burn it
int 0x40
h2: mov ebx,4*65536+192 ; y and width
mov ecx,20*65536+216 ; x and depth
mov edx,0x00000 ; restore black bkg
mov eax,13 ; draw bar funx
int 0x40
call palette ; redraw color palette
 
ret
 
 
; *********************************************
; ********** DATA DEFINITIONS AREA ***********
; *********************************************
 
prog_name:
db 'COLOR REFERENCE H>HELP'
namelen:
 
picks:
dd 31,2 ; selected top/bot colors
 
colors:
dd 0xe0e0e0 ; white
dd 0xe7e6a0 ; pale yellow
dd 0xe7e05a ; lemon yellow
dd 0xe7c750 ; mustard
dd 0xe7b850 ; cadium yellow
dd 0xbfa461 ; yellow ocre
dd 0xe0c090 ; cream
dd 0xe0b27b ; peach
dd 0xe2986d ; dark peach
dd 0xebb2c0 ; pink
dd 0xe0b0a0 ; flesh
dd 0xc79790 ; artificial arm
dd 0xb88688 ; deep blush
dd 0xc4a077 ; washed khaki
dd 0xb69269 ; khaki
dd 0xa8845b ; dark khaki
dd 0xab937a ; beige
dd 0xa39370 ; poupon
dd 0x988c00 ; camouflage
dd 0x98a024 ; pale olive
dd 0x838b00 ; olive
dd 0x6d7600 ; dark olive
dd 0x5b6200 ; black olive
dd 0x94946a ; washed army
dd 0x74744a ; army
dd 0x66a696 ; pale teal
dd 0x409b90 ; faded teal
dd 0x008d8d ; pastel teal
dd 0x007c7c ; teal
dd 0x006464 ; dark teal
dd 0x00b8ca ; light turquoise
dd 0x00a0b2 ; turquoise
dd 0x00889a ; dark turquoise
dd 0x575f8c ; medium cobalt
dd 0x4e4e7c ; cobalt
dd 0x00459a ; ultramarine
dd 0x400088 ; navy blue
dd 0x4e00e7 ; true blue
dd 0x508cec ; sky blue
dd 0x6a73d0 ; mountain blue
dd 0x677ab0 ; faded jeans
dd 0x576fa0 ; denim
dd 0xd048c8 ; fuschia
dd 0xb800e7 ; lavendar
dd 0xa800a8 ; light violet
dd 0x780078 ; violet
dd 0x520064 ; purple
dd 0xb800b8 ; magenta
dd 0xa4307a ; rose
dd 0x90207f ; mauve
dd 0xe76e83 ; salmon
dd 0xea7a7d ; pastel orange
dd 0xe26830 ; orange
dd 0xac5800 ; burnt sienna
dd 0xcc0000 ; red orange
dd 0xac0000 ; cadium red
dd 0x880040 ; brick red
dd 0x780000 ; rust
dd 0x683020 ; terra cotta
dd 0x7f4658 ; light maroon
dd 0x702050 ; maroon
dd 0x7a5b5f ; umber blush
dd 0x584838 ; burnt umber
dd 0x8a5d1a ; cigar brown
dd 0x64504a ; ice brown
dd 0x564242 ; dark chocolate
dd 0x00aa66 ; celery stalk
dd 0x107a30 ; forest green
dd 0x365800 ; hooker's green
dd 0x8beb88 ; pastel lime
dd 0x7bbb64 ; lime
dd 0x4ba010 ; dark lime
 
names:
db 'WHITE '
db 'PALE YELLOW '
db 'LEMON YELLOW '
db 'MUSTARD '
db 'CADIUM YELLOW '
db 'YELLOW OCRE '
db 'CREAM '
db 'PEACH '
db 'DARK PEACH '
db 'PINK '
db 'FLESH '
db 'ARTIFICIAL ARM '
db 'DEEP BLUSH '
db 'WASHED KHAKI '
db 'KHAKI '
db 'DARK KHAKI '
db 'BEIGE '
db 'POUPON '
db 'CAMOUFLAGE '
db 'PALE OLIVE '
db 'OLIVE '
db 'DARK OLIVE '
db 'BLACK OLIVE '
db 'WASHED ARMY '
db 'ARMY '
db 'PALE TEAL '
db 'FADED TEAL '
db 'PASTEL TEAL '
db 'TEAL '
db 'DARK TEAL '
db 'LIGHT TURQUOISE'
db 'TURQUOISE '
db 'DARK TURQUOISE '
db 'MEDIUM COBALT '
db 'COBALT '
db 'ULTRAMARINE '
db 'NAVY BLUE '
db 'TRUE BLUE '
db 'SKY BLUE '
db 'MOUNTAIN BLUE '
db 'FADED JEANS '
db 'DENIM '
db 'FUSHIA '
db 'LAVENDAR '
db 'LIGHT VIOLET '
db 'VIOLET '
db 'PURPLE '
db 'MAGENTA '
db 'ROSE '
db 'MAUVE '
db 'SALMON '
db 'PASTEL ORANGE '
db 'ORANGE '
db 'BURNT SIENNA '
db 'RED ORANGE '
db 'CADIUM RED '
db 'BRICK RED '
db 'RUST '
db 'TERRA COTTA '
db 'LIGHT MAROON '
db 'MAROON '
db 'UMBER BLUSH '
db 'BURNT UMBER '
db 'CIGAR BROWN '
db 'ICE BROWN '
db 'DARK CHOCOLATE '
db 'CELERY STALK '
db 'FOREST GREEN '
db "HOOKER'S GREEN "
db 'PASTEL LIME '
db 'LIME '
db 'DARK LIME '
 
 
text:
db 'TO SEE HOW COLORS COMPARE '
db 'TO ONE ANOTHER, LEFT CLICK '
db 'THE FIRST COLOR AND RIGHT '
db 'CLICK THE SECOND. TO GET '
db "A SENSE OF A COLOR'S TRUE "
db 'HUE, RIGHT AND LEFT CLICK '
db 'THE SAME COLOR TO SEE IT '
db 'ON THE NEUTRAL BACKGROUND. '
db 'TO USE A LIGHTER OR DARKER '
db 'VALUE OF A COLOR, ADD OR '
db 'SUBTRACT 0x10 OR 0x20 FROM '
db 'EACH BYTE OF ITS HEX VALUE.'
db ' '
db ' ANY KEY ... '
 
stat_table:
 
 
finis:
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/colorref/trunk/build_en.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix en >lang.inc
@fasm colorref.asm colorref
@pause
/programs/demos/colorref/trunk/build_ru.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm colorref.asm colorref
@pause
/programs/demos/colors/trunk/build_en.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix en >lang.inc
@fasm colors.asm colors
@pause
/programs/demos/colors/trunk/build_ru.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm colors.asm colors
@pause
/programs/demos/colors/trunk/colors.asm
0,0 → 1,206
;
; COLOR TABLE
;
; Compile with FASM for Menuet
;
 
use32
 
org 0x0
 
db 'MENUET00' ; 8 byte id
dd 38 ; required os
dd START ; program start
dd I_END ; program image size
dd 0x1000 ; required amount of memory
dd 0x1000 ; esp = 0x7FFF0
dd 0x00000000 ; reserved=no extended header
 
include 'lang.inc'
include 'macros.inc'
 
 
START: ; start of execution
 
call shape_window
 
call draw_window ; at first, draw the window
 
still:
 
mov eax,10 ; wait here for event
int 0x40
 
cmp eax,1 ; redraw request ?
jz red
cmp eax,2 ; key in buffer ?
jz key
cmp eax,3 ; button in buffer ?
jz button
 
jmp still
 
red: ; redraw
call draw_window
jmp still
 
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
jmp still
 
button: ; button
mov eax,17 ; get id
int 0x40
 
cmp ah,1 ; button id=1 ?
jnz noclose
mov eax,0xffffffff ; close this program
int 0x40
noclose:
 
jmp still
 
 
shape_window:
 
pusha
 
mov eax,50 ; give the address of reference area
mov ebx,0
mov ecx,shape_reference
int 0x40
 
mov eax,50 ; give the scaling ( 5 -> 2^5 )
mov ebx,1
mov ecx,5
int 0x40
 
popa
 
ret
 
 
shape_reference:
 
db 1,0,1,0,1,0,1,0
db 0,1,0,1,0,1,0,1
db 1,0,1,0,1,0,1,0
db 0,1,0,1,0,1,0,1
db 1,0,1,0,1,0,1,0
db 0,1,0,1,0,1,0,1
db 1,0,1,0,1,0,1,0
db 0,1,0,1,0,1,0,1
 
 
 
; *********************************************
; ******* 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,100*65536+255 ; [x start] *65536 + [x size]
mov ecx,100*65536+255 ; [y start] *65536 + [y size]
mov edx,0x00000000
mov esi,0x8099bbff ; color of grab bar RRGGBB,8->color glide
mov edi,0x0099bbee ; color of frames RRGGBB
int 0x40
 
call draw_colors
 
; CLOSE BUTTON
mov eax,8 ; function 8 : define and draw button
mov ebx,5*65536+12 ; [x start] *65536 + [x size]
mov ecx,5*65536+12 ; [y start] *65536 + [y size]
mov edx,1 ; button id
mov esi,0xccaa22 ; button color RRGGBB
int 0x40
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
 
ret
 
 
draw_colors:
 
pusha
 
mov [bar],dword 0
 
mov eax,-1
mov ebx,0
mov ecx,0
mov edx,0
 
mov edi,0
 
dc1:
 
add eax,1
cmp eax,256
jb na1
mov eax,0
add ebx,1
cmp ebx,256
jb na1
mov ebx,0
add ecx,5
na1:
 
mov dl,al
shl edx,8
mov dl,bl
shl edx,8
mov dl,cl
 
na2:
 
pusha
push edx
 
xor edx,edx
mov eax,edi
mov ebx,256
div ebx
mov ebx,edx
mov ecx,eax
 
add ebx,[addx]
add ecx,[addy]
 
pop edx
mov eax,1
int 0x40
popa
 
add edi,1
 
cmp edi,256*256
jb dc1
 
popa
ret
 
 
 
; DATA AREA
 
I_END:
 
bar dd ?
 
add1 dd ?
add2 dd ?
 
addx dd ?
addy dd ?
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/colors/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,b { ; mike.dld
if (~a eq)&(~b eq)
mpack reg,a,b
else if (~a eq)&(b 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
}
 
 
 
 
 
 
; 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
/programs/demos/crownscr/trunk/build_en.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix en >lang.inc
@fasm crownscr.asm crownscr
@pause
/programs/demos/crownscr/trunk/build_ru.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm crownscr.asm crownscr
@pause
/programs/demos/crownscr/trunk/crownscr.asm
0,0 → 1,404
;
; Crown_s Soft Screensaver v1.13m
; WWW: http://www.crown-s-soft.com
;
; You may add you own figures. See file FIGURES.INC
;
; Compile with FASM v1.48 for Menuet or hier (FASM v1.40 contains bug)
;
; Copyright(c) 2002-2004 Crown_s Soft. All rights reserved.
;
 
fullscreen = 1
n_points = 0x1800
delay = 2
speed equ 0.004
 
 
macro align value { rb (value-1) - ($ + value-1) mod value }
 
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd start ; start of code
dd i_end ; size of image
dd i_end+0x1000 ; memory for app
dd i_end+0x1000 ; esp
dd 0x0 ; I_Param
dd 0x0 ; I_Icon
 
copyright db 'Crown_s Soft(c) Screensaver v1.13m www.crown-s-soft.com',0
copyrightlen:
 
include "lang.inc"
include "figuresi.inc"
include "macros.inc"
start:
cld
finit
call filling_alfbet ; fill table alfbet by casual numbers
 
mov eax,[tabl_calls]
mov [pp1adr],eax
 
 
cmp [flscr],0
jz nofullscreen
mov eax,14
int 0x40
 
mov [maxy],ax
sub ax,480
jnc m5
xor ax,ax
m5:
shr ax,1
mov [posy],ax
 
shr eax,16
mov [maxx],ax
sub ax,480
jnc m6
xor ax,ax
m6:
shr ax,1
mov [posx],ax
 
mov [outsize],480+65536*480
jmp m4
nofullscreen:
mov [posx],75
mov [posy],20
 
mov [outsize],450+65536*480
m4:
 
red:
call draw_window
 
still:
mov eax,23
mov ebx,delay
int 0x40 ; wait here for event
 
cmp eax,1 ; redraw request ?
je red
cmp eax,2 ; key in buffer ?
je key
cmp eax,3 ; button in buffer ?
je button
 
 
call calcframe
mov edx,dword [posy] ; edx=image position in window [x]*65536+[y]
mov ecx,[outsize] ; ecx=image position in window [x]*65536+[y]
mov ebx,scr ; ebx pointer to image in memory
mov eax,07 ; putimage
int 0x40
jmp still
 
key:
mov eax,2
int 0x40
 
cmp al,1 ; is key in buffer ?
jz still
cmp ah,0x1B ; is key ESC ?
jz close
jmp still
 
button: ; button
mov eax,17 ; get id
int 0x40
 
; cmp ah,1 ; button id=1 ?
; jne still
 
close:
mov eax,-1 ; close this program
int 0x40
 
 
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
 
 
draw_window:
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,1 ; 1, start of draw
int 0x40
 
cmp [flscr],0
jnz m2
mov ebx,1*65536+640 ; [x start] *65536 + [x size]
mov ecx,1*65536+480 ; [y start] *65536 + [y size]
mov edx,0x02000000 ; 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
xor eax,eax ; function 0 : define and draw window
int 0x40
 
; WINDOW LABEL
mov ebx,8*65536+8 ; [x start] *65536 + [y start]
mov ecx,0x10ddeeff ; color of text RRGGBB
mov edx,copyright ; pointer to text beginning
mov esi,copyrightlen-copyright; text length
mov eax,4 ; function 4 : write text to window
int 0x40
 
; CLOSE BUTTON
mov ebx,(640-19)*65536+12 ; [x start] *65536 + [x size]
mov ecx,5*65536+12 ; [y start] *65536 + [y size]
mov edx,1 ; button id
mov esi,0x6688dd ; button color RRGGBB
mov eax,8 ; function 8 : define and draw button
int 0x40
jmp m3
m2:
movzx ebx,[maxx] ; [x start] *65536 + [x size]
movzx ecx,[maxy] ; [y start] *65536 + [y size]
 
mov edx,0x01000000 ; 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
xor eax,eax ; function 0 : define and draw window
int 0x40
 
inc bx
inc cx
mov eax,13 ; functiom 13 : draw bar
int 0x40
m3:
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
 
 
calcframe:
cld
mov edi,scr
mov ecx,480*480*3/4
xor eax,eax
rep stosd ; CLS
 
 
mov ebx,[frame]
not bh
test bh,03h
not bh
jnz lb1
; ebx=xxxx xxxx xxxx xxxx xxxx xx11 xxxx xxxxb
mov byte [p],bl
lb1:
 
test bx,03ffh
jnz lb2
; ebx=xxxx xxxx xxxx xxxx xxxx xx00 0000 0000b
mov [p],0
 
mov eax,[pp1adr]
mov [pp0adr],eax
 
inc [pp1]
cmp [pp1],num_tabl_calls
jnz lb3
mov [pp1],0
lb3:
 
movzx eax,[pp1]
mov eax,[tabl_calls+eax*4]
mov [pp1adr],eax
lb2:
 
 
fild [frame] ; st0=STime
fmul [speed1] ; st0=STime*Speed
fst [bt_r] ; al_rSTime*Speed
fadd st0,st0
fstp [al_r] ; al_rSTime*Speed*2
 
 
mov [Fl],0
mov ecx,[mFl]
mov esi,alfbet
ckl1:
call [pp0adr]
cmp [p],0
jz lb4
fstp [x1]
fstp [y1]
fstp [z1]
call [pp1adr]
call mix
lb4:
 
call turn
 
add esi,4
inc [Fl]
loop ckl1
 
inc ebx
mov [frame],ebx
ret
 
 
; turn coordinate system
turn:
; around Y
; x= x*cos(a)-z*sin(a)
; y= y
; z= x*sin(a)+z*cos(a)
fld st2 ; st0=z st1=x st2=y st3=z
fld st1 ; st0=x st1=z st2=x st3=y st4=z
fld [al_r] ; st0=a st1=x st2=z st3=x st4=y st5=z
fsincos ; st0=cos(a) st1=sin(a) st2=x st3=z st4=x st5=y st6=z
fmul st4,st0
fmulp st6,st0 ; st0=sin(a) st1=x st2=z st3=x*cos(a) st4=y st5=z*cos(a)
fmul st2,st0
fmulp st1,st0 ; st0=x*sin(a) st1=z*sin(a) st2=x*cos(a) st3=y st4=z*c
faddp st4,st0
fsubp st1,st0
 
 
; around X
; x=x
; y= y*cos(b)+z*sin(b)
; z=-y*sin(b)+z*cos(b)
fld st2 ; st0=z st1=x st2=y st3=z
fld st2 ; st0=y st1=z st2=x st3=y st4=z
fld [bt_r] ; st0=b st1=y st2=z st3=x st4=y st5=z
fsincos ; st0=cos(b) st1=sin(b) st2=y st3=z st4=x st5=y st6=z
fmul st5,st0
fmulp st6,st0 ; st0=sin(b) st1=y st2=z st3=x st4=y*cos(b) st5=z*cos(b)
fmul st2,st0
fmulp st1,st0 ; st0=y*sin(b) st1=z*sin(b) st2=x st3=y*cos(b) st4=z*cos(b)
fsubp st4,st0 ; st0=z*sin(b) st1=x st2=y*cos(b) st3=z*cos(b)-y*sin(b)
faddp st2,st0
 
; st0=x st1=y st2=z
fistp [x1]
fistp [y1]
fmul [Zdepth] ; st0=z*Zdepth
fiadd [Zcolor] ; st0=z*Zdepth+Zcolor
fistp [z_w] ; st0z*Zdepth+Zcolor
 
 
push edx
 
mov eax,[x1]
add eax,[mid]
mul [const480]
add eax,[y1]
add eax,[mid]
mul [const3]
 
mov dl,byte [z_w] ; al=ZZ
mov [scr+0+eax],dl
mov [scr+1+eax],dl
mov [scr+2+eax],dl
 
pop edx
ret
 
 
 
mix:
fild [p] ; st0=p
fmul [mp] ; st0=p=p*mp
fld st0 ; st0=p st1=p
fmul st4,st0
fmul st3,st0
fmulp st2,st0 ; st0=p st1=x*p st2=y*p st3=z*p
 
fld1
fsubrp st1,st0 ; st0=1-p st1=x*p st2=y*p st3=z*p
fld [z1] ; st0=z1 st1=1-p st2=x*p st3=y*p st4=z*p
fmul st0,st1
faddp st4,st0
fld [y1] ; st0=y1 st1=1-p st2=x*p st3=y*p st4=
fmul st0,st1
faddp st3,st0
fld [x1] ; st0=x1 st1=1-p st2=x*p st3=y*p+y1*(1-p) st4=
fmulp st1,st0 ; st0=x1*(1-p) st1=x*p st2=y*p+y1*(1-p) st3=
faddp st1,st0 ; st0=x=x*p+x1*(1-p) st1=y=y*p+y1*(1-p) st2=z
ret
 
 
filling_alfbet:
; Initialize RND
mov eax,3
int 40h
; eax - fist random number
 
mov ecx,n_points
mov edi,alfbet
mov ebx,8088405h
ck2:
stosd
; Compute next random number
; New := 8088405H * Old + 1
mul ebx
inc eax
loop ck2
ret
 
 
; DATA AREA
align 2
 
frame dd 0
 
mp dd 0.00390625
n_r dd 0.00390625
 
mal_r dd 6.28318530717958648
mbt_r dd 6.28318530717958648
 
const3 dd 3
const6 dw 6
const480 dd 480
 
mFl dd n_points
pp1 dw 0
 
Zdepth dd 0.3
Zcolor dw 140
 
mid dd 240 ; centre of screen
 
speed1 dd speed
flscr db fullscreen
 
align 4
 
outsize dd ?
posy dw ?
posx dw ?
maxy dw ?
maxx dw ?
 
Fl dd ?
 
p dd ?
al_r dd ?
bt_r dd ?
 
 
pp0adr dd ?
pp1adr dd ?
 
z_w dw ?
 
x1 dd ?
y1 dd ?
z1 dd ?
 
align 16
alfbet: ; alfbet db n_points*4 dup (?)
scr = alfbet+n_points*4 ; scr db 480*480*3+1 dup (?)
i_end = scr+480*480*3+1 ; i_param db 256 dup (?)
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/crownscr/trunk/figuresi.inc
0,0 → 1,564
;
; include file for Crown_s Soft Screensaver
;
; You may add you own figures for Screensaver.
; For example see tor function.
; If you add new figures, please contact us, we will help you.
;
;input parametrs:
; alf=word [esi] - random quantity 0<=alf<=0xffff
; bet=word [esi+2] - random quantity 0<=bet<=0xffff
; Fl - number of point in frame
; (may be used as random quantity) 0<=Fl<=mFl
; p - number of frame
; (may be use for animated figures)
;
;output parametrs:
; st0=x, st1=y, st2=z
 
 
 
align 8
 
const_mpi dd 0.0000958767251683032697061874258638112 ; 1/00007fffh*pi
const_m dd 0.0000305185094759971922971282082583087 ; 1/00007fffh
 
 
 
tabl_calls dd cubes
dd explosion
dd galaxy
dd cube
dd sin
dd tor1
dd tors
dd spiral
dd tor
dd planet
dd balls
num_tabl_calls=11
 
tor_r dw 60
tor_R dw 175
 
balls_x1 dw 0
balls_x2 dw 189
balls_x3 dw -94
balls_x4 dw -94
balls_y1 dw 0
balls_y2 dw 0
balls_y3 dw 163
balls_y4 dw -163
balls_z1 dw 200
balls_z2 dw -71
balls_z3 dw -71
balls_z4 dw -71
balls_R dw 35
 
cube_R dw 118
 
spiral_R dw 100
spiral_r dw 20
spiral_h dw 150
spiral_L dw 12
 
sin_a dw 165
sin_c dw 3
sin_k dw 20
sin_A dw 85
sin_R dw 10
 
planet_R dw 120
planet_r dw 25
planet_h dw 195
planet_d dw 30
 
tors_r dw 10
tors_R1 dw 100
tors_R2 dw 150
tors_R3 dw 200
tors_a1 dw 6
tors_a2 dw 3
 
tor1_R dw 7
tor1_r dd 1.8
tor1_turns dd 25.132741228718345907701147066236 ; 2*4*pi
tor1_whorls dd 87.9645943005142106769540147318261 ; 7*4*pi
tor1_a dw 20
 
galaxy_rq dw 45
galaxy_rz dw 30
galaxy_R dw 185
galaxy_k dd 9.42477796076937971538793014983851 ; 3*pi
galaxy_A dw 230
 
 
cubes_R dw 70
 
explosion_R dw 230
 
;---------------------------------------------------------------------------
;----------------------- calculation figures -------------------------------
;---------------------------------------------------------------------------
 
 
;---------------------------- explosion ------------------------------------
explosion:
fild word [esi] ; st0=alf
fmul [const_mpi] ; st0=a=pi*alf*malf
fsincos ; st0=cos(a) st1=sin(a)
fild [Fl]
fidiv [mFl]
fadd [al_r]
fsin
fimul [explosion_R] ; st0=R st1=cos(a) st2=sin(a)
fmul st2,st0 ; st0=R st1=cos(a) st2=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a) st2=R*sin(a)
fild word [esi+2] ; st0=bet st1=R*cos(a) st2=R*sin(a)
fmul [const_mpi] ; st0=pi*bet*mbet st1=R*cos(a) st2=R*sin(a)
fsincos ; st0=cos(b) st1=sin(b) st2=R*cos(a) st3=R*sin(a)
fxch st2 ; st0=R*cos(a) st1=sin(b) st2=cos(b) st3=R*sin(a)
fmul st2,st0 ; st0=R*cos(a) st1=sin(b) st2=R*cos(a)*cos(b) st3=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a)*sin(b) st1=R*cos(a)*cos(b) st2=R*sin(a)
ret
 
 
;------------------------------ cubes --------------------------------------
cubes:
push edx
xor edx,edx
mov eax,[Fl]
div [const6]
 
 
fild [cubes_R] ; st0=R
bt dx,0
jc cubes_l0
; ax=xxxx xxxx xxxx xxx0b
fchs ; st0=-R
cubes_l0:
 
fild word [esi+2] ; st0=bet st1=R
fmul [const_m] ; st0=bet*mbet st1=R
fmul st0,st1 ; st0=R*bet*mbet st1=R
 
fild word [esi] ; st0=alf st1=R*bet*mbet st2=R
fmul [const_m] ; st0=alf*malf st1=R*bet*mbet st2=R
fmul st0,st2 ; st0=R*alf*malf st1=R*bet*mbet st2=R
 
bt dx,2
jc cubes_l1 ; dx=xxxx xxxx xxxx x10xb
bt dx,1
jc cubes_l2 ; dx=xxxx xxxx xxxx x01xb
; dx=xxxx xxxx xxxx x00xb
fstp st3
cubes_l1:
fstp st3
cubes_l2:
 
div [const6]
 
fild [cubes_R] ; st0=R
fadd st0,st0
bt dx,0
jc cubes_l4
; ax=xxxx xxxx xxxx xxx0b
fchs ; st0=-R
cubes_l4:
faddp st1,st0
 
bt dx,2
jc cubes_l5 ; ax=xxxx xxxx xxxx x10xb
bt dx,1
jc cubes_l6 ; ax=xxxx xxxx xxxx x01xb
; ax=xxxx xxxx xxxx x00xb
fstp st3
cubes_l5:
fstp st3
cubes_l6:
 
pop edx
ret
 
 
;----------------------------- galaxy --------------------------------------
galaxy:
bt [Fl],0
jc not_gal
fild [Fl]
fidiv [mFl] ; st0=f=Fl/mFl
fild word [esi+2] ; st0=bet st1=f
fmul [const_mpi] ; st0=b=pi*bet*mbet st1=f
fsincos ; st0=cos(b) st1=sin(b) st2=f
fild word [esi] ; st0=alf st1=cos(b) st2=sin(b) st3=f
fmul [const_m] ; st0=a=alf*malf st1=cos(b) st2=sin(b) st3=f
fmul st2,st0 ; st0=a st1=cos(b) st2=a*sin(b) st3=f
fmulp st1,st0 ; st0=a*cos(b) st1=a*sin(b) st2=f
fmul st0,st2 ; st0=f*a*cos(b) st1=a*sin(b) st2=f
fimul [galaxy_rz] ; st0=rz*f*a*cos(b) st1=a*sin(b) st2=f
fstp st3 ; st0=a*sin(b) st1=f st2=Z
fimul [galaxy_rq] ; st0=a*rq*sin(b) st1=f st2=Z
fiadd [galaxy_R] ; st0=R+a*rq*sin(b) st1=f st2=Z
fxch st1 ; st0=f st1=R+rq*a*sin(b) st2=Z
fmul st1,st0 ; st0=f st1=f*(R+rq*a*sin(b)) st2=Z
fmul [galaxy_k] ; st0=F=k*f st1=f*(R+rq*a*sin(b)) st2=Z
 
bt [Fl],1
jc gal_lb
fldpi
faddp st1,st0 ; st0=F=F+pi st1=f*(R+rq*a*sin(b)) st2=Z
gal_lb:
 
fsincos ; st0=cos(F) st1=sin(F) st2=f*(R+rq*a*sin(b)) st3=Z
fxch st2 ; st0=f*(R+rq*a*sin(b)) st1=sin(F) st2=cos(F) st3=Z
fmul st2,st0
fmulp st1,st0 ; st0=cos(F)*f*(R+rq*a*sin(b)) st1=sin(F)*f*(R+rq*a*sin(b)) st2=Z
ret
not_gal:
fild word [esi] ; st0=alf
fmul [const_mpi] ; st0=a=pi*alf*malf
fsincos ; st0=cos(a) st1=sin(a)
fild [Fl] ; st0=Fl st1=cos(a) st2=sin(a)
fidiv [mFl] ; st0=Fl/mFl st1=cos(a) st2=sin(a)
fmul st0,st0
fmul st0,st0
fmul st0,st0
fst st3
fimul [galaxy_A] ; st0=R=A*Fl/mFl st1=cos(a) st2=sin(a)
fmul st2,st0 ; st0=R st1=cos(a) st2=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a) st2=R*sin(a)
fild word [esi+2] ; st0=bet st1=R*cos(a) st2=R*sin(a)
fmul [const_mpi] ; st0=pi*bet*mbet st1=R*cos(a) st2=R*sin(a)
fsincos ; st0=cos(b) st1=sin(b) st2=R*cos(a) st3=R*sin(a)
fxch st2 ; st0=R*cos(a) st1=sin(b) st2=cos(b) st3=R*sin(a)
fmul st2,st0 ; st0=R*cos(a) st1=sin(b) st2=R*cos(a)*cos(b) st3=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a)*sin(b) st1=R*cos(a)*cos(b) st2=R*sin(a)
 
; around Z
fld st1
fld st1 ; st0=x st1=y st2=x st3=y st4=z
fld [al_r] ; st0=a st1=x st2=y st3=x st4=y st5=z
fchs
fmul st0,st6
fsincos ; st0=cos(a) st1=sin(a) st2=x st3=y st4=x st5=y st6=z
fmul st4,st0
fmulp st5,st0
fmul st2,st0
fmulp st1,st0 ; st0=x*sin(a) st1=y*sin(a) st2=x*cos(a) st3=y*cos(a) st4=z
faddp st3,st0
fsubp st1,st0
 
ffree st3
ret
 
 
 
;------------------------------ balls --------------------------------------
balls:
mov eax,[Fl]
and eax,03h
 
fild word [esi] ; st0=alf
fmul [const_mpi] ; st0=a=pi*alf*malf
fsincos ; st0=cos(a) st1=sin(a)
fild [balls_R] ; st0=R st1=cos(a) st2=sin(a)
fmul st2,st0 ; st0=R st1=cos(a) st2=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a) st2=R*sin(a)
fild word [esi+2] ; st0=bet st1=R*cos(a) st2=R*sin(a)
fmul [const_mpi] ; st0=pi*bet*mbet st1=R*cos(a) st2=R*sin(a)
fsincos ; st0=cos(b) st1=sin(b) st2=R*cos(a) st3=R*sin(a)
fxch st2 ; st0=R*cos(a) st1=sin(b) st2=cos(b) st3=R*sin(a)
fmul st2,st0 ; st0=R*cos(a) st1=sin(b) st2=R*cos(a)*cos(b) st3=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a)*sin(b) st1=R*cos(a)*cos(b) st2=R*sin(a)
 
fiadd [balls_y1+2*eax] ; st0=y+R*cos(a)*sin(b) st1=R*cos(a)*cos(b) st2=R*sin(a)
fxch st1 ; st0=R*cos(a)*cos(b) st1=y+R*cos(a)*sin(b) st2=R*sin(a)
fiadd [balls_z1+2*eax] ; st0=z+R*cos(a)*cos(b) st1=y+R*cos(a)*sin(b) st2=R*sin(a)
fxch st2 ; st0=R*sin(a) st1=y+R*cos(a)*sin(b) st2=z+R*cos(a)*cos(b)
fiadd [balls_x1+2*eax] ; st0=x+R*sin(a) st1=y+R*cos(a)*sin(b) st2=z+R*cos(a)*cos(b)
ret
 
 
;------------------------------- sin ---------------------------------------
sin:
test [Fl],3Fh
 
fild word [esi] ; st0=alf
 
jnz sin_lb1
fmul [const_mpi] ; st0=a=pi*alf*malf
fsincos ; st0=cos(a) st1=sin(a)
fild [sin_R] ; st0=R st1=cos(a) st2=sin(a)
fmul st2,st0 ; st0=R st1=cos(a) st2=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a) st2=R*sin(a)
fild word [esi+2] ; st0=bet st1=R*cos(a) st2=R*sin(a)
fmul [const_mpi] ; st0=b=pi*bet*mbet st1=R*cos(a) st2=R*sin(a)
fsincos ; st0=cos(b) st1=sin(b) st2=R*cos(a) st3=R*sin(a)
fxch st2 ; st0=R*cos(a) st1=sin(b) st2=cos(b) st3=R*sin(a)
fmul st2,st0 ; st0=R*cos(a) st1=sin(b) st2=R*cos(a)*cos(b) st3=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a)*sin(b) st1=R*cos(a)*cos(b) st2=R*sin(a)
fiadd [sin_A] ; st0=A+R*cos(b)*sin(a) st2=R*cos(a)*cos(b) st3=R*sin(a)
ret
 
sin_lb1:
fmul [const_m] ; st0=alf*malf
fild word [esi+2] ; st0=bet st1=alf*malf
fmul [const_m] ; st0=bet*mbet st1=alf*malf
 
fld st0 ; st0=bet*mbet st1=bet*mbet st2=alf*malf
fmul st0,st0 ; st0=(bet*mbet)^2 st1=bet*mbet st2=alf*malf
fld st2 ; st0=alf*malf st1=(bet*mbet)^2 st2=bet*mbet st3=alf*malf
fmul st0,st0 ; st0=(alf*malf)^2 st1=(bet*mbet)^2 st2=bet*mbet st3=alf*malf
faddp st1,st0 ; st0=(alf*malf)^2+(bet*mbet)^2 st1=bet*mbet st2=alf*malf
fsqrt ; st0=r=sqr((alf*malf)^2*(bet*mbet)^2) st1=bet*mbet st2=alf*malf
fild [sin_k] ; st0=k st1=r st2=bet*mbet st3=alf*malf
fmul st0,st1 ; st0=k*r st1=r st2=bet*mbet st3=alf*malf
fsin ; st0=sin(k*r) st1=r st2=bet*mbet st3=alf*malf
fdivrp st1,st0 ; st0=sin(k*r)/r st1=bet*mbet st2=alf*malf
fimul [sin_c] ; st0=c*sin(k*r)/r st1=bet*mbet st2=alf*malf
 
fild [sin_a] ; st0=a st1=c*sin(k*r)/r st2=bet*mbet st3=alf*malf
fmul st2,st0 ; st0=a st1=c*sin(k*r)/r st2=a*bet*mbet st3=alf*malf
fmulp st3,st0 ; st0=c*sin(k*r)/r st1=a*bet*mbet st2=a*alf*malf
ret
 
 
;------------------------------ tors ---------------------------------------
tors:
push edx
xor edx,edx
mov eax,[Fl]
div [const3]
mov al,dl
pop edx
 
fild word [esi] ; st0=alf
fmul [const_mpi] ; st0=a=pi*alf*malf
fsincos ; st0=cos(a) st1=sin(a)
fild [tors_r] ; st0=r st1=cos(a) st2=sin(a)
fmul st2,st0 ; st0=r st1=cos(a) st2=r*sin(a)
fmulp st1,st0 ; st0=r*cos(a) st1=r*sin(a)
bt ax,1
jc tors_l1 ; ax=xxxx xxxx xxxx xx1xb
bt ax,0
jc tors_l2 ; ax=xxxx xxxx xxxx xxx1b
fiadd [tors_R3] ; st0=r*cos(a)+R st1=r*sin(a)
fild word [esi+2] ; st0=bet st1=r*cos(a)+R st2=r*sin(a)
fmul [const_mpi] ; st0=b=pi*bet*mbet st1=r*cos(a)+R st2=r*sin(a)
fsincos ; st0=cos(b) st1=sin(b) st2=r*cos(a)+R st3=r*sin(a)
fxch st2 ; st0=r*cos(a)+R st1=sin(b) st2=cos(b) st3=r*sin(a)
fmul st2,st0 ; st0=r*cos(a)+R st1=sin(b) st2=cos(b)*(r*cos(a)+R) st3=r*sin(a)
fmulp st1,st0 ; st0=sin(b)*(r*cos(a)+R) st1=cos(b)*(r*cos(a)+R) st2=r*sin(a)
ret
 
tors_l1:
fiadd [tors_R2] ; st0=r*cos(a)+R st1=r*sin(a)
fild word [esi+2] ; st0=bet st1=r*cos(a)+R st2=r*sin(a)
fmul [const_mpi] ; st0=b=pi*bet*mbet st1=r*cos(a)+R st2=r*sin(a)
fsincos ; st0=cos(b) st1=sin(b) st2=r*cos(a)+R st3=r*sin(a)
fxch st2 ; st0=r*cos(a)+R st1=sin(b) st2=cos(b) st3=r*sin(a)
fmul st2,st0 ; st0=r*cos(a)+R st1=sin(b) st2=cos(b)*(r*cos(a)+R) st3=r*sin(a)
fmulp st1,st0 ; st0=sin(b)*(r*cos(a)+R) st1=cos(b)*(r*cos(a)+R) st2=r*sin(a)
jmp tors_l3
 
tors_l2:
fiadd [tors_R1] ; st0=r*cos(a)+R st1=r*sin(a)
fild word [esi+2] ; st0=bet st1=r*cos(a)+R st2=r*sin(a)
fmul [const_mpi] ; st0=b=pi*bet*mbet st1=r*cos(a)+R st2=r*sin(a)
fsincos ; st0=cos(b) st1=sin(b) st2=r*cos(a)+R st3=r*sin(a)
fxch st2 ; st0=r*cos(a)+R st1=sin(b) st2=cos(b) st3=r*sin(a)
fmul st2,st0 ; st0=r*cos(a)+R st1=sin(b) st2=cos(b)*(r*cos(a)+R) st3=r*sin(a)
fmulp st1,st0 ; st0=sin(b)*(r*cos(a)+R) st1=cos(b)*(r*cos(a)+R) st2=r*sin(a)
 
 
; around Y
; x= x*cos(a)-z*sin(a)
; y= y
; z= x*sin(a)+z*cos(a)
fld st2 ; st0=z st1=x st2=y st3=z
fld st1 ; st0=x st1=z st2=x st3=y st4=z
fld [al_r]
fimul [tors_a1] ; st0=a st1=x st2=z st3=x st4=y st5=z
fsincos ; st0=cos(a) st1=sin(a) st2=x st3=z st4=x st5=y st6=z
fmul st4,st0
fmulp st6,st0 ; st0=sin(a) st1=x st2=z st3=x*cos(a) st4=y st5=z*cos(a)
fmul st2,st0
fmulp st1,st0 ; st0=x*sin(a) st1=z*sin(a) st2=x*cos(a) st3=y st4=z*cos(a)
faddp st4,st0
fsubp st1,st0
 
tors_l3:
; around X
; x=x
; y= y*cos(b)+z*sin(b)
; z=-y*sin(b)+z*cos(b)
fld st2 ; st0=z st1=x st2=y st3=z
fld st2 ; st0=y st1=z st2=x st3=y st4=z
fld [al_r]
fimul [tors_a2] ; st0=b st1=y st2=z st3=x st4=y st5=z
fsincos ; st0=cos(b) st1=sin(b) st2=y st3=z st4=x st5=y st6=z
fmul st5,st0
fmulp st6,st0 ; st0=sin(b) st1=y st2=z st3=x st4=y*cos(b) st5=z*cos(b)
fmul st2,st0
fmulp st1,st0 ; st0=y*sin(b) st1=z*sin(b) st2=x st3=y*cos(b) st4=z*cos(b)
fsubp st4,st0 ; st0=z*sin(b) st1=x st2=y*cos(b) st3=z*cos(b)-y*sin(b)
faddp st2,st0
ret
 
 
;------------------------------ tor1 ---------------------------------------
tor1:
fild [tor1_a] ; st0=a
fild word [esi+2] ; st0=bet st1=a
fmul [const_mpi] ; st0=b=pi*bet*mbet st1=a
fsincos ; st0=cos(b) st1=sin(b) st2=a
fild word [esi] ; st0=alf st1=cos(b) st2=sin(b) st3=a
fmul [const_m] ; st0=alf*malf st1=cos(b) st2=sin(b) st3=a
fld st0 ; st0=alf*malf st1=alf*malf st2=cos(b) st3=sin(b) st4=a
fmul [tor1_whorls] ; st0=wa=whorls*alf*malf st1=alf*malf st2=cos(b) st3=sin(b) st4=a
fsincos ; st0=cos(wa) st1=sin(wa) st2=alf*malf st3=cos(b) st4=sin(b) st5=a
fld [tor1_r] ; st0=r st1=cos(wa) st2=sin(wa) st3=alf*malf st4=cos(b) st5=sin(b) st6=a
fmul st2,st0 ; st0=r st1=cos(wa) st2=r*sin(wa) st3=alf*malf st4=cos(b) st5=sin(b) st6=a
fmulp st1,st0 ; st0=r*cos(wa) st1=r*sin(wa) st2=alf*malf st3=cos(b) st4=sin(b) st5=a
fiadd [tor1_R] ; st0=R+r*cos(wa) st1=r*sin(wa) st2=alf*malf st3=cos(b) st4=sin(b) st5=a
faddp st3,st0 ; st0=r*sin(wa) st1=alf*malf st2=R+r*cos(wa)+cos(b) st3=sin(b) st4=a
faddp st3,st0 ; st0=alf*malf st1=R+r*cos(wa)+cos(b) st2=r*sin(wa)+sin(b) st3=a
fmul [tor1_turns] ; st0=ta=turns*alf*malf st1=R+r*cos(wa)+cos(b) st2=r*sin(wa)+sin(b) st3=a
fsincos ; st0=cos(ta) st1=sin(ta) st2=R+r*cos(wa)+cos(b) st3=r*sin(wa)+sin(b) st4=a
fmul st0,st2 ; st0=cos(ta)*(R+r*cos(wa)+cos(b)) st1=sin(ta) st2=R+r*cos(wa)+cos(b) st3=r*sin(wa)+sin(b) st4=a
fmul st0,st4 ; st0=a*cos(ta)*(R+r*cos(wa)+cos(b)) st1=sin(ta) st2=R+r*cos(wa)+cos(b) st3=r*sin(wa)+sin(b) st4=a
fstp st5 ; st0=sin(ta) st1=R+r*cos(wa)+cos(b) st2=r*sin(wa)+sin(b) st3=a st4=y
fmulp st1,st0 ; st0=sin(ta)*(R+r*cos(wa)+cos(b)) st1=r*sin(wa)+sin(b) st2=a st3=y
fmul st0,st2 ; st0=z=a*sin(ta)*(R+r*cos(wa)+cos(b)) st1=r*sin(wa)+sin(b) st2=a st3=y
fstp st4 ; st0=r*sin(wa)+sin(b) st1=a st2=y st3=z
fmulp st1,st0 ; st0=x=a*(r*sin(wa)+sin(b)) st1=y st2=z
ret
 
 
 
;------------------------------- tor ---------------------------------------
tor:
fild word [esi] ; st0=alf
fmul [const_mpi] ; st0=a=pi*alf*malf
fsincos ; st0=cos(a) st1=sin(a)
fild [tor_r] ; st0=r st1=cos(a) st2=sin(a)
fmul st2,st0 ; st0=r st1=cos(a) st2=r*sin(a)
fmulp st1,st0 ; st0=r*cos(a) st1=r*sin(a)
fiadd [tor_R] ; st0=r*cos(a)+R st1=r*sin(a)
fild word [esi+2]; st0=bet st1=r*cos(a)+R st2=r*sin(a)
fmul [const_mpi] ; st0=b=pi*bet*mbet st1=r*cos(a)+R st2=r*sin(a)
fsincos ; st0=cos(b) st1=sin(b) st2=r*cos(a)+R st3=r*sin(a)
fxch st2 ; st0=r*cos(a)+R st1=sin(b) st2=cos(b) st3=r*sin(a)
fmul st2,st0 ; st0=r*cos(a)+R st1=sin(b) st2=cos(b)*(r*cos(a)+R) st3=r*sin(a)
fmulp st1,st0 ; st0=sin(b)*(r*cos(a)+R) st1=cos(b)*(r*cos(a)+R) st2=r*sin(a)
ret
 
 
;------------------------------ spiral -------------------------------------
spiral:
fild word [esi+2] ; st0=bet
fmul [const_m] ; st0=bet*mbet
fild word [esi] ; st0=alf st1=bet*mbet
fmul [const_mpi] ; st0=a=pi*alf*malf st1=bet*mbet
fsincos ; st0=cos(a) st1=sin(a) st2=bet*mbet
fimul [spiral_r] ; st0=r*cos(a) st1=sin(a) st2=bet*mbet
fld st2 ; st0=bet*mbet st1=r*cos(a) st2=sin(a) st3=bet*mbet
fimul [spiral_h] ; st0=bet*mbet*h st1=r*cos(a) st2=sin(a) st3=bet*mbet
faddp st1,st0 ; st0=z=bet*mbet*h+r*cos(a) st1=sin(a) st2=bet*mbet
fstp st3 ; st0=sin(a) st1=bet*mbet st2=z
fimul [spiral_r] ; st0=r*sin(a) st1=bet*mbet st2=z
fiadd [spiral_R] ; st0=r*sin(a)+R st1=bet*mbet st2=z
fxch st1 ; st0=bet*mbet st1=r*sin(a)+R st2=z
fimul [spiral_L] ; st0=b=L*bet*mbet st1=r*sin(a)+R st2=z
fsincos ; st0=cos(b) st1=sin(b) st2=r*sin(a)+R st3=z
fxch st2 ; st0=r*sin(a)+R st1=sin(b) st2=cos(b) st3=z
fmul st2,st0 ; st0=r*sin(a)+R st1=sin(b) st2=(r*sin(a)+R)*cos(b) st3=z
fmulp st1,st0 ; st0=x=(r*sin(a)+R)*sin(b) st2=y=(r*sin(a)+R)*cos(b) st3=z
ret
 
 
;------------------------------- cube --------------------------------------
cube:
push edx
xor edx,edx
mov eax,[Fl]
div [const6]
 
fild [cube_R] ; st0=R
bt dx,0
jc cube_l0
; dx=xxxx xxxx xxxx xxx0b
fchs ; st0=-R
cube_l0:
 
fild word [esi+2] ; st0=bet st1=R
fmul [const_m] ; st0=bet*mbet st1=R
fmul st0,st1 ; st0=R*bet*mbet st1=R
 
fild word [esi] ; st0=alf st1=R*bet*mbet st2=R
fmul [const_m] ; st0=alf*malf st1=R*bet*mbet st2=R
fmul st0,st2 ; st0=R*alf*malf st1=R*bet*mbet st2=R
 
bt dx,2
jc cube_l1 ; dx=xxxx xxxx xxxx x10xb
bt dx,1
jc cube_l2 ; dx=xxxx xxxx xxxx x01xb
; dx=xxxx xxxx xxxx x00xb
fstp st3
cube_l1:
fstp st3
cube_l2:
pop edx
ret
 
 
;------------------------------ planet -------------------------------------
planet:
bt [Fl],0
jc planet_lb1
 
bt [Fl],1
jc planet_lb0
fild word [esi] ; st0=alf
fmul [const_mpi] ; st0=a=pi*alf*malf
fsincos ; st0=cos(a) st1=sin(a)
fild [planet_R] ; st0=R st1=cos(a) st2=sin(a)
fmul st2,st0 ; st0=R st1=cos(a) st2=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a) st2=R*sin(a)
fild word [esi+2] ; st0=bet st1=R*cos(a) st2=R*sin(a)
fmul [const_mpi] ; st0=b=pi*bet*mbet st1=R*cos(a) st2=R*sin(a)
fsincos ; st0=cos(b) st1=sin(b) st2=R*cos(a) st3=R*sin(a)
fxch st2 ; st0=R*cos(a) st1=sin(b) st2=cos(b) st3=R*sin(a)
fmul st2,st0 ; st0=R*cos(a) st1=sin(b) st2=R*cos(a)*cos(b) st3=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a)*sin(b) st1=R*cos(a)*cos(b) st2=R*sin(a)
ret
planet_lb0:
fild word [esi] ; st0=alf
fmul [const_mpi] ; st0=a=pi*alf*malf
fsincos ; st0=cos(a) st1=sin(a)
fild [planet_r] ; st0=R st1=cos(a) st2=sin(a)
fmul st2,st0 ; st0=R st1=cos(a) st2=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a) st2=R*sin(a)
fild word [esi+2] ; st0=bet st1=R*cos(a) st2=R*sin(a)
fmul [const_mpi] ; st0=b=pi*bet*mbet st1=R*cos(a) st2=R*sin(a)
fsincos ; st0=cos(b) st1=sin(b) st2=R*cos(a) st3=R*sin(a)
fxch st2 ; st0=R*cos(a) st1=sin(b) st2=cos(b) st3=R*sin(a)
fmul st2,st0 ; st0=R*cos(a) st1=sin(b) st2=R*cos(a)*cos(b) st3=R*sin(a)
fmulp st1,st0 ; st0=R*cos(a)*sin(b) st1=R*cos(a)*cos(b) st2=R*sin(a)
fiadd [planet_h] ; st0=R*cos(a)*sin(b)+h st1=R*cos(a)*cos(b) st2=R*sin(a)
fxch st1 ; st0=R*cos(a)*cos(b) st1=R*cos(a)*sin(b)+h st2=R*sin(a)
ret
planet_lb1:
fild word [esi+2] ; st0=bet
fmul [const_m] ; st0=bet*mbet
fimul [planet_d] ; st0=d*bet*mbet
fiadd [planet_h] ; st0=h+d*bet*mbet
fild word [esi] ; st0=alf st1=h+d*bet*mbet
fmul [const_mpi] ; st0=a=pi*alf*malf st1=h+d*bet*mbet
fsincos ; st0=cos(a) st1=sin(a) st2=h+d*bet*mbet
fxch st2 ; st0=h+d*bet*mbet st1=sin(a) st2=cos(a)
fmul st2,st0 ; st0=h+d*bet*mbet st1=sin(a) st2=cos(a)*(h+d*bet*mbet)
fmulp st1,st0 ; st0=(h+d*bet*mbet)*sin(a) st1=cos(a)*(h+d*bet*mbet)
fldz ; st0=0 st1=(h+d*bet*mbet)*sin(a) st2=cos(a)*(h+d*bet*mbet)
ret
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/crownscr/trunk/macros.inc
0,0 → 1,261
; 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,b { ; mike.dld
if (~a eq)&(~b eq)
mpack reg,a,b
else if (~a eq)&(b 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
}
 
; 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
/programs/demos/cslide/trunk/build_en.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix en >lang.inc
@fasm cslide.asm cslide
@pause
/programs/demos/cslide/trunk/build_ru.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm cslide.asm cslide
@pause
/programs/demos/cslide/trunk/cslide.asm
0,0 → 1,391
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; Color Slider Control Demonstration ;
; ;
; Compile with FASM for Menuet ;
; ;
; Author: Jason Delozier ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
use32
 
org 0x0
 
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0x1000 ; memory for app
dd 0x1000 ; esp
dd 0x0 , 0x0 ; I_Param , I_Icon
 
include 'lang.inc'
START: ; start of execution
 
call draw_window ; at first, draw the window
 
still:
call mouse_info
 
mov eax,23
mov ebx,2
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
 
jmp still
 
red: ; redraw
call draw_window
jmp still
 
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
jmp still
 
button: ; button
mov eax,17 ; get id
int 0x40
 
shr eax,8
 
cmp eax,1 ; button id=1 ?
jne noclose
mov eax,-1 ; close this program
int 0x40
noclose:
 
 
nofind:
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,100*65536+200 ; [x start] *65536 + [x size]
mov ecx,100*65536+200 ; [y start] *65536 + [y size]
mov edx,0x03ffffff ; color of work area RRGGBB,8->color gl
mov esi,0x806688cc
mov edi,0x006688cc
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,0x00ddeeff ; color of text RRGGBB
mov edx,labelt ; pointer to text beginning
mov esi,labellen-labelt ; text length
int 0x40
 
call draw_slider_info
 
xor ecx,ecx
Draw_Controls_Loop:
mov ebp, [App_Controls+ecx] ;get controls data location
or ebp,ebp
jz Draw_Controls_Done
call dword [App_Controls+ecx+4] ;call controls draw function
add ecx, 12
jmp Draw_Controls_Loop
Draw_Controls_Done:
 
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
 
ret
 
 
;***********************************************
;* Mouse Stuff
;***********************************************
mousey dw 0
mousex dw 0
mouseb dd 0
 
mouse_info:
mov eax, 37 ;get mouse cordinates
mov ebx, 1 ;
int 0x40 ;
mov ecx, eax ;
push ecx ;
mov eax, 37 ;get mouse buttons
mov ebx, 2 ;
int 0x40 ;
cmp [mouseb], eax ;compare old mouse states to new states
jne redraw_mouse_info ;
cmp [mousey], cx ;
jne redraw_mouse_info ;
shr ecx, 16 ;
cmp [mousex], cx ;
jne redraw_mouse_info ;
pop ecx ;
ret ;return if no change in states
 
 
redraw_mouse_info:
pop ecx
mov [mouseb], eax ;save new mouse states
mov dword [mousey], ecx
 
xor ecx, ecx
Check_Mouse_Over_Controls_Loop:
mov ebp, [App_Controls+ecx]
or ebp,ebp
jz Check_Mouse_Over_Controls_Loop_done
movzx eax,word [ebp+2]
cmp ax, [mousex]
ja mouse_not_on_control
movzx eax,word [ebp+6]
cmp ax, [mousey]
ja mouse_not_on_control
movzx eax,word [ebp]
add ax, [ebp+2]
cmp ax, [mousex]
jb mouse_not_on_control
movzx eax,word [ebp+4]
add ax, [ebp+6]
cmp ax, [mousey]
jb mouse_not_on_control
call dword [App_Controls+ecx+8]
mouse_not_on_control:
add ecx, 12
jmp Check_Mouse_Over_Controls_Loop
Check_Mouse_Over_Controls_Loop_done:
 
ret
 
 
 
 
;***********************************************
 
 
draw_slider_info:
;Repaint value background
mov eax, 13
mov ebx, 0x00960028
mov ecx, 0x00240010
mov edx, 0x00ffffff
int 0x40
;Draw Color Box
xor edx, edx
movzx ecx,word [slider_1+12]
mov dh, cl
movzx ecx,word [slider_2+12]
mov dl, cl
shl edx, 8
movzx ecx,word [slider_3+12]
mov dl,cl
mov ebx, 0x00860035
mov ecx, 0x00590040
mov eax, 13
int 0x40
;draw current value of slider
mov ecx, edx
mov eax, 47
mov ebx, 0x00060100
mov esi, 0
mov edx, 0x009A0029
int 0x40
ret
 
 
;**************************************
;*
;* App Controls
;*
;**************************************
 
App_Controls:
dd slider_1 , draw_slider, slider_mouse_over ;
dd slider_2 , draw_slider, slider_mouse_over ;
dd slider_3 , draw_slider, slider_mouse_over ;
dd 0 , 0 ; denotes last control do not delete
 
;**************************************
;*
;* Slider data
;*
;**************************************
 
slider_1:
dw 25 ;width +0
dw 10 ;x +2
dw 150 ;height +4
dw 30 ;y +6
dw 0 ;min +8
dw 255 ;max +10
dw 128 ;current +12
dw 1 ;small change +14
dw 5 ;big change +16
 
slider_2:
dw 25 ;width +0
dw 55 ;x +2
dw 150 ;height +4
dw 30 ;y +6
dw 0 ;min +8
dw 255 ;max +10
dw 128 ;current +12
dw 1 ;small change +14
dw 5 ;big change +16
 
slider_3:
dw 25 ;width +0
dw 100 ;x +2
dw 150 ;height +4
dw 30 ;y +6
dw 0 ;min +8
dw 255 ;max +10
dw 128 ;current +12
dw 1 ;small change +14
dw 5 ;big change +16
 
;**************************************
;*
;* Slider Code
;*
;**************************************
 
box_h dw 10 ;static slider box height
 
draw_slider:
push eax
push ebx
push ecx
push edx
;Draw slider background
mov eax, 13 ;slider background
mov ebx, [ebp] ;x start/width
mov ecx, [ebp+4] ;y start/height
mov edx, 0x002288DD ;color
int 0x40 ;draw bar
;Draw line for slide rail
mov eax, 38 ;draw vertical slide line
movzx ebx,word [ebp] ;x
shr ebx, 1 ;
add bx,word [ebp+2];
push bx ;
shl ebx, 16 ;
pop bx ;
mov ecx, [ebp+4] ;y start / height
add ecx, 0x000A0000 ;
add ecx, [ebp+6] ;y start
sub ecx, 10 ;
mov edx, 0x00 ;color
int 0x40 ;
;Draw slider box
movzx eax,word [ebp+4] ;height
sub eax, 20 ;
movzx ebx,word [ebp+10] ;max value
sub bx,word [ebp+8] ;min value
movzx ecx,word [ebp+12] ;
call slider_fpu_calc ;EAX = ((EAX/EBX)*ECX)
mov ebx, [ebp] ;x start / width
movzx ecx,word [ebp+4] ;height
add cx, [ebp+6] ;y
sub ecx, 10 ;
movzx edx, [box_h] ;
shr edx, 1 ;
sub ecx, edx ;
sub ecx, eax ;*slide box y position
shl ecx, 16 ;
mov cx, [box_h] ;height
mov eax, 13 ;draw bar sys function
mov edx, 0x00 ;color
int 0x40 ;draw slider box
pop edx
pop ecx
pop ebx
pop eax
ret
 
slider_mouse_over:
push eax
push ebx
push ecx
push edx
cmp [mouseb], 1
jne slider_mouse_over_done
movzx eax,word [ebp+4]
add ax, [ebp+6]
sub eax, 10
cmp [mousey], ax
ja slider_mouse_min
movzx eax,word [ebp+6]
add eax, 10
cmp [mousey], ax
jb slider_mouse_max
;determine new current value
movzx eax,word [ebp+10] ;slider max value
sub ax,word [ebp+8] ;slider min value
movzx ebx,word [ebp+4] ;slider height
sub ebx,20 ;rail size
movzx ecx,word [mousey] ;current mouse y pixel
sub cx,word [ebp+6] ;minus y start of slider
sub ecx, 10 ;minus pixels to top of rail
call slider_fpu_calc ;EAX = ((EAX/EBX)*ECX)
movzx ebx,word [ebp+10] ;slider max
sub ebx,eax ;*current calculated position
jmp slider_mouse_change;
slider_mouse_max: ;
movzx ebx,word [ebp+10] ;get maximum value
jmp slider_mouse_change ;
slider_mouse_min: ;
movzx ebx,word [ebp+8] ;get minimum value
slider_mouse_change: ;
mov [ebp+12],bx ;new slider current position
call draw_slider ;
call draw_slider_info ;
slider_mouse_over_done: ;
pop edx
pop ecx
pop ebx
pop eax
ret
 
 
temp dd 0 ;temp varibles used in fpu computations
temp2 dd 0
temp3 dd 0
 
slider_fpu_calc:
mov [temp], eax
mov [temp2], ebx
mov [temp3], ecx
finit ;initilize FPU
fld dword [temp] ;load value
fdiv dword [temp2] ;divide
fmul dword [temp3] ;multiply
fst dword [temp] ;store computed value
mov eax, [temp]
ret
 
;**************************************************
;* End Slider Code
;**************************************************
 
; DATA AREA
labelt: db 'Color Slider'
labellen:
I_END:
 
 
 
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/eyes/trunk/build_en.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix en >lang.inc
@fasm eyes.asm eyes
@pause
/programs/demos/eyes/trunk/build_ru.bat
0,0 → 1,4
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm eyes.asm eyes
@pause
/programs/demos/eyes/trunk/eyes.asm
0,0 → 1,388
;
; EYES FOR MENUET
;
; Written by Nikita Lesnikov (nlo_one@mail.ru)
;
; Position of "eyes" is fixed. To close "eyes" just click on them.
;
; NOTE: quite big timeout is used to disable blinking when redrawing.
; If "eyes" blink on your system, enlarge the TIMEOUT. If not, you can
; decrease it due to more realistic movement.
;
 
TIMEOUT equ 5
 
; EXECUTABLE HEADER
 
use32
 
org 0x0
db "MENUET01"
dd 0x01
dd ENTRANCE
dd EYES_END
dd 0x3000
dd 0x3000
dd 0x0
dd 0x0
 
include 'macros.inc'
ENTRANCE: ; start of code
 
; ==== main ====
 
call prepare_eyes
 
call shape_window
 
still:
 
call draw_eyes ; draw those funny "eyes"
 
mov eax,23 ; wait for event with timeout
mov ebx,TIMEOUT
int 0x40
 
cmp eax,1 ; redraw ?
jnz no_draw
call redraw_overlap
no_draw:
 
cmp eax,2 ; key ?
jz key
 
cmp eax,3 ; button ?
jz button
 
jmp still ; loop
 
; EVENTS
 
key:
mov eax,2 ; just read and ignore
int 0x40
jmp still
 
button: ; analyze button
mov eax,-1 ; this is button 1 - we have only one button :-)
int 0x40
jmp still
 
; -====- declarations -====-
 
imagedata equ EYES_END
skindata equ EYES_END+925
winref equ EYES_END+6325
 
; -====- shape -====-
 
shape_window:
 
mov eax,50 ; set up shape reference area
mov ebx,0
mov ecx,winref
int 0x40
 
ret
 
; -====- redrawing -====-
 
draw_eyes: ; check mousepos to disable blinking
 
mov eax,37
xor ebx,ebx
int 0x40
cmp dword [mouse],eax
jne redraw_ok
ret
redraw_ok:
mov [mouse],eax
 
redraw_overlap: ; label for redraw event (without checkmouse)
 
mov eax,12
mov ebx,1
int 0x40
 
xor eax,eax ; define window
mov ebx,[win_ebx]
mov ecx,[win_ecx]
xor edx,edx
xor esi,esi
xor edi,edi
int 0x40
 
mov eax,8 ; define closebutton
mov ebx,60
mov ecx,45
mov edx,1
int 0x40
 
mov eax,7
mov ebx,skindata
mov ecx,60*65536+30
mov edx,15
int 0x40
 
mov eax,15
mov ebx,30
call draw_eye_point
add eax,30
call draw_eye_point
 
mov eax,12
mov ebx,2
int 0x40
 
ret
 
draw_eye_point: ; draw eye point (EAX=X, EBX=Y)
pusha
 
mov ecx, [mouse] ; ecx = mousex, edx = mousey
mov edx,ecx
shr ecx,16
and edx,0xFFFF
 
; ===> calculate position
 
push eax
push ebx
mov byte [sign1],0
mov esi, [win_ebx]
shr esi,16
add eax,esi
sub ecx,eax ; ECX=ECX-EAX (signed) , ECX=|ECX|
jnc abs_ok_1
neg ecx
mov byte [sign1],1
abs_ok_1:
mov [temp1],ecx
mov byte [sign2],0
mov esi,[win_ecx]
shr esi,16
add ebx,esi
sub edx,ebx ; EDX=EDX-EBX (signed) , EDX=|EDX|
jnc abs_ok_2
neg edx
mov byte [sign2],1
abs_ok_2:
mov [temp2],edx
pop ebx
pop eax
 
push eax ; ECX*=ECX
push edx
xor eax,eax
xor edx,edx
mov ax,cx
mul cx
shl edx,16
or eax,edx
mov ecx,eax
pop edx
pop eax
 
push eax ; EDX*=EDX
push ecx
mov ecx,edx
xor eax,eax
xor edx,edx
mov ax,cx
mul cx
shl edx,16
or eax,edx
mov edx,eax
pop ecx
pop eax
 
push ebx
push ecx
push edx
push eax
mov ebx,ecx ; EBX=ECX+EDX
add ebx,edx
xor edi,edi ; ESI=SQRT(EBX)
mov ecx,edi
mov edx,edi
inc edi
mov eax,edi
inc edi
sqrt_loop:
add ecx,eax
add eax,edi
inc edx
cmp ecx,ebx
jbe sqrt_loop
dec edx
mov esi,edx
mov ax,si ; ESI=ESI/7
mov dl,7
div dl
and ax,0xFF
mov si,ax ; ESI ? 0 : ESI=1
jnz nozeroflag1
mov si,1
nozeroflag1:
 
pop eax
pop edx
pop ecx
pop ebx
 
push eax ; ECX=[temp1]/ESI
push edx
mov eax,[temp1]
mov dx,si
div dl
mov cl,al
and ecx,0xFF
pop edx
pop eax
 
cmp byte [sign1],1
je subtract_1
add eax,ecx ; EAX=EAX+ECX
jmp calc_ok_1
subtract_1:
sub eax,ecx ; EAX=EAX-ECX
calc_ok_1:
 
push eax ; EDX=[temp2]/ESI
push ecx
mov eax,[temp2]
mov dx,si
div dl
mov dl,al
and dx,0xFF
pop ecx
pop eax
 
cmp byte [sign2],1
je subtract_2
add ebx,edx ; EBX=EBX+EDX
jmp calc_ok_2
subtract_2:
sub ebx,edx ; EBX=EBX-EDX
calc_ok_2:
 
; <===
 
mov ecx,ebx ; draw point
mov ebx,eax
mov eax,13
dec ecx
dec ecx
dec ebx
dec ebx
shl ecx,16
add ecx,4
shl ebx,16
add ebx,4
mov eax,13
xor edx,edx
int 0x40
 
popa
ret
 
; -====- working on images and window -====-
 
prepare_eyes:
 
;mov eax,6 ; load EYES.RAW
;mov ebx,graphix
;mov ecx,0x00000000
;mov edx,0xFFFFFFFF
;mov esi,imagedata
;int 0x40
;cmp eax,0xFFFFFFFF
;jnz filefound
 
;mov eax,-1 ; file not exists...
;int 0x40
 
;filefound:
mov esi,imagedata+25 ; transform grayscale to putimage format
mov edi,skindata
mov ecx,30
transform_loop:
push ecx
mov ecx,30
lp1:
lodsb
stosb
stosb
stosb
loop lp1
sub esi,30
mov ecx,30
lp2:
lodsb
stosb
stosb
stosb
loop lp2
pop ecx
loop transform_loop
 
mov eax,14 ; calculating screen position
int 0x40
shr eax,1
mov ax,59
sub eax,30*65536
mov [win_ebx],eax
mov [win_ecx],dword 10*65536+44
 
mov esi,imagedata+25 ; calculate shape reference area
mov edi,winref
mov ecx,900 ; disable drag bar
mov al,0
rep stosb
 
mov ecx,30 ; calculate circles for eyes
shape_loop:
push ecx
 
call copy_line ; duplicate (we have two eyes :)
sub esi,30
call copy_line
 
pop ecx
loop shape_loop
 
ret
 
copy_line: ; copy single line to shape reference area
mov ecx,30
cpl_loop:
lodsb
cmp al,0xFF
jnz set_one
mov al,0
jmp cpl_ok
set_one:
mov al,1
cpl_ok:
stosb
loop cpl_loop
ret
 
; DATA
 
; environment
 
win_ebx dd 0x0
win_ecx dd 0x0
mouse dd 0xFFFFFFFF
;graphix db "EYES.RAW "
 
; temporary storage for math routines
 
temp1 dd 0
temp2 dd 0
sign1 db 0
sign2 db 0
 
EYES_END: ; end of code
file "EYES.RAW"
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/programs/demos/eyes/trunk/eyes.raw
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/demos/eyes/trunk/macros.inc
0,0 → 1,267
; 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,b { ; mike.dld
if (~a eq)&(~b eq)
mpack reg,a,b
else if (~a eq)&(b 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
}
 
 
 
 
 
 
 
; 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
/programs/demos/fire/trunk/fire.asm
0,0 → 1,259
;
; FIRE for MENUET - Compile with FASM
;
 
use32
 
org 0x0
db 'MENUET01' ; 8 byte id
dd 1 ; header version
dd START ; program start
dd I_END ; image size
dd mem_end ; reguired amount of memory
dd mem_end
dd 0,0 ; no parameters, no path
 
;include 'lang.inc'
include 'macros.inc'
 
START:
 
red:
 
; ************************************************
; ********* WINDOW DEFINITIONS AND DRAW **********
; ************************************************
 
draw_window:
 
mov eax,12 ; tell os about redraw
mov ebx,1
int 0x40
 
xor eax,eax ; define and draw window
mov ebx,100*65536+321
mov ecx,70*65536+222
mov edx,0x00000000
mov esi,0x00000000
mov edi,0x00000000
int 0x40
 
mov al,4 ; 'FIRE FOR MENUET'
mov ebx,110*65536+8
mov ecx,dword 0x00FFFFFF
mov edx,text
mov esi,textlen-text
int 0x40
 
mov al,8
mov ebx,(321-19)*65536+12 ; button start x & size
mov ecx,5*65536+12 ; button start y & size
mov edx,1 ; button number
mov esi,0x009a0000
int 0x40
 
mov ebx,ecx ;5*65536+12
inc edx
int 0x40
 
mov ebx,18*65536+12
inc edx
int 0x40
 
mov ebx,31*65536+12
inc edx
int 0x40
 
mov al,12 ; tell os about redraw end
mov ebx,2
int 0x40
 
sta: ; calculate fire image
 
mov esi, FireScreen+0x2300-80
mov ecx, 80
mov eax, [FireSeed]
 
NEWLINE:
 
mul [RandSeedConst]
inc eax
mov [esi], dl
inc esi
loop NEWLINE
 
mov [FireSeed], eax
 
mov ecx, 0x2300-80
sub esi, ecx
xor edx, edx
xor eax, eax
 
FIRELOOP:
lodsb
 
cmp [type], ah
jnz notype1
mov dl, [esi + 1]
add eax, edx
mov dl, [esi]
add eax, edx
mov dl, [esi + 80]
jmp typedone
notype1:
 
; cmp [type],1
; jnz notype2
mov dl, [esi - 2]
; add eax, edx
; mov dl, [esi - 2]
; add eax, edx
lea eax, [eax + edx*2]
mov dl, [esi + 78]
; notype2:
 
; type 2 is never used
; cmp [type],2
; jnz notype3
; mov dl, [esi - 2]
; add eax, edx
; mov dl, [esi]
; add eax, edx
; mov dl, [esi + 80]
; notype3:
 
typedone:
add eax, edx
shr eax, 2
jz ZERO
dec eax
 
ZERO:
 
mov [esi - 81], al
loop FIRELOOP
 
mov al, 5 ; in this moment always high 24 bits of eax are zero!
mov ebx,[delay]
int 0x40
 
inc [calc]
cmp [calc], byte 2
jnz nodrw
 
pdraw:
 
mov byte [calc],ah ;byte 0
 
mov edi,ImageData
push edi ; pointer for sysfunction 7, draw image
add edi,[fcolor]
mov esi,FireScreen
xor edx,edx
 
newc:
xor eax, eax
lodsb
 
mov ecx,eax
shr eax,1
add cl,al
mov ch,al
 
mov [edi+0],ecx
mov [edi+3],ecx
mov [edi+6],ecx
mov [edi+9],cx
lea ebx, [edi+320*3]
mov [ebx+0],ecx
mov [ebx+3],ecx
mov [ebx+6],ecx
mov [ebx+9],ecx
 
add edi,12
inc edx
cmp edx,80
jnz nnl
xor edx,edx
add edi,320*3
nnl:
cmp esi,FireScreen+8000; 0x2000
jnz newc
 
mov al,7 ; display image
; high 24 bits of eax are zero!
pop ebx
mov ecx,4*80*65536+200
mov edx,1*65536+22
int 0x40
 
nodrw:
 
mov eax,11 ; check if os wants to talk to us
int 0x40
dec eax
jz red
cmp al, 3-1
jnz nob4
 
button: ; get button id
mov al,17
int 0x40
shr eax, 8
 
dec eax
jnz noclose
or eax,-1 ; close this program
int 0x40
noclose:
 
dec eax ; change fire type
jnz nob2
xor [type], 1
nob2:
 
dec eax ; change delay
jnz nob3
xor [delay], 1
nob3:
 
dec eax ; change color
jnz nob4
mov eax,[fcolor]
inc eax
; cmp al,2
; jbe fcok
jnp fcok
xor eax,eax
fcok:
mov [fcolor],eax
mov edi,ImageData
mov ecx,(320*600)/4