Subversion Repositories Kolibri OS

Rev

Rev 529 | Rev 631 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
180 heavyiron 1
use32
2
        db      'MENUET01'
3
        dd      1
4
        dd      start
5
        dd      i_end
6
memsize dd      mem
7
        dd      stacktop
474 diamond 8
        dd      0, app_path
180 heavyiron 9
 
589 diamond 10
version equ '0.4'
11
version_dword equ 0*10000h + 40
12
 
180 heavyiron 13
include 'lang.inc'
14
include 'font.inc'
15
include 'sort.inc'
16
include 'kglobals.inc'
17
include 'dialogs.inc'
18
include 'viewer.inc'
314 diamond 19
include 'tools.inc'
474 diamond 20
include 'filetool.inc'
180 heavyiron 21
 
22
start:
474 diamond 23
        mov     edi, tolower_table
24
        push    'A'
25
        pop     ecx
26
        xor     eax, eax
27
@@:
28
        stosb
29
        inc     eax
30
        loop    @b
31
        add     al, 0x20
32
        mov     cl, 'Z'-'A'+1
33
@@:
34
        stosb
35
        inc     eax
36
        loop    @b
37
        sub     al, 0x20
38
        mov     cl, 'А'-'Z'-1
39
@@:
40
        stosb
41
        inc     eax
42
        loop    @b
43
        add     al, 0x20
44
        mov     cl, 'Р'-'А'
45
@@:
46
        stosb
47
        inc     eax
48
        loop    @b
49
        add     al, 0x30
50
        mov     cl, 'Я'-'Р'+1
51
@@:
52
        stosb
53
        inc     eax
54
        loop    @b
55
        sub     al, 0x50
56
        mov     cl, 256-'Я'-1
57
@@:
58
        stosb
59
        inc     eax
60
        loop    @b
61
        mov     byte [edi-256+'Ё'], 'ё'
62
        push    68
63
        pop     eax
64
        push    11
65
        pop     ebx
517 diamond 66
        int     0x40
283 diamond 67
        call    init_console
180 heavyiron 68
        call    draw_window
69
        push    66
70
        pop     eax
71
        push    1
72
        pop     ebx
73
        mov     ecx, ebx
517 diamond 74
        int     40h     ; set keyboard mode to scancodes
283 diamond 75
        mov     eax, 200
180 heavyiron 76
        mov     [panel1_nfa], eax
77
        mov     [panel2_nfa], eax
474 diamond 78
        mov     ecx, 200*4 + 32 + 200*304
79
        call    pgalloc
283 diamond 80
        mov     [panel1_files], eax
474 diamond 81
        call    pgalloc
283 diamond 82
        mov     [panel2_files], eax
83
        test    eax, eax
84
        jz      exit
517 diamond 85
        cmp     [panel1_files], 0
283 diamond 86
        jz      exit
589 diamond 87
        xor     eax, eax
88
        mov     [panel1_hPlugin], eax
89
        mov     [panel1_parents], eax
90
        mov     [panel1_parents_sz], eax
91
        mov     [panel1_parents_alloc], eax
92
        mov     [panel2_hPlugin], eax
93
        mov     [panel2_parents], eax
94
        mov     [panel2_parents_sz], eax
95
        mov     [panel2_parents_alloc], eax
96
        mov     [panel1_sortmode], al   ; sort by name
97
        mov     [panel2_sortmode], al
98
        mov     al, 2                   ; "средний" формат
474 diamond 99
        mov     [panel1_colmode], eax
100
        mov     [panel2_colmode], eax
180 heavyiron 101
        mov     [num_screens], 1
474 diamond 102
        mov     ecx, 0x1000
103
        call    pgalloc
180 heavyiron 104
        mov     [screens], eax
314 diamond 105
        test    eax, eax
106
        jz      exit
180 heavyiron 107
        mov     ecx, panels_vtable
108
        mov     [eax], ecx
109
        mov     [active_screen_vtable], ecx
474 diamond 110
; load libini.obj and kfar.ini
111
        mov     eax, libini_name
112
        mov     esi, ini_import
517 diamond 113
        push    3
114
        pop     ebp     ; we use version 3 of libini
474 diamond 115
        call    load_dll_and_import
116
        test    eax, eax
117
        jnz     .noini
118
        mov     edi, app_path
119
        or      ecx, -1
120
        repnz   scasb
121
        mov     dword [edi-1], '.ini'
122
        mov     byte [edi+3], 0
123
        push    1
124
        push    dword aConfirmDelete
125
        push    dword aConfirmations
126
        push    dword app_path
127
        call    [ini.get_int]
128
        mov     [bConfirmDelete], al
129
        push    0
130
        push    dword aConfirmDeleteIncomplete
131
        push    dword aConfirmations
132
        push    dword app_path
133
        call    [ini.get_int]
134
        mov     [bConfirmDeleteIncomplete], al
589 diamond 135
        push    2
136
        push    aLeftViewMode
137
        push    aPanels
138
        push    app_path
139
        call    [ini.get_int]
140
        cmp     eax, 1
141
        jb      @f
142
        cmp     eax, 4
143
        ja      @f
144
        mov     [panel1_colmode], eax
145
@@:
146
        push    2
147
        push    aRightViewMode
148
        push    aPanels
149
        push    app_path
150
        call    [ini.get_int]
151
        cmp     eax, 1
152
        jb      @f
153
        cmp     eax, 4
154
        ja      @f
155
        mov     [panel2_colmode], eax
156
@@:
474 diamond 157
        mov     ecx, 0x1000
158
        call    xpgalloc
159
        test    eax, eax
160
        jz      .skip_assoc
517 diamond 161
        mov     [associations], eax
162
        push    enum_associations_callback
163
        push    aAssociations
164
        push    app_path
165
        call    [ini.enum_keys]
166
.skip_assoc:
474 diamond 167
        xor     ebp, ebp
168
        xor     esi, esi
522 diamond 169
.shortcut_loop:
474 diamond 170
        mov     edi, saved_file_name
171
        push    dword nullstr
172
        push    512
173
        push    edi
174
        push    dword aShortcut
175
        push    dword aFolderShortcuts
176
        push    dword app_path
177
        call    [ini.get_str]
178
        cmp     byte [edi], 0
179
        jz      .shortcut_cont
180
        or      ecx, -1
181
        xor     eax, eax
182
        repnz   scasb
183
        not     ecx
184
        cmp     ecx, 2
185
        jz      @f
186
        cmp     byte [edi-2], '/'
187
        jnz     @f
188
        mov     byte [edi-2], 0
189
        dec     ecx
190
@@:
191
        mov     al, [aShortcut.d]
192
        push    esi
193
        inc     esi
194
        mov     [FolderShortcuts+(eax-'0')*4], esi
195
        lea     esi, [esi+ecx-1]
196
        push    esi
197
        and     esi, 0xFFF
198
        cmp     esi, ecx
199
        pop     esi
200
        ja      .norealloc
201
        mov     edx, ebp
202
        mov     ecx, esi
203
        call    xpgrealloc
204
        test    eax, eax
205
        jnz     @f
522 diamond 206
        pop     esi
474 diamond 207
        mov     edi, FolderShortcuts
208
        mov     ecx, 10
209
        rep     stosd
210
        jmp     .skip_shortcuts
211
@@:
212
        mov     ebp, eax
213
.norealloc:
214
        pop     edi
215
        add     edi, ebp
216
        mov     ecx, saved_file_name
217
@@:
218
        mov     al, [ecx]
219
        inc     ecx
220
        stosb
221
        test    al, al
222
        jnz     @b
223
.shortcut_cont:
224
        inc     [aShortcut.d]
225
        cmp     [aShortcut.d], '9'
522 diamond 226
        jbe     .shortcut_loop
474 diamond 227
        mov     esi, FolderShortcuts
228
        mov     ecx, 10
229
        dec     ebp
230
.l3:
231
        lodsd
232
        test    eax, eax
233
        jz      @f
234
        add     [esi-4], ebp
235
@@:
236
        loop    .l3
237
.skip_shortcuts:
589 diamond 238
; load plugins
239
        push    enum_plugins_callback
240
        push    aPlugins
241
        push    app_path
242
        call    [ini.enum_keys]
474 diamond 243
.noini:
244
        mov     esi, def_left_dir
245
        mov     edi, panel1_dir
246
@@:
247
        lodsb
248
        stosb
249
        test    al, al
250
        jnz     @b
251
        mov     esi, def_right_dir
252
        mov     edi, panel2_dir
253
@@:
254
        lodsb
255
        stosb
256
        test    al, al
257
        jnz     @b
180 heavyiron 258
        call    draw_keybar
259
        call    draw_cmdbar
314 diamond 260
        mov     [prev_dir], 0
180 heavyiron 261
        mov     ebp, panel1_data
474 diamond 262
        call    calc_colwidths
180 heavyiron 263
        call    read_folder
264
        call    draw_panel
314 diamond 265
        mov     [bSilentFolderMode], 1
180 heavyiron 266
        mov     ebp, panel2_data
474 diamond 267
        call    calc_colwidths
180 heavyiron 268
        call    read_folder
269
        call    draw_panel
270
event:
271
        push    10
272
        pop     eax
517 diamond 273
        int     40h
180 heavyiron 274
        dec     eax
275
        jz      redraw
276
        dec     eax
277
        jz      key
278
; button - we have only one button, close
279
exit:
589 diamond 280
; close all screens
281
@@:
282
        mov     ecx, [num_screens]
283
        mov     eax, [screens]
284
        mov     ebp, [eax+ecx*8-4]
285
        mov     eax, [eax+ecx*8-8]
286
        push    ebp
287
        call    [eax+screen_vtable.OnExit]
288
        pop     ecx
289
        call    pgfree
290
        dec     [num_screens]
291
        jnz     @b
292
; unload all plugins
293
        mov     ecx, [num_plugins]
294
        imul    esi, ecx, PluginInfo.size
295
        add     esi, [plugins]
296
.unload:
297
        dec     ecx
298
        js      .unload_done
299
        sub     esi, PluginInfo.size
300
        push    ecx esi
301
        call    [esi+PluginInfo.unload]
302
        pop     esi ecx
303
        jmp     .unload
304
.unload_done:
305
if 0    ; commented due to bug in libini
306
        cmp     [ini.set_int], aIniSetInt
307
        jz      .nosave
308
        push    [panel1_colmode]
309
        push    aLeftViewMode
310
        push    aPanels
311
        push    app_path
312
        call    [ini.set_int]
313
        push    [panel2_colmode]
314
        push    aRightViewMode
315
        push    aPanels
316
        push    app_path
317
        call    [ini.set_int]
318
.nosave:
319
end if
320
if CHECK_FOR_LEAKS
321
        mov     ecx, [panel1_files]
322
        call    pgfree
323
        mov     ecx, [panel2_files]
324
        call    pgfree
325
        mov     ecx, [screens]
326
        call    pgfree
327
        mov     ecx, [associations]
328
        call    pgfree
329
        mov     ecx, [console_data_ptr]
330
        call    pgfree
331
        mov     ecx, [MemForImage]
332
        call    pgfree
333
        mov     esi, FolderShortcuts
334
        push    10
335
        pop     ecx
336
@@:
337
        lodsd
338
        test    eax, eax
339
        jnz     @f
340
        loop    @b
341
        jmp     .nofreefs
342
@@:
343
        mov     ecx, eax
344
        call    pgfree
345
        mov     ecx, [plugins]
346
        call    pgfree
347
        mov     ecx, [panel1_parents]
348
        call    pgfree
349
        mov     ecx, [panel2_parents]
350
        call    pgfree
351
.nofreefs:
352
        mov     eax, [numallocatedregions]
353
        test    eax, eax
354
        jz      @f
355
        mov     edi, allocatedregions
356
        int3
357
        jmp     $
358
@@:
359
end if
180 heavyiron 360
        or      eax, -1
517 diamond 361
        int     40h
180 heavyiron 362
redraw:
283 diamond 363
; query kbd state from OS
364
        mov     al, 66
365
        push    3
366
        pop     ebx
517 diamond 367
        int     0x40
283 diamond 368
        and     eax, 0x3F
369
        cmp     al, [ctrlstate]
370
        mov     [ctrlstate], al
371
        jz      @f
372
        call    draw_keybar
373
@@:
180 heavyiron 374
        mov     al, 9
375
        mov     ebx, procinfo
376
        or      ecx, -1
517 diamond 377
        int     40h
180 heavyiron 378
; test if rolled up
379
; height of rolled up window is [skinh]+3
380
        mov     eax, [ebx+46]
381
        sub     eax, [skinh]
382
        cmp     eax, 5
383
        ja      @f
384
        mov     al, 12
385
        push    1
386
        pop     ebx
517 diamond 387
        int     0x40
180 heavyiron 388
        xor     eax, eax
389
; ebx, ecx, edi are ignored by function 0 after first redraw
314 diamond 390
        mov     edx, 0x53000000
517 diamond 391
        int     0x40
180 heavyiron 392
        mov     al, 12
393
        inc     ebx
517 diamond 394
        int     0x40
180 heavyiron 395
        jmp     event
396
@@:
397
        xor     ecx, ecx
398
        mov     eax, [ebx+42]
314 diamond 399
        mov     [wnd_width], eax
283 diamond 400
        sub     eax, 5*2-1
180 heavyiron 401
        jae     @f
402
        xor     eax, eax
403
@@:
404
        cdq
405
        mov     esi, font_width
406
        div     esi
407
        cmp     eax, 54
408
        jae     @f
409
        mov     al, 54
410
        mov     ch, 1
411
@@:
412
        cmp     eax, 255
413
        jbe     @f
414
        mov     eax, 255
415
        mov     ch, 1
416
@@:
417
        cmp     eax, [cur_width]
418
        mov     [cur_width], eax
419
        setnz   cl
420
        or      cl, ch
421
        test    edx, edx
314 diamond 422
        mov     [fill_width], edx
180 heavyiron 423
        setnz   ch
424
        mov     eax, [ebx+46]
314 diamond 425
        mov     [wnd_height], eax
180 heavyiron 426
        sub     eax, [skinh]
283 diamond 427
        sub     eax, 5-1
180 heavyiron 428
        jns     @f
429
        xor     eax, eax
430
@@:
431
        cdq
432
        mov     esi, font_height
433
        div     esi
434
        cmp     eax, 8
435
        jae     @f
436
        mov     al, 8
437
        mov     cl, 1
438
@@:
439
        cmp     eax, 255
440
        jbe     @f
441
        mov     eax, 255
442
        mov     cl, 1
443
@@:
314 diamond 444
        mov     [fill_height], edx
180 heavyiron 445
        cmp     eax, [cur_height]
446
        mov     [cur_height], eax
283 diamond 447
        jnz     .resize
448
        test    cl, cl
449
        jnz     .resize
450
        test    edx, edx
451
        setnz   cl
180 heavyiron 452
        or      cl, ch
453
        jz      @f
283 diamond 454
        test    byte [ebx+70], 1
455
        jnz     @f
456
.resize:
180 heavyiron 457
        push    67
458
        pop     eax
459
        or      ebx, -1
460
        or      ecx, -1
461
        mov     edx, [cur_width]
462
        imul    edx, font_width
283 diamond 463
        add     edx, 5*2-1
180 heavyiron 464
        mov     esi, [cur_height]
465
        imul    esi, font_height
466
        add     esi, [skinh]
283 diamond 467
        add     esi, 5-1
517 diamond 468
        int     40h
283 diamond 469
.resize_draw:
474 diamond 470
        mov     ecx, [MemForImage]
471
        call    pgfree
472
        and     [MemForImage], 0
283 diamond 473
        call    init_console
474
;        call    draw_window
180 heavyiron 475
        call    draw_keybar
476
        mov     ebp, [active_screen_data]
477
        mov     eax, [active_screen_vtable]
478
        call    dword [eax+screen_vtable.OnRedraw]
479
        jmp     event
480
@@:
481
        call    draw_window
482
        jmp     event
283 diamond 483
alt_f9:
484
        cmp     [saved_width], -1
485
        jz      @f
486
        mov     eax, [saved_width]
487
        mov     [cur_width], eax
488
        or      [saved_width], -1
489
        mov     eax, [saved_height]
490
        mov     [cur_height], eax
491
        or      [saved_height], -1
492
        jmp     redraw.resize
493
@@:
494
        push    48
495
        pop     eax
496
        push    5
497
        pop     ebx
517 diamond 498
        int     0x40
283 diamond 499
        push    eax
500
        sub     eax, [esp+2]
501
        inc     eax
502
        movzx   eax, ax
503
        sub     eax, 10
504
        xor     edx, edx
505
        mov     ecx, font_width
506
        div     ecx
507
        xchg    [cur_width], eax
508
        mov     [saved_width], eax
509
        mov     eax, ebx
510
        shr     ebx, 16
511
        sub     eax, ebx
512
        sub     eax, 5-1
513
        sub     eax, [skinh]
514
        xor     edx, edx
515
        mov     ecx, font_height
516
        div     ecx
517
        xchg    [cur_height], eax
518
        mov     [saved_height], eax
519
        mov     ecx, ebx
520
        pop     ebx
521
        shr     ebx, 16
522
        mov     edx, [cur_width]
523
        imul    edx, font_width
524
        add     edx, 5*2-1
525
        mov     esi, [cur_height]
526
        imul    esi, font_height
527
        add     esi, [skinh]
528
        add     esi, 4
529
        push    67
530
        pop     eax
517 diamond 531
        int     0x40
283 diamond 532
        jmp     redraw.resize_draw
180 heavyiron 533
key:
534
        mov     al, 2
517 diamond 535
        int     40h
180 heavyiron 536
        test    al, al
537
        jnz     event
538
        xchg    al, ah
539
        cmp     al, 0xE0
540
        jnz     @f
541
        mov     [bWasE0], 1
542
        jmp     event
543
@@:
544
        xchg    ah, [bWasE0]
545
        mov     ebp, [active_screen_data]
546
        mov     edx, [active_screen_vtable]
547
        cmp     al, 0x1D
548
        jz      .ctrl_down
549
        cmp     al, 0x9D
550
        jz      .ctrl_up
551
        cmp     al, 0x2A
552
        jz      .lshift_down
553
        cmp     al, 0xAA
554
        jz      .lshift_up
555
        cmp     al, 0x36
556
        jz      .rshift_down
557
        cmp     al, 0xB6
558
        jz      .rshift_up
559
        cmp     al, 0x38
560
        jz      .alt_down
561
        cmp     al, 0xB8
562
        jz      .alt_up
563
        call    [edx+screen_vtable.OnKey]
564
        jmp     event
565
.ctrl_down:
566
        test    ah, ah
567
        jnz     .rctrl_down
568
        or      [ctrlstate], 4
569
        jmp     .keybar
570
.rctrl_down:
571
        or      [ctrlstate], 8
572
        jmp     .keybar
573
.ctrl_up:
574
        test    ah, ah
575
        jnz     .rctrl_up
576
        and     [ctrlstate], not 4
577
        jmp     .keybar
578
.rctrl_up:
579
        and     [ctrlstate], not 8
580
.keybar:
581
        call    draw_keybar
582
        call    draw_image
583
@@:     jmp     event
584
.lshift_down:
585
; ignore E0 2A sequence
586
; e.g. arrow keys with NumLock on generate sequence E0 2A E0 xx / E0 xx+80 E0 AA
587
; where xx is scancode, so we can safely ignore E0 2A
588
        test    ah, ah
589
        jnz     @b
590
        or      [ctrlstate], 1
591
        jmp     .keybar
592
.lshift_up:
593
; ignore E0 AA sequence
594
        test    ah, ah
595
        jnz     @b
596
        and     [ctrlstate], not 1
597
        jmp     .keybar
598
.rshift_down:
599
        or      [ctrlstate], 2
600
        jmp     .keybar
601
.rshift_up:
602
        and     [ctrlstate], not 2
603
        jmp     .keybar
604
.alt_down:
605
        test    ah, ah
606
        jnz     .ralt_down
607
        or      [ctrlstate], 0x10
608
        jmp     .keybar
609
.ralt_down:
610
        or      [ctrlstate], 0x20
611
        jmp     .keybar
612
.alt_up:
613
        test    ah, ah
614
        jnz     .ralt_up
615
        and     [ctrlstate], not 0x10
616
        jmp     .keybar
617
.ralt_up:
618
        and     [ctrlstate], not 0x20
619
        jmp     .keybar
620
 
621
process_ctrl_keys:
622
        cmp     byte [esi], 0
623
        jz      .done
624
        push    ecx
625
        cmp     al, [esi]
626
        jz      .check
627
.cont:
628
        pop     ecx
629
        add     esi, 8
630
        jmp     process_ctrl_keys
631
.done:
632
        stc
633
        ret
634
.check:
635
        mov     cl, 0
636
        call    .check_ctrlkey
637
        jc      .cont
638
        mov     cl, 2
639
        call    .check_ctrlkey
640
        jc      .cont
641
        mov     cl, 4
642
        call    .check_ctrlkey
643
        jc      .cont
644
        pop     ecx
645
        call    dword [esi+4]
646
        clc
647
        ret
648
.check_ctrlkey:
649
        push    eax edx
650
        movzx   edx, [ctrlstate]
651
        shr     edx, cl
652
        add     cl, cl
653
        movzx   eax, word [esi+2]
654
        shr     eax, cl
655
        and     eax, 15
656
        cmp     al, ctrlkey_tests_num
657
        jae     .fail
658
        xchg    eax, edx
659
        and     al, 3
660
        call    [ctrlkey_tests + edx*4]
661
        cmp     al, 1
662
        pop     edx eax
663
        ret
664
.fail:
665
        stc
666
        pop     edx eax
667
        ret
668
 
669
ctrlkey_test0:
670
        test    al, al
671
        setz    al
672
        ret
673
ctrlkey_test1:
674
        test    al, al
675
        setnp   al
676
        ret
677
ctrlkey_test2:
678
        cmp     al, 3
679
        setz    al
680
        ret
681
ctrlkey_test3:
682
        cmp     al, 1
683
        setz    al
684
        ret
685
ctrlkey_test4:
686
        cmp     al, 2
687
        setz    al
688
        ret
689
 
517 diamond 690
enum_associations_callback:
691
; LongBool __stdcall callback(f_name,sec_name,key_name);
692
; [esp+4] = f_name, [esp+8] = sec_name, [esp+12] = key_name
693
        mov     esi, [esp+12]
694
        mov     edi, esi
695
@@:
696
        lodsb
697
        test    al, al
698
        jnz     @b
699
        sub     esi, edi        ; esi = size of key name
700
        push    nullstr
701
        push    1024
702
        push    saved_file_name
703
        push    edi
704
        push    dword [esp+16+8]
705
        push    dword [esp+20+4]
706
        call    [ini.get_str]
707
        test    eax, eax
708
        jnz     .ret
709
        mov     eax, saved_file_name
710
@@:
711
        inc     esi
712
        inc     eax
713
        cmp     byte [eax-1], 0
714
        jnz     @b
715
; esi = total size of entry
716
        push    esi
717
        add     esi, [associations_size]
718
        mov     ecx, [associations_allocated]
719
@@:
720
        cmp     esi, ecx
721
        jbe     @f
722
        add     ecx, ecx
723
        jmp     @b
724
@@:
725
        pop     esi
726
        cmp     [associations_allocated], ecx
727
        jz      @f
728
        mov     [associations_allocated], ecx
729
        mov     edx, [associations]
730
        call    xpgrealloc
731
        mov     [associations], eax
732
        test    eax, eax
733
        jz      .err
734
@@:
735
        mov     eax, esi
736
        mov     esi, edi
737
        mov     edi, [associations]
738
        add     edi, [associations_size]
739
        dec     edi
740
        add     [associations_size], eax
741
@@:
742
        lodsb
743
        stosb
744
        test    al, al
745
        jnz     @b
746
        mov     esi, saved_file_name
747
@@:
748
        lodsb
749
        stosb
750
        test    al, al
751
        jnz     @b
752
.ret:
753
        mov     al, 1
754
        ret     12
755
.err:
756
        mov     ecx, edx
757
        call    pgfree
758
        xor     eax, eax
759
        ret     12
760
 
589 diamond 761
enum_plugins_callback:
762
; LongBool __stdcall callback(f_name,sec_name,key_name);
763
; [esp+4] = f_name, [esp+8] = sec_name, [esp+12] = key_name
764
        push    nullstr
765
        push    1024
766
        push    saved_file_name
767
        push    dword [esp+12+12]
768
        push    dword [esp+16+8]
769
        push    dword [esp+20+4]
770
        call    [ini.get_str]
771
        test    eax, eax
772
        jnz     .ret
773
        mov     esi, saved_file_name
774
        cmp     byte [esi], '/'
775
        jz      .absolute
776
; convert path to absolute
777
        mov     edi, execdata
778
        push    esi
779
@@:
780
        lodsb
781
        stosb
782
        test    al, al
783
        jnz     @b
784
        pop     edi
785
        mov     esi, app_path
786
        push    esi
787
        xor     ecx, ecx
788
@@:
789
        lodsb
790
        test    al, al
791
        jz      @f
792
        cmp     al, '/'
793
        jnz     @b
794
        mov     ecx, esi
795
        jmp     @b
796
@@:
797
        pop     esi
798
        sub     ecx, esi
799
        rep     movsb
800
        mov     esi, execdata
801
.z:
802
        cmp     word [esi], '.'
803
        jz      .ret
804
        cmp     word [esi], './'
805
        jnz     @f
806
        add     esi, 2
807
        jmp     .z
808
@@:
809
        cmp     word [esi], '..'
810
        jnz     .c
811
        cmp     byte [esi+2], 0
812
        jz      .ret
813
        cmp     byte [esi+2], '/'
814
        jnz     .c
815
        add     esi, 3
816
@@:
817
        dec     edi
818
        cmp     edi, saved_file_name
819
        jbe     .ret
820
        cmp     byte [edi-1], '/'
821
        jnz     @b
822
        jmp     .z
823
.c:
824
        lodsb
825
        stosb
826
        test    al, al
827
        jz      @f
828
        cmp     edi, saved_file_name+1024
829
        jb      .c
830
        mov     esi, execdata
831
        call    load_dll_and_import.big
832
.ret:
833
        mov     al, 1
834
        ret     12
835
@@:
836
.absolute:
837
; allocate space for plugin info
838
        mov     eax, [num_plugins]
839
        inc     eax
840
        mov     [num_plugins], eax
841
        imul    ecx, eax, PluginInfo.size
842
        cmp     ecx, [alloc_plugins]
843
        jbe     .norealloc
844
        mov     edx, [plugins]
845
        call    xpgrealloc
846
        test    eax, eax
847
        jnz     @f
848
.dec_ret:
849
        dec     [num_plugins]
850
        jmp     .ret
851
@@:
852
        mov     [plugins], eax
853
        lea     eax, [ecx+0xFFF]
854
        and     eax, not 0xFFF
855
        mov     [alloc_plugins], eax
856
.norealloc:
857
        mov     esi, [plugins]
858
        lea     esi, [esi+ecx-PluginInfo.size]
859
; load plugin DLL
860
        or      ebp, -1
861
        mov     eax, saved_file_name
862
        call    load_dll_and_import.do
863
        test    eax, eax
864
        jnz     .dec_ret
865
; find exported functions
866
        mov     eax, aVersion
867
        call    load_dll_and_import.find_exported_function
868
        jnc     @f
869
        xor     eax, eax
870
@@:
871
MIN_INTERFACE_VER = 1
872
MAX_INTERFACE_VER = 1
873
        cmp     eax, MIN_INTERFACE_VER
874
        jae     @f
875
        cmp     eax, MAX_INTERFACE_VER
876
        jbe     @f
877
        push    aIncompatibleVersion
878
.cantload:
879
        push    saved_file_name
880
        push    aCannotLoadPlugin
881
        mov     eax, esp
882
        push    ContinueBtn
883
        push    1
884
        push    eax
885
        push    3
886
        call    SayErr
887
        add     esp, 12
888
        jmp     .dec_ret
889
@@:
890
        mov     edi, esi
891
        mov     esi, plugin_exported
892
.import:
893
        lodsd
894
        test    eax, eax
895
        jz      .import_done
896
        call    load_dll_and_import.find_exported_function
897
        jnc     @f
898
        mov     eax, [esi-4+plugin_exported_default-plugin_exported]
899
@@:
900
        stosd
901
        jmp     .import
902
.import_done:
903
; initialize plugin
904
        mov     eax, aPluginLoad
905
        call    load_dll_and_import.find_exported_function
906
        jc      .ok
907
        push    kfar_info
908
        call    eax
909
        cmp     eax, 1
910
        jb      .ok
911
        ja      .dec_ret
912
        push    aInitFailed
913
        jmp     .cantload
914
.ok:
915
        mov     al, 1
916
        ret     12
917
 
918
plugin_unload_default:
919
        ret
920
 
921
OpenFilePlugin_default:
922
GetFiles_default:
923
        xor     eax, eax
924
        ret     20
925
 
926
ClosePlugin_default:
927
        ret     4
928
 
929
GetOpenPluginInfo_default:
930
        ret     8
931
 
932
SetFolder_default:
933
open_default:
934
        xor     eax, eax
935
        ret     12
936
 
180 heavyiron 937
new_screen:
474 diamond 938
; in: ecx=sizeof(screen data), edx->vtable
939
; out: ebp=pointer or NULL, eax!=0 if successful
940
; destroys ebx,ecx
941
        call    xpgalloc
180 heavyiron 942
        test    eax, eax
943
        jnz     @f
944
        ret
945
@@:
946
        mov     ebp, eax
947
        mov     eax, [screens]
474 diamond 948
        mov     ecx, [num_screens]
949
        inc     ecx
950
        shl     ecx, 3
951
        test    ecx, 0xFFF
952
        jnz     .norealloc
953
        push    edx
954
        mov     edx, eax
955
        call    xpgrealloc
956
        pop     edx
180 heavyiron 957
        test    eax, eax
958
        jnz     @f
474 diamond 959
        mov     ecx, ebp
960
        call    pgfree
180 heavyiron 961
        xor     eax, eax
962
        ret
963
@@:
964
        mov     [screens], eax
474 diamond 965
.norealloc:
180 heavyiron 966
        inc     [num_screens]
474 diamond 967
        mov     [eax+ecx-8], edx
968
        mov     [eax+ecx-4], ebp
180 heavyiron 969
        mov     eax, [num_screens]
970
        dec     eax
971
        mov     [active_screen], eax
972
        mov     [active_screen_vtable], edx
973
        mov     [active_screen_data], ebp
974
        jmp     draw_keybar
975
 
976
next_screen:
977
        mov     eax, [active_screen]
978
        inc     eax
979
        cmp     eax, [num_screens]
980
        jnz     @f
981
        xor     eax, eax
982
@@:     mov     [active_screen], eax
983
        jmp     change_screen
984
 
985
delete_active_screen:
986
        mov     edi, [screens]
987
        mov     eax, [active_screen]
988
        shl     eax, 3
989
        add     edi, eax
990
        push    dword [edi+4]
991
        lea     esi, [edi+8]
992
        mov     ecx, [num_screens]
993
        sub     ecx, [active_screen]
994
        dec     ecx
995
        add     ecx, ecx
996
        rep     movsd
997
        dec     [num_screens]
474 diamond 998
        mov     ecx, [num_screens]
999
        shl     ecx, 3
1000
        test    ecx, 0xFFF
1001
        jnz     .norealloc
1002
        mov     edx, [screens]
1003
        call    pgrealloc               ; must succeed, because we decrease size
1004
        mov     [screens], eax
1005
.norealloc:
1006
        pop     ecx
1007
        call    pgfree
180 heavyiron 1008
        and     [active_screen], 0
1009
 
1010
change_screen:
1011
        pusha
1012
        mov     eax, [active_screen]
1013
        mov     esi, [screens]
1014
        mov     ebp, [esi+eax*8+4]
1015
        mov     eax, [esi+eax*8]
1016
        mov     [active_screen_vtable], eax
1017
        mov     [active_screen_data], ebp
1018
        call    draw_keybar
1019
        call    [eax+screen_vtable.OnRedraw]
1020
        popa
1021
        ret
1022
 
1023
F12:
1024
        mov     eax, [cur_width]
1025
        add     eax, 8
1026
        mov     esi, eax
1027
        mul     [num_screens]
474 diamond 1028
        mov     ecx, eax
1029
        call    xpgalloc
180 heavyiron 1030
        test    eax, eax
1031
        jnz     @f
1032
        ret
1033
@@:
1034
        mov     ebx, eax
1035
        mov     edi, eax
1036
        xor     ecx, ecx
1037
.next:
1038
        xor     eax, eax
1039
        stosd
1040
        inc     ecx
1041
        cmp     ecx, [num_screens]
1042
        jz      @f
1043
        lea     eax, [edi+esi-4]
1044
        mov     dword [edi-4], eax
1045
@@:
1046
        xor     eax, eax
1047
        stosd
1048
        dec     ecx
1049
        jz      @f
1050
        lea     eax, [edi-8]
1051
        sub     eax, esi
1052
        mov     dword [edi-4], eax
1053
@@:
1054
        mov     al, '&'
1055
        stosb
1056
        cmp     ecx, 36
1057
        jae     .noletter
1058
        lea     eax, [ecx+'0']
1059
        cmp     al, '9'
1060
        jbe     @f
1061
        add     al, 7
1062
@@:
1063
        stosb
1064
        mov     al, '.'
1065
        stosb
1066
        jmp     .letter_done
1067
.noletter:
1068
        mov     al, ' '
1069
        stosb
1070
        stosb
1071
.letter_done:
1072
        mov     al, ' '
1073
        stosb
1074
        pushad
1075
        mov     eax, [screens]
1076
        mov     ebp, [eax+ecx*8+4]
1077
        mov     eax, [eax+ecx*8]
1078
        mov     ecx, [cur_width]
1079
        sub     ecx, 12
1080
        call    [eax + screen_vtable.getname]
1081
        popad
1082
        sub     edi, 4
1083
        add     edi, [cur_width]
1084
        inc     ecx
1085
        cmp     ecx, [num_screens]
1086
        jb      .next
1087
        mov     eax, [active_screen]
1088
        mul     esi
1089
        add     eax, ebx
1090
        push    1
474 diamond 1091
        push    dword aScreens
180 heavyiron 1092
        push    eax
1093
        call    menu
1094
        cmp     eax, -1
1095
        jz      @f
1096
        sub     eax, ebx
1097
        div     esi
1098
        mov     [active_screen], eax
1099
@@:
474 diamond 1100
        mov     ecx, ebx
1101
        call    pgfree
180 heavyiron 1102
        jmp     change_screen
1103
 
1104
panels_OnKey:
1105
        mov     ebp, [active_panel]
1106
        mov     ecx, [ebp + panel1_index - panel1_data]
1107
        mov     edx, [ebp + panel1_start - panel1_data]
1108
        mov     ebx, [ebp + panel1_colst - panel1_data]
1109
        add     ebx, edx
1110
        mov     esi, panels_ctrlkeys
1111
        jmp     process_ctrl_keys
1112
.ret:
1113
        ret
1114
.up:
1115
        jecxz   .ret
1116
        dec     ecx
1117
        mov     [ebp + panel1_index - panel1_data], ecx
1118
        cmp     ecx, edx
1119
        jae     .done_redraw
1120
        mov     [ebp + panel1_start - panel1_data], ecx
1121
.done_redraw:
1122
;        call    draw_panel
1123
;        ret
1124
        jmp     draw_panel
474 diamond 1125
.insert:
1126
        lea     eax, [ecx*4]
1127
        add     eax, [ebp + panel1_files - panel1_data]
1128
        mov     eax, [eax]
1129
        cmp     word [eax+40], '..'
1130
        jnz     @f
1131
        cmp     byte [eax+42], 0
1132
        jz      .insert.down
1133
@@:
1134
        xor     byte [eax+303], 1
1135
        mov     edx, [eax+32]
1136
        test    byte [eax+303], 1
1137
        mov     eax, [eax+36]
1138
        jnz     .insert.increase
1139
        sub     dword [ebp + panel1_selected_size - panel1_data], edx
1140
        sbb     dword [ebp + panel1_selected_size+4 - panel1_data], eax
1141
        dec     [ebp + panel1_selected_num - panel1_data]
1142
        jmp     .insert.down
1143
.insert.increase:
1144
        add     dword [ebp + panel1_selected_size - panel1_data], edx
1145
        adc     dword [ebp + panel1_selected_size+4 - panel1_data], eax
1146
        inc     [ebp + panel1_selected_num - panel1_data]
1147
.insert.down:
1148
        inc     ecx
1149
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
1150
        jae     .done_redraw
1151
        jmp     @f
180 heavyiron 1152
.down:
1153
        inc     ecx
1154
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
1155
        jae     .ret
474 diamond 1156
@@:
180 heavyiron 1157
        mov     [ebp + panel1_index - panel1_data], ecx
1158
        cmp     ecx, ebx
1159
        jb      .done_redraw
1160
        sub     ecx, [ebp + panel1_colst - panel1_data]
1161
        inc     ecx
1162
        mov     [ebp + panel1_start - panel1_data], ecx
1163
        jmp     .done_redraw
1164
.left:
474 diamond 1165
        test    ecx, ecx
1166
        jnz     @f
1167
        ret
1168
@@:
1169
        mov     eax, [ebp + panel1_colsz - panel1_data]
1170
        sub     ecx, eax
180 heavyiron 1171
        jae     @f
1172
        xor     ecx, ecx
1173
@@:
1174
        mov     [ebp + panel1_index - panel1_data], ecx
474 diamond 1175
.finalize_left:
180 heavyiron 1176
        cmp     ecx, edx
1177
        jae     .done_redraw
474 diamond 1178
        sub     edx, eax
180 heavyiron 1179
        jae     @f
1180
        xor     edx, edx
1181
@@:
1182
        mov     [ebp + panel1_start - panel1_data], edx
1183
        jmp     .done_redraw
474 diamond 1184
.pgup:
1185
        mov     eax, [ebp + panel1_colst - panel1_data]
1186
        dec     eax
1187
        jnz     @f
1188
        inc     eax
1189
@@:
1190
        test    ecx, ecx
1191
        jnz     @f
1192
        ret
1193
@@:
1194
        sub     ecx, eax
1195
        jae     @f
1196
        xor     ecx, ecx
1197
@@:
1198
        mov     [ebp + panel1_index - panel1_data], ecx
1199
        dec     ecx
1200
        jmp     .finalize_left
180 heavyiron 1201
.right:
474 diamond 1202
        mov     eax, [ebp + panel1_colsz - panel1_data]
1203
        add     ecx, eax
180 heavyiron 1204
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
1205
        jb      @f
1206
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
1207
        dec     ecx
1208
@@:
1209
        mov     [ebp + panel1_index - panel1_data], ecx
474 diamond 1210
.finalize_right:
180 heavyiron 1211
        cmp     ecx, ebx
1212
        jb      .done_redraw
474 diamond 1213
        add     ebx, eax
180 heavyiron 1214
        cmp     ebx, [ebp + panel1_numfiles - panel1_data]
1215
        jbe     @f
1216
        mov     ebx, [ebp + panel1_numfiles - panel1_data]
1217
@@:
1218
        sub     ebx, [ebp + panel1_colst - panel1_data]
1219
        jae     @f
1220
        xor     ebx, ebx
1221
@@:
1222
        mov     [ebp + panel1_start - panel1_data], ebx
1223
        jmp     .done_redraw
474 diamond 1224
.pgdn:
1225
        mov     eax, [ebp + panel1_colst - panel1_data]
1226
        dec     eax
1227
        jnz     @f
1228
        inc     eax
1229
@@:
1230
        add     ecx, eax
1231
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
1232
        jb      @f
1233
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
1234
        dec     ecx
1235
@@:
1236
        mov     [ebp + panel1_index - panel1_data], ecx
1237
        inc     ecx
1238
        jmp     .finalize_right
180 heavyiron 1239
.tab:
1240
        xor     [active_panel], panel1_data xor panel2_data
1241
        call    draw_cmdbar
1242
        call    draw_panel
1243
        mov     ebp, [active_panel]
1244
        jmp     .done_redraw
1245
.home:
1246
        and     [ebp + panel1_start - panel1_data], 0
1247
        and     [ebp + panel1_index - panel1_data], 0
1248
        jmp     .done_redraw
1249
.end:
1250
        mov     eax, [ebp + panel1_numfiles - panel1_data]
1251
        dec     eax
1252
        mov     [ebp + panel1_index - panel1_data], eax
1253
        inc     eax
1254
        sub     eax, [ebp + panel1_colst - panel1_data]
1255
        jae     @f
1256
        xor     eax, eax
1257
@@:
1258
        mov     [ebp + panel1_start - panel1_data], eax
1259
        jmp     .done_redraw
1260
.enter:
183 diamond 1261
        call    get_curfile_folder_entry
180 heavyiron 1262
        test    byte [ecx], 10h
1263
        jnz     .enter_folder
589 diamond 1264
; todo: add  handling on plugin panel
1265
        cmp     [ebp + panel1_hPlugin - panel1_data], 0
1266
        jnz     .ret
1267
; generate full file name
1268
        lea     esi, [ebp + panel1_dir - panel1_data]
1269
        mov     edi, execdata
1270
@@:
1271
        lodsb
1272
        test    al, al
1273
        jz      @f
1274
        stosb
1275
        cmp     edi, execdataend-1
1276
        jae     .bigfilename
1277
        jmp     @b
1278
@@:
1279
        lea     esi, [ecx+40]
1280
        mov     al, '/'
1281
        stosb
1282
@@:
1283
        lodsb
1284
        stosb
1285
        cmp     edi, execdataend
1286
        ja      .bigfilename
1287
        test    al, al
1288
        jnz     @b
1289
; try to open file and look for all plugins
1290
        push    O_READ
1291
        push    execdata
1292
        call    open
1293
        test    eax, eax
1294
        jz      .noplugins      ; if can't open, just try to execute
1295
        mov     esi, eax        ; save handle
1296
        push    filedata_buffer_size
1297
        push    filedata_buffer
1298
        push    esi
1299
        call    read
1300
        mov     edi, eax        ; save size of read data
1301
; test for Kolibri executable
1302
        cmp     eax, 24h
1303
        jb      .enter.noexec
1304
        cmp     dword [filedata_buffer], 'MENU'
1305
        jnz     @f
1306
        cmp     word [filedata_buffer+4], 'ET'
1307
        jnz     @f
1308
.close_run:
1309
        push    esi
1310
        call    close
1311
        jmp     .run_app
1312
@@:
1313
        cmp     dword [filedata_buffer], 'KPCK'
1314
        jnz     @f
1315
        cmp     dword [filedata_buffer+12], 0x26914601
1316
        jz      .close_run
1317
@@:
1318
.enter.noexec:
1319
        mov     ecx, [num_plugins]
1320
        mov     edx, [plugins]
1321
        sub     edx, PluginInfo.size
1322
.plugloop:
1323
        add     edx, PluginInfo.size
1324
        dec     ecx
1325
        js      .plugdone
1326
        pushad
1327
        push    edi
1328
        push    filedata_buffer
1329
        call    get_curfile_folder_entry
1330
        push    ecx
1331
        push    execdata
1332
        push    esi
1333
        call    [edx+PluginInfo.OpenFilePlugin]
1334
        mov     [esp+28], eax
1335
        popad
1336
        test    eax, eax
1337
        jz      .plugloop
1338
        cmp     eax, -1
1339
        jnz     .pluginok
1340
        push    esi
1341
        call    close
1342
        ret
1343
.pluginok:
1344
; save current directory and set root directory of hPlugin
1345
        mov     edi, eax        ; save handle
1346
        mov     esi, execdata
1347
@@:
1348
        lodsb
1349
        test    al, al
1350
        jnz     @b
1351
        sub     esi, execdata-9
1352
; allocate esi bytes in buffer 'parents'
1353
        mov     ecx, [ebp + panel1_parents_sz - panel1_data]
1354
        add     ecx, esi
1355
        cmp     ecx, [ebp + panel1_parents_alloc - panel1_data]
1356
        jbe     .enter.norealloc
1357
        push    edx
1358
        mov     edx, [ebp + panel1_parents - panel1_data]
1359
        call    xpgrealloc
1360
        pop     edx
1361
        test    eax, eax
1362
        jnz     @f
1363
        push    edi
1364
        call    [edx+PluginInfo.ClosePlugin]
1365
        ret
1366
@@:
1367
        mov     [ebp + panel1_parents - panel1_data], eax
1368
.enter.norealloc:
1369
        mov     [ebp + panel1_parents_sz - panel1_data], ecx
1370
; save current state to the end of buffer
1371
        sub     ecx, esi
1372
        add     ecx, [ebp + panel1_parents - panel1_data]
1373
        xchg    edx, [ebp + panel1_hPlugin - panel1_data]
1374
        mov     [ecx], edx
1375
        xchg    edi, [ebp + panel1_hFile - panel1_data]
1376
        mov     [ecx+4], edi
1377
        mov     byte [ecx+8], 0
1378
        lea     edi, [ecx+9]
1379
        lea     ecx, [esi-9]
1380
        mov     esi, execdata
1381
        rep     movsb
1382
        mov     word [ebp + panel1_dir - panel1_data], '/'
1383
        mov     eax, [ebp + panel1_hPlugin - panel1_data]
1384
        lea     ebx, [ebp + panel1_plugin_info - panel1_data]
1385
        and     dword [ebx], 0
1386
        push    ebp
1387
        push    ebx
1388
        push    [ebp + panel1_hFile - panel1_data]
1389
        call    [eax+PluginInfo.GetOpenPluginInfo]
1390
        pop     ebp
1391
        call    get_curfile_folder_entry
1392
        mov     esi, ecx
1393
        mov     edi, left_dotdot_entry
1394
        cmp     ebp, panel1_data
1395
        jz      @f
1396
        add     edi, right_dotdot_entry-left_dotdot_entry
1397
@@:
1398
        mov     ecx, 10
1399
        rep     movsd
1400
        mov     byte [edi-40], 10h      ; attributes: folder
1401
        mov     eax, '..'
1402
        stosd
1403
        jmp     .reread
1404
.plugdone:
1405
        push    esi
1406
        call    close
1407
.noplugins:
1408
; run program or association
1409
        call    get_curfile_folder_entry
283 diamond 1410
        call    find_extension
1411
        jc      .run_app
180 heavyiron 1412
.run_association:
474 diamond 1413
        cmp     byte [edi], 0
1414
        jz      .l1
1415
        cmp     byte [edi], ';'
1416
        jnz     @f
1417
.l1:
1418
        ret
1419
@@:
1420
        mov     esi, edi
1421
@@:
1422
        lodsb
1423
        test    al, al
1424
        jz      @f
1425
        cmp     al, ';'
1426
        jnz     @b
1427
        dec     esi
1428
        mov     byte [esi], 0
1429
        mov     [restore_semicolon], esi
1430
@@:
283 diamond 1431
.run_association2:
180 heavyiron 1432
        mov     [execparams], execdata
474 diamond 1433
        mov     [execptr], edi
180 heavyiron 1434
        jmp     .dorun
1435
.run_app:
1436
        mov     [execptr], execdata
1437
        and     [execparams], 0
1438
.dorun:
283 diamond 1439
; for fasm call - special handling, because
1440
; 1) fasm command line convention is different : fasm infile,outfile[,path] rather than tinypad infile
1441
; 2) fasm will probably create new file in directory, so we want to reload panel data
1442
        xor     edx, edx
1443
        cmp     [execparams], edx
1444
        jz      .nofasm
474 diamond 1445
        mov     esi, [execptr]
1446
@@:
1447
        lodsb
1448
        test    al, al
1449
        jnz     @b
1450
        mov     eax, [esi-5]
1451
        or      eax, 0x20202020
1452
        cmp     eax, 'fasm'
283 diamond 1453
        jnz     .nofasm
321 diamond 1454
        cmp     edi, execdata+(execdataend-execdata)/2
1455
        ja      .bigfilename
283 diamond 1456
        mov     esi, execdata
1457
@@:
1458
        lodsb
1459
        stosb
1460
        test    al, al
1461
        jnz     @b
1462
        mov     byte [esi-1], ','
1463
        inc     edx
1464
; output file: no extension if input file has extension, '.bin' otherwise
1465
        push    edi
1466
@@:
1467
        dec     edi
1468
        cmp     byte [edi], '.'
1469
        jz      .ptfound
1470
        cmp     byte [edi], '/'
1471
        jnz     @b
1472
        pop     edi
321 diamond 1473
        cmp     edi, execdataend-4
1474
        ja      .bigfilename
283 diamond 1475
        mov     dword [edi-1], '.bin'
1476
        mov     byte [edi+3], 0
1477
        jmp     .nofasm
1478
.ptfound:
1479
        mov     byte [edi], 0
1480
        pop     edi
1481
.nofasm:
321 diamond 1482
        mov     ebx, execinfo
1483
; if command line is more than 256 symbols, the kernel will truncate it
517 diamond 1484
; we do not want this!
321 diamond 1485
; N.B. We know that command line is either NULL or execdata, which is always ASCIIZ string,
1486
;      but can be up to 1023 symbols
1487
        mov     esi, [ebx+8]
1488
        test    esi, esi
1489
        jz      .cmdlinelenok
1490
@@:
1491
        lodsb
1492
        test    al, al
1493
        jnz     @b
1494
        sub     esi, [ebx+8]
1495
        dec     esi
1496
        cmp     esi, 256
1497
        ja      .bigcmdline
1498
.cmdlinelenok:
180 heavyiron 1499
        push    70
1500
        pop     eax
517 diamond 1501
        int     40h
474 diamond 1502
        xor     esi, esi
1503
        xchg    esi, [restore_semicolon]
1504
        test    esi, esi
1505
        jz      @f
1506
        mov     byte [esi], ';'
1507
@@:
321 diamond 1508
        neg     eax
1509
        js      @f
1510
        call    get_error_msg
1511
        push    eax
474 diamond 1512
        push    dword aRunError
321 diamond 1513
        mov     eax, esp
517 diamond 1514
        push    ContinueBtn
321 diamond 1515
        push    1
1516
        push    eax
1517
        push    2
1518
        call    SayErr
517 diamond 1519
        pop     eax
1520
        pop     eax
321 diamond 1521
        ret
1522
@@:
283 diamond 1523
        test    edx, edx
1524
        jz      @f
1525
        push    5
1526
        pop     eax
1527
        push    20
1528
        pop     ebx
517 diamond 1529
        int     0x40
283 diamond 1530
        jmp     .ctrl_r
1531
@@:
180 heavyiron 1532
        ret
321 diamond 1533
.bigfilename3:
1534
        pop     esi
1535
.bigfilename2:
1536
        pop     esi
1537
.bigfilename:
1538
        mov     eax, aFileNameTooBig
474 diamond 1539
.l2:
1540
        xor     esi, esi
1541
        xchg    esi, [restore_semicolon]
1542
        test    esi, esi
1543
        jz      @f
1544
        mov     byte [esi], ';'
321 diamond 1545
@@:
1546
        push    eax
1547
        mov     eax, esp
517 diamond 1548
        push    ContinueBtn
321 diamond 1549
        push    1
1550
        push    eax
1551
        push    1
1552
        call    SayErr
517 diamond 1553
        pop     eax
321 diamond 1554
        ret
1555
.bigcmdline:
1556
        mov     eax, aCmdLineTooBig
474 diamond 1557
        jmp     .l2
321 diamond 1558
.bigfoldername2:
589 diamond 1559
        mov     esi, prev_dir
1560
        lea     edi, [ebp + panel1_dir - panel1_data]
1561
@@:
1562
        lodsb
1563
        stosb
1564
        test    al, al
1565
        jnz     @b
321 diamond 1566
.bigfoldername:
1567
        mov     eax, aFolderNameTooBig
474 diamond 1568
        jmp     .l2
180 heavyiron 1569
.enter_folder:
1570
        lea     esi, [ecx+40]
1571
        cmp     word [esi], '..'
1572
        jnz     @f
1573
        cmp     byte [esi+2], 0
1574
        jz      .dotdot
1575
@@:
314 diamond 1576
        push    esi
1577
        lea     esi, [ebp + panel1_dir - panel1_data]
1578
        mov     edi, prev_dir
1579
@@:
1580
        lodsb
1581
        stosb
1582
        test    al, al
1583
        jnz     @b
1584
        lea     edi, [esi-1]
321 diamond 1585
        lea     edx, [ebp + panel1_dir - panel1_data + 1024]
1586
        cmp     esi, edx
314 diamond 1587
        pop     esi
321 diamond 1588
        jae     .bigfoldername
180 heavyiron 1589
        mov     al, '/'
1590
        cmp     [edi-1], al
1591
        jz      @f
1592
        stosb
1593
@@:
1594
        lodsb
321 diamond 1595
        cmp     edi, edx
1596
        jae     .bigfoldername2
180 heavyiron 1597
        stosb
1598
        test    al, al
1599
        jnz     @b
589 diamond 1600
        mov     eax, [ebp + panel1_hPlugin - panel1_data]
1601
        test    eax, eax
1602
        jz      .reread
1603
        push    ebp
1604
        lea     esi, [ebp + panel1_dir - panel1_data]
1605
        push    esi
1606
        add     ecx, 40
1607
        push    ecx
1608
        push    [ebp + panel1_hFile - panel1_data]
1609
        call    [eax+PluginInfo.SetFolder]
1610
        pop     ebp
1611
        test    al, al
1612
        jnz     .reread
1613
        mov     esi, prev_dir
1614
        lea     edi, [ebp + panel1_dir - panel1_data]
1615
@@:
1616
        lodsb
1617
        stosb
1618
        test    al, al
1619
        jnz     @b
1620
.retd:
1621
        ret
180 heavyiron 1622
.reread:
1623
        call    read_folder
1624
.done_cmdbar:
1625
        call    draw_cmdbar
1626
        jmp     .done_redraw
1627
.dotdot:
1628
        lea     edi, [ebp + panel1_dir - panel1_data]
589 diamond 1629
        cmp     word [edi], '/'
1630
        jnz     .dotdot_noroot
1631
        cmp     [ebp + panel1_hPlugin - panel1_data], 0
1632
        jz      .retd
1633
        call    close_plugin_panel
1634
        jmp     .dotdot
1635
.dotdot_noroot:
1636
        mov     edx, edi
180 heavyiron 1637
        mov     al, 0
1638
        or      ecx, -1
1639
        repnz   scasb
1640
        dec     edi
1641
        mov     al, '/'
1642
        std
1643
        repnz   scasb
1644
        cld
1645
        inc     edi
589 diamond 1646
        cmp     edi, edx
1647
        jnz     @f
1648
        inc     edi
1649
@@:
1650
        push    dword [edi]
180 heavyiron 1651
        mov     byte [edi], 0
1652
        push    edi
589 diamond 1653
        mov     eax, [ebp + panel1_hPlugin - panel1_data]
1654
        test    eax, eax
1655
        jz      .dotdot_native
1656
        push    ebp
1657
        lea     esi, [ebp + panel1_dir - panel1_data]
1658
        push    esi
1659
        push    aDotDot
1660
        push    [ebp + panel1_hFile - panel1_data]
1661
        call    [eax+PluginInfo.SetFolder]
1662
        pop     ebp
1663
        test    al, al
1664
        jnz     .dotdot_native
1665
        pop     edi
1666
        pop     dword [edi]
1667
        ret
1668
.dotdot_native:
180 heavyiron 1669
        call    read_folder
1670
        pop     edi
589 diamond 1671
        pop     dword [edi]
1672
        push    edi
1673
        cmp     byte [edi], '/'
1674
        jnz     @f
1675
        inc     edi
1676
@@:
180 heavyiron 1677
        mov     edx, [ebp + panel1_files - panel1_data]
1678
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
1679
.scanloop:
1680
        mov     esi, [edx]
321 diamond 1681
        add     esi, 40
180 heavyiron 1682
        push    esi edi
1683
@@:
1684
        lodsb
1685
        call    match_symbol
1686
        jnz     @f
1687
        inc     edi
1688
        test    al, al
1689
        jnz     @b
1690
@@:
1691
        pop     edi esi
1692
        jz      .scanfound
1693
        add     edx, 4
1694
        loop    .scanloop
1695
        jmp     .scandone
1696
.scanfound:
1697
        sub     edx, [ebp + panel1_files - panel1_data]
1698
        shr     edx, 2
1699
        mov     [ebp + panel1_index - panel1_data], edx
1700
        sub     edx, [ebp + panel1_colst - panel1_data]
1701
        jb      .scandone
1702
        inc     edx
1703
        mov     [ebp + panel1_start - panel1_data], edx
1704
.scandone:
589 diamond 1705
        pop     edi
1706
        mov     byte [edi], 0
180 heavyiron 1707
        jmp     .done_cmdbar
1708
.ctrl_f39:
1709
        sub     al, 0x3D
1710
        add     al, al
1711
        mov     ah, [ebp + panel1_sortmode - panel1_data]
1712
        and     ah, 0xFE
1713
        cmp     al, ah
1714
        jnz     @f
1715
        and     [ebp + panel1_sortmode - panel1_data], 1
1716
        or      al, [ebp + panel1_sortmode - panel1_data]
1717
        xor     al, 1
1718
@@:
1719
        mov     [ebp + panel1_sortmode - panel1_data], al
1720
        mov     eax, [ebp + panel1_index - panel1_data]
1721
        mov     ecx, [ebp + panel1_files - panel1_data]
1722
        push    dword [ecx+eax*4]
1723
        push    ecx
1724
        call    sort_files
1725
        pop     edi
1726
        pop     eax
1727
        or      ecx, -1
1728
        repnz   scasd
1729
        not     ecx
1730
        dec     ecx
1731
        mov     [ebp + panel1_index - panel1_data], ecx
1732
        sub     ecx, [ebp + panel1_start - panel1_data]
1733
        jb      .less_start
1734
        sub     ecx, [ebp + panel1_colst - panel1_data]
1735
        jae     .gr_end
1736
@@:     jmp     .done_redraw
1737
.less_start:
1738
        add     [ebp + panel1_start - panel1_data], ecx
1739
        jmp     @b
1740
.gr_end:
1741
        inc     ecx
1742
        add     [ebp + panel1_start - panel1_data], ecx
1743
        jmp     @b
1744
.alt_f12:
1745
        mov     ebp, panel1_data
1746
        cmp     al, 0x3B
1747
        jz      @f
1748
        mov     ebp, panel2_data
1749
@@:
1750
; get drives list
1751
        mov     ebx, dirinfo
1752
        mov     [ebx+dirinfo.size-dirinfo], 1
1753
        mov     [ebx+dirinfo.dirdata-dirinfo], driveinfo
1754
        mov     [ebx+dirinfo.name-dirinfo], tmpname
1755
        mov     byte [tmpname], '/'
474 diamond 1756
        xor     edx, edx
180 heavyiron 1757
        xor     ecx, ecx
1758
.drive_loop_e:
1759
        mov     byte [tmpname+1], 0
1760
        push    70
1761
        pop     eax
517 diamond 1762
        int     40h
180 heavyiron 1763
        mov     ebx, dirinfo
1764
        test    eax, eax
1765
        jnz     .drive_loop_e_done
1766
        mov     esi, driveinfo+32+40
1767
        mov     edi, tmpname+1
1768
@@:
1769
        lodsb
1770
        stosb
1771
        test    al, al
1772
        jnz     @b
1773
        push    [ebx+dirinfo.first-dirinfo]
1774
        and     [ebx+dirinfo.first-dirinfo], 0
1775
.drive_loop_i:
1776
        push    70
1777
        pop     eax
517 diamond 1778
        int     40h
180 heavyiron 1779
        mov     ebx, dirinfo
1780
        test    eax, eax
1781
        jnz     .drive_loop_i_done
474 diamond 1782
        add     ecx, 32+8
1783
        push    ecx
1784
        and     ecx, 0xFFF
1785
        cmp     ecx, 32+8
1786
        pop     ecx
1787
        ja      @f
1788
        call    xpgrealloc
1789
        mov     edx, eax
180 heavyiron 1790
        test    eax, eax
474 diamond 1791
        jnz     @f
1792
        pop     eax
1793
        ret
180 heavyiron 1794
@@:
474 diamond 1795
        lea     edi, [edx+ecx-32]
180 heavyiron 1796
        mov     esi, tmpname
1797
@@:
1798
        lodsb
1799
        test    al, al
1800
        jz      @f
1801
        stosb
1802
        jmp     @b
1803
@@:
1804
        mov     esi, driveinfo+32+40
1805
        mov     al, '/'
1806
        stosb
1807
@@:
1808
        lodsb
1809
        stosb
1810
        test    al, al
1811
        jnz     @b
1812
        inc     [ebx+dirinfo.first-dirinfo]
1813
        jmp     .drive_loop_i
1814
.drive_loop_i_done:
1815
        pop     [ebx+dirinfo.first-dirinfo]
1816
        inc     [ebx+dirinfo.first-dirinfo]
1817
        jmp     .drive_loop_e
1818
.drive_loop_e_done:
1819
        and     [ebx+dirinfo.first-dirinfo], 0
474 diamond 1820
        mov     edi, edx
1821
        xor     esi, esi
1822
        add     ecx, edx
1823
@@:
1824
        and     dword [edi], 0
1825
        mov     dword [edi+4], esi
1826
        mov     esi, edi
1827
        add     edi, 32+8
1828
        cmp     edi, ecx
1829
        jae     @f
1830
        mov     [esi], edi
1831
        jmp     @b
1832
@@:
1833
        mov     ecx, edx
180 heavyiron 1834
        lea     edi, [ebp + panel1_dir - panel1_data]
589 diamond 1835
        cmp     [ebp + panel1_hPlugin - panel1_data], 0
1836
        jz      .find_cur_drive_loop
1837
        mov     edi, [ebp + panel1_parents - panel1_data]
1838
        add     edi, 8
180 heavyiron 1839
.find_cur_drive_loop:
1840
        push    edi
1841
        lea     esi, [ecx+8]
1842
@@:
1843
        lodsb
1844
        test    al, al
1845
        jz      .cur_drive_found
1846
        call    match_symbol
1847
        jnz     @f
1848
        inc     edi
1849
        jmp     @b
1850
@@:
474 diamond 1851
        cmp     dword [ecx], 0
180 heavyiron 1852
        jz      @f
1853
        pop     edi
474 diamond 1854
        mov     ecx, [ecx]
180 heavyiron 1855
        jmp     .find_cur_drive_loop
1856
@@:
474 diamond 1857
        mov     ecx, edx
180 heavyiron 1858
.cur_drive_found:
1859
        pop     edi
1860
        push    1
1861
        push    aDrive
1862
        push    ecx
1863
        mov     eax, [ebp + panel1_height - panel1_data]
1864
        sub     eax, 2
1865
        jae     @f
1866
        add     eax, 2
1867
@@:
1868
        push    eax
1869
        push    [ebp + panel1_width - panel1_data]
1870
        push    [ebp + panel1_top - panel1_data]
1871
        push    [ebp + panel1_left - panel1_data]
1872
        call    menu_centered_in
1873
        cmp     eax, -1
589 diamond 1874
        jnz     @f
1875
        mov     ecx, edx
1876
        call    pgfree
1877
        ret
1878
@@:
1879
        push    eax
1880
        call    close_plugin_panels
180 heavyiron 1881
        lea     edi, [ebp + panel1_dir - panel1_data]
589 diamond 1882
        push    edi
314 diamond 1883
        mov     esi, edi
1884
        mov     edi, prev_dir
1885
        mov     ecx, 1024/4
1886
        rep     movsd
589 diamond 1887
        pop     edi
1888
        pop     esi
1889
        add     esi, 8
180 heavyiron 1890
@@:
1891
        lodsb
1892
        stosb
1893
        test    al, al
1894
        jnz     @b
474 diamond 1895
        mov     ecx, edx
1896
        call    pgfree
180 heavyiron 1897
        call    read_folder
1898
        jmp     .done_redraw
283 diamond 1899
.shift_f5:
589 diamond 1900
; todo: copy to plugin panel
1901
        cmp     [ebp + panel1_hPlugin - panel1_data], 0
1902
        jz      @f
1903
        ret
1904
@@:
517 diamond 1905
        mov     esi, ebp
1906
        cmp     [ebp + panel1_selected_num - panel1_data], 0
1907
        jnz     .f5_2
283 diamond 1908
        call    get_curfile_folder_entry
1909
        lea     esi, [ecx+40]
1910
        mov     edi, CopyDestEditBuf
1911
        mov     eax, CopyDestEditBuf.length
1912
        stosd
1913
        scasd
1914
        xor     eax, eax
1915
        stosd
1916
        mov     edx, edi
1917
@@:
1918
        lodsb
1919
        test    al, al
1920
        jz      .f5_common
1921
        stosb
1922
        jmp     @b
1923
.f5:
589 diamond 1924
; todo: copy to plugin panel
517 diamond 1925
        mov     esi, ebp
1926
        xor     esi, panel1_data xor panel2_data
589 diamond 1927
        cmp     [esi + panel1_hPlugin - panel1_data], 0
1928
        jz      .f5_2
1929
        ret
517 diamond 1930
.f5_2:
589 diamond 1931
        mov     eax, [ebp + panel1_hPlugin - panel1_data]
1932
        mov     [source_hModule], eax
1933
        mov     eax, [ebp + panel1_hFile - panel1_data]
1934
        mov     [source_hPlugin], eax
1935
        mov     eax, left_dotdot_entry
1936
        cmp     ebp, panel1_data
1937
        jz      @f
1938
        add     eax, right_dotdot_entry-left_dotdot_entry
1939
@@:
1940
        mov     [default_attr], eax
517 diamond 1941
        add     esi, panel1_dir - panel1_data
283 diamond 1942
        mov     edi, CopyDestEditBuf
1943
        mov     eax, CopyDestEditBuf.length
1944
        stosd
1945
        scasd
1946
        xor     eax, eax
1947
        stosd
1948
        mov     edx, edi
1949
@@:
1950
        lodsb
1951
        test    al, al
1952
        jz      @f
321 diamond 1953
        cmp     edi, CopyDestEditBuf+12+511
1954
        jae     .bigfoldername
283 diamond 1955
        stosb
1956
        jmp     @b
1957
@@:
1958
        mov     al, '/'
1959
        stosb
1960
.f5_common:
1961
        mov     byte [edi], 0
1962
        sub     edi, edx
1963
        mov     [edx-8], edi
1964
        mov     edi, CopySourceTextBuf
1965
        mov     esi, aCopy1
1966
@@:
1967
        lodsb
1968
        test    al, al
1969
        jz      @f
1970
        stosb
1971
        jmp     @b
1972
@@:
517 diamond 1973
        mov     eax, [ebp + panel1_selected_num - panel1_data]
1974
        test    eax, eax
1975
        jz      .f5_noselected1
1976
        mov     ebx, eax
1977
        push    10
1978
        pop     ecx
1979
        push    -'0'
1980
@@:
1981
        xor     edx, edx
1982
        div     ecx
1983
        push    edx
1984
        test    eax, eax
1985
        jnz     @b
1986
@@:
1987
        pop     eax
1988
        add     al, '0'
1989
        jz      @f
1990
        stosb
1991
        jmp     @b
1992
@@:
1993
if lang eq ru
1994
        mov     dword [edi], ' эле'
1995
        mov     dword [edi+4], 'мент'
1996
        add     edi, 8
1997
        cmp     ebx, 1
1998
        jz      @f
1999
        mov     al, 'а'
2000
        stosb
2001
        cmp     ebx, 4
2002
        jbe     @f
2003
        mov     word [edi-1], 'ов'
2004
        inc     edi
2005
@@:
2006
else
2007
        mov     dword [edi], ' ite'
2008
        mov     byte [edi+4], 'm'
2009
        add     edi, 5
2010
        cmp     ebx, 1
2011
        jz      @f
2012
        mov     al, 's'
2013
        stosb
2014
@@:
2015
end if
2016
        jmp     .f5_selected1
2017
.f5_noselected1:
2018
        mov     al, '"'
2019
        stosb
283 diamond 2020
        call    get_curfile_folder_entry
2021
        lea     esi, [ecx+40]
2022
        lea     eax, [esi+1]
2023
@@:
2024
        inc     esi
2025
        cmp     byte [esi-1], 0
2026
        jnz     @b
2027
        sub     esi, eax
2028
        xchg    eax, esi
2029
        dec     esi
2030
        mov     edx, [cur_width]
2031
        sub     edx, 50
2032
        sub     eax, edx
2033
        jbe     @f
2034
        add     esi, eax
2035
        mov     al, '.'
2036
        stosb
2037
        stosb
2038
        stosb
2039
@@:
2040
        lodsb
2041
        test    al, al
2042
        jz      @f
2043
        stosb
2044
        jmp     @b
2045
@@:
517 diamond 2046
        mov     al, '"'
2047
        stosb
2048
.f5_selected1:
283 diamond 2049
        mov     esi, aCopy2
2050
@@:
2051
        lodsb
2052
        stosb
2053
        test    al, al
2054
        jnz     @b
2055
        mov     ebx, copy_dlgdata
2056
        mov     eax, [cur_width]
2057
        sub     eax, 12
2058
        mov     [ebx + dlgtemplate.width], eax
2059
        dec     eax
2060
        dec     eax
2061
        mov     [ebx - copy_dlgdata + copy_dlgdata.width2], eax
2062
        mov     [ebx - copy_dlgdata + copy_dlgdata.width3], eax
2063
        shr     eax, 1
2064
        dec     eax
2065
        dec     eax
2066
        mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x2], eax
2067
        sub     eax, aCopyLength-1
2068
        mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x1], eax
2069
        add     eax, aCopyLength+3
2070
        mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x1], eax
2071
        add     eax, aCancelBLength - 1
2072
        mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x2], eax
2073
        mov     byte [ebx - copy_dlgdata + copy_dlgdata.flags0], 0xC
2074
        and     byte [ebx - copy_dlgdata + copy_dlgdata.flags1], not 4
2075
        and     byte [ebx - copy_dlgdata + copy_dlgdata.flags2], not 4
2076
        push    ebx
2077
        call    DialogBox
2078
        cmp     eax, copy_dlgdata.copy_btn
2079
        jnz     .ret2
2080
; Копируем
2081
        mov     esi, CopyDestEditBuf+12
2082
        mov     edi, esi
2083
        xor     eax, eax
2084
        or      ecx, -1
2085
        repnz   scasb
2086
        dec     edi
2087
        dec     edi
2088
        cmp     edi, esi
2089
        jb      .ret2
517 diamond 2090
        mov     [bEndSlash], 0
283 diamond 2091
        cmp     byte [edi], '/'
2092
        jnz     @f
2093
        cmp     edi, esi
2094
        jz      @f
2095
        mov     byte [edi], 0
2096
        dec     edi
517 diamond 2097
        mov     [bEndSlash], 1
283 diamond 2098
@@:
2099
; Если путь не начинается со слэша, считаем его относительно текущей папки
2100
        cmp     byte [esi], '/'
2101
        jz      .copy_absolute_path
2102
        push    esi
2103
        push    edi
2104
        lea     edi, [ebp + panel1_dir - panel1_data]
2105
        or      ecx, -1
2106
        xor     eax, eax
2107
        repnz   scasb
2108
        not     ecx
2109
        pop     edi
321 diamond 2110
        push    edi
2111
        add     edi, ecx
2112
        cmp     edi, CopyDestEditBuf+12+513
2113
        pop     edi
2114
        jb      @f
2115
        pop     esi
2116
        jmp     .bigfilename
2117
@@:
283 diamond 2118
        lea     edx, [edi+2]
2119
        sub     edx, esi
2120
        lea     edi, [edi+ecx+1]
2121
        xchg    ecx, edx
2122
        std
2123
        lea     esi, [esi+ecx-1]
2124
        rep     movsb
2125
        cld
2126
        pop     edi
2127
        lea     esi, [ebp + panel1_dir - panel1_data]
2128
        push    edi
2129
        mov     ecx, edx
2130
        rep     movsb
2131
        mov     byte [edi-1], '/'
2132
        pop     esi
2133
.copy_absolute_path:
517 diamond 2134
; Сначала создаём все вышележащие папки, которые ещё не существуют
2135
; Последний из элементов может быть как файлом, так и папкой;
2136
; форсируем папку в случае, если хотя бы один из источников является папкой
2137
        xor     edx, edx
2138
        cmp     [ebp + panel1_selected_num - panel1_data], 0
2139
        jz      .f5_noselected2
2140
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
2141
        mov     edi, [ebp + panel1_files - panel1_data]
2142
.scanselected2:
2143
        mov     eax, [edi]
2144
        add     edi, 4
2145
        test    byte [eax+303], 1
2146
        jz      @f
2147
        test    byte [eax], 10h
2148
        jz      @f
2149
        inc     edx
2150
@@:
2151
        loop    .scanselected2
2152
        jmp     .f5_selected2
2153
.f5_noselected2:
2154
        call    get_curfile_folder_entry
2155
        test    byte [ecx], 10h
2156
        setnz   dl
2157
.f5_selected2:
283 diamond 2158
        xor     eax, eax
2159
        mov     edi, esi
2160
.countslashloop:
2161
        cmp     byte [edi], '/'
2162
        jnz     @f
2163
        inc     eax
517 diamond 2164
        mov     ecx, edi
283 diamond 2165
@@:
2166
        inc     edi
2167
        cmp     byte [edi], 0
2168
        jnz     .countslashloop
517 diamond 2169
        mov     [bNeedRestoreName], 0
2170
; "/file-system/partition" folders already exist, so we don't need to create them
283 diamond 2171
        cmp     eax, 2
517 diamond 2172
        jbe     .createupdone
2173
; we interpret destination as folder if edx!=0 or bEndSlash!=0
2174
        test    edx, edx
2175
        jnz     @f
2176
        cmp     [bEndSlash], 0
2177
        jnz     @f
2178
        mov     edi, ecx
2179
        dec     eax
283 diamond 2180
@@:
517 diamond 2181
        mov     [attrinfo.name], esi
2182
        mov     ecx, eax
2183
; ищем последнюю папку, которая ещё существует
2184
.createuploop1:
2185
        cmp     eax, 2
2186
        jbe     .createupdone1
2187
        mov     dl, [edi]
2188
        mov     byte [edi], 0
2189
        push    eax
283 diamond 2190
        push    70
2191
        pop     eax
517 diamond 2192
        mov     ebx, attrinfo
2193
        int     0x40
321 diamond 2194
        test    eax, eax
517 diamond 2195
        pop     eax
522 diamond 2196
        mov     byte [edi], dl
517 diamond 2197
        jnz     .createupcont1
2198
        test    byte [attrinfo.attr], 10h
2199
        jnz     .createupdone1
2200
; the item required to be a folder, but is file
2201
        push    aNotFolder
321 diamond 2202
        push    esi
517 diamond 2203
        mov     eax, esp
2204
        push    ContinueBtn
2205
        push    1
321 diamond 2206
        push    eax
2207
        push    2
2208
        call    SayErr
283 diamond 2209
        pop     eax
517 diamond 2210
        pop     eax
2211
.ret3:
2212
        ret
2213
.createupcont1:
2214
        dec     eax
2215
@@:
2216
        dec     edi
2217
        cmp     byte [edi], '/'
2218
        jnz     @b
2219
        jmp     .createuploop1
2220
.createupdone1:
2221
; создаём все папки, которые нам нужны
2222
        cmp     eax, ecx
2223
        jae     .createupdone
2224
@@:
2225
        inc     edi
2226
        cmp     byte [edi], 0
2227
        jz      @f
2228
        cmp     byte [edi], '/'
2229
        jnz     @b
2230
@@:
2231
        mov     dl, byte [edi]
2232
        mov     byte [edi], 0
321 diamond 2233
        push    eax
517 diamond 2234
        push    RetryOrCancelBtn
321 diamond 2235
        push    2
517 diamond 2236
        call    makedir
522 diamond 2237
        mov     byte [edi], dl
517 diamond 2238
        mov     [bNeedRestoreName], 1
2239
        pop     eax
2240
        jnz     .ret3
2241
        inc     eax
2242
        jmp     .createupdone1
2243
.createupdone:
2244
        mov     dl, 1
2245
        cmp     byte [edi], 1
2246
        sbb     eax, -1
2247
        cmp     eax, 2
2248
        jbe     .docopy
2249
        mov     [attrinfo.attr], 0      ; assume zero attributes if error
2250
        push    70
2251
        pop     eax
2252
        mov     ebx, attrinfo
2253
        int     0x40
2254
        test    [attrinfo.attr], 10h
2255
        setnz   dl
2256
.docopy:
2257
        call    get_curfile_folder_entry
2258
        mov     eax, ecx
2259
        cmp     [bNeedRestoreName], 0
2260
        jz      @f
2261
        cmp     [bEndSlash], 0
2262
        jnz     @f
2263
        cmp     [ebp + panel1_selected_num - panel1_data], 0
2264
        jnz     @f
2265
        test    byte [eax], 10h
2266
        jz      @f
2267
        mov     dl, 0
2268
@@:
2269
; начинаем собственно копирование
2270
        mov     [bDestIsFolder], dl
2271
        mov     [copy_bSkipAll], 0
2272
        mov     [copy_bSkipAll2], 0
589 diamond 2273
        mov     [copy_bSkipAll3], 0
2274
        test    [ebp + panel1_plugin_flags - panel1_data], 2
2275
        jnz     .copy_GetFiles
517 diamond 2276
        cmp     [ebp + panel1_selected_num - panel1_data], 0
2277
        jnz     .f5_selected3
2278
        call    copy_file
283 diamond 2279
.copydone:
2280
        push    ebp
2281
        call    .ctrl_r
2282
        pop     ebp
2283
        xor     ebp, panel1_data xor panel2_data
2284
        jmp     .ctrl_r
517 diamond 2285
.f5_selected3:
2286
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
2287
        mov     esi, [ebp + panel1_files - panel1_data]
2288
.f5_selected_copyloop:
2289
        lodsd
2290
        test    byte [eax+303], 1
2291
        jz      .f5_selected_copycont
2292
        mov     [bDestIsFolder], dl
2293
        call    copy_file
2294
        ja      .f5_multiple_cancel
2295
        and     byte [eax+303], not 1
2296
        pushad
2297
        call    draw_panel
2298
        cmp     [bNeedRestoreName], 0
321 diamond 2299
        jz      @f
517 diamond 2300
        mov     esi, CopyDestEditBuf+12
2301
        call    delete_last_name_from_end
321 diamond 2302
@@:
517 diamond 2303
        popad
2304
.f5_selected_copycont:
2305
        loop    .f5_selected_copyloop
2306
.f5_multiple_cancel:
321 diamond 2307
        jmp     .copydone
589 diamond 2308
.copy_GetFiles:
2309
        mov     ecx, [ebp + panel1_selected_num - panel1_data]
2310
        cmp     ecx, 1
2311
        adc     ecx, 0
2312
        shl     ecx, 2
2313
        call    xpgalloc
2314
        test    eax, eax
2315
        jnz     @f
2316
        ret
2317
@@:
2318
        push    ebp eax ; save
2319
        push    copy_AddDir     ; adddir
2320
        push    copy_AddFile    ; addfile
2321
        push    eax             ; items
2322
        shr     ecx, 2
2323
        push    ecx             ; NumItems
2324
        push    [ebp + panel1_hFile - panel1_data]
2325
        mov     edi, eax
2326
        call    get_curfile_folder_entry
2327
        mov     [edi], ecx
2328
        cmp     [ebp + panel1_selected_num - panel1_data], 0
2329
        jz      .cgf1
2330
        mov     esi, [ebp + panel1_files - panel1_data]
2331
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
2332
.cgf0:
2333
        lodsd
2334
        test    byte [eax+303], 1
2335
        jz      @f
2336
        stosd
2337
@@:
2338
        loop    .cgf0
2339
.cgf1:
2340
        mov     eax, [ebp + panel1_hPlugin - panel1_data]
2341
        call    [eax+PluginInfo.GetFiles]
2342
        pop     ecx ebp
2343
        call    pgfree
2344
        jmp     .copydone
283 diamond 2345
 
180 heavyiron 2346
.f3:
2347
        call    view_file
2348
.ret2:
2349
        ret
474 diamond 2350
.f8_has_selected:
2351
        mov     edi, saved_file_name+511
2352
        mov     byte [edi], 0
2353
        mov     eax, [ebp + panel1_selected_num - panel1_data]
2354
if lang eq ru
2355
        cmp     eax, 1
2356
        jz      @f
2357
        dec     edi
2358
        mov     byte [edi], 'а'
2359
        cmp     eax, 4
2360
        jbe     @f
2361
        dec     edi
2362
        mov     word [edi], 'ов'
2363
@@:
2364
        mov     dword [edi-4], 'мент'
2365
        mov     dword [edi-8], ' эле'
2366
        sub     edi, 8
2367
else
2368
        cmp     eax, 1
2369
        jz      @f
2370
        dec     edi
2371
        mov     byte [edi], 's'
2372
@@:
2373
        mov     dword [edi-4], 'item'
2374
        mov     byte [edi-5], ' '
2375
        sub     edi, 5
2376
end if
2377
        xor     edx, edx
2378
        push    10
2379
        pop     ecx
2380
@@:
2381
        div     ecx
2382
        add     dl, '0'
2383
        dec     edi
2384
        mov     [edi], dl
2385
        xor     edx, edx
2386
        test    eax, eax
2387
        jnz     @b
2388
        push    edi
2389
        push    aConfirmDeleteText
2390
        mov     eax, esp
2391
        push    DeleteOrCancelBtn
2392
        push    2
2393
        push    eax
2394
        push    2
2395
        push    aDeleteCaption
2396
        call    Message
2397
        add     esp, 8
2398
        test    eax, eax
2399
        jnz     .ret2
2400
        mov     [del_bSkipAll], 0
2401
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
2402
        jecxz   .ret2
2403
        mov     esi, [ebp + panel1_files - panel1_data]
2404
.f8_loop:
2405
        lodsd
2406
        test    byte [eax+303], 1
2407
        jz      @f
2408
        call    delete_file
2409
        ja      .f8_multiple_cancel
2410
@@:
2411
        loop    .f8_loop
2412
.f8_multiple_cancel:
522 diamond 2413
        jmp     .copydone
180 heavyiron 2414
.f8:
589 diamond 2415
; todo: delete files from plugin panel
2416
        cmp     [ebp + panel1_hPlugin - panel1_data], 0
2417
        jz      @f
2418
        ret
2419
@@:
474 diamond 2420
        cmp     [ebp + panel1_selected_num - panel1_data], 0
2421
        jnz     .f8_has_selected
183 diamond 2422
        call    get_curfile_folder_entry
2423
        cmp     [bConfirmDelete], 0
2424
        jz      .f8_allowed
474 diamond 2425
        lea     eax, [ecx+40]
2426
        push    eax
183 diamond 2427
        mov     esi, aConfirmDeleteText
2428
        mov     edi, aConfirmDeleteTextBuf
474 diamond 2429
        push    edi
183 diamond 2430
@@:
2431
        lodsb
2432
        stosb
2433
        test    al, al
2434
        jnz     @b
2435
        dec     edi
2436
        mov     esi, aDeleteFolder
2437
        test    byte [ecx], 10h
2438
        jnz     @f
2439
        mov     esi, aDeleteFile
2440
@@:
2441
        lodsb
2442
        stosb
2443
        test    al, al
2444
        jnz     @b
321 diamond 2445
        mov     eax, esp
474 diamond 2446
        push    DeleteOrCancelBtn
321 diamond 2447
        push    2
2448
        push    eax
474 diamond 2449
        push    2
2450
        push    aDeleteCaption
2451
        call    Message
2452
        add     esp, 8
321 diamond 2453
        test    eax, eax
474 diamond 2454
        jz      .f8_allowed
2455
        ret
2456
.f8_allowed:
2457
        mov     [del_bSkipAll], 0
2458
        mov     eax, ecx
2459
        call    delete_file
522 diamond 2460
        jmp     .copydone
180 heavyiron 2461
.ctrl_r:
2462
; Rescan panel
2463
;       call    read_folder
2464
;       jmp     .done_redraw
2465
        mov     eax, [ebp + panel1_index - panel1_data]
2466
        push    eax
183 diamond 2467
        call    get_curfile_name
283 diamond 2468
        mov     esi, ecx
180 heavyiron 2469
        mov     edi, saved_file_name
2470
@@:
2471
        lodsb
2472
        stosb
2473
        test    al, al
2474
        jnz     @b
2475
        push    [ebp + panel1_start - panel1_data]
2476
        call    read_folder
2477
        pop     [ebp + panel1_start - panel1_data]
2478
        pop     [ebp + panel1_index - panel1_data]
2479
        or      eax, -1
2480
@@:
2481
        inc     eax
2482
        cmp     eax, [ebp + panel1_numfiles - panel1_data]
2483
        jae     .ctrl_r.notfound
2484
        mov     ecx, [ebp + panel1_files - panel1_data]
321 diamond 2485
        mov     esi, [ecx+eax*4]
2486
        add     esi, 40
180 heavyiron 2487
        mov     edi, saved_file_name
2488
        call    strcmpi
2489
        jnz     @b
2490
.ctrl_r.found:
2491
        mov     [ebp + panel1_index - panel1_data], eax
2492
.ctrl_r.notfound:
2493
        mov     eax, [ebp + panel1_numfiles - panel1_data]
2494
        dec     eax
2495
        cmp     [ebp + panel1_index - panel1_data], eax
2496
        jbe     @f
2497
        mov     [ebp + panel1_index - panel1_data], eax
2498
@@:
2499
        mov     eax, [ebp + panel1_index - panel1_data]
2500
        cmp     [ebp + panel1_start - panel1_data], eax
2501
        jbe     @f
2502
        mov     [ebp + panel1_start - panel1_data], eax
2503
@@:
2504
        inc     eax
2505
        sub     eax, [ebp + panel1_colst - panel1_data]
2506
        jae     @f
2507
        xor     eax, eax
2508
@@:
2509
        cmp     [ebp + panel1_start - panel1_data], eax
2510
        jae     @f
2511
        mov     [ebp + panel1_start - panel1_data], eax
2512
@@:
2513
        mov     eax, [ebp + panel1_numfiles - panel1_data]
2514
        sub     eax, [ebp + panel1_colst - panel1_data]
2515
        jbe     @f
2516
        cmp     [ebp + panel1_start - panel1_data], eax
2517
        jbe     @f
2518
        mov     [ebp + panel1_start - panel1_data], eax
2519
@@:
2520
        jmp     .done_redraw
283 diamond 2521
.menu:
589 diamond 2522
; todo: context menu for plugin panel
2523
        cmp     [ebp + panel1_hPlugin - panel1_data], 0
2524
        jz      @f
2525
        ret
2526
@@:
283 diamond 2527
; display context menu
2528
; ignore folders
2529
        call    get_curfile_folder_entry
2530
        test    byte [ecx], 10h
2531
        jz      @f
2532
.menuret:
2533
        ret
2534
@@:
2535
        call    find_extension
2536
        jc      .menuret
2537
; known extension
474 diamond 2538
@@:
2539
        cmp     byte [edi], 0
283 diamond 2540
        jz      .menuret
474 diamond 2541
        cmp     byte [edi], ';'
2542
        jz      @f
2543
        inc     edi
2544
        jmp     @b
2545
@@:
2546
        inc     edi
2547
@@:
2548
        inc     edi
2549
        cmp     byte [edi-1], ' '
2550
        jz      @b
2551
        cmp     byte [edi-1], 9
2552
        jz      @b
2553
        dec     edi
2554
        cmp     byte [edi], 0
2555
        jz      .menuret
283 diamond 2556
        mov     ecx, esi
2557
@@:
2558
        inc     ecx
2559
        cmp     byte [ecx-1], 0
2560
        jnz     @b
2561
        sub     ecx, esi        ; ecx = длина имени файла+1 = длина заголовка+1
2562
        cmp     ecx, 15
2563
        jb      @f
2564
        mov     cl, 15
2565
@@:
2566
        xor     edx, edx
474 diamond 2567
        xor     ebp, ebp
2568
        push    edx
283 diamond 2569
.menucreateloop:
474 diamond 2570
        mov     eax, edi
2571
        xor     ebx, ebx
283 diamond 2572
@@:
474 diamond 2573
        cmp     byte [edi], ','
2574
        jz      @f
2575
        cmp     byte [edi], bl
2576
        jz      @f
2577
        inc     edi
2578
        jmp     @b
2579
@@:
2580
        xchg    bl, [edi]
2581
        pushad
2582
        push    nullstr
2583
        push    1024
2584
        push    saved_file_name
2585
        push    eax
2586
        push    aMenu
2587
        push    app_path
2588
        call    [ini.get_str]
2589
        popad
2590
        mov     [edi], bl
2591
        mov     eax, saved_file_name
2592
@@:
2593
        cmp     byte [eax], 0
2594
        jz      .menucreatecont
2595
        cmp     byte [eax], ','
2596
        jz      @f
283 diamond 2597
        inc     eax
474 diamond 2598
        jmp     @b
2599
@@:
2600
        mov     byte [eax], 0
2601
        push    eax
2602
        sub     eax, saved_file_name-1
283 diamond 2603
        cmp     eax, ecx
2604
        ja      @f
2605
        mov     eax, ecx
2606
@@:
474 diamond 2607
        xchg    eax, [esp]
2608
        inc     eax
2609
        push    eax
2610
@@:
2611
        inc     eax
2612
        cmp     byte [eax-1], 0
2613
        jnz     @b
2614
        sub     eax, [esp]
2615
        add     [esp+4], eax
2616
        pop     eax eax
2617
        add     eax, 8
2618
        add     ebp, eax
2619
        push    ebp
2620
        and     ebp, 0xFFF
2621
        cmp     ebp, eax
2622
        pop     ebp
2623
        ja      @f
2624
        push    eax
2625
        xchg    edx, [esp+4]
2626
        push    ecx
2627
        mov     ecx, ebp
2628
        call    xpgrealloc
2629
        pop     ecx
2630
        pop     edx
2631
        xchg    edx, [esp]
283 diamond 2632
        test    eax, eax
474 diamond 2633
        xchg    eax, [esp]
283 diamond 2634
        jz      .menucreated
474 diamond 2635
@@:
2636
        neg     eax
2637
        add     eax, ebp
2638
        add     eax, [esp]
2639
        and     dword [eax], 0
2640
        and     dword [eax+4], 0
283 diamond 2641
        test    edx, edx
2642
        jz      @f
474 diamond 2643
        sub     eax, [esp]
283 diamond 2644
        mov     [edx], eax
474 diamond 2645
        add     eax, [esp]
2646
        sub     edx, [esp]
2647
        mov     [eax+4], edx
283 diamond 2648
@@:
2649
        mov     edx, eax
474 diamond 2650
        push    esi edi
2651
        mov     esi, saved_file_name
283 diamond 2652
        lea     edi, [eax+8]
2653
@@:
2654
        lodsb
2655
        stosb
2656
        test    al, al
2657
        jnz     @b
474 diamond 2658
        push    esi
2659
        sub     esi, saved_file_name
283 diamond 2660
        sub     esi, ecx
2661
        jae     .menunoadd
2662
        neg     esi
2663
@@:
2664
        mov     byte [edi-1], ' '
2665
        stosb
2666
        dec     esi
2667
        jnz     @b
2668
.menunoadd:
2669
        pop     esi
474 diamond 2670
@@:
2671
        lodsb
2672
        stosb
2673
        test    al, al
2674
        jnz     @b
2675
        pop     edi esi
2676
.menucreatecont:
2677
        inc     edi
2678
        cmp     byte [edi-1], ','
2679
        jz      .menucreateloop
283 diamond 2680
.menucreated:
2681
        test    edx, edx
474 diamond 2682
        jz      .menuret_free
283 diamond 2683
        and     dword [edx], 0
474 diamond 2684
        pop     edx
2685
        mov     ecx, edx
2686
        add     [ecx], edx
283 diamond 2687
@@:
474 diamond 2688
        mov     ecx, [ecx]
2689
        cmp     dword [ecx], 0
283 diamond 2690
        jz      @f
474 diamond 2691
        add     [ecx], edx
2692
        add     [ecx+4], edx
283 diamond 2693
        jmp     @b
2694
@@:
474 diamond 2695
        add     [ecx+4], edx
2696
        push    edx
283 diamond 2697
        push    1
2698
        push    esi
2699
        push    edx
2700
        call    menu
2701
        cmp     eax, -1
474 diamond 2702
        jz      .menuret_free
2703
        lea     edi, [eax+8]
283 diamond 2704
@@:
474 diamond 2705
        inc     edi
2706
        cmp     byte [edi-1], 0
2707
        jnz     @b
2708
        mov     ebp, [active_panel]
283 diamond 2709
        call    get_curfile_folder_entry
474 diamond 2710
        call    .run_association2
2711
.menuret_free:
2712
        pop     ecx
2713
        jmp     pgfree
321 diamond 2714
.f7:
2715
        mov     dword [CopyDestEditBuf], CopyDestEditBuf.length
2716
        and     dword [CopyDestEditBuf+4], 0
2717
        and     dword [CopyDestEditBuf+8], 0
2718
        mov     byte [CopyDestEditBuf+12], 0
2719
        mov     ebx, mkdir_dlgdata
2720
        mov     eax, [cur_width]
2721
        sub     eax, 12
2722
        mov     [ebx + dlgtemplate.width], eax
2723
        dec     eax
2724
        dec     eax
2725
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.width2], eax
2726
        shr     eax, 1
2727
        dec     eax
2728
        dec     eax
2729
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cont_x2], eax
2730
        sub     eax, a_ContinueLength-1
2731
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cont_x1], eax
2732
        add     eax, a_ContinueLength+3
2733
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cnl_x1], eax
2734
        add     eax, aCancelBLength - 1
2735
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cnl_x2], eax
2736
        mov     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags0], 0xC
2737
        and     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags1], not 4
2738
        and     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags2], not 4
2739
        push    ebx
2740
        call    DialogBox
2741
        cmp     eax, mkdir_dlgdata.cont_btn
2742
        jnz     .ret2
2743
        mov     esi, CopyDestEditBuf+12
2744
        cmp     byte [esi], 0
2745
        jz      .ret2
2746
        cmp     byte [esi], '/'
2747
        jz      .mkdir_absolute_path
2748
        push    esi
2749
        lea     edi, [ebp + panel1_dir - panel1_data]
2750
        or      ecx, -1
2751
        xor     eax, eax
2752
        repnz   scasb
2753
        not     ecx
2754
        mov     edi, esi
2755
@@:
2756
        cmp     byte [edi+1], 0
2757
        jz      @f
2758
        inc     edi
2759
        jmp     @b
2760
@@:
2761
        push    edi
2762
        add     edi, ecx
2763
        cmp     edi, CopyDestEditBuf+12+513
2764
        pop     edi
2765
        jb      @f
2766
        pop     esi
2767
        jmp     .bigfilename
2768
@@:
2769
        lea     edx, [edi+2]
2770
        sub     edx, esi
2771
        lea     edi, [edi+ecx+1]
2772
        xchg    ecx, edx
2773
        std
2774
        lea     esi, [esi+ecx-1]
2775
        rep     movsb
2776
        cld
2777
        pop     edi
2778
        lea     esi, [ebp + panel1_dir - panel1_data]
2779
        push    edi
2780
        mov     ecx, edx
2781
        rep     movsb
2782
        mov     byte [edi-1], '/'
2783
        pop     esi
2784
.mkdir_absolute_path:
517 diamond 2785
        push    RetryOrCancelBtn
321 diamond 2786
        push    2
517 diamond 2787
        call    makedir
321 diamond 2788
        jmp     .copydone
474 diamond 2789
.change_mode:
2790
        dec     eax
2791
        mov     [ebp + panel1_colmode - panel1_data], eax
2792
        call    calc_colwidths
2793
        jmp     draw_panel
2794
.quick_jump:
2795
        dec     eax
2796
        cmp     al, 10
2797
        jnz     @f
2798
        xor     eax, eax
2799
@@:
2800
        mov     eax, [FolderShortcuts+eax*4]
2801
        test    eax, eax
2802
        jnz     @f
2803
        ret
2804
@@:
589 diamond 2805
        push    eax
2806
        call    close_plugin_panels
474 diamond 2807
        lea     esi, [ebp + panel1_dir - panel1_data]
589 diamond 2808
        push    esi
474 diamond 2809
        mov     edi, prev_dir
2810
@@:
2811
        lodsb
2812
        stosb
2813
        test    al, al
2814
        jnz     @b
2815
        pop     edi esi
2816
@@:
2817
        lodsb
2818
        stosb
2819
        test    al, al
2820
        jnz     @b
2821
        jmp     .reread
2822
.greyplus:
2823
        push    0
2824
        mov     ecx, aSelect
2825
        jmp     @f
2826
.greyminus:
2827
        push    1
2828
        mov     ecx, aDeselect
2829
@@:
2830
        mov     eax, mark_dlgdata
2831
        mov     [eax+mark_dlgdata.title-mark_dlgdata], ecx
2832
        mov     [eax+mark_dlgdata.flags-mark_dlgdata], 0xC
2833
        mov     edi, enter_string_buf+12
2834
        mov     dword [edi-12], 512
2835
        mov     dword [edi-8], 1
2836
        and     dword [edi-4], 0
2837
        mov     word [edi], '*'
2838
        push    eax
2839
        call    DialogBox
2840
        inc     eax
2841
        jnz     @f
2842
.noselect:
2843
        pop     eax
2844
        ret
2845
@@:
2846
        xor     eax, eax
2847
        mov     esi, edi
2848
@@:
2849
        lodsb
2850
        mov     al, [tolower_table+eax]
2851
        mov     [esi-1], al
2852
        test    al, al
2853
        jnz     @b
2854
@@:
2855
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
2856
        mov     ebx, [ebp + panel1_files - panel1_data]
2857
        jecxz   .noselect
2858
        mov     eax, [ebx]
2859
        cmp     word [eax+40], '..'
2860
        jnz     .selectloop
2861
        cmp     byte [eax+42], 0
2862
        jnz     .selectloop
2863
        dec     ecx
2864
        jz      .noselect
2865
        add     ebx, 4
2866
.selectloop:
2867
        xor     eax, eax
2868
        mov     esi, [ebx]
2869
        add     esi, 40
2870
        mov     edx, lower_file_name-1
2871
@@:
2872
        lodsb
2873
        inc     edx
2874
        mov     al, [tolower_table+eax]
2875
        mov     [edx], al
2876
        test    al, al
2877
        jnz     @b
2878
        mov     esi, lower_file_name
2879
        call    match_mask_rev_lowercase
2880
        jc      @f
2881
        mov     esi, [ebx]
2882
        mov     eax, [esi+32]
2883
        cmp     byte [esp], 0
2884
        jz      .doselect
2885
        test    byte [esi+303], 1
2886
        jz      @f
2887
        and     byte [esi+303], not 1
2888
        sub     dword [ebp + panel1_selected_size - panel1_data], eax
2889
        mov     eax, [esi+36]
2890
        sbb     dword [ebp + panel1_selected_size+4 - panel1_data], eax
2891
        dec     dword [ebp + panel1_selected_num - panel1_data]
2892
        jmp     @f
2893
.doselect:
2894
        test    byte [esi+303], 1
2895
        jnz     @f
2896
        or      byte [esi+303], 1
2897
        add     dword [ebp + panel1_selected_size - panel1_data], eax
2898
        mov     eax, [esi+36]
2899
        adc     dword [ebp + panel1_selected_size+4 - panel1_data], eax
2900
        inc     dword [ebp + panel1_selected_num - panel1_data]
2901
@@:
2902
        add     ebx, 4
2903
        dec     ecx
2904
        jnz     .selectloop
2905
        pop     eax
2906
        jmp     .done_redraw
517 diamond 2907
.greyasterisk:
2908
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
2909
        mov     esi, [ebp + panel1_files - panel1_data]
2910
        jecxz   .galoopdone
2911
.galoop:
2912
        lodsd
2913
        cmp     word [eax+40], '..'
2914
        jnz     @f
2915
        cmp     byte [eax+42], 0
2916
        jz      .gacont
2917
@@:
2918
        xor     byte [eax+303], 1
2919
        mov     edx, [eax+32]
2920
        test    byte [eax+303], 1
2921
        jz      .gadel
2922
        add     dword [ebp + panel1_selected_size - panel1_data], edx
2923
        mov     edx, [eax+36]
2924
        adc     dword [ebp + panel1_selected_size+4 - panel1_data], edx
2925
        inc     dword [ebp + panel1_selected_num - panel1_data]
2926
        jmp     .gacont
2927
.gadel:
2928
        sub     dword [ebp + panel1_selected_size - panel1_data], edx
2929
        mov     edx, [eax+36]
2930
        sbb     dword [ebp + panel1_selected_size+4 - panel1_data], edx
2931
        dec     dword [ebp + panel1_selected_num - panel1_data]
2932
.gacont:
2933
        loop    .galoop
2934
.galoopdone:
2935
        jmp     .done_redraw
180 heavyiron 2936
 
589 diamond 2937
@@:
2938
        call    close_plugin_panel
2939
close_plugin_panels:
2940
        cmp     [ebp + panel1_hPlugin - panel1_data], 0
2941
        jnz     @b
2942
        ret
2943
 
2944
close_plugin_panel:
2945
; close plugin and restore old directory
2946
        mov     esi, [ebp + panel1_parents - panel1_data]
2947
        add     esi, [ebp + panel1_parents_sz - panel1_data]
2948
@@:
2949
        dec     esi
2950
        cmp     byte [esi-1], 0
2951
        jnz     @b
2952
        push    esi
2953
        lea     edi, [ebp + panel1_dir - panel1_data]
2954
@@:
2955
        lodsb
2956
        stosb
2957
        test    al, al
2958
        jnz     @b
2959
        pop     esi
2960
        sub     esi, 9
2961
        mov     edx, [esi]      ; hPlugin
2962
        mov     ebx, [esi+4]    ; hFile
2963
        sub     esi, [ebp + panel1_parents - panel1_data]
2964
        mov     [ebp + panel1_parents_sz - panel1_data], esi
2965
        xchg    edx, [ebp + panel1_hPlugin - panel1_data]
2966
        xchg    ebx, [ebp + panel1_hFile - panel1_data]
2967
        push    edx ebx
2968
        lea     ebx, [ebp + panel1_plugin_info - panel1_data]
2969
        and     dword [ebx], 0
2970
        mov     eax, [ebp + panel1_hPlugin - panel1_data]
2971
        test    eax, eax
2972
        jz      @f
2973
        push    ebp
2974
        push    ebx
2975
        push    [ebp + panel1_hFile - panel1_data]
2976
        call    [eax+PluginInfo.GetOpenPluginInfo]
2977
        pop     ebp
2978
@@:
2979
        pop     ebx edx
2980
 
2981
close_handle_if_unused:
2982
; edx=hPlugin, ebx=hFile
2983
        push    ebp
2984
        xor     ecx, ecx
2985
@@:
2986
        mov     eax, [screens]
2987
        mov     ebp, [eax+ecx*8+4]
2988
        mov     eax, [eax+ecx*8]
2989
        call    [eax+screen_vtable.IsHandleUsed]
2990
        jz      .used
2991
        inc     ecx
2992
        cmp     ecx, [num_screens]
2993
        jb      @b
2994
        push    ebx
2995
        call    [edx+PluginInfo.ClosePlugin]
2996
.used:
2997
        pop     ebp
2998
        ret
2999
 
3000
panels_IsHandleUsed:
3001
; edx=hPlugin, ebx=hFile
3002
        mov     ebp, panel1_data
3003
        call    .1
3004
        jz      .ret
3005
        mov     ebp, panel2_data
3006
 
3007
.1:
3008
        cmp     edx, [ebp+panel1_hPlugin-panel1_data]
3009
        jnz     @f
3010
        cmp     ebx, [ebp+panel1_hFile-panel1_data]
3011
        jz      .ret
3012
@@:
3013
        mov     esi, [ebp + panel1_parents_sz - panel1_data]
3014
        test    esi, esi
3015
        jnz     @f
3016
        inc     esi
3017
.ret:
3018
        ret
3019
@@:
3020
        add     esi, [ebp + panel1_parents - panel1_data]
3021
@@:
3022
        dec     esi
3023
        cmp     byte [esi-1], 0
3024
        jnz     @b
3025
        sub     esi, 9
3026
        cmp     edx, [esi]      ; hPlugin
3027
        jnz     .no
3028
        mov     ebx, [esi+4]    ; hFile
3029
        jz      .ret
3030
.no:
3031
        cmp     esi, [ebp + panel1_parents - panel1_data]
3032
        jnz     @b
3033
        inc     esi
3034
        ret
3035
 
3036
panels_OnExit:
3037
; close plugin panels
3038
        mov     ebp, panel1_data
3039
        call    close_plugin_panels
3040
        mov     ebp, panel2_data
3041
        call    close_plugin_panels
3042
        ret
3043
 
180 heavyiron 3044
panels_OnRedraw:
3045
        call    draw_cmdbar
3046
        mov     ebp, panel1_data
474 diamond 3047
        call    calc_colwidths
180 heavyiron 3048
        call    draw_panel
3049
        mov     ebp, panel2_data
474 diamond 3050
        call    calc_colwidths
180 heavyiron 3051
        call    draw_panel
3052
        ret
3053
 
3054
init_console:
474 diamond 3055
        mov     ecx, [console_data_ptr]
3056
        call    pgfree
283 diamond 3057
        mov     eax, [cur_width]
3058
        mul     [cur_height]
3059
        mov     ecx, eax
474 diamond 3060
        push    ecx
3061
        shl     ecx, 2
3062
        call    pgalloc
3063
        pop     ecx
283 diamond 3064
        test    eax, eax
3065
        jz      exit
3066
        mov     [console_data_ptr], eax
3067
        mov     edi, eax
180 heavyiron 3068
        mov     ax, 0720h
3069
        rep     stosw
283 diamond 3070
        mov     [panel1_left], ecx
3071
        mov     [panel1_top], ecx
3072
        mov     [panel2_top], ecx
180 heavyiron 3073
        mov     eax, [cur_width]
3074
        inc     eax
3075
        shr     eax, 1
3076
        mov     [panel1_width], eax
3077
        mov     [panel2_left], eax
3078
        sub     eax, [cur_width]
3079
        neg     eax
3080
        mov     [panel2_width], eax
3081
        mov     eax, [cur_height]
3082
        dec     eax
3083
        dec     eax
3084
        mov     [panel1_height], eax
3085
        mov     [panel2_height], eax
3086
        ret
3087
 
183 diamond 3088
get_curfile_folder_entry:
3089
        mov     ecx, [ebp + panel1_index - panel1_data]
321 diamond 3090
        shl     ecx, 2
183 diamond 3091
        add     ecx, [ebp + panel1_files - panel1_data]
321 diamond 3092
        mov     ecx, [ecx]
183 diamond 3093
        ret
3094
get_curfile_name:
3095
        call    get_curfile_folder_entry
3096
        add     ecx, 40
3097
        ret
3098
 
180 heavyiron 3099
panels_getname:
3100
if lang eq ru
3101
        mov     eax, 'Пане'
3102
        stosd
3103
        mov     eax, 'ли  '
3104
        stosd
3105
        mov     eax, '    '
3106
        stosd
3107
        stosb
3108
else
3109
        mov     eax, 'Pane'
3110
        stosd
3111
        mov     eax, 'ls  '
3112
        stosd
3113
        mov     eax, '    '
3114
        stosd
3115
        stosb
3116
end if
3117
        sub     ecx, 13
3118
        mov     ebp, [active_panel]
3119
        push    3
3120
        pop     edx
589 diamond 3121
        cmp     [ebp + panel1_hPlugin - panel1_data], 0
3122
        jz      .native
3123
        mov     esi, [ebp + panel1_parents - panel1_data]
3124
        add     esi, [ebp + panel1_parents_sz - panel1_data]
180 heavyiron 3125
@@:
589 diamond 3126
        dec     esi
3127
        cmp     byte [esi-1], 0
3128
        jz      @f
3129
        cmp     byte [esi-1], '/'
3130
        jnz     @b
3131
@@:
3132
        push    ecx edi
3133
        shr     ecx, 1
3134
@@:
180 heavyiron 3135
        lodsb
589 diamond 3136
        test    al, al
3137
        jz      @f
180 heavyiron 3138
        stosb
589 diamond 3139
        loop    @b
3140
@@:
3141
        sub     edi, [esp]
3142
        sub     [esp+4], edi
3143
        add     [esp], edi
3144
        pop     edi ecx
3145
        lea     esi, [ebp + panel1_dir - panel1_data]
3146
        cmp     byte [esi+1], 0
3147
        jnz     @f
3148
        inc     esi
3149
@@:
3150
        jmp     .main
3151
.native:
3152
        lea     esi, [ebp + panel1_dir - panel1_data]
3153
@@:
3154
        lodsb
3155
        stosb
180 heavyiron 3156
        dec     ecx
3157
        test    al, al
3158
        jz      @f
3159
        cmp     al, '/'
3160
        jnz     @b
3161
        dec     edx
3162
        jnz     @b
3163
@@:
3164
        test    al, al
3165
        jnz     @f
3166
        dec     esi
3167
        dec     edi
3168
@@:
589 diamond 3169
.main:
180 heavyiron 3170
        push    esi
3171
@@:
3172
        lodsb
3173
        test    al, al
3174
        jnz     @b
3175
        dec     esi
3176
        mov     ebx, esi
3177
        sub     ebx, [esp]
3178
        dec     esi
3179
        push    esi
3180
        mov     esi, [ebp + panel1_index - panel1_data]
321 diamond 3181
        shl     esi, 2
3182
        add     esi, [ebp + panel1_files - panel1_data]
3183
        mov     esi, [esi]
3184
        add     esi, 40
180 heavyiron 3185
        push    esi
3186
@@:
3187
        lodsb
3188
        test    al, al
3189
        jnz     @b
3190
        add     ebx, esi
3191
        sub     ebx, [esp]
3192
        dec     esi
3193
        cmp     ebx, ecx
3194
        jbe     @f
3195
        mov     al, '.'
3196
        stosb
3197
        stosb
3198
        stosb
3199
        sub     ecx, 3
3200
        mov     ebx, ecx
3201
@@:
3202
        add     edi, ebx
3203
        inc     ecx
3204
        std
3205
@@:
3206
        movsb
3207
        dec     ecx
3208
        jz      .nodir
3209
        cmp     esi, [esp]
3210
        jae     @b
589 diamond 3211
        mov     esi, [esp+4]
180 heavyiron 3212
        mov     al, '/'
3213
        stosb
3214
        dec     ecx
3215
        jz      .nodir
3216
@@:
3217
        cmp     esi, [esp+8]
3218
        jb      .nodir
3219
        movsb
3220
        loop    @b
3221
.nodir:
3222
        cld
3223
        pop     eax
3224
        pop     eax
3225
        pop     eax
3226
        ret
3227
 
3228
draw_window:
3229
        push    12
3230
        pop     eax
3231
        push    1
3232
        pop     ebx
517 diamond 3233
        int     40h
180 heavyiron 3234
        mov     al, 48
3235
        mov     bl, 4
517 diamond 3236
        int     40h
180 heavyiron 3237
        mov     [skinh], eax
3238
        mov     ebx, [cur_width]
3239
        imul    ebx, font_width
283 diamond 3240
        add     ebx, 100*65536 + 5*2-1
180 heavyiron 3241
        mov     ecx, [cur_height]
3242
        imul    ecx, font_height
283 diamond 3243
        lea     ecx, [eax+ecx+5-1+100*65536]
180 heavyiron 3244
        xor     eax, eax
314 diamond 3245
        mov     edx, 0x53000000
517 diamond 3246
        mov     edi, header
3247
        int     40h
314 diamond 3248
        mov     al, 13
3249
        xor     edx, edx
3250
        cmp     [fill_width], 0
3251
        jz      @f
3252
        mov     ebx, [wnd_width]
3253
        sub     ebx, [fill_width]
3254
        sub     ebx, 5-1
3255
        shl     ebx, 16
3256
        mov     bx, word [fill_width]
3257
        mov     ecx, [skinh-2]
3258
        mov     cx, word [wnd_height]
3259
        sub     cx, word [skinh]
3260
        sub     cx, 5-1
517 diamond 3261
        int     0x40
314 diamond 3262
@@:
3263
        cmp     [fill_height], 0
3264
        jz      @f
3265
        xor     edx, edx
3266
        mov     ebx, 50000h
3267
        mov     bx, word [wnd_width]
3268
        sub     ebx, 9
3269
        mov     ecx, [wnd_height]
3270
        sub     ecx, [fill_height]
3271
        sub     ecx, 5-1
3272
        shl     ecx, 16
3273
        mov     cx, word [fill_height]
517 diamond 3274
        int     0x40
314 diamond 3275
@@:
283 diamond 3276
;        xor     ecx, ecx
3277
;        call    draw_image
474 diamond 3278
        mov     al, 65
3279
        mov     ebx, [MemForImage]
3280
        test    ebx, ebx
3281
        jz      @f
3282
        mov     ecx, [cur_width]
3283
        imul    ecx, font_width*10000h
3284
        mov     cx, word [cur_height]
3285
        imul    cx, font_height
3286
        mov     edx, [skinh]
3287
        add     edx, 5*10000h
3288
        mov     esi, 8
3289
        mov     edi, console_colors
3290
        xor     ebp, ebp
517 diamond 3291
        int     0x40
474 diamond 3292
@@:
283 diamond 3293
        mov     al, 12
180 heavyiron 3294
        push    2
3295
        pop     ebx
517 diamond 3296
        int     40h
180 heavyiron 3297
        ret
3298
 
3299
draw_image.nomem:
3300
        mov     al, 13
3301
        xor     edx, edx
3302
        mov     ebx, [cur_width]
3303
        imul    ebx, font_width
3304
        add     ebx, 5*65536
3305
        mov     ecx, [skinh-2]
3306
        mov     cx, word [cur_height]
3307
        imul    cx, font_height
517 diamond 3308
        int     40h
180 heavyiron 3309
        mov     al, 4
3310
        mov     ebx, 32*65536+32
3311
        mov     ecx, 0xFFFFFF
3312
        mov     edx, nomem_draw
3313
        push    nomem_draw.size
3314
        pop     esi
517 diamond 3315
        int     40h
180 heavyiron 3316
        ret
3317
 
3318
draw_image:
474 diamond 3319
        mov     [bMemForImageValidData], byte 1
3320
        cmp     [MemForImage], 0
3321
        jnz     .allocated
3322
; allocate memory for image
3323
        mov     ecx, [cur_width]
3324
        imul    ecx, [cur_height]
3325
        imul    ecx, font_width*font_height
3326
        call    pgalloc
3327
        test    eax, eax
3328
        jz      draw_image.nomem
3329
        mov     [MemForImage], eax
3330
        mov     [bMemForImageValidData], byte 0
3331
.allocated:
283 diamond 3332
        and     [max_x], 0
3333
        or      [min_x], -1
474 diamond 3334
        and     [max_y], 0
283 diamond 3335
        or      [min_y], -1
474 diamond 3336
        mov     eax, [cursor_y]
3337
        mul     [cur_width]
3338
        add     eax, [cursor_x]
3339
        add     eax, eax
3340
        add     eax, [console_data_ptr]
3341
        xchg    [cur_cursor_pos], eax
3342
        mov     [old_cursor_pos], eax
3343
        mov     edi, [MemForImage]
283 diamond 3344
        mov     esi, [console_data_ptr]
474 diamond 3345
        mov     ecx, [cur_height]
3346
.lh:
3347
        push    ecx
283 diamond 3348
        mov     ecx, [cur_width]
474 diamond 3349
.lw:
3350
        push    ecx
3351
        mov     eax, [cur_width]
3352
        imul    eax, [cur_height]
3353
        mov     ebx, [esi]
3354
        cmp     [bMemForImageValidData], 0
3355
        jz      @f
3356
        cmp     esi, [cur_cursor_pos]
3357
        jz      @f
3358
        cmp     esi, [old_cursor_pos]
3359
        jz      @f
3360
        cmp     bx, [eax*2+esi]
3361
        jnz     @f
3362
        inc     esi
3363
        inc     esi
3364
        jmp     .skip_symbol
283 diamond 3365
@@:
474 diamond 3366
        mov     [eax*2+esi], bx
3367
        cmp     ecx, [min_x]
283 diamond 3368
        ja      @f
474 diamond 3369
        mov     [min_x], ecx
283 diamond 3370
@@:
474 diamond 3371
        cmp     ecx, [max_x]
283 diamond 3372
        jb      @f
474 diamond 3373
        mov     [max_x], ecx
283 diamond 3374
@@:
474 diamond 3375
        mov     eax, [esp+4]
3376
        mov     [min_y], eax
3377
        cmp     eax, [max_y]
283 diamond 3378
        jb      @f
474 diamond 3379
        mov     [max_y], eax
283 diamond 3380
@@:
3381
        push    edi
474 diamond 3382
        xor     eax, eax
3383
        mov     al, [esi+1]
3384
        and     al, 0xF
3385
        mov     ebx, eax
3386
        mov     al, [esi+1]
3387
        shr     al, 4
3388
        mov     ebp, eax
283 diamond 3389
        sub     ebx, ebp
474 diamond 3390
        lodsb
3391
        inc     esi
180 heavyiron 3392
if font_width > 8
3393
        lea     edx, [eax+eax+font]
3394
else
3395
        lea     edx, [eax+font]
3396
end if
3397
.sh:
474 diamond 3398
        mov     ecx, [edx]
3399
repeat font_width
3400
        shr     ecx, 1
283 diamond 3401
        sbb     eax, eax
3402
        and     eax, ebx
3403
        add     eax, ebp
474 diamond 3404
        mov     [edi+%-1], al
3405
end repeat
3406
        mov     eax, [cur_width]
3407
;        imul    eax, font_width
3408
;        add     edi, eax
3409
if font_width = 6
3410
        lea     eax, [eax*2+eax]
3411
        lea     edi, [edi+eax*2]
3412
else if font_width = 7
3413
        lea     edi, [edi+eax*8]
3414
        sub     edi, eax
3415
else if font_width = 8
3416
        lea     edi, [edi+eax*8]
3417
else if font_width = 9
3418
        lea     edi, [edi+eax*8]
180 heavyiron 3419
        add     edi, eax
474 diamond 3420
else if font_width = 10
3421
        lea     eax, [eax*4+eax]
3422
        lea     edi, [edi+eax*2]
3423
else
3424
Unknown font_width value!
3425
end if
180 heavyiron 3426
if font_width > 8
3427
        add     edx, 256*2
474 diamond 3428
        cmp     edx, font+256*2*font_height
180 heavyiron 3429
else
3430
        add     edx, 256
474 diamond 3431
        cmp     edx, font+256*font_height
180 heavyiron 3432
end if
474 diamond 3433
        jb      .sh
283 diamond 3434
        pop     edi
3435
.skip_symbol:
3436
        pop     ecx
3437
        add     edi, font_width
3438
        dec     ecx
3439
        jnz     .lw
474 diamond 3440
        mov     eax, [cur_width]
283 diamond 3441
        imul    eax, (font_height-1)*font_width
180 heavyiron 3442
        add     edi, eax
474 diamond 3443
        pop     ecx
283 diamond 3444
        dec     ecx
3445
        jnz     .lh
3446
; cursor
3447
        mov     eax, [cursor_y]
3448
        inc     eax
3449
        jz      .nocursor
474 diamond 3450
        mul     [cur_width]
283 diamond 3451
        imul    eax, font_height*font_width
3452
        mov     edx, [cursor_x]
3453
        inc     edx
3454
        imul    edx, font_width
3455
        add     eax, edx
474 diamond 3456
        add     eax, [MemForImage]
3457
        mov     edx, [cur_width]
283 diamond 3458
        imul    edx, font_width
3459
        neg     edx
3460
        mov     ecx, (font_height*15+50)/100
3461
.cursor_loop:
3462
        push    ecx
3463
        mov     ecx, font_width
3464
        add     eax, edx
3465
        push    eax
3466
@@:
3467
;        add     byte [eax-1], 0x10
3468
        xor     byte [eax-1], 7
3469
        sub     eax, 1
3470
        loop    @b
3471
        pop     eax
180 heavyiron 3472
        pop     ecx
283 diamond 3473
        loop    .cursor_loop
3474
.nocursor:
474 diamond 3475
        cmp     [min_y], -1
3476
        jz      .nodraw
3477
        mov     ecx, [cur_width]
3478
        mov     ebx, [cur_height]
3479
        mov     eax, ebx
3480
        sub     ebx, [max_y]
3481
        sub     eax, [min_y]
3482
        sub     eax, ebx
3483
        inc     eax
3484
        imul    ebp, eax, font_height
3485
        mov     edx, ecx
3486
        sub     edx, [max_x]
283 diamond 3487
        imul    edx, font_width
474 diamond 3488
        mov     eax, edx
283 diamond 3489
        shl     edx, 16
474 diamond 3490
        imul    dx, bx, font_height
3491
        imul    ebx, [cur_width]
3492
        mov     ecx, [max_x]
3493
        sub     ecx, [min_x]
3494
        inc     ecx
3495
        imul    ecx, font_width*10000h
3496
        add     ecx, ebp
3497
        imul    ebx, font_width*font_height
3498
        add     ebx, [MemForImage]
3499
        add     ebx, eax
283 diamond 3500
        add     edx, [skinh]
474 diamond 3501
        add     edx, 5*10000h
3502
        imul    esi, [cur_width], font_width
3503
        mov     ebp, ecx
3504
        shr     ebp, 16
3505
        sub     esi, ebp
3506
        mov     ebp, esi
283 diamond 3507
        push    65
180 heavyiron 3508
        pop     eax
474 diamond 3509
        mov     edi, console_colors
283 diamond 3510
        push    8
3511
        pop     esi
517 diamond 3512
        int     40h
283 diamond 3513
.nodraw:
180 heavyiron 3514
        ret
3515
 
3516
get_console_ptr:
3517
; in: eax=x, edx=y
3518
; out: edi->console data
3519
        push    edx
3520
        imul    edx, [cur_width]
3521
        add     edx, eax
283 diamond 3522
        mov     edi, [console_data_ptr]
3523
        lea     edi, [edi + edx*2]
180 heavyiron 3524
        pop     edx
3525
        ret
3526
 
3527
draw_keybar:
3528
        pushad
3529
        xor     eax, eax
3530
        test    [ctrlstate], 3
3531
        jz      @f
3532
        inc     eax
3533
@@:
3534
        test    [ctrlstate], 0xC
3535
        jz      @f
3536
        or      al, 2
3537
@@:
3538
        test    [ctrlstate], 0x30
3539
        jz      @f
3540
        or      al, 4
3541
@@:
3542
        imul    eax, 6*12
3543
        mov     esi, [active_screen_vtable]
3544
        mov     esi, [esi+screen_vtable.keybar]
3545
        add     esi, eax
3546
        xor     ecx, ecx
3547
        inc     ecx
3548
        xor     eax, eax
3549
        mov     edx, [cur_height]
3550
        dec     edx
3551
        call    get_console_ptr
3552
        push    6
3553
        pop     ebx
3554
        mov     eax, [cur_width]
3555
        sub     eax, 11+9+3*2+6
3556
        cmp     eax, 7*11
3557
        jl      @f
3558
        cdq
3559
        mov     bl, 11
3560
        div     ebx
3561
        mov     ebx, eax
3562
@@:
3563
        xor     edx, edx
3564
.l:
3565
        add     edx, 7
3566
        cmp     cl, 10
3567
        jb      @f
3568
        inc     edx
3569
@@:
3570
        cmp     edx, [cur_width]
3571
        ja      .ret
3572
        cmp     cl, 10
3573
        jae     .twodig
3574
        lea     eax, [ecx+'0']
3575
        stosb
3576
        mov     al, [keybar_number_color]
3577
        stosb
3578
        jmp     .cmn
3579
.twodig:
3580
        mov     al, cl
3581
        cbw
3582
        div     [_10]
3583
        add     al, '0'
3584
        stosb
3585
        mov     al, [keybar_number_color]
3586
        stosb
3587
        xchg    al, ah
3588
        add     al, '0'
3589
        stosw
3590
.cmn:
3591
        mov     ah, [keybar_name_color]
3592
        push    ecx
3593
        mov     cl, 6
3594
@@:
3595
        lodsb
3596
        stosw
3597
        loop    @b
3598
        mov     al, ' '
3599
        lea     ecx, [ebx-6]
3600
        cmp     byte [esp], 12
3601
        jz      .ret_pop
3602
        add     edx, ecx
3603
        rep     stosw
3604
        pop     ecx
3605
        inc     edx
3606
        cmp     edx, [cur_width]
3607
        ja      .ret
3608
        mov     ah, [keybar_bgr_color]
3609
        stosw
3610
        inc     ecx
3611
        jmp     .l
3612
.ret_pop:
3613
        pop     ecx
3614
.ret:
3615
        cmp     byte [edi-2], ' '
3616
        jnz     @f
3617
        dec     edi
3618
        dec     edi
3619
@@:
3620
        push    edi
283 diamond 3621
        xor     eax, eax
180 heavyiron 3622
        mov     edx, [cur_height]
3623
        call    get_console_ptr
3624
        mov     ecx, edi
3625
        pop     edi
3626
        sub     ecx, edi
3627
        shr     ecx, 1
3628
        mov     al, ' '
3629
        mov     ah, [keybar_name_color]
3630
        rep     stosw
3631
.done:
3632
        popad
3633
        ret
3634
 
3635
draw_cmdbar:
3636
        mov     esi, [active_panel]
3637
        add     esi, panel1_dir - panel1_data
3638
        xor     eax, eax
3639
        mov     edx, [cur_height]
3640
        dec     edx
3641
        dec     edx
3642
        call    get_console_ptr
3643
        mov     ah, [cmdbar_prefix_color]
3644
        mov     ecx, [cur_width]
3645
        dec     ecx
3646
@@:
3647
        lodsb
3648
        test    al, al
3649
        jz      @f
3650
        stosw
3651
        loop    @b
3652
@@:
3653
        mov     al, '>'
3654
        stosw
3655
        mov     al, ' '
3656
        mov     ah, [cmdbar_normal_color]
3657
        rep     stosw
3658
        ret
3659
 
3660
draw_border:
3661
        push    edi
3662
        mov     al, 0xC9
3663
        stosw
3664
        mov     al, 0xCD
3665
        lea     ecx, [ebx-2]
3666
        rep     stosw
3667
        mov     al, 0xBB
3668
        stosw
3669
        pop     edi
3670
        add     edi, [cur_width]
3671
        add     edi, [cur_width]
3672
        lea     ecx, [edx-2]
3673
.l:
3674
        push    edi
3675
        mov     al, 0xBA
3676
        stosw
3677
        mov     al, 0x20
3678
        push    ecx
3679
        lea     ecx, [ebx-2]
3680
        rep     stosw
3681
        pop     ecx
3682
        mov     al, 0xBA
3683
        stosw
3684
        pop     edi
3685
        add     edi, [cur_width]
3686
        add     edi, [cur_width]
3687
        loop    .l
3688
        mov     al, 0xC8
3689
        stosw
3690
        mov     al, 0xCD
3691
        lea     ecx, [ebx-2]
3692
        rep     stosw
3693
        mov     al, 0xBC
3694
        stosw
3695
        ret
3696
 
474 diamond 3697
calc_colwidths:
3698
; in: ebp->panel data
3699
        imul    esi, [ebp + panel1_colmode - panel1_data], PanelMode.size
3700
        add     esi, colmodes
3701
        lodsd
3702
        mov     ecx, eax
3703
        lea     edx, [ecx-1]
3704
        xor     ebx, ebx
3705
        add     esi, PanelMode.ColumnWidths-4
3706
        push    ecx esi
3707
        xor     eax, eax
3708
.loop:
3709
        lodsb
3710
        add     edx, eax
3711
        cmp     al, 1
3712
        adc     ebx, 0
3713
        loop    .loop
3714
        pop     esi ecx
3715
        lea     edi, [ebp + panel1_colwidths - panel1_data]
3716
        test    ebx, ebx
3717
        jz      .loop2
3718
        mov     eax, [ebp + panel1_width - panel1_data]
3719
        dec     eax
3720
        dec     eax
3721
        sub     eax, edx
3722
        jae     @f
3723
        xor     eax, eax
3724
@@:
3725
        xor     edx, edx
3726
        div     ebx
3727
        test    eax, eax
3728
        jnz     @f
3729
        xor     edx, edx
3730
        inc     eax
3731
@@:
3732
        push    eax
3733
.loop2:
3734
        movzx   eax, byte [esi]
3735
        inc     esi
3736
        test    eax, eax
3737
        jnz     @f
3738
        pop     eax
3739
        push    eax
3740
        dec     ebx
3741
        cmp     ebx, edx
3742
        jae     @f
3743
        inc     eax
3744
@@:
3745
        stosd
3746
        loop    .loop2
3747
        pop     eax
3748
        and     dword [edi], 0
3749
        ret
3750
 
589 diamond 3751
GetPanelTitle_default:
3752
        mov     edi, [esp+8]
3753
        mov     ecx, 1024
3754
        mov     esi, [esp+12]
3755
        test    esi, esi
3756
        jz      .nohost
3757
        mov     edx, esi
3758
@@:
3759
        lodsb
3760
        test    al, al
3761
        jz      @f
3762
        cmp     al, '/'
3763
        jnz     @b
3764
        mov     edx, esi
3765
        jmp     @b
3766
@@:
3767
        mov     esi, edx
3768
@@:
3769
        lodsb
3770
        stosb
3771
        test    al, al
3772
        loopnz  @b
3773
        dec     edi
3774
        inc     ecx
3775
.nohost:
3776
        mov     esi, [esp+16]
3777
        cmp     word [esi], '/'
3778
        jz      .nodir
3779
@@:
3780
        lodsb
3781
        stosb
3782
        test    al, al
3783
        loopnz  @b
3784
        dec     edi
3785
.nodir:
3786
        mov     byte [edi], 0
3787
        ret     10h
3788
 
180 heavyiron 3789
draw_panel:
3790
        mov     eax, [ebp + panel1_left - panel1_data]
3791
        mov     edx, [ebp + panel1_top - panel1_data]
3792
        call    get_console_ptr
3793
; draw border
3794
        mov     ah, [panel_border_color]
3795
        mov     ebx, [ebp + panel1_width - panel1_data]
3796
        mov     edx, [ebp + panel1_height - panel1_data]
3797
        call    draw_border
3798
        push    eax
3799
        mov     eax, [ebp + panel1_left - panel1_data]
3800
        mov     edx, [ebp + panel1_top - panel1_data]
3801
        add     edx, [ebp + panel1_height - panel1_data]
3802
        sub     edx, 3
3803
        call    get_console_ptr
3804
        pop     eax
3805
        mov     al, 0xC7
3806
        stosw
3807
        mov     al, 0xC4
3808
        lea     ecx, [ebx-2]
3809
        rep     stosw
3810
        mov     al, 0xB6
3811
        stosw
474 diamond 3812
 
3813
        imul    esi, [ebp + panel1_colmode - panel1_data], PanelMode.size
3814
        add     esi, colmodes
3815
        lodsd
3816
        mov     ecx, eax        ; number of columns
3817
        lea     ebx, [ebp + panel1_colwidths - panel1_data]
180 heavyiron 3818
        mov     eax, [ebp + panel1_left - panel1_data]
3819
        inc     eax
3820
        mov     [column_left], eax
474 diamond 3821
        mov     eax, [ebp + panel1_top - panel1_data]
3822
        inc     eax
3823
        mov     [column_top], eax
3824
        mov     eax, [ebp + panel1_height - panel1_data]
3825
        sub     eax, 4
3826
        mov     [column_height], eax
3827
        dec     eax
3828
        mov     [ebp + panel1_colsz - panel1_data], eax
3829
        and     [ebp + panel1_colst - panel1_data], 0
3830
        mov     eax, [ebp + panel1_start - panel1_data]
3831
        mov     [column_index], eax
3832
        mov     [last_column_index], eax
3833
.columns_loop:
3834
        push    ecx
3835
        mov     eax, [ebx]
3836
        add     ebx, 4
3837
        mov     [column_width], eax
3838
        cmp     ecx, 1
3839
        jz      .skip_right_border
3840
        add     eax, [column_left]
180 heavyiron 3841
        mov     edx, [ebp + panel1_top - panel1_data]
3842
        call    get_console_ptr
474 diamond 3843
        mov     ah, [panel_header_color]
180 heavyiron 3844
        mov     al, 0xD1
3845
        mov     [edi], ax
3846
        add     edi, [cur_width]
3847
        add     edi, [cur_width]
474 diamond 3848
        mov     ecx, [column_height]
180 heavyiron 3849
        mov     al, 0xB3
3850
@@:
3851
        mov     [edi], ax
3852
        add     edi, [cur_width]
3853
        add     edi, [cur_width]
3854
        loop    @b
3855
        mov     al, 0xC1
3856
        stosw
474 diamond 3857
.skip_right_border:
3858
        mov     eax, [column_left]
3859
        mov     edx, [column_top]
3860
        call    get_console_ptr
3861
; заголовок столбца
3862
        push    edi
3863
        mov     edx, [esi]
3864
        and     edx, 0xF
3865
        mov     edx, [column_headers+edx*4]
3866
        movzx   ecx, byte [edx]
3867
        inc     edx
3868
        cmp     ecx, [column_width]
3869
        jb      @f
180 heavyiron 3870
        mov     ecx, [column_width]
474 diamond 3871
@@:
3872
        push    ecx
3873
        sub     ecx, [column_width]
3874
        neg     ecx
3875
        shr     ecx, 1
3876
        mov     al, ' '
3877
        mov     ah, [column_header_color]
3878
        rep     stosw
3879
        pop     ecx
3880
        jecxz   .skipcopyhdr
3881
        push    ecx
3882
@@:
3883
        mov     al, [edx]
3884
        inc     edx
3885
        stosw
3886
        loop    @b
3887
        pop     ecx
3888
.skipcopyhdr:
3889
        sub     ecx, [column_width]
3890
        neg     ecx
180 heavyiron 3891
        inc     ecx
474 diamond 3892
        shr     ecx, 1
3893
        mov     al, ' '
3894
        rep     stosw
3895
        pop     edi
3896
        add     edi, [cur_width]
3897
        add     edi, [cur_width]
3898
; сам столбец
3899
        mov     eax, [esi]
3900
        and     eax, 0xF
3901
        push    ebx esi
3902
        call    dword [draw_column_proc+eax*4]
3903
        pop     esi ebx
3904
        inc     esi
3905
        mov     eax, [column_width]
3906
        inc     eax
3907
        add     [column_left], eax
3908
        pop     ecx
3909
        dec     ecx
3910
        jnz     .columns_loop
180 heavyiron 3911
; Заголовок панели (текущая папка)
3912
        lea     esi, [ebp + panel1_dir - panel1_data]
589 diamond 3913
        mov     eax, [ebp + panel1_hPlugin - panel1_data]
3914
        test    eax, eax
3915
        jz      .native
3916
        push    ebp
3917
        push    esi
3918
        mov     esi, [ebp + panel1_parents - panel1_data]
3919
        add     esi, [ebp + panel1_parents_sz - panel1_data]
3920
@@:
3921
        dec     esi
3922
        cmp     byte [esi-1], 0
3923
        jnz     @b
3924
        push    esi
3925
        push    execdata
3926
        push    [ebp + panel1_hFile - panel1_data]
3927
        call    [eax+PluginInfo.GetPanelTitle]
3928
        pop     ebp
3929
        mov     esi, execdata
3930
.native:
180 heavyiron 3931
        mov     edi, cur_header
3932
        mov     ecx, [ebp + panel1_width - panel1_data]
3933
        sub     ecx, 7
3934
        movsb
3935
@@:
3936
        lodsb
3937
        stosb
3938
        dec     ecx
3939
        test    al, al
3940
        jz      .header_created
3941
        cmp     al, '/'
3942
        jnz     @b
3943
        mov     edx, esi
3944
@@:
3945
        lodsb
3946
        test    al, al
3947
        jnz     @b
3948
        sub     esi, edx
3949
        dec     esi
3950
        cmp     esi, ecx
3951
        jbe     @f
3952
        mov     word [edi], '..'
3953
        mov     byte [edi+2], '.'
3954
        add     edi, 3
3955
        sub     ecx, 3
3956
        add     edx, esi
3957
        sub     edx, ecx
3958
@@:
3959
        mov     esi, edx
3960
@@:
3961
        lodsb
3962
        stosb
3963
        dec     ecx
3964
        test    al, al
3965
        jnz     @b
3966
.header_created:
3967
        mov     edx, [ebp + panel1_top - panel1_data]
3968
        mov     eax, [ebp + panel1_left - panel1_data]
3969
        shr     ecx, 1
3970
        lea     eax, [eax+ecx+3]
3971
        call    get_console_ptr
3972
        mov     ah, [panel_active_header_color]
3973
        cmp     ebp, [active_panel]
3974
        jz      @f
3975
        mov     ah, [panel_header_color]
3976
@@:
3977
        mov     al, ' '
3978
        stosw
3979
        mov     esi, cur_header
3980
@@:
3981
        lodsb
3982
        test    al, al
3983
        jz      @f
3984
        stosw
3985
        jmp     @b
3986
@@:
3987
        mov     al, ' '
3988
        stosw
3989
        mov     edx, [ebp + panel1_top - panel1_data]
3990
        inc     edx
3991
        mov     eax, [ebp + panel1_left - panel1_data]
3992
        inc     eax
3993
        call    get_console_ptr
3994
        movzx   eax, [ebp + panel1_sortmode - panel1_data]
3995
        mov     al, [compare_names+eax]
3996
        stosb
474 diamond 3997
        mov     eax, [ebp + panel1_selected_num - panel1_data]
3998
        test    eax, eax
3999
        jz      .skip_selected_info
4000
; Информация о выделенных файлах
4001
        push    dword [ebp + panel1_selected_size+4 - panel1_data]
4002
        push    dword [ebp + panel1_selected_size - panel1_data]
4003
        call    fill_total_info
4004
        mov     eax, [ebp + panel1_width - panel1_data]
4005
        sub     eax, 2
4006
        cmp     ecx, eax
4007
        jbe     @f
4008
        mov     ecx, eax
4009
        mov     edi, saved_file_name+512
4010
        sub     edi, eax
4011
        mov     byte [edi], '.'
4012
        mov     word [edi+1], '..'
4013
@@:
4014
        mov     esi, edi
4015
        sub     eax, ecx
4016
        shr     eax, 1
4017
        inc     eax
4018
        add     eax, [ebp + panel1_left - panel1_data]
4019
        mov     edx, [ebp + panel1_top - panel1_data]
4020
        add     edx, [ebp + panel1_height - panel1_data]
4021
        sub     edx, 3
4022
        call    get_console_ptr
4023
        mov     ah, [panel_numselected_color]
4024
@@:
4025
        lodsb
4026
        stosw
4027
        loop    @b
4028
.skip_selected_info:
4029
; Информация об общем числе и размере файлов панели
4030
        mov     eax, [ebp + panel1_total_num - panel1_data]
4031
        push    dword [ebp + panel1_total_size+4 - panel1_data]
4032
        push    dword [ebp + panel1_total_size - panel1_data]
4033
        call    fill_total_info
4034
        mov     eax, [ebp + panel1_width - panel1_data]
4035
        sub     eax, 2
4036
        cmp     ecx, eax
4037
        jbe     @f
4038
        mov     ecx, eax
4039
        mov     byte [edi+ecx-3], '.'
4040
        mov     word [edi+ecx-2], '..'
4041
@@:
4042
        sub     eax, ecx
4043
        shr     eax, 1
4044
        inc     eax
4045
        add     eax, [ebp + panel1_left - panel1_data]
4046
        add     edx, [ebp + panel1_top - panel1_data]
4047
        add     edx, [ebp + panel1_height - panel1_data]
4048
        dec     edx
4049
        mov     esi, edi
4050
        call    get_console_ptr
4051
        mov     ah, [panel_number_color]
4052
@@:
4053
        lodsb
4054
        stosw
4055
        loop    @b
180 heavyiron 4056
        cmp     [ebp + panel1_numfiles - panel1_data], 0
4057
        jz      .skip_curinfo
474 diamond 4058
; Информация о текущем файле
180 heavyiron 4059
        mov     ebx, [ebp + panel1_index - panel1_data]
4060
        mov     eax, [ebp + panel1_files - panel1_data]
4061
        mov     ebx, [eax+ebx*4]
4062
        mov     eax, [ebp + panel1_left - panel1_data]
4063
        add     eax, [ebp + panel1_width - panel1_data]
4064
        dec     eax
4065
        mov     edx, [ebp + panel1_top - panel1_data]
4066
        add     edx, [ebp + panel1_height - panel1_data]
4067
        dec     edx
4068
        dec     edx
4069
        call    get_console_ptr
4070
        mov     ecx, [ebp + panel1_width - panel1_data]
4071
        dec     ecx
4072
        dec     ecx
474 diamond 4073
        cmp     [ebp + panel1_colmode - panel1_data], 3
4074
        jz      .show_curname
180 heavyiron 4075
; Время модификации
4076
        sub     edi, 5*2
4077
        sub     ecx, 6
4078
        mov     al, [ebx+24+2]
4079
        aam
4080
        or      ax, 0x3030
4081
        mov     [edi], ah
4082
        mov     [edi+2], al
4083
        mov     [edi+4], byte ':'
4084
        mov     al, [ebx+24+1]
4085
        aam
4086
        or      ax, 0x3030
4087
        mov     [edi+6], ah
4088
        mov     [edi+8], al
4089
        mov     al, [panel_normal_color]
4090
        mov     [edi+1], al
4091
        mov     [edi+3], al
4092
        mov     [edi+5], al
4093
        mov     [edi+7], al
4094
        mov     [edi+9], al
4095
        dec     edi
4096
        mov     [edi], al
4097
        dec     edi
4098
        mov     byte [edi], ' '
4099
; Дата модификации
4100
        sub     edi, 8*2
4101
        sub     ecx, 9
4102
        mov     al, [ebx+28+0]
4103
        aam
4104
        or      ax, 0x3030
4105
        mov     [edi], ah
4106
        mov     [edi+2], al
4107
        mov     [edi+4], byte '.'
4108
        mov     al, [ebx+28+1]
4109
        aam
4110
        or      ax, 0x3030
4111
        mov     [edi+6], ah
4112
        mov     [edi+8], al
4113
        mov     [edi+10], byte '.'
4114
        mov     ax, [ebx+28+2]
4115
        div     [_100]
4116
        mov     al, ah
4117
        aam
4118
        or      ax, 0x3030
4119
        mov     [edi+12], ah
4120
        mov     [edi+14], al
4121
        mov     al, [panel_normal_color]
4122
        mov     [edi+1], al
4123
        mov     [edi+3], al
4124
        mov     [edi+5], al
4125
        mov     [edi+7], al
4126
        mov     [edi+9], al
4127
        mov     [edi+11], al
4128
        mov     [edi+13], al
4129
        mov     [edi+15], al
4130
        dec     edi
4131
        mov     [edi], al
4132
        dec     edi
4133
        mov     [edi], byte ' '
4134
; Размер
4135
        std
4136
        mov     ah, [panel_normal_color]
4137
        dec     edi
4138
        dec     edi
4139
        dec     ecx
4140
        test    byte [ebx], 0x10
4141
        jz      .size_file
4142
        push    ecx
4143
        mov     esi, aFolder+aFolder.size-1
4144
        mov     ecx, aFolder.size
4145
        cmp     word [ebx+40], '..'
4146
        jnz     @f
4147
        cmp     byte [ebx+42], 0
4148
        jnz     @f
4149
        mov     esi, aUp+aUp.size-1
4150
        mov     cl, aUp.size
4151
@@:
4152
        sub     [esp], ecx
4153
@@:
4154
        lodsb
4155
        stosw
4156
        loop    @b
4157
        pop     ecx
4158
        jmp     .size_done
4159
.size_file:
4160
        mov     edx, [ebx+36]
4161
        test    edx, edx
4162
        jz      .size_less_4g
4163
        cmp     edx, 10*256
4164
        jae     .size_tera
4165
; в гигабайтах
4166
        mov     al, 'G'
283 diamond 4167
        shl     edx, 2
180 heavyiron 4168
        jmp     .size_letter
4169
.size_tera:
4170
; в терабайтах
4171
        shr     edx, 8
4172
        mov     al, 'T'
4173
        jmp     .size_letter
4174
.size_less_4g:
4175
        mov     edx, [ebx+32]
4176
        cmp     edx, 10*(1 shl 20)
4177
        jae     .size_mega
4178
        cmp     edx, 1 shl 20
4179
        jb      .size_num
4180
        shr     edx, 10
4181
        mov     al, 'K'
4182
        jmp     .size_letter
4183
.size_mega:
4184
        mov     al, 'M'
4185
        shr     edx, 20
4186
.size_letter:
4187
        stosw
4188
        dec     ecx
4189
        mov     al, ' '
4190
        stosw
4191
        dec     ecx
4192
.size_num:
4193
        xchg    eax, edx
4194
        xor     edx, edx
4195
        div     [_10d]
4196
        xchg    eax, edx
4197
        add     al, '0'
4198
        mov     ah, [panel_normal_color]
4199
        stosw
4200
        dec     ecx
4201
        test    edx, edx
4202
        jnz     .size_num
4203
.size_done:
4204
        cld
474 diamond 4205
.show_curname:
180 heavyiron 4206
; Имя
4207
        sub     edi, ecx
4208
        sub     edi, ecx
4209
        lea     esi, [ebx+40]
4210
@@:
4211
        lodsb
4212
        test    al, al
4213
        jnz     @b
4214
        sub     esi, ebx
4215
        sub     esi, 41
4216
        mov     ah, [panel_normal_color]
4217
        cmp     esi, ecx
4218
        lea     edx, [ebx+40]
4219
        jbe     @f
4220
        mov     al, '{'
4221
        mov     [edi-2], ax
4222
        add     edx, esi
4223
        sub     edx, ecx
4224
@@:
4225
        mov     esi, edx
4226
@@:
4227
        lodsb
4228
        test    al, al
4229
        jz      @f
4230
        stosw
4231
        loop    @b
4232
@@:
4233
        mov     al, ' '
4234
        rep     stosw
4235
.skip_curinfo:
4236
        call    draw_image
4237
        ret
4238
 
474 diamond 4239
fill_total_info:
4240
        mov     edi, saved_file_name+511
4241
        mov     byte [edi], ' '
180 heavyiron 4242
if lang eq ru
474 diamond 4243
        mov     byte [edi-1], 'е'
4244
        dec     edi
4245
        cmp     eax, 1
4246
        jz      @f
4247
        mov     word [edi-1], 'ах'
4248
        dec     edi
4249
@@:
4250
        mov     dword [edi-4], 'файл'
4251
        mov     byte [edi-5], ' '
4252
        sub     edi, 5
180 heavyiron 4253
else
474 diamond 4254
        cmp     eax, 1
4255
        jz      @f
4256
        dec     edi
4257
        mov     byte [edi], 's'
4258
@@:
4259
        mov     dword [edi-4], 'file'
4260
        mov     byte [edi-5], ' '
4261
        sub     edi, 5
180 heavyiron 4262
end if
474 diamond 4263
        xor     edx, edx
4264
        push    10
4265
        pop     ecx
4266
@@:
4267
        div     ecx
4268
        dec     edi
4269
        add     dl, '0'
4270
        mov     [edi], dl
4271
        xor     edx, edx
4272
        test    eax, eax
4273
        jnz     @b
180 heavyiron 4274
if lang eq ru
474 diamond 4275
        mov     dword [edi-4], 'т в '
4276
        mov     dword [edi-8], ' бай'
4277
        sub     edi, 8
180 heavyiron 4278
else
474 diamond 4279
        mov     dword [edi-4], ' in '
4280
        mov     dword [edi-8], 'ytes'
4281
        mov     word [edi-10], ' b'
4282
        sub     edi, 10
180 heavyiron 4283
end if
474 diamond 4284
        lea     esi, [edi-3]
4285
        mov     edx, [esp+8]
4286
        mov     eax, [esp+4]
4287
.selsizel:
4288
        push    edx
4289
        mov     ebx, edx
4290
        xor     edx, edx
4291
        add     ebx, ebx
4292
        adc     edx, edx
4293
        push    ebx
4294
        push    edx
4295
        add     ebx, ebx
4296
        adc     edx, edx
4297
        add     ebx, [esp+4]
4298
        adc     edx, [esp]
4299
        add     esp, 8
4300
        add     eax, ebx
4301
        adc     edx, 0
4302
        div     ecx
4303
        dec     edi
4304
        cmp     edi, esi
4305
        jae     @f
4306
        mov     byte [edi], ','
4307
        dec     edi
4308
        sub     esi, 4
4309
@@:
4310
        pop     ebx
4311
        add     dl, '0'
4312
        mov     byte [edi], dl
4313
        xchg    eax, ebx
4314
        mul     [muldiv10]
4315
        add     eax, ebx
4316
        adc     edx, 0
4317
        mov     ebx, eax
4318
        or      ebx, edx
4319
        jnz     .selsizel
4320
        dec     edi
4321
        mov     byte [edi], ' '
4322
        mov     ecx, saved_file_name+512
4323
        sub     ecx, edi
4324
        ret     8
4325
 
4326
get_file_color:
4327
        mov     ah, [esi + 6]
4328
        cmp     ebp, [active_panel]
4329
        jnz     @f
4330
        cmp     ecx, [ebp + panel1_index - panel1_data]
4331
        jnz     @f
4332
        mov     ah, [esi + 7]
4333
@@:
4334
        test    byte [esi + 303], 1
4335
        jnz     @f
4336
        mov     ah, [esi + 4]
4337
        cmp     ebp, [active_panel]
4338
        jnz     @f
4339
        cmp     ecx, [ebp + panel1_index - panel1_data]
4340
        jnz     @f
4341
        mov     ah, [esi + 5]
4342
@@:
4343
        ret
4344
 
4345
draw_name_column:
4346
        mov     eax, [column_index]
4347
        mov     [last_column_index], eax
180 heavyiron 4348
        mov     edx, [ebp + panel1_numfiles - panel1_data]
4349
        mov     ecx, [column_height]
4350
        dec     ecx
4351
.l:
4352
        cmp     [column_index], edx
4353
        jae     .ret
4354
        push    ecx
474 diamond 4355
        mov     ecx, [column_index]
4356
        mov     esi, [ebp + panel1_files - panel1_data]
4357
        mov     esi, [esi+ecx*4]
4358
        mov     ebx, [esi]
4359
        call    get_file_color
321 diamond 4360
        add     esi, 40
180 heavyiron 4361
        mov     ecx, [column_width]
4362
        push    edi
4363
@@:
4364
        lodsb
4365
        test    al, al
4366
        jz      @f
4367
        stosw
4368
        loop    @b
474 diamond 4369
        lodsb
4370
        test    al, al
180 heavyiron 4371
        jz      @f
4372
        mov     byte [edi], '}'
474 diamond 4373
        jmp     .continue
180 heavyiron 4374
@@:
474 diamond 4375
        test    bl, 10h
4376
        jnz     .noalignext
4377
        mov     ebx, [ebp + panel1_colmode - panel1_data]
4378
; sizeof(PanelMode) = 40
4379
        lea     ebx, [ebx+ebx*4]
4380
        cmp     [colmodes+ebx*8+PanelMode.bAlignExtensions], 0
4381
        jz      .noalignext
4382
        push    ecx
4383
        sub     ecx, [column_width]
4384
        neg     ecx
4385
        jz      .noalignext2
4386
        dec     esi
4387
@@:
4388
        dec     esi
4389
        cmp     byte [esi], '.'
4390
        loopnz  @b
4391
        jnz     .noalignext2
4392
        inc     esi
4393
        sub     ecx, [column_width]
4394
        neg     ecx
4395
        sub     ecx, [esp]
4396
        sub     edi, ecx
4397
        sub     edi, ecx
4398
        dec     ecx
4399
        mov     ebx, [esp+4]
4400
        cmp     ecx, 3
4401
        ja      @f
4402
        mov     cl, 3
4403
@@:
4404
        sub     ecx, [column_width]
4405
        sub     ebx, edi
4406
        sar     ebx, 1
4407
        sub     ebx, ecx
4408
        pop     ecx
4409
        inc     ecx
4410
        push    0
4411
        cmp     ecx, ebx
4412
        jbe     @f
4413
        sub     ecx, ebx
4414
        mov     [esp], ecx
4415
        mov     ecx, ebx
4416
@@:
180 heavyiron 4417
        mov     al, ' '
4418
        rep     stosw
474 diamond 4419
@@:
4420
        lodsb
4421
        test    al, al
4422
        jz      .noalignext2
4423
        stosw
4424
        jmp     @b
4425
.noalignext2:
4426
        pop     ecx
4427
.noalignext:
4428
        mov     al, ' '
4429
        rep     stosw
4430
.continue:
180 heavyiron 4431
        pop     edi
4432
        add     edi, [cur_width]
4433
        add     edi, [cur_width]
4434
        inc     [column_index]
4435
        pop     ecx
4436
        dec     ecx
4437
        jnz     .l
4438
.ret:
474 diamond 4439
        mov     eax, [ebp + panel1_colsz - panel1_data]
4440
        add     [ebp + panel1_colst - panel1_data], eax
180 heavyiron 4441
        cmp     ebp, panel1_data
4442
        jnz     .ret2
4443
; Число экранов
4444
        mov     eax, [num_screens]
4445
        dec     eax
4446
        jz      .ret2
4447
        push    eax
4448
        xor     eax, eax
4449
        xor     edx, edx
4450
        call    get_console_ptr
4451
        mov     ah, [panel_nscreens_color]
4452
        mov     al, '['
4453
        stosw
4454
        pop     eax
4455
        push    -'0'
4456
@@:
4457
        xor     edx, edx
4458
        div     [_10d]
4459
        push    edx
4460
        test    eax, eax
4461
        jnz     @b
4462
@@:
4463
        pop     eax
4464
        add     eax, '0'
4465
        jz      @f
4466
        mov     ah, [panel_nscreens_color]
4467
        stosw
4468
        jmp     @b
4469
@@:
4470
        mov     al, ']'
4471
        mov     ah, [panel_nscreens_color]
4472
        stosw
4473
.ret2:
474 diamond 4474
draw_empty_column:
180 heavyiron 4475
        ret
4476
 
474 diamond 4477
draw_size_column:
4478
        add     edi, [column_width]
4479
        add     edi, [column_width]
4480
        dec     edi
4481
        dec     edi
4482
        std
4483
        mov     ecx, [column_height]
4484
        dec     ecx
4485
        push    [last_column_index]
4486
.l:
4487
        mov     edx, [ebp + panel1_numfiles - panel1_data]
4488
        cmp     [last_column_index], edx
4489
        jae     .ret
4490
        push    ecx
4491
        push    edi
4492
        mov     ecx, [last_column_index]
4493
        mov     esi, [ebp + panel1_files - panel1_data]
4494
        mov     esi, [esi+ecx*4]
4495
        call    get_file_color
4496
        mov     ecx, [column_width]
4497
@@:
4498
        mov     ebx, eax
4499
        cmp     word [esi+40], '..'
4500
        jnz     .nodotdot
4501
        cmp     byte [esi+42], 0
4502
        jnz     .nodotdot
4503
if lang eq ru
4504
        mov     al, 'х'
4505
        stosw
4506
        mov     al, 'р'
4507
        stosw
4508
        mov     al, 'е'
4509
        stosw
4510
        mov     al, 'в'
4511
        stosw
4512
        mov     al, 'В'
4513
        stosw
4514
        sub     ecx, 5
4515
else
4516
        mov     al, ' '
4517
        stosw
4518
        stosw
4519
        mov     al, 'p'
4520
        stosw
4521
        mov     al, 'U'
4522
        stosw
4523
        sub     ecx, 4
4524
end if
4525
        jmp     .size_written
4526
.nodotdot:
4527
        test    byte [esi], 10h
4528
        jz      .nofolder
4529
if lang eq ru
4530
        mov     al, 'а'
4531
        stosw
4532
        mov     al, 'к'
4533
        stosw
4534
        mov     al, 'п'
4535
        stosw
4536
        mov     al, 'а'
4537
        stosw
4538
        mov     al, 'П'
4539
        stosw
4540
        sub     ecx, 5
4541
else
4542
        mov     al, 'r'
4543
        stosw
4544
        mov     al, 'e'
4545
        stosw
4546
        mov     al, 'd'
4547
        stosw
4548
        mov     al, 'l'
4549
        stosw
4550
        mov     al, 'o'
4551
        stosw
4552
        mov     al, 'F'
4553
        stosw
4554
        sub     ecx, 6
4555
end if
4556
        jmp     .size_written
4557
.nofolder:
4558
        mov     eax, [esi+32]
4559
        mov     edx, [esi+36]
4560
        test    edx, edx
4561
        jz      .less_4G
4562
        cmp     edx, 10000/4*1024
4563
        jb      .giga
4564
        mov     al, 'T'
4565
        shr     edx, 10
4566
        jmp     .write_letter
4567
.giga:
4568
        mov     al, 'G'
4569
        shl     edx, 2
4570
        jmp     .write_letter
4571
.less_4G:
4572
        mov     edx, eax
4573
        cmp     eax, 1000000
4574
        jb      .byte
4575
        cmp     eax, 10000*1024
4576
        jb      .kilo
4577
        mov     al, 'M'
4578
        shr     edx, 20
4579
        jmp     .write_letter
4580
.kilo:
4581
        mov     al, 'K'
4582
        shr     edx, 10
4583
.write_letter:
4584
        mov     ah, bh
4585
        stosw
4586
        mov     al, ' '
4587
        stosw
4588
        dec     ecx
4589
        dec     ecx
4590
.byte:
4591
        xchg    eax, edx
4592
        xor     edx, edx
4593
        div     [_10d]
4594
        xchg    eax, edx
4595
        add     al, '0'
4596
        mov     ah, bh
4597
        stosw
4598
        dec     ecx
4599
        test    edx, edx
4600
        jnz     .byte
4601
.size_written:
4602
        mov     eax, ebx
4603
        test    ecx, ecx
4604
        jle     @f
4605
        mov     al, ' '
4606
        rep     stosw
4607
@@:
4608
        mov     byte [edi+1], ah
4609
        pop     edi
4610
        add     edi, [cur_width]
4611
        add     edi, [cur_width]
4612
        inc     [last_column_index]
4613
        pop     ecx
4614
        dec     ecx
4615
        jnz     .l
4616
.ret:
4617
        pop     [last_column_index]
4618
        cld
4619
        ret
4620
 
4621
draw_date_column:
4622
        mov     ecx, [column_height]
4623
        dec     ecx
4624
        push    [last_column_index]
4625
.l:
4626
        mov     edx, [ebp + panel1_numfiles - panel1_data]
4627
        cmp     [last_column_index], edx
4628
        jae     .ret
4629
        push    ecx
4630
        push    edi
4631
        mov     ecx, [last_column_index]
4632
        mov     esi, [ebp + panel1_files - panel1_data]
4633
        mov     esi, [esi+ecx*4]
4634
        call    get_file_color
4635
        mov     bh, ah
4636
        mov     byte [edi-1], bh
4637
        mov     al, [esi+28]
4638
        aam
4639
        add     eax, '00'
4640
        push    eax
4641
        mov     al, ah
4642
        mov     ah, bh
4643
        stosw
4644
        pop     eax
4645
        mov     ah, bh
4646
        stosw
4647
        mov     al, '.'
4648
        stosw
4649
        mov     al, [esi+29]
4650
        aam
4651
        add     eax, '00'
4652
        push    eax
4653
        mov     al, ah
4654
        mov     ah, bh
4655
        stosw
4656
        pop     eax
4657
        mov     ah, bh
4658
        stosw
4659
        mov     al, '.'
4660
        stosw
4661
        movzx   eax, word [esi+30]
4662
        xor     edx, edx
4663
        div     [_10d]
4664
        xchg    eax, edx
4665
        add     al, '0'
4666
        mov     ah, bh
4667
        mov     [edi+2], ax
4668
        xchg    eax, edx
4669
        xor     edx, edx
4670
        div     [_10d]
4671
        xchg    eax, edx
4672
        add     al, '0'
4673
        mov     ah, bh
4674
        stosw
4675
        pop     edi
4676
        add     edi, [cur_width]
4677
        add     edi, [cur_width]
4678
        inc     [last_column_index]
4679
        pop     ecx
4680
        dec     ecx
4681
        jnz     .l
4682
.ret:
4683
        pop     [last_column_index]
4684
        cld
4685
        ret
4686
 
4687
draw_time_column:
4688
        mov     ecx, [column_height]
4689
        dec     ecx
4690
        push    [last_column_index]
4691
.l:
4692
        mov     edx, [ebp + panel1_numfiles - panel1_data]
4693
        cmp     [last_column_index], edx
4694
        jae     .ret
4695
        push    ecx
4696
        push    edi
4697
        mov     ecx, [last_column_index]
4698
        mov     esi, [ebp + panel1_files - panel1_data]
4699
        mov     esi, [esi+ecx*4]
4700
        call    get_file_color
4701
        mov     bh, ah
4702
        mov     byte [edi-1], bh
4703
        mov     al, [esi+26]
4704
        aam
4705
        add     eax, '00'
4706
        push    eax
4707
        mov     al, ah
4708
        mov     ah, bh
4709
        stosw
4710
        pop     eax
4711
        mov     ah, bh
4712
        stosw
4713
        mov     al, ':'
4714
        stosw
4715
        mov     al, [esi+25]
4716
        aam
4717
        add     eax, '00'
4718
        push    eax
4719
        mov     al, ah
4720
        mov     ah, bh
4721
        stosw
4722
        pop     eax
4723
        mov     ah, bh
4724
        stosw
4725
        pop     edi
4726
        add     edi, [cur_width]
4727
        add     edi, [cur_width]
4728
        inc     [last_column_index]
4729
        pop     ecx
4730
        dec     ecx
4731
        jnz     .l
4732
.ret:
4733
        pop     [last_column_index]
4734
        cld
4735
        ret
4736
 
180 heavyiron 4737
;insert_last_dot:
4738
;        push    eax esi
4739
;        mov     ah, 0
4740
;.loop:
4741
;        lodsb
4742
;        test    al, al
4743
;        jz      .done
4744
;        cmp     al, '.'
4745
;        jnz     .loop
4746
;        mov     ah, 1
4747
;        jmp     .loop
4748
;.done:
4749
;        test    ah, ah
4750
;        jnz     @f
4751
;        mov     byte [esi-1], '.'
4752
;        mov     byte [esi], 0
4753
;@@:
4754
;        pop     esi eax
4755
;        ret
4756
 
4757
;delete_last_dot:
4758
;        push    esi
4759
;@@:
4760
;        cmp     byte [esi], 0
4761
;        jz      @f
4762
;        inc     esi
4763
;        jmp     @b
4764
;@@:
4765
;        cmp     byte [esi-1], '.'
4766
;        jnz     @f
4767
;        mov     byte [esi-1], 0
4768
;@@:     pop     esi
4769
;        ret
4770
 
4771
read_folder:
4772
        mov     eax, [ebp + panel1_nfa - panel1_data]
4773
        mov     [dirinfo.size], eax
4774
        shl     eax, 2
4775
        add     eax, [ebp + panel1_files - panel1_data]
4776
        mov     [dirinfo.dirdata], eax
4777
        lea     eax, [ebp + panel1_dir - panel1_data]
4778
        mov     [dirinfo.name], eax
474 diamond 4779
        xor     eax, eax
4780
        mov     [ebp + panel1_total_num - panel1_data], eax
4781
        mov     dword [ebp + panel1_total_size - panel1_data], eax
4782
        mov     dword [ebp + panel1_total_size+4 - panel1_data], eax
4783
        mov     [ebp + panel1_selected_num - panel1_data], eax
4784
        mov     dword [ebp + panel1_selected_size - panel1_data], eax
4785
        mov     dword [ebp + panel1_selected_size+4 - panel1_data], eax
314 diamond 4786
.retry:
589 diamond 4787
        mov     eax, [ebp + panel1_hPlugin - panel1_data]
4788
        test    eax, eax
4789
        jz      .native
4790
        mov     ecx, [dirinfo.size]
4791
        test    [ebp + panel1_plugin_flags - panel1_data], 1
4792
        jz      @f
4793
        dec     ecx     ; reserve one entry for '..'
4794
@@:
4795
        push    ebp
4796
        push    [dirinfo.dirdata]
4797
        push    ecx
4798
        push    0
4799
        push    [ebp + panel1_hFile - panel1_data]
4800
        call    [eax + PluginInfo.ReadFolder]
4801
        pop     ebp
4802
        mov     ebx, [dirinfo.dirdata]
4803
        mov     ebx, [ebx+4]
4804
        jmp     .read
4805
.native:
180 heavyiron 4806
        push    70
4807
        pop     eax
4808
        mov     ebx, dirinfo
517 diamond 4809
        int     40h
589 diamond 4810
.read:
180 heavyiron 4811
        test    eax, eax
4812
        jz      .ok
4813
        cmp     eax, 6
4814
        jz      .ok
314 diamond 4815
; Failed to read folder, notify user
4816
        cmp     [bSilentFolderMode], 0
4817
        jnz     .dont_notify
474 diamond 4818
        push    dword aContinue
4819
        push    dword aRetry
314 diamond 4820
        mov     edx, esp
4821
        call    get_error_msg
4822
        push    [dirinfo.name]
474 diamond 4823
        push    dword aCannotReadFolder
314 diamond 4824
        push    eax
4825
        mov     eax, esp
4826
        push    edx
4827
        push    2
4828
        push    eax
4829
        push    3
4830
        call    SayErr
4831
        add     esp, 5*4
4832
        test    eax, eax
4833
        jz      .retry
4834
.dont_notify:
589 diamond 4835
; If not on plugin panel, try to return to previous directory
4836
        cmp     [ebp + panel1_hPlugin - panel1_data], 0
4837
        jnz     @f
314 diamond 4838
        mov     esi, prev_dir
4839
        cmp     byte [esi], 0
4840
        jz      @f
4841
        lea     edi, [ebp + panel1_dir - panel1_data]
4842
        mov     ecx, 1024/4
4843
        rep     movsd
4844
        mov     byte [prev_dir], 0
4845
        ret
4846
@@:
4847
        mov     [bSilentFolderMode], 1  ; enter silent mode
589 diamond 4848
; Try to read parent folder
314 diamond 4849
        mov     esi, [dirinfo.name]
4850
        xor     edx, edx
4851
.up1:
4852
        lodsb
4853
        test    al, al
4854
        jz      .up1done
4855
        cmp     al, '/'
4856
        jnz     .up1
4857
        inc     edx
4858
        lea     edi, [esi-1]
4859
        jmp     .up1
4860
.up1done:
589 diamond 4861
        cmp     [ebp + panel1_hPlugin - panel1_data], 0
4862
        jz      .4
4863
        cmp     edx, 1
4864
        ja      .up
4865
; чтение с панели плагина обломалось по полной
4866
; при этом мы уже в корне
4867
; делаем вид, что функция чтения вернула 0 элементов
4868
; (если нужен вход "..", он будет добавлен автоматически)
4869
        xor     ebx, ebx        ; 0 items read
4870
        mov     eax, [dirinfo.dirdata]
4871
        mov     [eax+8], ebx    ; 0 items total
4872
        jmp     .ok
4873
.4:
314 diamond 4874
        cmp     edx, 2
4875
        jbe     .noup
589 diamond 4876
.up:
314 diamond 4877
        stosb
4878
        jmp     read_folder
4879
.noup:
589 diamond 4880
; There is no parent folder, and we are not on plugin panel
4881
; Try to read ramdisk
314 diamond 4882
        mov     esi, [dirinfo.name]
4883
        mov     edi, esi
4884
        lodsd
4885
        or      eax, 0x00202000
4886
        cmp     eax, '/rd/'
4887
        jnz     @f
4888
        lodsw
4889
        cmp     ax, '1'
4890
        jz      .nosetrd
4891
@@:
4892
        mov     eax, '/rd/'
4893
        stosd
4894
        mov     ax, '1'
4895
        stosw
4896
        jmp     read_folder
4897
.nosetrd:
4898
; Даже рамдиск не прочитался. Значит, не судьба...
4899
        and     dword [ebp + panel1_numfiles - panel1_data], 0
180 heavyiron 4900
        and     dword [ebp + panel1_index - panel1_data], 0
4901
        and     dword [ebp + panel1_start - panel1_data], 0
314 diamond 4902
        mov     [bSilentFolderMode], 0  ; leave silent mode
180 heavyiron 4903
        ret
4904
.ok:
4905
        mov     eax, [dirinfo.dirdata]
4906
        cmp     [eax+8], ebx
4907
        jz      .readdone
474 diamond 4908
        push    dword [eax+8]
4909
        mov     ecx, [ebp + panel1_files - panel1_data]
4910
        call    pgfree
4911
        pop     ecx
4912
        add     ecx, 0xF
4913
        and     ecx, not 0xF
4914
        push    ecx
4915
        imul    ecx, 4+304
4916
        add     ecx, 32
4917
        call    xpgalloc
180 heavyiron 4918
        test    eax, eax
4919
        jnz     .succ1
4920
        pop     eax
4921
        jmp     .readdone
4922
.succ1:
4923
        mov     [ebp + panel1_files - panel1_data], eax
4924
        pop     [ebp + panel1_nfa - panel1_data]
321 diamond 4925
        mov     [prev_dir], 0
180 heavyiron 4926
        jmp     read_folder
4927
.readdone:
589 diamond 4928
        xor     edx, edx
4929
        mov     [ebp + panel1_start - panel1_data], edx
4930
        mov     [ebp + panel1_index - panel1_data], edx
4931
        mov     [ebp + panel1_start - panel1_data], edx
180 heavyiron 4932
        mov     edi, [ebp + panel1_files - panel1_data]
4933
        mov     eax, [ebp + panel1_nfa - panel1_data]
321 diamond 4934
        lea     eax, [edi + eax*4 + 32]
4935
        mov     ecx, [eax-32+4]
283 diamond 4936
        test    ecx, ecx
4937
        jz      .loopdone
180 heavyiron 4938
; Игнорируем специальные входы, соответствующие папке '.' и метке тома
4939
.ptrinit:
321 diamond 4940
        cmp     word [eax+40], '.'
180 heavyiron 4941
        jz      .loopcont
321 diamond 4942
        test    byte [eax], 8
180 heavyiron 4943
        jnz     .loopcont
474 diamond 4944
        mov     byte [eax+303], 0
321 diamond 4945
        test    edx, edx
4946
        jnz     .nodotdot
4947
        cmp     word [eax+40], '..'
4948
        jnz     .nodotdot
4949
        cmp     byte [eax+42], 0
4950
        jnz     .nodotdot
4951
        mov     edx, eax
4952
        push    edi
4953
@@:
4954
        cmp     edi, [ebp + panel1_files - panel1_data]
4955
        jbe     @f
4956
        push    dword [edi-4]
4957
        pop     dword [edi]
4958
        sub     edi, 4
4959
        jmp     @b
4960
@@:
180 heavyiron 4961
        stosd
321 diamond 4962
        pop     edi
4963
        scasd
4964
        jmp     .dotdot
4965
.nodotdot:
4966
        stosd
474 diamond 4967
        xor     ebx, ebx
4968
        test    byte [eax], 10h
4969
        setz    bl
4970
        add     [ebp + panel1_total_num - panel1_data], ebx
4971
        mov     ebx, dword [eax+32]
4972
        add     dword [ebp + panel1_total_size - panel1_data], ebx
4973
        mov     ebx, dword [eax+36]
4974
        adc     dword [ebp + panel1_total_size+4 - panel1_data], ebx
321 diamond 4975
.dotdot:
283 diamond 4976
; подсветка
4977
;        call    insert_last_dot
589 diamond 4978
        call    highlight_init
4979
;        call    delete_last_dot
4980
.loopcont:
4981
        add     eax, 304
4982
        dec     ecx
4983
        jnz     .ptrinit
4984
.loopdone:
4985
        push    edi
4986
        sub     edi, [ebp + panel1_files - panel1_data]
4987
        shr     edi, 2
4988
        mov     [ebp + panel1_numfiles - panel1_data], edi
4989
        pop     edi
4990
        test    edx, edx
4991
        jnz     @f
4992
        test    [ebp + panel1_plugin_flags - panel1_data], 1
4993
        jz      @f
4994
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
4995
        inc     [ebp + panel1_numfiles - panel1_data]
4996
        lea     esi, [edi-4]
4997
        std
4998
        rep     movsd
4999
        cld
5000
        mov     eax, left_dotdot_entry
5001
        cmp     ebp, panel1_data
5002
        jz      .zq
5003
        add     eax, right_dotdot_entry-left_dotdot_entry
5004
.zq:
5005
        stosd
5006
        call    highlight_init
5007
@@:
5008
; Сортировка
5009
sort_files:
5010
        movzx   eax, [ebp + panel1_sortmode - panel1_data]
5011
        mov     ebx, [compare_fns + eax*4]
5012
.mode:
5013
        mov     edx, [ebp + panel1_files - panel1_data]
5014
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
5015
        jecxz   .skip
5016
        mov     eax, [edx]
5017
        cmp     word [eax+40], '..'
5018
        jnz     .nodotdot
5019
        cmp     byte [eax+42], 0
5020
        jnz     .nodotdot
5021
        dec     ecx
5022
        add     edx, 4
5023
.nodotdot:
5024
        call    sort
5025
.skip:
5026
        mov     [bSilentFolderMode], 0  ; leave silent mode
5027
        ret
5028
 
5029
highlight_init:
283 diamond 5030
        pushad
321 diamond 5031
        mov     ebp, eax
283 diamond 5032
        lea     esi, [ebp+40]
5033
        mov     edi, lower_file_name
5034
        mov     edx, edi
474 diamond 5035
        xor     eax, eax
283 diamond 5036
@@:
5037
        lodsb
474 diamond 5038
        mov     al, [tolower_table+eax]
283 diamond 5039
        stosb
5040
        test    al, al
5041
        jnz     @b
5042
        mov     esi, edx
5043
        lea     edx, [edi-1]
5044
        xor     ecx, ecx
5045
.highlight_test_loop:
5046
        mov     ebx, [highlight_groups+ecx*4]
5047
        mov     al, [ebx + highlight.IncludeAttributes]
5048
        mov     ah, [ebp]
5049
        and     ah, al
5050
        cmp     ah, al
5051
        jnz     .highlight_test_failed
5052
        lea     edi, [ebx + highlight.Mask]
5053
        call    match_mask_rev_lowercase
5054
        jc      .highlight_test_failed
5055
        mov     ah, [ebx + highlight.NormalColor]
5056
        test    ah, ah
5057
        jnz     @f
5058
        mov     ah, [panel_normal_color]
5059
@@:
474 diamond 5060
        mov     [ebp+4], ah
283 diamond 5061
        mov     ah, [ebx + highlight.CursorColor]
5062
        test    ah, ah
5063
        jnz     @f
5064
        mov     ah, [panel_cursor_color]
5065
@@:
474 diamond 5066
        mov     [ebp+5], ah
5067
        mov     ah, [ebx + highlight.SelectedColor]
5068
        test    ah, ah
5069
        jnz     @f
5070
        mov     ah, [panel_selected_color]
5071
@@:
283 diamond 5072
        mov     [ebp+6], ah
474 diamond 5073
        mov     ah, [ebx + highlight.SelectedCursorColor]
5074
        test    ah, ah
5075
        jnz     @f
5076
        mov     ah, [panel_selected_cursor_color]
5077
@@:
5078
        mov     [ebp+7], ah
283 diamond 5079
        jmp     .doname
5080
.highlight_test_failed:
5081
        inc     ecx
5082
        cmp     ecx, [highlight_num_groups]
5083
        jb      .highlight_test_loop
5084
.nohighlight:
5085
        mov     ah, [panel_normal_color]
474 diamond 5086
        mov     [ebp+4], ah
5087
        mov     ah, [panel_cursor_color]
283 diamond 5088
        mov     [ebp+5], ah
474 diamond 5089
        mov     ah, [panel_selected_color]
283 diamond 5090
        mov     [ebp+6], ah
474 diamond 5091
        mov     ah, [panel_selected_cursor_color]
5092
        mov     [ebp+7], ah
283 diamond 5093
.doname:
5094
        popad
180 heavyiron 5095
        ret
5096
 
5097
compare_name:
5098
        test    byte [esi], 10h
5099
        jnz     .1dir
5100
        test    byte [edi], 10h
5101
        jnz     .greater
5102
.eq1:
5103
        add     esi, 40
5104
        add     edi, 40
5105
        jmp     strcmpi
5106
.greater:
5107
        test    esi, esi
5108
        ret
5109
.1dir:
5110
        test    byte [edi], 10h
5111
        jnz     .eq1
5112
.less:
5113
        xor     edi, edi
5114
        stc
5115
        ret
5116
 
5117
compare_name_rev:
5118
        test    byte [esi], 10h
5119
        jnz     .1dir
5120
        test    byte [edi], 10h
5121
        jnz     .greater
5122
.eq1:
5123
        add     esi, 40
5124
        add     edi, 40
5125
        xchg    esi, edi
5126
        jmp     strcmpi
5127
.greater:
5128
        test    esi, esi
5129
        ret
5130
.1dir:
5131
        test    byte [edi], 10h
5132
        jnz     .eq1
5133
.less:
5134
        xor     edi, edi
5135
        stc
5136
        ret
5137
 
5138
strcmpi:
5139
        push    eax
5140
@@:
5141
        lodsb
5142
        call    match_symbol
5143
        jnz     .ret
5144
        inc     edi
5145
        test    al, al
5146
        jnz     @b
5147
.ret:
5148
        pop     eax
5149
        ret
5150
 
5151
compare_ext:
5152
        test    byte [esi], 10h
5153
        jnz     .1dir
5154
        test    byte [edi], 10h
5155
        jnz     .greater
5156
.eq1:
5157
        add     esi, 40
5158
        add     edi, 40
5159
        push    esi edi
5160
        call    seek_ext
5161
        xchg    esi, edi
5162
        call    seek_ext
5163
        xchg    esi, edi
5164
        call    strcmpi
5165
        jnz     .ret
5166
        pop     edi esi
5167
        jmp     strcmpi
5168
.ret:
5169
        pop     edi esi
5170
        ret
5171
.greater:
5172
        test    esi, esi
5173
        ret
5174
.1dir:
5175
        test    byte [edi], 10h
5176
        jnz     .eq1
5177
.less:
5178
        xor     edi, edi
5179
        stc
5180
        ret
5181
 
5182
compare_ext_rev:
5183
        test    byte [esi], 10h
5184
        jnz     .1dir
5185
        test    byte [edi], 10h
5186
        jnz     .greater
5187
.eq1:
5188
        add     esi, 40
5189
        add     edi, 40
5190
        push    esi edi
5191
        call    seek_ext
5192
        xchg    esi, edi
5193
        call    seek_ext
5194
        call    strcmpi
5195
        jnz     .ret
5196
        pop     edi esi
5197
        xchg    esi, edi
5198
        jmp     strcmpi
5199
.ret:
5200
        pop     edi esi
5201
        ret
5202
.greater:
5203
        test    esi, esi
5204
        ret
5205
.1dir:
5206
        test    byte [edi], 10h
5207
        jnz     .eq1
5208
.less:
5209
        xor     edi, edi
5210
        stc
5211
        ret
5212
 
5213
seek_ext:
5214
        push    eax
5215
        xor     eax, eax
5216
.l:
5217
        inc     esi
5218
        cmp     byte [esi-1], '.'
5219
        jnz     @f
5220
        mov     eax, esi
5221
@@:
5222
        cmp     byte [esi-1], 0
5223
        jnz     .l
5224
        test    eax, eax
5225
        jnz     @f
5226
        lea     eax, [esi-1]
5227
@@:
5228
        mov     esi, eax
5229
        pop     eax
5230
        ret
5231
 
5232
compare_modified:
5233
        test    byte [esi], 10h
5234
        jnz     .1dir
5235
        test    byte [edi], 10h
5236
        jnz     .greater
5237
.eq1:
5238
        push    edi
5239
        mov     edi, [edi+28]
5240
        cmp     edi, [esi+28]
5241
        pop     edi
5242
        jnz     @f
5243
        push    edi
5244
        mov     edi, [edi+24]
5245
        cmp     edi, [esi+24]
5246
        pop     edi
5247
        jnz     @f
5248
        add     esi, 40
5249
        add     edi, 40
5250
        jmp     strcmpi
5251
@@:
5252
        ret
5253
.greater:
5254
        test    esi, esi
5255
        ret
5256
.1dir:
5257
        test    byte [edi], 10h
5258
        jnz     .eq1
5259
.less:
5260
        xor     edi, edi
5261
        stc
5262
        ret
5263
 
5264
compare_modified_rev:
5265
        test    byte [esi], 10h
5266
        jnz     .1dir
5267
        test    byte [edi], 10h
5268
        jnz     .greater
5269
.eq1:
5270
        push    esi
5271
        mov     esi, [esi+28]
5272
        cmp     esi, [edi+28]
5273
        pop     esi
5274
        jnz     @f
5275
        push    esi
5276
        mov     esi, [esi+24]
5277
        cmp     esi, [edi+24]
5278
        pop     esi
5279
        jnz     @f
5280
        add     esi, 40
5281
        add     edi, 40
5282
        xchg    esi, edi
5283
        jmp     strcmpi
5284
@@:
5285
        ret
5286
.greater:
5287
        test    esi, esi
5288
        ret
5289
.1dir:
5290
        test    byte [edi], 10h
5291
        jnz     .eq1
5292
.less:
5293
        xor     edi, edi
5294
        stc
5295
        ret
5296
 
5297
compare_size:
5298
        test    byte [esi], 10h
5299
        jnz     .1dir
5300
        test    byte [edi], 10h
5301
        jnz     .greater
5302
.eq1:
5303
        push    edi
5304
        mov     edi, [edi+36]
5305
        cmp     edi, [esi+36]
5306
        pop     edi
5307
        jnz     @f
5308
        push    edi
5309
        mov     edi, [edi+32]
5310
        cmp     edi, [esi+32]
5311
        pop     edi
5312
        jnz     @f
5313
        add     esi, 40
5314
        add     edi, 40
5315
        jmp     strcmpi
5316
@@:
5317
        ret
5318
.greater:
5319
        test    esi, esi
5320
        ret
5321
.1dir:
5322
        test    byte [edi], 10h
5323
        jnz     .eq1
5324
.less:
5325
        xor     edi, edi
5326
        stc
5327
        ret
5328
 
5329
compare_size_rev:
5330
        test    byte [esi], 10h
5331
        jnz     .1dir
5332
        test    byte [edi], 10h
5333
        jnz     .greater
5334
.eq1:
5335
        push    esi
5336
        mov     esi, [esi+36]
5337
        cmp     esi, [edi+36]
5338
        pop     esi
5339
        jnz     @f
5340
        push    esi
5341
        mov     esi, [esi+32]
5342
        cmp     esi, [edi+32]
5343
        pop     esi
5344
        jnz     @f
5345
        add     esi, 40
5346
        add     edi, 40
5347
        xchg    esi, edi
5348
        jmp     strcmpi
5349
@@:
5350
        ret
5351
.greater:
5352
        test    esi, esi
5353
        ret
5354
.1dir:
5355
        test    byte [edi], 10h
5356
        jnz     .eq1
5357
.less:
5358
        xor     edi, edi
5359
        stc
5360
        ret
5361
 
5362
compare_unordered:
5363
        cmp     esi, edi
5364
        ret
5365
compare_unordered_rev:
5366
        cmp     edi, esi
5367
        ret
5368
 
5369
compare_created:
5370
        test    byte [esi], 10h
5371
        jnz     .1dir
5372
        test    byte [edi], 10h
5373
        jnz     .greater
5374
.eq1:
5375
        push    edi
5376
        mov     edi, [edi+12]
5377
        cmp     edi, [esi+12]
5378
        pop     edi
5379
        jnz     @f
5380
        push    edi
5381
        mov     edi, [edi+8]
5382
        cmp     edi, [esi+8]
5383
        pop     edi
5384
        jnz     @f
5385
        add     esi, 40
5386
        add     edi, 40
5387
        jmp     strcmpi
5388
@@:
5389
        ret
5390
.greater:
5391
        test    esi, esi
5392
        ret
5393
.1dir:
5394
        test    byte [edi], 10h
5395
        jnz     .eq1
5396
.less:
5397
        xor     edi, edi
5398
        stc
5399
        ret
5400
 
5401
compare_created_rev:
5402
        test    byte [esi], 10h
5403
        jnz     .1dir
5404
        test    byte [edi], 10h
5405
        jnz     .greater
5406
.eq1:
5407
        push    esi
5408
        mov     esi, [esi+12]
5409
        cmp     esi, [edi+12]
5410
        pop     esi
5411
        jnz     @f
5412
        push    esi
5413
        mov     esi, [esi+8]
5414
        cmp     esi, [edi+8]
5415
        pop     esi
5416
        jnz     @f
5417
        add     esi, 40
5418
        add     edi, 40
5419
        xchg    esi, edi
5420
        jmp     strcmpi
5421
@@:
5422
        ret
5423
.greater:
5424
        test    esi, esi
5425
        ret
5426
.1dir:
5427
        test    byte [edi], 10h
5428
        jnz     .eq1
5429
.less:
5430
        xor     edi, edi
5431
        stc
5432
        ret
5433
 
5434
compare_accessed:
5435
        test    byte [esi], 10h
5436
        jnz     .1dir
5437
        test    byte [edi], 10h
5438
        jnz     .greater
5439
.eq1:
5440
        push    edi
5441
        mov     edi, [edi+20]
5442
        cmp     edi, [esi+20]
5443
        pop     edi
5444
        jnz     @f
5445
        push    edi
5446
        mov     edi, [edi+16]
5447
        cmp     edi, [esi+16]
5448
        pop     edi
5449
        jnz     @f
5450
        add     esi, 40
5451
        add     edi, 40
5452
        jmp     strcmpi
5453
@@:
5454
        ret
5455
.greater:
5456
        test    esi, esi
5457
        ret
5458
.1dir:
5459
        test    byte [edi], 10h
5460
        jnz     .eq1
5461
.less:
5462
        xor     edi, edi
5463
        stc
5464
        ret
5465
 
5466
compare_accessed_rev:
5467
        test    byte [esi], 10h
5468
        jnz     .1dir
5469
        test    byte [edi], 10h
5470
        jnz     .greater
5471
.eq1:
5472
        push    esi
5473
        mov     esi, [esi+20]
5474
        cmp     esi, [edi+20]
5475
        pop     esi
5476
        jnz     @f
5477
        push    esi
5478
        mov     esi, [esi+16]
5479
        cmp     esi, [edi+16]
5480
        pop     esi
5481
        jnz     @f
5482
        add     esi, 40
5483
        add     edi, 40
5484
        xchg    esi, edi
5485
        jmp     strcmpi
5486
@@:
5487
        ret
5488
.greater:
5489
        test    esi, esi
5490
        ret
5491
.1dir:
5492
        test    byte [edi], 10h
5493
        jnz     .eq1
5494
.less:
5495
        xor     edi, edi
5496
        stc
5497
        ret
5498
 
589 diamond 5499
ReadFolder_default:
5500
        mov     eax, 2
5501
        ret     10h
5502
 
283 diamond 5503
if 0
589 diamond 5504
; Following subroutines work, but are slow
180 heavyiron 5505
match_mask:
5506
; in: esi->name, edi->mask
5507
; out: CF clear <=> match
5508
        pusha
5509
        xchg    esi, edi
5510
.main_cycle:
5511
        push    esi
5512
@@:
5513
        lodsb
5514
        test    al, al
5515
        jz      @f
5516
        cmp     al, ','
5517
        jz      @f
5518
        cmp     al, '|'
5519
        jnz     @b
5520
@@:
5521
        mov     [esi-1], byte 0
5522
        xchg    esi, [esp]
5523
        call    match_single_mask
5524
        pop     esi
5525
        mov     [esi-1], al
5526
        jnc     .found
5527
        cmp     al, ','
5528
        jz      .main_cycle
5529
.done_fail:
5530
        stc
5531
        popa
5532
        ret
5533
.found:
5534
        test    al, al
5535
        jz      .done_succ
5536
        cmp     al, '|'
5537
        jz      .test_exclude
5538
        lodsb
5539
        jmp     .found
5540
.done_succ:
5541
        clc
5542
        popa
5543
        ret
5544
.test_exclude:
5545
        push    esi
5546
@@:
5547
        lodsb
5548
        test    al, al
5549
        jz      @f
5550
        cmp     al, ','
5551
        jnz     @b
5552
@@:
5553
        mov     byte [esi-1], 0
5554
        xchg    esi, [esp]
5555
        call    match_single_mask
5556
        pop     esi
5557
        mov     [esi-1], al
5558
        jnc     .done_fail
5559
        test    al, al
5560
        jz      .done_succ
5561
        jmp     .test_exclude
5562
 
5563
match_single_mask:
5564
; in: esi->mask, edi->name
5565
; out: CF clear <=> match
5566
        pusha
5567
.mask_symbol:
5568
        lodsb
5569
        test    al, al
5570
        jz      .mask_done
5571
        cmp     al, '*'
5572
        jz      .asterisk
5573
        cmp     al, '?'
5574
        jz      .quest
5575
        cmp     al, '['
5576
        jz      .list
5577
        call    match_symbol
5578
        jnz     .done_fail
5579
        inc     edi
5580
        jmp     .mask_symbol
5581
.done_fail:
5582
        stc
5583
        popa
5584
        ret
5585
.mask_done:
5586
        scasb
5587
        jnz     .done_fail
5588
.done_succ:
5589
        clc
5590
        popa
5591
        ret
5592
.quest:
5593
        mov     al, 0
5594
        scasb
5595
        jz      .done_fail
5596
        jmp     .mask_symbol
5597
.list:
5598
        lodsb
5599
        cmp     al, ']'
5600
        jz      .done_fail
5601
        cmp     byte [esi+1], '-'
5602
        jz      .range
5603
        call    match_symbol
5604
        jnz     .list
5605
.listok:
5606
        inc     edi
5607
@@:
5608
        lodsb
5609
        cmp     al, ']'
5610
        jnz     @b
5611
        jmp     .mask_symbol
5612
.range:
5613
        call    match_symbol
5614
        ja      @f
5615
        mov     al, [esi+2]
5616
        call    match_symbol
5617
        jae     .listok
5618
@@:
5619
        inc     esi
5620
        jmp     .list
5621
.asterisk:
283 diamond 5622
        cmp     byte [esi], 0
5623
        jz      .done_succ
5624
        cmp     byte [esi], '?'
5625
        jnz     @f
5626
        mov     al, 0
5627
        scasb
5628
        jz      .done_fail
5629
        inc     esi
5630
        jmp     .asterisk
5631
@@:
5632
        cmp     byte [esi], '['
5633
        jz      .asterisk_common
5634
; the mask is ...*...
5635
.asterisk_normal:
5636
        mov     al, [esi]
5637
@@:
5638
        cmp     byte [edi], 0
5639
        jz      .done_fail
5640
        call    match_symbol
5641
        jz      @f
5642
        inc     edi
5643
        jmp     @b
5644
@@:
5645
        inc     edi
5646
        inc     esi
5647
        call    match_single_mask
5648
        jnc     .done_succ
5649
        dec     esi
5650
        jmp     .asterisk_normal
5651
.asterisk_common:
180 heavyiron 5652
        push    edi
5653
@@:
5654
        call    match_single_mask
5655
        jnc     @f
5656
        mov     al, 0
5657
        scasb
5658
        jnz     @b
5659
        pop     edi
5660
        jmp     .done_fail
5661
@@:
5662
        pop     edi
5663
        jmp     .done_succ
5664
 
283 diamond 5665
match_mask_rev:
5666
; in: esi->name, edx->end of name, edi->mask
5667
; out: CF clear <=> match
5668
        pusha
5669
        xchg    esi, edx
5670
        xchg    esi, edi
5671
.main_cycle:
5672
        mov     ecx, esi
5673
@@:
5674
        lodsb
5675
        test    al, al
5676
        jz      @f
5677
        cmp     al, ','
5678
        jz      @f
5679
        cmp     al, '|'
5680
        jnz     @b
5681
@@:
5682
        dec     esi
5683
        mov     [esi], byte 0
5684
        call    match_single_mask_rev2
5685
        mov     [esi], al
5686
        inc     esi
5687
        jnc     .found
5688
        cmp     al, ','
5689
        jz      .main_cycle
5690
.done_fail:
5691
        stc
5692
        popa
5693
        ret
5694
.found:
5695
        test    al, al
5696
        jz      .done_succ
5697
        cmp     al, '|'
5698
        jz      .test_exclude
5699
        lodsb
5700
        jmp     .found
5701
.done_succ:
5702
        clc
5703
        popa
5704
        ret
5705
.test_exclude:
5706
        mov     ecx, esi
5707
@@:
5708
        lodsb
5709
        test    al, al
5710
        jz      @f
5711
        cmp     al, ','
5712
        jnz     @b
5713
@@:
5714
        dec     esi
5715
        mov     byte [esi], 0
5716
        call    match_single_mask_rev2
5717
        mov     [esi], al
5718
        inc     esi
5719
        jnc     .done_fail
5720
        test    al, al
5721
        jz      .done_succ
5722
        jmp     .test_exclude
5723
 
5724
match_single_mask_rev2:
5725
        pusha
5726
        jmp     match_single_mask_rev.mask_symbol
5727
match_single_mask_rev:
5728
; in: esi->mask, edi->end of name, edx->start of name
5729
; out: CF clear <=> match
5730
        pusha
5731
        mov     ecx, esi
5732
@@:
5733
        lodsb
5734
        test    al, al
5735
        jnz     @b
5736
        dec     esi
5737
; esi->end of mask, ecx->start of mask
5738
.mask_symbol:
5739
        dec     esi
5740
        cmp     esi, ecx
5741
        jb      .mask_done
5742
        mov     al, [esi]
5743
        cmp     al, '*'
5744
        jz      .asterisk
5745
        cmp     al, '?'
5746
        jz      .quest
5747
        cmp     al, ']'
5748
        jz      .list
5749
        dec     edi
5750
        cmp     edi, edx
5751
        jb      .done_fail
5752
        call    match_symbol
5753
        jz      .mask_symbol
5754
.done_fail:
5755
        stc
5756
        popa
5757
        ret
5758
.mask_done:
5759
        cmp     edi, edx
5760
        jnz     .done_fail
5761
.done_succ:
5762
        clc
5763
        popa
5764
        ret
5765
.quest:
5766
        dec     edi
5767
        cmp     edi, edx
5768
        jb      .done_fail
5769
        jmp     .mask_symbol
5770
.list:
5771
        dec     edi
5772
        cmp     edi, edx
5773
        jb      .done_fail
5774
.list_check:
5775
        dec     esi
5776
        cmp     esi, ecx
5777
        jbe     .done_fail
5778
        mov     al, [esi]
5779
        cmp     al, '['
5780
        jz      .done_fail
5781
        cmp     byte [esi-1], '-'
5782
        jz      .range
5783
        call    match_symbol
5784
        jnz     .list_check
5785
.listok:
5786
@@:
5787
        dec     esi
5788
        cmp     esi, ecx
5789
        jb      .done_fail
5790
        cmp     byte [esi], '['
5791
        jnz     @b
5792
        jmp     .mask_symbol
5793
.range:
5794
        call    match_symbol
5795
        jb      @f
5796
        mov     al, [esi-2]
5797
        call    match_symbol
5798
        jbe     .listok
5799
@@:
5800
        dec     esi
5801
        dec     esi
5802
        jmp     .list_check
5803
.asterisk:
5804
        cmp     esi, ecx
5805
        jz      .done_succ
5806
        cmp     byte [esi-1], '?'
5807
        jnz     @f
5808
        cmp     edi, edx
5809
        jz      .done_fail
5810
        dec     esi
5811
        jmp     .asterisk
5812
@@:
5813
        cmp     byte [esi-1], ']'
5814
        jz      .asterisk_common
5815
; the mask is ...*...
5816
.asterisk_normal:
5817
        mov     al, [esi-1]
5818
@@:
5819
        cmp     edi, edx
5820
        jz      .done_fail
5821
        call    match_symbol
5822
        jz      @f
5823
        dec     edi
5824
        jmp     @b
5825
@@:
5826
        dec     edi
5827
        dec     esi
5828
        call    match_single_mask_rev2
5829
        jnc     .done_succ
5830
        inc     esi
5831
        jmp     .asterisk_normal
5832
.asterisk_common:
5833
        push    edi
5834
@@:
5835
        call    match_single_mask_rev2
5836
        jnc     @f
5837
        dec     edi
5838
        cmp     edi, edx
5839
        jae     @b
5840
        pop     edi
5841
        jmp     .done_fail
5842
@@:
5843
        pop     edi
5844
        jmp     .done_succ
5845
end if
5846
 
474 diamond 5847
;tolower:
5848
;        push    ecx
5849
;        movzx   ecx, al
5850
;        mov     al, [tolower_table+ecx]
5851
;        pop     ecx
5852
;        ret
180 heavyiron 5853
 
5854
match_symbol:
5855
; in: al,[edi]=symbols
5856
; out: flags as 'cmp al,[edi]'
474 diamond 5857
        push    eax ecx
5858
        movzx   ecx, al
5859
        mov     al, [tolower_table+ecx]
5860
        movzx   ecx, byte [edi]
5861
        cmp     al, [tolower_table+ecx]
5862
        pop     ecx eax
180 heavyiron 5863
        ret
5864
 
283 diamond 5865
match_mask_rev_lowercase:
5866
; in: esi->name, edx->end of name, edi->mask
5867
; out: CF clear <=> match
5868
        pusha
5869
        xchg    esi, edx
5870
        xchg    esi, edi
5871
.main_cycle:
5872
        mov     ecx, esi
5873
@@:
5874
        lodsb
5875
        test    al, al
5876
        jz      @f
5877
        cmp     al, ','
5878
        jz      @f
474 diamond 5879
        cmp     al, ';'
5880
        jz      @f
283 diamond 5881
        cmp     al, '|'
5882
        jnz     @b
5883
@@:
5884
        dec     esi
5885
        mov     [esi], byte 0
5886
        call    match_single_mask_rev_lowercase
5887
        mov     [esi], al
5888
        inc     esi
5889
        jnc     .found
5890
        cmp     al, ','
5891
        jz      .main_cycle
474 diamond 5892
        cmp     al, ';'
5893
        jz      .main_cycle
283 diamond 5894
.done_fail:
5895
        stc
5896
        popa
5897
        ret
5898
.found:
5899
        test    al, al
5900
        jz      .done_succ
5901
        cmp     al, '|'
5902
        jz      .test_exclude
5903
        lodsb
5904
        jmp     .found
5905
.done_succ:
5906
        clc
5907
        popa
5908
        ret
5909
.test_exclude:
5910
        mov     ecx, esi
5911
@@:
5912
        lodsb
5913
        test    al, al
5914
        jz      @f
5915
        cmp     al, ','
474 diamond 5916
        jz      @f
5917
        cmp     al, ';'
283 diamond 5918
        jnz     @b
5919
@@:
5920
        dec     esi
5921
        mov     byte [esi], 0
5922
        call    match_single_mask_rev_lowercase
5923
        mov     [esi], al
5924
        inc     esi
5925
        jnc     .done_fail
5926
        test    al, al
5927
        jz      .done_succ
5928
        jmp     .test_exclude
180 heavyiron 5929
 
283 diamond 5930
match_single_mask_rev_lowercase:
5931
; in: esi->end of mask, ecx->start of mask, edi->end of name, edx->start of name
5932
; out: CF clear <=> match
5933
        push    esi edi eax
5934
.mask_symbol:
5935
        dec     esi
5936
        cmp     esi, ecx
5937
        jb      .mask_done
5938
        mov     al, [esi]
5939
        cmp     al, '*'
5940
        jz      .asterisk
5941
        cmp     al, '?'
5942
        jz      .quest
5943
        cmp     al, ']'
5944
        jz      .list
5945
        dec     edi
5946
        cmp     edi, edx
5947
        jb      .done_fail
5948
        cmp     al, [edi]
5949
        jz      .mask_symbol
5950
.done_fail:
5951
        stc
5952
        pop     eax edi esi
5953
        ret
5954
.mask_done:
5955
        cmp     edi, edx
5956
        jnz     .done_fail
5957
.done_succ:
5958
        clc
5959
        pop     eax edi esi
5960
        ret
5961
.quest:
5962
        dec     edi
5963
        cmp     edi, edx
5964
        jb      .done_fail
5965
        jmp     .mask_symbol
5966
.list:
5967
        dec     edi
5968
        cmp     edi, edx
5969
        jb      .done_fail
5970
.list_check:
5971
        dec     esi
5972
        cmp     esi, ecx
5973
        jbe     .done_fail
5974
        mov     al, [esi]
5975
        cmp     al, '['
5976
        jz      .done_fail
5977
        cmp     byte [esi-1], '-'
5978
        jz      .range
5979
        cmp     al, [edi]
5980
        jnz     .list_check
5981
.listok:
5982
@@:
5983
        dec     esi
5984
        cmp     esi, ecx
5985
        jb      .done_fail
5986
        cmp     byte [esi], '['
5987
        jnz     @b
5988
        jmp     .mask_symbol
5989
.range:
5990
        cmp     al, [edi]
5991
        jb      @f
5992
        mov     al, [esi-2]
5993
        cmp     al, [edi]
5994
        jbe     .listok
5995
@@:
5996
        dec     esi
5997
        dec     esi
5998
        jmp     .list_check
5999
.asterisk:
6000
        cmp     esi, ecx
6001
        jz      .done_succ
6002
        cmp     byte [esi-1], '?'
6003
        jnz     @f
6004
        cmp     edi, edx
6005
        jz      .done_fail
6006
        dec     esi
6007
        jmp     .asterisk
6008
@@:
6009
        cmp     byte [esi-1], ']'
6010
        jz      .asterisk_common
6011
; the mask is ...*...
6012
.asterisk_normal:
6013
        mov     al, [esi-1]
6014
@@:
6015
        cmp     edi, edx
6016
        jz      .done_fail
6017
        cmp     al, [edi]
6018
        jz      @f
6019
        dec     edi
6020
        jmp     @b
6021
@@:
6022
        dec     edi
6023
        dec     esi
6024
        call    match_single_mask_rev_lowercase
6025
        jnc     .done_succ
6026
        inc     esi
6027
        jmp     .asterisk_normal
6028
.asterisk_common:
6029
        push    edi
6030
@@:
6031
        call    match_single_mask_rev_lowercase
6032
        jnc     @f
6033
        dec     edi
6034
        cmp     edi, edx
6035
        jae     @b
6036
        pop     edi
6037
        jmp     .done_fail
6038
@@:
6039
        pop     edi
6040
        jmp     .done_succ
180 heavyiron 6041
 
283 diamond 6042
find_extension:
6043
        lea     esi, [ecx+40]
6044
        push    esi
6045
@@:
6046
        lodsb
6047
        test    al, al
6048
        jnz     @b
6049
@@:
6050
        dec     esi
6051
        cmp     byte [esi], '.'
6052
        jz      .found_ext
6053
        cmp     esi, [esp]
6054
        ja      @b
6055
; empty extension
6056
        pop     esi
6057
        stc
6058
        ret
6059
.found_ext:
6060
        inc     esi
474 diamond 6061
        mov     edi, [associations]
517 diamond 6062
        test    edi, edi
6063
        jz      .notfound
474 diamond 6064
.find_loop:
283 diamond 6065
        push    esi edi
6066
        call    strcmpi
6067
        pop     edi esi
474 diamond 6068
        pushf
6069
@@:
283 diamond 6070
        inc     edi
474 diamond 6071
        cmp     byte [edi-1], 0
6072
        jnz     @b
6073
        popf
6074
        jz      .found
283 diamond 6075
@@:
474 diamond 6076
        inc     edi
6077
        cmp     byte [edi-1], 0
6078
        jnz     @b
6079
        cmp     byte [edi], 0
6080
        jnz     .find_loop
517 diamond 6081
.notfound:
474 diamond 6082
; unknown extension
6083
        stc
6084
.found:
283 diamond 6085
        pop     esi
6086
        ret
6087
 
589 diamond 6088
header  db      'Kolibri Far ',version,0
283 diamond 6089
 
180 heavyiron 6090
nomem_draw      db      'No memory for redraw.',0
6091
.size = $ - nomem_draw
6092
 
6093
def_left_dir    db      '/rd/1',0
6094
def_right_dir   db      '/hd0/1',0
6095
 
314 diamond 6096
bSilentFolderMode db    1
6097
 
180 heavyiron 6098
if lang eq ru
6099
aFolder         db      'Папка'
6100
.size = $-aFolder
6101
aUp             db      'Вверх'
6102
.size = $-aUp
6103
aDrive          db      'Диск',0
6104
aScreens        db      'Экраны',0
6105
else
6106
aFolder         db      'Folder'
6107
.size = $-aFolder
6108
aUp             db      'Up'
6109
.size = $-aUp
6110
aDrive          db      'Drive',0
6111
aScreens        db      'Screens',0
6112
end if
6113
 
474 diamond 6114
align 4
180 heavyiron 6115
_10d dd 10
6116
_100d dd 100
474 diamond 6117
muldiv10 dd 429496729
180 heavyiron 6118
_10 db 10
6119
_100 db 100
6120
 
6121
fpu_cw  dw      000011100111111b
6122
 
6123
keybar_panels:
6124
if lang eq ru
6125
; без клавиш-модификаторов
6126
        db      'Помощь'
6127
        db      'ПользМ'
6128
        db      'Просм '
6129
        db      'Редакт'
6130
        db      'Копир '
6131
        db      'Перен '
6132
        db      'Папка '
6133
        db      'Удален'
6134
        db      'КонфМн'
6135
        db      'Выход '
6136
        db      'Модули'
6137
        db      'Экраны'
6138
; Shift
6139
        db      'Добавл'
6140
        db      'Распак'
6141
        db      'АрхКом'
6142
        db      'Редак.'
6143
        db      'Копир '
6144
        db      'Переим'
6145
        db      '      '
6146
        db      'Удален'
6147
        db      'Сохран'
6148
        db      'Послдн'
6149
        db      'Группы'
6150
        db      'Выбран'
6151
; Ctrl
6152
        db      'Левая '
6153
        db      'Правая'
6154
        db      'Имя   '
6155
        db      'Расшир'
6156
        db      'Модиф '
6157
        db      'Размер'
6158
        db      'Несорт'
6159
        db      'Создан'
6160
        db      'Доступ'
6161
        db      'Описан'
6162
        db      'Владел'
6163
        db      'Сорт  '
6164
; Ctrl+Shift
6165
        db      '      '
6166
        db      '      '
6167
        db      'Просм '
6168
        db      'Редакт'
6169
        db      '      '
6170
        db      '      '
6171
        db      '      '
6172
        db      '      '
6173
        db      '      '
6174
        db      '      '
6175
        db      '      '
6176
        db      '      '
6177
; Alt
6178
        db      'Левая '
6179
        db      'Правая'
6180
        db      'Смотр.'
6181
        db      'Редак.'
6182
        db      'Печать'
6183
        db      'Связь '
6184
        db      'Искать'
6185
        db      'Истор '
6186
        db      'Видео '
6187
        db      'Дерево'
6188
        db      'ИстПр '
6189
        db      'ИстПап'
6190
; Alt+Shift
6191
        db      '      '
6192
        db      '      '
6193
        db      '      '
6194
        db      '      '
6195
        db      '      '
6196
        db      '      '
6197
        db      '      '
6198
        db      '      '
6199
        db      'КонфПл'
6200
        db      '      '
6201
        db      '      '
6202
        db      '      '
6203
; Alt+Ctrl
6204
times 12 db     '      '
6205
; Alt+Ctrl+Shift
6206
times 12 db     '      '
6207
else
6208
; No modificators
6209
        db      'Help  '
6210
        db      'UserMn'
6211
        db      'View  '
6212
        db      'Edit  '
6213
        db      'Copy  '
6214
        db      'RenMov'
6215
        db      'MkFold'
6216
        db      'Delete'
6217
        db      'ConfMn'
6218
        db      'Quit  '
6219
        db      'Plugin'
6220
        db      'Screen'
6221
; Shift
6222
        db      'Add   '
6223
        db      'Extrct'
6224
        db      'ArcCmd'
6225
        db      'Edit..'
6226
        db      'Copy  '
6227
        db      'Rename'
6228
        db      '      '
6229
        db      'Delete'
6230
        db      'Save  '
6231
        db      'Last  '
6232
        db      'Group '
6233
        db      'SelUp '
6234
; Ctrl
6235
        db      'Left  '
6236
        db      'Right '
6237
        db      'Name  '
6238
        db      'Extens'
6239
        db      'Modifn'
6240
        db      'Size  '
6241
        db      'Unsort'
6242
        db      'Creatn'
6243
        db      'Access'
6244
        db      'Descr '
6245
        db      'Owner '
6246
        db      'Sort  '
6247
; Ctrl+Shift
6248
        db      '      '
6249
        db      '      '
6250
        db      'View  '
6251
        db      'Edit  '
6252
        db      '      '
6253
        db      '      '
6254
        db      '      '
6255
        db      '      '
6256
        db      '      '
6257
        db      '      '
6258
        db      '      '
6259
        db      '      '
6260
; Alt
6261
        db      'Left  '
6262
        db      'Right '
6263
        db      'View..'
6264
        db      'Edit..'
6265
        db      'Print '
6266
        db      'MkLink'
6267
        db      'Find  '
6268
        db      'Histry'
6269
        db      'Video '
6270
        db      'Tree  '
6271
        db      'ViewHs'
6272
        db      'FoldHs'
6273
; Alt+Shift
6274
        db      '      '
6275
        db      '      '
6276
        db      '      '
6277
        db      '      '
6278
        db      '      '
6279
        db      '      '
6280
        db      '      '
6281
        db      '      '
6282
        db      'ConfPl'
6283
        db      '      '
6284
        db      '      '
6285
        db      '      '
6286
; Alt+Ctrl
6287
times 12 db     '      '
6288
; Alt+Ctrl+Shift
6289
times 12 db     '      '
6290
end if
6291
 
6292
keybar_viewer:
6293
if lang eq ru
6294
; без клавиш-модификаторов
6295
        db      'Помощь'
6296
        db      'Развер'
6297
        db      'Выход '
6298
        db      'Код   '
6299
        db      '      '
6300
        db      'Редакт'
6301
        db      'Поиск '
6302
keybar_cp:
6303
        db      'cp1251'
6304
        db      '      '
6305
        db      'Выход '
6306
        db      'Модули'
6307
        db      'Экраны'
6308
; Shift
6309
        db      '      '
6310
        db      'Слова '
6311
        db      '      '
6312
        db      '      '
6313
        db      '      '
6314
        db      '      '
6315
        db      'Дальше'
6316
        db      'Таблиц'
6317
        db      '      '
6318
        db      '      '
6319
        db      '      '
6320
        db      '      '
6321
; Ctrl
6322
        db      '      '
6323
        db      '      '
6324
        db      '      '
6325
        db      '      '
6326
        db      '      '
6327
        db      '      '
6328
        db      '      '
6329
        db      '      '
6330
        db      '      '
6331
        db      'Позиц '
6332
        db      '      '
6333
        db      '      '
6334
; Ctrl+Shift
6335
        db      '      '
6336
        db      '      '
6337
        db      '      '
6338
        db      '      '
6339
        db      '      '
6340
        db      '      '
6341
        db      '      '
6342
        db      '      '
6343
        db      '      '
6344
        db      '      '
6345
        db      '      '
6346
        db      '      '
6347
; Alt
6348
        db      '      '
6349
        db      '      '
6350
        db      '      '
6351
        db      '      '
6352
        db      'Печать'
6353
        db      '      '
6354
        db      'Назад '
6355
        db      'Перейт'
6356
        db      'Видео '
6357
        db      '      '
6358
        db      'ИстПр '
6359
        db      '      '
6360
; Alt+Shift
6361
        db      '      '
6362
        db      '      '
6363
        db      '      '
6364
        db      '      '
6365
        db      '      '
6366
        db      '      '
6367
        db      '      '
6368
        db      '      '
6369
        db      'Конфиг'
6370
        db      '      '
6371
        db      '      '
6372
        db      '      '
6373
; Alt+Ctrl
6374
times 12 db     '      '
6375
; Alt+Ctrl+Shift
6376
times 12 db     '      '
6377
else
6378
; No modificators
6379
        db      'Help  '
6380
        db      'Unwrap'
6381
        db      'Quit  '
6382
        db      'Hex   '
6383
        db      '      '
6384
        db      'Edit  '
6385
        db      'Search'
6386
keybar_cp:
6387
        db      'cp1251'
6388
        db      '      '
6389
        db      'Quit  '
6390
        db      'Plugin'
6391
        db      'Screen'
6392
; Shift
6393
        db      '      '
6394
        db      'WWrap '
6395
        db      '      '
6396
        db      '      '
6397
        db      '      '
6398
        db      '      '
6399
        db      'Next  '
6400
        db      'Table '
6401
        db      '      '
6402
        db      '      '
6403
        db      '      '
6404
        db      '      '
6405
; Ctrl
6406
        db      '      '
6407
        db      '      '
6408
        db      '      '
6409
        db      '      '
6410
        db      '      '
6411
        db      '      '
6412
        db      '      '
6413
        db      '      '
6414
        db      '      '
6415
        db      'GoFile'
6416
        db      '      '
6417
        db      '      '
6418
; Ctrl+Shift
6419
        db      '      '
6420
        db      '      '
6421
        db      '      '
6422
        db      '      '
6423
        db      '      '
6424
        db      '      '
6425
        db      '      '
6426
        db      '      '
6427
        db      '      '
6428
        db      '      '
6429
        db      '      '
6430
        db      '      '
6431
; Alt
6432
        db      '      '
6433
        db      '      '
6434
        db      '      '
6435
        db      '      '
6436
        db      'Print '
6437
        db      '      '
6438
        db      'Prev  '
6439
        db      'Goto  '
6440
        db      'Video '
6441
        db      '      '
6442
        db      'ViewHs'
6443
        db      '      '
6444
; Alt+Shift
6445
        db      '      '
6446
        db      '      '
6447
        db      '      '
6448
        db      '      '
6449
        db      '      '
6450
        db      '      '
6451
        db      '      '
6452
        db      '      '
6453
        db      'Config'
6454
        db      '      '
6455
        db      '      '
6456
        db      '      '
6457
; Alt+Ctrl
6458
times 12 db     '      '
6459
; Alt+Ctrl+Shift
6460
times 12 db     '      '
6461
end if
6462
 
6463
        align   4
6464
cur_width       dd      80
6465
cur_height      dd      25
283 diamond 6466
saved_width     dd      -1
6467
saved_height    dd      -1
314 diamond 6468
fill_width      dd      0
6469
fill_height     dd      0
180 heavyiron 6470
max_width = 256
6471
max_height = 256
283 diamond 6472
console_data_ptr dd     0
180 heavyiron 6473
 
283 diamond 6474
cursor_x        dd      -1
6475
cursor_y        dd      -1
474 diamond 6476
cur_cursor_pos  dd      -1
6477
old_cursor_pos  dd      -1
283 diamond 6478
 
180 heavyiron 6479
active_panel    dd      panel1_data
6480
 
474 diamond 6481
associations    dd      0
517 diamond 6482
associations_size dd    1               ; terminating zero
6483
associations_allocated dd 0x1000        ; start with one page
474 diamond 6484
 
180 heavyiron 6485
console_colors  dd      0x000000, 0x000080, 0x008000, 0x008080
6486
                dd      0x800000, 0x800080, 0x808000, 0xC0C0C0
6487
                dd      0x808080, 0x0000FF, 0x00FF00, 0x00FFFF
6488
                dd      0xFF0000, 0xFF00FF, 0xFFFF00, 0xFFFFFF
6489
 
6490
compare_fns     dd      compare_name
6491
                dd      compare_name_rev
6492
                dd      compare_ext
6493
                dd      compare_ext_rev
6494
                dd      compare_modified
6495
                dd      compare_modified_rev
6496
                dd      compare_size
6497
                dd      compare_size_rev
6498
                dd      compare_unordered
6499
                dd      compare_unordered_rev
6500
                dd      compare_created
6501
                dd      compare_created_rev
6502
                dd      compare_accessed
6503
                dd      compare_accessed_rev
6504
 
6505
ctrlkey_tests   dd      ctrlkey_test0
6506
                dd      ctrlkey_test1
6507
                dd      ctrlkey_test2
6508
                dd      ctrlkey_test3
6509
                dd      ctrlkey_test4
6510
ctrlkey_tests_num = 5
6511
 
6512
virtual at 0
6513
screen_vtable:
6514
        .OnRedraw       dd      ?
6515
        .OnKey          dd      ?
6516
        .keybar         dd      ?
6517
        .getname        dd      ?
589 diamond 6518
        .OnExit         dd      ?
6519
        .IsHandleUsed   dd      ?
180 heavyiron 6520
end virtual
6521
 
6522
panels_vtable:
6523
        dd      panels_OnRedraw
6524
        dd      panels_OnKey
6525
        dd      keybar_panels
6526
        dd      panels_getname
589 diamond 6527
        dd      panels_OnExit
6528
        dd      panels_IsHandleUsed
180 heavyiron 6529
 
6530
viewer_vtable:
6531
        dd      viewer_OnRedraw
6532
        dd      viewer_OnKey
6533
        dd      keybar_viewer
6534
        dd      viewer_getname
589 diamond 6535
        dd      viewer_OnExit
6536
        dd      viewer_IsHandleUsed
180 heavyiron 6537
 
314 diamond 6538
; additions to this table require changes in tools.inc::get_error_msg
6539
errors1:
6540
        dd      error0msg
6541
        dd      error1msg
6542
        dd      error2msg
6543
        dd      error3msg
6544
        dd      error4msg
6545
        dd      error5msg
6546
        dd      error6msg
6547
        dd      error7msg
6548
        dd      error8msg
6549
        dd      error9msg
6550
        dd      error10msg
6551
        dd      error11msg
6552
errors2:
6553
        dd      error30msg
6554
        dd      error31msg
6555
        dd      error32msg
6556
 
180 heavyiron 6557
encodings:
6558
.cp866 = 0
6559
.cp1251 = 1
474 diamond 6560
.koi8r = 2
6561
.unicode = 3
180 heavyiron 6562
 
6563
.names:
6564
        db      'cp866   '
6565
        db      'cp1251  '
474 diamond 6566
        db      'koi8-r  '
6567
        db      'Unicode '
180 heavyiron 6568
 
6569
.tables:
6570
; cp866 - trivial map
6571
        times 128 db %+127
6572
; cp1251
6573
        db      0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8,0x3F,0x25,0x3F,0x3C,0x3F,0x3F,0x3F,0x3F
6574
        db      0x3F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D,0x3F,0x54,0x3F,0x3E,0x3F,0x3F,0x3F,0x3F
6575
        db      0xFF,0xF6,0xF7,0x3F,0xFD,0x3F,0xB3,0x15,0xF0,0x63,0xF2,0x3C,0xBF,0x2D,0x52,0xF4
6576
        db      0xF8,0x2B,0x49,0x69,0x3F,0xE7,0x14,0xFA,0xF1,0xFC,0xF3,0x3E,0x3F,0x3F,0x3F,0xF5
6577
        times 0x30 db %-1+0x80
6578
        times 0x10 db %-1+0xE0
474 diamond 6579
; koi8-r
6580
        db      0xC4,0xB3,0xDA,0xBF,0xC0,0xD9,0xC3,0xB4,0xC2,0xC1,0xC5,0xDF,0xDC,0xDB,0xDD,0xDE
6581
        db      0xB0,0xB1,0xB2,0xF4,0xFE,0xF9,0xFB,0xF7,0xF3,0xF2,0xFF,0xF5,0xF8,0xFD,0xFA,0xF6
6582
        db      0xCD,0xBA,0xD5,0xF1,0xD6,0xC9,0xB8,0xB7,0xBB,0xD4,0xD3,0xC8,0xBE,0xBD,0xBC,0xC6
6583
        db      0xC7,0xCC,0xB5,0xF0,0xB6,0xB9,0xD1,0xD2,0xCB,0xCF,0xD0,0xCA,0xD8,0xD7,0xCE,0xFC
6584
        db      0xEE,0xA0,0xA1,0xE6,0xA4,0xA5,0xE4,0xA3,0xE5,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE
6585
        db      0xAF,0xEF,0xE0,0xE1,0xE2,0xE3,0xA6,0xA2,0xEC,0xEB,0xA7,0xE8,0xED,0xE9,0xE7,0xEA
6586
        db      0x9E,0x80,0x81,0x96,0x84,0x85,0x94,0x83,0x95,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E
6587
        db      0x8F,0x9F,0x90,0x91,0x92,0x93,0x86,0x82,0x9C,0x9B,0x87,0x98,0x9D,0x99,0x97,0x9A
180 heavyiron 6588
 
474 diamond 6589
.menu:
6590
        db      .cp866
6591
.menu.1:
6592
        dd      .menu.2
6593
        dd      0
6594
if lang eq ru
6595
        db      '&DOS текст (cp866)',0
6596
else
6597
        db      '&DOS text (cp866)',0
6598
end if
6599
        db      .cp1251
6600
.menu.2:
6601
        dd      .menu.3
6602
        dd      .menu.1
6603
if lang eq ru
6604
        db      '&Windows текст (cp1251)',0
6605
else
6606
        db      '&Windows text (cp1251)',0
6607
end if
6608
        db      .koi8r
6609
.menu.3:
6610
        dd      .menu.4
6611
        dd      .menu.2
6612
if lang eq ru
6613
        db      '&Linux текст (koi8-r)',0
6614
else
6615
        db      '&Linux text (koi8-r)',0
6616
end if
6617
        db      .unicode
6618
.menu.4:
6619
        dd      0
6620
        dd      .menu.3
6621
        db      '&Unicode',0
6622
 
180 heavyiron 6623
active_screen   dd      0
6624
tabsize         dd      8
6625
 
6626
ascii2scan:
6627
        times 32 db 0
6628
        db      0x39,0x02,0x03,0x04,0x05,0x06,0x08,0x28,0x0A,0x0B,0x09,0x0D,0x33,0x0C,0x34,0x35
6629
        db      0x0B,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x27,0x27,0x33,0x0D,0x34,0x35
6630
        db      0x03,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
6631
        db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x07,0x0C
6632
        db      0x29,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
6633
        db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x29,0x00
6634
        db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
6635
        db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
6636
        db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
6637
        times 48 db 0
6638
        db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
6639
        db      0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
6640
 
6641
; Клавишные сочетания
6642
; db scancode, reserved
6643
; dw ctrlstate
6644
; dd handler
6645
; ctrlstate: младшие 4 бита - для Shift, следующие - для Ctrl, следующие - для Alt
6646
; 0 = ни одна клавиша не нажата
6647
; 1 = ровно одна нажата
6648
; 2 = обе нажаты
6649
; 3 = левая нажата, правая нет
6650
; 4 = правая нажата, левая нет
6651
panels_ctrlkeys:
6652
        dw      0x48, 0
6653
        dd      panels_OnKey.up
6654
        dw      0x50, 0
6655
        dd      panels_OnKey.down
6656
        dw      0x4B, 0
6657
        dd      panels_OnKey.left
6658
        dw      0x4D, 0
6659
        dd      panels_OnKey.right
474 diamond 6660
        dw      0x51, 0
6661
        dd      panels_OnKey.pgdn
6662
        dw      0x49, 0
6663
        dd      panels_OnKey.pgup
180 heavyiron 6664
        dw      0xF, 0
6665
        dd      panels_OnKey.tab
6666
        dw      0x47, 0
6667
        dd      panels_OnKey.home
6668
        dw      0x4F, 0
6669
        dd      panels_OnKey.end
6670
        dw      0x1C, 0
6671
        dd      panels_OnKey.enter
6672
        dw      0x3D, 0
6673
        dd      panels_OnKey.f3
283 diamond 6674
        dw      0x3F, 0
6675
        dd      panels_OnKey.f5
6676
        dw      0x3F, 1
6677
        dd      panels_OnKey.shift_f5
321 diamond 6678
        dw      0x41, 0
6679
        dd      panels_OnKey.f7
180 heavyiron 6680
        dw      0x42, 0
6681
        dd      panels_OnKey.f8
283 diamond 6682
        dw      0x43, 0x100
6683
        dd      alt_f9
180 heavyiron 6684
        dw      0x44, 0
6685
        dd      exit
283 diamond 6686
        dw      0x5D, 0
6687
        dd      panels_OnKey.menu
180 heavyiron 6688
repeat 9-3+1
6689
        dw      0x3D+%-1, 0x10
6690
        dd      panels_OnKey.ctrl_f39
6691
end repeat
6692
        dw      0x3B, 0x100
6693
        dd      panels_OnKey.alt_f12
6694
        dw      0x3C, 0x100
6695
        dd      panels_OnKey.alt_f12
6696
        dw      0x58, 0
6697
        dd      F12
6698
        dw      0x13, 0x10
6699
        dd      panels_OnKey.ctrl_r
474 diamond 6700
        dw      2, 0x30
6701
        dd      panels_OnKey.change_mode
6702
        dw      3, 0x30
6703
        dd      panels_OnKey.change_mode
6704
        dw      4, 0x30
6705
        dd      panels_OnKey.change_mode
6706
        dw      5, 0x30
6707
        dd      panels_OnKey.change_mode
6708
repeat 10
6709
        dw      %+1, 0x40
6710
        dd      panels_OnKey.quick_jump
6711
end repeat
6712
        dw      0x52, 0
6713
        dd      panels_OnKey.insert
6714
        dw      0x4E, 0
6715
        dd      panels_OnKey.greyplus
6716
        dw      0x4A, 0
6717
        dd      panels_OnKey.greyminus
517 diamond 6718
        dw      0x37, 0
6719
        dd      panels_OnKey.greyasterisk
180 heavyiron 6720
        db      0
6721
 
6722
viewer_ctrlkeys:
6723
        dw      1, 0
6724
        dd      viewer_OnKey.exit
6725
        dw      0x51, 0
6726
        dd      viewer_OnKey.pgdn
6727
        dw      0x49, 0
6728
        dd      viewer_OnKey.pgup
6729
        dw      0x50, 0
6730
        dd      viewer_OnKey.down
6731
        dw      0x48, 0
6732
        dd      viewer_OnKey.up
6733
        dw      0x4B, 0
6734
        dd      viewer_OnKey.left
6735
        dw      0x4B, 0x10
6736
        dd      viewer_OnKey.ctrl_left
6737
        dw      0x4B, 0x11
6738
        dd      viewer_OnKey.ctrl_shift_left
6739
        dw      0x4C, 0
6740
        dd      viewer_OnKey.exit
6741
        dw      0x4D, 0
6742
        dd      viewer_OnKey.right
6743
        dw      0x4D, 0x10
6744
        dd      viewer_OnKey.ctrl_right
6745
        dw      0x4D, 0x11
6746
        dd      viewer_OnKey.ctrl_shift_right
6747
        dw      0x3C, 0
6748
        dd      viewer_OnKey.f2
6749
        dw      0x3D, 0
6750
        dd      viewer_OnKey.exit
6751
        dw      0x3E, 0
6752
        dd      viewer_OnKey.f4
6753
        dw      0x42, 0
6754
        dd      viewer_OnKey.f8
474 diamond 6755
        dw      0x42, 1
6756
        dd      viewer_OnKey.shift_f8
180 heavyiron 6757
        dw      0x44, 0
6758
        dd      viewer_OnKey.exit
6759
        dw      0x47, 0
6760
        dd      viewer_OnKey.home
6761
        dw      0x4F, 0
6762
        dd      viewer_OnKey.end
6763
        dw      0x58, 0
6764
        dd      F12
283 diamond 6765
        dw      0x43, 0x100
6766
        dd      alt_f9
180 heavyiron 6767
        db      0
6768
 
6769
dirinfo:
6770
                dd      1
6771
.first          dd      0
6772
                dd      0
6773
.size           dd      300
6774
.dirdata        dd      0
6775
                db      0
6776
.name           dd      0
6777
 
6778
readinfo:
6779
                dd      0
6780
.first          dq      0
6781
.size           dd      0
6782
.data           dd      0
6783
                db      0
6784
.name           dd      0
6785
 
283 diamond 6786
writeinfo:
6787
.code           dd      2
6788
.first          dq      0
6789
.size           dd      0
6790
.data           dd      0
6791
                db      0
6792
.name           dd      0
6793
 
180 heavyiron 6794
attrinfo:
6795
                dd      5
6796
                dd      0
6797
                dd      0
6798
                dd      0
6799
                dd      .attr
6800
                db      0
6801
.name           dd      0
6802
 
6803
delinfo:
6804
                dd      8
6805
                dd      0
6806
                dd      0
6807
                dd      0
6808
                dd      0
6809
                db      0
6810
                dd      execdata
6811
 
321 diamond 6812
mkdirinfo:
6813
                dd      9
6814
                dd      0
6815
                dd      0
6816
                dd      0
6817
                dd      0
6818
                db      0
6819
                dd      CopyDestEditBuf+12
6820
 
180 heavyiron 6821
if lang eq ru
6822
compare_names   db      'иИрРмМаАнНсСдД'
6823
else
6824
compare_names   db      'nNxXmMsSuUcCaA'
6825
end if
6826
 
183 diamond 6827
; Здесь начинаются конфигурационные данные - в текущей реализации они зашиты в бинарник
6828
 
180 heavyiron 6829
; Панель
6830
panel_normal_color      db      1Bh
474 diamond 6831
panel_selected_color    db      1Eh
180 heavyiron 6832
panel_border_color      db      1Bh
6833
panel_cursor_color      db      30h
474 diamond 6834
panel_selected_cursor_color db  3Eh
180 heavyiron 6835
panel_header_color      db      1Bh
6836
panel_active_header_color db    30h
6837
column_header_color     db      1Eh
474 diamond 6838
panel_number_color      db      1Bh
6839
panel_numselected_color db      3Eh
180 heavyiron 6840
panel_nscreens_color    db      0Bh
183 diamond 6841
; Диалоги
314 diamond 6842
dialog_colors:
183 diamond 6843
dialog_main_color       db      70h
6844
dialog_border_color     db      70h
6845
dialog_header_color     db      70h
314 diamond 6846
dialog_edit_color       db      30h
6847
dialog_unmodified_edit_color db 38h
183 diamond 6848
dialog_normal_btn_color db      70h
6849
dialog_selected_btn_color db    30h
314 diamond 6850
; Предупреждения и ошибки
6851
warning_colors:
6852
; !!! должны быть те же поля и в том же порядке, что и для обычных диалогов !!!
6853
warning_main_color      db      4Fh
6854
warning_border_color    db      4Fh
6855
warning_header_color    db      4Fh
6856
warning_edit_color      db      30h
6857
warning_unmodified_edit_color db 38h
6858
warning_normal_btn_color db     4Fh
6859
warning_selected_btn_color db   70h
180 heavyiron 6860
; Меню
6861
menu_normal_color       db      3Fh
6862
menu_selected_color     db      0Fh
6863
menu_highlight_color    db      3Eh
6864
menu_selected_highlight_color db 0Eh
6865
menu_border_color       db      3Fh
6866
menu_header_color       db      3Fh
6867
menu_scrollbar_color    db      3Fh
6868
; Линейка клавиш
6869
keybar_number_color     db      7
6870
keybar_name_color       db      30h
6871
keybar_bgr_color        db      7
6872
; Командная строка
6873
cmdbar_normal_color     db      7
6874
cmdbar_prefix_color     db      7
6875
; Просмотрщик
6876
view_normal_color       db      1Bh
6877
view_status_color       db      30h
6878
view_arrows_color       db      1Eh
6879
 
6880
; Подсветка файлов
6881
highlight_num_groups    dd      10
6882
highlight_groups        dd      highlight_group0
6883
                dd      highlight_group1
6884
                dd      highlight_group2
6885
                dd      highlight_group3
6886
                dd      highlight_group4
6887
                dd      highlight_group5
6888
                dd      highlight_group6
6889
                dd      highlight_group7
6890
                dd      highlight_group8
6891
                dd      highlight_group9
6892
 
6893
; Формат описания группы подсветки:
6894
virtual at 0
6895
highlight:
474 diamond 6896
        .IncludeAttributes      db ?
180 heavyiron 6897
        .NormalColor            db ?
6898
        .CursorColor            db ?
474 diamond 6899
        .SelectedColor          db ?
6900
        .SelectedCursorColor    db ?
180 heavyiron 6901
        .Mask:                  ; ASCIIZ-string
6902
end virtual
6903
 
283 diamond 6904
; all highlight masks must be in lowercase!
180 heavyiron 6905
highlight_group0:
6906
        db      2
474 diamond 6907
        db      13h, 38h, 0, 0
180 heavyiron 6908
        db      '*',0
6909
highlight_group1:
6910
        db      4
474 diamond 6911
        db      13h, 38h, 0, 0
180 heavyiron 6912
        db      '*',0
6913
highlight_group2:
6914
        db      10h
474 diamond 6915
        db      1Fh, 3Fh, 0, 0
180 heavyiron 6916
        db      '*|..',0
6917
highlight_group3:
6918
        db      10h
474 diamond 6919
        db      0, 0, 0, 0
180 heavyiron 6920
        db      '..',0
6921
highlight_group4:
6922
        db      0
474 diamond 6923
        db      1Ah, 3Ah, 0, 0
180 heavyiron 6924
        db      '*.exe,*.com,*.bat,*.cmd',0
6925
highlight_group5:
6926
        db      0
474 diamond 6927
        db      1Ah, 3Ah, 0, 0
180 heavyiron 6928
        db      '*|*.*',0
6929
highlight_group6:
6930
        db      0
474 diamond 6931
        db      1Dh, 3Dh, 0, 0
180 heavyiron 6932
        db      '*.rar,*.zip,*.[zj],*.[bg7]z,*.[bg]zip,*.tar,*.t[ag]z,*.ar[cj],*.r[0-9][0-9],'
6933
        db      '*.a[0-9][0-9],*.bz2,*.cab,*.msi,*.jar,*.lha,*.lzh,*.ha,*.ac[bei],*.pa[ck],'
6934
        db      '*.rk,*.cpio,*.rpm,*.zoo,*.hqx,*.sit,*.ice,*.uc2,*.ain,*.imp,*.777,*.ufa,*.boa,'
6935
        db      '*.bs[2a],*.sea,*.hpk,*.ddi,*.x2,*.rkv,*.[lw]sz,*.h[ay]p,*.lim,*.sqz,*.chz',0
6936
highlight_group7:
6937
        db      0
474 diamond 6938
        db      16h, 36h, 0, 0
180 heavyiron 6939
        db      '*.bak,*.tmp',0
6940
highlight_group8:
6941
        db      0
474 diamond 6942
        db      17h, 37h, 0, 0
180 heavyiron 6943
        db      '*.asm,*.inc',0
6944
highlight_group9:
6945
        db      10h
474 diamond 6946
        db      1Fh, 3Fh, 0, 0
180 heavyiron 6947
        db      '*',0
6948
 
183 diamond 6949
bConfirmDelete  db      1
321 diamond 6950
bConfirmDeleteIncomplete db 0
183 diamond 6951
 
474 diamond 6952
FolderShortcuts dd      0,0,0,0,0,0,0,0,0,0
6953
 
183 diamond 6954
; Здесь заканчиваются конфигурационные данные
6955
 
6956
bWasE0          db      0
6957
ctrlstate       db      0
474 diamond 6958
MemForImage     dd      0
6959
restore_semicolon dd    0
6960
bForHex         db      0
183 diamond 6961
 
6962
align   4
314 diamond 6963
; Сообщение о обломе при выделении памяти
6964
nomem_dlgdata:
6965
        dd      2
6966
        dd      -1
6967
        dd      -1
6968
        dd      12
6969
        dd      2
6970
        dd      1
6971
        dd      1
6972
        dd      aError
6973
        rb      4
6974
        dd      0
6975
        dd      0
6976
        dd      2
6977
; строка "No memory"
6978
        dd      1
6979
        dd      1,0,10,0
6980
        dd      aNoMemory
6981
        dd      1
6982
; кнопка "Ok"
6983
        dd      2
6984
        dd      4,1,7,1
6985
        dd      aOk
6986
        dd      0xD
6987
 
283 diamond 6988
; диалог копирования
6989
copy_dlgdata:
314 diamond 6990
        dd      1
283 diamond 6991
.x      dd      -1
6992
.y      dd      -1
6993
.width  dd      ?
6994
.height dd      4
6995
        dd      4
6996
        dd      2
6997
        dd      aCopyCaption
6998
.main_color db ?
6999
.border_color db ?
7000
.header_color db ?
7001
        db      0
7002
        dd      0
7003
        dd      0
7004
        dd      4
7005
; строка 'Копировать "%s" в:'
7006
        dd      1
7007
        dd      1,0
7008
.width2 dd      ?
7009
        dd      0
7010
        dd      CopySourceTextBuf
7011
        dd      0
7012
; поле редактирования с именем файла/папки назначения
7013
        dd      3
7014
        dd      1,1
7015
.width3 dd      ?
7016
        dd      1
7017
        dd      CopyDestEditBuf
7018
.flags0 dd      0
7019
; кнопка "копировать"
7020
.copy_btn:
7021
        dd      2
7022
.copy_x1 dd     ?
7023
        dd      3
7024
.copy_x2 dd     ?
7025
        dd      3
7026
        dd      aCopy
7027
.flags1 dd      18h
7028
; кнопка "отменить"
7029
        dd      2
7030
.cnl_x1 dd      ?
7031
        dd      3
7032
.cnl_x2 dd      ?
7033
        dd      3
7034
        dd      aCancelB
7035
.flags2 dd      8
7036
 
321 diamond 7037
mkdir_dlgdata:
7038
        dd      1
7039
        dd      -1, -1
7040
.width  dd      ?
7041
.height dd      4
7042
        dd      4, 2
7043
        dd      aMkDirCaption
7044
        dd      ?
7045
        dd      0
7046
        dd      0
7047
        dd      4
7048
; Строка "Создать папку"
7049
        dd      1
7050
        dd      1,0,aMkDirLen,0
7051
        dd      aMkDir
7052
        dd      0
7053
; поле редактирования с именем создаваемой папки
7054
        dd      3
7055
        dd      1,1
7056
.width2 dd      ?
7057
        dd      1
7058
        dd      CopyDestEditBuf
7059
.flags0 dd      0xC
7060
; кнопка "Продолжить"
7061
.cont_btn:
7062
        dd      2
7063
.cont_x1 dd     ?
7064
        dd      3
7065
.cont_x2 dd     ?
7066
        dd      3
7067
        dd      a_Continue
7068
.flags1 dd      18h
7069
; кнопка "отменить"
7070
        dd      2
7071
.cnl_x1 dd      ?
7072
        dd      3
7073
.cnl_x2 dd      ?
7074
        dd      3
7075
        dd      aCancelB
7076
.flags2 dd      8
283 diamond 7077
 
474 diamond 7078
; диалог выделения/снятия
7079
mark_dlgdata:
7080
        dd      1
7081
        dd      -1, -1
7082
        dd      37, 1
7083
        dd      4, 2
7084
.title  dd      ?
7085
        dd      ?
7086
        dd      0, 0
7087
        dd      1
7088
; поле редактирования
7089
        dd      3
7090
        dd      1, 0, 35, 0
7091
        dd      enter_string_buf
7092
.flags  dd      ?
7093
 
321 diamond 7094
RetryOrCancelBtn:
7095
        dd      aRetry
7096
        dd      a_Cancel
7097
DeleteOrKeepBtn:
7098
        dd      a_Delete
7099
        dd      aKeep
7100
RetryOrIgnoreBtn:
7101
        dd      aRetry
7102
        dd      aIgnore
474 diamond 7103
DeleteOrCancelBtn:
7104
        dd      a_Delete
7105
        dd      a_Cancel
7106
DeleteErrorBtn:
7107
        dd      aRetry
7108
        dd      aSkip
7109
        dd      aSkipAll
7110
        dd      a_Cancel
517 diamond 7111
ContinueBtn:
7112
        dd      aContinue
321 diamond 7113
 
589 diamond 7114
aCannotOpenFile_ptr     dd      aCannotOpenFile
183 diamond 7115
if lang eq ru
7116
aDeleteCaption          db      'Удаление',0
474 diamond 7117
aConfirmDeleteText      db      'Вы хотите удалить',0
7118
aDeleteFolder           db      ' папку',0
183 diamond 7119
aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
474 diamond 7120
aDeleteFile             db      ' файл',0
283 diamond 7121
aCancelB                db      '[ Отменить ]',0
7122
aCancelBLength = $ - aCancelB - 1
7123
aCopyCaption            db      'Копирование',0
7124
aCopy                   db      '[ Копировать ]',0
7125
aCopyLength = $ - aCopy - 1
321 diamond 7126
a_Continue              db      '[ Продолжить ]',0
7127
a_ContinueLength = $ - a_Continue - 1
517 diamond 7128
aCopy1                  db      'Копировать ',0
7129
aCopy2                  db      ' в:',0
314 diamond 7130
aError                  db      'Ошибка',0
7131
aContinue               db      'Продолжить',0
7132
aRetry                  db      'Повторить',0
321 diamond 7133
a_Cancel                db      'Отменить',0
7134
a_Delete                db      'Удалить',0
474 diamond 7135
aSkip                   db      'Пропустить',0
7136
aSkipAll                db      'Пропустить все',0
314 diamond 7137
error0msg               db      'Странно... Нет ошибки',0
7138
error1msg               db      'Странно... Не определена база и/или раздел жёсткого диска',0
7139
error2msg               db      'Функция не поддерживается для данной файловой системы',0
7140
error3msg               db      'Неизвестная файловая система',0
7141
error4msg               db      'Странно... Ошибка 4',0
7142
error5msg               db      'Файл не найден',0
7143
error6msg               db      'Файл закончился',0
7144
error7msg               db      'Странно... Указатель вне памяти приложения',0
7145
error8msg               db      'Диск заполнен',0
7146
error9msg               db      'Файловая структура разрушена',0
7147
error10msg              db      'Доступ запрещён',0
7148
error11msg              db      'Ошибка устройства',0
7149
error30msg              db      'Недостаточно памяти',0
7150
error31msg              db      'Файл не является исполняемым',0
7151
error32msg              db      'Слишком много процессов',0
7152
aUnknownError           db      'Неизвестный код ошибки: ',0
7153
aCannotReadFolder       db      'Не могу прочитать папку',0
321 diamond 7154
aRunError               db      'Ошибка при запуске программы:',0
7155
aFileNameTooBig         db      'Полное имя файла слишком длинное',0
7156
aFolderNameTooBig       db      'Полное имя папки слишком длинное',0
7157
aCmdLineTooBig          db      'Командная строка превышает границу OS в 256 символов',0
7158
aCannotCopyToSelf       db      'Файл не может быть скопирован в самого себя',0
7159
aCannotReadFile         db      'Не могу прочитать файл',0
7160
aIncompleteFile         db      'Был получен неполный файл. Удалить его?',0
7161
aKeep                   db      'Оставить',0
7162
aCannotWriteFile        db      'Не могу записать в файл',0
7163
aCannotDeleteFile       db      'Не могу удалить файл',0
7164
aCannotDeleteFolder     db      'Не могу удалить папку',0
517 diamond 7165
aNotFolder              db      'не является папкой',0
321 diamond 7166
aIgnore                 db      'Игнорировать',0
7167
aMkDirCaption           db      'Создание папки',0
7168
aMkDir                  db      'Создать папку',0
7169
aMkDirLen = $ - aMkDir - 1
7170
aCannotMakeFolder       db      'Не могу создать папку',0
474 diamond 7171
aName                   db      3,'Имя'
7172
aSize                   db      6,'Размер'
7173
aDate                   db      4,'Дата'
7174
aTime                   db      5,'Время'
7175
aCannotLoadDLL          db      'Не могу загрузить DLL',0
589 diamond 7176
aCannotLoadPlugin       db      'Не могу загрузить плагин',0
474 diamond 7177
aInvalidDLL             db      'Файл не найден или имеет неверный формат',0
7178
aMissingExport          db      'Необходимая функция не найдена',0
7179
aInitFailed             db      'Ошибка при инициализации',0
7180
aIncompatibleVersion    db      'Несовместимая версия',0
7181
aTables                 db      'Таблицы',0
7182
aSelect                 db      'Пометить',0
7183
aDeselect               db      'Снять',0
589 diamond 7184
aCannotOpenFile         db      'Ошибка при открытии файла',0
7185
aCannotSetFolder        db      'Не могу зайти в папку',0
183 diamond 7186
else
7187
aDeleteCaption          db      'Delete',0
474 diamond 7188
aConfirmDeleteText      db      'Do you wish to delete',0
7189
aDeleteFolder           db      ' the folder',0
183 diamond 7190
aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
474 diamond 7191
aDeleteFile             db      ' the file',0
183 diamond 7192
aDelete                 db      ' Delete ',0
7193
aDeleteLength = $ - aDelete - 1
7194
aCancel                 db      ' Cancel ',0
7195
aCancelLength = $ - aCancel - 1
283 diamond 7196
aCancelB                db      '[ Cancel ]',0
7197
aCancelBLength = $ - aCancelB - 1
7198
aCopyCaption            db      'Copy',0
7199
aCopy                   db      '[ Copy ]',0
7200
aCopyLength = $ - aCopy - 1
321 diamond 7201
a_Continue              db      '[ Continue ]',0
7202
a_ContinueLength = $ - a_Continue - 1
283 diamond 7203
aCopy1                  db      'Copy "',0
7204
aCopy2                  db      '" to:',0
314 diamond 7205
aError                  db      'Error',0
7206
aContinue               db      'Continue',0
7207
aRetry                  db      'Retry',0
321 diamond 7208
a_Cancel                db      'Cancel',0
7209
a_Delete                db      'Delete',0
474 diamond 7210
aSkip                   db      'Skip',0
7211
aSkipAll                db      'Skip all',0
314 diamond 7212
error0msg               db      'Strange... No error',0
7213
error1msg               db      'Strange... Hard disk base and/or partition not defined',0
7214
error2msg               db      'The file system does not support this function',0
7215
error3msg               db      'Unknown file system',0
7216
error4msg               db      'Strange... Error 4',0
7217
error5msg               db      'File not found',0
7218
error6msg               db      'End of file',0
7219
error7msg               db      'Strange... Pointer lies outside of application memory',0
7220
error8msg               db      'Disk is full',0
7221
error9msg               db      'File structure is destroyed',0
7222
error10msg              db      'Access denied',0
7223
error11msg              db      'Device error',0
7224
error30msg              db      'Not enough memory',0
7225
error31msg              db      'File is not executable',0
7226
error32msg              db      'Too many processes',0
7227
aUnknownError           db      'Unknown error code: ',0
7228
aCannotReadFolder       db      'Cannot read folder',0
321 diamond 7229
aRunError               db      'Cannot execute program:',0
7230
aFileNameTooBig         db      'Full file name is too long',0
7231
aFolderNameTooBig       db      'Full folder name is too long',0
7232
aCmdLineTooBig          db      'Command line is too long (OS limit is 256 symbols)',0
7233
aCannotCopyToSelf       db      'File cannot be copied onto itself',0
7234
aCannotReadFile         db      'Cannot read file',0
7235
aIncompleteFile         db      'Incomplete file was retrieved. Delete it?',0
7236
aKeep                   db      'Keep',0
474 diamond 7237
aCannotWriteFile        db      'Cannot write to the file',0
7238
aCannotDeleteFile       db      'Cannot delete the file',0
7239
aCannotDeleteFolder     db      'Cannot delete the folder',0
517 diamond 7240
aNotFolder              db      'is not a folder',0
321 diamond 7241
aIgnore                 db      'Ignore',0
7242
aMkDirCaption           db      'Make folder',0
7243
aMkDir                  db      'Create the folder',0
7244
aMkDirLen = $ - aMkDir - 1
7245
aCannotMakeFolder       db      'Cannot create folder',0
474 diamond 7246
aName                   db      4,'Name'
7247
aSize                   db      4,'Size'
7248
aDate                   db      4,'Date'
7249
aTime                   db      4,'Time'
7250
aCannotLoadDLL          db      'Cannot load DLL',0
589 diamond 7251
aCannotLoadPlugin       db      'Cannot load plugin',0
474 diamond 7252
aInvalidDLL             db      'File is not found or invalid',0
7253
aMissingExport          db      'Required function is not present',0
7254
aInitFailed             db      'Initialization failed',0
7255
aIncompatibleVersion    db      'Incompatible version',0
7256
aTables                 db      'Tables',0
7257
aSelect                 db      'Select',0
7258
aDeselect               db      'Deselect',0
589 diamond 7259
aCannotOpenFile         db      'Cannot open the file',0
7260
aCannotSetFolder        db      'Cannot enter to folder',0
183 diamond 7261
end if
474 diamond 7262
 
314 diamond 7263
aOk                     db      'OK',0
474 diamond 7264
aNoMemory               db      'No memory!'
7265
nullstr                 db      0
589 diamond 7266
aUntitled               db      'untitled',0
7267
aDotDot                 db      '..',0,0
474 diamond 7268
standard_dll_path:
529 spraid 7269
libini_name             db      '/sys/dll/'
474 diamond 7270
standard_dll_path_size = $ - standard_dll_path
7271
                        db      'libini.obj',0
7272
aStart                  db      'START',0
7273
aLibInit                db      'lib_init',0
7274
aVersion                db      'version',0
7275
aIniGetInt              db      'ini.get_int',0
7276
aIniGetStr              db      'ini.get_str',0
589 diamond 7277
aIniSetInt              db      'ini.set_int',0
517 diamond 7278
aIniEnumKeys            db      'ini.enum_keys',0
589 diamond 7279
aPluginLoad             db      'plugin_load',0
7280
aPluginUnload           db      'plugin_unload',0
7281
aGetattr                db      'getattr',0
7282
aOpen                   db      'open',0
7283
aRead                   db      'read',0
7284
aSetpos                 db      'setpos',0
7285
aClose                  db      'close',0
7286
aOpenFilePlugin         db      'OpenFilePlugin',0
7287
aClosePlugin            db      'ClosePlugin',0
7288
aReadFolder             db      'ReadFolder',0
7289
aSetFolder              db      'SetFolder',0
7290
aGetOpenPluginInfo      db      'GetOpenPluginInfo',0
7291
aGetPanelTitle          db      'GetPanelTitle',0
7292
aGetFiles               db      'GetFiles',0
183 diamond 7293
 
474 diamond 7294
aConfirmations          db      'Confirmations',0
7295
aConfirmDelete          db      'Delete',0
7296
aConfirmDeleteIncomplete db     'DeleteIncomplete',0
7297
 
589 diamond 7298
aPanels                 db      'Panels',0
7299
aLeftViewMode           db      'LeftViewMode',0
7300
aRightViewMode          db      'RightViewMode',0
7301
 
474 diamond 7302
aAssociations           db      'Associations',0
589 diamond 7303
aPlugins                db      'Plugins',0
474 diamond 7304
aMenu                   db      'Menu',0
7305
aFolderShortcuts        db      'FolderShortcuts',0
7306
aShortcut               db      'Shortcut'
7307
.d                      db      '0',0
7308
 
7309
align 4
7310
ini_import:
7311
ini.get_int     dd      aIniGetInt
7312
ini.get_str     dd      aIniGetStr
517 diamond 7313
ini.enum_keys   dd      aIniEnumKeys
589 diamond 7314
ini.set_int     dd      aIniSetInt
474 diamond 7315
                dd      0
7316
 
589 diamond 7317
plugin_exported:
7318
        dd      aPluginUnload
7319
        dd      aGetattr
7320
        dd      aOpen
7321
        dd      aRead
7322
        dd      aSetpos
7323
        dd      aClose
7324
        dd      aOpenFilePlugin
7325
        dd      aClosePlugin
7326
        dd      aReadFolder
7327
        dd      aSetFolder
7328
        dd      aGetOpenPluginInfo
7329
        dd      aGetPanelTitle
7330
        dd      aGetFiles
7331
        dd      0
7332
plugin_exported_default:
7333
        dd      plugin_unload_default
7334
        dd      getattr_default
7335
        dd      open_default
7336
        dd      read
7337
        dd      setpos_default
7338
        dd      close
7339
        dd      OpenFilePlugin_default
7340
        dd      ClosePlugin_default
7341
        dd      ReadFolder_default
7342
        dd      SetFolder_default
7343
        dd      GetOpenPluginInfo_default
7344
        dd      GetPanelTitle_default
7345
        dd      GetFiles_default
7346
 
7347
kfar_info:
7348
        dd      .size
7349
        dd      version_dword
7350
        dd      open
7351
        dd      read
7352
        dd      -1      ; write: to be implemented
7353
        dd      seek
7354
        dd      -1      ; flush: to be implemented
7355
        dd      filesize
7356
        dd      close
7357
        dd      xpgalloc
7358
        dd      xpgrealloc
7359
        dd      pgfree
7360
        dd      getfreemem
7361
        dd      libini_alloc
7362
        dd      libini_realloc
7363
        dd      libini_free
7364
        dd      menu
7365
        dd      menu_centered_in
7366
        dd      DialogBox
7367
        dd      SayErr
7368
        dd      Message
7369
        dd      cur_width
7370
.size = $ - kfar_info
7371
 
7372
plugins         dd      0
7373
num_plugins     dd      0
7374
alloc_plugins   dd      0
7375
 
474 diamond 7376
virtual at 0
589 diamond 7377
PluginInfo:
7378
.unload         dd      ?
7379
.getattr        dd      ?
7380
.open           dd      ?
7381
.read           dd      ?
7382
.setpos         dd      ?
7383
.close          dd      ?
7384
.OpenFilePlugin dd      ?
7385
.ClosePlugin    dd      ?
7386
.ReadFolder     dd      ?
7387
.SetFolder      dd      ?
7388
.GetOpenPluginInfo dd   ?
7389
.GetPanelTitle  dd      ?
7390
.GetFiles       dd      ?
7391
.size = $
7392
end virtual
7393
 
7394
virtual at 0
474 diamond 7395
PanelMode:
7396
; up to 16 columns on one panel
7397
.NumColumns     dd      ?
7398
; available column types:
7399
COLUMN_TYPE_NONE = 0
7400
COLUMN_TYPE_NAME = 1
7401
        COLUMN_NAME_MARK = 10h          ; (reserved)
7402
        COLUMN_NAME_NOPATH = 20h        ; (reserved)
7403
        COLUMN_NAME_RIGHTALIGN = 40h    ; (reserved)
7404
COLUMN_TYPE_SIZE = 2
7405
        COLUMN_SIZE_COMMA = 10h         ; (reserved)
7406
COLUMN_TYPE_PACKED_SIZE = 3             ; (reserved)
7407
COLUMN_TYPE_DATE = 4
7408
COLUMN_TYPE_TIME = 5
7409
COLUMN_TYPE_DATETIME = 6                ; (reserved)
7410
COLUMN_TYPE_DATETIME_CREATION = 7       ; (reserved)
7411
COLUMN_TYPE_DATETIME_ACCESS = 8         ; (reserved)
7412
COLUMN_TYPE_ATTRIBUTES = 9              ; (reserved)
7413
COLUMN_TYPE_DESCRIPTION = 10            ; (reserved)
7414
COLUMN_TYPE_OWNER = 11                  ; (reserved)
7415
COLUMN_TYPE_NUMLINKS = 12               ; (reserved)
7416
COLUMN_TYPE_CUSTOM = 13                 ; (reserved)
7417
.ColumnTypes    rb      16
7418
 
7419
.ColumnWidths   rb      16
7420
.bFullScreen    db      ?               ; (reserved)
7421
.bAlignExtensions db    ?
7422
                rb      2
7423
.size = $
7424
end virtual
7425
 
7426
align 4
7427
column_headers:
7428
        dd      nullstr
7429
        dd      aName
7430
        dd      aSize
7431
        dd      nullstr
7432
        dd      aDate
7433
        dd      aTime
7434
draw_column_proc:
7435
        dd      draw_empty_column
7436
        dd      draw_name_column
7437
        dd      draw_size_column
7438
        dd      -1
7439
        dd      draw_date_column
7440
        dd      draw_time_column
7441
colmodes:
7442
; режим 0 : NM,SC,D
7443
        dd      3
7444
        db      COLUMN_TYPE_NAME+COLUMN_NAME_MARK, COLUMN_TYPE_SIZE+COLUMN_SIZE_COMMA
7445
                db      COLUMN_TYPE_DATE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
7446
        db      0, 10, 8
7447
                times 13 db 0
7448
        db      0, 1
7449
                times 2 db 0
7450
; режим 1 : N,N,N
7451
        dd      3
7452
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_NAME, COLUMN_TYPE_NAME
7453
                times 13 db 0
7454
        times 16 db 0
7455
        db      0, 1
7456
                times 2 db 0
7457
; режим 2 : N,N
7458
        dd      2
7459
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_NAME
7460
                times 14 db 0
7461
        times 16 db 0
7462
        db      0, 0
7463
                times 2 db 0
7464
; режим 3 : N,S,D,T
7465
        dd      4
7466
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_SIZE, COLUMN_TYPE_DATE, COLUMN_TYPE_TIME
7467
                times 12 db 0
7468
        db      0, 6, 8, 5
7469
                times 12 db 0
7470
        db      0, 1
7471
                times 2 db 0
7472
; режим 4 : N,S
7473
        dd      2
7474
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_SIZE
7475
                times 14 db 0
7476
        db      0, 6
7477
                times 14 db 0
7478
        db      0, 0
7479
                times 2 db 0
7480
; режим 5 : N,S,P,DM,DC,DA,A
7481
; режим 6 : N,Z
7482
; режим 7 : N,S,Z
7483
; режим 8 : N,S,O
7484
; режим 9 : N,S,LN
7485
 
180 heavyiron 7486
execinfo:
7487
        dd      7
7488
        dd      0
7489
execparams dd   0
7490
        dd      0
7491
        dd      0
7492
        db      0
7493
execptr dd      ?
7494
 
7495
IncludeIGlobals
7496
 
7497
i_end:
7498
 
7499
IncludeUGlobals
7500
 
7501
execdata rb     1024
321 diamond 7502
execdataend:
180 heavyiron 7503
        align   4
7504
attrinfo.attr   rb      40
7505
 
7506
panel1_data:
7507
panel1_left     dd      ?
7508
panel1_top      dd      ?
7509
panel1_width    dd      ?
7510
panel1_height   dd      ?
7511
panel1_index    dd      ?
7512
panel1_start    dd      ?
7513
panel1_colsz    dd      ?
7514
panel1_colst    dd      ?
7515
panel1_sortmode db      ?
7516
                rb      3
7517
panel1_nfa      dd      ?
7518
panel1_numfiles dd      ?
7519
panel1_files    dd      ?
589 diamond 7520
panel1_hPlugin  dd      ?
7521
panel1_hFile    dd      ?
7522
panel1_parents          dd      ?
7523
panel1_parents_sz       dd      ?
7524
panel1_parents_alloc    dd      ?
7525
panel1_colmode          dd      ?
7526
panel1_colwidths        rd      16+1
7527
panel1_total_num        dd      ?
7528
panel1_total_size       dq      ?
7529
panel1_selected_num     dd      ?
7530
panel1_selected_size    dq      ?
7531
panel1_plugin_info:
7532
panel1_plugin_flags     dd      ?
180 heavyiron 7533
panel1_dir      rb      1024
7534
 
7535
panel2_data:
7536
panel2_left     dd      ?
7537
panel2_top      dd      ?
7538
panel2_width    dd      ?
7539
panel2_height   dd      ?
7540
panel2_index    dd      ?
7541
panel2_start    dd      ?
7542
panel2_colsz    dd      ?
7543
panel2_colst    dd      ?
7544
panel2_sortmode db      ?
7545
                rb      3
7546
panel2_nfa      dd      ?
7547
panel2_numfiles dd      ?
7548
panel2_files    dd      ?
589 diamond 7549
panel2_hPlugin  dd      ?
7550
panel2_hFile    dd      ?
7551
panel2_parents          dd      ?
7552
panel2_parents_sz       dd      ?
7553
panel2_parents_alloc    dd      ?
7554
panel2_colmode          dd      ?
7555
panel2_colwidths        rd      16+1
7556
panel2_total_num        dd      ?
7557
panel2_total_size       dq      ?
7558
panel2_selected_num     dd      ?
7559
panel2_selected_size    dq      ?
7560
panel2_plugin_info:
7561
panel2_plugin_flags     dd      ?
180 heavyiron 7562
panel2_dir      rb      1024
7563
 
283 diamond 7564
;console_data    rb      max_width*max_height*2
180 heavyiron 7565
 
314 diamond 7566
nomem_dlgsavearea       rb      (12+4)*(3+3)*2
7567
 
180 heavyiron 7568
cur_header      rb      max_width
7569
tmp             dd      ?
7570
 
7571
skinh           dd      ?
7572
std_colors      rd      10
7573
 
283 diamond 7574
min_y           dd      ?
7575
max_y           dd      ?
7576
min_x           dd      ?
7577
max_x           dd      ?
7578
used_width      dd      ?
7579
used_height     dd      ?
7580
 
314 diamond 7581
wnd_width       dd      ?
7582
wnd_height      dd      ?
7583
 
180 heavyiron 7584
column_left     dd      ?
7585
column_top      dd      ?
7586
column_width    dd      ?
7587
column_height   dd      ?
7588
column_index    dd      ?
474 diamond 7589
last_column_index dd    ?
180 heavyiron 7590
 
7591
scrpos          dq      ?
7592
viewer_right_side dq    ?
7593
 
7594
saved_file_name:
7595
procinfo        rb      1024
283 diamond 7596
lower_file_name = procinfo + 512
180 heavyiron 7597
 
474 diamond 7598
app_path        rb      1100
7599
 
314 diamond 7600
error_msg       rb      128
7601
 
7602
prev_dir        rb      1024
7603
 
180 heavyiron 7604
driveinfo       rb      32+304
7605
tmpname         rb      32
7606
 
7607
screens         dd      ?
7608
num_screens     dd      ?
7609
active_screen_vtable dd ?
7610
active_screen_data dd   ?
7611
 
589 diamond 7612
default_attr    dd      ?
7613
left_dotdot_entry       rb      40+3    ; 40 bytes for attributes + '..'
7614
right_dotdot_entry      rb      40+3
7615
 
183 diamond 7616
aConfirmDeleteTextBuf   rb      aConfirmDeleteTextMax + 1
283 diamond 7617
CopySourceTextBuf       rb      512
7618
CopyDestEditBuf         rb      12+512+1
321 diamond 7619
.length = $ - CopyDestEditBuf - 13
183 diamond 7620
 
474 diamond 7621
enter_string_buf        rb      12+512+1
7622
 
7623
bMemForImageValidData   db      ?
7624
 
283 diamond 7625
align 4
474 diamond 7626
tolower_table   rb      256
283 diamond 7627
layout          rb      128
7628
 
517 diamond 7629
copy_buffer_size = 65536
283 diamond 7630
copy_buffer     rb      copy_buffer_size
7631
 
589 diamond 7632
filedata_buffer_size = 1024
7633
filedata_buffer rb      filedata_buffer_size
7634
 
7635
source_hModule  dd      ?
7636
source_hPlugin  dd      ?
7637
source_hFile    dd      ?
474 diamond 7638
; data for directory delete
7639
; If directory nested level is >1024, then its full name is too big,
7640
; so we see the overflow when creating full name (we check for this!)
7641
del_dir_stack   rd      1024
7642
del_dir_stack_ptr dd    ?
7643
del_dir_query_size = 32
7644
del_dir_query_area rb   32+304*del_dir_query_size
7645
 
517 diamond 7646
label copy_dir_stack dword at del_dir_stack
7647
label copy_dir_stack_ptr dword at del_dir_stack_ptr
7648
copy_dir_query_size = del_dir_query_size
7649
copy_dir_query_area = del_dir_query_area
7650
del_bSkipAll    db      ?       ; for directory errors
7651
label copy_bSkipAll byte at del_bSkipAll
7652
copy_bSkipAll2  db      ?       ; for file read/write errors
589 diamond 7653
copy_bSkipAll3  db      ?       ; for SetFolder errors
517 diamond 7654
 
7655
bEndSlash       db      ?
7656
bDestIsFolder   db      ?
7657
bNeedRestoreName db     ?
7658
 
180 heavyiron 7659
; stack
183 diamond 7660
        align   4
589 diamond 7661
        rb      32768
180 heavyiron 7662
stacktop:
7663
 
7664
mem: