Subversion Repositories Kolibri OS

Rev

Rev 307 | Rev 1608 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
205 heavyiron 1
save_file:
2
pusha
1098 Lrz 3
        bt      dword [flags],0
4
        jnc     .not_shooted
205 heavyiron 5
 
1098 Lrz 6
        cmp     byte [ed_buffer.1],0
7
        je      .no_file_name
205 heavyiron 8
 
1098 Lrz 9
        mov     edi,sign_n_input
10
        call    zstr_to_int
11
        mov     [sign_n],al
205 heavyiron 12
 
1098 Lrz 13
        ; генерируем имя файла
14
        xor     eax,eax
15
        mov     ecx,1056
16
        mov     edi,file_name
17
        rep     stosb   ; заполняем нулями
205 heavyiron 18
 
1098 Lrz 19
        mov     esi,ed_buffer.1
20
        mov     edi,file_name
205 heavyiron 21
.next:
1098 Lrz 22
        mov     ah,[esi]
23
        test    ah,ah
24
        jz      .str_end
25
        cmp     ah,'*'
26
        jne     .no_insert_number
27
        jmp     .insert_number
205 heavyiron 28
.no_insert_number:
1098 Lrz 29
        mov     [edi],ah
30
        inc     edi
31
        inc     esi
32
        jmp     .next
205 heavyiron 33
.insert_number:
1098 Lrz 34
        bt      word [ch6.flags],1
35
        jnc     @f
36
        mov     eax,[cur_number]
37
        ;mov     ebx,4
38
        movsx   ebx,byte [sign_n]
39
        push    ebx
40
        call    int_to_str
41
        pop     ebx
42
        add     edi,ebx
205 heavyiron 43
@@:
1098 Lrz 44
        inc     esi
45
        jmp     .next
205 heavyiron 46
.str_end:
47
 
1098 Lrz 48
;;;;clean memory
49
 
50
        mov     ecx,dword [sf_buf.bmp_header]
51
        mov     ebx,13
52
        mov     eax,68
53
        mcall
54
 
307 Lrz 55
; Вычисляем, сколько байт нужно прибавлять к каждой строке,
56
; чтобы следующая была выравнена на 4 байта.
57
; Результат помещаем в edi.
1098 Lrz 58
 
59
        xor     edx,edx
60
        movzx   eax,word [scr_buf.width]  ; eax = ширина картинки
61
        lea     eax,[eax*3]               ; eax = байт на строку картинки
62
        mov     ebx,4                     ; ebx = 4
63
        mov     edi,ebx                   ; edi = 4
64
        div     ebx                       ; eax = байт на строку картинки div 4  edx = байт... mod 4
65
        sub     edi,edx                   ; edi = количество байт
66
        test    edx,edx
67
        jnz     @f
68
        xor     edi,edi
307 Lrz 69
@@:
70
 
1098 Lrz 71
        ; выделяем память
72
;        mov     ecx,[scr_buf.end_ptr]
73
;        mov     [sf_buf.bmp_header],ecx
205 heavyiron 74
 
1098 Lrz 75
;        add     ecx,0x36
76
;        mov     [sf_buf.bmp_area],ecx
77
        movsx   ebx,word [scr_buf.width]
78
        movsx   edx,word [scr_buf.height]
79
        ;imul    ebx,edx
80
        lea     ebx,[ebx*3]
81
        add     ebx,edi
82
        imul    ebx,edx
83
        mov     ecx,ebx
205 heavyiron 84
 
1098 Lrz 85
;        mov     [sf_buf.end],ecx
86
        add     ecx,0x36
87
        mov     ebx,12
88
        mov     eax,68
89
        mcall
205 heavyiron 90
 
1098 Lrz 91
        mov     [sf_buf.bmp_header],eax
92
        add     eax,0x36
93
        mov     [sf_buf.bmp_area],eax
94
        add     eax,ecx
95
        sub     eax,0x36
96
        mov     [sf_buf.end],eax
307 Lrz 97
 
1098 Lrz 98
;        push    edi
99
        ; заполняем структуру для сохранения файла
100
        mov     ebp,fs_struc
101
        mov     [ebp],dword 2
102
 
103
        mov     eax,[sf_buf.bmp_header]
104
        mov     ebx,[sf_buf.end]
105
        sub     ebx,eax
106
        mov     [ebp+12],ebx
107
        mov     [ebp+16],eax
108
        mov     [ebp+21],dword file_name
109
 
110
        ; заполняем заголовок bmp
111
        mov     ebp,[sf_buf.bmp_header]
112
        mov     [ebp],word 'BM'
113
        mov     ebx,[sf_buf.end]
114
        sub     ebx,[sf_buf.bmp_area]
115
        mov     [ebp+34],ebx    ; размер картинки
116
        mov     [ebp+10],dword 0x36     ; размер заголовка
117
        add     ebx,0x36
118
        mov     [ebp+2],ebx ; размер файла
119
        mov     [ebp+14],dword 0x28
120
        movzx   eax,word [scr_buf.width]
121
        mov     [ebp+18],eax ; горизонтальный размер
122
        movzx   eax,word [scr_buf.height]
123
        mov     [ebp+22],eax ; вертикльный размер
124
        mov     [ebp+26],word 1
125
        mov     [ebp+28],word 24
126
 
127
        ; сохраняем
128
        mov     esi,[scr_buf.ptr]
129
        mov     edi,[sf_buf.end]
130
        movzx   edx,word [scr_buf.height]
131
        movzx   ebx,word [scr_buf.width]
132
        lea     ebx,[ebx*3]
133
 
134
        test    ebx,11b
135
        jz      @f
136
        shr     ebx,2
137
        inc     ebx
138
        shl     ebx,2
139
@@:
140
        cld
141
align 4
205 heavyiron 142
.next_str:
1098 Lrz 143
        sub  edi,ebx
144
        mov ecx,ebx
145
        shr ecx,2
146
        rep movsd
147
        sub edi,ebx
148
        dec edx
149
        jnz .next_str
205 heavyiron 150
 
1098 Lrz 151
       draw_status saving
152
        mov     eax,70
153
        mov     ebx,fs_struc
154
        mcall
307 Lrz 155
 
1098 Lrz 156
        test    eax,eax
157
        jne     save_error
205 heavyiron 158
 
1098 Lrz 159
        inc     dword [cur_number]
160
        call    draw_number
205 heavyiron 161
 
1098 Lrz 162
        draw_status saved_ok
205 heavyiron 163
 
164
popa
165
ret
166
 
167
.no_file_name:
1098 Lrz 168
        draw_status no_file_name
205 heavyiron 169
popa
170
ret
171
 
172
.not_shooted:
1098 Lrz 173
        draw_status not_shooted
205 heavyiron 174
popa
175
ret
176
 
177
save_error:
1098 Lrz 178
        cmp     al,5
179
        jne     @f
180
        mov     [status.text],dword bad_file_name
205 heavyiron 181
@@:
1098 Lrz 182
        cmp     al,8
183
        jne     @f
184
        mov     [status.text],dword disk_filled
205 heavyiron 185
@@:
186
 
1098 Lrz 187
        cmp     al,9
188
        jne     @f
189
        mov     [status.text],dword bad_fat_table
205 heavyiron 190
@@:
191
 
1098 Lrz 192
        cmp     al,10
193
        jne     @f
194
        mov     [status.text],dword ac_den
205 heavyiron 195
@@:
196
 
1098 Lrz 197
        cmp     al,11
198
        jne     @f
199
        mov     [status.text],dword device_er
205 heavyiron 200
@@:
1098 Lrz 201
        call    send_draw_status
205 heavyiron 202
popa
203
ret