Subversion Repositories Kolibri OS

Rev

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