Subversion Repositories Kolibri OS

Rev

Rev 1608 | Rev 6763 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. save_file:
  2. pusha
  3.         bt      dword [flags],0
  4.         jnc     .not_shooted
  5.  
  6.         cmp     byte [fname_buf],0
  7.         je      .no_file_name
  8.  
  9.         mov     edi,sign_n_input
  10.         call    zstr_to_int
  11.         mov     [sign_n],al
  12.  
  13.         ; генерируем имя файла
  14.         xor     eax,eax
  15.         mov     ecx,1056
  16.         mov     edi,file_name
  17.         rep     stosb   ; заполняем нулями
  18.  
  19.         mov     esi,fname_buf
  20.         mov     edi,file_name
  21. .next:
  22.         mov     ah,[esi]
  23.         test    ah,ah
  24.         jz      .str_end
  25.         cmp     ah,'*'
  26.         jne     .no_insert_number
  27.         jmp     .insert_number
  28. .no_insert_number:
  29.         mov     [edi],ah
  30.         inc     edi
  31.         inc     esi
  32.         jmp     .next
  33. .insert_number:
  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
  43. @@:
  44.         inc     esi
  45.         jmp     .next
  46. .str_end:
  47.  
  48. ;;;;clean memory
  49.  
  50.         mov     ecx,dword [sf_buf.bmp_header]
  51.         mov     ebx,13
  52.         mov     eax,68
  53.         mcall
  54.  
  55. ; Вычисляем, сколько байт нужно прибавлять к каждой строке,
  56. ; чтобы следующая была выравнена на 4 байта.
  57. ; Результат помещаем в edi.
  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
  69. @@:
  70.  
  71.         ; выделяем память
  72. ;        mov     ecx,[scr_buf.end_ptr]
  73. ;        mov     [sf_buf.bmp_header],ecx
  74.  
  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
  84.  
  85. ;        mov     [sf_buf.end],ecx
  86.         add     ecx,0x36
  87.         mov     ebx,12
  88.         mov     eax,68
  89.         mcall
  90.  
  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
  97.  
  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.         mov     ecx,ebx
  134.        
  135.         test    ebx,11b
  136.         jz      @f
  137.         shr     ebx,2
  138.         inc     ebx
  139.         shl     ebx,2
  140. @@:
  141.         mov     eax,ebx
  142.         sub     eax,ecx
  143.         cld
  144. align 4
  145. .next_str:
  146.         sub     edi,ebx
  147.         mov     ecx,ebx
  148.         shr     ecx,2
  149.         rep     movsd
  150.         sub     edi,ebx
  151.         sub     esi,eax
  152.         dec     edx
  153.         jnz     .next_str
  154.  
  155.        draw_status saving
  156.         mov     eax,70
  157.         mov     ebx,fs_struc
  158.         mcall
  159.  
  160.         test    eax,eax
  161.         jne     save_error
  162.  
  163.         inc     dword [cur_number]
  164.         call    draw_number
  165.  
  166.         draw_status saved_ok
  167.  
  168. popa
  169. ret
  170.  
  171. .no_file_name:
  172.         draw_status no_file_name
  173. popa
  174. ret
  175.  
  176. .not_shooted:
  177.         draw_status not_shooted
  178. popa
  179. ret
  180.  
  181. save_error:
  182.         cmp     al,5
  183.         jne     @f
  184.         mov     [status.text],dword bad_file_name
  185. @@:
  186.         cmp     al,8
  187.         jne     @f
  188.         mov     [status.text],dword disk_filled
  189. @@:
  190.  
  191.         cmp     al,9
  192.         jne     @f
  193.         mov     [status.text],dword bad_fat_table
  194. @@:
  195.  
  196.         cmp     al,10
  197.         jne     @f
  198.         mov     [status.text],dword ac_den
  199. @@:
  200.  
  201.         cmp     al,11
  202.         jne     @f
  203.         mov     [status.text],dword device_er
  204. @@:
  205.         call    send_draw_status
  206. popa
  207. ret