Subversion Repositories Kolibri OS

Rev

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