; IMGVIEW.ASM ; ; This program displays jpeg images. The window can be resized. ; ; Version 0.0 END OF 2003 ; Octavio Vega ; Version 0.1 7th March 2004 ; Mike Hibbett ( very small part! ) ; Version 0.11 7th April 2004 ; Ville Turjanmaa ( 'set_as_bgr' function ) ; Version 0.12 29th May 2004 ; Ivan Poddubny (correct "set_as_bgr"+parameters+boot+...) ; Version 0.12 30 de mayo 2004 ; Octavio Vega ; bugs correction and slideshow ; version 0.13 3 de junio 2004 ; Octavio Vega ; unos retoques ; version 0.14 10th August 2004 ; Mike Hibbett Added setting default colours ; version 0.15 24th August 2006 ; diamond (rewritten to function 70) ; memsize=20000h org 0 PARAMS = memsize - 1024 appname equ 'Jpegview ' version equ '0.15' use32 db 'MENUET01' ; 8 byte id dd 0x01 ; header version dd START ; start of code dd I_END ; size of image dd memsize ; memory for app dd memsize - 1024 ; esp dd PARAMS , 0x0 ; I_Param , I_Icon stack_size=4096 + 1024 include 'macros.inc' START: ; start of execution cmp [PARAMS], byte 0 jne check_parameters ; Calculate the 'free' memory available ; to the application, and create the malloc block from it .l1: mov ecx,memsize-fin-stack_size mov edi,fin call add_mem call colorprecalc ;inicializa tablas usadas para pasar de ybr a bgr call draw_window call read_string.rs_done still: push still mov ebx,100 ;1 second mov eax,23 ; wait here for event int 0x40 cmp eax,1 ; redraw request ? je draw_window cmp eax,2 ; key in buffer ? je read_string cmp eax,3 ; button in buffer ? je button jmp display_next button: ; BUTTON mov eax,17 int 0x40 cmp ah,3 je set_as_bgr2 cmp ah,2 je slideshow cmp ah,1 ; CLOSE PROGRAM jne close_program.exit close_program: mov eax,-1 int 0x40 .exit: ret ; Put a 'chunk' of the image on the window put_image: pushad lea ebp,[edx+eax+7] cmp [winxs],bp jc .l1 lea ebp,[ecx+ebx+20+2+17] cmp [winys],bp jc .l1 add eax,2 ; offset for boarder add ebx,2 ; offset for title bar push ax ; pox push bx ; pos push cx ; size push dx ; size pop ecx pop edx mov ebx,edi mov eax,7 int 40h ; Put image function .l1: popad ret ;****************************************************************************** check_parameters: cmp [PARAMS], dword "BOOT" ; received BOOT parameter -> goto handler je boot_set_background mov edi, name_string ; clear string with file name mov al, 0 mov ecx, 100 rep stosb mov ecx, 100 ; calculate length of parameter string mov edi, PARAMS repne scasb sub edi, PARAMS mov ecx, edi mov esi, PARAMS ; copy parameters to file name mov edi, name_string cld rep movsb jmp START.l1 ; return to beggining of the progra ;****************************************************************************** boot_set_background: mov ecx,memsize-fin-stack_size ; size mov edi,fin ; pointer call add_mem ; mark memory from fin to 0x100000-1024 as free call colorprecalc ; calculate colors mov esi,name_string call open test eax,eax jz close_program call jpeg_info mov dword [jpeg_st],ebp call set_as_bgr2 ; set wallpaper jmp close_program ; close the program right now ;****************************************************************************** ;****************************************************************************** set_as_bgr2: mov ebp,dword[jpeg_st] test ebp,ebp jz .end mov dword [ebp+draw_ptr],put_chunk_to_bgr call jpeg_display mov eax, 15 mov ebx, 1 mov ecx, [ebp + x_size] mov edx, [ebp + y_size] int 0x40 ; Stretch the image to fit mov eax, 15 mov ebx, 4 mov ecx, 2 int 0x40 mov eax, 15 mov ebx, 3 int 0x40 .end: ret ;****************************************************************************** put_chunk_to_bgr: pushad mov [x_pointer], edi mov esi, ecx imul esi, 3 mov [x_numofbytes], esi mov ecx, [ebp + x_size] imul ecx, ebx add ecx, eax imul ecx, 3 mov [x_offset], ecx mov [x_counter], edx mov eax, [ebp + x_size] imul eax, 3 mov [x_numofb2], eax .new_string: mov eax, 15 mov ebx, 5 mov ecx, [x_pointer] mov edx, [x_offset] mov esi, [x_numofbytes] int 0x40 mov eax, [x_numofbytes] add [x_pointer], eax mov eax, [x_numofb2] add [x_offset], eax dec [x_counter] jnz .new_string popad ret ;****************************************************************************** ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window: mov eax,48 mov ebx,3 mov ecx,sc mov edx,sizeof.system_colors int 0x40 mov eax,12 mov ebx,1 int 0x40 ; Draw the window to the appropriate size - it may have ; been resized by the user cmp [winxs], 0 jne dw_001 ; Give the screen some inital defaults mov [winxs], 400 mov [winys], 300 mov ax, 100 mov [winxo], ax mov [winyo], ax jmp dw_002 dw_001: mov eax, 9 mov ebx, memsize - 1024 mov ecx, -1 int 0x40 mov eax, [ebx + 34] mov [winxo], ax mov eax, [ebx + 38] mov [winyo], ax mov eax, [ebx + 42] mov [winxs], ax mov eax, [ebx + 46] mov [winys], ax dw_002: mov ebx, dword [winxo-2] mov bx, [winxs] mov ecx, dword [winyo-2] mov cx, [winys] xor eax,eax ; DRAW WINDOW mov edx,[sc.work] or edx,0x33000000 mov edi,header ; WINDOW LABEL int 0x40 mov eax,8 ; BUTTON 2: slideshow mov ebx,57 mov cx, [winys] sub cx, 39 shl ecx, 16 add ecx, 12 mov esi, [sc.work_button] mov edx,2 int 0x40 mov eax,4 ; Button text movzx ebx, word [winys] add ebx, 3 shl 16 - 36 mov ecx,[sc.work_button_text] mov edx,setname mov esi,setnamelen-setname int 0x40 mov eax,8 ; BUTTON 3: set as background mov bx, [winxs] sub bx, 65 shl ebx, 16 mov bx,55 mov cx, [winys] sub cx, 39 shl ecx, 16 add ecx, 12 mov esi, [sc.work_button] mov edx,3 int 0x40 mov eax,4 ; Button text movzx ebx, word [winxs] sub ebx, 63 shl ebx,16 mov bx, word [winys] sub bx,36 mov ecx,[sc.work_button_text] mov edx,setbgr mov esi,setbgrlen-setbgr int 0x40 call print_strings call load_image mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw int 0x40 ret ; Read in the image file name. read_string: movzx edi,byte[name_string.cursor] add edi,name_string mov eax,2 int 0x40 ; Get the key value shr eax,8 cmp eax,13 ; Return key ends input je .rs_done cmp eax,8 jnz .nobsl cmp edi,name_string je .exit dec edi mov [edi],byte 0;'_' dec byte[name_string.cursor] jmp print_strings .exit: ret .nobsl: cmp eax,31 jbe .exit cmp eax,97 jb .keyok sub eax,32 .keyok: mov ah,0 stosw cmp edi,name_string.end jnc print_strings inc byte[name_string.cursor] jmp print_strings .rs_done: call print_strings mov esi,name_string call open test eax,eax jz .exit call jpeg_info test ebp,ebp jz close xchg [jpeg_st],ebp call jpeg_close load_image: mov eax,13 ; clear picture area movzx ebx, word [winxs] add ebx, 1 shl 16 -10 movzx ecx, word [winys] sub ecx, 40 add ecx, 1 shl 16 mov edx,[sc.work] int 0x40 mov ebp,[jpeg_st] test ebp,ebp jz .exit mov dword [ebp+draw_ptr],put_image jmp jpeg_display .exit: ret print_strings: pusha mov eax,13 ; clear text area movzx ebx, word [winxs] add ebx, 59 shl 16 -125 mov cx, [winys] sub cx, 39 shl ecx, 16 add ecx, 12 mov edx,0xffffff int 0x40 mov eax,4 ; movzx ebx, word [winys] add ebx, 61 shl 16 - 37 mov ecx,0x000000 mov edx,name_string mov esi,60 int 0x40 popa ret slideshow: cmp [file_dir], 0 jnz .exit cmp [jpeg_st], 0 jz .exit mov esi, name_string movzx ecx, byte [name_string.cursor] .l1: cmp byte [esi+ecx], '/' jz .l2 loop .l1 .exit: ret .l2: mov byte [esi+ecx], 0 call open mov byte [esi+ecx], '/' test eax, eax jz .exit test byte [fileattr], 0x10 jz .exit mov [file_dir], eax inc ecx mov [name_string.cursor], cl display_next: mov ebx, [file_dir] test ebx, ebx jnz @f ret @@: mov byte [ebx], 1 mov byte [ebx+12], 1 mov dword [ebx+16], dirinfo mov eax, 70 int 0x40 mov eax, [file_dir] inc dword [eax+4] cmp ebx, 1 jz @f mov eax, [file_dir] and [file_dir], 0 jmp close @@: movzx edi, byte [name_string.cursor] add edi, name_string lea esi, [dirinfo+32+40] @@: lodsb stosb test al, al jnz @b mov ecx, name_string.end sub ecx, edi rep stosb call print_strings mov esi,name_string call open test eax,eax jz display_next call jpeg_info test ebp,ebp jnz .l6 call close jmp display_next .l6: mov dword[ebp+draw_ptr],put_image push ebp xchg [jpeg_st],ebp call jpeg_close pop ebp jmp jpeg_display include 'filelib.asm' include 'memlib.asm' include 'jpeglib.asm' ; DATA AREA wcolor dd 0x000000 header db appname,version,0 setname db 'SLIDESHOW' setnamelen: setbgr db ' BGR ' setbgrlen: x_pointer dd 0 x_offset dd 0 x_numofbytes dd 0 x_numofb2 dd 0 x_counter dd 0 winxo dw 0 winyo dw 0 winxs dw 0 winys dw 0 jpeg_st dd 0 file_dir dd 0 name_string: db '/rd/1/jpegview.jpg',0 rb 256 .end: .cursor: db 19 .cursor2: db 0 align 4 rgb16: db 0,4,8,13,17,21,25,29,34,38,42,46,50,55,59,63 rgb4: db 0,21,42,63 include 'jpegdat.asm' align 4 iniciomemoria: dd -(iniciomemoria+4),-(iniciomemoria+4),(iniciomemoria+4),.l1,0 .l1 dd 0 fin: I_END: sc system_colors fileattr: rb 40 dirinfo: rb 32+304