Subversion Repositories Kolibri OS

Rev

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

  1. use32   ; включить 32-битный режим ассемблера
  2. org 0x0 ; адресация с нуля
  3.         db 'MENUET01'
  4.         dd 1,START,I_END,MEM,STACKTOP,0,cur_dir_path
  5.  
  6. include '../../../../proc32.inc'
  7. include '../../../../macros.inc'
  8. include '../../../../KOSfuncs.inc'
  9. include '../../../../develop/libraries/box_lib/load_lib.mac'
  10.  
  11. include 'deflate.inc'
  12. include 'debug.inc'
  13. include 'zlib.inc'
  14.  
  15. @use_library
  16.  
  17. align 4
  18. m0size dd 90 ;размер данных для упаковки
  19. m1size dd 1024 ;размер буфера данных для упаковки
  20. m2size dd 0 ;размер распакованных данных
  21.  
  22. align 4
  23. m0: ;данные для упаковки
  24. file 'zlib.txt'
  25.  
  26. align 4
  27. m1 rb 1024 ;буфер для упакованных данных
  28. m2 dd 0 ;указатель на распакованные данные
  29.  
  30. buf rb 1024 ;буфер для вывода сжатых данных в окно
  31. strategy dd Z_DEFAULT_STRATEGY ;стратегия сжатия
  32.  
  33. align 4
  34. START:
  35. load_libraries l_libs_start,load_lib_end
  36. mov     ebp,lib0
  37. .test_lib_open:
  38.         cmp     dword [ebp+ll_struc_size-4],0
  39.         jz      @f
  40.         mcall SF_TERMINATE_PROCESS ;exit not correct
  41. @@:
  42.         add ebp,ll_struc_size
  43.         cmp ebp,load_lib_end
  44.         jl .test_lib_open
  45.  
  46. ;       mcall SF_SYS_MISC, SSF_HEAP_INIT
  47.  
  48.         call test_code
  49.  
  50. align 4
  51. red:                    ; перерисовать окно
  52.     call draw_window    ; вызываем процедуру отрисовки окна
  53.  
  54. align 4
  55. still:
  56.     mcall SF_WAIT_EVENT
  57.     cmp  eax,1          ; перерисовать окно ?
  58.     je   red
  59.     cmp  eax,2          ; нажата клавиша ?
  60.     je   key
  61.     cmp  eax,3          ; нажата кнопка ?
  62.     je   button
  63.     jmp  still
  64.  
  65. align 4
  66. key:
  67.     mcall SF_GET_KEY
  68.  
  69.         cmp ah,178 ;Up
  70.         jne @f
  71.                 cmp dword[strategy],0
  72.                 jle @f
  73.                 dec dword[strategy]
  74.                 call test_code
  75.                 call draw_window
  76.         @@:
  77.         cmp ah,177 ;Down
  78.         jne @f
  79.                 cmp dword[strategy],4
  80.                 jge @f
  81.                 inc dword[strategy]
  82.                 call test_code
  83.                 call draw_window
  84.         @@:
  85.         cmp ah,176 ;Left
  86.         jne @f
  87.                 cmp dword[m0size],8
  88.                 jl @f
  89.                 dec dword[m0size]
  90.                 call test_code
  91.                 call draw_window
  92.         @@:
  93.         cmp ah,179 ;Right
  94.         jne @f
  95.                 inc dword[m0size]
  96.                 call test_code
  97.                 call draw_window
  98.         @@:
  99.     jmp  still          ; вернуться к началу цикла
  100.  
  101. ;---------------------------------------------------------------------
  102. align 4
  103. button:
  104.         mcall SF_GET_BUTTON
  105.  
  106.         cmp ah,1
  107.         jne still
  108.  
  109. .exit: ; конец программы
  110.         mcall SF_SYS_MISC,SSF_MEM_FREE,[m2]
  111.     mcall SF_TERMINATE_PROCESS
  112.  
  113. align 4
  114. draw_window:
  115.     mcall SF_REDRAW, SSF_BEGIN_DRAW
  116.     mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, sc,sizeof.system_colors
  117.     mov   edx, [sc.work]         ; цвет фона
  118.     or    edx, 0x33000000        ; и тип окна 3
  119.     mcall SF_CREATE_WINDOW, <50,600>, <50,180>, , ,title
  120.  
  121.         cStr edx,'Strategy:'
  122.         mcall SF_DRAW_TEXT, <10,10>,0x40f0,,9
  123.         cStr edx,'Input size:'
  124.         mcall , <10,20>,,,11
  125.         cStr edx,'Compr. size:'
  126.         mcall , <10,30>,,,12
  127.         cStr edx,'Outp. size:'
  128.         mcall , <10,120>,,,11
  129.  
  130.         mov edx,[strategy]
  131.         imul edx,12
  132.         add edx,capt_strateg
  133.         mcall , <90,10>,0,,12
  134.  
  135.         mcall SF_DRAW_NUMBER, (5 shl 16)+1, m0size, <90,20>
  136.         mcall , (5 shl 16)+1, m1size, <90,30>
  137.         mcall , (5 shl 16)+1, m2size, <90,120>
  138.         ;mov ecx,(1 shl 31)
  139.         mov esi,[m2size]
  140.         cmp esi,95
  141.         jle @f
  142.                 mov esi,95
  143.         @@:
  144.         mcall SF_DRAW_TEXT, <10,130>, 0, [m2]
  145.  
  146.         mov esi,7
  147.         mov ebx,(10 shl 16)+45 ;(x shl 16)+y
  148.         mov edx,buf
  149.         .cycle1: ;rows
  150.                 mcall SF_DRAW_TEXT,, (1 shl 31)
  151.                 add ebx,10
  152.                 add edx,32*3
  153.         dec esi
  154.         jnz .cycle1
  155.  
  156.     mcall SF_REDRAW, SSF_END_DRAW
  157.     ret
  158.  
  159. align 4
  160. test_code:
  161.         stdcall [deflateInit2], my_strm,\
  162.                 -1, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, [strategy]
  163. ;Стратегия:
  164. ; Z_DEFAULT_STRATEGY, Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED
  165.  
  166.         mov eax,my_strm
  167.         mov [eax+z_stream.next_in],m0 ;устанавливаем память для сжатия
  168.         mov ecx,[m0size]
  169.         mov [eax+z_stream.avail_in],ecx ;размер сжимаемыж данных
  170.         mov [eax+z_stream.next_out],m1 ;устанавливаем буфер для сжатия
  171.         mov dword[eax+z_stream.avail_out],1024 ;размер буфера для сжатия (максимум 16 Кб)
  172.  
  173.         ;вычисляем crc для сжимаемыж данных
  174.         stdcall [calc_crc32], 0,m0,ecx
  175.         mov edx,eax
  176.  
  177.         ;call print_z_struct
  178.  
  179.         stdcall [deflate], my_strm, Z_FINISH ;Z_NO_FLUSH
  180.  
  181.         ;call print_z_struct
  182.  
  183.         ;размер сжатых данных: 1024-[my_strm.avail_out]
  184.         mov ecx,1024
  185.         sub ecx,[my_strm.avail_out]
  186.         mov [m1size],ecx
  187.  
  188.         ;assert(ret != Z_STREAM_ERROR)
  189.         ;while (strm.avail_out == 0)
  190.  
  191.         ;ставим crc на сжатые данные
  192.         mov ecx,[m1size]
  193.         sub ecx,4
  194.         add ecx,m1
  195.         mov [ecx],edx
  196.  
  197.         ;формирование текста для отображения сжатых данных
  198.         ;в 16-ричном виде, нужно только для примера
  199.         mov ebx,[m1size]
  200.         mov esi,m1
  201.         mov edi,buf
  202.         mov edx,7
  203. align 4
  204.         .cycle1: ;rows
  205.         mov ecx,32
  206. align 4
  207.         .cycle0: ;cols
  208.                 stdcall hex_in_str, edi,[esi],2
  209.                 add edi,2
  210.                 inc esi
  211.                 mov byte[edi],' ' ;format space
  212.                 dec ebx
  213.                 jz .cycle1end ;if end file
  214.                 inc edi
  215.                 loop .cycle0
  216.         mov byte[edi-1],0
  217.         dec edx
  218.         jnz .cycle1
  219.         .cycle1end:
  220.         mov byte[edi],0
  221.  
  222.         ;удаление буфера с ранее распакованными данными
  223.         mcall SF_SYS_MISC,SSF_MEM_FREE,[m2]
  224.        
  225.         mov eax,[m1size]
  226.         sub eax,2 ;;; 2? or 6?
  227.         mov [m2size],eax
  228.         mov eax,m1
  229.         add eax,2
  230.         stdcall [deflate_unpack],eax,m2size
  231.         mov [m2],eax ;запись новых распакованных данных
  232.         mov ecx,[m0size] ;;; ???
  233.         mov [m2size],ecx
  234.         ret
  235.  
  236. align 4
  237. proc print_z_struct uses eax ebx
  238.         mov eax,my_strm
  239.         mov ebx,[eax+z_stream.state]
  240.         stdcall debug_fields,eax,sv_2
  241.         stdcall debug_fields,ebx,sv_3
  242.         ret
  243. endp
  244.  
  245. align 4
  246. sc system_colors
  247. align 4
  248. title db 'Zlib test, press on [Up], [Down], [Left], [Right]',0
  249.  
  250. align 4
  251. capt_strateg db '0) Default ',0
  252. db '1) Filtered',0
  253. db '2) Huffman ',0
  254. db '3) Rle     ',0
  255. db '4) Fixed   ',0
  256.  
  257. align 4
  258. import_archiver:
  259.         deflate_unpack dd sz_deflate_unpack
  260.         deflateInit             dd sz_deflateInit
  261.         deflateInit2    dd sz_deflateInit2
  262.         deflateReset    dd sz_deflateReset
  263.         deflate                 dd sz_deflate
  264.         deflateEnd              dd sz_deflateEnd
  265.         calc_crc32              dd sz_calc_crc32
  266.         dd 0,0
  267.         sz_deflate_unpack db 'deflate_unpack',0
  268.         sz_deflateInit db 'deflateInit',0
  269.         sz_deflateInit2 db 'deflateInit2',0
  270.         sz_deflateReset db 'deflateReset',0
  271.         sz_deflate db 'deflate',0
  272.         sz_deflateEnd db 'deflateEnd',0
  273.         sz_calc_crc32 db 'calc_crc32',0
  274.  
  275. ;--------------------------------------------------
  276. system_dir_0 db '/sys/lib/'
  277. lib_name_0 db 'archiver.obj',0
  278.  
  279. err_message_found_lib0 db 'Sorry I cannot load library archiver.obj',0
  280. head_f_i:
  281. head_f_l db 'System error',0
  282. err_message_import0 db 'Error on load import library archiver.obj',0
  283.  
  284. l_libs_start:
  285.         lib0 l_libs lib_name_0, cur_dir_path, library_path, system_dir_0,\
  286.                 err_message_found_lib0, head_f_l, import_archiver,err_message_import0, head_f_i
  287. load_lib_end:
  288. ;---------------------------------------------------------------------
  289.  
  290. align 16
  291. I_END:
  292. my_strm z_stream
  293.         rd 4096
  294. align 16
  295. STACKTOP:
  296. cur_dir_path:
  297.         rb 4096
  298. library_path:
  299.         rb 4096
  300. MEM:
  301.