Subversion Repositories Kolibri OS

Rev

Rev 9066 | Details | Compare with Previous | Last modification | View Log | RSS feed

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