save_file: pusha bt dword [flags],0 jnc .not_shooted cmp byte [ed_buffer.1],0 je .no_file_name mov edi,sign_n_input call zstr_to_int mov [sign_n],al ; генерируем имя файла xor eax,eax mov ecx,1056 mov edi,file_name rep stosb ; заполняем нулями mov esi,ed_buffer.1 mov edi,file_name .next: mov ah,[esi] test ah,ah jz .str_end cmp ah,'*' jne .no_insert_number jmp .insert_number .no_insert_number: mov [edi],ah inc edi inc esi jmp .next .insert_number: bt word [ch6.flags],1 jnc @f mov eax,[cur_number] ;mov ebx,4 movsx ebx,byte [sign_n] push ebx call int_to_str pop ebx add edi,ebx @@: inc esi jmp .next .str_end: ; Вычисляем, сколько байт нужно прибавлять к каждой строке, ; чтобы следующая была выравнена на 4 байта. ; Результат помещаем в edi. xor edx,edx movzx eax,word [scr_buf.width] ; eax = ширина картинки lea eax,[eax*3] ; eax = байт на строку картинки movr ebx,4 ; ebx = 4 mov edi,ebx ; edi = 4 div ebx ; eax = байт на строку картинки div 4 edx = байт... mod 4 sub edi,edx ; edi = количество байт test edx,edx jnz @f xor edi,edi @@: ; выделяем память mov ecx,[scr_buf.end_ptr] mov [sf_buf.bmp_header],ecx add ecx,0x36 mov [sf_buf.bmp_area],ecx movsx ebx,word [scr_buf.width] movsx edx,word [scr_buf.height] ;imul ebx,edx lea ebx,[ebx*3] add ebx,edi imul ebx,edx add ecx,ebx mov [sf_buf.end],ecx add ecx,4096 xor ebx,ebx inc ebx movr eax,64 int 0x40 push edi ; заполняем структуру для сохранения файла mov edi,fs_struc mov [edi],dword 2 mov eax,[sf_buf.bmp_header] mov ebx,[sf_buf.end] sub ebx,eax mov [edi+12],ebx mov [edi+16],eax mov [edi+21],dword file_name ; заполняем заголовок bmp mov edi,[sf_buf.bmp_header] mov [edi],word 'BM' mov ebx,[sf_buf.end] sub ebx,[sf_buf.bmp_area] mov [edi+34],ebx ; размер картинки mov [edi+10],dword 0x36 ; размер заголовка add ebx,0x36 mov [edi+2],ebx ; размер файла mov [edi+14],dword 0x28 movzx eax,word [scr_buf.width] mov [edi+18],eax ; горизонтальный размер movzx eax,word [scr_buf.height] mov [edi+22],eax ; вертикльный размер mov [edi+26],word 1 mov [edi+28],word 24 ; копируем и переворачиваем ; mov esi,[scr_buf.ptr] ; mov edi,[sf_buf.bmp_area] ; mov edx,[sf_buf.end] ; sub edx,edi ; movsx ecx,word [scr_buf.height] ;.next_str: ;push ecx ; ; movsx ecx,word [scr_buf.width] ; lea ecx,[ecx*3] ; mov ebx,ecx ;.next_byte: ; mov ah,[esi+ebx] ; mov [edi+edx],ah ; dec ebx ; dec edx ; loop .next_byte ; movsx ecx,word [scr_buf.width] ; lea ecx,[ecx*3] ; add esi,ecx ;pop ecx ; loop .next_str mov esi,[scr_buf.end_ptr] mov edi,[sf_buf.bmp_area] movzx ecx,word [scr_buf.height] movzx ebx,word [scr_buf.width] lea ebx,[ebx*3] add edi,ebx .next_str: mov edx,ebx .next_pixel: mov ah,[esi] mov [edi],ah dec esi dec edi dec edx jnz .next_pixel lea edi,[2*ebx+edi] add edi,[esp] loop .next_str pop edi ; сохраняем draw_status saving mov eax,70 mov ebx,fs_struc int 0x40 test eax,eax jne save_error inc dword [cur_number] call draw_number draw_status saved_ok popa ret .no_file_name: draw_status no_file_name popa ret .not_shooted: draw_status not_shooted popa ret save_error: cmp al,5 jne @f mov [status.text],dword bad_file_name @@: cmp al,8 jne @f mov [status.text],dword disk_filled @@: cmp al,9 jne @f mov [status.text],dword bad_fat_table @@: cmp al,10 jne @f mov [status.text],dword ac_den @@: cmp al,11 jne @f mov [status.text],dword device_er @@: call send_draw_status popa ret