Subversion Repositories Kolibri OS

Rev

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