Subversion Repositories Kolibri OS

Rev

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