Subversion Repositories Kolibri OS

Rev

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

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