Subversion Repositories Kolibri OS

Rev

Rev 1111 | Rev 1228 | 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. ;  
  4. ;   Mario79 2005
  5. ;   Heavyiron 12.02.2007
  6. ;   <Lrz>     11.05.2009 - для работы нужна системная библиотека box_lib.obj
  7. ;   Компилировать FASM'ом
  8. ;
  9. ;---------------------------------------------------------------------
  10. include 'lang.inc'
  11. include '..\..\..\macros.inc'
  12.  
  13. appname equ 'RDsave '
  14. version equ '1.2'
  15.  
  16.   use32              ; включить 32-битный режим ассемблера
  17.   org    0x0         ; адресация с нуля
  18.  
  19.   db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
  20.   dd     0x01        ; версия заголовка (всегда 1)
  21.   dd     START       ; адрес первой команды
  22.   dd     I_END       ; размер программы
  23.   dd     I_END       ; количество памяти
  24.   dd     I_END       ; адрес вершины стэка
  25.   dd     0x0         ; адрес буфера для параметров (не используется)
  26.   dd cur_dir_path
  27.  
  28. ;include '..\..\..\develop\examples\editbox\trunk\editbox.inc'
  29. include '../../../develop/libraries/box_lib/load_lib.mac'
  30. include '../../../develop/libraries/box_lib/asm/trunk/editbox_ex.mac'
  31.         @use_library
  32.  
  33. ;use_edit_box
  34. al equ eax      ; \ decrease kpack'ed size
  35. purge mov       ; /
  36.  
  37. ;---------------------------------------------------------------------
  38. ;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
  39. ;---------------------------------------------------------------------
  40. align 4
  41. START:
  42. sys_load_library  library_name, cur_dir_path, library_path, system_path, \
  43. err_message_found_lib, head_f_l, myimport, err_message_import, head_f_i
  44.         cmp     eax,-1
  45.         jz      close
  46.  
  47.    mov eax, 40
  48.    mov ebx, 100111b
  49.    mcall
  50. red:                    ; перерисовать окно
  51.     call draw_window    ; вызываем процедуру отрисовки окна
  52.  
  53. ;---------------------------------------------------------------------
  54. ;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
  55. ;---------------------------------------------------------------------
  56.  
  57. still:
  58.     mcall 10
  59.  
  60.     dec  eax             ; перерисовать окно?
  61.     jz   red             ; если да - на метку red
  62.     dec  eax
  63.     jz   key
  64.     dec  eax
  65.     jz   button
  66.  
  67. mouse:
  68. ;        mouse_edit_box editbox
  69.         push    dword editbox
  70.         call    [edit_box_mouse]
  71.  
  72.         jmp     still
  73.    
  74. button:
  75.     mov  al,17           ; получить идентификатор нажатой кнопки
  76.     mcall
  77.  
  78.     cmp  ah,1            ; кнопка с id=1("закрыть")?
  79.     jne  noclose
  80. close:
  81.     or   eax,-1          ; функция -1: завершить программу
  82.     mcall
  83.  
  84. noclose:
  85.         push    eax
  86.         call    clear_err
  87.         pop     eax
  88.         push    16
  89.         xor     ebx, ebx
  90.         inc     ebx     ; 16.1 = save to /FD/1
  91.         cmp     ah, 2
  92.         je      doit
  93.         inc     ebx     ; 16.2 = save to /FD/2
  94.         cmp     ah, 3
  95.         je      doit
  96.         pop     ebx
  97.         push    18
  98.         mov     bl, 6   ; 18.6 = save to specified folder
  99.         mov     ecx, path3
  100.         cmp     ah, 4
  101.         je      doit
  102.         mov     ecx, path4
  103. doit:
  104.         pop     eax
  105.         mcall
  106.         call    check_for_error
  107.         jmp     still
  108.  
  109. key:        
  110.     mov  al,2
  111.     mcall
  112. ;    key_edit_box editbox
  113.         push    dword editbox
  114.         call    [edit_box_key]
  115.  
  116.     jmp  still
  117.  
  118.  
  119. check_for_error:                      ;Обработчик ошибок
  120.         mov     ecx, [sc.work_text]
  121.         mov     edx, ok
  122.         test    eax, eax
  123.         jz      print
  124.         mov     ecx, 0xdd2222
  125.         add     edx, error3 - ok
  126.         dec     eax
  127.         dec     eax
  128.         jz      print
  129.         add     edx, error5 - error3
  130.         dec     eax
  131.         dec     eax
  132.         jz      print
  133.         add     edx, error8 - error5
  134.         dec     eax
  135.         dec     eax
  136.         dec     eax
  137.         jz      print
  138.         add     edx, error9 - error8
  139.         dec     eax
  140.         jz      print
  141.         add     edx, error10 - error9
  142.         dec     eax
  143.         jz      print
  144.         add     edx, error11 - error10
  145.         dec     eax
  146.         jz      print
  147.         add     edx, aUnknownError - error11
  148.  
  149.  print:
  150.     mov eax,4                              ;надписи
  151.     mov ebx,20 shl 16 + 148
  152.     or  ecx,0x80000000
  153.     mcall
  154.     ret
  155.  
  156. clear_err:
  157.     mov eax,13
  158.     mov ebx,15 shl 16 + 240
  159.     mov ecx,145 shl 16 +15
  160.     mov edx,[sc.work]
  161.     mcall
  162.     ret
  163.  
  164. ;---------------------------------------------------------------------
  165. ;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
  166. ;---------------------------------------------------------------------
  167.  
  168. draw_window:
  169.  
  170.    mov  eax,48
  171.    mov  ebx,3
  172.    mov  ecx,sc
  173.    mov  edx,sizeof.system_colors
  174.    mcall
  175.  
  176.    mov eax,12                            ; функция 12: сообщить ОС об отрисовке окна
  177.    mov bl,1                              ; 1 - начинаем рисовать
  178.    mcall
  179.  
  180.                                          ; СОЗДАЁМ ОКНО
  181.    xor eax,eax                           ; функция 0 : определить и отрисовать окно
  182.    mov ebx,200 shl 16 + 270              ; [x старт] *65536 + [x размер]
  183.    mov ecx,200 shl 16 + 190              ; [y старт] *65536 + [y размер]
  184.    mov edx,[sc.work]                     ; цвет рабочей области  RRGGBB,8->color gl
  185.    or  edx,0x34000000
  186.    mov edi,title                        ; ЗАГОЛОВОК ОКНА
  187.    mcall
  188.  
  189.         push    dword editbox
  190.         call    [edit_box_draw]
  191.  
  192. ;draw_edit_box editbox                   ;рисование edit box
  193.  
  194.    mov al,13                            ;отрисовка теней кнопок
  195.    mov ebx,194 shl 16 + 60
  196.    mov ecx,34 shl 16 +15
  197.    mov edx,0x444444
  198.    mcall
  199.  
  200.    add ecx,20 shl 16
  201.    mcall
  202.  
  203.    add ecx,20 shl 16
  204.    mcall
  205.  
  206.    add ecx,40 shl 16
  207.    mcall
  208.  
  209.    mov eax,8                             ;отрисовка кнопок
  210.    sub ebx,4 shl 16
  211.    sub ecx,4 shl 16
  212.    mov edx,5
  213.    mov esi,[sc.work_button]
  214.    mcall
  215.  
  216.    sub ecx,40 shl 16
  217.    dec edx
  218.    mcall
  219.  
  220.    sub ecx,20 shl 16
  221.    dec edx
  222.    mcall
  223.  
  224.    sub ecx,20 shl 16
  225.    dec edx
  226.    mcall
  227.  
  228.    mov al,4                              ;надписи
  229.    mov ebx,45 shl 16 + 12
  230.    mov ecx,[sc.work_text]
  231.    or  ecx,0x80000000
  232.    mov edx,label1
  233.    mcall
  234.  
  235.    mov ebx,150 shl 16 + 35
  236.    mov edx,path1
  237.    mcall
  238.  
  239.    add ebx,20
  240.    mov edx,path2
  241.    mcall
  242.  
  243.    mov ebx,75 shl 16 + 75
  244.    mov edx,path3
  245.    mcall
  246.  
  247.    mov ebx,30 shl 16 + 97
  248.    mov edx,label2
  249.    mcall
  250.  
  251.    mov ebx,40 shl 16 + 135
  252.    mov edx,label3
  253.    mcall
  254.  
  255.    mov ecx,[sc.work_button_text]
  256.    or  ecx,0x80000000
  257.    mov ebx,195 shl 16 + 35
  258.    mov edx,save
  259.    mcall
  260.  
  261.    add ebx,20
  262.    mcall
  263.  
  264.    add ebx,20
  265.    mcall
  266.  
  267.    add ebx,40
  268.    mcall
  269.  
  270.    mov al,12                            ; функция 12: сообщить ОС об отрисовке окна
  271.    mov ebx,2                            ; 2, закончили рисовать
  272.    mcall
  273.  
  274.    ret                                  ; выходим из процедуры
  275.  
  276.  
  277. ;---------------------------------------------------------------------
  278. ;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
  279. ;---------------------------------------------------------------------
  280.  
  281. title db appname,version,0
  282.  
  283. editbox:
  284. edit1 edit_box 170,10,113,0xffffff,0xaabbcc,0,0,0,512,path4,mouse_dd,ed_focus,26,26
  285. editbox_end:
  286.  
  287. if lang eq ru
  288. save    db 'Сохранить',0
  289. label1  db 'Выберите один из вариантов:',0
  290. label2  db 'Или введите полный путь к файлу:',0
  291. label3  db 'Все папки должны существовать',0
  292. ok      db 'RAM-диск сохранен успешно',0
  293. error3  db 'Неизвестная файловая система',0
  294. error5  db 'Несуществующий путь',0
  295. error8  db 'Нет места на диске',0
  296. error9  db 'Таблица FAT разрушена',0
  297. error10 db 'Доступ запрещен',0
  298. error11 db 'Ошибка устройства',0
  299. aUnknownError db 'Неизвестная ошибка',0
  300. else if lang eq et
  301. save    db 'Salvesta',0
  302. label1  db 'Vali №ks variantidest:',0
  303. label2  db 'Vїi sisesta teekond failinimeni:',0
  304. label3  db 'Kїik kataloogid peavad eksisteerima',0
  305. ok      db 'RAM-ketas salvestatud edukalt',0
  306. error3  db 'Tundmatu failis№steem',0
  307. error5  db 'Vigane teekond',0
  308. error8  db 'Ketas tфis',0
  309. error9  db 'FAT tabel vigane',0
  310. error10 db 'Juurdepффs keelatud',0
  311. error11 db 'Seadme viga',0
  312. aUnknownError db 'Tundmatu viga',0
  313.  
  314. else
  315. save    db '  Save',0
  316. label1  db 'Select one of the variants:',0
  317. label2  db '   Or enter full path to file:',0
  318. label3  db '    All folders must exist',0
  319. ok      db 'RAM-drive was saved successfully',0
  320. error3  db 'Unknown file system',0
  321. error5  db 'Incorrect path',0
  322. error8  db 'Disk is full',0
  323. error9  db 'FAT table corrupted',0
  324. error10 db 'Access denied',0
  325. error11 db 'Device error',0
  326. aUnknownError db 'Unknown error',0
  327.  
  328. end if
  329. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  330. ;DATA данные
  331. ;Всегда соблюдать последовательность в имени.
  332. system_path      db '/sys/lib/'
  333. library_name     db 'box_lib.obj',0
  334. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  335.  
  336. err_message_found_lib   db 'Sorry I cannot load library box_lib.obj',0
  337. head_f_i:
  338. head_f_l        db 'System error',0
  339. err_message_import      db 'Error on load import library box_lib.obj',0
  340. align 4
  341. myimport:  
  342.  
  343. edit_box_draw   dd      aEdit_box_draw
  344. edit_box_key    dd      aEdit_box_key
  345. edit_box_mouse  dd      aEdit_box_mouse
  346. version_ed      dd      aVersion_ed
  347.  
  348.                 dd      0
  349.                 dd      0
  350.  
  351. aEdit_box_draw  db 'edit_box',0
  352. aEdit_box_key   db 'edit_box_key',0
  353. aEdit_box_mouse db 'edit_box_mouse',0
  354. aVersion_ed     db 'version_ed',0
  355.  
  356.  
  357. ;mouse_flag: dd 0x0
  358.  
  359. path1   db '/fd/1/',0
  360. path2   db '/fd/2/',0
  361. path3   db '/hd0/1/kolibri.img',0
  362. path4   db '/hd0/1/kolibri/kolibri.img',0  ;для резервного сохранения
  363.  
  364. ;---------------------------------------------------------------------
  365.  
  366. rb 514
  367.  
  368. sc     system_colors
  369. mouse_dd        rd 1
  370. cur_dir_path    rb 4096
  371. library_path    rb 4096
  372. align 4
  373. rb 0x100        ; for stack
  374. I_END:                             ; метка конца программы
  375.