Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ;   RDsave для Kolibri (0.6.5.0 и старше)
  3. ;   Save RAM disk to a hard or floppy drive
  4. ;
  5. ; version:      1.3
  6. ; last update:  08/09/2010
  7. ; written by:   Marat Zakiyanov aka Mario79, aka Mario
  8. ; changes:      select path with OpenDialog,
  9. ;               keys 1,2,3,4 for select options
  10. ;---------------------------------------------------------------------
  11. ;   Mario79 2005
  12. ;   Heavyiron 12.02.2007
  13. ;   <Lrz>     11.05.2009 - для работы нужна системная библиотека box_lib.obj
  14. ;   Компилировать FASM'ом
  15. ;
  16. ;---------------------------------------------------------------------
  17. include 'lang.inc'
  18. include '../../../config.inc'           ;for nightbuild
  19. include '..\..\..\macros.inc'
  20.  
  21. appname equ 'RDsave '
  22. version equ '1.3'
  23.  
  24. use32        ; включить 32-битный режим ассемблера
  25. org      0x0         ; адресация с нуля
  26.  
  27.         db 'MENUET01'  ; 8-байтный идентификатор MenuetOS
  28.         dd 0x01      ; версия заголовка (всегда 1)
  29.         dd START             ; адрес первой команды
  30.         dd IM_END            ; размер программы
  31.         dd I_END             ; количество памяти
  32.         dd stacktop     ; адрес вершины стэка
  33.         dd 0x0       ; адрес буфера для параметров (не используется)
  34.         dd cur_dir_path
  35.  
  36. ;include '..\..\..\develop\examples\editbox\trunk\editbox.inc'
  37. include '../../../develop/libraries/box_lib/load_lib.mac'
  38. include '../../../develop/libraries/box_lib/trunk/box_lib.mac'
  39.         @use_library
  40.  
  41. ;use_edit_box
  42. ;al equ eax      ; \ decrease kpack'ed size
  43. ;purge mov       ; /
  44.  
  45. ;---------------------------------------------------------------------
  46. ;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
  47. ;---------------------------------------------------------------------
  48. align 4
  49. START:
  50.         mcall   68,11
  51.  
  52. load_libraries l_libs_start,end_l_libs
  53.  
  54.         cmp     eax,-1
  55.         jz      close
  56.  
  57.         mov     edi,filename_area
  58.         mov     esi,start_temp_file_name
  59.         xor     eax,eax
  60.         cld
  61. @@:
  62.         lodsb
  63.         stosb
  64.         test    eax,eax
  65.         jnz     @b
  66.  
  67.  
  68.         mov     edi,fname_buf
  69.         mov     esi,path4
  70.         xor     eax,eax
  71.         cld
  72. @@:
  73.         lodsb
  74.         stosb
  75.         test    eax,eax
  76.         jnz     @b
  77.  
  78. ;OpenDialog     initialisation
  79.         push    dword OpenDialog_data
  80.         call    [OpenDialog_Init]
  81.  
  82. ; prepare for PathShow
  83.         push    dword PathShow_data_1
  84.         call    [PathShow_prepare]
  85.  
  86.         mcall   40,100111b
  87. red:                    ; перерисовать окно
  88.         mcall   48,3,sc,sizeof.system_colors
  89.  
  90.         call    draw_window     ; вызываем процедуру отрисовки окна
  91. ;---------------------------------------------------------------------
  92. ;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
  93. ;---------------------------------------------------------------------
  94. still:
  95.         mcall 10
  96.  
  97.         dec     eax      ; перерисовать окно?
  98.         jz      red      ; если да - на метку red
  99.         dec     eax
  100.         jz      key
  101.         dec     eax
  102.         jz      button
  103.  
  104.         jmp     still
  105. ;---------------------------------------------------------------------
  106. button:
  107.         mcall   17      ; получить идентификатор нажатой кнопки
  108.         cmp     ah,1             ; кнопка с id=1("закрыть")?
  109.         jne     noclose
  110. close:
  111.         or       eax,-1          ; функция -1: завершить программу
  112.         mcall
  113.  
  114. noclose:
  115.         push    eax
  116.         call    clear_err
  117.         pop     eax
  118.         push    16
  119.         xor     ebx,ebx
  120.         inc     ebx     ; 16.1 = save to /FD/1
  121.         cmp     ah,2
  122.         je      doit
  123.         inc     ebx     ; 16.2 = save to /FD/2
  124.         cmp     ah,3
  125.         je      doit
  126.         pop     ebx
  127.         push    18
  128.         mov     bl,6    ; 18.6 = save to specified folder
  129.         mov     ecx, path3
  130.         cmp     ah,4
  131.         je      doit
  132.  
  133. ; invoke OpenDialog
  134.         push    dword OpenDialog_data
  135.         call    [OpenDialog_Start]
  136.         cmp     [OpenDialog_data.status],1
  137.         jne     still
  138.  
  139. ; prepare for PathShow
  140.         push    dword PathShow_data_1
  141.         call    [PathShow_prepare]
  142.  
  143.         call    draw_PathShow
  144.  
  145.         mov     ecx,fname_buf ;path4
  146. doit:
  147.         pop     eax
  148.         mcall
  149.         call    check_for_error
  150.         jmp     still
  151. ;---------------------------------------------------------------------
  152. key:
  153.         mcall   2
  154.         cmp     ah,0x31
  155.         jb      still
  156.         cmp     ah,0x34
  157.         ja      still
  158.         sub     ah,0x30
  159.         inc     ah
  160.         jmp     noclose
  161. ;---------------------------------------------------------------------
  162. check_for_error:                      ;Обработчик ошибок
  163.         mov     ecx,[sc.work_text]
  164.         mov     edx,ok
  165.         test    eax,eax
  166.         jz      print
  167.         mov     ecx,0xdd2222
  168.         add     edx,error3 - ok
  169.         dec     eax
  170.         dec     eax
  171.         jz      print
  172.         add     edx,error5 - error3
  173.         dec     eax
  174.         dec     eax
  175.         jz      print
  176.         add     edx,error8 - error5
  177.         dec     eax
  178.         dec     eax
  179.         dec     eax
  180.         jz      print
  181.         add     edx,error9 - error8
  182.         dec     eax
  183.         jz      print
  184.         add     edx,error10 - error9
  185.         dec     eax
  186.         jz      print
  187.         add     edx,error11 - error10
  188.         dec     eax
  189.         jz      print
  190.         add     edx,aUnknownError - error11
  191. print:
  192.         mov     eax,4                              ;надписи
  193.         mov     ebx,20 shl 16 + 148
  194.         or      ecx,0x80000000
  195.         mcall
  196.         ret
  197. ;---------------------------------------------------------------------
  198. clear_err:
  199.         mov     eax,13
  200.         mov     ebx,15 shl 16 + 240
  201.         mov     ecx,145 shl 16 +15
  202.         mov     edx,[sc.work]
  203.         mcall
  204.         ret
  205. ;---------------------------------------------------------------------
  206. draw_PathShow:
  207.         pusha
  208.         mcall   13,<8,172>,<110,15>,0xffffff
  209. ; draw for PathShow
  210.         push    dword PathShow_data_1
  211.         call    [PathShow_draw]
  212.         popa
  213.         ret
  214. ;---------------------------------------------------------------------
  215. ;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
  216. ;---------------------------------------------------------------------
  217. draw_window:
  218.         mcall   12,1    ; функция 12: сообщить ОС об отрисовке окна
  219.                         ; 1 - начинаем рисовать
  220.                                          ; СОЗДАЁМ ОКНО
  221.         xor     eax,eax                  ; функция 0 : определить и отрисовать окно
  222.         mov     ebx,200 shl 16 + 300     ; [x старт] *65536 + [x размер]
  223.         mov     ecx,200 shl 16 + 190     ; [y старт] *65536 + [y размер]
  224.         mov     edx,[sc.work]            ; цвет рабочей области  RRGGBB,8->color gl
  225.         or      edx,0x34000000
  226.         mov     edi,title                       ; ЗАГОЛОВОК ОКНА
  227.         mcall
  228.  
  229.         call    draw_PathShow
  230.  
  231. ;отрисовка теней кнопок
  232.         mcall   13,<194,60>,<34,15>,0x444444
  233.  
  234.         add     ecx,20 shl 16
  235.         mcall
  236.  
  237.         add     ecx,20 shl 16
  238.         mcall
  239.  
  240.         add     ecx,40 shl 16
  241.         mcall
  242. ;отрисовка кнопок
  243.         sub     ebx,4 shl 16
  244.         sub     ecx,4 shl 16
  245.         mcall   8,,,5,[sc.work_button] 
  246.  
  247.         sub     ecx,40 shl 16
  248.         dec     edx
  249.         mcall
  250.  
  251.         sub     ecx,20 shl 16
  252.         dec     edx
  253.         mcall
  254.  
  255.         sub     ecx,20 shl 16
  256.         dec     edx
  257.         mcall
  258. ; надписи
  259.         mov     ecx,[sc.work_text]
  260.         or      ecx,0x80000000
  261.         mcall   4,<45,12>,,label1
  262.  
  263.         mov     ebx,150 shl 16 + 35
  264.         mov     edx,path1
  265.         mcall
  266.  
  267.         add     ebx,20
  268.         mov     edx,path2
  269.         mcall
  270.  
  271.         mov     ebx,75 shl 16 + 75
  272.         mov     edx,path3
  273.         mcall
  274.  
  275.         mov     ebx,30 shl 16 + 97
  276.         mov     edx,label2
  277.         mcall
  278.  
  279.         mov     ebx,40 shl 16 + 135
  280.         mov     edx,label3
  281.         mcall
  282.  
  283.         mov     ecx,[sc.work_button_text]
  284.         or      ecx,0x80000000
  285.         mov     ebx,195 shl 16 + 35
  286.         mov     edx,save
  287.         mcall
  288.  
  289.         push    edx
  290.         mov     edx,key_help
  291.         call    key_help_correct
  292.         pop     edx
  293.  
  294.         add ebx,20
  295.         mcall
  296.  
  297.         push    edx
  298.         mov     edx,key_help+2
  299.         call    key_help_correct
  300.         pop     edx
  301.  
  302.         add ebx,20
  303.         mcall
  304.  
  305.         push    edx
  306.         mov     edx,key_help+4
  307.         call    key_help_correct
  308.         pop     edx
  309.  
  310.         mov     edx,select
  311.         add ebx,40
  312.         mcall
  313.  
  314.         mov     edx,key_help+6
  315.         call    key_help_correct
  316.  
  317.         mcall   12,2    ; функция 12: сообщить ОС об отрисовке окна
  318.                         ; 2, закончили рисовать
  319.         ret             ; выходим из процедуры
  320. ;---------------------------------------------------------------------
  321. key_help_correct:
  322.         push    ebx
  323.         ror     ebx,16
  324.         mov     bx,270
  325.         rol     ebx,16
  326.         pusha
  327.         mov     ecx,ebx
  328.         sub     ebx,3 shl 16
  329.         mov     bx,13
  330.         sub     cx,3
  331.         shl     ecx,16
  332.         mov     cx,13
  333.         mcall   13,,,0xffffff
  334.         popa
  335.         mcall  
  336.         pop     ebx
  337.         ret
  338. ;---------------------------------------------------------------------
  339. ;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
  340. ;---------------------------------------------------------------------
  341.  
  342. title   db appname,version,0
  343.  
  344. ;---------------------------------------------------------------------
  345. PathShow_data_1:
  346. .type                   dd 0    ;+0
  347. .start_y                dw 113  ;+4
  348. .start_x                dw 10   ;+6
  349. .font_size_x            dw 6    ;+8     ; 6 - for font 0, 8 - for font 1
  350. .area_size_x            dw 170  ;+10
  351. .font_number            dd 0    ;+12    ; 0 - monospace, 1 - variable
  352. .background_flag        dd 0    ;+16
  353. .font_color             dd 0x0  ;+20
  354. .background_color       dd 0x0  ;+24
  355. .text_pointer           dd fname_buf    ;+28
  356. .work_area_pointer      dd text_work_area       ;+32
  357. .temp_text_length       dd 0    ;+36
  358. ;---------------------------------------------------------------------
  359. if lang eq ru
  360. save            db 'Сохранить',0
  361. select          db ' Выбрать',0
  362. label1          db 'Выберите один из вариантов:',0
  363. label2          db 'Или выберите полный путь к файлу:',0
  364. label3          db 'Все папки должны существовать',0
  365. ok              db 'RAM-диск сохранен успешно',0
  366. error3          db 'Неизвестная файловая система',0
  367. error5          db 'Несуществующий путь',0
  368. error8          db 'Нет места на диске',0
  369. error9          db 'Таблица FAT разрушена',0
  370. error10         db 'Доступ запрещен',0
  371. error11         db 'Ошибка устройства',0
  372. aUnknownError   db 'Неизвестная ошибка',0
  373. ;---------------------------------------------------------------------
  374. else if lang eq et
  375. save            db 'Salvesta',0
  376. select          db ' Valige',0
  377. label1          db 'Vali №ks variantidest:',0
  378. label2          db 'Vїi valige teekond failinimeni:',0
  379. label3          db 'Kїik kataloogid peavad eksisteerima',0
  380. ok              db 'RAM-ketas salvestatud edukalt',0
  381. error3          db 'Tundmatu failis№steem',0
  382. error5          db 'Vigane teekond',0
  383. error8          db 'Ketas tфis',0
  384. error9          db 'FAT tabel vigane',0
  385. error10         db 'Juurdepффs keelatud',0
  386. error11         db 'Seadme viga',0
  387. aUnknownError   db 'Tundmatu viga',0
  388. ;---------------------------------------------------------------------
  389. else
  390. save            db '  Save',0
  391. select          db ' Select',0
  392. label1          db 'Select one of the variants:',0
  393. label2          db '  Or select full path to file:',0
  394. label3          db '    All folders must exist',0
  395. ok              db 'RAM-drive was saved successfully',0
  396. error3          db 'Unknown file system',0
  397. error5          db 'Incorrect path',0
  398. error8          db 'Disk is full',0
  399. error9          db 'FAT table corrupted',0
  400. error10         db 'Access denied',0
  401. error11         db 'Device error',0
  402. aUnknownError   db 'Unknown error',0
  403.  
  404. end if
  405. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  406. ;DATA данные
  407. ;Всегда соблюдать последовательность в имени.
  408. system_dir_Boxlib       db '/sys/lib/box_lib.obj',0
  409. system_dir_ProcLib      db '/sys/lib/proc_lib.obj',0
  410. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  411.  
  412. head_f_i:
  413. head_f_l        db 'System error',0
  414.  
  415. err_message_found_lib1  db 'box_lib.obj - Not found!',0
  416. err_message_found_lib2  db 'proc_lib.obj - Not found!',0
  417.  
  418. err_message_import1     db 'box_lib.obj - Wrong import!',0
  419. err_message_import2     db 'proc_lib.obj - Wrong import!',0
  420.  
  421. ;---------------------------------------------------------------------
  422. l_libs_start:
  423.  
  424. library01  l_libs system_dir_Boxlib+9, cur_dir_path, library_path, system_dir_Boxlib, \
  425. err_message_found_lib1, head_f_l, Box_lib_import, err_message_import1, head_f_i
  426.  
  427. library02  l_libs system_dir_ProcLib+9, cur_dir_path, library_path, system_dir_ProcLib, \
  428. err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i
  429.  
  430. end_l_libs:
  431. ;---------------------------------------------------------------------
  432. OpenDialog_data:
  433. .type                   dd 1    ; Save
  434. .procinfo               dd procinfo     ;+4
  435. .com_area_name          dd communication_area_name      ;+8
  436. .com_area               dd 0    ;+12
  437. .opendir_pach           dd temp_dir_pach        ;+16
  438. .dir_default_pach       dd communication_area_default_pach      ;+20
  439. .start_path             dd open_dialog_path     ;+24
  440. .draw_window            dd draw_window  ;+28
  441. .status                 dd 0    ;+32
  442. .openfile_pach          dd fname_buf    ;+36
  443. .filename_area          dd filename_area        ;+40
  444. .filter_area            dd Filter
  445. .x:
  446. .x_size                 dw 420 ;+48 ; Window X size
  447. .x_start                dw 10 ;+50 ; Window X position
  448. .y:
  449. .y_size                 dw 320 ;+52 ; Window y size
  450. .y_start                dw 10 ;+54 ; Window Y position
  451.  
  452. communication_area_name:
  453.         db 'FFFFFFFF_open_dialog',0
  454. open_dialog_path:
  455. if __nightbuild eq yes
  456.     db '/sys/MANAGERS/opendial',0
  457. else
  458.     db '/sys/File Managers/opendial',0
  459. end if
  460. communication_area_default_pach:
  461.         db '/hd0/1/kolibri',0
  462.  
  463. Filter:
  464. dd      Filter.end - Filter
  465. .1:
  466. db      'IMG',0
  467. db      'IMA',0
  468. .end:
  469. db      0
  470.  
  471. start_temp_file_name:   db 'kolibri.img',0
  472.  
  473. ;---------------------------------------------------------------------
  474. align 4
  475. ProcLib_import:
  476. OpenDialog_Init         dd aOpenDialog_Init
  477. OpenDialog_Start        dd aOpenDialog_Start
  478. ;OpenDialog__Version    dd aOpenDialog_Version
  479.         dd      0
  480.         dd      0
  481. aOpenDialog_Init        db 'OpenDialog_init',0
  482. aOpenDialog_Start       db 'OpenDialog_start',0
  483. ;aOpenDialog_Version    db 'Version_OpenDialog',0
  484. ;---------------------------------------------------------------------
  485. align 4
  486. Box_lib_import:
  487. ;init_lib               dd a_init
  488. ;version_lib            dd a_version
  489.  
  490.  
  491. ;edit_box_draw          dd aEdit_box_draw
  492. ;edit_box_key           dd aEdit_box_key
  493. ;edit_box_mouse         dd aEdit_box_mouse
  494. ;version_ed             dd aVersion_ed
  495.  
  496. ;check_box_draw         dd aCheck_box_draw
  497. ;check_box_mouse        dd aCheck_box_mouse
  498. ;version_ch             dd aVersion_ch
  499.  
  500. ;option_box_draw        dd aOption_box_draw
  501. ;option_box_mouse       dd aOption_box_mouse
  502. ;version_op             dd aVersion_op
  503.  
  504. ;scrollbar_ver_draw     dd aScrollbar_ver_draw
  505. ;scrollbar_ver_mouse    dd aScrollbar_ver_mouse
  506. ;scrollbar_hor_draw     dd aScrollbar_hor_draw
  507. ;scrollbar_hor_mouse    dd aScrollbar_hor_mouse
  508. ;version_scrollbar      dd aVersion_scrollbar
  509.  
  510. ;dinamic_button_draw    dd aDbutton_draw
  511. ;dinamic_button_mouse   dd aDbutton_mouse
  512. ;version_dbutton        dd aVersion_dbutton
  513.  
  514. ;menu_bar_draw          dd aMenu_bar_draw
  515. ;menu_bar_mouse         dd aMenu_bar_mouse
  516. ;menu_bar_activate      dd aMenu_bar_activate
  517. ;version_menu_bar       dd aVersion_menu_bar
  518.  
  519. ;FileBrowser_draw       dd aFileBrowser_draw
  520. ;FileBrowser_mouse      dd aFileBrowser_mouse
  521. ;FileBrowser_key        dd aFileBrowser_key
  522. ;Version_FileBrowser    dd aVersion_FileBrowser
  523.  
  524. PathShow_prepare        dd sz_PathShow_prepare
  525. PathShow_draw           dd sz_PathShow_draw
  526. ;Version_path_show      dd szVersion_path_show
  527.                         dd 0
  528.                         dd 0
  529.  
  530. ;a_init                 db 'lib_init',0
  531. ;a_version              db 'version',0
  532.  
  533. ;aEdit_box_draw         db 'edit_box',0
  534. ;aEdit_box_key          db 'edit_box_key',0
  535. ;aEdit_box_mouse        db 'edit_box_mouse',0
  536. ;aVersion_ed            db 'version_ed',0
  537.  
  538. ;aCheck_box_draw        db 'check_box_draw',0
  539. ;aCheck_box_mouse       db 'check_box_mouse',0
  540. ;aVersion_ch            db 'version_ch',0
  541.  
  542. ;aOption_box_draw       db 'option_box_draw',0
  543. ;aOption_box_mouse      db 'option_box_mouse',0
  544. ;aVersion_op            db 'version_op',0
  545.  
  546. ;aScrollbar_ver_draw    db 'scrollbar_v_draw',0
  547. ;aScrollbar_ver_mouse   db 'scrollbar_v_mouse',0
  548. ;aScrollbar_hor_draw    db 'scrollbar_h_draw',0
  549. ;aScrollbar_hor_mouse   db 'scrollbar_h_mouse',0
  550. ;aVersion_scrollbar     db 'version_scrollbar',0
  551.  
  552. ;aDbutton_draw          db 'dbutton_draw',0
  553. ;aDbutton_mouse         db 'dbutton_mouse',0
  554. ;aVersion_dbutton       db 'version_dbutton',0
  555.  
  556. ;aMenu_bar_draw         db 'menu_bar_draw',0
  557. ;aMenu_bar_mouse                db 'menu_bar_mouse',0
  558. ;aMenu_bar_activate     db 'menu_bar_activate',0
  559. ;aVersion_menu_bar      db 'version_menu_bar',0
  560.  
  561. ;aFileBrowser_draw      db 'FileBrowser_draw',0
  562. ;aFileBrowser_mouse     db 'FileBrowser_mouse',0
  563. ;aFileBrowser_key       db 'FileBrowser_key',0
  564. ;aVersion_FileBrowser   db 'version_FileBrowser',0
  565.  
  566. sz_PathShow_prepare     db 'PathShow_prepare',0
  567. sz_PathShow_draw        db 'PathShow_draw',0
  568. ;szVersion_path_show    db 'version_PathShow',0
  569. ;---------------------------------------------------------------------
  570.  
  571. path1   db '/fd/1/',0
  572. path2   db '/fd/2/',0
  573. path3   db '/hd0/1/kolibri.img',0
  574. path4   db '/hd0/1/kolibri/kolibri.img',0  ;для резервного сохранения
  575. ;---------------------------------------------------------------------
  576. key_help:
  577.         db '1',0
  578.         db '2',0
  579.         db '3',0
  580.         db '4',0
  581. ;---------------------------------------------------------------------
  582. IM_END:
  583. ;---------------------------------------------------------------------
  584. sc     system_colors
  585. mouse_dd        rd 1
  586. ;---------------------------------------------------------------------
  587. cur_dir_path:
  588.         rb 4096
  589. ;---------------------------------------------------------------------
  590. library_path:
  591.         rb 4096
  592. ;---------------------------------------------------------------------
  593. temp_dir_pach:
  594.         rb 4096
  595. ;---------------------------------------------------------------------
  596. fname_buf:
  597.         rb 4096
  598. ;---------------------------------------------------------------------
  599. procinfo:
  600.         rb 1024
  601. ;---------------------------------------------------------------------
  602. filename_area:
  603.         rb 256
  604. ;---------------------------------------------------------------------
  605. text_work_area:
  606.         rb 1024
  607. ;---------------------------------------------------------------------
  608. align 4
  609.         rb 4096
  610. stacktop:
  611. I_END:  ; метка конца программы
  612.