kolibrios/programs/media/mv/trunk/mv.asm

1066 lines
22 KiB
NASM
Raw Normal View History

; Picture browser by lisovin@26.ru
; Modified by Ivan Poddubny - v.0.3
; Modified by Diamond - v.0.4
; Compile with FASM for Menuet
;******************************************************************************
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd IM_END ; size of image
dd 0x300000 ; memory for app
dd 0x300000 ; esp
dd temp_area , 0x0 ; I_Param , I_Icon
include 'lang.inc'
include 'macros.inc'
;******************************************************************************
START: ; start of execution
; check for parameters
cmp dword [temp_area],'BOOT'
jne .no_boot
call load_image
call convert
call background
or eax,-1
int 0x40
.no_boot:
cmp byte [temp_area],0
jz .no_param
mov edi,string ; clear string
mov ecx,256/4 ; length of a string
xor eax,eax ; symbol <0>
rep stosd
mov edi,temp_area ; look for <0> in temp_area
mov esi,edi
mov ecx,257 ; strlen
repne scasb
lea ecx, [edi-temp_area]
mov edi,string
rep movsb ; copy string from temp_area to "string" (filename)
call load_image
call convert
.no_param:
mov ecx,-1 ; get information about me
call getappinfo
mov edx,[process_info+30] ; ⥯<><E2A5AF><EFBFBD> <20> edx <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4A8AA><EFBFBD><EFBFBD>
mov ecx,eax
@@:
call getappinfo
cmp edx,[process_info+30]
je @f ; <20><20><><EFBFBD> PID ᮢ<><E1AEA2><EFBFBD> <20> PID <20><><EFBFBD><EFBFBD><EFBFBD><E0A8A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><>諨 ᥡ<>
dec ecx ; <20><><EFBFBD><EFBFBD><EFBFBD><>ਬ ᫥<><E1ABA5><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
jne @b ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A0A5><EFBFBD>, <20><20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
@@:
; ⥯<><E2A5AF><EFBFBD> <20> ecx <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov [process],ecx
draw_still:
call draw_window
still:
mov eax,10 ; wait here for event
int 0x40
dec eax
jz red
dec eax
jnz button
key: ; key
mov al,2
int 0x40
mov al,ah
cmp al,6
je kfile
cmp al,15
je kopen
cmp al,9
je kinfo
cmp al,2
je kbgrd
jmp still
red:
test byte [status], 4
jz draw_still
mov al, 18
mov ebx, 3
mov ecx, [process]
int 0x40
and byte [status], not 4
jmp still
button: ; 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:
cmp ah,2
jne nofile
kfile:
test byte [status], 1
jnz still
or byte [status], 1
mov eax,51
mov ebx,1
mov ecx,thread1
mov edx,0x29fff0
int 0x40
jmp still
nofile:
cmp ah,3
jne noopen
kopen:
mov ecx,-1
call getappinfo
mov ebx,dword [I_END+42]
mov ecx,dword [I_END+46]
add ebx,10*65536-15
add ecx,50*65536-55
mov edx,0xffffff
mov eax,13
int 0x40
call load_image
open1:
cmp word [I_END],word 'BM'
jne still
call convert
call drawimage
jmp still
noopen:
cmp ah,4
jne noinfo
kinfo:
test byte [status], 2
jnz still
or byte [status], 2
mov eax,51
mov ebx,1
mov ecx,thread2
mov edx,0x2afff0
int 0x40
jmp still
noinfo:
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
cmp ah,5
jne still
kbgrd:
test byte [status], 8
jnz still
or byte [status], 8
mov eax,51
mov ebx,1
mov ecx,thread3
mov edx,0x2bfff0
int 0x40
jmp still
;call background
getappinfo:
mov eax,9
mov ebx,process_info
int 0x40
ret
load_image:
mov eax, 70
mov ebx, fileinfo
int 0x40
mov eax,[I_END+18]
mov ebx,[I_END+22]
test ebx, ebx
jns @f
neg ebx
@@:
add eax,20
cmp eax,210
jae @f
mov eax,210
@@:
add ebx,58
cmp ebx,56
jae @f
mov ebx,56
@@:
mov [wnd_width],eax
mov [wnd_height],ebx
test [bWasDraw],1
jz @f
mov esi,ebx
mov edx,eax
mov ecx,-1
mov ebx,-1
mov eax,67
int 40h
@@:
ret
drawimage:
cmp word [I_END],word 'BM'
jne nodrawimage
mov eax,7
mov ebx,[soi]
mov ecx, dword [I_END+18-2]
mov cx, [I_END+22]
test cx, cx
jns @f
neg cx
@@:
mov edx,10*65536+50
int 0x40
nodrawimage:
ret
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
background:
cmp word [I_END],word 'BM'
jne @f
mov eax,15
mov ebx,1
mov ecx,[I_END+18] ; <20><><EFBFBD>
mov edx,[I_END+22] ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int 0x40
mov esi, ecx
imul esi, edx
lea esi, [esi+esi*2]
mov ebx,5
mov ecx,[soi]
xor edx,edx
;;; mov esi, ;640*480*3
int 0x40
dec ebx ;tile/stretch
mov ecx,dword [bgrmode]
int 0x40
dec ebx
int 0x40
@@:
ret
convert:
mov ecx, I_END
add ecx, [ecx+2]
mov [soi], ecx
mov ebp, [I_END+18]
lea ebp, [ebp*3] ; ebp = size of output scanline
mov eax, [I_END+22]
dec eax
mul ebp
add eax, ecx
mov edi, eax ; edi points to last scanline
mov esi, I_END
add esi, [esi+10]
mov ebx, I_END+54
mov edx, [I_END+22]
lea eax, [ebp*2]
mov [delta], eax
test edx, edx
jz .ret
jns @f
neg edx
and [delta], 0
mov edi, ecx
@@:
movzx eax, word [I_END+28]
cmp eax, 24
jz convert24
cmp eax, 8
jz convert8
cmp eax, 4
jz convert4
dec eax
jz convert1
.ret:
ret
convert24:
mov ecx, ebp
rep movsb
sub edi, [delta]
mov eax, ebp
neg eax
and eax, 3
add esi, eax
dec edx
jnz convert24
ret
convert8:
push edi
add [esp], ebp
.loopi:
xor eax, eax
lodsb
cmp dword [I_END+30], 1
jnz .nocompressed
.compressed:
mov ecx, eax
jecxz .special
lodsb
mov eax, [ebx+eax*4]
@@:
call putpixel
loop @b
jmp .loopi
.nocompressed:
mov eax, [ebx+eax*4]
call putpixel
.loopicont:
cmp edi, [esp]
jnz .loopi
.next:
pop edi
sub edi, [delta]
mov eax, ebp
and eax, 3
add esi, eax
dec edx
jnz convert8
ret
.special:
lodsb
test al, al
jz .next
cmp al, 2
jbe .end
mov ecx, eax
push ecx
@@:
xor eax, eax
lodsb
mov eax, [ebx+eax*4]
call putpixel
loop @b
pop ecx
and ecx, 1
add esi, ecx
jmp .loopi
.end:
pop edi
ret
convert4:
push edi
add [esp], ebp
.loopi:
xor eax, eax
lodsb
shr eax, 4
mov eax, [ebx+eax*4]
call putpixel
cmp edi, [esp]
jz .loopidone
mov al, [esi-1]
and eax, 0xF
mov eax, [ebx+eax*4]
stosd
dec edi
cmp edi, [esp]
jnz .loopi
.loopidone:
pop edi
sub edi, [delta]
call align_input
dec edx
jnz convert4
ret
convert1:
push edi
add [esp], ebp
.loopi:
lodsb
mov ecx, 8
.loopii:
add al, al
push eax
setc al
movzx eax, al
mov eax, [ebx+eax*4]
call putpixel
pop eax
cmp edi, [esp]
loopnz .loopii
jnz .loopi
pop edi
sub edi, [delta]
call align_input
dec edx
jnz convert1
ret
align_input:
push esi
sub esi, I_END
sub esi, [I_END+10]
neg esi
and esi, 3
add [esp], esi
pop esi
ret
putpixel:
push eax
stosw
shr eax, 16
stosb
pop eax
ret
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window:
or [bWasDraw],1
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,350 ; [x start] *65536 + [x size]
; mov ecx,400 ; [y start] *65536 + [y size]
mov ebx,100*65536
mov ecx,100*65536
add ebx,[wnd_width]
add ecx,[wnd_height]
mov edx,0x03ffffff ; color of work area RRGGBB,8->color gl
int 0x40
mov eax,8
mov ebx,10*65536+46
mov ecx,25*65536+20
mov edx,2
mov esi,0x780078
newbutton:
int 0x40
add ebx,48*65536
inc edx
cmp edx,6
jb newbutton
; 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,12 ; text length
int 0x40
mov ebx,14*65536+32
mov edx,buttext
mov esi,26
int 0x40
call drawimage
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
; DATA AREA
labelt:
db 'MeView v.0.4'
lsz buttext,\
en, ' FILE OPEN INFO BGRD',\
ru, ' <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> ',\
de, 'DATEI OEFNEN INFO HGRD'
thread1: ; start of thread1
call draw_window1
still1:
mov eax,10 ; wait here for event
int 0x40
cmp eax,1 ; redraw request ?
je thread1
cmp eax,2 ; key in buffer ?
je key1
cmp eax,3 ; button in buffer ?
je button1
jmp still1
key1: ; key
int 0x40
cmp ah,179
jne noright
mov eax,[pos]
cmp eax,41
ja still1
inc eax
mov [pos],eax
call drawstring
jmp still1
noright:
cmp ah,176
jne noleft
mov eax,[pos]
test eax,eax
je still1
dec eax
mov [pos],eax
call drawstring
jmp still1
noleft:
cmp ah,182 ;del
jne nodelet
call shiftback
call drawstring
jmp still1
nodelet:
cmp ah,8 ;zaboy
jne noback
mov eax,[pos]
test eax,eax
je still1
dec eax
mov [pos],eax
call shiftback
call drawstring
jmp still1
noback:
cmp ah,13
jne noenter
enter1:
mov al,byte ' '
mov edi,string
mov ecx,43
cld
repne scasb
dec edi
mov byte [edi],0
jmp close1
noenter:
cmp ah,27
jne noesc
jmp enter1
noesc:
cmp dword [pos],42
jae still1
mov edi,string
add edi,42
mov esi,edi
dec esi
mov ecx,42
sub ecx,[pos]
std
rep movsb
shr eax,8
mov esi,string
add esi,[pos]
mov byte [esi],al
inc dword [pos]
call drawstring
jmp still1
button1: ; button
mov eax,17 ; get id
int 0x40
cmp ah,1 ; button id=1 ?
jne noclose1
jmp enter1
close1:
bts dword [status],2
btr dword [status],0
mov eax,-1 ; close this program
int 0x40
noclose1:
cmp ah,2
jne nosetcur
mov eax,37
mov ebx,1
int 0x40
shr eax,16
sub eax,21
xor edx,edx
mov ebx,6
div ebx
mov [pos],eax
call drawstring
jmp still1
nosetcur:
jmp still1
shiftback:
mov edi,string
add edi,[pos]
mov esi,edi
inc esi
mov ecx,43
sub ecx,[pos]
cld
rep movsb
ret
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window1:
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,100*65536+300 ; [x start] *65536 + [x size]
mov ecx,100*65536+80 ; [y start] *65536 + [y size]
mov edx,0x03780078 ; color of work area RRGGBB,8->color gl
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,labelt1 ; pointer to text beginning
mov esi,labelt1.size ; text length
int 0x40
call drawstring
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
drawstring:
pusha
mov eax,8 ;invisible button
mov ebx,21*65536+258
mov ecx,40*65536+15
mov edx,0x60000002
int 0x40
mov eax,13 ;bar
mov edx,0xe0e0e0
int 0x40
push eax ;cursor
mov eax,6*65536
mul dword [pos]
add eax,21*65536+6
mov ebx,eax
pop eax
mov edx,0x6a73d0
int 0x40
mov eax,4 ;path
mov ebx,21*65536+44
xor ecx,ecx
mov edx,string
mov esi,43
int 0x40
popa
ret
; DATA AREA
lsz labelt1,\
en, 'File',\
ru, '<27><><EFBFBD><EFBFBD>',\
de, 'Datei'
thread2: ; start of info thread
call draw_window2
still2:
mov eax,10 ; wait here for event
int 0x40
cmp eax,1 ; redraw request ?
je thread2
cmp eax,2 ; key in buffer ?
je close2
cmp eax,3 ; button in buffer ?
je button2
jmp still2
button2: ; button
mov eax,17 ; get id
int 0x40
cmp ah,1 ; button id=1 ?
jne noclose2
close2:
btr dword [status],1
bts dword [status],2
mov eax,-1 ; close this program
int 0x40
noclose2:
jmp still2
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window2:
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,100*65536+330 ; [x start] *65536 + [x size]
mov ecx,100*65536+90 ; [y start] *65536 + [y size]
mov edx,0x03780078 ; color of work area RRGGBB,8->color gl
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,labelt2 ; pointer to text beginning
mov esi,labelt2.size ; text length
int 0x40
mov ebx,10*65536+30
mov edx,string
mov esi,43
int 0x40
mov edx,fitext
mov esi,14
add ebx,70*65536+10
followstring:
int 0x40
add ebx,10
add edx,esi
cmp ebx,80*65536+70
jbe followstring
mov eax,47
mov edx,200*65536+40
mov esi,ecx
mov ecx, [I_END+2]
call digitcorrect
int 0x40
add edx,10
mov ecx, [I_END+18]
call digitcorrect
int 0x40
add edx,10
mov ecx, [I_END+22]
call digitcorrect
int 0x40
add edx,10
movzx ecx,word [I_END+28]
call digitcorrect
int 0x40
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
digitcorrect:
xor ebx,ebx
mov bh,6
cmp ecx,99999
ja c_end
dec bh
cmp ecx,9999
ja c_end
dec bh
cmp ecx,999
ja c_end
dec bh
cmp ecx,99
ja c_end
dec bh
cmp ecx,9
ja c_end
dec bh
c_end:
bswap ebx
ret
; DATA AREA
lsz labelt2,\
en, 'File info',\
ru, '<27><><EFBFBD><EFBFBD><EFBFBD><E0ACA0><EFBFBD> <20><><E4A0A9>',\
de, 'Dateiinfo'
lsz fitext,\
en, 'FILE SIZE ',\
en, 'X SIZE ',\
en, 'Y SIZE ',\
en, 'BITS PER PIXEL',\
\
ru, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E4A0A9> ',\
ru, '<27><><EFBFBD> ',\
ru, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ',\
ru, '<27><><EFBFBD> <20><> <20><><EFBFBD>ᥫ ',\
\
de, 'FATEIGROESSE ',\
de, 'X GROESSE ',\
de, 'Y GROESSE ',\
de, 'BITS PER PIXEL'
thread3: ; start of bgrd thread
call draw_window3
still3:
mov eax,10 ; wait here for event
int 0x40
cmp eax,1 ; redraw request ?
je thread3
cmp eax,2 ; key in buffer ?
je key3
cmp eax,3 ; button in buffer ?
je button3
jmp still3
key3:
int 0x40
cmp ah,27
je close3
cmp ah,13
je kok
cmp ah,178 ;up
jne nofup
cmp dword [bgrmode],1
je fdn
fup:
dec dword [bgrmode]
jmp flagcont
nofup:
cmp ah,177 ;down
jne still3
cmp dword [bgrmode],2
je fup
fdn:
inc dword [bgrmode]
jmp flagcont
button3: ; button
mov eax,17 ; get id
int 0x40
cmp ah,1 ; button id=1 ?
jne noclose3
close3:
btr dword [status],3
bts dword [status],2
mov eax,-1 ; close this program
int 0x40
noclose3:
cmp ah,4
jne nook
kok:
call background
jmp close3
nook:
cmp ah,2
jb still3
cmp ah,3
ja still3
dec ah
mov byte [bgrmode],ah
flagcont:
call drawflags
jmp still3
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window3:
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,100*65536+200 ; [x start] *65536 + [x size]
mov ecx,100*65536+100 ; [y start] *65536 + [y size]
mov edx,0x03780078 ; color of work area RRGGBB,8->color gl
int 0x40
mov eax,8
mov ebx,70*65536+40
mov ecx,70*65536+20
mov edx,4
mov esi,0xac0000
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,labelt3 ; pointer to text beginning
mov esi,labelt3.size ; text length
int 0x40
add ebx,38*65536+20
mov ecx,0xddeeff
mov edx, bgrdtext
mov esi, bgrdtext.size
int 0x40
add ebx,40*65536+15
mov edx, tiled
mov esi, tiled.size
int 0x40
add ebx,15
mov edx, stretch
mov esi, stretch.size ;7
int 0x40
add ebx,18
mov edx, ok_btn
mov esi, ok_btn.size ;2
int 0x40
call drawflags
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
drawflags:
mov eax,8
mov ebx,70*65536+10
mov ecx,40*65536+10
mov edx,2
mov esi,0xe0e0e0
int 0x40
add ecx,15*65536
inc edx
int 0x40
mov eax,4
mov ebx,73*65536+42
xor ecx,ecx
mov edx,vflag
mov esi,1
cmp dword [bgrmode],1
je nodownflag
add ebx,15
nodownflag:
int 0x40
ret
; DATA AREA
status dd 0 ;bit0=1 if file thread is created
soi dd 0
delta dd 0
process dd 0
bWasDraw db 0
vflag: db 'x'
bgrmode: dd 1
wnd_width dd 210
wnd_height dd 53
lsz labelt3,\
en, 'Background set',\
ru, "<22><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><>",\
de, 'Hintergrund gesetzt'
lsz bgrdtext,\
en, 'SET AS BACKGROUND:',\
ru, '<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>:',\
de, 'ALS HINTERGRUND'
lsz tiled,\
en, 'TILED',\
ru, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',\
de, 'GEKACHELT'
lsz stretch,\
en, 'STRETCH',\
ru, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',\
de, 'GESTRECKT'
lsz ok_btn,\
en, 'Ok',\
ru, 'Ok',\
de, 'Ok'
pos: dd 6
fileinfo:
dd 0
dd 0
dd 0
dd 0x290000-I_END
dd I_END
string:
db '/rd/1/bgr.bmp',0
IM_END:
rb string+257-$
process_info:
temp_area:
rb 0x10000
I_END: