kolibrios/programs/icon/trunk/icon.asm
Andrey Halyavin (halyavin) 065b8d32b2 programs sources added
git-svn-id: svn://kolibrios.org@31 a494cfbc-eb01-0410-851d-a64ba20cac60
2006-01-03 09:43:31 +00:00

535 lines
8.5 KiB
NASM

;
; ICON APPLICATION
;
; Compile with FASM for Menuet
;
; 22.02.05 Mario79
; 1) multi-threading
; 2)dinamic load BMP files
; 3)type on desktop with function 7
; 4)Image in memory only 8000h (32Kb) for all 48 icons.
; Old version ICON 5000h*48(decimal)=960Kb.
;
use32
org 0x0
db 'MENUET01'
dd 0x01
dd START
dd I_END
dd 0x8000
dd 0x8000
dd I_Param , 0x0
include 'lang.inc'
include 'macros.inc'
get_bg_info:
mov eax,39
mov ebx,4
int 0x40
mov [bgrdrawtype],eax
mov eax,39 ; get background size
mov ebx,1
int 0x40
mov [bgrxy],eax
mov ebx,eax
shr eax,16
and ebx,0xffff
mov [bgrx],eax
mov [bgry],ebx
ret
START:
load_icon_list:
mov eax,6
mov ebx,icon_lst
xor ecx,ecx
mov edx,-1
mov esi,icon_data
int 0x40
add eax,10
xor edx,edx
mov ebx,52
div ebx
mov [icons],eax
call get_bg_info
mov eax,14
int 0x40
add eax,0x00010001
mov [scrxy],eax
apply_changes:
mov edi,[icons]
mov esi,icon_data
mov ebp,0x5000 ; threads stack starting point
start_new:
movzx eax,byte [esi] ; x position
sub eax,'A' ;eax - number of letter
cmp eax,4
jg no_left
shl eax,6 ;imul eax,64
add eax,24
jmp x_done
no_left:
sub eax,9
shl eax,6 ;imul eax,64
sub eax,24+32-1
movzx ebx,word [scrxy+2]
add eax,ebx
x_done:
; mov [xpos],eax
mov [ebp-12],eax
movzx eax,byte [esi+1] ; y position
sub eax,'A' ; eax - number of letter
cmp eax,4
jg no_up
lea eax,[eax+4*eax]
shl eax,4 ;imul eax,80
add eax,34
jmp y_done
no_up:
sub eax,9
lea eax,[eax+4*eax]
shl eax,4 ;imul eax,80
movzx ebx,word [scrxy]
sub eax,32-1
add eax,ebx
y_done:
; mov [ypos],eax
mov [ebp-8],eax
mov eax,51
mov ebx,1
mov ecx,thread
; mov edx,[thread_stack]
mov edx,ebp
; sub edx,4
; mov [edx],esi
mov [ebp-4],esi
int 0x40
; add [thread_stack],0x100
add ebp,0x100
mov eax,5
mov ebx,1
wait_thread_start: ;wait until thread draw itself first time
cmp [create_thread_event],bl
jz wait_thread_end
int 0x40
jmp wait_thread_start
wait_thread_end:
dec [create_thread_event] ;reset event
add esi,50+2
dec edi
jnz start_new
or eax,-1
int 0x40
thread:
; pop ebp ;ebp - address of our icon
sub esp,12
mov ebp,esp
call draw_window
mov [create_thread_event],1
mov eax,40
mov ebx,010101b
int 0x40
jmp still
red:
call draw_window
still:
mov eax,10
int 0x40
cmp eax,1
je red
cmp eax,3
je button
cmp eax,5
jne still
call get_bg_info
mov eax,5
mov ebx,1
call draw_icon
jmp still
key:
mov eax,2
int 0x40
jmp still
button:
mov eax,17
int 0x40
; mcall 55,eax, , ,klick_music
mov ebx,[ebp+8]
add ebx,19
; lea ebx,[ebp+19]
mov eax,19
xor ecx,ecx
int 0x40
mcall 55,eax, , ,klick_music
jmp still
klick_music db 0x85,0x60,0x85,0x70,0x85,0x65,0
draw_picture:
mov [image],0x3000
xor ebx,ebx
xor ecx,ecx
mov esi,data_from_file+54+32*3*33-96
mov [pixpos],0
mov [pixpos2],32
newb:
push ebx
push ecx
cmp ebx,10
jb yesbpix
cmp ebx,42
jge yesbpix
cmp ecx,32
jg yesbpix
push esi
mov esi,data_from_file+54+32*3*33-96
sub esi,[pixpos]
dec [pixpos2]
cmp [pixpos2],0
jne no_correction_pixpos
add [pixpos],192
mov [pixpos2],32
no_correction_pixpos:
sub [pixpos],3
mov eax,[esi]
and eax,0xffffff
pop esi
cmp eax,0
je yesbpix
cmp eax,0xf5f5f5
je yesbpix
jmp nobpix
yesbpix:
stretch:
cmp [bgrdrawtype],dword 2
jne nostretch
; mov eax,[ypos]
mov eax,[ebp+4]
add eax,ecx
imul eax,[bgry]
cdq
movzx ebx,word [scrxy]
div ebx
imul eax,[bgrx]
push eax
; mov eax,[xpos]
mov eax,[ebp+0]
add eax,[esp+8]
imul eax,[bgrx]
cdq
movzx ebx,word [scrxy+2]
div ebx
add eax,[esp]
add esp,4
jmp notiled
nostretch:
cmp [bgrdrawtype],dword 1
jne notiled
; mov eax,[ypos]
mov eax,[ebp+4]
add eax,ecx
cdq
movzx ebx,word [bgrxy]
div ebx
mov eax,edx
imul eax,[bgrx]
push eax
; mov eax,[xpos]
mov eax,[ebp+0]
add eax,[esp+8]
movzx ebx,word [bgrxy+2]
cdq
div ebx
mov eax,edx
add eax,[esp]
add esp,4
notiled:
lea ecx,[eax+eax*2]
mov eax,39
mov ebx,2
int 0x40
nobpix:
pop ecx
pop ebx
mov edx,eax
mov eax,[image]
mov [eax],dl
inc eax
ror edx,8
mov [eax],dl
inc eax
ror edx,8
mov [eax],dl
inc eax
mov [image],eax
inc ebx
mov eax,[yw]
inc eax
cmp ebx,eax
jnz newb
xor ebx,ebx
inc ecx
mov eax,[ya]
add [pixpos],eax
cmp [top],1
jne notop
cmp ecx,38
je toponly
notop:
cmp ecx,52
jnz newb
toponly:
mov eax,7
mov ebx,0x3000
mov ecx,52 shl 16 + 52
xor edx,edx
int 0x40
mov [load_pic],0
ret
draw_text:
mov esi,[ebp+8]
add esi,33
; lea esi,[ebp+33]
push edi
mov edi,labelt
mov ecx,8
cld
rep movsb
pop edi
mov eax,labelt
news:
cmp [eax],byte 33
jb founde
inc eax
cmp eax,labelt+11
jb news
founde:
sub eax,labelt
mov [tl],eax
mov eax,[tl]
lea eax,[eax+eax*2] ; eax *= char_width/2
shl eax,16
mov ebx,27*65536+42
sub ebx,eax
mov eax,4
xor ecx,ecx ; black shade of text
mov edx,labelt
mov esi,[tl]
add ebx,1 shl 16 ;*65536+1
int 0x40
inc ebx
int 0x40
add ebx,1 shl 16
int 0x40
inc ebx
int 0x40
sub ebx,1 shl 16
int 0x40
dec ebx
sub ebx,1 shl 16
int 0x40
sub ebx,1 shl 16
dec ebx
int 0x40
dec ebx
add ebx,1 shl 16
int 0x40
inc ebx
mov ecx,0xffffff
int 0x40
mov [draw_pic],0
ret
load_icon_file:
mov ebx,[ebp+8]
add ebx,5
; lea ebx,[ebp+5]
mov eax,6
xor ecx,ecx
mov edx,-1
mov esi,data_from_file
int 0x40
ret
; for y = 32 to 0
; for x = 0 to 32
; if (pix[y][x]==0) then
; pix[y][x]=background(x,y);
; *********************************************
; ******* 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
xor eax,eax ; function 0 : define and draw window
; mov ebx,[xpos-2]
mov ebx,[ebp+0-2]
; mov ecx,[ypos-2]
mov ecx,[ebp+4-2]
add ebx,[yw] ; [x start] *65536 + [x size]
add ecx,51 ; [y start] *65536 + [y size]
mov edx,0x01000000 ; color of work area RRGGBB,8->color gl
int 0x40
mov eax,8 ; button
mov ebx,51
mov ecx,50
mov edx,1+20000000 ; or 0x40000000
int 0x40
mov eax,5
mov ebx,1
draw_icon:
xchg [load_pic],bl
test bl,bl
je draw_icon_end
int 0x40
jmp draw_icon
draw_icon_end:
call load_icon_file
mov eax,5
mov ebx,1
draw_icon_2:
xchg [draw_pic],bl
test bl,bl
je draw_icon_end_2
int 0x40
jmp draw_icon_2
draw_icon_end_2:
mov eax,9
mov ebx,process_table
mov ecx,-1
int 0x40
; mov eax,process_table
; add eax,34
; mov ebx,[eax]
; mov [xpos],ebx
; add eax,4
; mov ebx,[eax]
; mov [ypos],ebx
call draw_picture
call draw_text
mov eax,12
mov ebx,2
int 0x40
ret
icon_lst db 'ICON LST'
tl dd 8
yw dd 51
ya dd 0
;xpos dd 15
;ypos dd 185
draw_pic db 0
load_pic db 0
create_thread_event db 0
labelt:
db 'SETUP '
labellen:
bgrxy dd 0x0
scrxy dd 0x0
bgrdrawtype dd 0x0
pixpos dd 0
pixpos2 db 0
top dd 0
image dd 0x3000
;thread_stack dd 0x5000
icons dd 0
I_Param:
icon_data = I_END+0x1400
process_table = I_END+0x2400
I_END:
bgrx dd ?
bgry dd ?
data_from_file:
rb 54 ;header
raw_data:
rb 32*32