Subversion Repositories Kolibri OS

Rev

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