Subversion Repositories Kolibri OS

Rev

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