Subversion Repositories Kolibri OS

Rev

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