Subversion Repositories Kolibri OS

Rev

Rev 474 | Rev 517 | 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
 
10
include 'lang.inc'
485 heavyiron 11
include '..\..\..\macros.inc'
180 heavyiron 12
include 'font.inc'
13
include 'sort.inc'
14
include 'kglobals.inc'
15
include 'dialogs.inc'
16
include 'viewer.inc'
314 diamond 17
include 'tools.inc'
474 diamond 18
include 'filetool.inc'
180 heavyiron 19
 
20
start:
474 diamond 21
        mov     edi, tolower_table
22
        push    'A'
23
        pop     ecx
24
        xor     eax, eax
25
@@:
26
        stosb
27
        inc     eax
28
        loop    @b
29
        add     al, 0x20
30
        mov     cl, 'Z'-'A'+1
31
@@:
32
        stosb
33
        inc     eax
34
        loop    @b
35
        sub     al, 0x20
36
        mov     cl, 'А'-'Z'-1
37
@@:
38
        stosb
39
        inc     eax
40
        loop    @b
41
        add     al, 0x20
42
        mov     cl, 'Р'-'А'
43
@@:
44
        stosb
45
        inc     eax
46
        loop    @b
47
        add     al, 0x30
48
        mov     cl, 'Я'-'Р'+1
49
@@:
50
        stosb
51
        inc     eax
52
        loop    @b
53
        sub     al, 0x50
54
        mov     cl, 256-'Я'-1
55
@@:
56
        stosb
57
        inc     eax
58
        loop    @b
59
        mov     byte [edi-256+'Ё'], 'ё'
60
        push    68
61
        pop     eax
62
        push    11
63
        pop     ebx
485 heavyiron 64
        mcall
283 diamond 65
        call    init_console
180 heavyiron 66
        call    draw_window
67
        push    66
68
        pop     eax
69
        push    1
70
        pop     ebx
71
        mov     ecx, ebx
485 heavyiron 72
        mcall     ; set keyboard mode to scancodes
283 diamond 73
        mov     eax, 200
180 heavyiron 74
        mov     [panel1_nfa], eax
75
        mov     [panel2_nfa], eax
474 diamond 76
        mov     ecx, 200*4 + 32 + 200*304
77
        call    pgalloc
283 diamond 78
        mov     [panel1_files], eax
474 diamond 79
        call    pgalloc
283 diamond 80
        mov     [panel2_files], eax
81
        test    eax, eax
82
        jz      exit
83
        cmp     [panel1_files], eax
84
        jz      exit
180 heavyiron 85
        mov     [panel1_sortmode], 0    ; sort by name
86
        mov     [panel2_sortmode], 0
474 diamond 87
        push    2                       ; "средний" формат
88
        pop     eax
89
        mov     [panel1_colmode], eax
90
        mov     [panel2_colmode], eax
180 heavyiron 91
        mov     [num_screens], 1
474 diamond 92
        mov     ecx, 0x1000
93
        call    pgalloc
180 heavyiron 94
        mov     [screens], eax
314 diamond 95
        test    eax, eax
96
        jz      exit
180 heavyiron 97
        mov     ecx, panels_vtable
98
        mov     [eax], ecx
99
        mov     [active_screen_vtable], ecx
474 diamond 100
; load libini.obj and kfar.ini
101
        mov     eax, libini_name
102
        mov     esi, ini_import
103
        push    2
104
        pop     ebp     ; we use version 2 of libini
105
        call    load_dll_and_import
106
        test    eax, eax
107
        jnz     .noini
108
        mov     edi, app_path
109
        or      ecx, -1
110
        repnz   scasb
111
        mov     dword [edi-1], '.ini'
112
        mov     byte [edi+3], 0
113
        push    1
114
        push    dword aConfirmDelete
115
        push    dword aConfirmations
116
        push    dword app_path
117
        call    [ini.get_int]
118
        mov     [bConfirmDelete], al
119
        push    0
120
        push    dword aConfirmDeleteIncomplete
121
        push    dword aConfirmations
122
        push    dword app_path
123
        call    [ini.get_int]
124
        mov     [bConfirmDeleteIncomplete], al
125
        mov     ecx, 0x1000
126
        call    xpgalloc
127
        test    eax, eax
128
        jz      .skip_assoc
129
@@:
130
        mov     edx, eax
131
        push    edx ecx
132
        push    ecx
133
        push    edx
134
        push    dword aAssociations
135
        push    dword app_path
136
        call    [ini.query_sec]
137
        pop     ecx edx
138
        cmp     eax, ecx
139
        jbe     @f
140
        add     ecx, ecx
141
        call    xpgrealloc
142
        test    eax, eax
143
        jz      .skip_assoc
144
        jmp     @b
145
@@:
146
        cmp     ecx, 0x1000
147
        jbe     @f
148
        mov     ecx, eax
149
        call    xpgrealloc      ; must succeed, because we decrease size
150
        mov     edx, eax
151
@@:
152
        mov     [associations], edx
153
        xor     ebp, ebp
154
        xor     esi, esi
155
.skip_assoc:
156
        mov     edi, saved_file_name
157
        push    dword nullstr
158
        push    512
159
        push    edi
160
        push    dword aShortcut
161
        push    dword aFolderShortcuts
162
        push    dword app_path
163
        call    [ini.get_str]
164
        cmp     byte [edi], 0
165
        jz      .shortcut_cont
166
        or      ecx, -1
167
        xor     eax, eax
168
        repnz   scasb
169
        not     ecx
170
        cmp     ecx, 2
171
        jz      @f
172
        cmp     byte [edi-2], '/'
173
        jnz     @f
174
        mov     byte [edi-2], 0
175
        dec     ecx
176
@@:
177
        mov     al, [aShortcut.d]
178
        push    esi
179
        inc     esi
180
        mov     [FolderShortcuts+(eax-'0')*4], esi
181
        lea     esi, [esi+ecx-1]
182
        push    esi
183
        and     esi, 0xFFF
184
        cmp     esi, ecx
185
        pop     esi
186
        ja      .norealloc
187
        mov     edx, ebp
188
        mov     ecx, esi
189
        call    xpgrealloc
190
        test    eax, eax
191
        jnz     @f
192
        mov     edi, FolderShortcuts
193
        mov     ecx, 10
194
        rep     stosd
195
        jmp     .skip_shortcuts
196
@@:
197
        mov     ebp, eax
198
.norealloc:
199
        pop     edi
200
        add     edi, ebp
201
        mov     ecx, saved_file_name
202
@@:
203
        mov     al, [ecx]
204
        inc     ecx
205
        stosb
206
        test    al, al
207
        jnz     @b
208
.shortcut_cont:
209
        inc     [aShortcut.d]
210
        cmp     [aShortcut.d], '9'
211
        jbe     .skip_assoc
212
        mov     esi, FolderShortcuts
213
        mov     ecx, 10
214
        dec     ebp
215
.l3:
216
        lodsd
217
        test    eax, eax
218
        jz      @f
219
        add     [esi-4], ebp
220
@@:
221
        loop    .l3
222
.skip_shortcuts:
223
.noini:
224
        mov     esi, def_left_dir
225
        mov     edi, panel1_dir
226
@@:
227
        lodsb
228
        stosb
229
        test    al, al
230
        jnz     @b
231
        mov     esi, def_right_dir
232
        mov     edi, panel2_dir
233
@@:
234
        lodsb
235
        stosb
236
        test    al, al
237
        jnz     @b
180 heavyiron 238
        call    draw_keybar
239
        call    draw_cmdbar
314 diamond 240
        mov     [prev_dir], 0
180 heavyiron 241
        mov     ebp, panel1_data
474 diamond 242
        call    calc_colwidths
180 heavyiron 243
        call    read_folder
244
        call    draw_panel
314 diamond 245
        mov     [bSilentFolderMode], 1
180 heavyiron 246
        mov     ebp, panel2_data
474 diamond 247
        call    calc_colwidths
180 heavyiron 248
        call    read_folder
249
        call    draw_panel
250
event:
251
        push    10
252
        pop     eax
485 heavyiron 253
        mcall
180 heavyiron 254
        dec     eax
255
        jz      redraw
256
        dec     eax
257
        jz      key
258
; button - we have only one button, close
259
exit:
260
        or      eax, -1
485 heavyiron 261
        mcall
180 heavyiron 262
redraw:
283 diamond 263
; query kbd state from OS
264
        mov     al, 66
265
        push    3
266
        pop     ebx
485 heavyiron 267
        mcall
283 diamond 268
        and     eax, 0x3F
269
        cmp     al, [ctrlstate]
270
        mov     [ctrlstate], al
271
        jz      @f
272
        call    draw_keybar
273
@@:
180 heavyiron 274
        mov     al, 9
275
        mov     ebx, procinfo
276
        or      ecx, -1
485 heavyiron 277
        mcall
180 heavyiron 278
; test if rolled up
279
; height of rolled up window is [skinh]+3
280
        mov     eax, [ebx+46]
281
        sub     eax, [skinh]
282
        cmp     eax, 5
283
        ja      @f
284
        mov     al, 12
285
        push    1
286
        pop     ebx
485 heavyiron 287
        mcall
180 heavyiron 288
        xor     eax, eax
289
; ebx, ecx, edi are ignored by function 0 after first redraw
314 diamond 290
        mov     edx, 0x53000000
485 heavyiron 291
        mcall
180 heavyiron 292
        mov     al, 12
293
        inc     ebx
485 heavyiron 294
        mcall
180 heavyiron 295
        jmp     event
296
@@:
297
        xor     ecx, ecx
298
        mov     eax, [ebx+42]
314 diamond 299
        mov     [wnd_width], eax
283 diamond 300
        sub     eax, 5*2-1
180 heavyiron 301
        jae     @f
302
        xor     eax, eax
303
@@:
304
        cdq
305
        mov     esi, font_width
306
        div     esi
307
        cmp     eax, 54
308
        jae     @f
309
        mov     al, 54
310
        mov     ch, 1
311
@@:
312
        cmp     eax, 255
313
        jbe     @f
314
        mov     eax, 255
315
        mov     ch, 1
316
@@:
317
        cmp     eax, [cur_width]
318
        mov     [cur_width], eax
319
        setnz   cl
320
        or      cl, ch
321
        test    edx, edx
314 diamond 322
        mov     [fill_width], edx
180 heavyiron 323
        setnz   ch
324
        mov     eax, [ebx+46]
314 diamond 325
        mov     [wnd_height], eax
180 heavyiron 326
        sub     eax, [skinh]
283 diamond 327
        sub     eax, 5-1
180 heavyiron 328
        jns     @f
329
        xor     eax, eax
330
@@:
331
        cdq
332
        mov     esi, font_height
333
        div     esi
334
        cmp     eax, 8
335
        jae     @f
336
        mov     al, 8
337
        mov     cl, 1
338
@@:
339
        cmp     eax, 255
340
        jbe     @f
341
        mov     eax, 255
342
        mov     cl, 1
343
@@:
314 diamond 344
        mov     [fill_height], edx
180 heavyiron 345
        cmp     eax, [cur_height]
346
        mov     [cur_height], eax
283 diamond 347
        jnz     .resize
348
        test    cl, cl
349
        jnz     .resize
350
        test    edx, edx
351
        setnz   cl
180 heavyiron 352
        or      cl, ch
353
        jz      @f
283 diamond 354
        test    byte [ebx+70], 1
355
        jnz     @f
356
.resize:
180 heavyiron 357
        push    67
358
        pop     eax
359
        or      ebx, -1
360
        or      ecx, -1
361
        mov     edx, [cur_width]
362
        imul    edx, font_width
283 diamond 363
        add     edx, 5*2-1
180 heavyiron 364
        mov     esi, [cur_height]
365
        imul    esi, font_height
366
        add     esi, [skinh]
283 diamond 367
        add     esi, 5-1
485 heavyiron 368
        mcall
283 diamond 369
.resize_draw:
474 diamond 370
        mov     ecx, [MemForImage]
371
        call    pgfree
372
        and     [MemForImage], 0
283 diamond 373
        call    init_console
374
;        call    draw_window
180 heavyiron 375
        call    draw_keybar
376
        mov     ebp, [active_screen_data]
377
        mov     eax, [active_screen_vtable]
378
        call    dword [eax+screen_vtable.OnRedraw]
379
        jmp     event
380
@@:
381
        call    draw_window
382
        jmp     event
283 diamond 383
alt_f9:
384
        cmp     [saved_width], -1
385
        jz      @f
386
        mov     eax, [saved_width]
387
        mov     [cur_width], eax
388
        or      [saved_width], -1
389
        mov     eax, [saved_height]
390
        mov     [cur_height], eax
391
        or      [saved_height], -1
392
        jmp     redraw.resize
393
@@:
394
        push    48
395
        pop     eax
396
        push    5
397
        pop     ebx
485 heavyiron 398
        mcall
283 diamond 399
        push    eax
400
        sub     eax, [esp+2]
401
        inc     eax
402
        movzx   eax, ax
403
        sub     eax, 10
404
        xor     edx, edx
405
        mov     ecx, font_width
406
        div     ecx
407
        xchg    [cur_width], eax
408
        mov     [saved_width], eax
409
        mov     eax, ebx
410
        shr     ebx, 16
411
        sub     eax, ebx
412
        sub     eax, 5-1
413
        sub     eax, [skinh]
414
        xor     edx, edx
415
        mov     ecx, font_height
416
        div     ecx
417
        xchg    [cur_height], eax
418
        mov     [saved_height], eax
419
        mov     ecx, ebx
420
        pop     ebx
421
        shr     ebx, 16
422
        mov     edx, [cur_width]
423
        imul    edx, font_width
424
        add     edx, 5*2-1
425
        mov     esi, [cur_height]
426
        imul    esi, font_height
427
        add     esi, [skinh]
428
        add     esi, 4
429
        push    67
430
        pop     eax
485 heavyiron 431
        mcall
283 diamond 432
        jmp     redraw.resize_draw
180 heavyiron 433
key:
434
        mov     al, 2
485 heavyiron 435
        mcall
180 heavyiron 436
        test    al, al
437
        jnz     event
438
        xchg    al, ah
439
        cmp     al, 0xE0
440
        jnz     @f
441
        mov     [bWasE0], 1
442
        jmp     event
443
@@:
444
        xchg    ah, [bWasE0]
445
        mov     ebp, [active_screen_data]
446
        mov     edx, [active_screen_vtable]
447
        cmp     al, 0x1D
448
        jz      .ctrl_down
449
        cmp     al, 0x9D
450
        jz      .ctrl_up
451
        cmp     al, 0x2A
452
        jz      .lshift_down
453
        cmp     al, 0xAA
454
        jz      .lshift_up
455
        cmp     al, 0x36
456
        jz      .rshift_down
457
        cmp     al, 0xB6
458
        jz      .rshift_up
459
        cmp     al, 0x38
460
        jz      .alt_down
461
        cmp     al, 0xB8
462
        jz      .alt_up
463
        call    [edx+screen_vtable.OnKey]
464
        jmp     event
465
.ctrl_down:
466
        test    ah, ah
467
        jnz     .rctrl_down
468
        or      [ctrlstate], 4
469
        jmp     .keybar
470
.rctrl_down:
471
        or      [ctrlstate], 8
472
        jmp     .keybar
473
.ctrl_up:
474
        test    ah, ah
475
        jnz     .rctrl_up
476
        and     [ctrlstate], not 4
477
        jmp     .keybar
478
.rctrl_up:
479
        and     [ctrlstate], not 8
480
.keybar:
481
        call    draw_keybar
482
        call    draw_image
483
@@:     jmp     event
484
.lshift_down:
485
; ignore E0 2A sequence
486
; e.g. arrow keys with NumLock on generate sequence E0 2A E0 xx / E0 xx+80 E0 AA
487
; where xx is scancode, so we can safely ignore E0 2A
488
        test    ah, ah
489
        jnz     @b
490
        or      [ctrlstate], 1
491
        jmp     .keybar
492
.lshift_up:
493
; ignore E0 AA sequence
494
        test    ah, ah
495
        jnz     @b
496
        and     [ctrlstate], not 1
497
        jmp     .keybar
498
.rshift_down:
499
        or      [ctrlstate], 2
500
        jmp     .keybar
501
.rshift_up:
502
        and     [ctrlstate], not 2
503
        jmp     .keybar
504
.alt_down:
505
        test    ah, ah
506
        jnz     .ralt_down
507
        or      [ctrlstate], 0x10
508
        jmp     .keybar
509
.ralt_down:
510
        or      [ctrlstate], 0x20
511
        jmp     .keybar
512
.alt_up:
513
        test    ah, ah
514
        jnz     .ralt_up
515
        and     [ctrlstate], not 0x10
516
        jmp     .keybar
517
.ralt_up:
518
        and     [ctrlstate], not 0x20
519
        jmp     .keybar
520
 
521
process_ctrl_keys:
522
        cmp     byte [esi], 0
523
        jz      .done
524
        push    ecx
525
        cmp     al, [esi]
526
        jz      .check
527
.cont:
528
        pop     ecx
529
        add     esi, 8
530
        jmp     process_ctrl_keys
531
.done:
532
        stc
533
        ret
534
.check:
535
        mov     cl, 0
536
        call    .check_ctrlkey
537
        jc      .cont
538
        mov     cl, 2
539
        call    .check_ctrlkey
540
        jc      .cont
541
        mov     cl, 4
542
        call    .check_ctrlkey
543
        jc      .cont
544
        pop     ecx
545
        call    dword [esi+4]
546
        clc
547
        ret
548
.check_ctrlkey:
549
        push    eax edx
550
        movzx   edx, [ctrlstate]
551
        shr     edx, cl
552
        add     cl, cl
553
        movzx   eax, word [esi+2]
554
        shr     eax, cl
555
        and     eax, 15
556
        cmp     al, ctrlkey_tests_num
557
        jae     .fail
558
        xchg    eax, edx
559
        and     al, 3
560
        call    [ctrlkey_tests + edx*4]
561
        cmp     al, 1
562
        pop     edx eax
563
        ret
564
.fail:
565
        stc
566
        pop     edx eax
567
        ret
568
 
569
ctrlkey_test0:
570
        test    al, al
571
        setz    al
572
        ret
573
ctrlkey_test1:
574
        test    al, al
575
        setnp   al
576
        ret
577
ctrlkey_test2:
578
        cmp     al, 3
579
        setz    al
580
        ret
581
ctrlkey_test3:
582
        cmp     al, 1
583
        setz    al
584
        ret
585
ctrlkey_test4:
586
        cmp     al, 2
587
        setz    al
588
        ret
589
 
590
new_screen:
474 diamond 591
; in: ecx=sizeof(screen data), edx->vtable
592
; out: ebp=pointer or NULL, eax!=0 if successful
593
; destroys ebx,ecx
594
        call    xpgalloc
180 heavyiron 595
        test    eax, eax
596
        jnz     @f
597
        ret
598
@@:
599
        mov     ebp, eax
600
        mov     eax, [screens]
474 diamond 601
        mov     ecx, [num_screens]
602
        inc     ecx
603
        shl     ecx, 3
604
        test    ecx, 0xFFF
605
        jnz     .norealloc
606
        push    edx
607
        mov     edx, eax
608
        call    xpgrealloc
609
        pop     edx
180 heavyiron 610
        test    eax, eax
611
        jnz     @f
474 diamond 612
        mov     ecx, ebp
613
        call    pgfree
180 heavyiron 614
        xor     eax, eax
615
        ret
616
@@:
617
        mov     [screens], eax
474 diamond 618
.norealloc:
180 heavyiron 619
        inc     [num_screens]
474 diamond 620
        mov     [eax+ecx-8], edx
621
        mov     [eax+ecx-4], ebp
180 heavyiron 622
        mov     eax, [num_screens]
623
        dec     eax
624
        mov     [active_screen], eax
625
        mov     [active_screen_vtable], edx
626
        mov     [active_screen_data], ebp
627
        jmp     draw_keybar
628
 
629
next_screen:
630
        mov     eax, [active_screen]
631
        inc     eax
632
        cmp     eax, [num_screens]
633
        jnz     @f
634
        xor     eax, eax
635
@@:     mov     [active_screen], eax
636
        jmp     change_screen
637
 
638
delete_active_screen:
639
        mov     edi, [screens]
640
        mov     eax, [active_screen]
641
        shl     eax, 3
642
        add     edi, eax
643
        push    dword [edi+4]
644
        lea     esi, [edi+8]
645
        mov     ecx, [num_screens]
646
        sub     ecx, [active_screen]
647
        dec     ecx
648
        add     ecx, ecx
649
        rep     movsd
650
        dec     [num_screens]
474 diamond 651
        mov     ecx, [num_screens]
652
        shl     ecx, 3
653
        test    ecx, 0xFFF
654
        jnz     .norealloc
655
        mov     edx, [screens]
656
        call    pgrealloc               ; must succeed, because we decrease size
657
        mov     [screens], eax
658
.norealloc:
659
        pop     ecx
660
        call    pgfree
180 heavyiron 661
        and     [active_screen], 0
662
 
663
change_screen:
664
        pusha
665
        mov     eax, [active_screen]
666
        mov     esi, [screens]
667
        mov     ebp, [esi+eax*8+4]
668
        mov     eax, [esi+eax*8]
669
        mov     [active_screen_vtable], eax
670
        mov     [active_screen_data], ebp
671
        call    draw_keybar
672
        call    [eax+screen_vtable.OnRedraw]
673
        popa
674
        ret
675
 
676
F12:
677
        mov     eax, [cur_width]
678
        add     eax, 8
679
        mov     esi, eax
680
        mul     [num_screens]
474 diamond 681
        mov     ecx, eax
682
        call    xpgalloc
180 heavyiron 683
        test    eax, eax
684
        jnz     @f
685
        ret
686
@@:
687
        mov     ebx, eax
688
        mov     edi, eax
689
        xor     ecx, ecx
690
.next:
691
        xor     eax, eax
692
        stosd
693
        inc     ecx
694
        cmp     ecx, [num_screens]
695
        jz      @f
696
        lea     eax, [edi+esi-4]
697
        mov     dword [edi-4], eax
698
@@:
699
        xor     eax, eax
700
        stosd
701
        dec     ecx
702
        jz      @f
703
        lea     eax, [edi-8]
704
        sub     eax, esi
705
        mov     dword [edi-4], eax
706
@@:
707
        mov     al, '&'
708
        stosb
709
        cmp     ecx, 36
710
        jae     .noletter
711
        lea     eax, [ecx+'0']
712
        cmp     al, '9'
713
        jbe     @f
714
        add     al, 7
715
@@:
716
        stosb
717
        mov     al, '.'
718
        stosb
719
        jmp     .letter_done
720
.noletter:
721
        mov     al, ' '
722
        stosb
723
        stosb
724
.letter_done:
725
        mov     al, ' '
726
        stosb
727
        pushad
728
        mov     eax, [screens]
729
        mov     ebp, [eax+ecx*8+4]
730
        mov     eax, [eax+ecx*8]
731
        mov     ecx, [cur_width]
732
        sub     ecx, 12
733
        call    [eax + screen_vtable.getname]
734
        popad
735
        sub     edi, 4
736
        add     edi, [cur_width]
737
        inc     ecx
738
        cmp     ecx, [num_screens]
739
        jb      .next
740
        mov     eax, [active_screen]
741
        mul     esi
742
        add     eax, ebx
743
        push    1
474 diamond 744
        push    dword aScreens
180 heavyiron 745
        push    eax
746
        call    menu
747
        cmp     eax, -1
748
        jz      @f
749
        sub     eax, ebx
750
        div     esi
751
        mov     [active_screen], eax
752
@@:
474 diamond 753
        mov     ecx, ebx
754
        call    pgfree
180 heavyiron 755
        jmp     change_screen
756
 
757
panels_OnKey:
758
        mov     ebp, [active_panel]
759
        mov     ecx, [ebp + panel1_index - panel1_data]
760
        mov     edx, [ebp + panel1_start - panel1_data]
761
        mov     ebx, [ebp + panel1_colst - panel1_data]
762
        add     ebx, edx
763
        mov     esi, panels_ctrlkeys
764
        jmp     process_ctrl_keys
765
.ret:
766
        ret
767
.up:
768
        jecxz   .ret
769
        dec     ecx
770
        mov     [ebp + panel1_index - panel1_data], ecx
771
        cmp     ecx, edx
772
        jae     .done_redraw
773
        mov     [ebp + panel1_start - panel1_data], ecx
774
.done_redraw:
775
;        call    draw_panel
776
;        ret
777
        jmp     draw_panel
474 diamond 778
.insert:
779
        lea     eax, [ecx*4]
780
        add     eax, [ebp + panel1_files - panel1_data]
781
        mov     eax, [eax]
782
        cmp     word [eax+40], '..'
783
        jnz     @f
784
        cmp     byte [eax+42], 0
785
        jz      .insert.down
786
@@:
787
        xor     byte [eax+303], 1
788
        mov     edx, [eax+32]
789
        test    byte [eax+303], 1
790
        mov     eax, [eax+36]
791
        jnz     .insert.increase
792
        sub     dword [ebp + panel1_selected_size - panel1_data], edx
793
        sbb     dword [ebp + panel1_selected_size+4 - panel1_data], eax
794
        dec     [ebp + panel1_selected_num - panel1_data]
795
        jmp     .insert.down
796
.insert.increase:
797
        add     dword [ebp + panel1_selected_size - panel1_data], edx
798
        adc     dword [ebp + panel1_selected_size+4 - panel1_data], eax
799
        inc     [ebp + panel1_selected_num - panel1_data]
800
.insert.down:
801
        inc     ecx
802
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
803
        jae     .done_redraw
804
        jmp     @f
180 heavyiron 805
.down:
806
        inc     ecx
807
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
808
        jae     .ret
474 diamond 809
@@:
180 heavyiron 810
        mov     [ebp + panel1_index - panel1_data], ecx
811
        cmp     ecx, ebx
812
        jb      .done_redraw
813
        sub     ecx, [ebp + panel1_colst - panel1_data]
814
        inc     ecx
815
        mov     [ebp + panel1_start - panel1_data], ecx
816
        jmp     .done_redraw
817
.left:
474 diamond 818
        test    ecx, ecx
819
        jnz     @f
820
        ret
821
@@:
822
        mov     eax, [ebp + panel1_colsz - panel1_data]
823
        sub     ecx, eax
180 heavyiron 824
        jae     @f
825
        xor     ecx, ecx
826
@@:
827
        mov     [ebp + panel1_index - panel1_data], ecx
474 diamond 828
.finalize_left:
180 heavyiron 829
        cmp     ecx, edx
830
        jae     .done_redraw
474 diamond 831
        sub     edx, eax
180 heavyiron 832
        jae     @f
833
        xor     edx, edx
834
@@:
835
        mov     [ebp + panel1_start - panel1_data], edx
836
        jmp     .done_redraw
474 diamond 837
.pgup:
838
        mov     eax, [ebp + panel1_colst - panel1_data]
839
        dec     eax
840
        jnz     @f
841
        inc     eax
842
@@:
843
        test    ecx, ecx
844
        jnz     @f
845
        ret
846
@@:
847
        sub     ecx, eax
848
        jae     @f
849
        xor     ecx, ecx
850
@@:
851
        mov     [ebp + panel1_index - panel1_data], ecx
852
        dec     ecx
853
        jmp     .finalize_left
180 heavyiron 854
.right:
474 diamond 855
        mov     eax, [ebp + panel1_colsz - panel1_data]
856
        add     ecx, eax
180 heavyiron 857
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
858
        jb      @f
859
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
860
        dec     ecx
861
@@:
862
        mov     [ebp + panel1_index - panel1_data], ecx
474 diamond 863
.finalize_right:
180 heavyiron 864
        cmp     ecx, ebx
865
        jb      .done_redraw
474 diamond 866
        add     ebx, eax
180 heavyiron 867
        cmp     ebx, [ebp + panel1_numfiles - panel1_data]
868
        jbe     @f
869
        mov     ebx, [ebp + panel1_numfiles - panel1_data]
870
@@:
871
        sub     ebx, [ebp + panel1_colst - panel1_data]
872
        jae     @f
873
        xor     ebx, ebx
874
@@:
875
        mov     [ebp + panel1_start - panel1_data], ebx
876
        jmp     .done_redraw
474 diamond 877
.pgdn:
878
        mov     eax, [ebp + panel1_colst - panel1_data]
879
        dec     eax
880
        jnz     @f
881
        inc     eax
882
@@:
883
        add     ecx, eax
884
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
885
        jb      @f
886
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
887
        dec     ecx
888
@@:
889
        mov     [ebp + panel1_index - panel1_data], ecx
890
        inc     ecx
891
        jmp     .finalize_right
180 heavyiron 892
.tab:
893
        xor     [active_panel], panel1_data xor panel2_data
894
        call    draw_cmdbar
895
        call    draw_panel
896
        mov     ebp, [active_panel]
897
        jmp     .done_redraw
898
.home:
899
        and     [ebp + panel1_start - panel1_data], 0
900
        and     [ebp + panel1_index - panel1_data], 0
901
        jmp     .done_redraw
902
.end:
903
        mov     eax, [ebp + panel1_numfiles - panel1_data]
904
        dec     eax
905
        mov     [ebp + panel1_index - panel1_data], eax
906
        inc     eax
907
        sub     eax, [ebp + panel1_colst - panel1_data]
908
        jae     @f
909
        xor     eax, eax
910
@@:
911
        mov     [ebp + panel1_start - panel1_data], eax
912
        jmp     .done_redraw
913
.enter:
183 diamond 914
        call    get_curfile_folder_entry
180 heavyiron 915
        test    byte [ecx], 10h
916
        jnz     .enter_folder
283 diamond 917
        call    find_extension
918
        jc      .run_app
180 heavyiron 919
.run_association:
474 diamond 920
        cmp     byte [edi], 0
921
        jz      .l1
922
        cmp     byte [edi], ';'
923
        jnz     @f
924
.l1:
925
        ret
926
@@:
927
        mov     esi, edi
928
@@:
929
        lodsb
930
        test    al, al
931
        jz      @f
932
        cmp     al, ';'
933
        jnz     @b
934
        dec     esi
935
        mov     byte [esi], 0
936
        mov     [restore_semicolon], esi
937
@@:
283 diamond 938
.run_association2:
180 heavyiron 939
        mov     [execparams], execdata
474 diamond 940
        mov     [execptr], edi
180 heavyiron 941
        jmp     .dorun
942
.run_app:
943
        mov     [execptr], execdata
944
        and     [execparams], 0
945
.dorun:
946
        lea     esi, [ebp + panel1_dir - panel1_data]
947
        mov     edi, execdata
948
@@:
949
        lodsb
950
        test    al, al
951
        jz      @f
952
        stosb
321 diamond 953
        cmp     edi, execdataend-1
954
        jae     .bigfilename
180 heavyiron 955
        jmp     @b
956
@@:
957
        lea     esi, [ecx+40]
958
        mov     al, '/'
959
        stosb
960
@@:
961
        lodsb
962
        stosb
321 diamond 963
        cmp     edi, execdataend
964
        ja      .bigfilename
180 heavyiron 965
        test    al, al
966
        jnz     @b
283 diamond 967
; for fasm call - special handling, because
968
; 1) fasm command line convention is different : fasm infile,outfile[,path] rather than tinypad infile
969
; 2) fasm will probably create new file in directory, so we want to reload panel data
970
        xor     edx, edx
971
        cmp     [execparams], edx
972
        jz      .nofasm
474 diamond 973
        mov     esi, [execptr]
974
@@:
975
        lodsb
976
        test    al, al
977
        jnz     @b
978
        mov     eax, [esi-5]
979
        or      eax, 0x20202020
980
        cmp     eax, 'fasm'
283 diamond 981
        jnz     .nofasm
321 diamond 982
        cmp     edi, execdata+(execdataend-execdata)/2
983
        ja      .bigfilename
283 diamond 984
        mov     esi, execdata
985
@@:
986
        lodsb
987
        stosb
988
        test    al, al
989
        jnz     @b
990
        mov     byte [esi-1], ','
991
        inc     edx
992
; output file: no extension if input file has extension, '.bin' otherwise
993
        push    edi
994
@@:
995
        dec     edi
996
        cmp     byte [edi], '.'
997
        jz      .ptfound
998
        cmp     byte [edi], '/'
999
        jnz     @b
1000
        pop     edi
321 diamond 1001
        cmp     edi, execdataend-4
1002
        ja      .bigfilename
283 diamond 1003
        mov     dword [edi-1], '.bin'
1004
        mov     byte [edi+3], 0
1005
        jmp     .nofasm
1006
.ptfound:
1007
        mov     byte [edi], 0
1008
        pop     edi
1009
.nofasm:
321 diamond 1010
        mov     ebx, execinfo
1011
; if command line is more than 256 symbols, the kernel will truncate it
1012
; we does not want this!
1013
; N.B. We know that command line is either NULL or execdata, which is always ASCIIZ string,
1014
;      but can be up to 1023 symbols
1015
        mov     esi, [ebx+8]
1016
        test    esi, esi
1017
        jz      .cmdlinelenok
1018
@@:
1019
        lodsb
1020
        test    al, al
1021
        jnz     @b
1022
        sub     esi, [ebx+8]
1023
        dec     esi
1024
        cmp     esi, 256
1025
        ja      .bigcmdline
1026
.cmdlinelenok:
180 heavyiron 1027
        push    70
1028
        pop     eax
485 heavyiron 1029
        mcall
474 diamond 1030
        xor     esi, esi
1031
        xchg    esi, [restore_semicolon]
1032
        test    esi, esi
1033
        jz      @f
1034
        mov     byte [esi], ';'
1035
@@:
321 diamond 1036
        neg     eax
1037
        js      @f
474 diamond 1038
        push    dword aContinue
321 diamond 1039
        mov     esi, esp
1040
        call    get_error_msg
1041
        push    eax
474 diamond 1042
        push    dword aRunError
321 diamond 1043
        mov     eax, esp
1044
        push    esi
1045
        push    1
1046
        push    eax
1047
        push    2
1048
        push    -1
1049
        push    -1
474 diamond 1050
        push    dword aError
321 diamond 1051
        call    SayErr
1052
        add     esp, 3*4
1053
        ret
1054
@@:
283 diamond 1055
        test    edx, edx
1056
        jz      @f
1057
        push    5
1058
        pop     eax
1059
        push    20
1060
        pop     ebx
485 heavyiron 1061
        mcall
283 diamond 1062
        jmp     .ctrl_r
1063
@@:
180 heavyiron 1064
        ret
321 diamond 1065
.bigfilename3:
1066
        pop     esi
1067
.bigfilename2:
1068
        pop     esi
1069
.bigfilename:
1070
        mov     eax, aFileNameTooBig
474 diamond 1071
.l2:
1072
        xor     esi, esi
1073
        xchg    esi, [restore_semicolon]
1074
        test    esi, esi
1075
        jz      @f
1076
        mov     byte [esi], ';'
321 diamond 1077
@@:
474 diamond 1078
        push    dword aContinue
321 diamond 1079
        mov     esi, esp
1080
        push    eax
1081
        mov     eax, esp
1082
        push    esi
1083
        push    1
1084
        push    eax
1085
        push    1
1086
        push    -1
1087
        push    -1
474 diamond 1088
        push    dword aError
321 diamond 1089
        call    SayErr
1090
        add     esp, 2*4
1091
        ret
1092
.bigcmdline:
1093
        mov     eax, aCmdLineTooBig
474 diamond 1094
        jmp     .l2
321 diamond 1095
.bigfoldername2:
1096
        mov     byte [ecx], 0
1097
.bigfoldername:
1098
        mov     eax, aFolderNameTooBig
474 diamond 1099
        jmp     .l2
321 diamond 1100
.copytoself:
1101
        mov     eax, aCannotCopyToSelf
474 diamond 1102
        jmp     .l2
180 heavyiron 1103
.enter_folder:
1104
        lea     esi, [ecx+40]
1105
        cmp     word [esi], '..'
1106
        jnz     @f
1107
        cmp     byte [esi+2], 0
1108
        jz      .dotdot
1109
@@:
314 diamond 1110
        push    esi
1111
        lea     esi, [ebp + panel1_dir - panel1_data]
1112
        mov     edi, prev_dir
1113
@@:
1114
        lodsb
1115
        stosb
1116
        test    al, al
1117
        jnz     @b
1118
        lea     edi, [esi-1]
321 diamond 1119
        lea     edx, [ebp + panel1_dir - panel1_data + 1024]
1120
        cmp     esi, edx
314 diamond 1121
        pop     esi
321 diamond 1122
        jae     .bigfoldername
1123
        mov     ecx, edi
180 heavyiron 1124
        mov     al, '/'
1125
        cmp     [edi-1], al
1126
        jz      @f
1127
        stosb
1128
@@:
1129
        lodsb
321 diamond 1130
        cmp     edi, edx
1131
        jae     .bigfoldername2
180 heavyiron 1132
        stosb
1133
        test    al, al
1134
        jnz     @b
1135
.reread:
1136
        call    read_folder
1137
.done_cmdbar:
1138
        call    draw_cmdbar
1139
        jmp     .done_redraw
1140
.dotdot:
1141
        lea     edi, [ebp + panel1_dir - panel1_data]
1142
        mov     al, 0
1143
        or      ecx, -1
1144
        repnz   scasb
1145
        dec     edi
1146
        mov     al, '/'
1147
        std
1148
        repnz   scasb
1149
        cld
1150
        inc     edi
1151
        mov     byte [edi], 0
1152
        inc     edi
1153
        push    edi
1154
        call    read_folder
1155
        pop     edi
1156
        mov     edx, [ebp + panel1_files - panel1_data]
1157
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
1158
.scanloop:
1159
        mov     esi, [edx]
321 diamond 1160
        add     esi, 40
180 heavyiron 1161
        push    esi edi
1162
@@:
1163
        lodsb
1164
        call    match_symbol
1165
        jnz     @f
1166
        inc     edi
1167
        test    al, al
1168
        jnz     @b
1169
@@:
1170
        pop     edi esi
1171
        jz      .scanfound
1172
        add     edx, 4
1173
        loop    .scanloop
1174
        jmp     .scandone
1175
.scanfound:
1176
        sub     edx, [ebp + panel1_files - panel1_data]
1177
        shr     edx, 2
1178
        mov     [ebp + panel1_index - panel1_data], edx
1179
        sub     edx, [ebp + panel1_colst - panel1_data]
1180
        jb      .scandone
1181
        inc     edx
1182
        mov     [ebp + panel1_start - panel1_data], edx
1183
.scandone:
1184
        jmp     .done_cmdbar
1185
.ctrl_f39:
1186
        sub     al, 0x3D
1187
        add     al, al
1188
        mov     ah, [ebp + panel1_sortmode - panel1_data]
1189
        and     ah, 0xFE
1190
        cmp     al, ah
1191
        jnz     @f
1192
        and     [ebp + panel1_sortmode - panel1_data], 1
1193
        or      al, [ebp + panel1_sortmode - panel1_data]
1194
        xor     al, 1
1195
@@:
1196
        mov     [ebp + panel1_sortmode - panel1_data], al
1197
        mov     eax, [ebp + panel1_index - panel1_data]
1198
        mov     ecx, [ebp + panel1_files - panel1_data]
1199
        push    dword [ecx+eax*4]
1200
        push    ecx
1201
        call    sort_files
1202
        pop     edi
1203
        pop     eax
1204
        or      ecx, -1
1205
        repnz   scasd
1206
        not     ecx
1207
        dec     ecx
1208
        mov     [ebp + panel1_index - panel1_data], ecx
1209
        sub     ecx, [ebp + panel1_start - panel1_data]
1210
        jb      .less_start
1211
        sub     ecx, [ebp + panel1_colst - panel1_data]
1212
        jae     .gr_end
1213
@@:     jmp     .done_redraw
1214
.less_start:
1215
        add     [ebp + panel1_start - panel1_data], ecx
1216
        jmp     @b
1217
.gr_end:
1218
        inc     ecx
1219
        add     [ebp + panel1_start - panel1_data], ecx
1220
        jmp     @b
1221
.alt_f12:
1222
        mov     ebp, panel1_data
1223
        cmp     al, 0x3B
1224
        jz      @f
1225
        mov     ebp, panel2_data
1226
@@:
1227
; get drives list
1228
        mov     ebx, dirinfo
1229
        mov     [ebx+dirinfo.size-dirinfo], 1
1230
        mov     [ebx+dirinfo.dirdata-dirinfo], driveinfo
1231
        mov     [ebx+dirinfo.name-dirinfo], tmpname
1232
        mov     byte [tmpname], '/'
474 diamond 1233
        xor     edx, edx
180 heavyiron 1234
        xor     ecx, ecx
1235
.drive_loop_e:
1236
        mov     byte [tmpname+1], 0
1237
        push    70
1238
        pop     eax
485 heavyiron 1239
        mcall
180 heavyiron 1240
        mov     ebx, dirinfo
1241
        test    eax, eax
1242
        jnz     .drive_loop_e_done
1243
        mov     esi, driveinfo+32+40
1244
        mov     edi, tmpname+1
1245
@@:
1246
        lodsb
1247
        stosb
1248
        test    al, al
1249
        jnz     @b
1250
        push    [ebx+dirinfo.first-dirinfo]
1251
        and     [ebx+dirinfo.first-dirinfo], 0
1252
.drive_loop_i:
1253
        push    70
1254
        pop     eax
485 heavyiron 1255
        mcall
180 heavyiron 1256
        mov     ebx, dirinfo
1257
        test    eax, eax
1258
        jnz     .drive_loop_i_done
474 diamond 1259
        add     ecx, 32+8
1260
        push    ecx
1261
        and     ecx, 0xFFF
1262
        cmp     ecx, 32+8
1263
        pop     ecx
1264
        ja      @f
1265
        call    xpgrealloc
1266
        mov     edx, eax
180 heavyiron 1267
        test    eax, eax
474 diamond 1268
        jnz     @f
1269
        pop     eax
1270
        ret
180 heavyiron 1271
@@:
474 diamond 1272
        lea     edi, [edx+ecx-32]
180 heavyiron 1273
        mov     esi, tmpname
1274
@@:
1275
        lodsb
1276
        test    al, al
1277
        jz      @f
1278
        stosb
1279
        jmp     @b
1280
@@:
1281
        mov     esi, driveinfo+32+40
1282
        mov     al, '/'
1283
        stosb
1284
@@:
1285
        lodsb
1286
        stosb
1287
        test    al, al
1288
        jnz     @b
1289
        inc     [ebx+dirinfo.first-dirinfo]
1290
        jmp     .drive_loop_i
1291
.drive_loop_i_done:
1292
        pop     [ebx+dirinfo.first-dirinfo]
1293
        inc     [ebx+dirinfo.first-dirinfo]
1294
        jmp     .drive_loop_e
1295
.drive_loop_e_done:
1296
        and     [ebx+dirinfo.first-dirinfo], 0
474 diamond 1297
        mov     edi, edx
1298
        xor     esi, esi
1299
        add     ecx, edx
1300
@@:
1301
        and     dword [edi], 0
1302
        mov     dword [edi+4], esi
1303
        mov     esi, edi
1304
        add     edi, 32+8
1305
        cmp     edi, ecx
1306
        jae     @f
1307
        mov     [esi], edi
1308
        jmp     @b
1309
@@:
1310
        mov     ecx, edx
180 heavyiron 1311
        lea     edi, [ebp + panel1_dir - panel1_data]
1312
.find_cur_drive_loop:
1313
        push    edi
1314
        lea     esi, [ecx+8]
1315
@@:
1316
        lodsb
1317
        test    al, al
1318
        jz      .cur_drive_found
1319
        call    match_symbol
1320
        jnz     @f
1321
        inc     edi
1322
        jmp     @b
1323
@@:
474 diamond 1324
        cmp     dword [ecx], 0
180 heavyiron 1325
        jz      @f
1326
        pop     edi
474 diamond 1327
        mov     ecx, [ecx]
180 heavyiron 1328
        jmp     .find_cur_drive_loop
1329
@@:
474 diamond 1330
        mov     ecx, edx
180 heavyiron 1331
.cur_drive_found:
1332
        pop     edi
1333
        push    1
1334
        push    aDrive
1335
        push    ecx
1336
        mov     eax, [ebp + panel1_height - panel1_data]
1337
        sub     eax, 2
1338
        jae     @f
1339
        add     eax, 2
1340
@@:
1341
        push    eax
1342
        push    [ebp + panel1_width - panel1_data]
1343
        push    [ebp + panel1_top - panel1_data]
1344
        push    [ebp + panel1_left - panel1_data]
1345
        call    menu_centered_in
1346
        cmp     eax, -1
1347
        jz      .ret2
1348
        lea     esi, [eax+8]
1349
        lea     edi, [ebp + panel1_dir - panel1_data]
314 diamond 1350
        push    ecx esi edi
1351
        mov     esi, edi
1352
        mov     edi, prev_dir
1353
        mov     ecx, 1024/4
1354
        rep     movsd
1355
        pop     edi esi ecx
180 heavyiron 1356
@@:
1357
        lodsb
1358
        stosb
1359
        test    al, al
1360
        jnz     @b
474 diamond 1361
        mov     ecx, edx
1362
        call    pgfree
180 heavyiron 1363
        call    read_folder
1364
        jmp     .done_redraw
283 diamond 1365
.shift_f5:
1366
        call    get_curfile_folder_entry
1367
        lea     esi, [ecx+40]
1368
        mov     edi, CopyDestEditBuf
1369
        mov     eax, CopyDestEditBuf.length
1370
        stosd
1371
        scasd
1372
        xor     eax, eax
1373
        stosd
1374
        mov     edx, edi
1375
@@:
1376
        lodsb
1377
        test    al, al
1378
        jz      .f5_common
1379
        stosb
1380
        jmp     @b
1381
.f5:
1382
        mov     edi, CopyDestEditBuf
1383
        mov     eax, CopyDestEditBuf.length
1384
        stosd
1385
        scasd
1386
        xor     eax, eax
1387
        stosd
1388
        mov     edx, edi
1389
        mov     esi, ebp
1390
        xor     esi, panel1_data xor panel2_data
1391
        add     esi, panel1_dir - panel1_data
1392
@@:
1393
        lodsb
1394
        test    al, al
1395
        jz      @f
321 diamond 1396
        cmp     edi, CopyDestEditBuf+12+511
1397
        jae     .bigfoldername
283 diamond 1398
        stosb
1399
        jmp     @b
1400
@@:
1401
        mov     al, '/'
1402
        stosb
1403
.f5_common:
1404
        mov     byte [edi], 0
1405
        sub     edi, edx
1406
        mov     [edx-8], edi
1407
        mov     edi, CopySourceTextBuf
1408
        mov     esi, aCopy1
1409
@@:
1410
        lodsb
1411
        test    al, al
1412
        jz      @f
1413
        stosb
1414
        jmp     @b
1415
@@:
1416
        call    get_curfile_folder_entry
1417
        lea     esi, [ecx+40]
1418
        lea     eax, [esi+1]
1419
@@:
1420
        inc     esi
1421
        cmp     byte [esi-1], 0
1422
        jnz     @b
1423
        sub     esi, eax
1424
        xchg    eax, esi
1425
        dec     esi
1426
        mov     edx, [cur_width]
1427
        sub     edx, 50
1428
        sub     eax, edx
1429
        jbe     @f
1430
        add     esi, eax
1431
        mov     al, '.'
1432
        stosb
1433
        stosb
1434
        stosb
1435
@@:
1436
        lodsb
1437
        test    al, al
1438
        jz      @f
1439
        stosb
1440
        jmp     @b
1441
@@:
1442
        mov     esi, aCopy2
1443
@@:
1444
        lodsb
1445
        stosb
1446
        test    al, al
1447
        jnz     @b
1448
        mov     ebx, copy_dlgdata
1449
        mov     eax, [cur_width]
1450
        sub     eax, 12
1451
        mov     [ebx + dlgtemplate.width], eax
1452
        dec     eax
1453
        dec     eax
1454
        mov     [ebx - copy_dlgdata + copy_dlgdata.width2], eax
1455
        mov     [ebx - copy_dlgdata + copy_dlgdata.width3], eax
1456
        shr     eax, 1
1457
        dec     eax
1458
        dec     eax
1459
        mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x2], eax
1460
        sub     eax, aCopyLength-1
1461
        mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x1], eax
1462
        add     eax, aCopyLength+3
1463
        mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x1], eax
1464
        add     eax, aCancelBLength - 1
1465
        mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x2], eax
1466
        mov     byte [ebx - copy_dlgdata + copy_dlgdata.flags0], 0xC
1467
        and     byte [ebx - copy_dlgdata + copy_dlgdata.flags1], not 4
1468
        and     byte [ebx - copy_dlgdata + copy_dlgdata.flags2], not 4
1469
        push    ebx
1470
        call    DialogBox
1471
        cmp     eax, copy_dlgdata.copy_btn
1472
        jnz     .ret2
1473
; Копируем
1474
        mov     esi, CopyDestEditBuf+12
1475
        mov     edi, esi
1476
        xor     eax, eax
1477
        or      ecx, -1
1478
        repnz   scasb
1479
        dec     edi
1480
        dec     edi
1481
        cmp     edi, esi
1482
        jb      .ret2
1483
        cmp     byte [edi], '/'
1484
        jnz     @f
1485
; Наличие/отсутствие заканчивающего слэша важно только для копирования папок
1486
        cmp     edi, esi
1487
        jz      @f
1488
        mov     byte [edi], 0
1489
        dec     edi
1490
@@:
1491
; Если путь не начинается со слэша, считаем его относительно текущей папки
1492
        cmp     byte [esi], '/'
1493
        jz      .copy_absolute_path
1494
        push    esi
1495
        push    edi
1496
        lea     edi, [ebp + panel1_dir - panel1_data]
1497
        or      ecx, -1
1498
        xor     eax, eax
1499
        repnz   scasb
1500
        not     ecx
1501
        pop     edi
321 diamond 1502
        push    edi
1503
        add     edi, ecx
1504
        cmp     edi, CopyDestEditBuf+12+513
1505
        pop     edi
1506
        jb      @f
1507
        pop     esi
1508
        jmp     .bigfilename
1509
@@:
283 diamond 1510
        lea     edx, [edi+2]
1511
        sub     edx, esi
1512
        lea     edi, [edi+ecx+1]
1513
        xchg    ecx, edx
1514
        std
1515
        lea     esi, [esi+ecx-1]
1516
        rep     movsb
1517
        cld
1518
        pop     edi
1519
        lea     esi, [ebp + panel1_dir - panel1_data]
1520
        push    edi
1521
        mov     ecx, edx
1522
        rep     movsb
1523
        mov     byte [edi-1], '/'
1524
        pop     esi
1525
.copy_absolute_path:
1526
; Получаем атрибуты назначения
1527
        mov     cl, 0x10
1528
        xor     eax, eax
1529
        mov     edi, esi
1530
.countslashloop:
1531
        cmp     byte [edi], '/'
1532
        jnz     @f
1533
        inc     eax
1534
@@:
1535
        inc     edi
1536
        cmp     byte [edi], 0
1537
        jnz     .countslashloop
1538
        cmp     eax, 2
1539
        jbe     @f
1540
        mov     ebx, attrinfo
1541
        mov     [attrinfo.attr], 0
1542
        mov     [ebx + attrinfo.name - attrinfo], esi
1543
        push    70
1544
        pop     eax
485 heavyiron 1545
        mcall
283 diamond 1546
        mov     cl, byte [attrinfo.attr]
1547
@@:
1548
        test    cl, 0x10
1549
        jz      .copyfile
1550
; Нам подсунули каталог назначения, дописываем имя файла
321 diamond 1551
        cmp     edi, CopyDestEditBuf+12+513
1552
        jae     .bigfilename
283 diamond 1553
        mov     al, '/'
1554
        stosb
1555
        push    esi
1556
        call    get_curfile_folder_entry
1557
        lea     esi, [ecx+40]
1558
@@:
1559
        lodsb
321 diamond 1560
        cmp     edi, CopyDestEditBuf+12+513
1561
        jae     .bigfilename2
283 diamond 1562
        stosb
1563
        test    al, al
1564
        jnz     @b
1565
        pop     esi
1566
.copyfile:
1567
; Имя исходного файла
1568
        push    esi
1569
        lea     esi, [ebp+panel1_dir-panel1_data]
1570
        mov     edi, saved_file_name
1571
        push    edi
1572
@@:
1573
        lodsb
1574
        test    al, al
1575
        jz      @f
1576
        stosb
1577
        jmp     @b
1578
@@:
1579
        mov     al, '/'
1580
        stosb
1581
        call    get_curfile_folder_entry
1582
        lea     esi, [ecx+40]
1583
@@:
1584
        lodsb
321 diamond 1585
        cmp     edi, saved_file_name+1024
1586
        jae     .bigfilename3
283 diamond 1587
        stosb
1588
        test    al, al
1589
        jnz     @b
1590
        pop     esi
1591
        pop     edi
1592
; Нельзя скопировать файл поверх самого себя!
1593
        push    esi edi
1594
        call    strcmpi
1595
        pop     edi esi
321 diamond 1596
        jz      .copytoself
283 diamond 1597
; Собственно, копируем
1598
; esi->source name, edi->destination name
1599
        mov     [writeinfo.code], 2
1600
        mov     [writeinfo.name], edi
1601
        and     dword [writeinfo.first], 0
1602
        and     dword [writeinfo.first+4], 0
1603
        mov     [writeinfo.data], copy_buffer
1604
        mov     ebx, readinfo
1605
        and     dword [ebx+readinfo.first-readinfo], 0
1606
        and     dword [ebx+readinfo.first+4-readinfo], 0
1607
        mov     [ebx+readinfo.size-readinfo], copy_buffer_size
1608
        mov     [ebx+readinfo.data-readinfo], copy_buffer
1609
        mov     [ebx+readinfo.name-readinfo], esi
1610
.copyloop:
1611
        mov     ebx, readinfo
1612
        push    70
1613
        pop     eax
485 heavyiron 1614
        mcall
321 diamond 1615
        test    eax, eax
1616
        jz      .copyreadok
1617
        cmp     eax, 6
1618
        jz      .copyreadok
1619
        push    esi
474 diamond 1620
        push    dword aCannotReadFile
321 diamond 1621
        call    get_error_msg
1622
        push    eax
1623
        mov     eax, esp
474 diamond 1624
        push    dword RetryOrCancelBtn
321 diamond 1625
        push    2
1626
        push    eax
1627
        push    3
1628
        push    -1
1629
        push    -1
474 diamond 1630
        push    dword aError
321 diamond 1631
        call    SayErr
1632
        add     esp, 3*4
1633
        test    eax, eax
1634
        jz      .copyloop
1635
        jmp     .copyfailed
1636
.copyreadok:
283 diamond 1637
        test    ebx, ebx
1638
        jz      .copydone
1639
        add     dword [readinfo.first], ebx
1640
        adc     dword [readinfo.first+4], 0
1641
        mov     [writeinfo.size], ebx
321 diamond 1642
.copywrite:
283 diamond 1643
        mov     ebx, writeinfo
1644
        push    70
1645
        pop     eax
485 heavyiron 1646
        mcall
321 diamond 1647
        test    eax, eax
1648
        jz      .copywriteok
1649
        push    edi
474 diamond 1650
        push    dword aCannotWriteFile
321 diamond 1651
        call    get_error_msg
1652
        push    eax
1653
        mov     eax, esp
474 diamond 1654
        push    dword RetryOrCancelBtn
321 diamond 1655
        push    2
1656
        push    eax
1657
        push    3
1658
        push    -1
1659
        push    -1
474 diamond 1660
        push    dword aError
321 diamond 1661
        call    SayErr
1662
        add     esp, 3*4
1663
        test    eax, eax
1664
        jz      .copywrite
1665
        jmp     .copyfailed
1666
.copywriteok:
283 diamond 1667
        mov     ecx, [writeinfo.size]
1668
        add     dword [writeinfo.first], ecx
1669
        adc     dword [writeinfo.first+4], 0
1670
        mov     [writeinfo.code], 3
1671
        cmp     ecx, copy_buffer_size
1672
        jz      .copyloop
1673
.copydone:
1674
        push    ebp
1675
        call    .ctrl_r
1676
        pop     ebp
1677
        xor     ebp, panel1_data xor panel2_data
1678
        jmp     .ctrl_r
321 diamond 1679
.copyfailed:
1680
        cmp     [bConfirmDeleteIncomplete], 0
1681
        jz      @f
1682
        cmp     [writeinfo.code], 2
1683
        jz      .copydone
474 diamond 1684
        push    dword aIncompleteFile
321 diamond 1685
        mov     eax, esp
474 diamond 1686
        push    dword DeleteOrKeepBtn
321 diamond 1687
        push    2
1688
        push    eax
1689
        push    1
1690
        push    -1
1691
        push    -1
474 diamond 1692
        push    dword aCopyCaption
321 diamond 1693
        call    SayErr
1694
        add     esp, 4
1695
        test    eax, eax
1696
        jnz     .copydone
1697
@@:
1698
        mov     ebx, delinfo
1699
        push    dword [ebx+21]
1700
        mov     dword [ebx+21], edi
1701
        push    70
1702
        pop     eax
485 heavyiron 1703
        mcall
321 diamond 1704
; ignore errors
1705
        pop     dword [delinfo+21]
1706
        jmp     .copydone
283 diamond 1707
 
180 heavyiron 1708
.f3:
1709
        call    view_file
1710
.ret2:
1711
        ret
474 diamond 1712
.f8_has_selected:
1713
        mov     edi, saved_file_name+511
1714
        mov     byte [edi], 0
1715
        mov     eax, [ebp + panel1_selected_num - panel1_data]
1716
if lang eq ru
1717
        cmp     eax, 1
1718
        jz      @f
1719
        dec     edi
1720
        mov     byte [edi], 'а'
1721
        cmp     eax, 4
1722
        jbe     @f
1723
        dec     edi
1724
        mov     word [edi], 'ов'
1725
@@:
1726
        mov     dword [edi-4], 'мент'
1727
        mov     dword [edi-8], ' эле'
1728
        sub     edi, 8
1729
else
1730
        cmp     eax, 1
1731
        jz      @f
1732
        dec     edi
1733
        mov     byte [edi], 's'
1734
@@:
1735
        mov     dword [edi-4], 'item'
1736
        mov     byte [edi-5], ' '
1737
        sub     edi, 5
1738
end if
1739
        xor     edx, edx
1740
        push    10
1741
        pop     ecx
1742
@@:
1743
        div     ecx
1744
        add     dl, '0'
1745
        dec     edi
1746
        mov     [edi], dl
1747
        xor     edx, edx
1748
        test    eax, eax
1749
        jnz     @b
1750
        push    edi
1751
        push    aConfirmDeleteText
1752
        mov     eax, esp
1753
        push    DeleteOrCancelBtn
1754
        push    2
1755
        push    eax
1756
        push    2
1757
        push    -1
1758
        push    -1
1759
        push    aDeleteCaption
1760
        call    Message
1761
        add     esp, 8
1762
        test    eax, eax
1763
        jnz     .ret2
1764
        mov     [del_bSkipAll], 0
1765
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
1766
        jecxz   .ret2
1767
        mov     esi, [ebp + panel1_files - panel1_data]
1768
.f8_loop:
1769
        lodsd
1770
        test    byte [eax+303], 1
1771
        jz      @f
1772
        call    delete_file
1773
        ja      .f8_multiple_cancel
1774
@@:
1775
        loop    .f8_loop
1776
.f8_multiple_cancel:
1777
        jmp     .ctrl_r
180 heavyiron 1778
.f8:
474 diamond 1779
        cmp     [ebp + panel1_selected_num - panel1_data], 0
1780
        jnz     .f8_has_selected
183 diamond 1781
        call    get_curfile_folder_entry
1782
        cmp     [bConfirmDelete], 0
1783
        jz      .f8_allowed
474 diamond 1784
        lea     eax, [ecx+40]
1785
        push    eax
183 diamond 1786
        mov     esi, aConfirmDeleteText
1787
        mov     edi, aConfirmDeleteTextBuf
474 diamond 1788
        push    edi
183 diamond 1789
@@:
1790
        lodsb
1791
        stosb
1792
        test    al, al
1793
        jnz     @b
1794
        dec     edi
1795
        mov     esi, aDeleteFolder
1796
        test    byte [ecx], 10h
1797
        jnz     @f
1798
        mov     esi, aDeleteFile
1799
@@:
1800
        lodsb
1801
        stosb
1802
        test    al, al
1803
        jnz     @b
321 diamond 1804
        mov     eax, esp
474 diamond 1805
        push    DeleteOrCancelBtn
321 diamond 1806
        push    2
1807
        push    eax
474 diamond 1808
        push    2
321 diamond 1809
        push    -1
1810
        push    -1
474 diamond 1811
        push    aDeleteCaption
1812
        call    Message
1813
        add     esp, 8
321 diamond 1814
        test    eax, eax
474 diamond 1815
        jz      .f8_allowed
1816
        ret
1817
.f8_allowed:
1818
        mov     [del_bSkipAll], 0
1819
        mov     eax, ecx
1820
        call    delete_file
180 heavyiron 1821
.ctrl_r:
1822
; Rescan panel
1823
;       call    read_folder
1824
;       jmp     .done_redraw
1825
        mov     eax, [ebp + panel1_index - panel1_data]
1826
        push    eax
183 diamond 1827
        call    get_curfile_name
283 diamond 1828
        mov     esi, ecx
180 heavyiron 1829
        mov     edi, saved_file_name
1830
@@:
1831
        lodsb
1832
        stosb
1833
        test    al, al
1834
        jnz     @b
1835
        push    [ebp + panel1_start - panel1_data]
1836
        call    read_folder
1837
        pop     [ebp + panel1_start - panel1_data]
1838
        pop     [ebp + panel1_index - panel1_data]
1839
        or      eax, -1
1840
@@:
1841
        inc     eax
1842
        cmp     eax, [ebp + panel1_numfiles - panel1_data]
1843
        jae     .ctrl_r.notfound
1844
        mov     ecx, [ebp + panel1_files - panel1_data]
321 diamond 1845
        mov     esi, [ecx+eax*4]
1846
        add     esi, 40
180 heavyiron 1847
        mov     edi, saved_file_name
1848
        call    strcmpi
1849
        jnz     @b
1850
.ctrl_r.found:
1851
        mov     [ebp + panel1_index - panel1_data], eax
1852
.ctrl_r.notfound:
1853
        mov     eax, [ebp + panel1_numfiles - panel1_data]
1854
        dec     eax
1855
        cmp     [ebp + panel1_index - panel1_data], eax
1856
        jbe     @f
1857
        mov     [ebp + panel1_index - panel1_data], eax
1858
@@:
1859
        mov     eax, [ebp + panel1_index - panel1_data]
1860
        cmp     [ebp + panel1_start - panel1_data], eax
1861
        jbe     @f
1862
        mov     [ebp + panel1_start - panel1_data], eax
1863
@@:
1864
        inc     eax
1865
        sub     eax, [ebp + panel1_colst - panel1_data]
1866
        jae     @f
1867
        xor     eax, eax
1868
@@:
1869
        cmp     [ebp + panel1_start - panel1_data], eax
1870
        jae     @f
1871
        mov     [ebp + panel1_start - panel1_data], eax
1872
@@:
1873
        mov     eax, [ebp + panel1_numfiles - panel1_data]
1874
        sub     eax, [ebp + panel1_colst - panel1_data]
1875
        jbe     @f
1876
        cmp     [ebp + panel1_start - panel1_data], eax
1877
        jbe     @f
1878
        mov     [ebp + panel1_start - panel1_data], eax
1879
@@:
1880
        jmp     .done_redraw
283 diamond 1881
.menu:
1882
; display context menu
1883
; ignore folders
1884
        call    get_curfile_folder_entry
1885
        test    byte [ecx], 10h
1886
        jz      @f
1887
.menuret:
1888
        ret
1889
@@:
1890
        call    find_extension
1891
        jc      .menuret
1892
; known extension
474 diamond 1893
@@:
1894
        cmp     byte [edi], 0
283 diamond 1895
        jz      .menuret
474 diamond 1896
        cmp     byte [edi], ';'
1897
        jz      @f
1898
        inc     edi
1899
        jmp     @b
1900
@@:
1901
        inc     edi
1902
@@:
1903
        inc     edi
1904
        cmp     byte [edi-1], ' '
1905
        jz      @b
1906
        cmp     byte [edi-1], 9
1907
        jz      @b
1908
        dec     edi
1909
        cmp     byte [edi], 0
1910
        jz      .menuret
283 diamond 1911
        mov     ecx, esi
1912
@@:
1913
        inc     ecx
1914
        cmp     byte [ecx-1], 0
1915
        jnz     @b
1916
        sub     ecx, esi        ; ecx = длина имени файла+1 = длина заголовка+1
1917
        cmp     ecx, 15
1918
        jb      @f
1919
        mov     cl, 15
1920
@@:
1921
        xor     edx, edx
474 diamond 1922
        xor     ebp, ebp
1923
        push    edx
283 diamond 1924
.menucreateloop:
474 diamond 1925
        mov     eax, edi
1926
        xor     ebx, ebx
283 diamond 1927
@@:
474 diamond 1928
        cmp     byte [edi], ','
1929
        jz      @f
1930
        cmp     byte [edi], bl
1931
        jz      @f
1932
        inc     edi
1933
        jmp     @b
1934
@@:
1935
        xchg    bl, [edi]
1936
        pushad
1937
        push    nullstr
1938
        push    1024
1939
        push    saved_file_name
1940
        push    eax
1941
        push    aMenu
1942
        push    app_path
1943
        call    [ini.get_str]
1944
        popad
1945
        mov     [edi], bl
1946
        mov     eax, saved_file_name
1947
@@:
1948
        cmp     byte [eax], 0
1949
        jz      .menucreatecont
1950
        cmp     byte [eax], ','
1951
        jz      @f
283 diamond 1952
        inc     eax
474 diamond 1953
        jmp     @b
1954
@@:
1955
        mov     byte [eax], 0
1956
        push    eax
1957
        sub     eax, saved_file_name-1
283 diamond 1958
        cmp     eax, ecx
1959
        ja      @f
1960
        mov     eax, ecx
1961
@@:
474 diamond 1962
        xchg    eax, [esp]
1963
        inc     eax
1964
        push    eax
1965
@@:
1966
        inc     eax
1967
        cmp     byte [eax-1], 0
1968
        jnz     @b
1969
        sub     eax, [esp]
1970
        add     [esp+4], eax
1971
        pop     eax eax
1972
        add     eax, 8
1973
        add     ebp, eax
1974
        push    ebp
1975
        and     ebp, 0xFFF
1976
        cmp     ebp, eax
1977
        pop     ebp
1978
        ja      @f
1979
        push    eax
1980
        xchg    edx, [esp+4]
1981
        push    ecx
1982
        mov     ecx, ebp
1983
        call    xpgrealloc
1984
        pop     ecx
1985
        pop     edx
1986
        xchg    edx, [esp]
283 diamond 1987
        test    eax, eax
474 diamond 1988
        xchg    eax, [esp]
283 diamond 1989
        jz      .menucreated
474 diamond 1990
@@:
1991
        neg     eax
1992
        add     eax, ebp
1993
        add     eax, [esp]
1994
        and     dword [eax], 0
1995
        and     dword [eax+4], 0
283 diamond 1996
        test    edx, edx
1997
        jz      @f
474 diamond 1998
        sub     eax, [esp]
283 diamond 1999
        mov     [edx], eax
474 diamond 2000
        add     eax, [esp]
2001
        sub     edx, [esp]
2002
        mov     [eax+4], edx
283 diamond 2003
@@:
2004
        mov     edx, eax
474 diamond 2005
        push    esi edi
2006
        mov     esi, saved_file_name
283 diamond 2007
        lea     edi, [eax+8]
2008
@@:
2009
        lodsb
2010
        stosb
2011
        test    al, al
2012
        jnz     @b
474 diamond 2013
        push    esi
2014
        sub     esi, saved_file_name
283 diamond 2015
        sub     esi, ecx
2016
        jae     .menunoadd
2017
        neg     esi
2018
@@:
2019
        mov     byte [edi-1], ' '
2020
        stosb
2021
        dec     esi
2022
        jnz     @b
2023
.menunoadd:
2024
        pop     esi
474 diamond 2025
@@:
2026
        lodsb
2027
        stosb
2028
        test    al, al
2029
        jnz     @b
2030
        pop     edi esi
2031
.menucreatecont:
2032
        inc     edi
2033
        cmp     byte [edi-1], ','
2034
        jz      .menucreateloop
283 diamond 2035
.menucreated:
2036
        test    edx, edx
474 diamond 2037
        jz      .menuret_free
283 diamond 2038
        and     dword [edx], 0
474 diamond 2039
        pop     edx
2040
        mov     ecx, edx
2041
        add     [ecx], edx
283 diamond 2042
@@:
474 diamond 2043
        mov     ecx, [ecx]
2044
        cmp     dword [ecx], 0
283 diamond 2045
        jz      @f
474 diamond 2046
        add     [ecx], edx
2047
        add     [ecx+4], edx
283 diamond 2048
        jmp     @b
2049
@@:
474 diamond 2050
        add     [ecx+4], edx
2051
        push    edx
283 diamond 2052
        push    1
2053
        push    esi
2054
        push    edx
2055
        call    menu
2056
        cmp     eax, -1
474 diamond 2057
        jz      .menuret_free
2058
        lea     edi, [eax+8]
283 diamond 2059
@@:
474 diamond 2060
        inc     edi
2061
        cmp     byte [edi-1], 0
2062
        jnz     @b
2063
        mov     ebp, [active_panel]
283 diamond 2064
        call    get_curfile_folder_entry
474 diamond 2065
        call    .run_association2
2066
.menuret_free:
2067
        pop     ecx
2068
        jmp     pgfree
321 diamond 2069
.f7:
2070
        mov     dword [CopyDestEditBuf], CopyDestEditBuf.length
2071
        and     dword [CopyDestEditBuf+4], 0
2072
        and     dword [CopyDestEditBuf+8], 0
2073
        mov     byte [CopyDestEditBuf+12], 0
2074
        mov     ebx, mkdir_dlgdata
2075
        mov     eax, [cur_width]
2076
        sub     eax, 12
2077
        mov     [ebx + dlgtemplate.width], eax
2078
        dec     eax
2079
        dec     eax
2080
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.width2], eax
2081
        shr     eax, 1
2082
        dec     eax
2083
        dec     eax
2084
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cont_x2], eax
2085
        sub     eax, a_ContinueLength-1
2086
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cont_x1], eax
2087
        add     eax, a_ContinueLength+3
2088
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cnl_x1], eax
2089
        add     eax, aCancelBLength - 1
2090
        mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cnl_x2], eax
2091
        mov     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags0], 0xC
2092
        and     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags1], not 4
2093
        and     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags2], not 4
2094
        push    ebx
2095
        call    DialogBox
2096
        cmp     eax, mkdir_dlgdata.cont_btn
2097
        jnz     .ret2
2098
        mov     esi, CopyDestEditBuf+12
2099
        cmp     byte [esi], 0
2100
        jz      .ret2
2101
        cmp     byte [esi], '/'
2102
        jz      .mkdir_absolute_path
2103
        push    esi
2104
        lea     edi, [ebp + panel1_dir - panel1_data]
2105
        or      ecx, -1
2106
        xor     eax, eax
2107
        repnz   scasb
2108
        not     ecx
2109
        mov     edi, esi
2110
@@:
2111
        cmp     byte [edi+1], 0
2112
        jz      @f
2113
        inc     edi
2114
        jmp     @b
2115
@@:
2116
        push    edi
2117
        add     edi, ecx
2118
        cmp     edi, CopyDestEditBuf+12+513
2119
        pop     edi
2120
        jb      @f
2121
        pop     esi
2122
        jmp     .bigfilename
2123
@@:
2124
        lea     edx, [edi+2]
2125
        sub     edx, esi
2126
        lea     edi, [edi+ecx+1]
2127
        xchg    ecx, edx
2128
        std
2129
        lea     esi, [esi+ecx-1]
2130
        rep     movsb
2131
        cld
2132
        pop     edi
2133
        lea     esi, [ebp + panel1_dir - panel1_data]
2134
        push    edi
2135
        mov     ecx, edx
2136
        rep     movsb
2137
        mov     byte [edi-1], '/'
2138
        pop     esi
2139
.mkdir_absolute_path:
2140
.mkdir_retry:
2141
        push    70
2142
        pop     eax
2143
        mov     ebx, mkdirinfo
485 heavyiron 2144
        mcall
321 diamond 2145
        test    eax, eax
2146
        jz      @f
474 diamond 2147
        push    dword CopyDestEditBuf+12
2148
        push    dword aCannotMakeFolder
321 diamond 2149
        call    get_error_msg
2150
        push    eax
2151
        mov     eax, esp
474 diamond 2152
        push    dword RetryOrCancelBtn
321 diamond 2153
        push    2
2154
        push    eax
2155
        push    3
2156
        push    -1
2157
        push    -1
474 diamond 2158
        push    dword aError
321 diamond 2159
        call    SayErr
2160
        add     esp, 3*4
2161
        test    eax, eax
2162
        jz      .mkdir_retry
2163
@@:
2164
        jmp     .copydone
474 diamond 2165
.change_mode:
2166
        dec     eax
2167
        mov     [ebp + panel1_colmode - panel1_data], eax
2168
        call    calc_colwidths
2169
        jmp     draw_panel
2170
.quick_jump:
2171
        dec     eax
2172
        cmp     al, 10
2173
        jnz     @f
2174
        xor     eax, eax
2175
@@:
2176
        mov     eax, [FolderShortcuts+eax*4]
2177
        test    eax, eax
2178
        jnz     @f
2179
        ret
2180
@@:
2181
        lea     esi, [ebp + panel1_dir - panel1_data]
2182
        push    eax esi
2183
        mov     edi, prev_dir
2184
@@:
2185
        lodsb
2186
        stosb
2187
        test    al, al
2188
        jnz     @b
2189
        pop     edi esi
2190
@@:
2191
        lodsb
2192
        stosb
2193
        test    al, al
2194
        jnz     @b
2195
        jmp     .reread
2196
.greyplus:
2197
        push    0
2198
        mov     ecx, aSelect
2199
        jmp     @f
2200
.greyminus:
2201
        push    1
2202
        mov     ecx, aDeselect
2203
@@:
2204
        mov     eax, mark_dlgdata
2205
        mov     [eax+mark_dlgdata.title-mark_dlgdata], ecx
2206
        mov     [eax+mark_dlgdata.flags-mark_dlgdata], 0xC
2207
        mov     edi, enter_string_buf+12
2208
        mov     dword [edi-12], 512
2209
        mov     dword [edi-8], 1
2210
        and     dword [edi-4], 0
2211
        mov     word [edi], '*'
2212
        push    eax
2213
        call    DialogBox
2214
        inc     eax
2215
        jnz     @f
2216
.noselect:
2217
        pop     eax
2218
        ret
2219
@@:
2220
        xor     eax, eax
2221
        mov     esi, edi
2222
@@:
2223
        lodsb
2224
        mov     al, [tolower_table+eax]
2225
        mov     [esi-1], al
2226
        test    al, al
2227
        jnz     @b
2228
@@:
2229
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
2230
        mov     ebx, [ebp + panel1_files - panel1_data]
2231
        jecxz   .noselect
2232
        mov     eax, [ebx]
2233
        cmp     word [eax+40], '..'
2234
        jnz     .selectloop
2235
        cmp     byte [eax+42], 0
2236
        jnz     .selectloop
2237
        dec     ecx
2238
        jz      .noselect
2239
        add     ebx, 4
2240
.selectloop:
2241
        xor     eax, eax
2242
        mov     esi, [ebx]
2243
        add     esi, 40
2244
        mov     edx, lower_file_name-1
2245
@@:
2246
        lodsb
2247
        inc     edx
2248
        mov     al, [tolower_table+eax]
2249
        mov     [edx], al
2250
        test    al, al
2251
        jnz     @b
2252
        mov     esi, lower_file_name
2253
        call    match_mask_rev_lowercase
2254
        jc      @f
2255
        mov     esi, [ebx]
2256
        mov     eax, [esi+32]
2257
        cmp     byte [esp], 0
2258
        jz      .doselect
2259
        test    byte [esi+303], 1
2260
        jz      @f
2261
        and     byte [esi+303], not 1
2262
        sub     dword [ebp + panel1_selected_size - panel1_data], eax
2263
        mov     eax, [esi+36]
2264
        sbb     dword [ebp + panel1_selected_size+4 - panel1_data], eax
2265
        dec     dword [ebp + panel1_selected_num - panel1_data]
2266
        jmp     @f
2267
.doselect:
2268
        test    byte [esi+303], 1
2269
        jnz     @f
2270
        or      byte [esi+303], 1
2271
        add     dword [ebp + panel1_selected_size - panel1_data], eax
2272
        mov     eax, [esi+36]
2273
        adc     dword [ebp + panel1_selected_size+4 - panel1_data], eax
2274
        inc     dword [ebp + panel1_selected_num - panel1_data]
2275
@@:
2276
        add     ebx, 4
2277
        dec     ecx
2278
        jnz     .selectloop
2279
        pop     eax
2280
        jmp     .done_redraw
180 heavyiron 2281
 
2282
panels_OnRedraw:
2283
        call    draw_cmdbar
2284
        mov     ebp, panel1_data
474 diamond 2285
        call    calc_colwidths
180 heavyiron 2286
        call    draw_panel
2287
        mov     ebp, panel2_data
474 diamond 2288
        call    calc_colwidths
180 heavyiron 2289
        call    draw_panel
2290
        ret
2291
 
2292
init_console:
474 diamond 2293
        mov     ecx, [console_data_ptr]
2294
        call    pgfree
283 diamond 2295
        mov     eax, [cur_width]
2296
        mul     [cur_height]
2297
        mov     ecx, eax
474 diamond 2298
        push    ecx
2299
        shl     ecx, 2
2300
        call    pgalloc
2301
        pop     ecx
283 diamond 2302
        test    eax, eax
2303
        jz      exit
2304
        mov     [console_data_ptr], eax
2305
        mov     edi, eax
180 heavyiron 2306
        mov     ax, 0720h
2307
        rep     stosw
283 diamond 2308
        mov     [panel1_left], ecx
2309
        mov     [panel1_top], ecx
2310
        mov     [panel2_top], ecx
180 heavyiron 2311
        mov     eax, [cur_width]
2312
        inc     eax
2313
        shr     eax, 1
2314
        mov     [panel1_width], eax
2315
        mov     [panel2_left], eax
2316
        sub     eax, [cur_width]
2317
        neg     eax
2318
        mov     [panel2_width], eax
2319
        mov     eax, [cur_height]
2320
        dec     eax
2321
        dec     eax
2322
        mov     [panel1_height], eax
2323
        mov     [panel2_height], eax
2324
        ret
2325
 
183 diamond 2326
get_curfile_folder_entry:
2327
        mov     ecx, [ebp + panel1_index - panel1_data]
321 diamond 2328
        shl     ecx, 2
183 diamond 2329
        add     ecx, [ebp + panel1_files - panel1_data]
321 diamond 2330
        mov     ecx, [ecx]
183 diamond 2331
        ret
2332
get_curfile_name:
2333
        call    get_curfile_folder_entry
2334
        add     ecx, 40
2335
        ret
2336
 
180 heavyiron 2337
panels_getname:
2338
if lang eq ru
2339
        mov     eax, 'Пане'
2340
        stosd
2341
        mov     eax, 'ли  '
2342
        stosd
2343
        mov     eax, '    '
2344
        stosd
2345
        stosb
2346
else
2347
        mov     eax, 'Pane'
2348
        stosd
2349
        mov     eax, 'ls  '
2350
        stosd
2351
        mov     eax, '    '
2352
        stosd
2353
        stosb
2354
end if
2355
        sub     ecx, 13
2356
        mov     ebp, [active_panel]
2357
        lea     esi, [ebp + panel1_dir - panel1_data]
2358
        push    3
2359
        pop     edx
2360
@@:
2361
        lodsb
2362
        stosb
2363
        dec     ecx
2364
        test    al, al
2365
        jz      @f
2366
        cmp     al, '/'
2367
        jnz     @b
2368
        dec     edx
2369
        jnz     @b
2370
@@:
2371
        test    al, al
2372
        jnz     @f
2373
        dec     esi
2374
        dec     edi
2375
@@:
2376
        push    esi
2377
@@:
2378
        lodsb
2379
        test    al, al
2380
        jnz     @b
2381
        dec     esi
2382
        mov     ebx, esi
2383
        sub     ebx, [esp]
2384
        dec     esi
2385
        push    esi
2386
        mov     esi, [ebp + panel1_index - panel1_data]
321 diamond 2387
        shl     esi, 2
2388
        add     esi, [ebp + panel1_files - panel1_data]
2389
        mov     esi, [esi]
2390
        add     esi, 40
180 heavyiron 2391
        push    esi
2392
@@:
2393
        lodsb
2394
        test    al, al
2395
        jnz     @b
2396
        add     ebx, esi
2397
        sub     ebx, [esp]
2398
        dec     esi
2399
        cmp     ebx, ecx
2400
        jbe     @f
2401
        mov     al, '.'
2402
        stosb
2403
        stosb
2404
        stosb
2405
        sub     ecx, 3
2406
        mov     ebx, ecx
2407
@@:
2408
        add     edi, ebx
2409
        inc     ecx
2410
        std
2411
@@:
2412
        movsb
2413
        dec     ecx
2414
        jz      .nodir
2415
        cmp     esi, [esp]
2416
        jae     @b
2417
        mov     al, '/'
2418
        stosb
2419
        dec     ecx
2420
        jz      .nodir
2421
        mov     esi, [esp+4]
2422
@@:
2423
        cmp     esi, [esp+8]
2424
        jb      .nodir
2425
        movsb
2426
        loop    @b
2427
.nodir:
2428
        cld
2429
        pop     eax
2430
        pop     eax
2431
        pop     eax
2432
        ret
2433
 
2434
draw_window:
2435
        push    12
2436
        pop     eax
2437
        push    1
2438
        pop     ebx
485 heavyiron 2439
        mcall
180 heavyiron 2440
        mov     al, 48
2441
        mov     bl, 4
485 heavyiron 2442
        mcall
180 heavyiron 2443
        mov     [skinh], eax
2444
        mov     ebx, [cur_width]
2445
        imul    ebx, font_width
283 diamond 2446
        add     ebx, 100*65536 + 5*2-1
180 heavyiron 2447
        mov     ecx, [cur_height]
2448
        imul    ecx, font_height
283 diamond 2449
        lea     ecx, [eax+ecx+5-1+100*65536]
180 heavyiron 2450
        xor     eax, eax
314 diamond 2451
        mov     edx, 0x53000000
485 heavyiron 2452
        mov     edi, title
2453
        mcall
314 diamond 2454
        mov     al, 13
2455
        xor     edx, edx
2456
        cmp     [fill_width], 0
2457
        jz      @f
2458
        mov     ebx, [wnd_width]
2459
        sub     ebx, [fill_width]
2460
        sub     ebx, 5-1
2461
        shl     ebx, 16
2462
        mov     bx, word [fill_width]
2463
        mov     ecx, [skinh-2]
2464
        mov     cx, word [wnd_height]
2465
        sub     cx, word [skinh]
2466
        sub     cx, 5-1
485 heavyiron 2467
        mcall
314 diamond 2468
@@:
2469
        cmp     [fill_height], 0
2470
        jz      @f
2471
        xor     edx, edx
2472
        mov     ebx, 50000h
2473
        mov     bx, word [wnd_width]
2474
        sub     ebx, 9
2475
        mov     ecx, [wnd_height]
2476
        sub     ecx, [fill_height]
2477
        sub     ecx, 5-1
2478
        shl     ecx, 16
2479
        mov     cx, word [fill_height]
485 heavyiron 2480
        mcall
314 diamond 2481
@@:
283 diamond 2482
;        xor     ecx, ecx
2483
;        call    draw_image
474 diamond 2484
        mov     al, 65
2485
        mov     ebx, [MemForImage]
2486
        test    ebx, ebx
2487
        jz      @f
2488
        mov     ecx, [cur_width]
2489
        imul    ecx, font_width*10000h
2490
        mov     cx, word [cur_height]
2491
        imul    cx, font_height
2492
        mov     edx, [skinh]
2493
        add     edx, 5*10000h
2494
        mov     esi, 8
2495
        mov     edi, console_colors
2496
        xor     ebp, ebp
485 heavyiron 2497
        mcall
474 diamond 2498
@@:
283 diamond 2499
        mov     al, 12
180 heavyiron 2500
        push    2
2501
        pop     ebx
485 heavyiron 2502
        mcall
180 heavyiron 2503
        ret
2504
 
2505
draw_image.nomem:
2506
        mov     al, 13
2507
        xor     edx, edx
2508
        mov     ebx, [cur_width]
2509
        imul    ebx, font_width
2510
        add     ebx, 5*65536
2511
        mov     ecx, [skinh-2]
2512
        mov     cx, word [cur_height]
2513
        imul    cx, font_height
485 heavyiron 2514
        mcall
180 heavyiron 2515
        mov     al, 4
2516
        mov     ebx, 32*65536+32
2517
        mov     ecx, 0xFFFFFF
2518
        mov     edx, nomem_draw
2519
        push    nomem_draw.size
2520
        pop     esi
485 heavyiron 2521
        mcall
180 heavyiron 2522
        ret
2523
 
2524
draw_image:
474 diamond 2525
        mov     [bMemForImageValidData], byte 1
2526
        cmp     [MemForImage], 0
2527
        jnz     .allocated
2528
; allocate memory for image
2529
        mov     ecx, [cur_width]
2530
        imul    ecx, [cur_height]
2531
        imul    ecx, font_width*font_height
2532
        call    pgalloc
2533
        test    eax, eax
2534
        jz      draw_image.nomem
2535
        mov     [MemForImage], eax
2536
        mov     [bMemForImageValidData], byte 0
2537
.allocated:
283 diamond 2538
        and     [max_x], 0
2539
        or      [min_x], -1
474 diamond 2540
        and     [max_y], 0
283 diamond 2541
        or      [min_y], -1
474 diamond 2542
        mov     eax, [cursor_y]
2543
        mul     [cur_width]
2544
        add     eax, [cursor_x]
2545
        add     eax, eax
2546
        add     eax, [console_data_ptr]
2547
        xchg    [cur_cursor_pos], eax
2548
        mov     [old_cursor_pos], eax
2549
        mov     edi, [MemForImage]
283 diamond 2550
        mov     esi, [console_data_ptr]
474 diamond 2551
        mov     ecx, [cur_height]
2552
.lh:
2553
        push    ecx
283 diamond 2554
        mov     ecx, [cur_width]
474 diamond 2555
.lw:
2556
        push    ecx
2557
        mov     eax, [cur_width]
2558
        imul    eax, [cur_height]
2559
        mov     ebx, [esi]
2560
        cmp     [bMemForImageValidData], 0
2561
        jz      @f
2562
        cmp     esi, [cur_cursor_pos]
2563
        jz      @f
2564
        cmp     esi, [old_cursor_pos]
2565
        jz      @f
2566
        cmp     bx, [eax*2+esi]
2567
        jnz     @f
2568
        inc     esi
2569
        inc     esi
2570
        jmp     .skip_symbol
283 diamond 2571
@@:
474 diamond 2572
        mov     [eax*2+esi], bx
2573
        cmp     ecx, [min_x]
283 diamond 2574
        ja      @f
474 diamond 2575
        mov     [min_x], ecx
283 diamond 2576
@@:
474 diamond 2577
        cmp     ecx, [max_x]
283 diamond 2578
        jb      @f
474 diamond 2579
        mov     [max_x], ecx
283 diamond 2580
@@:
474 diamond 2581
        mov     eax, [esp+4]
2582
        mov     [min_y], eax
2583
        cmp     eax, [max_y]
283 diamond 2584
        jb      @f
474 diamond 2585
        mov     [max_y], eax
283 diamond 2586
@@:
2587
        push    edi
474 diamond 2588
        xor     eax, eax
2589
        mov     al, [esi+1]
2590
        and     al, 0xF
2591
        mov     ebx, eax
2592
        mov     al, [esi+1]
2593
        shr     al, 4
2594
        mov     ebp, eax
283 diamond 2595
        sub     ebx, ebp
474 diamond 2596
        lodsb
2597
        inc     esi
180 heavyiron 2598
if font_width > 8
2599
        lea     edx, [eax+eax+font]
2600
else
2601
        lea     edx, [eax+font]
2602
end if
2603
.sh:
474 diamond 2604
        mov     ecx, [edx]
2605
repeat font_width
2606
        shr     ecx, 1
283 diamond 2607
        sbb     eax, eax
2608
        and     eax, ebx
2609
        add     eax, ebp
474 diamond 2610
        mov     [edi+%-1], al
2611
end repeat
2612
        mov     eax, [cur_width]
2613
;        imul    eax, font_width
2614
;        add     edi, eax
2615
if font_width = 6
2616
        lea     eax, [eax*2+eax]
2617
        lea     edi, [edi+eax*2]
2618
else if font_width = 7
2619
        lea     edi, [edi+eax*8]
2620
        sub     edi, eax
2621
else if font_width = 8
2622
        lea     edi, [edi+eax*8]
2623
else if font_width = 9
2624
        lea     edi, [edi+eax*8]
180 heavyiron 2625
        add     edi, eax
474 diamond 2626
else if font_width = 10
2627
        lea     eax, [eax*4+eax]
2628
        lea     edi, [edi+eax*2]
2629
else
2630
Unknown font_width value!
2631
end if
180 heavyiron 2632
if font_width > 8
2633
        add     edx, 256*2
474 diamond 2634
        cmp     edx, font+256*2*font_height
180 heavyiron 2635
else
2636
        add     edx, 256
474 diamond 2637
        cmp     edx, font+256*font_height
180 heavyiron 2638
end if
474 diamond 2639
        jb      .sh
283 diamond 2640
        pop     edi
2641
.skip_symbol:
2642
        pop     ecx
2643
        add     edi, font_width
2644
        dec     ecx
2645
        jnz     .lw
474 diamond 2646
        mov     eax, [cur_width]
283 diamond 2647
        imul    eax, (font_height-1)*font_width
180 heavyiron 2648
        add     edi, eax
474 diamond 2649
        pop     ecx
283 diamond 2650
        dec     ecx
2651
        jnz     .lh
2652
; cursor
2653
        mov     eax, [cursor_y]
2654
        inc     eax
2655
        jz      .nocursor
474 diamond 2656
        mul     [cur_width]
283 diamond 2657
        imul    eax, font_height*font_width
2658
        mov     edx, [cursor_x]
2659
        inc     edx
2660
        imul    edx, font_width
2661
        add     eax, edx
474 diamond 2662
        add     eax, [MemForImage]
2663
        mov     edx, [cur_width]
283 diamond 2664
        imul    edx, font_width
2665
        neg     edx
2666
        mov     ecx, (font_height*15+50)/100
2667
.cursor_loop:
2668
        push    ecx
2669
        mov     ecx, font_width
2670
        add     eax, edx
2671
        push    eax
2672
@@:
2673
;        add     byte [eax-1], 0x10
2674
        xor     byte [eax-1], 7
2675
        sub     eax, 1
2676
        loop    @b
2677
        pop     eax
180 heavyiron 2678
        pop     ecx
283 diamond 2679
        loop    .cursor_loop
2680
.nocursor:
474 diamond 2681
        cmp     [min_y], -1
2682
        jz      .nodraw
2683
        mov     ecx, [cur_width]
2684
        mov     ebx, [cur_height]
2685
        mov     eax, ebx
2686
        sub     ebx, [max_y]
2687
        sub     eax, [min_y]
2688
        sub     eax, ebx
2689
        inc     eax
2690
        imul    ebp, eax, font_height
2691
        mov     edx, ecx
2692
        sub     edx, [max_x]
283 diamond 2693
        imul    edx, font_width
474 diamond 2694
        mov     eax, edx
283 diamond 2695
        shl     edx, 16
474 diamond 2696
        imul    dx, bx, font_height
2697
        imul    ebx, [cur_width]
2698
        mov     ecx, [max_x]
2699
        sub     ecx, [min_x]
2700
        inc     ecx
2701
        imul    ecx, font_width*10000h
2702
        add     ecx, ebp
2703
        imul    ebx, font_width*font_height
2704
        add     ebx, [MemForImage]
2705
        add     ebx, eax
283 diamond 2706
        add     edx, [skinh]
474 diamond 2707
        add     edx, 5*10000h
2708
        imul    esi, [cur_width], font_width
2709
        mov     ebp, ecx
2710
        shr     ebp, 16
2711
        sub     esi, ebp
2712
        mov     ebp, esi
283 diamond 2713
        push    65
180 heavyiron 2714
        pop     eax
474 diamond 2715
        mov     edi, console_colors
283 diamond 2716
        push    8
2717
        pop     esi
485 heavyiron 2718
        mcall
283 diamond 2719
.nodraw:
180 heavyiron 2720
        ret
2721
 
2722
get_console_ptr:
2723
; in: eax=x, edx=y
2724
; out: edi->console data
2725
        push    edx
2726
        imul    edx, [cur_width]
2727
        add     edx, eax
283 diamond 2728
        mov     edi, [console_data_ptr]
2729
        lea     edi, [edi + edx*2]
180 heavyiron 2730
        pop     edx
2731
        ret
2732
 
2733
draw_keybar:
2734
        pushad
2735
        xor     eax, eax
2736
        test    [ctrlstate], 3
2737
        jz      @f
2738
        inc     eax
2739
@@:
2740
        test    [ctrlstate], 0xC
2741
        jz      @f
2742
        or      al, 2
2743
@@:
2744
        test    [ctrlstate], 0x30
2745
        jz      @f
2746
        or      al, 4
2747
@@:
2748
        imul    eax, 6*12
2749
        mov     esi, [active_screen_vtable]
2750
        mov     esi, [esi+screen_vtable.keybar]
2751
        add     esi, eax
2752
        xor     ecx, ecx
2753
        inc     ecx
2754
        xor     eax, eax
2755
        mov     edx, [cur_height]
2756
        dec     edx
2757
        call    get_console_ptr
2758
        push    6
2759
        pop     ebx
2760
        mov     eax, [cur_width]
2761
        sub     eax, 11+9+3*2+6
2762
        cmp     eax, 7*11
2763
        jl      @f
2764
        cdq
2765
        mov     bl, 11
2766
        div     ebx
2767
        mov     ebx, eax
2768
@@:
2769
        xor     edx, edx
2770
.l:
2771
        add     edx, 7
2772
        cmp     cl, 10
2773
        jb      @f
2774
        inc     edx
2775
@@:
2776
        cmp     edx, [cur_width]
2777
        ja      .ret
2778
        cmp     cl, 10
2779
        jae     .twodig
2780
        lea     eax, [ecx+'0']
2781
        stosb
2782
        mov     al, [keybar_number_color]
2783
        stosb
2784
        jmp     .cmn
2785
.twodig:
2786
        mov     al, cl
2787
        cbw
2788
        div     [_10]
2789
        add     al, '0'
2790
        stosb
2791
        mov     al, [keybar_number_color]
2792
        stosb
2793
        xchg    al, ah
2794
        add     al, '0'
2795
        stosw
2796
.cmn:
2797
        mov     ah, [keybar_name_color]
2798
        push    ecx
2799
        mov     cl, 6
2800
@@:
2801
        lodsb
2802
        stosw
2803
        loop    @b
2804
        mov     al, ' '
2805
        lea     ecx, [ebx-6]
2806
        cmp     byte [esp], 12
2807
        jz      .ret_pop
2808
        add     edx, ecx
2809
        rep     stosw
2810
        pop     ecx
2811
        inc     edx
2812
        cmp     edx, [cur_width]
2813
        ja      .ret
2814
        mov     ah, [keybar_bgr_color]
2815
        stosw
2816
        inc     ecx
2817
        jmp     .l
2818
.ret_pop:
2819
        pop     ecx
2820
.ret:
2821
        cmp     byte [edi-2], ' '
2822
        jnz     @f
2823
        dec     edi
2824
        dec     edi
2825
@@:
2826
        push    edi
283 diamond 2827
        xor     eax, eax
180 heavyiron 2828
        mov     edx, [cur_height]
2829
        call    get_console_ptr
2830
        mov     ecx, edi
2831
        pop     edi
2832
        sub     ecx, edi
2833
        shr     ecx, 1
2834
        mov     al, ' '
2835
        mov     ah, [keybar_name_color]
2836
        rep     stosw
2837
.done:
2838
        popad
2839
        ret
2840
 
2841
draw_cmdbar:
2842
        mov     esi, [active_panel]
2843
        add     esi, panel1_dir - panel1_data
2844
        xor     eax, eax
2845
        mov     edx, [cur_height]
2846
        dec     edx
2847
        dec     edx
2848
        call    get_console_ptr
2849
        mov     ah, [cmdbar_prefix_color]
2850
        mov     ecx, [cur_width]
2851
        dec     ecx
2852
@@:
2853
        lodsb
2854
        test    al, al
2855
        jz      @f
2856
        stosw
2857
        loop    @b
2858
@@:
2859
        mov     al, '>'
2860
        stosw
2861
        mov     al, ' '
2862
        mov     ah, [cmdbar_normal_color]
2863
        rep     stosw
2864
        ret
2865
 
2866
draw_border:
2867
        push    edi
2868
        mov     al, 0xC9
2869
        stosw
2870
        mov     al, 0xCD
2871
        lea     ecx, [ebx-2]
2872
        rep     stosw
2873
        mov     al, 0xBB
2874
        stosw
2875
        pop     edi
2876
        add     edi, [cur_width]
2877
        add     edi, [cur_width]
2878
        lea     ecx, [edx-2]
2879
.l:
2880
        push    edi
2881
        mov     al, 0xBA
2882
        stosw
2883
        mov     al, 0x20
2884
        push    ecx
2885
        lea     ecx, [ebx-2]
2886
        rep     stosw
2887
        pop     ecx
2888
        mov     al, 0xBA
2889
        stosw
2890
        pop     edi
2891
        add     edi, [cur_width]
2892
        add     edi, [cur_width]
2893
        loop    .l
2894
        mov     al, 0xC8
2895
        stosw
2896
        mov     al, 0xCD
2897
        lea     ecx, [ebx-2]
2898
        rep     stosw
2899
        mov     al, 0xBC
2900
        stosw
2901
        ret
2902
 
474 diamond 2903
calc_colwidths:
2904
; in: ebp->panel data
2905
        imul    esi, [ebp + panel1_colmode - panel1_data], PanelMode.size
2906
        add     esi, colmodes
2907
        lodsd
2908
        mov     ecx, eax
2909
        lea     edx, [ecx-1]
2910
        xor     ebx, ebx
2911
        add     esi, PanelMode.ColumnWidths-4
2912
        push    ecx esi
2913
        xor     eax, eax
2914
.loop:
2915
        lodsb
2916
        add     edx, eax
2917
        cmp     al, 1
2918
        adc     ebx, 0
2919
        loop    .loop
2920
        pop     esi ecx
2921
        lea     edi, [ebp + panel1_colwidths - panel1_data]
2922
        test    ebx, ebx
2923
        jz      .loop2
2924
        mov     eax, [ebp + panel1_width - panel1_data]
2925
        dec     eax
2926
        dec     eax
2927
        sub     eax, edx
2928
        jae     @f
2929
        xor     eax, eax
2930
@@:
2931
        xor     edx, edx
2932
        div     ebx
2933
        test    eax, eax
2934
        jnz     @f
2935
        xor     edx, edx
2936
        inc     eax
2937
@@:
2938
        push    eax
2939
.loop2:
2940
        movzx   eax, byte [esi]
2941
        inc     esi
2942
        test    eax, eax
2943
        jnz     @f
2944
        pop     eax
2945
        push    eax
2946
        dec     ebx
2947
        cmp     ebx, edx
2948
        jae     @f
2949
        inc     eax
2950
@@:
2951
        stosd
2952
        loop    .loop2
2953
        pop     eax
2954
        and     dword [edi], 0
2955
        ret
2956
 
180 heavyiron 2957
draw_panel:
2958
        mov     eax, [ebp + panel1_left - panel1_data]
2959
        mov     edx, [ebp + panel1_top - panel1_data]
2960
        call    get_console_ptr
2961
; draw border
2962
        mov     ah, [panel_border_color]
2963
        mov     ebx, [ebp + panel1_width - panel1_data]
2964
        mov     edx, [ebp + panel1_height - panel1_data]
2965
        call    draw_border
2966
        push    eax
2967
        mov     eax, [ebp + panel1_left - panel1_data]
2968
        mov     edx, [ebp + panel1_top - panel1_data]
2969
        add     edx, [ebp + panel1_height - panel1_data]
2970
        sub     edx, 3
2971
        call    get_console_ptr
2972
        pop     eax
2973
        mov     al, 0xC7
2974
        stosw
2975
        mov     al, 0xC4
2976
        lea     ecx, [ebx-2]
2977
        rep     stosw
2978
        mov     al, 0xB6
2979
        stosw
474 diamond 2980
 
2981
        imul    esi, [ebp + panel1_colmode - panel1_data], PanelMode.size
2982
        add     esi, colmodes
2983
        lodsd
2984
        mov     ecx, eax        ; number of columns
2985
        lea     ebx, [ebp + panel1_colwidths - panel1_data]
180 heavyiron 2986
        mov     eax, [ebp + panel1_left - panel1_data]
2987
        inc     eax
2988
        mov     [column_left], eax
474 diamond 2989
        mov     eax, [ebp + panel1_top - panel1_data]
2990
        inc     eax
2991
        mov     [column_top], eax
2992
        mov     eax, [ebp + panel1_height - panel1_data]
2993
        sub     eax, 4
2994
        mov     [column_height], eax
2995
        dec     eax
2996
        mov     [ebp + panel1_colsz - panel1_data], eax
2997
        and     [ebp + panel1_colst - panel1_data], 0
2998
        mov     eax, [ebp + panel1_start - panel1_data]
2999
        mov     [column_index], eax
3000
        mov     [last_column_index], eax
3001
.columns_loop:
3002
        push    ecx
3003
        mov     eax, [ebx]
3004
        add     ebx, 4
3005
        mov     [column_width], eax
3006
        cmp     ecx, 1
3007
        jz      .skip_right_border
3008
        add     eax, [column_left]
180 heavyiron 3009
        mov     edx, [ebp + panel1_top - panel1_data]
3010
        call    get_console_ptr
474 diamond 3011
        mov     ah, [panel_header_color]
180 heavyiron 3012
        mov     al, 0xD1
3013
        mov     [edi], ax
3014
        add     edi, [cur_width]
3015
        add     edi, [cur_width]
474 diamond 3016
        mov     ecx, [column_height]
180 heavyiron 3017
        mov     al, 0xB3
3018
@@:
3019
        mov     [edi], ax
3020
        add     edi, [cur_width]
3021
        add     edi, [cur_width]
3022
        loop    @b
3023
        mov     al, 0xC1
3024
        stosw
474 diamond 3025
.skip_right_border:
3026
        mov     eax, [column_left]
3027
        mov     edx, [column_top]
3028
        call    get_console_ptr
3029
; заголовок столбца
3030
        push    edi
3031
        mov     edx, [esi]
3032
        and     edx, 0xF
3033
        mov     edx, [column_headers+edx*4]
3034
        movzx   ecx, byte [edx]
3035
        inc     edx
3036
        cmp     ecx, [column_width]
3037
        jb      @f
180 heavyiron 3038
        mov     ecx, [column_width]
474 diamond 3039
@@:
3040
        push    ecx
3041
        sub     ecx, [column_width]
3042
        neg     ecx
3043
        shr     ecx, 1
3044
        mov     al, ' '
3045
        mov     ah, [column_header_color]
3046
        rep     stosw
3047
        pop     ecx
3048
        jecxz   .skipcopyhdr
3049
        push    ecx
3050
@@:
3051
        mov     al, [edx]
3052
        inc     edx
3053
        stosw
3054
        loop    @b
3055
        pop     ecx
3056
.skipcopyhdr:
3057
        sub     ecx, [column_width]
3058
        neg     ecx
180 heavyiron 3059
        inc     ecx
474 diamond 3060
        shr     ecx, 1
3061
        mov     al, ' '
3062
        rep     stosw
3063
        pop     edi
3064
        add     edi, [cur_width]
3065
        add     edi, [cur_width]
3066
; сам столбец
3067
        mov     eax, [esi]
3068
        and     eax, 0xF
3069
        push    ebx esi
3070
        call    dword [draw_column_proc+eax*4]
3071
        pop     esi ebx
3072
        inc     esi
3073
        mov     eax, [column_width]
3074
        inc     eax
3075
        add     [column_left], eax
3076
        pop     ecx
3077
        dec     ecx
3078
        jnz     .columns_loop
180 heavyiron 3079
; Заголовок панели (текущая папка)
3080
        lea     esi, [ebp + panel1_dir - panel1_data]
3081
        mov     edi, cur_header
3082
        mov     ecx, [ebp + panel1_width - panel1_data]
3083
        sub     ecx, 7
3084
        movsb
3085
@@:
3086
        lodsb
3087
        stosb
3088
        dec     ecx
3089
        test    al, al
3090
        jz      .header_created
3091
        cmp     al, '/'
3092
        jnz     @b
3093
        mov     edx, esi
3094
@@:
3095
        lodsb
3096
        test    al, al
3097
        jnz     @b
3098
        sub     esi, edx
3099
        dec     esi
3100
        cmp     esi, ecx
3101
        jbe     @f
3102
        mov     word [edi], '..'
3103
        mov     byte [edi+2], '.'
3104
        add     edi, 3
3105
        sub     ecx, 3
3106
        add     edx, esi
3107
        sub     edx, ecx
3108
@@:
3109
        mov     esi, edx
3110
@@:
3111
        lodsb
3112
        stosb
3113
        dec     ecx
3114
        test    al, al
3115
        jnz     @b
3116
.header_created:
3117
        mov     edx, [ebp + panel1_top - panel1_data]
3118
        mov     eax, [ebp + panel1_left - panel1_data]
3119
        shr     ecx, 1
3120
        lea     eax, [eax+ecx+3]
3121
        call    get_console_ptr
3122
        mov     ah, [panel_active_header_color]
3123
        cmp     ebp, [active_panel]
3124
        jz      @f
3125
        mov     ah, [panel_header_color]
3126
@@:
3127
        mov     al, ' '
3128
        stosw
3129
        mov     esi, cur_header
3130
@@:
3131
        lodsb
3132
        test    al, al
3133
        jz      @f
3134
        stosw
3135
        jmp     @b
3136
@@:
3137
        mov     al, ' '
3138
        stosw
3139
        mov     edx, [ebp + panel1_top - panel1_data]
3140
        inc     edx
3141
        mov     eax, [ebp + panel1_left - panel1_data]
3142
        inc     eax
3143
        call    get_console_ptr
3144
        movzx   eax, [ebp + panel1_sortmode - panel1_data]
3145
        mov     al, [compare_names+eax]
3146
        stosb
474 diamond 3147
        mov     eax, [ebp + panel1_selected_num - panel1_data]
3148
        test    eax, eax
3149
        jz      .skip_selected_info
3150
; Информация о выделенных файлах
3151
        push    dword [ebp + panel1_selected_size+4 - panel1_data]
3152
        push    dword [ebp + panel1_selected_size - panel1_data]
3153
        call    fill_total_info
3154
        mov     eax, [ebp + panel1_width - panel1_data]
3155
        sub     eax, 2
3156
        cmp     ecx, eax
3157
        jbe     @f
3158
        mov     ecx, eax
3159
        mov     edi, saved_file_name+512
3160
        sub     edi, eax
3161
        mov     byte [edi], '.'
3162
        mov     word [edi+1], '..'
3163
@@:
3164
        mov     esi, edi
3165
        sub     eax, ecx
3166
        shr     eax, 1
3167
        inc     eax
3168
        add     eax, [ebp + panel1_left - panel1_data]
3169
        mov     edx, [ebp + panel1_top - panel1_data]
3170
        add     edx, [ebp + panel1_height - panel1_data]
3171
        sub     edx, 3
3172
        call    get_console_ptr
3173
        mov     ah, [panel_numselected_color]
3174
@@:
3175
        lodsb
3176
        stosw
3177
        loop    @b
3178
.skip_selected_info:
3179
; Информация об общем числе и размере файлов панели
3180
        mov     eax, [ebp + panel1_total_num - panel1_data]
3181
        push    dword [ebp + panel1_total_size+4 - panel1_data]
3182
        push    dword [ebp + panel1_total_size - panel1_data]
3183
        call    fill_total_info
3184
        mov     eax, [ebp + panel1_width - panel1_data]
3185
        sub     eax, 2
3186
        cmp     ecx, eax
3187
        jbe     @f
3188
        mov     ecx, eax
3189
        mov     byte [edi+ecx-3], '.'
3190
        mov     word [edi+ecx-2], '..'
3191
@@:
3192
        sub     eax, ecx
3193
        shr     eax, 1
3194
        inc     eax
3195
        add     eax, [ebp + panel1_left - panel1_data]
3196
        add     edx, [ebp + panel1_top - panel1_data]
3197
        add     edx, [ebp + panel1_height - panel1_data]
3198
        dec     edx
3199
        mov     esi, edi
3200
        call    get_console_ptr
3201
        mov     ah, [panel_number_color]
3202
@@:
3203
        lodsb
3204
        stosw
3205
        loop    @b
180 heavyiron 3206
        cmp     [ebp + panel1_numfiles - panel1_data], 0
3207
        jz      .skip_curinfo
474 diamond 3208
; Информация о текущем файле
180 heavyiron 3209
        mov     ebx, [ebp + panel1_index - panel1_data]
3210
        mov     eax, [ebp + panel1_files - panel1_data]
3211
        mov     ebx, [eax+ebx*4]
3212
        mov     eax, [ebp + panel1_left - panel1_data]
3213
        add     eax, [ebp + panel1_width - panel1_data]
3214
        dec     eax
3215
        mov     edx, [ebp + panel1_top - panel1_data]
3216
        add     edx, [ebp + panel1_height - panel1_data]
3217
        dec     edx
3218
        dec     edx
3219
        call    get_console_ptr
3220
        mov     ecx, [ebp + panel1_width - panel1_data]
3221
        dec     ecx
3222
        dec     ecx
474 diamond 3223
        cmp     [ebp + panel1_colmode - panel1_data], 3
3224
        jz      .show_curname
180 heavyiron 3225
; Время модификации
3226
        sub     edi, 5*2
3227
        sub     ecx, 6
3228
        mov     al, [ebx+24+2]
3229
        aam
3230
        or      ax, 0x3030
3231
        mov     [edi], ah
3232
        mov     [edi+2], al
3233
        mov     [edi+4], byte ':'
3234
        mov     al, [ebx+24+1]
3235
        aam
3236
        or      ax, 0x3030
3237
        mov     [edi+6], ah
3238
        mov     [edi+8], al
3239
        mov     al, [panel_normal_color]
3240
        mov     [edi+1], al
3241
        mov     [edi+3], al
3242
        mov     [edi+5], al
3243
        mov     [edi+7], al
3244
        mov     [edi+9], al
3245
        dec     edi
3246
        mov     [edi], al
3247
        dec     edi
3248
        mov     byte [edi], ' '
3249
; Дата модификации
3250
        sub     edi, 8*2
3251
        sub     ecx, 9
3252
        mov     al, [ebx+28+0]
3253
        aam
3254
        or      ax, 0x3030
3255
        mov     [edi], ah
3256
        mov     [edi+2], al
3257
        mov     [edi+4], byte '.'
3258
        mov     al, [ebx+28+1]
3259
        aam
3260
        or      ax, 0x3030
3261
        mov     [edi+6], ah
3262
        mov     [edi+8], al
3263
        mov     [edi+10], byte '.'
3264
        mov     ax, [ebx+28+2]
3265
        div     [_100]
3266
        mov     al, ah
3267
        aam
3268
        or      ax, 0x3030
3269
        mov     [edi+12], ah
3270
        mov     [edi+14], al
3271
        mov     al, [panel_normal_color]
3272
        mov     [edi+1], al
3273
        mov     [edi+3], al
3274
        mov     [edi+5], al
3275
        mov     [edi+7], al
3276
        mov     [edi+9], al
3277
        mov     [edi+11], al
3278
        mov     [edi+13], al
3279
        mov     [edi+15], al
3280
        dec     edi
3281
        mov     [edi], al
3282
        dec     edi
3283
        mov     [edi], byte ' '
3284
; Размер
3285
        std
3286
        mov     ah, [panel_normal_color]
3287
        dec     edi
3288
        dec     edi
3289
        dec     ecx
3290
        test    byte [ebx], 0x10
3291
        jz      .size_file
3292
        push    ecx
3293
        mov     esi, aFolder+aFolder.size-1
3294
        mov     ecx, aFolder.size
3295
        cmp     word [ebx+40], '..'
3296
        jnz     @f
3297
        cmp     byte [ebx+42], 0
3298
        jnz     @f
3299
        mov     esi, aUp+aUp.size-1
3300
        mov     cl, aUp.size
3301
@@:
3302
        sub     [esp], ecx
3303
@@:
3304
        lodsb
3305
        stosw
3306
        loop    @b
3307
        pop     ecx
3308
        jmp     .size_done
3309
.size_file:
3310
        mov     edx, [ebx+36]
3311
        test    edx, edx
3312
        jz      .size_less_4g
3313
        cmp     edx, 10*256
3314
        jae     .size_tera
3315
; в гигабайтах
3316
        mov     al, 'G'
283 diamond 3317
        shl     edx, 2
180 heavyiron 3318
        jmp     .size_letter
3319
.size_tera:
3320
; в терабайтах
3321
        shr     edx, 8
3322
        mov     al, 'T'
3323
        jmp     .size_letter
3324
.size_less_4g:
3325
        mov     edx, [ebx+32]
3326
        cmp     edx, 10*(1 shl 20)
3327
        jae     .size_mega
3328
        cmp     edx, 1 shl 20
3329
        jb      .size_num
3330
        shr     edx, 10
3331
        mov     al, 'K'
3332
        jmp     .size_letter
3333
.size_mega:
3334
        mov     al, 'M'
3335
        shr     edx, 20
3336
.size_letter:
3337
        stosw
3338
        dec     ecx
3339
        mov     al, ' '
3340
        stosw
3341
        dec     ecx
3342
.size_num:
3343
        xchg    eax, edx
3344
        xor     edx, edx
3345
        div     [_10d]
3346
        xchg    eax, edx
3347
        add     al, '0'
3348
        mov     ah, [panel_normal_color]
3349
        stosw
3350
        dec     ecx
3351
        test    edx, edx
3352
        jnz     .size_num
3353
.size_done:
3354
        cld
474 diamond 3355
.show_curname:
180 heavyiron 3356
; Имя
3357
        sub     edi, ecx
3358
        sub     edi, ecx
3359
        lea     esi, [ebx+40]
3360
@@:
3361
        lodsb
3362
        test    al, al
3363
        jnz     @b
3364
        sub     esi, ebx
3365
        sub     esi, 41
3366
        mov     ah, [panel_normal_color]
3367
        cmp     esi, ecx
3368
        lea     edx, [ebx+40]
3369
        jbe     @f
3370
        mov     al, '{'
3371
        mov     [edi-2], ax
3372
        add     edx, esi
3373
        sub     edx, ecx
3374
@@:
3375
        mov     esi, edx
3376
@@:
3377
        lodsb
3378
        test    al, al
3379
        jz      @f
3380
        stosw
3381
        loop    @b
3382
@@:
3383
        mov     al, ' '
3384
        rep     stosw
3385
.skip_curinfo:
3386
        call    draw_image
3387
        ret
3388
 
474 diamond 3389
fill_total_info:
3390
        mov     edi, saved_file_name+511
3391
        mov     byte [edi], ' '
180 heavyiron 3392
if lang eq ru
474 diamond 3393
        mov     byte [edi-1], 'е'
3394
        dec     edi
3395
        cmp     eax, 1
3396
        jz      @f
3397
        mov     word [edi-1], 'ах'
3398
        dec     edi
3399
@@:
3400
        mov     dword [edi-4], 'файл'
3401
        mov     byte [edi-5], ' '
3402
        sub     edi, 5
180 heavyiron 3403
else
474 diamond 3404
        cmp     eax, 1
3405
        jz      @f
3406
        dec     edi
3407
        mov     byte [edi], 's'
3408
@@:
3409
        mov     dword [edi-4], 'file'
3410
        mov     byte [edi-5], ' '
3411
        sub     edi, 5
180 heavyiron 3412
end if
474 diamond 3413
        xor     edx, edx
3414
        push    10
3415
        pop     ecx
3416
@@:
3417
        div     ecx
3418
        dec     edi
3419
        add     dl, '0'
3420
        mov     [edi], dl
3421
        xor     edx, edx
3422
        test    eax, eax
3423
        jnz     @b
180 heavyiron 3424
if lang eq ru
474 diamond 3425
        mov     dword [edi-4], 'т в '
3426
        mov     dword [edi-8], ' бай'
3427
        sub     edi, 8
180 heavyiron 3428
else
474 diamond 3429
        mov     dword [edi-4], ' in '
3430
        mov     dword [edi-8], 'ytes'
3431
        mov     word [edi-10], ' b'
3432
        sub     edi, 10
180 heavyiron 3433
end if
474 diamond 3434
        lea     esi, [edi-3]
3435
        mov     edx, [esp+8]
3436
        mov     eax, [esp+4]
3437
.selsizel:
3438
        push    edx
3439
        mov     ebx, edx
3440
        xor     edx, edx
3441
        add     ebx, ebx
3442
        adc     edx, edx
3443
        push    ebx
3444
        push    edx
3445
        add     ebx, ebx
3446
        adc     edx, edx
3447
        add     ebx, [esp+4]
3448
        adc     edx, [esp]
3449
        add     esp, 8
3450
        add     eax, ebx
3451
        adc     edx, 0
3452
        div     ecx
3453
        dec     edi
3454
        cmp     edi, esi
3455
        jae     @f
3456
        mov     byte [edi], ','
3457
        dec     edi
3458
        sub     esi, 4
3459
@@:
3460
        pop     ebx
3461
        add     dl, '0'
3462
        mov     byte [edi], dl
3463
        xchg    eax, ebx
3464
        mul     [muldiv10]
3465
        add     eax, ebx
3466
        adc     edx, 0
3467
        mov     ebx, eax
3468
        or      ebx, edx
3469
        jnz     .selsizel
3470
        dec     edi
3471
        mov     byte [edi], ' '
3472
        mov     ecx, saved_file_name+512
3473
        sub     ecx, edi
3474
        ret     8
3475
 
3476
get_file_color:
3477
        mov     ah, [esi + 6]
3478
        cmp     ebp, [active_panel]
3479
        jnz     @f
3480
        cmp     ecx, [ebp + panel1_index - panel1_data]
3481
        jnz     @f
3482
        mov     ah, [esi + 7]
3483
@@:
3484
        test    byte [esi + 303], 1
3485
        jnz     @f
3486
        mov     ah, [esi + 4]
3487
        cmp     ebp, [active_panel]
3488
        jnz     @f
3489
        cmp     ecx, [ebp + panel1_index - panel1_data]
3490
        jnz     @f
3491
        mov     ah, [esi + 5]
3492
@@:
3493
        ret
3494
 
3495
draw_name_column:
3496
        mov     eax, [column_index]
3497
        mov     [last_column_index], eax
180 heavyiron 3498
        mov     edx, [ebp + panel1_numfiles - panel1_data]
3499
        mov     ecx, [column_height]
3500
        dec     ecx
3501
.l:
3502
        cmp     [column_index], edx
3503
        jae     .ret
3504
        push    ecx
474 diamond 3505
        mov     ecx, [column_index]
3506
        mov     esi, [ebp + panel1_files - panel1_data]
3507
        mov     esi, [esi+ecx*4]
3508
        mov     ebx, [esi]
3509
        call    get_file_color
321 diamond 3510
        add     esi, 40
180 heavyiron 3511
        mov     ecx, [column_width]
3512
        push    edi
3513
@@:
3514
        lodsb
3515
        test    al, al
3516
        jz      @f
3517
        stosw
3518
        loop    @b
474 diamond 3519
        lodsb
3520
        test    al, al
180 heavyiron 3521
        jz      @f
3522
        mov     byte [edi], '}'
474 diamond 3523
        jmp     .continue
180 heavyiron 3524
@@:
474 diamond 3525
        test    bl, 10h
3526
        jnz     .noalignext
3527
        mov     ebx, [ebp + panel1_colmode - panel1_data]
3528
; sizeof(PanelMode) = 40
3529
        lea     ebx, [ebx+ebx*4]
3530
        cmp     [colmodes+ebx*8+PanelMode.bAlignExtensions], 0
3531
        jz      .noalignext
3532
        push    ecx
3533
        sub     ecx, [column_width]
3534
        neg     ecx
3535
        jz      .noalignext2
3536
        dec     esi
3537
@@:
3538
        dec     esi
3539
        cmp     byte [esi], '.'
3540
        loopnz  @b
3541
        jnz     .noalignext2
3542
        inc     esi
3543
        sub     ecx, [column_width]
3544
        neg     ecx
3545
        sub     ecx, [esp]
3546
        sub     edi, ecx
3547
        sub     edi, ecx
3548
        dec     ecx
3549
        mov     ebx, [esp+4]
3550
        cmp     ecx, 3
3551
        ja      @f
3552
        mov     cl, 3
3553
@@:
3554
        sub     ecx, [column_width]
3555
        sub     ebx, edi
3556
        sar     ebx, 1
3557
        sub     ebx, ecx
3558
        pop     ecx
3559
        inc     ecx
3560
        push    0
3561
        cmp     ecx, ebx
3562
        jbe     @f
3563
        sub     ecx, ebx
3564
        mov     [esp], ecx
3565
        mov     ecx, ebx
3566
@@:
180 heavyiron 3567
        mov     al, ' '
3568
        rep     stosw
474 diamond 3569
@@:
3570
        lodsb
3571
        test    al, al
3572
        jz      .noalignext2
3573
        stosw
3574
        jmp     @b
3575
.noalignext2:
3576
        pop     ecx
3577
.noalignext:
3578
        mov     al, ' '
3579
        rep     stosw
3580
.continue:
180 heavyiron 3581
        pop     edi
3582
        add     edi, [cur_width]
3583
        add     edi, [cur_width]
3584
        inc     [column_index]
3585
        pop     ecx
3586
        dec     ecx
3587
        jnz     .l
3588
.ret:
474 diamond 3589
        mov     eax, [ebp + panel1_colsz - panel1_data]
3590
        add     [ebp + panel1_colst - panel1_data], eax
180 heavyiron 3591
        cmp     ebp, panel1_data
3592
        jnz     .ret2
3593
; Число экранов
3594
        mov     eax, [num_screens]
3595
        dec     eax
3596
        jz      .ret2
3597
        push    eax
3598
        xor     eax, eax
3599
        xor     edx, edx
3600
        call    get_console_ptr
3601
        mov     ah, [panel_nscreens_color]
3602
        mov     al, '['
3603
        stosw
3604
        pop     eax
3605
        push    -'0'
3606
@@:
3607
        xor     edx, edx
3608
        div     [_10d]
3609
        push    edx
3610
        test    eax, eax
3611
        jnz     @b
3612
@@:
3613
        pop     eax
3614
        add     eax, '0'
3615
        jz      @f
3616
        mov     ah, [panel_nscreens_color]
3617
        stosw
3618
        jmp     @b
3619
@@:
3620
        mov     al, ']'
3621
        mov     ah, [panel_nscreens_color]
3622
        stosw
3623
.ret2:
474 diamond 3624
draw_empty_column:
180 heavyiron 3625
        ret
3626
 
474 diamond 3627
draw_size_column:
3628
        add     edi, [column_width]
3629
        add     edi, [column_width]
3630
        dec     edi
3631
        dec     edi
3632
        std
3633
        mov     ecx, [column_height]
3634
        dec     ecx
3635
        push    [last_column_index]
3636
.l:
3637
        mov     edx, [ebp + panel1_numfiles - panel1_data]
3638
        cmp     [last_column_index], edx
3639
        jae     .ret
3640
        push    ecx
3641
        push    edi
3642
        mov     ecx, [last_column_index]
3643
        mov     esi, [ebp + panel1_files - panel1_data]
3644
        mov     esi, [esi+ecx*4]
3645
        call    get_file_color
3646
        mov     ecx, [column_width]
3647
@@:
3648
        mov     ebx, eax
3649
        cmp     word [esi+40], '..'
3650
        jnz     .nodotdot
3651
        cmp     byte [esi+42], 0
3652
        jnz     .nodotdot
3653
if lang eq ru
3654
        mov     al, 'х'
3655
        stosw
3656
        mov     al, 'р'
3657
        stosw
3658
        mov     al, 'е'
3659
        stosw
3660
        mov     al, 'в'
3661
        stosw
3662
        mov     al, 'В'
3663
        stosw
3664
        sub     ecx, 5
3665
else
3666
        mov     al, ' '
3667
        stosw
3668
        stosw
3669
        mov     al, 'p'
3670
        stosw
3671
        mov     al, 'U'
3672
        stosw
3673
        sub     ecx, 4
3674
end if
3675
        jmp     .size_written
3676
.nodotdot:
3677
        test    byte [esi], 10h
3678
        jz      .nofolder
3679
if lang eq ru
3680
        mov     al, 'а'
3681
        stosw
3682
        mov     al, 'к'
3683
        stosw
3684
        mov     al, 'п'
3685
        stosw
3686
        mov     al, 'а'
3687
        stosw
3688
        mov     al, 'П'
3689
        stosw
3690
        sub     ecx, 5
3691
else
3692
        mov     al, 'r'
3693
        stosw
3694
        mov     al, 'e'
3695
        stosw
3696
        mov     al, 'd'
3697
        stosw
3698
        mov     al, 'l'
3699
        stosw
3700
        mov     al, 'o'
3701
        stosw
3702
        mov     al, 'F'
3703
        stosw
3704
        sub     ecx, 6
3705
end if
3706
        jmp     .size_written
3707
.nofolder:
3708
        mov     eax, [esi+32]
3709
        mov     edx, [esi+36]
3710
        test    edx, edx
3711
        jz      .less_4G
3712
        cmp     edx, 10000/4*1024
3713
        jb      .giga
3714
        mov     al, 'T'
3715
        shr     edx, 10
3716
        jmp     .write_letter
3717
.giga:
3718
        mov     al, 'G'
3719
        shl     edx, 2
3720
        jmp     .write_letter
3721
.less_4G:
3722
        mov     edx, eax
3723
        cmp     eax, 1000000
3724
        jb      .byte
3725
        cmp     eax, 10000*1024
3726
        jb      .kilo
3727
        mov     al, 'M'
3728
        shr     edx, 20
3729
        jmp     .write_letter
3730
.kilo:
3731
        mov     al, 'K'
3732
        shr     edx, 10
3733
.write_letter:
3734
        mov     ah, bh
3735
        stosw
3736
        mov     al, ' '
3737
        stosw
3738
        dec     ecx
3739
        dec     ecx
3740
.byte:
3741
        xchg    eax, edx
3742
        xor     edx, edx
3743
        div     [_10d]
3744
        xchg    eax, edx
3745
        add     al, '0'
3746
        mov     ah, bh
3747
        stosw
3748
        dec     ecx
3749
        test    edx, edx
3750
        jnz     .byte
3751
.size_written:
3752
        mov     eax, ebx
3753
        test    ecx, ecx
3754
        jle     @f
3755
        mov     al, ' '
3756
        rep     stosw
3757
@@:
3758
        mov     byte [edi+1], ah
3759
        pop     edi
3760
        add     edi, [cur_width]
3761
        add     edi, [cur_width]
3762
        inc     [last_column_index]
3763
        pop     ecx
3764
        dec     ecx
3765
        jnz     .l
3766
.ret:
3767
        pop     [last_column_index]
3768
        cld
3769
        ret
3770
 
3771
draw_date_column:
3772
        mov     ecx, [column_height]
3773
        dec     ecx
3774
        push    [last_column_index]
3775
.l:
3776
        mov     edx, [ebp + panel1_numfiles - panel1_data]
3777
        cmp     [last_column_index], edx
3778
        jae     .ret
3779
        push    ecx
3780
        push    edi
3781
        mov     ecx, [last_column_index]
3782
        mov     esi, [ebp + panel1_files - panel1_data]
3783
        mov     esi, [esi+ecx*4]
3784
        call    get_file_color
3785
        mov     bh, ah
3786
        mov     byte [edi-1], bh
3787
        mov     al, [esi+28]
3788
        aam
3789
        add     eax, '00'
3790
        push    eax
3791
        mov     al, ah
3792
        mov     ah, bh
3793
        stosw
3794
        pop     eax
3795
        mov     ah, bh
3796
        stosw
3797
        mov     al, '.'
3798
        stosw
3799
        mov     al, [esi+29]
3800
        aam
3801
        add     eax, '00'
3802
        push    eax
3803
        mov     al, ah
3804
        mov     ah, bh
3805
        stosw
3806
        pop     eax
3807
        mov     ah, bh
3808
        stosw
3809
        mov     al, '.'
3810
        stosw
3811
        movzx   eax, word [esi+30]
3812
        xor     edx, edx
3813
        div     [_10d]
3814
        xchg    eax, edx
3815
        add     al, '0'
3816
        mov     ah, bh
3817
        mov     [edi+2], ax
3818
        xchg    eax, edx
3819
        xor     edx, edx
3820
        div     [_10d]
3821
        xchg    eax, edx
3822
        add     al, '0'
3823
        mov     ah, bh
3824
        stosw
3825
        pop     edi
3826
        add     edi, [cur_width]
3827
        add     edi, [cur_width]
3828
        inc     [last_column_index]
3829
        pop     ecx
3830
        dec     ecx
3831
        jnz     .l
3832
.ret:
3833
        pop     [last_column_index]
3834
        cld
3835
        ret
3836
 
3837
draw_time_column:
3838
        mov     ecx, [column_height]
3839
        dec     ecx
3840
        push    [last_column_index]
3841
.l:
3842
        mov     edx, [ebp + panel1_numfiles - panel1_data]
3843
        cmp     [last_column_index], edx
3844
        jae     .ret
3845
        push    ecx
3846
        push    edi
3847
        mov     ecx, [last_column_index]
3848
        mov     esi, [ebp + panel1_files - panel1_data]
3849
        mov     esi, [esi+ecx*4]
3850
        call    get_file_color
3851
        mov     bh, ah
3852
        mov     byte [edi-1], bh
3853
        mov     al, [esi+26]
3854
        aam
3855
        add     eax, '00'
3856
        push    eax
3857
        mov     al, ah
3858
        mov     ah, bh
3859
        stosw
3860
        pop     eax
3861
        mov     ah, bh
3862
        stosw
3863
        mov     al, ':'
3864
        stosw
3865
        mov     al, [esi+25]
3866
        aam
3867
        add     eax, '00'
3868
        push    eax
3869
        mov     al, ah
3870
        mov     ah, bh
3871
        stosw
3872
        pop     eax
3873
        mov     ah, bh
3874
        stosw
3875
        pop     edi
3876
        add     edi, [cur_width]
3877
        add     edi, [cur_width]
3878
        inc     [last_column_index]
3879
        pop     ecx
3880
        dec     ecx
3881
        jnz     .l
3882
.ret:
3883
        pop     [last_column_index]
3884
        cld
3885
        ret
3886
 
180 heavyiron 3887
;insert_last_dot:
3888
;        push    eax esi
3889
;        mov     ah, 0
3890
;.loop:
3891
;        lodsb
3892
;        test    al, al
3893
;        jz      .done
3894
;        cmp     al, '.'
3895
;        jnz     .loop
3896
;        mov     ah, 1
3897
;        jmp     .loop
3898
;.done:
3899
;        test    ah, ah
3900
;        jnz     @f
3901
;        mov     byte [esi-1], '.'
3902
;        mov     byte [esi], 0
3903
;@@:
3904
;        pop     esi eax
3905
;        ret
3906
 
3907
;delete_last_dot:
3908
;        push    esi
3909
;@@:
3910
;        cmp     byte [esi], 0
3911
;        jz      @f
3912
;        inc     esi
3913
;        jmp     @b
3914
;@@:
3915
;        cmp     byte [esi-1], '.'
3916
;        jnz     @f
3917
;        mov     byte [esi-1], 0
3918
;@@:     pop     esi
3919
;        ret
3920
 
3921
read_folder:
3922
        mov     eax, [ebp + panel1_nfa - panel1_data]
3923
        mov     [dirinfo.size], eax
3924
        shl     eax, 2
3925
        add     eax, [ebp + panel1_files - panel1_data]
3926
        mov     [dirinfo.dirdata], eax
3927
        lea     eax, [ebp + panel1_dir - panel1_data]
3928
        mov     [dirinfo.name], eax
474 diamond 3929
        xor     eax, eax
3930
        mov     [ebp + panel1_total_num - panel1_data], eax
3931
        mov     dword [ebp + panel1_total_size - panel1_data], eax
3932
        mov     dword [ebp + panel1_total_size+4 - panel1_data], eax
3933
        mov     [ebp + panel1_selected_num - panel1_data], eax
3934
        mov     dword [ebp + panel1_selected_size - panel1_data], eax
3935
        mov     dword [ebp + panel1_selected_size+4 - panel1_data], eax
314 diamond 3936
.retry:
180 heavyiron 3937
        push    70
3938
        pop     eax
3939
        mov     ebx, dirinfo
485 heavyiron 3940
        mcall
180 heavyiron 3941
        test    eax, eax
3942
        jz      .ok
3943
        cmp     eax, 6
3944
        jz      .ok
314 diamond 3945
; Failed to read folder, notify user
3946
        cmp     [bSilentFolderMode], 0
3947
        jnz     .dont_notify
474 diamond 3948
        push    dword aContinue
3949
        push    dword aRetry
314 diamond 3950
        mov     edx, esp
3951
        call    get_error_msg
3952
        push    [dirinfo.name]
474 diamond 3953
        push    dword aCannotReadFolder
314 diamond 3954
        push    eax
3955
        mov     eax, esp
3956
        push    edx
3957
        push    2
3958
        push    eax
3959
        push    3
3960
        push    -1
3961
        push    -1
474 diamond 3962
        push    dword aError
314 diamond 3963
        call    SayErr
3964
        add     esp, 5*4
3965
        test    eax, eax
3966
        jz      .retry
3967
.dont_notify:
3968
        mov     esi, prev_dir
3969
        cmp     byte [esi], 0
3970
        jz      @f
3971
        lea     edi, [ebp + panel1_dir - panel1_data]
3972
        mov     ecx, 1024/4
3973
        rep     movsd
3974
        mov     byte [prev_dir], 0
3975
        ret
3976
@@:
3977
        mov     [bSilentFolderMode], 1  ; enter silent mode
3978
        mov     esi, [dirinfo.name]
3979
        xor     edx, edx
3980
.up1:
3981
        lodsb
3982
        test    al, al
3983
        jz      .up1done
3984
        cmp     al, '/'
3985
        jnz     .up1
3986
        inc     edx
3987
        lea     edi, [esi-1]
3988
        jmp     .up1
3989
.up1done:
3990
        cmp     edx, 2
3991
        jbe     .noup
3992
        stosb
3993
        jmp     read_folder
3994
.noup:
3995
        mov     esi, [dirinfo.name]
3996
        mov     edi, esi
3997
        lodsd
3998
        or      eax, 0x00202000
3999
        cmp     eax, '/rd/'
4000
        jnz     @f
4001
        lodsw
4002
        cmp     ax, '1'
4003
        jz      .nosetrd
4004
@@:
4005
        mov     eax, '/rd/'
4006
        stosd
4007
        mov     ax, '1'
4008
        stosw
4009
        jmp     read_folder
4010
.nosetrd:
4011
; Даже рамдиск не прочитался. Значит, не судьба...
4012
        and     dword [ebp + panel1_numfiles - panel1_data], 0
180 heavyiron 4013
        and     dword [ebp + panel1_index - panel1_data], 0
4014
        and     dword [ebp + panel1_start - panel1_data], 0
314 diamond 4015
        mov     [bSilentFolderMode], 0  ; leave silent mode
180 heavyiron 4016
        ret
4017
.ok:
4018
        mov     eax, [dirinfo.dirdata]
4019
        cmp     [eax+8], ebx
4020
        jz      .readdone
474 diamond 4021
        push    dword [eax+8]
4022
        mov     ecx, [ebp + panel1_files - panel1_data]
4023
        call    pgfree
4024
        pop     ecx
4025
        add     ecx, 0xF
4026
        and     ecx, not 0xF
4027
        push    ecx
4028
        imul    ecx, 4+304
4029
        add     ecx, 32
4030
        call    xpgalloc
180 heavyiron 4031
        test    eax, eax
4032
        jnz     .succ1
4033
        pop     eax
4034
        jmp     .readdone
4035
.succ1:
4036
        mov     [ebp + panel1_files - panel1_data], eax
4037
        pop     [ebp + panel1_nfa - panel1_data]
321 diamond 4038
        mov     [prev_dir], 0
180 heavyiron 4039
        jmp     read_folder
4040
.readdone:
4041
        and     [ebp + panel1_start - panel1_data], 0
4042
        and     [ebp + panel1_index - panel1_data], 0
4043
        and     [ebp + panel1_start - panel1_data], 0
4044
        mov     edi, [ebp + panel1_files - panel1_data]
4045
        mov     eax, [ebp + panel1_nfa - panel1_data]
321 diamond 4046
        lea     eax, [edi + eax*4 + 32]
4047
        mov     ecx, [eax-32+4]
283 diamond 4048
        test    ecx, ecx
4049
        jz      .loopdone
321 diamond 4050
        xor     edx, edx
180 heavyiron 4051
; Игнорируем специальные входы, соответствующие папке '.' и метке тома
4052
.ptrinit:
321 diamond 4053
        cmp     word [eax+40], '.'
180 heavyiron 4054
        jz      .loopcont
321 diamond 4055
        test    byte [eax], 8
180 heavyiron 4056
        jnz     .loopcont
474 diamond 4057
        mov     byte [eax+303], 0
321 diamond 4058
        test    edx, edx
4059
        jnz     .nodotdot
4060
        cmp     word [eax+40], '..'
4061
        jnz     .nodotdot
4062
        cmp     byte [eax+42], 0
4063
        jnz     .nodotdot
4064
        mov     edx, eax
4065
        push    edi
4066
@@:
4067
        cmp     edi, [ebp + panel1_files - panel1_data]
4068
        jbe     @f
4069
        push    dword [edi-4]
4070
        pop     dword [edi]
4071
        sub     edi, 4
4072
        jmp     @b
4073
@@:
180 heavyiron 4074
        stosd
321 diamond 4075
        pop     edi
4076
        scasd
4077
        jmp     .dotdot
4078
.nodotdot:
4079
        stosd
474 diamond 4080
        xor     ebx, ebx
4081
        test    byte [eax], 10h
4082
        setz    bl
4083
        add     [ebp + panel1_total_num - panel1_data], ebx
4084
        mov     ebx, dword [eax+32]
4085
        add     dword [ebp + panel1_total_size - panel1_data], ebx
4086
        mov     ebx, dword [eax+36]
4087
        adc     dword [ebp + panel1_total_size+4 - panel1_data], ebx
321 diamond 4088
.dotdot:
283 diamond 4089
; подсветка
4090
;        call    insert_last_dot
4091
        pushad
321 diamond 4092
        mov     ebp, eax
283 diamond 4093
        lea     esi, [ebp+40]
4094
        mov     edi, lower_file_name
4095
        mov     edx, edi
474 diamond 4096
        xor     eax, eax
283 diamond 4097
@@:
4098
        lodsb
474 diamond 4099
        mov     al, [tolower_table+eax]
283 diamond 4100
        stosb
4101
        test    al, al
4102
        jnz     @b
4103
        mov     esi, edx
4104
        lea     edx, [edi-1]
4105
        xor     ecx, ecx
4106
.highlight_test_loop:
4107
        mov     ebx, [highlight_groups+ecx*4]
4108
        mov     al, [ebx + highlight.IncludeAttributes]
4109
        mov     ah, [ebp]
4110
        and     ah, al
4111
        cmp     ah, al
4112
        jnz     .highlight_test_failed
4113
        lea     edi, [ebx + highlight.Mask]
4114
        call    match_mask_rev_lowercase
4115
        jc      .highlight_test_failed
4116
        mov     ah, [ebx + highlight.NormalColor]
4117
        test    ah, ah
4118
        jnz     @f
4119
        mov     ah, [panel_normal_color]
4120
@@:
474 diamond 4121
        mov     [ebp+4], ah
283 diamond 4122
        mov     ah, [ebx + highlight.CursorColor]
4123
        test    ah, ah
4124
        jnz     @f
4125
        mov     ah, [panel_cursor_color]
4126
@@:
474 diamond 4127
        mov     [ebp+5], ah
4128
        mov     ah, [ebx + highlight.SelectedColor]
4129
        test    ah, ah
4130
        jnz     @f
4131
        mov     ah, [panel_selected_color]
4132
@@:
283 diamond 4133
        mov     [ebp+6], ah
474 diamond 4134
        mov     ah, [ebx + highlight.SelectedCursorColor]
4135
        test    ah, ah
4136
        jnz     @f
4137
        mov     ah, [panel_selected_cursor_color]
4138
@@:
4139
        mov     [ebp+7], ah
283 diamond 4140
        jmp     .doname
4141
.highlight_test_failed:
4142
        inc     ecx
4143
        cmp     ecx, [highlight_num_groups]
4144
        jb      .highlight_test_loop
4145
.nohighlight:
4146
        mov     ah, [panel_normal_color]
474 diamond 4147
        mov     [ebp+4], ah
4148
        mov     ah, [panel_cursor_color]
283 diamond 4149
        mov     [ebp+5], ah
474 diamond 4150
        mov     ah, [panel_selected_color]
283 diamond 4151
        mov     [ebp+6], ah
474 diamond 4152
        mov     ah, [panel_selected_cursor_color]
4153
        mov     [ebp+7], ah
283 diamond 4154
.doname:
4155
;        call    delete_last_dot
4156
        popad
180 heavyiron 4157
.loopcont:
4158
        add     eax, 304
283 diamond 4159
        dec     ecx
4160
        jnz     .ptrinit
180 heavyiron 4161
.loopdone:
4162
        sub     edi, [ebp + panel1_files - panel1_data]
4163
        shr     edi, 2
4164
        mov     [ebp + panel1_numfiles - panel1_data], edi
4165
.done:
4166
; Сортировка
4167
sort_files:
4168
        movzx   eax, [ebp + panel1_sortmode - panel1_data]
4169
        mov     ebx, [compare_fns + eax*4]
4170
        mov     edx, [ebp + panel1_files - panel1_data]
4171
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
321 diamond 4172
        jecxz   .skip
4173
        mov     eax, [edx]
474 diamond 4174
        cmp     word [eax+40], '..'
321 diamond 4175
        jnz     .nodotdot
474 diamond 4176
        cmp     byte [eax+42], 0
321 diamond 4177
        jnz     .nodotdot
4178
        dec     ecx
4179
        add     edx, 4
4180
.nodotdot:
180 heavyiron 4181
        call    sort
321 diamond 4182
.skip:
314 diamond 4183
        mov     [bSilentFolderMode], 0  ; leave silent mode
180 heavyiron 4184
        ret
4185
 
4186
compare_name:
4187
        test    byte [esi], 10h
4188
        jnz     .1dir
4189
        test    byte [edi], 10h
4190
        jnz     .greater
4191
.eq1:
4192
        add     esi, 40
4193
        add     edi, 40
4194
        jmp     strcmpi
4195
.greater:
4196
        test    esi, esi
4197
        ret
4198
.1dir:
4199
        test    byte [edi], 10h
4200
        jnz     .eq1
4201
.less:
4202
        xor     edi, edi
4203
        stc
4204
        ret
4205
 
4206
compare_name_rev:
4207
        test    byte [esi], 10h
4208
        jnz     .1dir
4209
        test    byte [edi], 10h
4210
        jnz     .greater
4211
.eq1:
4212
        add     esi, 40
4213
        add     edi, 40
4214
        xchg    esi, edi
4215
        jmp     strcmpi
4216
.greater:
4217
        test    esi, esi
4218
        ret
4219
.1dir:
4220
        test    byte [edi], 10h
4221
        jnz     .eq1
4222
.less:
4223
        xor     edi, edi
4224
        stc
4225
        ret
4226
 
4227
strcmpi:
4228
        push    eax
4229
@@:
4230
        lodsb
4231
        call    match_symbol
4232
        jnz     .ret
4233
        inc     edi
4234
        test    al, al
4235
        jnz     @b
4236
.ret:
4237
        pop     eax
4238
        ret
4239
 
4240
compare_ext:
4241
        test    byte [esi], 10h
4242
        jnz     .1dir
4243
        test    byte [edi], 10h
4244
        jnz     .greater
4245
.eq1:
4246
        add     esi, 40
4247
        add     edi, 40
4248
        push    esi edi
4249
        call    seek_ext
4250
        xchg    esi, edi
4251
        call    seek_ext
4252
        xchg    esi, edi
4253
        call    strcmpi
4254
        jnz     .ret
4255
        pop     edi esi
4256
        jmp     strcmpi
4257
.ret:
4258
        pop     edi esi
4259
        ret
4260
.greater:
4261
        test    esi, esi
4262
        ret
4263
.1dir:
4264
        test    byte [edi], 10h
4265
        jnz     .eq1
4266
.less:
4267
        xor     edi, edi
4268
        stc
4269
        ret
4270
 
4271
compare_ext_rev:
4272
        test    byte [esi], 10h
4273
        jnz     .1dir
4274
        test    byte [edi], 10h
4275
        jnz     .greater
4276
.eq1:
4277
        add     esi, 40
4278
        add     edi, 40
4279
        push    esi edi
4280
        call    seek_ext
4281
        xchg    esi, edi
4282
        call    seek_ext
4283
        call    strcmpi
4284
        jnz     .ret
4285
        pop     edi esi
4286
        xchg    esi, edi
4287
        jmp     strcmpi
4288
.ret:
4289
        pop     edi esi
4290
        ret
4291
.greater:
4292
        test    esi, esi
4293
        ret
4294
.1dir:
4295
        test    byte [edi], 10h
4296
        jnz     .eq1
4297
.less:
4298
        xor     edi, edi
4299
        stc
4300
        ret
4301
 
4302
seek_ext:
4303
        push    eax
4304
        xor     eax, eax
4305
.l:
4306
        inc     esi
4307
        cmp     byte [esi-1], '.'
4308
        jnz     @f
4309
        mov     eax, esi
4310
@@:
4311
        cmp     byte [esi-1], 0
4312
        jnz     .l
4313
        test    eax, eax
4314
        jnz     @f
4315
        lea     eax, [esi-1]
4316
@@:
4317
        mov     esi, eax
4318
        pop     eax
4319
        ret
4320
 
4321
compare_modified:
4322
        test    byte [esi], 10h
4323
        jnz     .1dir
4324
        test    byte [edi], 10h
4325
        jnz     .greater
4326
.eq1:
4327
        push    edi
4328
        mov     edi, [edi+28]
4329
        cmp     edi, [esi+28]
4330
        pop     edi
4331
        jnz     @f
4332
        push    edi
4333
        mov     edi, [edi+24]
4334
        cmp     edi, [esi+24]
4335
        pop     edi
4336
        jnz     @f
4337
        add     esi, 40
4338
        add     edi, 40
4339
        jmp     strcmpi
4340
@@:
4341
        ret
4342
.greater:
4343
        test    esi, esi
4344
        ret
4345
.1dir:
4346
        test    byte [edi], 10h
4347
        jnz     .eq1
4348
.less:
4349
        xor     edi, edi
4350
        stc
4351
        ret
4352
 
4353
compare_modified_rev:
4354
        test    byte [esi], 10h
4355
        jnz     .1dir
4356
        test    byte [edi], 10h
4357
        jnz     .greater
4358
.eq1:
4359
        push    esi
4360
        mov     esi, [esi+28]
4361
        cmp     esi, [edi+28]
4362
        pop     esi
4363
        jnz     @f
4364
        push    esi
4365
        mov     esi, [esi+24]
4366
        cmp     esi, [edi+24]
4367
        pop     esi
4368
        jnz     @f
4369
        add     esi, 40
4370
        add     edi, 40
4371
        xchg    esi, edi
4372
        jmp     strcmpi
4373
@@:
4374
        ret
4375
.greater:
4376
        test    esi, esi
4377
        ret
4378
.1dir:
4379
        test    byte [edi], 10h
4380
        jnz     .eq1
4381
.less:
4382
        xor     edi, edi
4383
        stc
4384
        ret
4385
 
4386
compare_size:
4387
        test    byte [esi], 10h
4388
        jnz     .1dir
4389
        test    byte [edi], 10h
4390
        jnz     .greater
4391
.eq1:
4392
        push    edi
4393
        mov     edi, [edi+36]
4394
        cmp     edi, [esi+36]
4395
        pop     edi
4396
        jnz     @f
4397
        push    edi
4398
        mov     edi, [edi+32]
4399
        cmp     edi, [esi+32]
4400
        pop     edi
4401
        jnz     @f
4402
        add     esi, 40
4403
        add     edi, 40
4404
        jmp     strcmpi
4405
@@:
4406
        ret
4407
.greater:
4408
        test    esi, esi
4409
        ret
4410
.1dir:
4411
        test    byte [edi], 10h
4412
        jnz     .eq1
4413
.less:
4414
        xor     edi, edi
4415
        stc
4416
        ret
4417
 
4418
compare_size_rev:
4419
        test    byte [esi], 10h
4420
        jnz     .1dir
4421
        test    byte [edi], 10h
4422
        jnz     .greater
4423
.eq1:
4424
        push    esi
4425
        mov     esi, [esi+36]
4426
        cmp     esi, [edi+36]
4427
        pop     esi
4428
        jnz     @f
4429
        push    esi
4430
        mov     esi, [esi+32]
4431
        cmp     esi, [edi+32]
4432
        pop     esi
4433
        jnz     @f
4434
        add     esi, 40
4435
        add     edi, 40
4436
        xchg    esi, edi
4437
        jmp     strcmpi
4438
@@:
4439
        ret
4440
.greater:
4441
        test    esi, esi
4442
        ret
4443
.1dir:
4444
        test    byte [edi], 10h
4445
        jnz     .eq1
4446
.less:
4447
        xor     edi, edi
4448
        stc
4449
        ret
4450
 
4451
compare_unordered:
4452
        cmp     esi, edi
4453
        ret
4454
compare_unordered_rev:
4455
        cmp     edi, esi
4456
        ret
4457
 
4458
compare_created:
4459
        test    byte [esi], 10h
4460
        jnz     .1dir
4461
        test    byte [edi], 10h
4462
        jnz     .greater
4463
.eq1:
4464
        push    edi
4465
        mov     edi, [edi+12]
4466
        cmp     edi, [esi+12]
4467
        pop     edi
4468
        jnz     @f
4469
        push    edi
4470
        mov     edi, [edi+8]
4471
        cmp     edi, [esi+8]
4472
        pop     edi
4473
        jnz     @f
4474
        add     esi, 40
4475
        add     edi, 40
4476
        jmp     strcmpi
4477
@@:
4478
        ret
4479
.greater:
4480
        test    esi, esi
4481
        ret
4482
.1dir:
4483
        test    byte [edi], 10h
4484
        jnz     .eq1
4485
.less:
4486
        xor     edi, edi
4487
        stc
4488
        ret
4489
 
4490
compare_created_rev:
4491
        test    byte [esi], 10h
4492
        jnz     .1dir
4493
        test    byte [edi], 10h
4494
        jnz     .greater
4495
.eq1:
4496
        push    esi
4497
        mov     esi, [esi+12]
4498
        cmp     esi, [edi+12]
4499
        pop     esi
4500
        jnz     @f
4501
        push    esi
4502
        mov     esi, [esi+8]
4503
        cmp     esi, [edi+8]
4504
        pop     esi
4505
        jnz     @f
4506
        add     esi, 40
4507
        add     edi, 40
4508
        xchg    esi, edi
4509
        jmp     strcmpi
4510
@@:
4511
        ret
4512
.greater:
4513
        test    esi, esi
4514
        ret
4515
.1dir:
4516
        test    byte [edi], 10h
4517
        jnz     .eq1
4518
.less:
4519
        xor     edi, edi
4520
        stc
4521
        ret
4522
 
4523
compare_accessed:
4524
        test    byte [esi], 10h
4525
        jnz     .1dir
4526
        test    byte [edi], 10h
4527
        jnz     .greater
4528
.eq1:
4529
        push    edi
4530
        mov     edi, [edi+20]
4531
        cmp     edi, [esi+20]
4532
        pop     edi
4533
        jnz     @f
4534
        push    edi
4535
        mov     edi, [edi+16]
4536
        cmp     edi, [esi+16]
4537
        pop     edi
4538
        jnz     @f
4539
        add     esi, 40
4540
        add     edi, 40
4541
        jmp     strcmpi
4542
@@:
4543
        ret
4544
.greater:
4545
        test    esi, esi
4546
        ret
4547
.1dir:
4548
        test    byte [edi], 10h
4549
        jnz     .eq1
4550
.less:
4551
        xor     edi, edi
4552
        stc
4553
        ret
4554
 
4555
compare_accessed_rev:
4556
        test    byte [esi], 10h
4557
        jnz     .1dir
4558
        test    byte [edi], 10h
4559
        jnz     .greater
4560
.eq1:
4561
        push    esi
4562
        mov     esi, [esi+20]
4563
        cmp     esi, [edi+20]
4564
        pop     esi
4565
        jnz     @f
4566
        push    esi
4567
        mov     esi, [esi+16]
4568
        cmp     esi, [edi+16]
4569
        pop     esi
4570
        jnz     @f
4571
        add     esi, 40
4572
        add     edi, 40
4573
        xchg    esi, edi
4574
        jmp     strcmpi
4575
@@:
4576
        ret
4577
.greater:
4578
        test    esi, esi
4579
        ret
4580
.1dir:
4581
        test    byte [edi], 10h
4582
        jnz     .eq1
4583
.less:
4584
        xor     edi, edi
4585
        stc
4586
        ret
4587
 
283 diamond 4588
if 0
180 heavyiron 4589
match_mask:
4590
; in: esi->name, edi->mask
4591
; out: CF clear <=> match
4592
        pusha
4593
        xchg    esi, edi
4594
.main_cycle:
4595
        push    esi
4596
@@:
4597
        lodsb
4598
        test    al, al
4599
        jz      @f
4600
        cmp     al, ','
4601
        jz      @f
4602
        cmp     al, '|'
4603
        jnz     @b
4604
@@:
4605
        mov     [esi-1], byte 0
4606
        xchg    esi, [esp]
4607
        call    match_single_mask
4608
        pop     esi
4609
        mov     [esi-1], al
4610
        jnc     .found
4611
        cmp     al, ','
4612
        jz      .main_cycle
4613
.done_fail:
4614
        stc
4615
        popa
4616
        ret
4617
.found:
4618
        test    al, al
4619
        jz      .done_succ
4620
        cmp     al, '|'
4621
        jz      .test_exclude
4622
        lodsb
4623
        jmp     .found
4624
.done_succ:
4625
        clc
4626
        popa
4627
        ret
4628
.test_exclude:
4629
        push    esi
4630
@@:
4631
        lodsb
4632
        test    al, al
4633
        jz      @f
4634
        cmp     al, ','
4635
        jnz     @b
4636
@@:
4637
        mov     byte [esi-1], 0
4638
        xchg    esi, [esp]
4639
        call    match_single_mask
4640
        pop     esi
4641
        mov     [esi-1], al
4642
        jnc     .done_fail
4643
        test    al, al
4644
        jz      .done_succ
4645
        jmp     .test_exclude
4646
 
4647
match_single_mask:
4648
; in: esi->mask, edi->name
4649
; out: CF clear <=> match
4650
        pusha
4651
.mask_symbol:
4652
        lodsb
4653
        test    al, al
4654
        jz      .mask_done
4655
        cmp     al, '*'
4656
        jz      .asterisk
4657
        cmp     al, '?'
4658
        jz      .quest
4659
        cmp     al, '['
4660
        jz      .list
4661
        call    match_symbol
4662
        jnz     .done_fail
4663
        inc     edi
4664
        jmp     .mask_symbol
4665
.done_fail:
4666
        stc
4667
        popa
4668
        ret
4669
.mask_done:
4670
        scasb
4671
        jnz     .done_fail
4672
.done_succ:
4673
        clc
4674
        popa
4675
        ret
4676
.quest:
4677
        mov     al, 0
4678
        scasb
4679
        jz      .done_fail
4680
        jmp     .mask_symbol
4681
.list:
4682
        lodsb
4683
        cmp     al, ']'
4684
        jz      .done_fail
4685
        cmp     byte [esi+1], '-'
4686
        jz      .range
4687
        call    match_symbol
4688
        jnz     .list
4689
.listok:
4690
        inc     edi
4691
@@:
4692
        lodsb
4693
        cmp     al, ']'
4694
        jnz     @b
4695
        jmp     .mask_symbol
4696
.range:
4697
        call    match_symbol
4698
        ja      @f
4699
        mov     al, [esi+2]
4700
        call    match_symbol
4701
        jae     .listok
4702
@@:
4703
        inc     esi
4704
        jmp     .list
4705
.asterisk:
283 diamond 4706
        cmp     byte [esi], 0
4707
        jz      .done_succ
4708
        cmp     byte [esi], '?'
4709
        jnz     @f
4710
        mov     al, 0
4711
        scasb
4712
        jz      .done_fail
4713
        inc     esi
4714
        jmp     .asterisk
4715
@@:
4716
        cmp     byte [esi], '['
4717
        jz      .asterisk_common
4718
; the mask is ...*...
4719
.asterisk_normal:
4720
        mov     al, [esi]
4721
@@:
4722
        cmp     byte [edi], 0
4723
        jz      .done_fail
4724
        call    match_symbol
4725
        jz      @f
4726
        inc     edi
4727
        jmp     @b
4728
@@:
4729
        inc     edi
4730
        inc     esi
4731
        call    match_single_mask
4732
        jnc     .done_succ
4733
        dec     esi
4734
        jmp     .asterisk_normal
4735
.asterisk_common:
180 heavyiron 4736
        push    edi
4737
@@:
4738
        call    match_single_mask
4739
        jnc     @f
4740
        mov     al, 0
4741
        scasb
4742
        jnz     @b
4743
        pop     edi
4744
        jmp     .done_fail
4745
@@:
4746
        pop     edi
4747
        jmp     .done_succ
4748
 
283 diamond 4749
match_mask_rev:
4750
; in: esi->name, edx->end of name, edi->mask
4751
; out: CF clear <=> match
4752
        pusha
4753
        xchg    esi, edx
4754
        xchg    esi, edi
4755
.main_cycle:
4756
        mov     ecx, esi
4757
@@:
4758
        lodsb
4759
        test    al, al
4760
        jz      @f
4761
        cmp     al, ','
4762
        jz      @f
4763
        cmp     al, '|'
4764
        jnz     @b
4765
@@:
4766
        dec     esi
4767
        mov     [esi], byte 0
4768
        call    match_single_mask_rev2
4769
        mov     [esi], al
4770
        inc     esi
4771
        jnc     .found
4772
        cmp     al, ','
4773
        jz      .main_cycle
4774
.done_fail:
4775
        stc
4776
        popa
4777
        ret
4778
.found:
4779
        test    al, al
4780
        jz      .done_succ
4781
        cmp     al, '|'
4782
        jz      .test_exclude
4783
        lodsb
4784
        jmp     .found
4785
.done_succ:
4786
        clc
4787
        popa
4788
        ret
4789
.test_exclude:
4790
        mov     ecx, esi
4791
@@:
4792
        lodsb
4793
        test    al, al
4794
        jz      @f
4795
        cmp     al, ','
4796
        jnz     @b
4797
@@:
4798
        dec     esi
4799
        mov     byte [esi], 0
4800
        call    match_single_mask_rev2
4801
        mov     [esi], al
4802
        inc     esi
4803
        jnc     .done_fail
4804
        test    al, al
4805
        jz      .done_succ
4806
        jmp     .test_exclude
4807
 
4808
match_single_mask_rev2:
4809
        pusha
4810
        jmp     match_single_mask_rev.mask_symbol
4811
match_single_mask_rev:
4812
; in: esi->mask, edi->end of name, edx->start of name
4813
; out: CF clear <=> match
4814
        pusha
4815
        mov     ecx, esi
4816
@@:
4817
        lodsb
4818
        test    al, al
4819
        jnz     @b
4820
        dec     esi
4821
; esi->end of mask, ecx->start of mask
4822
.mask_symbol:
4823
        dec     esi
4824
        cmp     esi, ecx
4825
        jb      .mask_done
4826
        mov     al, [esi]
4827
        cmp     al, '*'
4828
        jz      .asterisk
4829
        cmp     al, '?'
4830
        jz      .quest
4831
        cmp     al, ']'
4832
        jz      .list
4833
        dec     edi
4834
        cmp     edi, edx
4835
        jb      .done_fail
4836
        call    match_symbol
4837
        jz      .mask_symbol
4838
.done_fail:
4839
        stc
4840
        popa
4841
        ret
4842
.mask_done:
4843
        cmp     edi, edx
4844
        jnz     .done_fail
4845
.done_succ:
4846
        clc
4847
        popa
4848
        ret
4849
.quest:
4850
        dec     edi
4851
        cmp     edi, edx
4852
        jb      .done_fail
4853
        jmp     .mask_symbol
4854
.list:
4855
        dec     edi
4856
        cmp     edi, edx
4857
        jb      .done_fail
4858
.list_check:
4859
        dec     esi
4860
        cmp     esi, ecx
4861
        jbe     .done_fail
4862
        mov     al, [esi]
4863
        cmp     al, '['
4864
        jz      .done_fail
4865
        cmp     byte [esi-1], '-'
4866
        jz      .range
4867
        call    match_symbol
4868
        jnz     .list_check
4869
.listok:
4870
@@:
4871
        dec     esi
4872
        cmp     esi, ecx
4873
        jb      .done_fail
4874
        cmp     byte [esi], '['
4875
        jnz     @b
4876
        jmp     .mask_symbol
4877
.range:
4878
        call    match_symbol
4879
        jb      @f
4880
        mov     al, [esi-2]
4881
        call    match_symbol
4882
        jbe     .listok
4883
@@:
4884
        dec     esi
4885
        dec     esi
4886
        jmp     .list_check
4887
.asterisk:
4888
        cmp     esi, ecx
4889
        jz      .done_succ
4890
        cmp     byte [esi-1], '?'
4891
        jnz     @f
4892
        cmp     edi, edx
4893
        jz      .done_fail
4894
        dec     esi
4895
        jmp     .asterisk
4896
@@:
4897
        cmp     byte [esi-1], ']'
4898
        jz      .asterisk_common
4899
; the mask is ...*...
4900
.asterisk_normal:
4901
        mov     al, [esi-1]
4902
@@:
4903
        cmp     edi, edx
4904
        jz      .done_fail
4905
        call    match_symbol
4906
        jz      @f
4907
        dec     edi
4908
        jmp     @b
4909
@@:
4910
        dec     edi
4911
        dec     esi
4912
        call    match_single_mask_rev2
4913
        jnc     .done_succ
4914
        inc     esi
4915
        jmp     .asterisk_normal
4916
.asterisk_common:
4917
        push    edi
4918
@@:
4919
        call    match_single_mask_rev2
4920
        jnc     @f
4921
        dec     edi
4922
        cmp     edi, edx
4923
        jae     @b
4924
        pop     edi
4925
        jmp     .done_fail
4926
@@:
4927
        pop     edi
4928
        jmp     .done_succ
4929
end if
4930
 
474 diamond 4931
;tolower:
4932
;        push    ecx
4933
;        movzx   ecx, al
4934
;        mov     al, [tolower_table+ecx]
4935
;        pop     ecx
4936
;        ret
180 heavyiron 4937
 
4938
match_symbol:
4939
; in: al,[edi]=symbols
4940
; out: flags as 'cmp al,[edi]'
474 diamond 4941
        push    eax ecx
4942
        movzx   ecx, al
4943
        mov     al, [tolower_table+ecx]
4944
        movzx   ecx, byte [edi]
4945
        cmp     al, [tolower_table+ecx]
4946
        pop     ecx eax
180 heavyiron 4947
        ret
4948
 
283 diamond 4949
match_mask_rev_lowercase:
4950
; in: esi->name, edx->end of name, edi->mask
4951
; out: CF clear <=> match
4952
        pusha
4953
        xchg    esi, edx
4954
        xchg    esi, edi
4955
.main_cycle:
4956
        mov     ecx, esi
4957
@@:
4958
        lodsb
4959
        test    al, al
4960
        jz      @f
4961
        cmp     al, ','
4962
        jz      @f
474 diamond 4963
        cmp     al, ';'
4964
        jz      @f
283 diamond 4965
        cmp     al, '|'
4966
        jnz     @b
4967
@@:
4968
        dec     esi
4969
        mov     [esi], byte 0
4970
        call    match_single_mask_rev_lowercase
4971
        mov     [esi], al
4972
        inc     esi
4973
        jnc     .found
4974
        cmp     al, ','
4975
        jz      .main_cycle
474 diamond 4976
        cmp     al, ';'
4977
        jz      .main_cycle
283 diamond 4978
.done_fail:
4979
        stc
4980
        popa
4981
        ret
4982
.found:
4983
        test    al, al
4984
        jz      .done_succ
4985
        cmp     al, '|'
4986
        jz      .test_exclude
4987
        lodsb
4988
        jmp     .found
4989
.done_succ:
4990
        clc
4991
        popa
4992
        ret
4993
.test_exclude:
4994
        mov     ecx, esi
4995
@@:
4996
        lodsb
4997
        test    al, al
4998
        jz      @f
4999
        cmp     al, ','
474 diamond 5000
        jz      @f
5001
        cmp     al, ';'
283 diamond 5002
        jnz     @b
5003
@@:
5004
        dec     esi
5005
        mov     byte [esi], 0
5006
        call    match_single_mask_rev_lowercase
5007
        mov     [esi], al
5008
        inc     esi
5009
        jnc     .done_fail
5010
        test    al, al
5011
        jz      .done_succ
5012
        jmp     .test_exclude
180 heavyiron 5013
 
283 diamond 5014
match_single_mask_rev_lowercase:
5015
; in: esi->end of mask, ecx->start of mask, edi->end of name, edx->start of name
5016
; out: CF clear <=> match
5017
        push    esi edi eax
5018
.mask_symbol:
5019
        dec     esi
5020
        cmp     esi, ecx
5021
        jb      .mask_done
5022
        mov     al, [esi]
5023
        cmp     al, '*'
5024
        jz      .asterisk
5025
        cmp     al, '?'
5026
        jz      .quest
5027
        cmp     al, ']'
5028
        jz      .list
5029
        dec     edi
5030
        cmp     edi, edx
5031
        jb      .done_fail
5032
        cmp     al, [edi]
5033
        jz      .mask_symbol
5034
.done_fail:
5035
        stc
5036
        pop     eax edi esi
5037
        ret
5038
.mask_done:
5039
        cmp     edi, edx
5040
        jnz     .done_fail
5041
.done_succ:
5042
        clc
5043
        pop     eax edi esi
5044
        ret
5045
.quest:
5046
        dec     edi
5047
        cmp     edi, edx
5048
        jb      .done_fail
5049
        jmp     .mask_symbol
5050
.list:
5051
        dec     edi
5052
        cmp     edi, edx
5053
        jb      .done_fail
5054
.list_check:
5055
        dec     esi
5056
        cmp     esi, ecx
5057
        jbe     .done_fail
5058
        mov     al, [esi]
5059
        cmp     al, '['
5060
        jz      .done_fail
5061
        cmp     byte [esi-1], '-'
5062
        jz      .range
5063
        cmp     al, [edi]
5064
        jnz     .list_check
5065
.listok:
5066
@@:
5067
        dec     esi
5068
        cmp     esi, ecx
5069
        jb      .done_fail
5070
        cmp     byte [esi], '['
5071
        jnz     @b
5072
        jmp     .mask_symbol
5073
.range:
5074
        cmp     al, [edi]
5075
        jb      @f
5076
        mov     al, [esi-2]
5077
        cmp     al, [edi]
5078
        jbe     .listok
5079
@@:
5080
        dec     esi
5081
        dec     esi
5082
        jmp     .list_check
5083
.asterisk:
5084
        cmp     esi, ecx
5085
        jz      .done_succ
5086
        cmp     byte [esi-1], '?'
5087
        jnz     @f
5088
        cmp     edi, edx
5089
        jz      .done_fail
5090
        dec     esi
5091
        jmp     .asterisk
5092
@@:
5093
        cmp     byte [esi-1], ']'
5094
        jz      .asterisk_common
5095
; the mask is ...*...
5096
.asterisk_normal:
5097
        mov     al, [esi-1]
5098
@@:
5099
        cmp     edi, edx
5100
        jz      .done_fail
5101
        cmp     al, [edi]
5102
        jz      @f
5103
        dec     edi
5104
        jmp     @b
5105
@@:
5106
        dec     edi
5107
        dec     esi
5108
        call    match_single_mask_rev_lowercase
5109
        jnc     .done_succ
5110
        inc     esi
5111
        jmp     .asterisk_normal
5112
.asterisk_common:
5113
        push    edi
5114
@@:
5115
        call    match_single_mask_rev_lowercase
5116
        jnc     @f
5117
        dec     edi
5118
        cmp     edi, edx
5119
        jae     @b
5120
        pop     edi
5121
        jmp     .done_fail
5122
@@:
5123
        pop     edi
5124
        jmp     .done_succ
180 heavyiron 5125
 
283 diamond 5126
find_extension:
5127
        lea     esi, [ecx+40]
5128
        push    esi
5129
@@:
5130
        lodsb
5131
        test    al, al
5132
        jnz     @b
5133
@@:
5134
        dec     esi
5135
        cmp     byte [esi], '.'
5136
        jz      .found_ext
5137
        cmp     esi, [esp]
5138
        ja      @b
5139
; empty extension
5140
        pop     esi
5141
        stc
5142
        ret
5143
.found_ext:
5144
        inc     esi
474 diamond 5145
        mov     edi, [associations]
5146
.find_loop:
283 diamond 5147
        push    esi edi
5148
        call    strcmpi
5149
        pop     edi esi
474 diamond 5150
        pushf
5151
@@:
283 diamond 5152
        inc     edi
474 diamond 5153
        cmp     byte [edi-1], 0
5154
        jnz     @b
5155
        popf
5156
        jz      .found
283 diamond 5157
@@:
474 diamond 5158
        inc     edi
5159
        cmp     byte [edi-1], 0
5160
        jnz     @b
5161
        cmp     byte [edi], 0
5162
        jnz     .find_loop
5163
; unknown extension
5164
        stc
5165
.found:
283 diamond 5166
        pop     esi
5167
        ret
5168
 
485 heavyiron 5169
title  db      'Kolibri Far 0.32',0
283 diamond 5170
 
180 heavyiron 5171
nomem_draw      db      'No memory for redraw.',0
5172
.size = $ - nomem_draw
5173
 
5174
def_left_dir    db      '/rd/1',0
5175
def_right_dir   db      '/hd0/1',0
5176
 
314 diamond 5177
bSilentFolderMode db    1
5178
 
180 heavyiron 5179
if lang eq ru
5180
aFolder         db      'Папка'
5181
.size = $-aFolder
5182
aUp             db      'Вверх'
5183
.size = $-aUp
5184
aDrive          db      'Диск',0
5185
aScreens        db      'Экраны',0
5186
else
5187
aFolder         db      'Folder'
5188
.size = $-aFolder
5189
aUp             db      'Up'
5190
.size = $-aUp
5191
aDrive          db      'Drive',0
5192
aScreens        db      'Screens',0
5193
end if
5194
 
474 diamond 5195
align 4
180 heavyiron 5196
_10d dd 10
5197
_100d dd 100
474 diamond 5198
muldiv10 dd 429496729
180 heavyiron 5199
_10 db 10
5200
_100 db 100
5201
 
5202
fpu_cw  dw      000011100111111b
5203
 
5204
keybar_panels:
5205
if lang eq ru
5206
; без клавиш-модификаторов
5207
        db      'Помощь'
5208
        db      'ПользМ'
5209
        db      'Просм '
5210
        db      'Редакт'
5211
        db      'Копир '
5212
        db      'Перен '
5213
        db      'Папка '
5214
        db      'Удален'
5215
        db      'КонфМн'
5216
        db      'Выход '
5217
        db      'Модули'
5218
        db      'Экраны'
5219
; Shift
5220
        db      'Добавл'
5221
        db      'Распак'
5222
        db      'АрхКом'
5223
        db      'Редак.'
5224
        db      'Копир '
5225
        db      'Переим'
5226
        db      '      '
5227
        db      'Удален'
5228
        db      'Сохран'
5229
        db      'Послдн'
5230
        db      'Группы'
5231
        db      'Выбран'
5232
; Ctrl
5233
        db      'Левая '
5234
        db      'Правая'
5235
        db      'Имя   '
5236
        db      'Расшир'
5237
        db      'Модиф '
5238
        db      'Размер'
5239
        db      'Несорт'
5240
        db      'Создан'
5241
        db      'Доступ'
5242
        db      'Описан'
5243
        db      'Владел'
5244
        db      'Сорт  '
5245
; Ctrl+Shift
5246
        db      '      '
5247
        db      '      '
5248
        db      'Просм '
5249
        db      'Редакт'
5250
        db      '      '
5251
        db      '      '
5252
        db      '      '
5253
        db      '      '
5254
        db      '      '
5255
        db      '      '
5256
        db      '      '
5257
        db      '      '
5258
; Alt
5259
        db      'Левая '
5260
        db      'Правая'
5261
        db      'Смотр.'
5262
        db      'Редак.'
5263
        db      'Печать'
5264
        db      'Связь '
5265
        db      'Искать'
5266
        db      'Истор '
5267
        db      'Видео '
5268
        db      'Дерево'
5269
        db      'ИстПр '
5270
        db      'ИстПап'
5271
; Alt+Shift
5272
        db      '      '
5273
        db      '      '
5274
        db      '      '
5275
        db      '      '
5276
        db      '      '
5277
        db      '      '
5278
        db      '      '
5279
        db      '      '
5280
        db      'КонфПл'
5281
        db      '      '
5282
        db      '      '
5283
        db      '      '
5284
; Alt+Ctrl
5285
times 12 db     '      '
5286
; Alt+Ctrl+Shift
5287
times 12 db     '      '
5288
else
5289
; No modificators
5290
        db      'Help  '
5291
        db      'UserMn'
5292
        db      'View  '
5293
        db      'Edit  '
5294
        db      'Copy  '
5295
        db      'RenMov'
5296
        db      'MkFold'
5297
        db      'Delete'
5298
        db      'ConfMn'
5299
        db      'Quit  '
5300
        db      'Plugin'
5301
        db      'Screen'
5302
; Shift
5303
        db      'Add   '
5304
        db      'Extrct'
5305
        db      'ArcCmd'
5306
        db      'Edit..'
5307
        db      'Copy  '
5308
        db      'Rename'
5309
        db      '      '
5310
        db      'Delete'
5311
        db      'Save  '
5312
        db      'Last  '
5313
        db      'Group '
5314
        db      'SelUp '
5315
; Ctrl
5316
        db      'Left  '
5317
        db      'Right '
5318
        db      'Name  '
5319
        db      'Extens'
5320
        db      'Modifn'
5321
        db      'Size  '
5322
        db      'Unsort'
5323
        db      'Creatn'
5324
        db      'Access'
5325
        db      'Descr '
5326
        db      'Owner '
5327
        db      'Sort  '
5328
; Ctrl+Shift
5329
        db      '      '
5330
        db      '      '
5331
        db      'View  '
5332
        db      'Edit  '
5333
        db      '      '
5334
        db      '      '
5335
        db      '      '
5336
        db      '      '
5337
        db      '      '
5338
        db      '      '
5339
        db      '      '
5340
        db      '      '
5341
; Alt
5342
        db      'Left  '
5343
        db      'Right '
5344
        db      'View..'
5345
        db      'Edit..'
5346
        db      'Print '
5347
        db      'MkLink'
5348
        db      'Find  '
5349
        db      'Histry'
5350
        db      'Video '
5351
        db      'Tree  '
5352
        db      'ViewHs'
5353
        db      'FoldHs'
5354
; Alt+Shift
5355
        db      '      '
5356
        db      '      '
5357
        db      '      '
5358
        db      '      '
5359
        db      '      '
5360
        db      '      '
5361
        db      '      '
5362
        db      '      '
5363
        db      'ConfPl'
5364
        db      '      '
5365
        db      '      '
5366
        db      '      '
5367
; Alt+Ctrl
5368
times 12 db     '      '
5369
; Alt+Ctrl+Shift
5370
times 12 db     '      '
5371
end if
5372
 
5373
keybar_viewer:
5374
if lang eq ru
5375
; без клавиш-модификаторов
5376
        db      'Помощь'
5377
        db      'Развер'
5378
        db      'Выход '
5379
        db      'Код   '
5380
        db      '      '
5381
        db      'Редакт'
5382
        db      'Поиск '
5383
keybar_cp:
5384
        db      'cp1251'
5385
        db      '      '
5386
        db      'Выход '
5387
        db      'Модули'
5388
        db      'Экраны'
5389
; Shift
5390
        db      '      '
5391
        db      'Слова '
5392
        db      '      '
5393
        db      '      '
5394
        db      '      '
5395
        db      '      '
5396
        db      'Дальше'
5397
        db      'Таблиц'
5398
        db      '      '
5399
        db      '      '
5400
        db      '      '
5401
        db      '      '
5402
; Ctrl
5403
        db      '      '
5404
        db      '      '
5405
        db      '      '
5406
        db      '      '
5407
        db      '      '
5408
        db      '      '
5409
        db      '      '
5410
        db      '      '
5411
        db      '      '
5412
        db      'Позиц '
5413
        db      '      '
5414
        db      '      '
5415
; Ctrl+Shift
5416
        db      '      '
5417
        db      '      '
5418
        db      '      '
5419
        db      '      '
5420
        db      '      '
5421
        db      '      '
5422
        db      '      '
5423
        db      '      '
5424
        db      '      '
5425
        db      '      '
5426
        db      '      '
5427
        db      '      '
5428
; Alt
5429
        db      '      '
5430
        db      '      '
5431
        db      '      '
5432
        db      '      '
5433
        db      'Печать'
5434
        db      '      '
5435
        db      'Назад '
5436
        db      'Перейт'
5437
        db      'Видео '
5438
        db      '      '
5439
        db      'ИстПр '
5440
        db      '      '
5441
; Alt+Shift
5442
        db      '      '
5443
        db      '      '
5444
        db      '      '
5445
        db      '      '
5446
        db      '      '
5447
        db      '      '
5448
        db      '      '
5449
        db      '      '
5450
        db      'Конфиг'
5451
        db      '      '
5452
        db      '      '
5453
        db      '      '
5454
; Alt+Ctrl
5455
times 12 db     '      '
5456
; Alt+Ctrl+Shift
5457
times 12 db     '      '
5458
else
5459
; No modificators
5460
        db      'Help  '
5461
        db      'Unwrap'
5462
        db      'Quit  '
5463
        db      'Hex   '
5464
        db      '      '
5465
        db      'Edit  '
5466
        db      'Search'
5467
keybar_cp:
5468
        db      'cp1251'
5469
        db      '      '
5470
        db      'Quit  '
5471
        db      'Plugin'
5472
        db      'Screen'
5473
; Shift
5474
        db      '      '
5475
        db      'WWrap '
5476
        db      '      '
5477
        db      '      '
5478
        db      '      '
5479
        db      '      '
5480
        db      'Next  '
5481
        db      'Table '
5482
        db      '      '
5483
        db      '      '
5484
        db      '      '
5485
        db      '      '
5486
; Ctrl
5487
        db      '      '
5488
        db      '      '
5489
        db      '      '
5490
        db      '      '
5491
        db      '      '
5492
        db      '      '
5493
        db      '      '
5494
        db      '      '
5495
        db      '      '
5496
        db      'GoFile'
5497
        db      '      '
5498
        db      '      '
5499
; Ctrl+Shift
5500
        db      '      '
5501
        db      '      '
5502
        db      '      '
5503
        db      '      '
5504
        db      '      '
5505
        db      '      '
5506
        db      '      '
5507
        db      '      '
5508
        db      '      '
5509
        db      '      '
5510
        db      '      '
5511
        db      '      '
5512
; Alt
5513
        db      '      '
5514
        db      '      '
5515
        db      '      '
5516
        db      '      '
5517
        db      'Print '
5518
        db      '      '
5519
        db      'Prev  '
5520
        db      'Goto  '
5521
        db      'Video '
5522
        db      '      '
5523
        db      'ViewHs'
5524
        db      '      '
5525
; Alt+Shift
5526
        db      '      '
5527
        db      '      '
5528
        db      '      '
5529
        db      '      '
5530
        db      '      '
5531
        db      '      '
5532
        db      '      '
5533
        db      '      '
5534
        db      'Config'
5535
        db      '      '
5536
        db      '      '
5537
        db      '      '
5538
; Alt+Ctrl
5539
times 12 db     '      '
5540
; Alt+Ctrl+Shift
5541
times 12 db     '      '
5542
end if
5543
 
5544
        align   4
5545
cur_width       dd      80
5546
cur_height      dd      25
283 diamond 5547
saved_width     dd      -1
5548
saved_height    dd      -1
314 diamond 5549
fill_width      dd      0
5550
fill_height     dd      0
180 heavyiron 5551
max_width = 256
5552
max_height = 256
283 diamond 5553
console_data_ptr dd     0
180 heavyiron 5554
 
283 diamond 5555
cursor_x        dd      -1
5556
cursor_y        dd      -1
474 diamond 5557
cur_cursor_pos  dd      -1
5558
old_cursor_pos  dd      -1
283 diamond 5559
 
180 heavyiron 5560
active_panel    dd      panel1_data
5561
 
474 diamond 5562
associations    dd      0
5563
 
180 heavyiron 5564
console_colors  dd      0x000000, 0x000080, 0x008000, 0x008080
5565
                dd      0x800000, 0x800080, 0x808000, 0xC0C0C0
5566
                dd      0x808080, 0x0000FF, 0x00FF00, 0x00FFFF
5567
                dd      0xFF0000, 0xFF00FF, 0xFFFF00, 0xFFFFFF
5568
 
5569
compare_fns     dd      compare_name
5570
                dd      compare_name_rev
5571
                dd      compare_ext
5572
                dd      compare_ext_rev
5573
                dd      compare_modified
5574
                dd      compare_modified_rev
5575
                dd      compare_size
5576
                dd      compare_size_rev
5577
                dd      compare_unordered
5578
                dd      compare_unordered_rev
5579
                dd      compare_created
5580
                dd      compare_created_rev
5581
                dd      compare_accessed
5582
                dd      compare_accessed_rev
5583
 
5584
ctrlkey_tests   dd      ctrlkey_test0
5585
                dd      ctrlkey_test1
5586
                dd      ctrlkey_test2
5587
                dd      ctrlkey_test3
5588
                dd      ctrlkey_test4
5589
ctrlkey_tests_num = 5
5590
 
5591
virtual at 0
5592
screen_vtable:
5593
        .OnRedraw       dd      ?
5594
        .OnKey          dd      ?
5595
        .keybar         dd      ?
5596
        .getname        dd      ?
5597
end virtual
5598
 
5599
panels_vtable:
5600
        dd      panels_OnRedraw
5601
        dd      panels_OnKey
5602
        dd      keybar_panels
5603
        dd      panels_getname
5604
 
5605
viewer_vtable:
5606
        dd      viewer_OnRedraw
5607
        dd      viewer_OnKey
5608
        dd      keybar_viewer
5609
        dd      viewer_getname
5610
 
314 diamond 5611
; additions to this table require changes in tools.inc::get_error_msg
5612
errors1:
5613
        dd      error0msg
5614
        dd      error1msg
5615
        dd      error2msg
5616
        dd      error3msg
5617
        dd      error4msg
5618
        dd      error5msg
5619
        dd      error6msg
5620
        dd      error7msg
5621
        dd      error8msg
5622
        dd      error9msg
5623
        dd      error10msg
5624
        dd      error11msg
5625
errors2:
5626
        dd      error30msg
5627
        dd      error31msg
5628
        dd      error32msg
5629
 
180 heavyiron 5630
encodings:
5631
.cp866 = 0
5632
.cp1251 = 1
474 diamond 5633
.koi8r = 2
5634
.unicode = 3
180 heavyiron 5635
 
5636
.names:
5637
        db      'cp866   '
5638
        db      'cp1251  '
474 diamond 5639
        db      'koi8-r  '
5640
        db      'Unicode '
180 heavyiron 5641
 
5642
.tables:
5643
; cp866 - trivial map
5644
        times 128 db %+127
5645
; cp1251
5646
        db      0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8,0x3F,0x25,0x3F,0x3C,0x3F,0x3F,0x3F,0x3F
5647
        db      0x3F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D,0x3F,0x54,0x3F,0x3E,0x3F,0x3F,0x3F,0x3F
5648
        db      0xFF,0xF6,0xF7,0x3F,0xFD,0x3F,0xB3,0x15,0xF0,0x63,0xF2,0x3C,0xBF,0x2D,0x52,0xF4
5649
        db      0xF8,0x2B,0x49,0x69,0x3F,0xE7,0x14,0xFA,0xF1,0xFC,0xF3,0x3E,0x3F,0x3F,0x3F,0xF5
5650
        times 0x30 db %-1+0x80
5651
        times 0x10 db %-1+0xE0
474 diamond 5652
; koi8-r
5653
        db      0xC4,0xB3,0xDA,0xBF,0xC0,0xD9,0xC3,0xB4,0xC2,0xC1,0xC5,0xDF,0xDC,0xDB,0xDD,0xDE
5654
        db      0xB0,0xB1,0xB2,0xF4,0xFE,0xF9,0xFB,0xF7,0xF3,0xF2,0xFF,0xF5,0xF8,0xFD,0xFA,0xF6
5655
        db      0xCD,0xBA,0xD5,0xF1,0xD6,0xC9,0xB8,0xB7,0xBB,0xD4,0xD3,0xC8,0xBE,0xBD,0xBC,0xC6
5656
        db      0xC7,0xCC,0xB5,0xF0,0xB6,0xB9,0xD1,0xD2,0xCB,0xCF,0xD0,0xCA,0xD8,0xD7,0xCE,0xFC
5657
        db      0xEE,0xA0,0xA1,0xE6,0xA4,0xA5,0xE4,0xA3,0xE5,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE
5658
        db      0xAF,0xEF,0xE0,0xE1,0xE2,0xE3,0xA6,0xA2,0xEC,0xEB,0xA7,0xE8,0xED,0xE9,0xE7,0xEA
5659
        db      0x9E,0x80,0x81,0x96,0x84,0x85,0x94,0x83,0x95,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E
5660
        db      0x8F,0x9F,0x90,0x91,0x92,0x93,0x86,0x82,0x9C,0x9B,0x87,0x98,0x9D,0x99,0x97,0x9A
180 heavyiron 5661
 
474 diamond 5662
.menu:
5663
        db      .cp866
5664
.menu.1:
5665
        dd      .menu.2
5666
        dd      0
5667
if lang eq ru
5668
        db      '&DOS текст (cp866)',0
5669
else
5670
        db      '&DOS text (cp866)',0
5671
end if
5672
        db      .cp1251
5673
.menu.2:
5674
        dd      .menu.3
5675
        dd      .menu.1
5676
if lang eq ru
5677
        db      '&Windows текст (cp1251)',0
5678
else
5679
        db      '&Windows text (cp1251)',0
5680
end if
5681
        db      .koi8r
5682
.menu.3:
5683
        dd      .menu.4
5684
        dd      .menu.2
5685
if lang eq ru
5686
        db      '&Linux текст (koi8-r)',0
5687
else
5688
        db      '&Linux text (koi8-r)',0
5689
end if
5690
        db      .unicode
5691
.menu.4:
5692
        dd      0
5693
        dd      .menu.3
5694
        db      '&Unicode',0
5695
 
180 heavyiron 5696
active_screen   dd      0
5697
tabsize         dd      8
5698
 
5699
ascii2scan:
5700
        times 32 db 0
5701
        db      0x39,0x02,0x03,0x04,0x05,0x06,0x08,0x28,0x0A,0x0B,0x09,0x0D,0x33,0x0C,0x34,0x35
5702
        db      0x0B,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x27,0x27,0x33,0x0D,0x34,0x35
5703
        db      0x03,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
5704
        db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x07,0x0C
5705
        db      0x29,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
5706
        db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x29,0x00
5707
        db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
5708
        db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
5709
        db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
5710
        times 48 db 0
5711
        db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
5712
        db      0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
5713
 
5714
; Клавишные сочетания
5715
; db scancode, reserved
5716
; dw ctrlstate
5717
; dd handler
5718
; ctrlstate: младшие 4 бита - для Shift, следующие - для Ctrl, следующие - для Alt
5719
; 0 = ни одна клавиша не нажата
5720
; 1 = ровно одна нажата
5721
; 2 = обе нажаты
5722
; 3 = левая нажата, правая нет
5723
; 4 = правая нажата, левая нет
5724
panels_ctrlkeys:
5725
        dw      0x48, 0
5726
        dd      panels_OnKey.up
5727
        dw      0x50, 0
5728
        dd      panels_OnKey.down
5729
        dw      0x4B, 0
5730
        dd      panels_OnKey.left
5731
        dw      0x4D, 0
5732
        dd      panels_OnKey.right
474 diamond 5733
        dw      0x51, 0
5734
        dd      panels_OnKey.pgdn
5735
        dw      0x49, 0
5736
        dd      panels_OnKey.pgup
180 heavyiron 5737
        dw      0xF, 0
5738
        dd      panels_OnKey.tab
5739
        dw      0x47, 0
5740
        dd      panels_OnKey.home
5741
        dw      0x4F, 0
5742
        dd      panels_OnKey.end
5743
        dw      0x1C, 0
5744
        dd      panels_OnKey.enter
5745
        dw      0x3D, 0
5746
        dd      panels_OnKey.f3
283 diamond 5747
        dw      0x3F, 0
5748
        dd      panels_OnKey.f5
5749
        dw      0x3F, 1
5750
        dd      panels_OnKey.shift_f5
321 diamond 5751
        dw      0x41, 0
5752
        dd      panels_OnKey.f7
180 heavyiron 5753
        dw      0x42, 0
5754
        dd      panels_OnKey.f8
283 diamond 5755
        dw      0x43, 0x100
5756
        dd      alt_f9
180 heavyiron 5757
        dw      0x44, 0
5758
        dd      exit
283 diamond 5759
        dw      0x5D, 0
5760
        dd      panels_OnKey.menu
180 heavyiron 5761
repeat 9-3+1
5762
        dw      0x3D+%-1, 0x10
5763
        dd      panels_OnKey.ctrl_f39
5764
end repeat
5765
        dw      0x3B, 0x100
5766
        dd      panels_OnKey.alt_f12
5767
        dw      0x3C, 0x100
5768
        dd      panels_OnKey.alt_f12
5769
        dw      0x58, 0
5770
        dd      F12
5771
        dw      0x13, 0x10
5772
        dd      panels_OnKey.ctrl_r
474 diamond 5773
        dw      2, 0x30
5774
        dd      panels_OnKey.change_mode
5775
        dw      3, 0x30
5776
        dd      panels_OnKey.change_mode
5777
        dw      4, 0x30
5778
        dd      panels_OnKey.change_mode
5779
        dw      5, 0x30
5780
        dd      panels_OnKey.change_mode
5781
repeat 10
5782
        dw      %+1, 0x40
5783
        dd      panels_OnKey.quick_jump
5784
end repeat
5785
        dw      0x52, 0
5786
        dd      panels_OnKey.insert
5787
        dw      0x4E, 0
5788
        dd      panels_OnKey.greyplus
5789
        dw      0x4A, 0
5790
        dd      panels_OnKey.greyminus
180 heavyiron 5791
        db      0
5792
 
5793
viewer_ctrlkeys:
5794
        dw      1, 0
5795
        dd      viewer_OnKey.exit
5796
        dw      0x51, 0
5797
        dd      viewer_OnKey.pgdn
5798
        dw      0x49, 0
5799
        dd      viewer_OnKey.pgup
5800
        dw      0x50, 0
5801
        dd      viewer_OnKey.down
5802
        dw      0x48, 0
5803
        dd      viewer_OnKey.up
5804
        dw      0x4B, 0
5805
        dd      viewer_OnKey.left
5806
        dw      0x4B, 0x10
5807
        dd      viewer_OnKey.ctrl_left
5808
        dw      0x4B, 0x11
5809
        dd      viewer_OnKey.ctrl_shift_left
5810
        dw      0x4C, 0
5811
        dd      viewer_OnKey.exit
5812
        dw      0x4D, 0
5813
        dd      viewer_OnKey.right
5814
        dw      0x4D, 0x10
5815
        dd      viewer_OnKey.ctrl_right
5816
        dw      0x4D, 0x11
5817
        dd      viewer_OnKey.ctrl_shift_right
5818
        dw      0x3C, 0
5819
        dd      viewer_OnKey.f2
5820
        dw      0x3D, 0
5821
        dd      viewer_OnKey.exit
5822
        dw      0x3E, 0
5823
        dd      viewer_OnKey.f4
5824
        dw      0x42, 0
5825
        dd      viewer_OnKey.f8
474 diamond 5826
        dw      0x42, 1
5827
        dd      viewer_OnKey.shift_f8
180 heavyiron 5828
        dw      0x44, 0
5829
        dd      viewer_OnKey.exit
5830
        dw      0x47, 0
5831
        dd      viewer_OnKey.home
5832
        dw      0x4F, 0
5833
        dd      viewer_OnKey.end
5834
        dw      0x58, 0
5835
        dd      F12
283 diamond 5836
        dw      0x43, 0x100
5837
        dd      alt_f9
180 heavyiron 5838
        db      0
5839
 
5840
dirinfo:
5841
                dd      1
5842
.first          dd      0
5843
                dd      0
5844
.size           dd      300
5845
.dirdata        dd      0
5846
                db      0
5847
.name           dd      0
5848
 
5849
readinfo:
5850
                dd      0
5851
.first          dq      0
5852
.size           dd      0
5853
.data           dd      0
5854
                db      0
5855
.name           dd      0
5856
 
283 diamond 5857
writeinfo:
5858
.code           dd      2
5859
.first          dq      0
5860
.size           dd      0
5861
.data           dd      0
5862
                db      0
5863
.name           dd      0
5864
 
180 heavyiron 5865
attrinfo:
5866
                dd      5
5867
                dd      0
5868
                dd      0
5869
                dd      0
5870
                dd      .attr
5871
                db      0
5872
.name           dd      0
5873
 
5874
delinfo:
5875
                dd      8
5876
                dd      0
5877
                dd      0
5878
                dd      0
5879
                dd      0
5880
                db      0
5881
                dd      execdata
5882
 
321 diamond 5883
mkdirinfo:
5884
                dd      9
5885
                dd      0
5886
                dd      0
5887
                dd      0
5888
                dd      0
5889
                db      0
5890
                dd      CopyDestEditBuf+12
5891
 
180 heavyiron 5892
if lang eq ru
5893
compare_names   db      'иИрРмМаАнНсСдД'
5894
else
5895
compare_names   db      'nNxXmMsSuUcCaA'
5896
end if
5897
 
183 diamond 5898
; Здесь начинаются конфигурационные данные - в текущей реализации они зашиты в бинарник
5899
 
180 heavyiron 5900
; Панель
5901
panel_normal_color      db      1Bh
474 diamond 5902
panel_selected_color    db      1Eh
180 heavyiron 5903
panel_border_color      db      1Bh
5904
panel_cursor_color      db      30h
474 diamond 5905
panel_selected_cursor_color db  3Eh
180 heavyiron 5906
panel_header_color      db      1Bh
5907
panel_active_header_color db    30h
5908
column_header_color     db      1Eh
474 diamond 5909
panel_number_color      db      1Bh
5910
panel_numselected_color db      3Eh
180 heavyiron 5911
panel_nscreens_color    db      0Bh
183 diamond 5912
; Диалоги
314 diamond 5913
dialog_colors:
183 diamond 5914
dialog_main_color       db      70h
5915
dialog_border_color     db      70h
5916
dialog_header_color     db      70h
314 diamond 5917
dialog_edit_color       db      30h
5918
dialog_unmodified_edit_color db 38h
183 diamond 5919
dialog_normal_btn_color db      70h
5920
dialog_selected_btn_color db    30h
314 diamond 5921
; Предупреждения и ошибки
5922
warning_colors:
5923
; !!! должны быть те же поля и в том же порядке, что и для обычных диалогов !!!
5924
warning_main_color      db      4Fh
5925
warning_border_color    db      4Fh
5926
warning_header_color    db      4Fh
5927
warning_edit_color      db      30h
5928
warning_unmodified_edit_color db 38h
5929
warning_normal_btn_color db     4Fh
5930
warning_selected_btn_color db   70h
180 heavyiron 5931
; Меню
5932
menu_normal_color       db      3Fh
5933
menu_selected_color     db      0Fh
5934
menu_highlight_color    db      3Eh
5935
menu_selected_highlight_color db 0Eh
5936
menu_border_color       db      3Fh
5937
menu_header_color       db      3Fh
5938
menu_scrollbar_color    db      3Fh
5939
; Линейка клавиш
5940
keybar_number_color     db      7
5941
keybar_name_color       db      30h
5942
keybar_bgr_color        db      7
5943
; Командная строка
5944
cmdbar_normal_color     db      7
5945
cmdbar_prefix_color     db      7
5946
; Просмотрщик
5947
view_normal_color       db      1Bh
5948
view_status_color       db      30h
5949
view_arrows_color       db      1Eh
5950
 
5951
; Подсветка файлов
5952
highlight_num_groups    dd      10
5953
highlight_groups        dd      highlight_group0
5954
                dd      highlight_group1
5955
                dd      highlight_group2
5956
                dd      highlight_group3
5957
                dd      highlight_group4
5958
                dd      highlight_group5
5959
                dd      highlight_group6
5960
                dd      highlight_group7
5961
                dd      highlight_group8
5962
                dd      highlight_group9
5963
 
5964
; Формат описания группы подсветки:
5965
virtual at 0
5966
highlight:
474 diamond 5967
        .IncludeAttributes      db ?
180 heavyiron 5968
        .NormalColor            db ?
5969
        .CursorColor            db ?
474 diamond 5970
        .SelectedColor          db ?
5971
        .SelectedCursorColor    db ?
180 heavyiron 5972
        .Mask:                  ; ASCIIZ-string
5973
end virtual
5974
 
283 diamond 5975
; all highlight masks must be in lowercase!
180 heavyiron 5976
highlight_group0:
5977
        db      2
474 diamond 5978
        db      13h, 38h, 0, 0
180 heavyiron 5979
        db      '*',0
5980
highlight_group1:
5981
        db      4
474 diamond 5982
        db      13h, 38h, 0, 0
180 heavyiron 5983
        db      '*',0
5984
highlight_group2:
5985
        db      10h
474 diamond 5986
        db      1Fh, 3Fh, 0, 0
180 heavyiron 5987
        db      '*|..',0
5988
highlight_group3:
5989
        db      10h
474 diamond 5990
        db      0, 0, 0, 0
180 heavyiron 5991
        db      '..',0
5992
highlight_group4:
5993
        db      0
474 diamond 5994
        db      1Ah, 3Ah, 0, 0
180 heavyiron 5995
        db      '*.exe,*.com,*.bat,*.cmd',0
5996
highlight_group5:
5997
        db      0
474 diamond 5998
        db      1Ah, 3Ah, 0, 0
180 heavyiron 5999
        db      '*|*.*',0
6000
highlight_group6:
6001
        db      0
474 diamond 6002
        db      1Dh, 3Dh, 0, 0
180 heavyiron 6003
        db      '*.rar,*.zip,*.[zj],*.[bg7]z,*.[bg]zip,*.tar,*.t[ag]z,*.ar[cj],*.r[0-9][0-9],'
6004
        db      '*.a[0-9][0-9],*.bz2,*.cab,*.msi,*.jar,*.lha,*.lzh,*.ha,*.ac[bei],*.pa[ck],'
6005
        db      '*.rk,*.cpio,*.rpm,*.zoo,*.hqx,*.sit,*.ice,*.uc2,*.ain,*.imp,*.777,*.ufa,*.boa,'
6006
        db      '*.bs[2a],*.sea,*.hpk,*.ddi,*.x2,*.rkv,*.[lw]sz,*.h[ay]p,*.lim,*.sqz,*.chz',0
6007
highlight_group7:
6008
        db      0
474 diamond 6009
        db      16h, 36h, 0, 0
180 heavyiron 6010
        db      '*.bak,*.tmp',0
6011
highlight_group8:
6012
        db      0
474 diamond 6013
        db      17h, 37h, 0, 0
180 heavyiron 6014
        db      '*.asm,*.inc',0
6015
highlight_group9:
6016
        db      10h
474 diamond 6017
        db      1Fh, 3Fh, 0, 0
180 heavyiron 6018
        db      '*',0
6019
 
183 diamond 6020
bConfirmDelete  db      1
321 diamond 6021
bConfirmDeleteIncomplete db 0
183 diamond 6022
 
474 diamond 6023
FolderShortcuts dd      0,0,0,0,0,0,0,0,0,0
6024
 
183 diamond 6025
; Здесь заканчиваются конфигурационные данные
6026
 
6027
bWasE0          db      0
6028
ctrlstate       db      0
474 diamond 6029
MemForImage     dd      0
6030
restore_semicolon dd    0
6031
bForHex         db      0
183 diamond 6032
 
6033
align   4
314 diamond 6034
; Сообщение о обломе при выделении памяти
6035
nomem_dlgdata:
6036
        dd      2
6037
        dd      -1
6038
        dd      -1
6039
        dd      12
6040
        dd      2
6041
        dd      1
6042
        dd      1
6043
        dd      aError
6044
        rb      4
6045
        dd      0
6046
        dd      0
6047
        dd      2
6048
; строка "No memory"
6049
        dd      1
6050
        dd      1,0,10,0
6051
        dd      aNoMemory
6052
        dd      1
6053
; кнопка "Ok"
6054
        dd      2
6055
        dd      4,1,7,1
6056
        dd      aOk
6057
        dd      0xD
6058
 
283 diamond 6059
; диалог копирования
6060
copy_dlgdata:
314 diamond 6061
        dd      1
283 diamond 6062
.x      dd      -1
6063
.y      dd      -1
6064
.width  dd      ?
6065
.height dd      4
6066
        dd      4
6067
        dd      2
6068
        dd      aCopyCaption
6069
.main_color db ?
6070
.border_color db ?
6071
.header_color db ?
6072
        db      0
6073
        dd      0
6074
        dd      0
6075
        dd      4
6076
; строка 'Копировать "%s" в:'
6077
        dd      1
6078
        dd      1,0
6079
.width2 dd      ?
6080
        dd      0
6081
        dd      CopySourceTextBuf
6082
        dd      0
6083
; поле редактирования с именем файла/папки назначения
6084
        dd      3
6085
        dd      1,1
6086
.width3 dd      ?
6087
        dd      1
6088
        dd      CopyDestEditBuf
6089
.flags0 dd      0
6090
; кнопка "копировать"
6091
.copy_btn:
6092
        dd      2
6093
.copy_x1 dd     ?
6094
        dd      3
6095
.copy_x2 dd     ?
6096
        dd      3
6097
        dd      aCopy
6098
.flags1 dd      18h
6099
; кнопка "отменить"
6100
        dd      2
6101
.cnl_x1 dd      ?
6102
        dd      3
6103
.cnl_x2 dd      ?
6104
        dd      3
6105
        dd      aCancelB
6106
.flags2 dd      8
6107
 
321 diamond 6108
mkdir_dlgdata:
6109
        dd      1
6110
        dd      -1, -1
6111
.width  dd      ?
6112
.height dd      4
6113
        dd      4, 2
6114
        dd      aMkDirCaption
6115
        dd      ?
6116
        dd      0
6117
        dd      0
6118
        dd      4
6119
; Строка "Создать папку"
6120
        dd      1
6121
        dd      1,0,aMkDirLen,0
6122
        dd      aMkDir
6123
        dd      0
6124
; поле редактирования с именем создаваемой папки
6125
        dd      3
6126
        dd      1,1
6127
.width2 dd      ?
6128
        dd      1
6129
        dd      CopyDestEditBuf
6130
.flags0 dd      0xC
6131
; кнопка "Продолжить"
6132
.cont_btn:
6133
        dd      2
6134
.cont_x1 dd     ?
6135
        dd      3
6136
.cont_x2 dd     ?
6137
        dd      3
6138
        dd      a_Continue
6139
.flags1 dd      18h
6140
; кнопка "отменить"
6141
        dd      2
6142
.cnl_x1 dd      ?
6143
        dd      3
6144
.cnl_x2 dd      ?
6145
        dd      3
6146
        dd      aCancelB
6147
.flags2 dd      8
283 diamond 6148
 
474 diamond 6149
; диалог выделения/снятия
6150
mark_dlgdata:
6151
        dd      1
6152
        dd      -1, -1
6153
        dd      37, 1
6154
        dd      4, 2
6155
.title  dd      ?
6156
        dd      ?
6157
        dd      0, 0
6158
        dd      1
6159
; поле редактирования
6160
        dd      3
6161
        dd      1, 0, 35, 0
6162
        dd      enter_string_buf
6163
.flags  dd      ?
6164
 
321 diamond 6165
RetryOrCancelBtn:
6166
        dd      aRetry
6167
        dd      a_Cancel
6168
DeleteOrKeepBtn:
6169
        dd      a_Delete
6170
        dd      aKeep
6171
RetryOrIgnoreBtn:
6172
        dd      aRetry
6173
        dd      aIgnore
474 diamond 6174
DeleteOrCancelBtn:
6175
        dd      a_Delete
6176
        dd      a_Cancel
6177
DeleteErrorBtn:
6178
        dd      aRetry
6179
        dd      aSkip
6180
        dd      aSkipAll
6181
        dd      a_Cancel
321 diamond 6182
 
183 diamond 6183
if lang eq ru
6184
aDeleteCaption          db      'Удаление',0
474 diamond 6185
aConfirmDeleteText      db      'Вы хотите удалить',0
6186
aDeleteFolder           db      ' папку',0
183 diamond 6187
aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
474 diamond 6188
aDeleteFile             db      ' файл',0
283 diamond 6189
aCancelB                db      '[ Отменить ]',0
6190
aCancelBLength = $ - aCancelB - 1
6191
aCopyCaption            db      'Копирование',0
6192
aCopy                   db      '[ Копировать ]',0
6193
aCopyLength = $ - aCopy - 1
321 diamond 6194
a_Continue              db      '[ Продолжить ]',0
6195
a_ContinueLength = $ - a_Continue - 1
283 diamond 6196
aCopy1                  db      'Копировать "',0
6197
aCopy2                  db      '" в:',0
314 diamond 6198
aError                  db      'Ошибка',0
6199
aContinue               db      'Продолжить',0
6200
aRetry                  db      'Повторить',0
321 diamond 6201
a_Cancel                db      'Отменить',0
6202
a_Delete                db      'Удалить',0
474 diamond 6203
aSkip                   db      'Пропустить',0
6204
aSkipAll                db      'Пропустить все',0
314 diamond 6205
error0msg               db      'Странно... Нет ошибки',0
6206
error1msg               db      'Странно... Не определена база и/или раздел жёсткого диска',0
6207
error2msg               db      'Функция не поддерживается для данной файловой системы',0
6208
error3msg               db      'Неизвестная файловая система',0
6209
error4msg               db      'Странно... Ошибка 4',0
6210
error5msg               db      'Файл не найден',0
6211
error6msg               db      'Файл закончился',0
6212
error7msg               db      'Странно... Указатель вне памяти приложения',0
6213
error8msg               db      'Диск заполнен',0
6214
error9msg               db      'Файловая структура разрушена',0
6215
error10msg              db      'Доступ запрещён',0
6216
error11msg              db      'Ошибка устройства',0
6217
error30msg              db      'Недостаточно памяти',0
6218
error31msg              db      'Файл не является исполняемым',0
6219
error32msg              db      'Слишком много процессов',0
6220
aUnknownError           db      'Неизвестный код ошибки: ',0
6221
aCannotReadFolder       db      'Не могу прочитать папку',0
321 diamond 6222
aRunError               db      'Ошибка при запуске программы:',0
6223
aFileNameTooBig         db      'Полное имя файла слишком длинное',0
6224
aFolderNameTooBig       db      'Полное имя папки слишком длинное',0
6225
aCmdLineTooBig          db      'Командная строка превышает границу OS в 256 символов',0
6226
aCannotCopyToSelf       db      'Файл не может быть скопирован в самого себя',0
6227
aCannotReadFile         db      'Не могу прочитать файл',0
6228
aIncompleteFile         db      'Был получен неполный файл. Удалить его?',0
6229
aKeep                   db      'Оставить',0
6230
aCannotWriteFile        db      'Не могу записать в файл',0
6231
aCannotDeleteFile       db      'Не могу удалить файл',0
6232
aCannotDeleteFolder     db      'Не могу удалить папку',0
6233
aIgnore                 db      'Игнорировать',0
6234
aMkDirCaption           db      'Создание папки',0
6235
aMkDir                  db      'Создать папку',0
6236
aMkDirLen = $ - aMkDir - 1
6237
aCannotMakeFolder       db      'Не могу создать папку',0
474 diamond 6238
aName                   db      3,'Имя'
6239
aSize                   db      6,'Размер'
6240
aDate                   db      4,'Дата'
6241
aTime                   db      5,'Время'
6242
aCannotLoadDLL          db      'Не могу загрузить DLL',0
6243
aInvalidDLL             db      'Файл не найден или имеет неверный формат',0
6244
aMissingExport          db      'Необходимая функция не найдена',0
6245
aInitFailed             db      'Ошибка при инициализации',0
6246
aIncompatibleVersion    db      'Несовместимая версия',0
6247
aTables                 db      'Таблицы',0
6248
aSelect                 db      'Пометить',0
6249
aDeselect               db      'Снять',0
183 diamond 6250
else
6251
aDeleteCaption          db      'Delete',0
474 diamond 6252
aConfirmDeleteText      db      'Do you wish to delete',0
6253
aDeleteFolder           db      ' the folder',0
183 diamond 6254
aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
474 diamond 6255
aDeleteFile             db      ' the file',0
183 diamond 6256
aDelete                 db      ' Delete ',0
6257
aDeleteLength = $ - aDelete - 1
6258
aCancel                 db      ' Cancel ',0
6259
aCancelLength = $ - aCancel - 1
283 diamond 6260
aCancelB                db      '[ Cancel ]',0
6261
aCancelBLength = $ - aCancelB - 1
6262
aCopyCaption            db      'Copy',0
6263
aCopy                   db      '[ Copy ]',0
6264
aCopyLength = $ - aCopy - 1
321 diamond 6265
a_Continue              db      '[ Continue ]',0
6266
a_ContinueLength = $ - a_Continue - 1
283 diamond 6267
aCopy1                  db      'Copy "',0
6268
aCopy2                  db      '" to:',0
314 diamond 6269
aError                  db      'Error',0
6270
aContinue               db      'Continue',0
6271
aRetry                  db      'Retry',0
321 diamond 6272
a_Cancel                db      'Cancel',0
6273
a_Delete                db      'Delete',0
474 diamond 6274
aSkip                   db      'Skip',0
6275
aSkipAll                db      'Skip all',0
314 diamond 6276
error0msg               db      'Strange... No error',0
6277
error1msg               db      'Strange... Hard disk base and/or partition not defined',0
6278
error2msg               db      'The file system does not support this function',0
6279
error3msg               db      'Unknown file system',0
6280
error4msg               db      'Strange... Error 4',0
6281
error5msg               db      'File not found',0
6282
error6msg               db      'End of file',0
6283
error7msg               db      'Strange... Pointer lies outside of application memory',0
6284
error8msg               db      'Disk is full',0
6285
error9msg               db      'File structure is destroyed',0
6286
error10msg              db      'Access denied',0
6287
error11msg              db      'Device error',0
6288
error30msg              db      'Not enough memory',0
6289
error31msg              db      'File is not executable',0
6290
error32msg              db      'Too many processes',0
6291
aUnknownError           db      'Unknown error code: ',0
6292
aCannotReadFolder       db      'Cannot read folder',0
321 diamond 6293
aRunError               db      'Cannot execute program:',0
6294
aFileNameTooBig         db      'Full file name is too long',0
6295
aFolderNameTooBig       db      'Full folder name is too long',0
6296
aCmdLineTooBig          db      'Command line is too long (OS limit is 256 symbols)',0
6297
aCannotCopyToSelf       db      'File cannot be copied onto itself',0
6298
aCannotReadFile         db      'Cannot read file',0
6299
aIncompleteFile         db      'Incomplete file was retrieved. Delete it?',0
6300
aKeep                   db      'Keep',0
474 diamond 6301
aCannotWriteFile        db      'Cannot write to the file',0
6302
aCannotDeleteFile       db      'Cannot delete the file',0
6303
aCannotDeleteFolder     db      'Cannot delete the folder',0
321 diamond 6304
aIgnore                 db      'Ignore',0
6305
aMkDirCaption           db      'Make folder',0
6306
aMkDir                  db      'Create the folder',0
6307
aMkDirLen = $ - aMkDir - 1
6308
aCannotMakeFolder       db      'Cannot create folder',0
474 diamond 6309
aName                   db      4,'Name'
6310
aSize                   db      4,'Size'
6311
aDate                   db      4,'Date'
6312
aTime                   db      4,'Time'
6313
aCannotLoadDLL          db      'Cannot load DLL',0
6314
aInvalidDLL             db      'File is not found or invalid',0
6315
aMissingExport          db      'Required function is not present',0
6316
aInitFailed             db      'Initialization failed',0
6317
aIncompatibleVersion    db      'Incompatible version',0
6318
aTables                 db      'Tables',0
6319
aSelect                 db      'Select',0
6320
aDeselect               db      'Deselect',0
183 diamond 6321
end if
474 diamond 6322
 
314 diamond 6323
aOk                     db      'OK',0
474 diamond 6324
aNoMemory               db      'No memory!'
6325
nullstr                 db      0
6326
standard_dll_path:
6327
libini_name             db      '/rd/1/dll/'
6328
standard_dll_path_size = $ - standard_dll_path
6329
                        db      'libini.obj',0
6330
aStart                  db      'START',0
6331
aLibInit                db      'lib_init',0
6332
aVersion                db      'version',0
6333
aIniGetInt              db      'ini.get_int',0
6334
aIniGetStr              db      'ini.get_str',0
6335
aIniQuerySec            db      'ini.query_sec',0
183 diamond 6336
 
474 diamond 6337
aConfirmations          db      'Confirmations',0
6338
aConfirmDelete          db      'Delete',0
6339
aConfirmDeleteIncomplete db     'DeleteIncomplete',0
6340
 
6341
aAssociations           db      'Associations',0
6342
aMenu                   db      'Menu',0
6343
aFolderShortcuts        db      'FolderShortcuts',0
6344
aShortcut               db      'Shortcut'
6345
.d                      db      '0',0
6346
 
6347
align 4
6348
ini_import:
6349
ini.get_int     dd      aIniGetInt
6350
ini.get_str     dd      aIniGetStr
6351
ini.query_sec   dd      aIniQuerySec
6352
                dd      0
6353
 
6354
virtual at 0
6355
PanelMode:
6356
; up to 16 columns on one panel
6357
.NumColumns     dd      ?
6358
; available column types:
6359
COLUMN_TYPE_NONE = 0
6360
COLUMN_TYPE_NAME = 1
6361
        COLUMN_NAME_MARK = 10h          ; (reserved)
6362
        COLUMN_NAME_NOPATH = 20h        ; (reserved)
6363
        COLUMN_NAME_RIGHTALIGN = 40h    ; (reserved)
6364
COLUMN_TYPE_SIZE = 2
6365
        COLUMN_SIZE_COMMA = 10h         ; (reserved)
6366
COLUMN_TYPE_PACKED_SIZE = 3             ; (reserved)
6367
COLUMN_TYPE_DATE = 4
6368
COLUMN_TYPE_TIME = 5
6369
COLUMN_TYPE_DATETIME = 6                ; (reserved)
6370
COLUMN_TYPE_DATETIME_CREATION = 7       ; (reserved)
6371
COLUMN_TYPE_DATETIME_ACCESS = 8         ; (reserved)
6372
COLUMN_TYPE_ATTRIBUTES = 9              ; (reserved)
6373
COLUMN_TYPE_DESCRIPTION = 10            ; (reserved)
6374
COLUMN_TYPE_OWNER = 11                  ; (reserved)
6375
COLUMN_TYPE_NUMLINKS = 12               ; (reserved)
6376
COLUMN_TYPE_CUSTOM = 13                 ; (reserved)
6377
.ColumnTypes    rb      16
6378
 
6379
.ColumnWidths   rb      16
6380
.bFullScreen    db      ?               ; (reserved)
6381
.bAlignExtensions db    ?
6382
                rb      2
6383
.size = $
6384
end virtual
6385
 
6386
align 4
6387
column_headers:
6388
        dd      nullstr
6389
        dd      aName
6390
        dd      aSize
6391
        dd      nullstr
6392
        dd      aDate
6393
        dd      aTime
6394
draw_column_proc:
6395
        dd      draw_empty_column
6396
        dd      draw_name_column
6397
        dd      draw_size_column
6398
        dd      -1
6399
        dd      draw_date_column
6400
        dd      draw_time_column
6401
colmodes:
6402
; режим 0 : NM,SC,D
6403
        dd      3
6404
        db      COLUMN_TYPE_NAME+COLUMN_NAME_MARK, COLUMN_TYPE_SIZE+COLUMN_SIZE_COMMA
6405
                db      COLUMN_TYPE_DATE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
6406
        db      0, 10, 8
6407
                times 13 db 0
6408
        db      0, 1
6409
                times 2 db 0
6410
; режим 1 : N,N,N
6411
        dd      3
6412
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_NAME, COLUMN_TYPE_NAME
6413
                times 13 db 0
6414
        times 16 db 0
6415
        db      0, 1
6416
                times 2 db 0
6417
; режим 2 : N,N
6418
        dd      2
6419
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_NAME
6420
                times 14 db 0
6421
        times 16 db 0
6422
        db      0, 0
6423
                times 2 db 0
6424
; режим 3 : N,S,D,T
6425
        dd      4
6426
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_SIZE, COLUMN_TYPE_DATE, COLUMN_TYPE_TIME
6427
                times 12 db 0
6428
        db      0, 6, 8, 5
6429
                times 12 db 0
6430
        db      0, 1
6431
                times 2 db 0
6432
; режим 4 : N,S
6433
        dd      2
6434
        db      COLUMN_TYPE_NAME, COLUMN_TYPE_SIZE
6435
                times 14 db 0
6436
        db      0, 6
6437
                times 14 db 0
6438
        db      0, 0
6439
                times 2 db 0
6440
; режим 5 : N,S,P,DM,DC,DA,A
6441
; режим 6 : N,Z
6442
; режим 7 : N,S,Z
6443
; режим 8 : N,S,O
6444
; режим 9 : N,S,LN
6445
 
180 heavyiron 6446
execinfo:
6447
        dd      7
6448
        dd      0
6449
execparams dd   0
6450
        dd      0
6451
        dd      0
6452
        db      0
6453
execptr dd      ?
6454
 
6455
IncludeIGlobals
6456
 
6457
i_end:
6458
 
6459
IncludeUGlobals
6460
 
6461
execdata rb     1024
321 diamond 6462
execdataend:
180 heavyiron 6463
        align   4
6464
attrinfo.attr   rb      40
6465
 
6466
panel1_data:
6467
panel1_left     dd      ?
6468
panel1_top      dd      ?
6469
panel1_width    dd      ?
6470
panel1_height   dd      ?
6471
panel1_index    dd      ?
6472
panel1_start    dd      ?
6473
panel1_colsz    dd      ?
6474
panel1_colst    dd      ?
6475
panel1_sortmode db      ?
6476
                rb      3
6477
panel1_nfa      dd      ?
6478
panel1_numfiles dd      ?
6479
panel1_files    dd      ?
474 diamond 6480
panel1_colmode  dd      ?
6481
panel1_colwidths rd     16+1
6482
panel1_total_num dd     ?
6483
panel1_total_size dq    ?
6484
panel1_selected_num dd ?
6485
panel1_selected_size dq ?
180 heavyiron 6486
panel1_dir      rb      1024
6487
 
6488
panel2_data:
6489
panel2_left     dd      ?
6490
panel2_top      dd      ?
6491
panel2_width    dd      ?
6492
panel2_height   dd      ?
6493
panel2_index    dd      ?
6494
panel2_start    dd      ?
6495
panel2_colsz    dd      ?
6496
panel2_colst    dd      ?
6497
panel2_sortmode db      ?
6498
                rb      3
6499
panel2_nfa      dd      ?
6500
panel2_numfiles dd      ?
6501
panel2_files    dd      ?
474 diamond 6502
panel2_colmode  dd      ?
6503
panel2_colwidths rd     16+1
6504
panel2_total_num dd     ?
6505
panel2_total_size dq    ?
6506
panel2_selected_num  dd ?
6507
panel2_selected_size dq ?
180 heavyiron 6508
panel2_dir      rb      1024
6509
 
283 diamond 6510
;console_data    rb      max_width*max_height*2
180 heavyiron 6511
 
314 diamond 6512
nomem_dlgsavearea       rb      (12+4)*(3+3)*2
6513
 
180 heavyiron 6514
cur_header      rb      max_width
6515
tmp             dd      ?
6516
 
6517
skinh           dd      ?
6518
std_colors      rd      10
6519
 
283 diamond 6520
min_y           dd      ?
6521
max_y           dd      ?
6522
min_x           dd      ?
6523
max_x           dd      ?
6524
used_width      dd      ?
6525
used_height     dd      ?
6526
 
314 diamond 6527
wnd_width       dd      ?
6528
wnd_height      dd      ?
6529
 
180 heavyiron 6530
column_left     dd      ?
6531
column_top      dd      ?
6532
column_width    dd      ?
6533
column_height   dd      ?
6534
column_index    dd      ?
474 diamond 6535
last_column_index dd    ?
180 heavyiron 6536
 
6537
scrpos          dq      ?
6538
viewer_right_side dq    ?
6539
 
6540
saved_file_name:
6541
procinfo        rb      1024
283 diamond 6542
lower_file_name = procinfo + 512
180 heavyiron 6543
 
474 diamond 6544
app_path        rb      1100
6545
 
314 diamond 6546
error_msg       rb      128
6547
 
6548
prev_dir        rb      1024
6549
 
180 heavyiron 6550
driveinfo       rb      32+304
6551
tmpname         rb      32
6552
 
6553
screens         dd      ?
6554
num_screens     dd      ?
6555
active_screen_vtable dd ?
6556
active_screen_data dd   ?
6557
 
183 diamond 6558
aConfirmDeleteTextBuf   rb      aConfirmDeleteTextMax + 1
283 diamond 6559
CopySourceTextBuf       rb      512
6560
CopyDestEditBuf         rb      12+512+1
321 diamond 6561
.length = $ - CopyDestEditBuf - 13
183 diamond 6562
 
474 diamond 6563
enter_string_buf        rb      12+512+1
6564
 
6565
bMemForImageValidData   db      ?
6566
 
283 diamond 6567
align 4
474 diamond 6568
tolower_table   rb      256
283 diamond 6569
layout          rb      128
6570
 
6571
copy_buffer_size = 32768
6572
copy_buffer     rb      copy_buffer_size
6573
 
474 diamond 6574
; data for directory delete
6575
; If directory nested level is >1024, then its full name is too big,
6576
; so we see the overflow when creating full name (we check for this!)
6577
del_dir_stack   rd      1024
6578
del_dir_stack_ptr dd    ?
6579
del_dir_query_size = 32
6580
del_dir_query_area rb   32+304*del_dir_query_size
6581
del_bSkipAll    db      ?
6582
 
180 heavyiron 6583
; stack
183 diamond 6584
        align   4
180 heavyiron 6585
        rb      512
6586
stacktop:
6587
 
6588
mem: