Subversion Repositories Kolibri OS

Rev

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