; ; Presente.asm - Image slideshow for GIF, JPG and 24 bit BMP pictures ; ; Compile with FASM 1.60 or above ; ; by V.Turjanmaa ; use64 org 0x0 db 'MENUET64' ; Header identifier dq 0x01 ; Version dq START ; Start of code dq image_end ; Size of image dq 0xE00000 ; Memory for app dq 0x0f0000 ; Rsp dq 0x00 ; Prm dq 0x00 ; Icon ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; time_to_display equ 10 ; Time to display each image ( seconds ) files_to_display: ; List of files to display db '/FD/1/JPEGVIEW.JPG',0 db '/HD/1/PIANO.BMP',0 db '/HD/1/APPLE.GIF',0 files_to_display_end: background_color equ 0x000000 ; Background color for image ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; rex equ r8 rfx equ r9 rgx equ r10 rhx equ r11 rix equ r12 rjx equ r13 rkx equ r14 rlx equ r15 START: call draw_window still: call new_filename call load_picture call draw_picture mov rax , 23 ; Wait here for event mov rbx , time_to_display * 100 int 0x60 test rax , 0x1 ; Window redraw jnz window_event test rax , 0x2 ; Keyboard press jnz key_event test rax , 0x4 ; Button press jnz button_event jmp still current_display: dq files_to_display_end new_filename: mov rsi , [current_display] nfl0: inc rsi cmp [rsi-1],byte 0 je nfl2 cmp rsi , files_to_display_end-1 jb nfl1 mov rsi , files_to_display jmp nfl2 nfl1: jmp nfl0 nfl2: mov [current_display],rsi mov rdi , filename mov rcx , 100 cld rep movsb ret window_event: call draw_window jmp still key_event: mov rax , 0x2 ; Key down int 0x60 mov rax , 'Esc ' cmp rcx , rax jne no_esc mov rax , 512 int 0x60 no_esc: mov rax , 5 mov rbx , 50 int 0x60 mov rax , 0x2 ; Key up int 0x60 jmp still button_event: mov rax , 0x11 int 0x60 ; rax = status ; rbx = button id cmp rbx , 0x10000001 jne no_application_terminate_button mov rax , 512 int 0x60 no_application_terminate_button: jmp still filename: times 256 db 0 load_picture: mov rax , 58 mov rbx , 0 mov rcx , 0 mov rdx , 1 mov r8 , 0x100000-1024 mov r9 , filename int 0x60 cmp [0x100000-1024],dword 'GIF8' jne no_gif mov r15 , 1 ; gif call decode_external jmp picture_ready no_gif: cmp [0x100000-1024], word 0xD8FF jne no_jpg mov r15 , 2 ; jpg call decode_external jmp picture_ready no_jpg: cmp [0x100000-1024+0],word 'BM' jne lpl1 cmp [0x100000-1024+0x1c],dword 24 jne lpl1 mov eax , [0x100000-1024+0x12] mov [sizex],eax mov eax , [0x100000-1024+0x16] mov [sizey],eax mov rax , 58 mov rbx , 0 mov rcx , 0 mov rdx , -1 mov r8 , 0x100000 xor r9 , r9 mov r9d , [0x100000-1024+0xa] sub r8 , r9 mov r9 , filename int 0x60 call dwordcorrection call flipcorrection picture_ready: ret lpl1: mov rax , 12 mov rbx , 1 int 0x60 mov rax , 12 mov rbx , 2 int 0x60 mov [sizex],dword 800 mov [sizey],dword 600 call init_picture call draw_window mov rax , 4 mov rbx , loadfail mov rcx , 50 mov rdx , 50 mov r9 , 1 mov rsi , 0x000000 int 0x60 lpl2: ret loadfail: db 'Not a 24 bit BMP, JPG or GIF picture.',0 flipcorrection: ; Flip picture mov rsi , 0x100000 mov rdi , [sizey] dec rdi mov r15 , [sizex] imul rdi , r15 imul rdi , 3 add rdi , 0x100000 mov r10 , [sizey] shr r10 , 1 newline: push rdi push rsi mov rcx , r15 newflip: mov rax , [rsi] mov rbx , [rdi] mov [rdi],ax shr rax , 16 mov [rdi+2],al mov [rsi],bx shr rbx , 16 mov [rsi+2],bl add rsi , 3 add rdi , 3 loop newflip pop rsi pop rdi mov rax , r15 imul rax , 3 add rsi , rax sub rdi , rax dec r10 jnz newline ret dwordcorrection: mov rax , [sizex] mov rbx , rax shr rbx , 2 shl rbx , 2 cmp rax , rbx je nodwordcorrection sub rax , rbx mov rdi , 0x100000 mov rsi , rdi mov rdx , [sizey] newdc: push rsi push rdi mov rcx , [sizex] add rcx , [sizex] add rcx , [sizex] cld rep movsb pop rdi pop rsi add rdi , [sizex] add rdi , [sizex] add rdi , [sizex] add rsi , [sizex] add rsi , [sizex] add rsi , [sizex] add rsi , rax dec rdx jnz newdc nodwordcorrection: ret init_picture: mov rdi , 0x100000 mov rax , 0xffffffffffffffff mov rcx , 1280*1024*3 / 8 cld rep stosq ret check_window_pos: mov rax , 111 mov rbx , 1 int 0x60 mov r15 , rax mov [window_on_top],byte 1 mov rax , 26 mov rbx , 1 mov rcx , image_end mov rdx , 1024 int 0x60 mov r10 , [image_end+15*8] mov rax , 26 mov rbx , 2 mov rcx , image_end mov rdx , 1024 int 0x60 imul r10 , 8 cmp [image_end+r10],r15 je wot mov [window_on_top],byte 0 wot: mov rcx , r15 mov rax , 9 mov rbx , 2 mov rdx , image_end mov r8 , 256 int 0x60 ret draw_window: mov rax , 12 mov rbx , 1 int 0x60 mov rax , 0 mov rbx , 20 * 0x100000000 + 520 mov rcx , 20 * 0x100000000 + 420 mov rdx , 0xffffff mov r8 , 1 mov r9 , window_label mov r10 , 0 int 0x60 call check_window_pos mov rax , 12 mov rbx , 2 int 0x60 ret draw_picture: push rax rbx rcx rdx r8 r9 r10 r11 r12 r13 r14 r15 mov rax , 13 mov rbx , [image_end+16] mov rcx , [image_end+24] mov rdx , background_color int 0x60 mov r11 , [image_end+16] mov r12 , [image_end+24] cmp r11 , [sizex] jbe sizexfine mov r11 , [sizex] sizexfine: cmp r12 , [sizey] jbe sizeyfine mov r12 , [sizey] sizeyfine: mov rax , 7 mov rbx , r11 mov rcx , r12 mov rdx , 0x100000 mov r8 , [sizex] sub r8 , r11 imul r8 , 3 mov r9 , 0x1000000 mov r10 , 3 int 0x60 pop r15 r14 r13 r12 r11 r10 r9 r8 rdx rcx rbx rax ret param: db 'PARAM' decode_external: ; r15 - 1=gif , 2=jpg mov rax , 58 mov rbx , 0 mov rcx , 0 mov rdx , -1 mov r8 , 0x100000 mov r9 , filename int 0x60 ; GIF image cmp r15 , 1 jne no_gif_image mov rax , 256 mov rbx , rungif mov rcx , param jmp run_image_app no_gif_image: ; JPG image cmp r15 , 2 jne no_jpg_image mov rax , 256 mov rbx , runjpg mov rcx , param run_image_app: int 0x60 push rbx mov rax , 5 mov rbx , 10 int 0x60 ; My PID mov rax , 111 mov rbx , 1 int 0x60 mov [0x100000-8],rax ; My IPC area mov rax , 60 mov rbx , 1 mov rcx , 0x100000-16-16 mov rdx , 0x200000 int 0x60 ; Send picture mov rax , 60 mov rbx , 2 pop rcx mov rdx , 0x100000-8 mov r8 , 0x80000 add r8 , 8 int 0x60 mov rax , 0 mov [0x100000-16-16],rax mov rax , 16 mov [0x100000-8-16],rax mov rdi , 0x100000 mov rcx , 0x400000 / 8 mov rax , 0 cld rep stosq mov [0x100000],dword 123123 mov rdi , 0 waitmore: inc rdi cmp rdi , 400 ja notransformation mov rax , 5 mov rbx , 1 int 0x60 cmp [0x100000],dword 123123 je waitmore mov rax , [0x100000-16] mov rbx , [0x100000-8] mov [sizex],rax mov [sizey],rbx ret no_jpg_image: notransformation: ret rungif: db '/FD/1/GIFVIEW',0 runjpg: db '/FD/1/JPEGVIEW',0 window_label: db 'DRAW',0 ; Window label selected_color: dq 0 window_on_top: dq 0 sizex: dq 800 sizey: dq 600 image_end: