Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | Color db 0 |
2 | Counter db 0 |
||
3 | LastColor db 0 |
||
4 | SizeFile dd 0 |
||
5 | ;LitlCounter db 0 |
||
6 | ;LitlColor db 0 |
||
7 | save_image: |
||
8 | ;mov esi,addres_of_file_which_need_compress |
||
9 | ;mov edi,addres_where_need_to_save_compressed_file |
||
10 | ;mov ecx,size_of_file_which_need_compress |
||
11 | mov dl,byte [esi] |
||
12 | and dl,0xff |
||
13 | mov [LastColor],dl |
||
14 | mov [Counter],byte 1 |
||
15 | mov [SizeFile],0 |
||
16 | xor edx,edx |
||
17 | inc esi |
||
18 | NextColor:;читаем новый цвет из таблицы |
||
19 | mov dl,byte [esi] |
||
20 | and dl,0xf |
||
21 | mov [Color],dl |
||
22 | cmp dl,[LastColor] |
||
23 | jne Different |
||
24 | ;увеличиваем счетчик на 1 и смотрим его значение |
||
25 | inc [Counter] |
||
26 | cmp [Counter],16 |
||
27 | jl total |
||
28 | ;счетчик равен 16,значит нужно сохранить последовательность |
||
29 | dec [Counter] |
||
30 | jmp Different |
||
31 | ;Теперь текущий цвет стал старым,поэтому сохраним его как старый. |
||
32 | ;Обнулим (сделаем равным 1) счетчик повторений цвета(counter) |
||
33 | xor eax,eax |
||
34 | and [Counter],0 |
||
35 | mov al,[Color] |
||
36 | mov [LastColor],al |
||
37 | xor eax,eax |
||
38 | jmp total |
||
39 | Different:;прочитанный цвет не совпадает со старым |
||
40 | ;значит нужно сохранить старый и установить значения для нового |
||
41 | ; |
||
42 | ;сохраняем старый цвет |
||
43 | dec [Counter] |
||
44 | call SaveinByte |
||
45 | ;add [SizeFile],1 |
||
46 | inc edi |
||
47 | ;устанавливаем значения текущего цвета как старого |
||
48 | mov dl,[Color] |
||
49 | mov [LastColor],dl |
||
50 | mov [Counter],1 |
||
51 | total: |
||
52 | xor edx,edx |
||
53 | mov dl,[Color] |
||
54 | mov [LastColor],dl |
||
55 | inc esi |
||
56 | dec ecx |
||
57 | cmp ecx,0 |
||
58 | jne NextColor |
||
59 | ;счетчик может быть непустой,поэтому чтобы не терять байтов |
||
60 | ;сохраним значение счетчика и повторяемое значение |
||
61 | call SaveinByte |
||
62 | ret |
||
63 | SaveinByte:xor eax,eax |
||
64 | xor ebx,ebx |
||
65 | mov al,[Counter] |
||
66 | shl al,4 |
||
67 | mov bl,[LastColor] |
||
68 | or al,bl |
||
69 | mov [edi],al |
||
70 | inc [SizeFile] |
||
71 | ret |
||
72 | ;----------------------------------------------------------------------- |
||
73 | LitlCounter db 0 |
||
74 | LitlColor db 0 |
||
75 | unpakin: |
||
76 | xor edx,edx |
||
77 | NextLitlColor:xor edx,edx |
||
78 | mov dl,byte[esi] |
||
79 | xor eax,eax |
||
80 | xor ebx,ebx |
||
81 | mov al,dl |
||
82 | mov bl,al |
||
83 | shr al,4 |
||
84 | and al,0xf |
||
85 | mov [LitlCounter],al |
||
86 | and bl,0xf |
||
87 | mov [LitlColor],bl |
||
88 | xor eax,eax |
||
89 | xor ebx,ebx |
||
90 | ;------------------------------- |
||
91 | mov al,[LitlColor] |
||
92 | beg:mov [edi],al |
||
93 | add edi,1 |
||
94 | dec [LitlCounter] |
||
95 | cmp [LitlCounter],-1 |
||
96 | jne beg |
||
97 | inc esi |
||
98 | dec ecx |
||
99 | jnz NextLitlColor |
||
100 | ret |