Subversion Repositories Kolibri OS

Rev

Rev 3634 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3478 0CodErr 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