Subversion Repositories Kolibri OS

Rev

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