; 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 ; memsize=20000h org 0 PARAMS = memsize - 1024 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 include 'lang.inc' stack_size=4096 + 1024 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 ; Get some memory mov ecx,16384 call malloc mov [work_area],edi 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,5 ; offset for boarder add ebx,20 ; 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 ;****************************************************************************** set_default_colours: pusha mov eax,6 ; load default color map mov ebx,defcol mov ecx,0 mov edx,-1 mov esi,0x10000 int 0x40 mov eax,48 ; set default color map mov ebx,2 mov ecx,0x10000 mov edx,10*4 int 0x40 popa ret defcol db 'DEFAULT.DTP' boot_set_background: call set_default_colours mov ecx,memsize-fin-stack_size ; size mov edi,fin ; pointer call add_mem ; mark memory from fin to 0x100000-1024 as free ; Get some memory mov ecx,16384 ; get 16 Kb of memory call malloc ; returns pointer in edi mov [work_area],edi ; save it 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,12 mov ebx,1 int 0x40 ; Draw the window to the appropriate size - it may have ; been resized by the user mov eax, 0 cmp [winxs], ax jne dw_001 ; Give the screen some inital defaults mov ax, 400 mov [winxs], ax mov ax, 300 mov [winys], ax 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 bx, [winxo] shl ebx, 16 mov bx, [winxs] mov cx, [winyo] shl ecx, 16 mov cx, [winys] mov eax,0 ; DRAW WINDOW mov edx,[wcolor] add edx,0x02000000 mov esi,0x80557799 mov edi,0x00557799 int 0x40 mov eax,4 ; WINDOW LABEL mov ebx,8*65536+8 mov ecx,0x00ffffff mov edx,labelt mov esi,labellen-labelt int 0x40 mov eax,8 ; CLOSE BUTTON mov bx, [winxs] sub bx, 19 shl ebx, 16 add ebx, 12 mov ecx,5*65536+12 mov edx,1 mov esi,0x557799 int 0x40 ; draw status bar mov eax, 13 movzx ebx, word [winxs] sub ebx, 5 add ebx, 4*65536 mov cx, [winys] sub ecx, 19 shl ecx, 16 add ecx, 3 mov edx, 0x00557799 int 0x40 mov eax,8 ; BUTTON 2: filename mov ebx,4*65536+55 mov cx, [winys] sub cx, 16 shl ecx, 16 add ecx, 12 mov esi, 0x00557799 mov edx,2 int 0x40 mov eax,4 ; Button text movzx ebx, word [winys] sub ebx, 13 add ebx, 6*65536 mov ecx,0x00ffffff mov edx,setname mov esi,setnamelen-setname int 0x40 mov eax,8 ; BUTTON 3: set as background mov bx, [winxs] sub bx, 60 shl ebx, 16 mov bx,55 mov cx, [winys] sub cx, 16 shl ecx, 16 add ecx, 12 mov esi, 0x00557799 mov edx,3 int 0x40 mov eax,4 ; Button text movzx ebx, word [winxs] sub ebx, 60 shl ebx,16 mov bx, word [winys] sub bx,13 mov ecx,0x00ffffff 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] sub ebx, 7 add ebx, 4 * 65536 movzx ecx, word [winys] sub ecx, 39 add ecx, 20 * 65536 mov edx,0 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] sub ebx, 64+58 add ebx, 60*65536 mov cx, [winys] sub cx, 16 shl ecx, 16 add ecx, 12 mov edx,0xffffff int 0x40 mov eax,4 ; movzx ebx, word [winys] sub ebx, 14 add ebx, 60*65536 mov ecx,0x000000 mov edx,name_string mov esi,60 int 0x40 popa ret slideshow: test dword[file_dir],-1 jnz .exit test dword[jpeg_st],-1 jz .exit mov esi,name_string movzx ecx,byte[name_string.cursor] .l1: cmp byte[esi+ecx],'/' je .l2 loop .l1 .exit: ret .l2: mov byte[esi+ecx],0 call open mov byte[esi+ecx],'/' test eax,eax jz .exit mov dword[eax+file_handler.size],-1 ;directory size is always 0 mov [file_dir],eax inc cl mov [name_string.cursor],cl display_next: mov eax,[file_dir] test eax,eax jnz .l1 ret .l1: mov ecx,32 sub esp,ecx mov edi,esp call read cmp ecx,32 jnc .l11 .l10: add esp,32 mov eax,dword[file_dir] mov dword[file_dir],0 jmp close .l11: mov esi,esp movzx edi,byte[name_string.cursor] add edi,name_string lodsb cmp al,0 je .l10 cmp al,229 jne .l0 add esp,32 jmp display_next .l0: stosb mov cl,7 .l2: lodsb cmp al,32 jna .l3 stosb loop .l2 .l3: lea esi,[esp+8] mov al,'.' stosb mov cl,3 .l4: lodsb cmp al,32 jna .l5 stosb loop .l4 .l5: mov al,0 stosb cmp edi,name_string.end jc .l5 add esp,32 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 labelt db 'Jpegview v0.14' labellen: 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 work_area: dd 0 tcolor dd 0x000000 btcolor dd 0x224466+0x808080 name_string: db '/rd/1/jpegview.jpg',0 rb 100 .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: