/programs/gifview/trunk/build_en.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix en >lang.inc |
@fasm gifview.asm gifview |
@pause |
/programs/gifview/trunk/build_ru.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix ru >lang.inc |
@fasm gifview.asm gifview |
@pause |
/programs/gifview/trunk/debug.inc |
---|
0,0 → 1,131 |
macro debug_print str |
{ |
local ..string, ..label |
jmp ..label |
..string db str,0 |
..label: |
pushf |
pushad |
mov edx,..string |
call debug_outstr |
popad |
popf |
} |
dps fix debug_print |
macro debug_print_dec arg |
{ |
pushf |
pushad |
if ~arg eq eax |
mov eax,arg |
end if |
call debug_outdec |
popad |
popf |
} |
dpd fix debug_print_dec |
;--------------------------------- |
debug_outdec: ;(eax - num, edi-str) |
push 10 ;2 |
pop ecx ;1 |
push -'0' ;2 |
.l0: |
xor edx,edx ;2 |
div ecx ;2 |
push edx ;1 |
test eax,eax ;2 |
jnz .l0 ;2 |
.l1: |
pop eax ;1 |
add al,'0' ;2 |
call debug_outchar ; stosb |
jnz .l1 ;2 |
ret ;1 |
;--------------------------------- |
debug_outchar: ; al - char |
pushf |
pushad |
mov cl,al |
mov eax,63 |
mov ebx,1 |
int 0x40 |
popad |
popf |
ret |
debug_outstr: |
mov eax,63 |
mov ebx,1 |
@@: |
mov cl,[edx] |
test cl,cl |
jz @f |
int 40h |
inc edx |
jmp @b |
@@: |
ret |
macro newline |
{ |
dps <13,10> |
} |
macro print message |
{ |
dps message |
newline |
} |
macro pregs |
{ |
dps "EAX: " |
dpd eax |
dps " EBX: " |
dpd ebx |
newline |
dps "ECX: " |
dpd ecx |
dps " EDX: " |
dpd edx |
newline |
} |
macro debug_print_hex arg |
{ |
pushf |
pushad |
if ~arg eq eax |
mov eax, arg |
end if |
call debug_outhex |
popad |
popf |
} |
dph fix debug_print_hex |
debug_outhex: |
; eax - number |
mov edx, 8 |
.new_char: |
rol eax, 4 |
movzx ecx, al |
and cl, 0x0f |
mov cl, [__hexdigits + ecx] |
pushad |
mcall 63, 1 |
popad |
dec edx |
jnz .new_char |
ret |
__hexdigits: |
db '0123456789ABCDEF' |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/gifview/trunk/gif_lite.inc |
---|
0,0 → 1,328 |
; GIF LITE v2.0 by Willow |
; Written in pure assembler by Ivushkin Andrey aka Willow |
; |
; This include file will contain functions to handle GIF image format |
; |
; Created: August 15, 2004 |
; Last changed: September 9, 2004 |
; Change COLOR_ORDER in your program |
; if colors are displayed improperly |
if ~ (COLOR_ORDER in <MENUETOS,OTHER>) |
; This message may not appear under MenuetOS, so watch... |
display 'Please define COLOR_ORDER: MENUETOS or OTHER',13,10 |
end if |
; virtual structure, used internally |
struc GIF_list |
{ |
.NextImg rd 1 |
.Left rw 1 |
.Top rw 1 |
.Width rw 1 |
.Height rw 1 |
} |
struc GIF_info |
{ |
.Left rw 1 |
.Top rw 1 |
.Width rw 1 |
.Height rw 1 |
} |
_null fix 0x1000 |
; **************************************** |
; FUNCTION GetGIFinfo - retrieve Nth image info |
; **************************************** |
; in: |
; esi - pointer to image list header |
; ecx - image_index (0...img_count-1) |
; edi - pointer to GIF_info structure to be filled |
; out: |
; eax - pointer to RAW data, or 0, if error |
GetGIFinfo: |
push esi ecx edi |
xor eax,eax |
jecxz .eloop |
.lp: |
mov esi,[esi] |
test esi,esi |
jz .error |
loop .lp |
.eloop: |
add esi,4 |
movsd |
movsd |
mov eax,esi |
.error: |
pop edi ecx esi |
ret |
; **************************************** |
; FUNCTION ReadGIF - unpacks GIF image |
; **************************************** |
; in: |
; esi - pointer to GIF file in memory |
; edi - pointer to output image list |
; eax - pointer to work area (MIN 16 KB!) |
; out: |
; eax - 0, all OK; |
; eax - 1, invalid signature; |
; eax >=8, unsupported image attributes |
; |
; ecx - number of images |
ReadGIF: |
push esi edi |
mov [.table_ptr],eax |
mov [.cur_info],edi |
xor eax,eax |
mov [.globalColor],eax |
mov [.img_count],eax |
inc eax |
cmp dword[esi],'GIF8' |
jne .er ; signature |
mov ecx,[esi+0xa] |
inc eax |
add esi,0xd |
mov edi,esi |
bt ecx,7 |
jnc .nextblock |
mov [.globalColor],esi |
call .Gif_skipmap |
.nextblock: |
cmp byte[edi],0x21 |
jne .noextblock |
inc edi |
cmp byte[edi],0xf9 ; Graphic Control Ext |
jne .no_gc |
add edi,7 |
jmp .nextblock |
.no_gc: |
cmp byte[edi],0xfe ; Comment Ext |
jne .no_comm |
inc edi |
.block_skip: |
movzx eax,byte[edi] |
lea edi,[edi+eax+1] |
cmp byte[edi],0 |
jnz .block_skip |
inc edi |
jmp .nextblock |
.no_comm: |
cmp byte[edi],0xff ; Application Ext |
jne .nextblock |
add edi,13 |
jmp .block_skip |
.noextblock: |
cmp byte[edi],0x2c ; image beginning |
jne .er |
inc [.img_count] |
inc edi |
mov esi,[.cur_info] |
add esi,4 |
xchg esi,edi |
movsd |
movsd |
push edi |
movzx ecx,word[esi] |
inc esi |
bt ecx,7 |
jc .uselocal |
push [.globalColor] |
mov edi,esi |
jmp .setPal |
.uselocal: |
call .Gif_skipmap |
push esi |
.setPal: |
movzx ecx,byte[edi] |
inc ecx |
mov [.codesize],ecx |
dec ecx |
pop [.Palette] |
lea esi,[edi+1] |
mov edi,[.table_ptr] |
xor eax,eax |
cld |
lodsb ; eax - block_count |
add eax,esi |
mov [.block_ofs],eax |
mov [.bit_count],8 |
mov eax,1 |
shl eax,cl |
mov [.CC],eax |
inc eax |
mov [.EOI],eax |
lea ecx,[eax-1] |
mov eax, _null shl 16 |
.filltable: |
stosd |
inc eax |
loop .filltable |
pop edi |
mov [.img_start],edi |
.reinit: |
mov edx,[.EOI] |
inc edx |
push [.codesize] |
pop [.compsize] |
call .Gif_get_sym |
cmp eax,[.CC] |
je .reinit |
call .Gif_output |
.cycle: |
movzx ebx,ax |
call .Gif_get_sym |
cmp eax,edx |
jae .notintable |
cmp eax,[.CC] |
je .reinit |
cmp eax,[.EOI] |
je .end |
call .Gif_output |
.add: |
push eax |
mov eax,[.table_ptr] |
mov [eax+edx*4],ebx |
pop eax |
cmp edx,0xFFF |
jae .cycle |
inc edx |
bsr ebx,edx |
cmp ebx,[.compsize] |
jne .noinc |
inc [.compsize] |
.noinc: |
jmp .cycle |
.notintable: |
push eax |
mov eax,ebx |
call .Gif_output |
push ebx |
movzx eax,bx |
call .Gif_output |
pop ebx eax |
jmp .add |
.er: |
pop edi |
jmp .ex |
.end: |
mov eax,[.cur_info] |
mov [eax],edi |
mov [.cur_info],edi |
add esi,2 |
xchg esi,edi |
.nxt: |
cmp byte[edi],0 |
jnz .continue |
inc edi |
jmp .nxt |
.continue: |
cmp byte[edi],0x3b |
jne .nextblock |
xor eax,eax |
stosd |
mov ecx,[.img_count] |
.ex: |
pop edi esi |
ret |
.Gif_skipmap: |
; in: ecx - image descriptor, esi - pointer to colormap |
; out: edi - pointer to area after colormap |
and ecx,111b |
inc ecx ; color map size |
mov ebx,1 |
shl ebx,cl |
lea ebx,[ebx*2+ebx] |
lea edi,[esi+ebx] |
ret |
.Gif_get_sym: |
mov ecx,[.compsize] |
push ecx |
xor eax,eax |
.shift: |
ror byte[esi],1 |
rcr eax,1 |
dec [.bit_count] |
jnz .loop1 |
inc esi |
cmp esi,[.block_ofs] |
jb .noblock |
push eax |
xor eax,eax |
lodsb |
test eax,eax |
jnz .nextbl |
mov eax,[.EOI] |
sub esi,2 |
add esp,8 |
jmp .exx |
.nextbl: |
add eax,esi |
mov [.block_ofs],eax |
pop eax |
.noblock: |
mov [.bit_count],8 |
.loop1: |
loop .shift |
pop ecx |
rol eax,cl |
.exx: |
xor ecx,ecx |
ret |
.Gif_output: |
push esi eax edx |
mov edx,[.table_ptr] |
.next: |
push word[edx+eax*4] |
mov ax,word[edx+eax*4+2] |
inc ecx |
cmp ax,_null |
jnz .next |
shl ebx,16 |
mov bx,[esp] |
.loop2: |
pop ax |
lea esi,[eax+eax*2] |
add esi,[.Palette] |
if COLOR_ORDER eq MENUETOS |
mov esi,[esi] |
bswap esi |
shr esi,8 |
mov [edi],esi |
add edi,3 |
else |
movsw |
movsb |
end if |
loop .loop2 |
pop edx eax esi |
ret |
.globalColor rd 1 |
.img_count rd 1 |
.cur_info rd 1 ; image table pointer |
.img_start rd 1 |
.codesize rd 1 |
.compsize rd 1 |
.bit_count rd 1 |
.CC rd 1 |
.EOI rd 1 |
.Palette rd 1 |
.block_ofs rd 1 |
.table_ptr rd 1 |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/gifview/trunk/gifview.asm |
---|
0,0 → 1,314 |
; GIF VIEWER FOR MENUET v1.0 |
; Written in pure assembler by Ivushkin Andrey aka Willow |
; |
; Uses GIF_LITE 2.0 |
; |
; Created: August 31, 2004 |
; Last changed: September 9, 2004 |
; |
; COMPILE WITH FASM |
WND_COLOR equ 0x02aabbcc |
; input line dimensions |
INP_X equ 10 shl 16+680 |
INP_Y equ 25 shl 16+16 |
INP_XY equ 15 shl 16+30 |
use32 |
org 0x0 |
db 'MENUET01' |
dd 0x01 |
dd START |
dd I_END |
dd 0x300000 |
dd 0x27fff0 |
dd filename ;0x0 |
dd 0x0 |
include 'lang.inc' |
include 'macros.inc' ; decrease code size (optional) |
;include '/hd/1/meos/debug.inc' |
include 'debug.inc' |
COLOR_ORDER equ MENUETOS |
DELAY equ 20 ; animation speed |
;include '/hd/1/gif/gif_lite.inc' |
include 'gif_lite.inc' |
START: |
cmp [filename],byte 0 |
jne openfile2 |
; jmp openfile2 |
openfile: |
and [entered],0 |
xor eax,eax |
mov [imgcount],eax |
mov esi,fn_input |
mov edi,filename |
mov ecx,[inp_pos] |
rep movsb |
mov byte[edi],al |
openfile2: |
mov eax,58 |
mov ebx,file_info |
int 0x40 |
cmp eax,6 |
je temp |
test eax,eax |
jnz ok2 |
temp: |
cmp ebx,64 |
jbe ok2 |
and [entered],0 |
xor eax,eax |
mov [imgcount],eax |
mov esi,filename |
mov edi,fn_input |
mov ecx,256 ;[filename_len] |
rep movsb |
mov edi,fn_input |
mov ecx,50 |
xor eax,eax |
repne scasb |
sub edi,fn_input |
dec edi |
mov [inp_pos],edi |
inc [inp_pos] |
; test eax,eax |
; jnz .ok2 |
; cmp ebx,64 |
; jbe .ok2 |
mov esi,workarea |
mov edi,Image |
mov eax,hashtable |
call ReadGIF |
test eax,eax |
jz .ok |
xor ecx,ecx |
.ok: |
mov [imgcount],ecx |
ok2: |
and dword[img_index],0 |
red: |
call draw_window |
still: |
mov ebx,DELAY |
mov eax,23 |
int 0x40 |
cmp eax,1 |
je red |
cmp eax,2 |
je key |
cmp eax,3 |
je button |
mov eax,[imgcount] |
cmp eax,1 |
je still |
inc [img_index] |
cmp eax,[img_index] |
jne redsub |
and [img_index],0 |
redsub: |
mov ecx,[img_index] |
call draw_subimage |
jmp still |
key: |
mov eax,2 |
int 0x40 |
cmp ah,13 |
je is_input |
jmp still |
button: |
mov eax,17 |
int 0x40 |
cmp ah,1 |
jne noclose |
_close: |
or eax,-1 |
int 0x40 |
noclose: |
is_input: ; simple input line with backspace feature |
inc [entered] ; sorry - no cursor |
wait_input: |
call draw_input |
mov eax,10 |
int 0x40 |
cmp eax,2 |
jne still |
mov edi,[inp_pos] |
mov eax,2 |
int 0x40 |
shr eax,8 |
cmp eax,27 |
je still |
cmp eax,13 |
je openfile |
cmp eax,8 |
je backsp |
mov [fn_input+edi],al |
inc [inp_pos] |
jmp wait_input |
backsp: |
test edi,edi |
jz wait_input |
dec [inp_pos] |
jmp wait_input |
jmp still |
;**************************************** |
;******* DRAW CONTENTS OF INPUT LINE **** |
;**************************************** |
draw_input: |
push edi |
cmp [entered],0 |
jne highlight |
mov esi,WND_COLOR |
jmp di_draw |
highlight: |
mov esi,0xe0e0e0 |
di_draw: |
mov eax,8 |
mov ebx,INP_X |
mov ecx,INP_Y |
mov edx,2 |
int 0x40 |
mov eax,4 |
mov ecx,0x00107a30 ; èà¨äâ 1 ¨ 梥â ( 0xF0RRGGBB ) |
mov ebx,INP_XY |
mov edx,fn_input |
mov esi,[inp_pos] |
int 0x40 |
pop edi |
ret |
; ********************************************* |
; ******* ******* |
; ********************************************* |
draw_window: |
mov eax,12 |
mov ebx,1 |
int 0x40 |
mov eax,0 |
mov ebx,50*65536+700 |
mov ecx,50*65536+500 |
mov edx,WND_COLOR |
mov esi,0x805080d0 |
mov edi,0x005080d0 |
int 0x40 |
mov eax,4 |
mov ebx,8*65536+8 |
mov ecx,0x10ddeeff |
mov edx,zagolovok |
mov esi,zag_konets-zagolovok |
int 0x40 |
mov eax,8 |
mov ebx,(700-19)*65536+12 |
mov ecx,5*65536+12 |
mov edx,1 |
mov esi,0x6688dd |
int 0x40 |
call draw_input |
xor ecx,ecx |
call draw_subimage |
cmp [imgcount],1 |
je .enddraw |
mov ecx,[img_index] |
call draw_subimage |
.enddraw: |
mov eax,12 |
mov ebx,2 |
int 0x40 |
ret |
draw_subimage: |
cmp [imgcount],0 |
jz .enddraw |
mov esi,Image |
mov edi,gif_inf |
call GetGIFinfo |
test eax,eax |
jz .enddraw |
movzx ebx,[gif_inf.Width] |
shl ebx,16 |
movzx ecx,[gif_inf.Height] |
add ecx,ebx |
mov ebx,eax |
movzx eax,[gif_inf.Top] |
movzx edx,[gif_inf.Left] |
shl edx,16 |
add edx,eax |
add edx,10 shl 16 +45 |
mov eax,7 |
int 0x40 |
.enddraw: |
ret |
; ¤¥áì 室ïâáï ¤ ë¥ ¯à®£à ¬¬ë: |
; ¨â¥àä¥©á ¯à®£à ¬¬ë ¤¢ãï§ëçë© - § ¤ ©â¥ ï§ëª ¢ macros.inc |
zagolovok: ; áâப § £®«®¢ª |
if lang eq ru |
db ' GIF' |
else |
db 'GIF VIEWER' |
end if |
zag_konets: ; ¨ ¥ñ ª®¥æ |
inp_pos dd inp_end-fn_input |
fn_input: |
; db '/hd/1/gif/smileys/sm100000.gif' |
db '/rd/1/meos.gif' |
; db '/hd/1/1/tex256.gif',0 |
; db '/rd/1/tex256.gif' |
inp_end: |
rb 256-(inp_end-fn_input) |
file_info: |
dd 0 |
dd 0 |
dd 0x100000/512;0x200000 |
dd workarea |
dd Image;0x100000 |
I_END: ; ª®¥æ ¯à®£à ¬¬ë |
filename: |
; db '/hd/1/gif/smileys/sm112000.gif',0 |
; db '/hd/1/gif/test.gif',0 |
; db '/hd/1/gif/explode1.gif',0 |
; db '/hd/1/gif/tapeta.gif',0 |
; db '/hd/1/gif/meos.gif',0 |
rb 256 |
;filename_len dd 0 |
entered rd 1 |
imgcount rd 1 |
img_index rd 1 |
gif_inf GIF_info |
hashtable rd 4096 |
workarea rb 0x100000 |
Image: |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/gifview/trunk/macros.inc |
---|
0,0 → 1,265 |
; new application structure |
macro meos_app_start |
{ |
use32 |
org 0x0 |
db 'MENUET01' |
dd 0x01 |
dd __start |
dd __end |
dd __memory |
dd __stack |
if used __params & ~defined __params |
dd __params |
else |
dd 0x0 |
end if |
dd 0x0 |
} |
MEOS_APP_START fix meos_app_start |
macro code |
{ |
__start: |
} |
CODE fix code |
macro data |
{ |
__data: |
} |
DATA fix data |
macro udata |
{ |
if used __params & ~defined __params |
__params: |
db 0 |
__end: |
rb 255 |
else |
__end: |
end if |
__udata: |
} |
UDATA fix udata |
macro meos_app_end |
{ |
align 32 |
rb 2048 |
__stack: |
__memory: |
} |
MEOS_APP_END fix meos_app_end |
; macro for defining multiline text data |
struc mstr [sstring] |
{ |
forward |
local ssize |
virtual at 0 |
db sstring |
ssize = $ |
end virtual |
dd ssize |
db sstring |
common |
dd -1 |
} |
; strings |
macro sz name,[data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if used name |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
macro lsz name,[lng,data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if (used name)&(lang eq lng) |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
; easy system call macro |
macro mpack dest, hsrc, lsrc |
{ |
if (hsrc eqtype 0) & (lsrc eqtype 0) |
mov dest, (hsrc) shl 16 + lsrc |
else |
if (hsrc eqtype 0) & (~lsrc eqtype 0) |
mov dest, (hsrc) shl 16 |
add dest, lsrc |
else |
mov dest, hsrc |
shl dest, 16 |
add dest, lsrc |
end if |
end if |
} |
macro __mov reg,a { ; mike.dld |
if ~a eq |
mov reg,a |
end if |
} |
macro mcall a,b,c,d,e,f { ; mike.dld |
__mov eax,a |
__mov ebx,b |
__mov ecx,c |
__mov edx,d |
__mov esi,e |
__mov edi,f |
int 0x40 |
} |
; optimize the code for size |
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp> |
macro add arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
inc arg1 |
else |
add arg1,arg2 |
end if |
else |
add arg1,arg2 |
end if |
} |
macro sub arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
dec arg1 |
else |
sub arg1,arg2 |
end if |
else |
sub arg1,arg2 |
end if |
} |
macro mov arg1,arg2 |
{ |
if (arg1 in __regs) & (arg2 eqtype 0) |
if (arg2) = 0 |
xor arg1,arg1 |
else if (arg2) = 1 |
xor arg1,arg1 |
inc arg1 |
else if (arg2) = -1 |
or arg1,-1 |
else if (arg2) > -128 & (arg2) < 128 |
push arg2 |
pop arg1 |
else |
mov arg1,arg2 |
end if |
else |
mov arg1,arg2 |
end if |
} |
macro struct name |
{ |
virtual at 0 |
name name |
sizeof.#name = $ - name |
end virtual |
} |
; structures used in MeOS |
struc process_information |
{ |
.cpu_usage dd ? ; +0 |
.window_stack_position dw ? ; +4 |
.window_stack_value dw ? ; +6 |
.not_used1 dw ? ; +8 |
.process_name rb 12 ; +10 |
.memory_start dd ? ; +22 |
.used_memory dd ? ; +26 |
.PID dd ? ; +30 |
.x_start dd ? ; +34 |
.y_start dd ? ; +38 |
.x_size dd ? ; +42 |
.y_size dd ? ; +46 |
.slot_state dw ? ; +50 |
rb (1024-52) |
} |
struct process_information |
struc system_colors |
{ |
.frame dd ? |
.grab dd ? |
.grab_button dd ? |
.grab_button_text dd ? |
.grab_text dd ? |
.work dd ? |
.work_button dd ? |
.work_button_text dd ? |
.work_text dd ? |
.work_graph dd ? |
} |
struct system_colors |
; constants |
; events |
EV_IDLE = 0 |
EV_TIMER = 0 |
EV_REDRAW = 1 |
EV_KEY = 2 |
EV_BUTTON = 3 |
EV_EXIT = 4 |
EV_BACKGROUND = 5 |
EV_MOUSE = 6 |
EV_IPC = 7 |
EV_STACK = 8 |
; event mask bits for function 40 |
EVM_REDRAW = 1b |
EVM_KEY = 10b |
EVM_BUTTON = 100b |
EVM_EXIT = 1000b |
EVM_BACKGROUND = 10000b |
EVM_MOUSE = 100000b |
EVM_IPC = 1000000b |
EVM_STACK = 10000000b |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |