Subversion Repositories Kolibri OS

Rev

Rev 9039 | Rev 9066 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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