⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpegview.asm

📁 menuet os应用程序源代码,很多汇编写的应用程序
💻 ASM
字号:
;    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

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:



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -