Subversion Repositories Kolibri OS

Rev

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

  1.    ; Run with OpenDialog ;
  2. ; this source can be compiled ;
  3.    ; with FASM or NASM ;
  4.  
  5. org 0
  6. use32
  7.  
  8. STACK_SIZE     equ 256
  9. REDRAW_EVENT   equ 1
  10. KEY_EVENT      equ 2
  11. BUTTON_EVENT   equ 3
  12. MOUSE_EVENT    equ 6
  13.                
  14. BUTTON_RUN     equ 10
  15. BUTTON_BROWSE  equ 20
  16.  
  17. MENUET01       db 'MENUET01'
  18. version        dd 1
  19. program.start  dd start_
  20. program.end    dd end_
  21. program.memory dd end_ + STACK_SIZE
  22. program.stack  dd end_ + STACK_SIZE
  23. program.params dd 0
  24. program.path   dd 0
  25.  
  26. ; ======================================================================= ;    
  27. start_:
  28. ; set.event
  29.         mov eax, 40
  30.         mov ebx, 39
  31.         int 64
  32.  
  33.         push sz_box_lib
  34.         call load.library
  35.         mov [box_lib], eax
  36.  
  37.         push dword[box_lib]
  38.         push sz_edit_box
  39.         call getprocaddress
  40.         mov [edit_box_draw], eax
  41.  
  42.         push dword[box_lib]
  43.         push sz_edit_box_key
  44.         call getprocaddress
  45.         mov [edit_box_key], eax
  46.  
  47.         push dword[box_lib]
  48.         push sz_edit_box_mouse
  49.         call getprocaddress
  50.         mov [edit_box_mouse], eax
  51.  
  52.         push dword[box_lib]
  53.         push sz_edit_box_set_text
  54.         call getprocaddress
  55.         mov [edit_box_set_text], eax
  56.  
  57.         push sz_proc_lib
  58.         call load.library
  59.         mov [proc_lib], eax
  60.  
  61.         push dword[proc_lib]
  62.         push sz_OpenDialog_init
  63.         call getprocaddress
  64.         mov [opendialog_init], eax
  65.  
  66.         push dword[proc_lib]
  67.         push sz_OpenDialog_start
  68.         call getprocaddress
  69.         mov [opendialog_start], eax
  70.  
  71.                                
  72. ; memory.allocate:
  73.         mov eax, 68
  74.         mov ebx, 12
  75.         mov ecx, 4096 + 4096 + 4096
  76.         int 64
  77.  
  78.         mov [od.procinfo], eax
  79.                                
  80.         add eax, 1024
  81.         mov [od.filename_area], eax                            
  82.                                
  83.                                 add eax, 4096 - 1024
  84.         mov [od.opendir_path], eax
  85.                                
  86.                                 add eax, 4096
  87.         mov [od.openfile_path], eax
  88.  
  89.         push od
  90.         call [opendialog_init]
  91.  
  92.  
  93. ; get.screen.size
  94.         mov eax, 61
  95.         mov ebx,  1
  96.         int 64
  97.  
  98.         mov [screen], eax
  99.         movzx eax,  word[screen.width]
  100.         shr   eax, 3
  101.         lea   eax, [eax*2 + eax]
  102.         add   eax, 72
  103.         mov [window.width], eax
  104.  
  105. ; skin.height
  106.         mov eax, 48
  107.         mov ebx, 4
  108.         int 64    
  109.  
  110.         add eax, 64
  111.         mov [window.height], eax
  112.  
  113.         movzx eax,  word[screen.width]
  114.         sub   eax, [window.width]
  115.         shr   eax, 1
  116.         mov [window.left], eax
  117.  
  118.         movzx eax,  word[screen.height]
  119.         sub   eax, [window.height]
  120.         sub   eax, 24
  121.         mov [window.top], eax
  122.  
  123.         mov eax, [window.width]
  124.         sub eax, 20
  125.         mov [edit1.width], eax
  126.  
  127.         mov eax, [od.openfile_path]
  128.         mov [edit1.text], eax
  129.    
  130.    
  131.         call on_redraw
  132. ; ----------------------- ;    
  133. .loop:
  134. ; wait.event
  135.         mov eax, 10
  136.         int 64
  137.         cmp eax, REDRAW_EVENT
  138.         jne .check_key
  139.         call on_redraw
  140.         jmp .loop
  141. ; ----------------------- ;        
  142. .check_key:
  143.         cmp eax, KEY_EVENT
  144.         jne .check_button
  145.         mov eax, 2
  146.         int 64
  147.         cmp ah, 13
  148.         jne .no_key_enter
  149.         call on_button_run
  150.         jmp .loop
  151. ; ----------------------- ;  
  152. .no_key_enter:
  153.         push edit1
  154.         call [edit_box_key]
  155.         jmp .loop
  156. ; ----------------------- ;      
  157. .check_button:
  158.         cmp eax, BUTTON_EVENT
  159.         jne .check_mouse
  160. ; get.button.number
  161.         mov eax, 17
  162.         int 64
  163.         cmp ah, 1
  164.         jne .check_button_run
  165. ; program.terminate
  166.         or eax, -1
  167.         int 64
  168. ; ----------------------- ;  
  169. .check_button_run:
  170.         cmp ah, BUTTON_RUN
  171.         jne .check_button_browse
  172.         call on_button_run
  173.         jmp .loop
  174. ; ----------------------- ;  
  175. .check_button_browse:
  176.         cmp ah, BUTTON_BROWSE
  177.         jne .loop
  178.         call on_button_browse
  179.         jmp .loop
  180. ; ----------------------- ;      
  181. .check_mouse:
  182.         cmp eax, MOUSE_EVENT
  183.         jne .loop
  184.         push edit1
  185.         call [edit_box_mouse]
  186.         jmp .loop
  187.  
  188.  
  189. ; ======================================================================= ;    
  190. on_button_run:
  191.         push dword[edit1.text]
  192.         call extractrunpathandparams
  193.  
  194. ;file.run:
  195.         mov eax, 70
  196.         mov ebx, file_info
  197.         int 64
  198.                                
  199.         mov    dl, byte[lastendpath]
  200.         mov   ecx, [ptrlastendpath]
  201.         mov [ecx], dl    
  202.  
  203.         test eax, eax
  204.         jnge .error
  205.         mov [runresult], dword sz_Program_run_successfully
  206.         jmp .exit
  207.                                
  208. .error:
  209. ; ----------------------- ;  
  210. .5:    
  211.         cmp al, -5
  212.         jne .31
  213.         mov [runresult], dword sz_File_not_found
  214.         jmp .exit
  215. ; ----------------------- ;  
  216. .31:  
  217.         cmp al, -31
  218.         jne .32
  219.         mov [runresult], dword sz_File_is_not_executable
  220.         jmp .exit
  221. ; ----------------------- ;  
  222. .32:  
  223.         cmp al, -32
  224.         jne .10
  225.         mov [runresult], dword sz_Too_many_processes
  226.         jmp .exit
  227. ; ----------------------- ;  
  228. .10:  
  229.         cmp al, -10
  230.         jne .30
  231.         mov [runresult], dword sz_Access_denied
  232.         jmp .exit
  233. ; ----------------------- ;  
  234. .30:  
  235.         cmp al, -30
  236.         jne .unknown
  237.         mov [runresult], dword sz_Out_of_memory
  238.         jmp .exit        
  239. ; ----------------------- ;  
  240. .unknown:
  241.         mov [runresult], dword sz_Unknown_error
  242. ; ----------------------- ;  
  243. .exit:
  244.         call on_redraw
  245.         ret
  246.  
  247. ; ======================================================================= ;                            
  248. on_button_browse:
  249.         push od
  250.         call [opendialog_start]
  251.  
  252.         mov eax, [od.status]            
  253.         test eax, eax
  254.         je .exit
  255.  
  256. ;======== if space exist in filepath, then quote filepath
  257.         mov eax, [od.openfile_path]
  258. ; ----------------------- ;  
  259. .check_space:
  260.         cmp [eax], byte 0
  261.         je .no_space
  262.         cmp [eax], byte 32 ;space
  263.         je .space
  264.         inc eax
  265.         jmp .check_space
  266. .space:
  267. ; ----------------------- ;  
  268. .find_end_zero:
  269.         inc eax
  270.         cmp [eax], byte 0
  271.         jne .find_end_zero
  272.         mov [eax + 2], byte 0
  273.         mov [eax + 1], byte 34 ; quote
  274. ; ----------------------- ;  
  275. .shift_path:
  276.         dec eax
  277.  
  278.         mov dl, byte [eax ]
  279.         mov [eax + 1], dl
  280.  
  281.         cmp eax, [od.openfile_path]
  282.         jne .shift_path
  283.         mov [eax ], byte 34 ; quote
  284.  
  285. .no_space:
  286. ;=================================
  287.  
  288.         push dword[od.openfile_path]
  289.         push edit1
  290.         call [edit_box_set_text]
  291. ; ----------------------- ;  
  292. .exit:
  293.         ret
  294.  
  295.  
  296. ; ======================================================================= ;      
  297. on_redraw:
  298. ; redraw.start
  299.         mov eax, 12
  300.         mov ebx, 1
  301.         int 64
  302. ; get.standart.colors
  303.         mov eax, 48
  304.         mov ebx, 3
  305.         mov ecx, sc
  306.         mov edx, 40
  307.         int 64  
  308.  
  309.         mov eax, [sc.work_graph]
  310.         mov [edit1.shift_color], eax
  311.  
  312.         mov eax, [sc.work_graph]
  313.         mov [edit1.focus_border_color], eax
  314.  
  315.         mov eax, [sc.frames]
  316.         mov [edit1.blur_border_color], eax
  317.  
  318.         mov eax, [sc.work_text]
  319.         mov [edit1.text_color], eax    
  320.  
  321. ; draw.window
  322.         xor eax, eax
  323.         mov ebx, [window.left]
  324.         shl ebx, 16
  325.         add ebx, [window.width]
  326.         mov ecx, [window.top]
  327.         shl ecx, 16
  328.         add ecx, [window.height]
  329.         mov edx, [sc.work]
  330.         or  edx, 34000000h
  331.         mov edi, sz_run
  332.         int 64
  333.    
  334.         mov  eax, [window.width]
  335.         sub  eax, 318
  336.         shr  eax, 1
  337.         sub  eax, 5
  338.         push eax
  339.         push 5
  340.         push sz_Type_name_of_program
  341.         push dword [sc.work_text]
  342.         call draw.text
  343.    
  344. ; ====================| browse button |====================    
  345.         push 20
  346.         push  5
  347.         push 38
  348.         push 42
  349.         push 17
  350.         call draw.button
  351.  
  352.         push  3
  353.         push 42
  354.         push sz_browse
  355.         push dword [sc.work_button_text]
  356.         call draw.text
  357.  
  358. ; ====================| run button |====================    
  359.         push 10
  360.         mov  eax, [window.width]
  361.         sub  eax, 57
  362.         push eax
  363.         push 38
  364.         push 42
  365.         push 17
  366.         call draw.button
  367.  
  368.         mov  eax, [window.width]
  369.         sub  eax, 56
  370.         push eax
  371.         push 42
  372.         push sz_run
  373.         push dword [sc.work_button_text]
  374.         call draw.text
  375.  ; =====================================================      
  376.    
  377.         mov eax, 57
  378.         push eax
  379.         mov eax, [window.height]
  380.         sub eax, 44
  381.         push eax
  382.         push dword[runresult]
  383.         push dword [sc.work_text]
  384.         call draw.text
  385.  
  386.         push edit1
  387.         call [edit_box_draw]
  388.                                
  389. ; redraw.finish
  390.         mov eax, 12
  391.         mov ebx, 2
  392.         int 64
  393.  
  394.         ret
  395.  
  396.  
  397. ; ======================================================================= ;    
  398. extractrunpathandparams:
  399.         xor ecx, ecx
  400.  
  401.         mov eax, [esp + 4]
  402.         mov [runpath], eax
  403.  
  404.         movzx eax, byte [eax]            
  405.         cmp eax, 34
  406.         jne .start_without_quote
  407.  
  408.         inc ecx
  409. ; ----------------------- ;  
  410. .loop1:
  411.         mov eax, [runpath]        
  412.         movzx eax, byte [eax + ecx]        
  413.         cmp eax, 34
  414.         jne .not_quote
  415.  
  416.         mov eax, [runpath]
  417.         mov [eax + ecx], byte 0
  418.  
  419.         mov eax, [runpath]
  420.         add eax, ecx
  421.         mov [ptrlastendpath], eax
  422.         mov [lastendpath], byte 34
  423.         inc ecx
  424. ; ----------------------- ;  
  425. .skip_space1:
  426.         mov eax, [runpath]
  427.         movzx eax, byte [eax + ecx]        
  428.         cmp al, 32
  429.         jne .skipped1
  430.         inc ecx
  431.         jmp .skip_space1
  432. ; ----------------------- ;  
  433. .skipped1:
  434.         mov eax, [runpath]
  435.         add eax, ecx
  436.         mov [runparams], eax
  437.         inc dword [runpath]
  438.         jmp .exit    
  439. ; ----------------------- ;  
  440. .not_quote:  
  441.         mov eax, [runpath]
  442.         movzx eax, byte [eax + ecx]        
  443.  
  444.         test eax, eax
  445.         jne .not_zero1
  446.         mov eax, [runpath]
  447.         add eax, ecx
  448.         mov [runparams], eax
  449.         mov eax, [runpath]
  450.         add eax, ecx
  451.         mov [ptrlastendpath], eax
  452.         mov [lastendpath], byte 0
  453.         jmp .exit    
  454. ; ----------------------- ;  
  455. .not_zero1:  
  456.         inc ecx
  457.         jmp .loop1
  458. ; ----------------------- ;  
  459. .start_without_quote:
  460. ; ----------------------- ;  
  461. .loop2:  
  462.         mov eax, [runpath]
  463.         movzx eax, byte [eax + ecx]        
  464.         cmp eax, 32
  465.         jne .not_space
  466.  
  467.         mov eax, [runpath]
  468.         mov [eax + ecx], byte 0
  469.  
  470.         mov eax, [runpath]
  471.         add eax, ecx
  472.         mov [ptrlastendpath], eax
  473.         mov [lastendpath], byte 32
  474.         inc ecx
  475. ; ----------------------- ;  
  476. .skip_space2:  
  477.         mov eax, [runpath]
  478.         movzx eax, byte [eax + ecx]        
  479.         cmp al, 32
  480.         jne .skipped2
  481.         inc ecx
  482.         jmp .skip_space2
  483. ; ----------------------- ;  
  484. .skipped2:  
  485.         mov eax, [runpath]
  486.         add eax, ecx
  487.         mov [runparams], eax
  488.         jmp .exit  
  489. ; ----------------------- ;  
  490. .not_space:  
  491.         mov eax, [runpath]
  492.         movzx eax, byte [eax + ecx]        
  493.  
  494.         test eax, eax
  495.         jne .not_zero2
  496.         mov eax, [runpath]
  497.         add eax, ecx
  498.         mov [runparams], eax
  499.         mov eax, [runpath]
  500.         add eax, ecx
  501.         mov [ptrlastendpath], eax
  502.         mov [lastendpath], byte 0
  503.         jmp .exit    
  504. ; ----------------------- ;  
  505. .not_zero2:    
  506.         inc ecx
  507.         jmp .loop2
  508. ; ----------------------- ;  
  509. .exit:
  510.         ret 4
  511.  
  512. ; ======================================================================= ;                            
  513. draw.button:
  514.         mov eax, 8
  515.         mov ebx, [esp + 16]
  516.         shl ebx, 16
  517.         add ebx, [esp + 8]
  518.         mov ecx, [esp + 12]
  519.         shl ecx, 16
  520.         add ecx, [esp + 4]
  521.         mov edx, [esp + 20]
  522.         mov esi, [sc.work_button]
  523.         int 64
  524.         ret 20
  525. ; ======================================================================= ;    
  526. draw.text:
  527.         mov eax, 4
  528.         mov ebx, [esp + 16]
  529.         shl ebx, 16
  530.         add ebx, [esp + 12]
  531.         mov ecx, 2147483648
  532.         or  ecx, [esp + 4]
  533.         mov edx, [esp + 8]
  534.         int 64
  535.         ret 16
  536. ; ======================================================================= ;    
  537. load.library:
  538.         mov eax, 68
  539.         mov ebx, 19
  540.         mov ecx, [esp + 4]
  541.         int 64
  542.         ret 4
  543. ; ======================================================================= ;    
  544. getprocaddress:
  545.         mov  edx, [esp + 8] ; hlib
  546.         xor  eax, eax
  547.         test edx, edx ; If hlib = 0 then goto .end
  548.         jz  .end
  549. ; ----------------------- ;
  550. .next:      
  551.         cmp  [edx], dword 0 ; If end of export table then goto .end
  552.         jz  .end
  553.  
  554.         xor  eax, eax
  555.         mov  esi, [edx]
  556.         mov  edi, [esp + 4] ; name
  557. ; ----------------------- ;
  558. .next_:
  559.         lodsb
  560.         scasb
  561.         jne  .fail
  562.         or   al, al
  563.         jnz  .next_
  564.         jmp  .ok
  565. ; ----------------------- ;
  566. .fail:  
  567.         add  edx, 8
  568.         jmp  .next
  569. ; ----------------------- ;
  570. .ok:               ; return address
  571.         mov  eax, [edx + 4]
  572. ; ----------------------- ;
  573. .end:  
  574.         ret 8
  575.  
  576.                                
  577.  
  578. file_info:
  579.         dd 7
  580.         dd 0
  581. runparams:
  582.         dd 0
  583.         dd 0
  584.         dd 0
  585.         db 0
  586. runpath:
  587.         dd 0                           
  588.                                
  589.                                
  590. screen:
  591. .height dw 0
  592. .width  dw 0
  593.    
  594. window:
  595. .left   dd 0
  596. .top    dd 0
  597. .width  dd 0
  598. .height dd 0
  599.    
  600. box_lib dd 0
  601.  
  602. edit1:
  603. .width              dd 0
  604. .left               dd 5
  605. .top                dd 19
  606. .color              dd 0ffffffffh
  607. .shift_color        dd 0
  608. .focus_border_color dd 0
  609. .blur_border_color  dd 0
  610. .text_color         dd 0
  611. .max                dd 4096
  612. .text               dd 0
  613. .mouse_variable     dd 0
  614. .flags              dd 2
  615. .size               dd 0
  616. .pos                dd 0
  617. .offset             dd 0
  618. .cl_curs_x          dd 0
  619. .cl_curs_y          dd 0
  620. .shift              dd 0
  621. .shift_old          dd 0
  622.    
  623. edit_box_draw       dd 0
  624. edit_box_key        dd 0
  625. edit_box_mouse      dd 0
  626. edit_box_set_text   dd 0
  627.                    
  628. sc:    
  629. .frames             dd 0
  630. .grab               dd 0
  631. .grab_button        dd 0
  632. .grab_button_text   dd 0
  633. .grab_text          dd 0
  634. .work               dd 0
  635. .work_button        dd 0
  636. .work_button_text   dd 0
  637. .work_text          dd 0
  638. .work_graph         dd 0
  639.                    
  640. proc_lib            dd 0
  641.                    
  642. od:                
  643. .mode               dd 0
  644. .procinfo           dd 0
  645. .com_area_name      dd sz_FFFFFFFF_open_dialog
  646. .com_area           dd 0
  647. .opendir_path       dd 0
  648. .dir_default_path   dd sz_SYS
  649. .start_path         dd sz_opendial_path
  650. .draw_window        dd on_redraw
  651. .status             dd 0
  652. .openfile_path      dd 0
  653. .filename_area      dd 0
  654. .filter_area        dd filefilter
  655. .x_size             dw 414
  656. .x_start            dw 0
  657. .y_size             dw 414
  658. .y_start            dw 0
  659.    
  660. opendialog_init     dd 0
  661. opendialog_start    dd 0
  662.  
  663. filefilter          dd 0
  664. runresult           dd sz_empty
  665.  
  666. lastendpath         db 0
  667. ptrlastendpath      dd 0       
  668.        
  669. sz_empty                    db 0
  670.  
  671. sz_box_lib                  db "/sys/lib/box_lib.obj",0
  672. sz_edit_box                 db "edit_box",0
  673. sz_edit_box_key             db "edit_box_key",0
  674. sz_edit_box_mouse           db "edit_box_mouse",0
  675. sz_edit_box_set_text        db "edit_box_set_text",0
  676.  
  677. sz_proc_lib                 db "/sys/lib/proc_lib.obj",0
  678. sz_OpenDialog_init          db "OpenDialog_init",0
  679. sz_OpenDialog_start         db "OpenDialog_start",0
  680. sz_FFFFFFFF_open_dialog     db "FFFFFFFF_open_dialog",0
  681. sz_SYS                      db "/sys",0
  682. sz_opendial_path            db "/sys/File managers/opendial",0
  683.  
  684. sz_Program_run_successfully db "Program run successfully",0
  685. sz_File_not_found           db "File not found",0
  686. sz_File_is_not_executable   db "File is not executable",0
  687. sz_Too_many_processes       db "Too many processes",0
  688. sz_Access_denied            db "Access denied",0
  689. sz_Out_of_memory            db "Out of memory",0
  690. sz_Unknown_error            db "Unknown error",0
  691.  
  692. sz_Type_name_of_program     db "Type name of program, and Kolibri will run it for you",0
  693.  
  694. sz_run                      db "  Run  ",0
  695. sz_browse                   db " Browse ",0
  696.  
  697. ; ======================================================================= ;                            
  698. end_:
  699.  
  700.