Subversion Repositories Kolibri OS

Rev

Rev 183 | Go to most recent revision | Details | 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
8
        dd      0, 0
9
 
10
include 'lang.inc'
11
include 'font.inc'
12
include 'sort.inc'
13
include 'kglobals.inc'
14
include 'memalloc.inc'
15
include 'dialogs.inc'
16
include 'viewer.inc'
17
 
18
start:
19
        mov     eax, mem
20
        call    mf_init
21
        call    draw_window
22
        push    66
23
        pop     eax
24
        push    1
25
        pop     ebx
26
        mov     ecx, ebx
27
        int     40h     ; set keyboard mode to scancodes
28
        call    init_console
29
        mov     esi, def_left_dir
30
        mov     edi, panel1_dir
31
@@:
32
        lodsb
33
        stosb
34
        test    al, al
35
        jnz     @b
36
@@:
37
        mov     esi, def_right_dir
38
        mov     edi, panel2_dir
39
@@:
40
        lodsb
41
        stosb
42
        test    al, al
43
        jnz     @b
44
        mov     eax, 304
45
        mov     [panel1_nfa], eax
46
        mov     [panel2_nfa], eax
47
        mov     [panel1_files], buf1
48
        mov     [panel2_files], buf2
49
        mov     [panel1_sortmode], 0    ; sort by name
50
        mov     [panel2_sortmode], 0
51
        mov     [num_screens], 1
52
        mov     eax, 8
53
        call    mf_alloc
54
        mov     [screens], eax
55
        mov     ecx, panels_vtable
56
        mov     [eax], ecx
57
        mov     [active_screen_vtable], ecx
58
        call    draw_keybar
59
        call    draw_cmdbar
60
        mov     ebp, panel1_data
61
        call    read_folder
62
        call    draw_panel
63
        mov     ebp, panel2_data
64
        call    read_folder
65
        call    draw_panel
66
event:
67
        push    10
68
        pop     eax
69
        int     40h
70
        dec     eax
71
        jz      redraw
72
        dec     eax
73
        jz      key
74
; button - we have only one button, close
75
exit:
76
        or      eax, -1
77
        int     40h
78
redraw:
79
        mov     al, 9
80
        mov     ebx, procinfo
81
        or      ecx, -1
82
        int     40h
83
; test if rolled up
84
; height of rolled up window is [skinh]+3
85
        mov     eax, [ebx+46]
86
        sub     eax, [skinh]
87
        cmp     eax, 5
88
        ja      @f
89
        mov     al, 12
90
        push    1
91
        pop     ebx
92
        int     0x40
93
        xor     eax, eax
94
; ebx, ecx, edi are ignored by function 0 after first redraw
95
        mov     edx, 0x13000000
96
        int     0x40
97
        mov     al, 12
98
        inc     ebx
99
        int     0x40
100
        jmp     event
101
@@:
102
        xor     ecx, ecx
103
        mov     eax, [ebx+42]
104
        sub     eax, 5*2
105
        jae     @f
106
        xor     eax, eax
107
@@:
108
        cdq
109
        mov     esi, font_width
110
        div     esi
111
        cmp     eax, 54
112
        jae     @f
113
        mov     al, 54
114
        mov     ch, 1
115
@@:
116
        cmp     eax, 255
117
        jbe     @f
118
        mov     eax, 255
119
        mov     ch, 1
120
@@:
121
        cmp     eax, [cur_width]
122
        mov     [cur_width], eax
123
        setnz   cl
124
        or      cl, ch
125
        test    edx, edx
126
        setnz   ch
127
        or      cl, ch
128
        mov     eax, [ebx+46]
129
        sub     eax, [skinh]
130
        sub     eax, 5
131
        jns     @f
132
        xor     eax, eax
133
@@:
134
        cdq
135
        mov     esi, font_height
136
        div     esi
137
        cmp     eax, 8
138
        jae     @f
139
        mov     al, 8
140
        mov     cl, 1
141
@@:
142
        cmp     eax, 255
143
        jbe     @f
144
        mov     eax, 255
145
        mov     cl, 1
146
@@:
147
        cmp     eax, [cur_height]
148
        mov     [cur_height], eax
149
        setnz   ch
150
        or      cl, ch
151
        test    edx, edx
152
        setnz   ch
153
        test    cx, cx
154
        jz      @f
155
        mov     eax, [MemForImage]
156
        call    mf_free
157
        and     [MemForImage], 0
158
        call    init_console
159
        push    67
160
        pop     eax
161
        or      ebx, -1
162
        or      ecx, -1
163
        mov     edx, [cur_width]
164
        imul    edx, font_width
165
        add     edx, 5*2
166
        mov     esi, [cur_height]
167
        imul    esi, font_height
168
        add     esi, [skinh]
169
        add     esi, 5
170
        int     40h
171
        call    draw_window
172
        call    draw_keybar
173
        mov     ebp, [active_screen_data]
174
        mov     eax, [active_screen_vtable]
175
        call    dword [eax+screen_vtable.OnRedraw]
176
        jmp     event
177
@@:
178
        call    draw_window
179
        jmp     event
180
key:
181
        mov     al, 2
182
        int     40h
183
        test    al, al
184
        jnz     event
185
        xchg    al, ah
186
        cmp     al, 0xE0
187
        jnz     @f
188
        mov     [bWasE0], 1
189
        jmp     event
190
@@:
191
        xchg    ah, [bWasE0]
192
        mov     ebp, [active_screen_data]
193
        mov     edx, [active_screen_vtable]
194
        cmp     al, 0x1D
195
        jz      .ctrl_down
196
        cmp     al, 0x9D
197
        jz      .ctrl_up
198
        cmp     al, 0x2A
199
        jz      .lshift_down
200
        cmp     al, 0xAA
201
        jz      .lshift_up
202
        cmp     al, 0x36
203
        jz      .rshift_down
204
        cmp     al, 0xB6
205
        jz      .rshift_up
206
        cmp     al, 0x38
207
        jz      .alt_down
208
        cmp     al, 0xB8
209
        jz      .alt_up
210
        call    [edx+screen_vtable.OnKey]
211
        jmp     event
212
.ctrl_down:
213
        test    ah, ah
214
        jnz     .rctrl_down
215
        or      [ctrlstate], 4
216
        jmp     .keybar
217
.rctrl_down:
218
        or      [ctrlstate], 8
219
        jmp     .keybar
220
.ctrl_up:
221
        test    ah, ah
222
        jnz     .rctrl_up
223
        and     [ctrlstate], not 4
224
        jmp     .keybar
225
.rctrl_up:
226
        and     [ctrlstate], not 8
227
.keybar:
228
        call    draw_keybar
229
        call    draw_image
230
@@:     jmp     event
231
.lshift_down:
232
; ignore E0 2A sequence
233
; e.g. arrow keys with NumLock on generate sequence E0 2A E0 xx / E0 xx+80 E0 AA
234
; where xx is scancode, so we can safely ignore E0 2A
235
        test    ah, ah
236
        jnz     @b
237
        or      [ctrlstate], 1
238
        jmp     .keybar
239
.lshift_up:
240
; ignore E0 AA sequence
241
        test    ah, ah
242
        jnz     @b
243
        and     [ctrlstate], not 1
244
        jmp     .keybar
245
.rshift_down:
246
        or      [ctrlstate], 2
247
        jmp     .keybar
248
.rshift_up:
249
        and     [ctrlstate], not 2
250
        jmp     .keybar
251
.alt_down:
252
        test    ah, ah
253
        jnz     .ralt_down
254
        or      [ctrlstate], 0x10
255
        jmp     .keybar
256
.ralt_down:
257
        or      [ctrlstate], 0x20
258
        jmp     .keybar
259
.alt_up:
260
        test    ah, ah
261
        jnz     .ralt_up
262
        and     [ctrlstate], not 0x10
263
        jmp     .keybar
264
.ralt_up:
265
        and     [ctrlstate], not 0x20
266
        jmp     .keybar
267
 
268
process_ctrl_keys:
269
        cmp     byte [esi], 0
270
        jz      .done
271
        push    ecx
272
        cmp     al, [esi]
273
        jz      .check
274
.cont:
275
        pop     ecx
276
        add     esi, 8
277
        jmp     process_ctrl_keys
278
.done:
279
        stc
280
        ret
281
.check:
282
        mov     cl, 0
283
        call    .check_ctrlkey
284
        jc      .cont
285
        mov     cl, 2
286
        call    .check_ctrlkey
287
        jc      .cont
288
        mov     cl, 4
289
        call    .check_ctrlkey
290
        jc      .cont
291
        pop     ecx
292
        call    dword [esi+4]
293
        clc
294
        ret
295
.check_ctrlkey:
296
        push    eax edx
297
        movzx   edx, [ctrlstate]
298
        shr     edx, cl
299
        add     cl, cl
300
        movzx   eax, word [esi+2]
301
        shr     eax, cl
302
        and     eax, 15
303
        cmp     al, ctrlkey_tests_num
304
        jae     .fail
305
        xchg    eax, edx
306
        and     al, 3
307
        call    [ctrlkey_tests + edx*4]
308
        cmp     al, 1
309
        pop     edx eax
310
        ret
311
.fail:
312
        stc
313
        pop     edx eax
314
        ret
315
 
316
ctrlkey_test0:
317
        test    al, al
318
        setz    al
319
        ret
320
ctrlkey_test1:
321
        test    al, al
322
        setnp   al
323
        ret
324
ctrlkey_test2:
325
        cmp     al, 3
326
        setz    al
327
        ret
328
ctrlkey_test3:
329
        cmp     al, 1
330
        setz    al
331
        ret
332
ctrlkey_test4:
333
        cmp     al, 2
334
        setz    al
335
        ret
336
 
337
; TODO: add "no memory" error handling
338
new_screen:
339
        call    mf_alloc
340
        test    eax, eax
341
        jnz     @f
342
        ret
343
@@:
344
        mov     ebp, eax
345
        mov     ebx, [num_screens]
346
        inc     ebx
347
        shl     ebx, 3
348
        mov     eax, [screens]
349
        call    mf_realloc
350
        test    eax, eax
351
        jnz     @f
352
        mov     eax, ebp
353
        call    mf_free
354
        xor     eax, eax
355
        ret
356
@@:
357
        mov     [screens], eax
358
        inc     [num_screens]
359
        mov     [eax+ebx-8], edx
360
        mov     [eax+ebx-4], ebp
361
        mov     eax, [num_screens]
362
        dec     eax
363
        mov     [active_screen], eax
364
        mov     [active_screen_vtable], edx
365
        mov     [active_screen_data], ebp
366
        jmp     draw_keybar
367
 
368
next_screen:
369
        mov     eax, [active_screen]
370
        inc     eax
371
        cmp     eax, [num_screens]
372
        jnz     @f
373
        xor     eax, eax
374
@@:     mov     [active_screen], eax
375
        jmp     change_screen
376
 
377
delete_active_screen:
378
        mov     edi, [screens]
379
        mov     eax, [active_screen]
380
        shl     eax, 3
381
        add     edi, eax
382
        push    dword [edi+4]
383
        lea     esi, [edi+8]
384
        mov     ecx, [num_screens]
385
        sub     ecx, [active_screen]
386
        dec     ecx
387
        add     ecx, ecx
388
        rep     movsd
389
        dec     [num_screens]
390
        mov     ebx, [num_screens]
391
        shl     ebx, 3
392
        mov     eax, [screens]
393
        call    mf_realloc
394
        pop     eax
395
        call    mf_free
396
        and     [active_screen], 0
397
 
398
change_screen:
399
        pusha
400
        mov     eax, [active_screen]
401
        mov     esi, [screens]
402
        mov     ebp, [esi+eax*8+4]
403
        mov     eax, [esi+eax*8]
404
        mov     [active_screen_vtable], eax
405
        mov     [active_screen_data], ebp
406
        call    draw_keybar
407
        call    [eax+screen_vtable.OnRedraw]
408
        popa
409
        ret
410
 
411
F12:
412
        mov     eax, [cur_width]
413
        add     eax, 8
414
        mov     esi, eax
415
        mul     [num_screens]
416
        call    mf_alloc
417
        test    eax, eax
418
        jnz     @f
419
        ret
420
@@:
421
        mov     ebx, eax
422
        mov     edi, eax
423
        xor     ecx, ecx
424
.next:
425
        xor     eax, eax
426
        stosd
427
        inc     ecx
428
        cmp     ecx, [num_screens]
429
        jz      @f
430
        lea     eax, [edi+esi-4]
431
        mov     dword [edi-4], eax
432
@@:
433
        xor     eax, eax
434
        stosd
435
        dec     ecx
436
        jz      @f
437
        lea     eax, [edi-8]
438
        sub     eax, esi
439
        mov     dword [edi-4], eax
440
@@:
441
        mov     al, '&'
442
        stosb
443
        cmp     ecx, 36
444
        jae     .noletter
445
        lea     eax, [ecx+'0']
446
        cmp     al, '9'
447
        jbe     @f
448
        add     al, 7
449
@@:
450
        stosb
451
        mov     al, '.'
452
        stosb
453
        jmp     .letter_done
454
.noletter:
455
        mov     al, ' '
456
        stosb
457
        stosb
458
.letter_done:
459
        mov     al, ' '
460
        stosb
461
        pushad
462
        mov     eax, [screens]
463
        mov     ebp, [eax+ecx*8+4]
464
        mov     eax, [eax+ecx*8]
465
        mov     ecx, [cur_width]
466
        sub     ecx, 12
467
        call    [eax + screen_vtable.getname]
468
        popad
469
        sub     edi, 4
470
        add     edi, [cur_width]
471
        inc     ecx
472
        cmp     ecx, [num_screens]
473
        jb      .next
474
        mov     eax, [active_screen]
475
        mul     esi
476
        add     eax, ebx
477
        push    1
478
        push    aScreens
479
        push    eax
480
        call    menu
481
        cmp     eax, -1
482
        jz      @f
483
        sub     eax, ebx
484
        div     esi
485
        mov     [active_screen], eax
486
@@:
487
        mov     eax, ebx
488
        call    mf_free
489
        jmp     change_screen
490
 
491
panels_OnKey:
492
        mov     ebp, [active_panel]
493
        mov     ecx, [ebp + panel1_index - panel1_data]
494
        mov     edx, [ebp + panel1_start - panel1_data]
495
        mov     ebx, [ebp + panel1_colst - panel1_data]
496
        add     ebx, edx
497
        mov     esi, panels_ctrlkeys
498
        jmp     process_ctrl_keys
499
.ret:
500
        ret
501
.up:
502
        jecxz   .ret
503
        dec     ecx
504
        mov     [ebp + panel1_index - panel1_data], ecx
505
        cmp     ecx, edx
506
        jae     .done_redraw
507
        mov     [ebp + panel1_start - panel1_data], ecx
508
.done_redraw:
509
;        call    draw_panel
510
;        ret
511
        jmp     draw_panel
512
.down:
513
        inc     ecx
514
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
515
        jae     .ret
516
        mov     [ebp + panel1_index - panel1_data], ecx
517
        cmp     ecx, ebx
518
        jb      .done_redraw
519
        sub     ecx, [ebp + panel1_colst - panel1_data]
520
        inc     ecx
521
        mov     [ebp + panel1_start - panel1_data], ecx
522
        jmp     .done_redraw
523
.left:
524
        jecxz   .ret
525
        sub     ecx, [ebp + panel1_colsz - panel1_data]
526
        jae     @f
527
        xor     ecx, ecx
528
@@:
529
        mov     [ebp + panel1_index - panel1_data], ecx
530
        cmp     ecx, edx
531
        jae     .done_redraw
532
        sub     edx, [ebp + panel1_colsz - panel1_data]
533
        jae     @f
534
        xor     edx, edx
535
@@:
536
        mov     [ebp + panel1_start - panel1_data], edx
537
        jmp     .done_redraw
538
.right:
539
        add     ecx, [ebp + panel1_colsz - panel1_data]
540
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
541
        jb      @f
542
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
543
        dec     ecx
544
@@:
545
        mov     [ebp + panel1_index - panel1_data], ecx
546
        cmp     ecx, ebx
547
        jb      .done_redraw
548
        add     ebx, [ebp + panel1_colsz - panel1_data]
549
        cmp     ebx, [ebp + panel1_numfiles - panel1_data]
550
        jbe     @f
551
        mov     ebx, [ebp + panel1_numfiles - panel1_data]
552
@@:
553
        sub     ebx, [ebp + panel1_colst - panel1_data]
554
        jae     @f
555
        xor     ebx, ebx
556
@@:
557
        mov     [ebp + panel1_start - panel1_data], ebx
558
        jmp     .done_redraw
559
.tab:
560
        xor     [active_panel], panel1_data xor panel2_data
561
        call    draw_cmdbar
562
        call    draw_panel
563
        mov     ebp, [active_panel]
564
        jmp     .done_redraw
565
.home:
566
        and     [ebp + panel1_start - panel1_data], 0
567
        and     [ebp + panel1_index - panel1_data], 0
568
        jmp     .done_redraw
569
.end:
570
        mov     eax, [ebp + panel1_numfiles - panel1_data]
571
        dec     eax
572
        mov     [ebp + panel1_index - panel1_data], eax
573
        inc     eax
574
        sub     eax, [ebp + panel1_colst - panel1_data]
575
        jae     @f
576
        xor     eax, eax
577
@@:
578
        mov     [ebp + panel1_start - panel1_data], eax
579
        jmp     .done_redraw
580
.enter:
581
        mov     eax, [ebp + panel1_files - panel1_data]
582
        mov     ecx, [eax+ecx*4]
583
        mov     eax, [ebp + panel1_nfa - panel1_data]
584
        lea     ecx, [ecx+eax*4+32]
585
        add     ecx, [ebp + panel1_files - panel1_data]
586
        test    byte [ecx], 10h
587
        jnz     .enter_folder
588
; find extension
589
        lea     esi, [ecx+40]
590
        push    esi
591
@@:
592
        lodsb
593
        test    al, al
594
        jnz     @b
595
@@:
596
        dec     esi
597
        cmp     byte [esi], '.'
598
        jz      .found_ext
599
        cmp     esi, [esp]
600
        ja      @b
601
        jmp     .run_app
602
.found_ext:
603
        inc     esi
604
        mov     edi, associations
605
@@:
606
        push    esi edi
607
        mov     edi, [edi]
608
        call    strcmpi
609
        pop     edi esi
610
        jz      .run_association
611
        add     edi, 8
612
        cmp     edi, associations_end
613
        jb      @b
614
        jmp     .run_app
615
.run_association:
616
        mov     [execparams], execdata
617
        mov     eax, [edi+4]
618
        mov     [execptr], eax
619
        jmp     .dorun
620
.run_app:
621
        mov     [execptr], execdata
622
        and     [execparams], 0
623
.dorun:
624
        pop     esi
625
        lea     esi, [ebp + panel1_dir - panel1_data]
626
        mov     edi, execdata
627
; TODO: add overflow check
628
@@:
629
        lodsb
630
        test    al, al
631
        jz      @f
632
        stosb
633
        jmp     @b
634
@@:
635
        lea     esi, [ecx+40]
636
        mov     al, '/'
637
        stosb
638
@@:
639
        lodsb
640
        stosb
641
        test    al, al
642
        jnz     @b
643
        push    70
644
        pop     eax
645
        mov     ebx, execinfo
646
        int     40h
647
        ret
648
.enter_folder:
649
        lea     esi, [ecx+40]
650
        cmp     word [esi], '..'
651
        jnz     @f
652
        cmp     byte [esi+2], 0
653
        jz      .dotdot
654
@@:
655
        lea     edi, [ebp + panel1_dir - panel1_data]
656
        mov     al, 0
657
        or      ecx, -1
658
        repnz   scasb
659
        dec     edi
660
        mov     al, '/'
661
        cmp     [edi-1], al
662
        jz      @f
663
        stosb
664
@@:
665
; TODO: add buffer overflow check
666
@@:
667
        lodsb
668
        stosb
669
        test    al, al
670
        jnz     @b
671
.reread:
672
        call    read_folder
673
.done_cmdbar:
674
        call    draw_cmdbar
675
        jmp     .done_redraw
676
.dotdot:
677
        lea     edi, [ebp + panel1_dir - panel1_data]
678
        mov     al, 0
679
        or      ecx, -1
680
        repnz   scasb
681
        dec     edi
682
        mov     al, '/'
683
        std
684
        repnz   scasb
685
        cld
686
        inc     edi
687
        mov     byte [edi], 0
688
        inc     edi
689
        push    edi
690
        call    read_folder
691
        pop     edi
692
        mov     edx, [ebp + panel1_files - panel1_data]
693
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
694
.scanloop:
695
        mov     esi, [edx]
696
        mov     eax, [ebp + panel1_nfa - panel1_data]
697
        lea     esi, [esi+eax*4+32+40]
698
        add     esi, [ebp + panel1_files - panel1_data]
699
        push    esi edi
700
@@:
701
        lodsb
702
        call    match_symbol
703
        jnz     @f
704
        inc     edi
705
        test    al, al
706
        jnz     @b
707
@@:
708
        pop     edi esi
709
        jz      .scanfound
710
        add     edx, 4
711
        loop    .scanloop
712
        jmp     .scandone
713
.scanfound:
714
        sub     edx, [ebp + panel1_files - panel1_data]
715
        shr     edx, 2
716
        mov     [ebp + panel1_index - panel1_data], edx
717
        sub     edx, [ebp + panel1_colst - panel1_data]
718
        jb      .scandone
719
        inc     edx
720
        mov     [ebp + panel1_start - panel1_data], edx
721
.scandone:
722
        jmp     .done_cmdbar
723
.ctrl_f39:
724
        sub     al, 0x3D
725
        add     al, al
726
        mov     ah, [ebp + panel1_sortmode - panel1_data]
727
        and     ah, 0xFE
728
        cmp     al, ah
729
        jnz     @f
730
        and     [ebp + panel1_sortmode - panel1_data], 1
731
        or      al, [ebp + panel1_sortmode - panel1_data]
732
        xor     al, 1
733
@@:
734
        mov     [ebp + panel1_sortmode - panel1_data], al
735
        mov     eax, [ebp + panel1_index - panel1_data]
736
        mov     ecx, [ebp + panel1_files - panel1_data]
737
        push    dword [ecx+eax*4]
738
        push    ecx
739
        call    sort_files
740
        pop     edi
741
        pop     eax
742
        or      ecx, -1
743
        repnz   scasd
744
        not     ecx
745
        dec     ecx
746
        mov     [ebp + panel1_index - panel1_data], ecx
747
        sub     ecx, [ebp + panel1_start - panel1_data]
748
        jb      .less_start
749
        sub     ecx, [ebp + panel1_colst - panel1_data]
750
        jae     .gr_end
751
@@:     jmp     .done_redraw
752
.less_start:
753
        add     [ebp + panel1_start - panel1_data], ecx
754
        jmp     @b
755
.gr_end:
756
        inc     ecx
757
        add     [ebp + panel1_start - panel1_data], ecx
758
        jmp     @b
759
.alt_f12:
760
        mov     ebp, panel1_data
761
        cmp     al, 0x3B
762
        jz      @f
763
        mov     ebp, panel2_data
764
@@:
765
; get drives list
766
        mov     ebx, dirinfo
767
        mov     [ebx+dirinfo.size-dirinfo], 1
768
        mov     [ebx+dirinfo.dirdata-dirinfo], driveinfo
769
        mov     [ebx+dirinfo.name-dirinfo], tmpname
770
        mov     byte [tmpname], '/'
771
        xor     ecx, ecx
772
.drive_loop_e:
773
        mov     byte [tmpname+1], 0
774
        push    70
775
        pop     eax
776
        int     40h
777
        mov     ebx, dirinfo
778
        test    eax, eax
779
        jnz     .drive_loop_e_done
780
        mov     esi, driveinfo+32+40
781
        mov     edi, tmpname+1
782
@@:
783
        lodsb
784
        stosb
785
        test    al, al
786
        jnz     @b
787
        push    [ebx+dirinfo.first-dirinfo]
788
        and     [ebx+dirinfo.first-dirinfo], 0
789
.drive_loop_i:
790
        push    70
791
        pop     eax
792
        int     40h
793
        mov     ebx, dirinfo
794
        test    eax, eax
795
        jnz     .drive_loop_i_done
796
        mov     eax, 32+8
797
        call    mf_alloc
798
        test    eax, eax
799
        jz      .drive_loop_i_done
800
        jecxz   @f
801
        mov     [ecx], eax
802
@@:
803
        and     dword [eax], 0
804
        mov     [eax+4], ecx
805
        mov     ecx, eax
806
        lea     edi, [eax+8]
807
        mov     esi, tmpname
808
@@:
809
        lodsb
810
        test    al, al
811
        jz      @f
812
        stosb
813
        jmp     @b
814
@@:
815
        mov     esi, driveinfo+32+40
816
        mov     al, '/'
817
        stosb
818
@@:
819
        lodsb
820
        stosb
821
        test    al, al
822
        jnz     @b
823
        inc     [ebx+dirinfo.first-dirinfo]
824
        jmp     .drive_loop_i
825
.drive_loop_i_done:
826
        pop     [ebx+dirinfo.first-dirinfo]
827
        inc     [ebx+dirinfo.first-dirinfo]
828
        jmp     .drive_loop_e
829
.drive_loop_e_done:
830
        and     [ebx+dirinfo.first-dirinfo], 0
831
        lea     edi, [ebp + panel1_dir - panel1_data]
832
.find_cur_drive_loop:
833
        push    edi
834
        lea     esi, [ecx+8]
835
@@:
836
        lodsb
837
        test    al, al
838
        jz      .cur_drive_found
839
        call    match_symbol
840
        jnz     @f
841
        inc     edi
842
        jmp     @b
843
@@:
844
        cmp     dword [ecx+4], 0
845
        jz      @f
846
        pop     edi
847
        mov     ecx, [ecx+4]
848
        jmp     .find_cur_drive_loop
849
@@:
850
.cur_drive_found:
851
        pop     edi
852
        push    1
853
        push    aDrive
854
        push    ecx
855
        mov     eax, [ebp + panel1_height - panel1_data]
856
        sub     eax, 2
857
        jae     @f
858
        add     eax, 2
859
@@:
860
        push    eax
861
        push    [ebp + panel1_width - panel1_data]
862
        push    [ebp + panel1_top - panel1_data]
863
        push    [ebp + panel1_left - panel1_data]
864
        call    menu_centered_in
865
        cmp     eax, -1
866
        jz      .ret2
867
        lea     esi, [eax+8]
868
        lea     edi, [ebp + panel1_dir - panel1_data]
869
@@:
870
        lodsb
871
        stosb
872
        test    al, al
873
        jnz     @b
874
@@:
875
        cmp     dword [ecx+4], 0
876
        jz      @f
877
        mov     ecx, [ecx+4]
878
        jmp     @b
879
@@:
880
        mov     eax, ecx
881
        mov     ecx, [ecx]
882
        call    mf_free
883
        test    ecx, ecx
884
        jnz     @b
885
        call    read_folder
886
        jmp     .done_redraw
887
.f3:
888
        call    view_file
889
.ret2:
890
        ret
891
.f8:
892
        mov     eax, [ebp + panel1_files - panel1_data]
893
        mov     ecx, [eax+ecx*4]
894
        mov     eax, [ebp + panel1_nfa - panel1_data]
895
        lea     ecx, [ecx+eax*4+32]
896
        add     ecx, [ebp + panel1_files - panel1_data]
897
        lea     esi, [ebp + panel1_dir - panel1_data]
898
        mov     edi, execdata
899
@@:
900
        lodsb
901
        test    al, al
902
        jz      @f
903
        stosb
904
        jmp     @b
905
@@:
906
        lea     esi, [ecx+40]
907
        mov     al, '/'
908
        stosb
909
@@:
910
        lodsb
911
        stosb
912
        test    al, al
913
        jnz     @b
914
        push    70
915
        pop     eax
916
        mov     ebx, delinfo
917
        int     0x40
918
.ctrl_r:
919
; Rescan panel
920
;       call    read_folder
921
;       jmp     .done_redraw
922
        mov     eax, [ebp + panel1_index - panel1_data]
923
        push    eax
924
        mov     ecx, [ebp + panel1_files - panel1_data]
925
        mov     ecx, [ecx+eax*4]
926
        mov     eax, [ebp + panel1_nfa - panel1_data]
927
        lea     esi, [ecx+eax*4+32+40]
928
        add     esi, [ebp + panel1_files - panel1_data]
929
        mov     edi, saved_file_name
930
@@:
931
        lodsb
932
        stosb
933
        test    al, al
934
        jnz     @b
935
        push    [ebp + panel1_start - panel1_data]
936
        call    read_folder
937
        pop     [ebp + panel1_start - panel1_data]
938
        pop     [ebp + panel1_index - panel1_data]
939
        or      eax, -1
940
@@:
941
        inc     eax
942
        cmp     eax, [ebp + panel1_numfiles - panel1_data]
943
        jae     .ctrl_r.notfound
944
        mov     esi, [ebp + panel1_nfa - panel1_data]
945
        mov     ecx, [ebp + panel1_files - panel1_data]
946
        lea     esi, [ecx+esi*4+32+40]
947
        add     esi, [ecx+eax*4]
948
        mov     edi, saved_file_name
949
        call    strcmpi
950
        jnz     @b
951
.ctrl_r.found:
952
        mov     [ebp + panel1_index - panel1_data], eax
953
.ctrl_r.notfound:
954
        mov     eax, [ebp + panel1_numfiles - panel1_data]
955
        dec     eax
956
        cmp     [ebp + panel1_index - panel1_data], eax
957
        jbe     @f
958
        mov     [ebp + panel1_index - panel1_data], eax
959
@@:
960
        mov     eax, [ebp + panel1_index - panel1_data]
961
        cmp     [ebp + panel1_start - panel1_data], eax
962
        jbe     @f
963
        mov     [ebp + panel1_start - panel1_data], eax
964
@@:
965
        inc     eax
966
        sub     eax, [ebp + panel1_colst - panel1_data]
967
        jae     @f
968
        xor     eax, eax
969
@@:
970
        cmp     [ebp + panel1_start - panel1_data], eax
971
        jae     @f
972
        mov     [ebp + panel1_start - panel1_data], eax
973
@@:
974
        mov     eax, [ebp + panel1_numfiles - panel1_data]
975
        sub     eax, [ebp + panel1_colst - panel1_data]
976
        jbe     @f
977
        cmp     [ebp + panel1_start - panel1_data], eax
978
        jbe     @f
979
        mov     [ebp + panel1_start - panel1_data], eax
980
@@:
981
        jmp     .done_redraw
982
 
983
panels_OnRedraw:
984
        call    draw_cmdbar
985
        mov     ebp, panel1_data
986
        call    draw_panel
987
        mov     ebp, panel2_data
988
        call    draw_panel
989
        ret
990
 
991
init_console:
992
        mov     ax, 0720h
993
        mov     ecx, [cur_width]
994
        imul    ecx, [cur_height]
995
        mov     edi, console_data
996
        rep     stosw
997
        and     [panel1_left], 0
998
        and     [panel1_top], 0
999
        and     [panel2_top], 0
1000
        mov     eax, [cur_width]
1001
        inc     eax
1002
        shr     eax, 1
1003
        mov     [panel1_width], eax
1004
        mov     [panel2_left], eax
1005
        sub     eax, [cur_width]
1006
        neg     eax
1007
        mov     [panel2_width], eax
1008
        mov     eax, [cur_height]
1009
        dec     eax
1010
        dec     eax
1011
        mov     [panel1_height], eax
1012
        mov     [panel2_height], eax
1013
        ret
1014
 
1015
panels_getname:
1016
if lang eq ru
1017
        mov     eax, 'Пане'
1018
        stosd
1019
        mov     eax, 'ли  '
1020
        stosd
1021
        mov     eax, '    '
1022
        stosd
1023
        stosb
1024
else
1025
        mov     eax, 'Pane'
1026
        stosd
1027
        mov     eax, 'ls  '
1028
        stosd
1029
        mov     eax, '    '
1030
        stosd
1031
        stosb
1032
end if
1033
        sub     ecx, 13
1034
        mov     ebp, [active_panel]
1035
        lea     esi, [ebp + panel1_dir - panel1_data]
1036
        push    3
1037
        pop     edx
1038
@@:
1039
        lodsb
1040
        stosb
1041
        dec     ecx
1042
        test    al, al
1043
        jz      @f
1044
        cmp     al, '/'
1045
        jnz     @b
1046
        dec     edx
1047
        jnz     @b
1048
@@:
1049
        test    al, al
1050
        jnz     @f
1051
        dec     esi
1052
        dec     edi
1053
@@:
1054
        push    esi
1055
@@:
1056
        lodsb
1057
        test    al, al
1058
        jnz     @b
1059
        dec     esi
1060
        mov     ebx, esi
1061
        sub     ebx, [esp]
1062
        dec     esi
1063
        push    esi
1064
        mov     edx, [ebp + panel1_files - panel1_data]
1065
        mov     esi, [ebp + panel1_index - panel1_data]
1066
        mov     esi, [edx+esi*4]
1067
        add     esi, edx
1068
        mov     edx, [ebp + panel1_nfa - panel1_data]
1069
        lea     esi, [esi+edx*4+32+40]
1070
        push    esi
1071
@@:
1072
        lodsb
1073
        test    al, al
1074
        jnz     @b
1075
        add     ebx, esi
1076
        sub     ebx, [esp]
1077
        dec     esi
1078
        cmp     ebx, ecx
1079
        jbe     @f
1080
        mov     al, '.'
1081
        stosb
1082
        stosb
1083
        stosb
1084
        sub     ecx, 3
1085
        mov     ebx, ecx
1086
@@:
1087
        add     edi, ebx
1088
        inc     ecx
1089
        std
1090
@@:
1091
        movsb
1092
        dec     ecx
1093
        jz      .nodir
1094
        cmp     esi, [esp]
1095
        jae     @b
1096
        mov     al, '/'
1097
        stosb
1098
        dec     ecx
1099
        jz      .nodir
1100
        mov     esi, [esp+4]
1101
@@:
1102
        cmp     esi, [esp+8]
1103
        jb      .nodir
1104
        movsb
1105
        loop    @b
1106
.nodir:
1107
        cld
1108
        pop     eax
1109
        pop     eax
1110
        pop     eax
1111
        ret
1112
 
1113
draw_window:
1114
        push    12
1115
        pop     eax
1116
        push    1
1117
        pop     ebx
1118
        int     40h
1119
        mov     al, 48
1120
        mov     bl, 4
1121
        int     40h
1122
        mov     [skinh], eax
1123
        mov     ebx, [cur_width]
1124
        imul    ebx, font_width
1125
        add     ebx, 100*65536 + 5*2
1126
        mov     ecx, [cur_height]
1127
        imul    ecx, font_height
1128
        lea     ecx, [eax+ecx+5+100*65536]
1129
        xor     eax, eax
1130
        mov     edx, 0x13000000
1131
        mov     edi, header
1132
        int     40h
1133
        mov     al, 48
1134
        push    3
1135
        pop     ebx
1136
        mov     ecx, std_colors
1137
        push    40
1138
        pop     edx
1139
        int     40h
1140
;        mov     bl, 7
1141
;        int     40h
1142
;        xor     ax, ax
1143
;        shr     ebx, 16
1144
;        or      ebx, eax
1145
;        mov     ecx, [std_colors+16]
1146
;        mov     edx, header
1147
;        push    header.length
1148
;        pop     esi
1149
;        push    4
1150
;        pop     eax
1151
;        int     40h
1152
        xor     ecx, ecx
1153
        call    draw_image
1154
        push    12
1155
        pop     eax
1156
        push    2
1157
        pop     ebx
1158
        int     40h
1159
        ret
1160
 
1161
draw_image.nomem:
1162
        mov     al, 13
1163
        xor     edx, edx
1164
        mov     ebx, [cur_width]
1165
        imul    ebx, font_width
1166
        add     ebx, 5*65536
1167
        mov     ecx, [skinh-2]
1168
        mov     cx, word [cur_height]
1169
        imul    cx, font_height
1170
        int     40h
1171
        mov     al, 4
1172
        mov     ebx, 32*65536+32
1173
        mov     ecx, 0xFFFFFF
1174
        mov     edx, nomem_draw
1175
        push    nomem_draw.size
1176
        pop     esi
1177
        int     40h
1178
        ret
1179
 
1180
draw_image:
1181
        cmp     [MemForImage], 0
1182
        jnz     .allocated
1183
; allocate memory for image
1184
        mov     eax, [cur_width]
1185
        imul    eax, [cur_height]
1186
        imul    eax, font_width*font_height*3
1187
        call    mf_alloc
1188
        test    eax, eax
1189
        jz      draw_image.nomem
1190
        mov     [MemForImage], eax
1191
.allocated:
1192
        mov     edi, [MemForImage]
1193
        mov     esi, console_data
1194
        mov     ecx, [cur_height]
1195
.lh:
1196
        push    ecx
1197
        mov     ecx, [cur_width]
1198
.lw:
1199
        push    ecx edi
1200
        xor     eax, eax
1201
        mov     al, [esi+1]
1202
        and     al, 0xF
1203
        mov     ebx, [console_colors + eax*4]   ; цвет текста
1204
        mov     al, [esi+1]
1205
        shr     al, 4
1206
        mov     ebp, [console_colors + eax*4]   ; цвет фона
1207
        lodsb
1208
        inc     esi
1209
if font_width > 8
1210
        lea     edx, [eax+eax+font]
1211
else
1212
        lea     edx, [eax+font]
1213
end if
1214
        mov     ecx, font_height
1215
.sh:
1216
        push    ecx edi
1217
        xor     ecx, ecx
1218
.sw:
1219
        mov     eax, ebx
1220
        bt      [edx], ecx
1221
        jc      @f
1222
        mov     eax, ebp
1223
@@:
1224
        stosw
1225
        shr     eax, 16
1226
        stosb
1227
        inc     ecx
1228
        cmp     ecx, font_width
1229
        jb      .sw
1230
        pop     edi ecx
1231
        mov     eax, [cur_width]
1232
        imul    eax, font_width*3
1233
        add     edi, eax
1234
if font_width > 8
1235
        add     edx, 256*2
1236
else
1237
        add     edx, 256
1238
end if
1239
        loop    .sh
1240
        pop     edi ecx
1241
        add     edi, font_width*3
1242
        loop    .lw
1243
        mov     eax, [cur_width]
1244
        imul    eax, (font_height-1)*font_width*3
1245
        add     edi, eax
1246
        pop     ecx
1247
        loop    .lh
1248
        push    7
1249
        pop     eax
1250
        mov     ebx, [MemForImage]
1251
        mov     ecx, [cur_width]
1252
        imul    ecx, font_width*10000h
1253
        mov     cx, word [cur_height]
1254
        imul    cx, font_height
1255
        mov     edx, [skinh]
1256
        add     edx, 5*10000h
1257
        int     40h
1258
        ret
1259
 
1260
get_console_ptr:
1261
; in: eax=x, edx=y
1262
; out: edi->console data
1263
        push    edx
1264
        imul    edx, [cur_width]
1265
        add     edx, eax
1266
        lea     edi, [console_data + edx*2]
1267
        pop     edx
1268
        ret
1269
 
1270
draw_keybar:
1271
        pushad
1272
        xor     eax, eax
1273
        test    [ctrlstate], 3
1274
        jz      @f
1275
        inc     eax
1276
@@:
1277
        test    [ctrlstate], 0xC
1278
        jz      @f
1279
        or      al, 2
1280
@@:
1281
        test    [ctrlstate], 0x30
1282
        jz      @f
1283
        or      al, 4
1284
@@:
1285
        imul    eax, 6*12
1286
        mov     esi, [active_screen_vtable]
1287
        mov     esi, [esi+screen_vtable.keybar]
1288
        add     esi, eax
1289
        xor     ecx, ecx
1290
        inc     ecx
1291
        xor     eax, eax
1292
        mov     edx, [cur_height]
1293
        dec     edx
1294
        call    get_console_ptr
1295
        push    6
1296
        pop     ebx
1297
        mov     eax, [cur_width]
1298
        sub     eax, 11+9+3*2+6
1299
        cmp     eax, 7*11
1300
        jl      @f
1301
        cdq
1302
        mov     bl, 11
1303
        div     ebx
1304
        mov     ebx, eax
1305
@@:
1306
        xor     edx, edx
1307
.l:
1308
        add     edx, 7
1309
        cmp     cl, 10
1310
        jb      @f
1311
        inc     edx
1312
@@:
1313
        cmp     edx, [cur_width]
1314
        ja      .ret
1315
        cmp     cl, 10
1316
        jae     .twodig
1317
        lea     eax, [ecx+'0']
1318
        stosb
1319
        mov     al, [keybar_number_color]
1320
        stosb
1321
        jmp     .cmn
1322
.twodig:
1323
        mov     al, cl
1324
        cbw
1325
        div     [_10]
1326
        add     al, '0'
1327
        stosb
1328
        mov     al, [keybar_number_color]
1329
        stosb
1330
        xchg    al, ah
1331
        add     al, '0'
1332
        stosw
1333
.cmn:
1334
        mov     ah, [keybar_name_color]
1335
        push    ecx
1336
        mov     cl, 6
1337
@@:
1338
        lodsb
1339
        stosw
1340
        loop    @b
1341
        mov     al, ' '
1342
        lea     ecx, [ebx-6]
1343
        cmp     byte [esp], 12
1344
        jz      .ret_pop
1345
        add     edx, ecx
1346
        rep     stosw
1347
        pop     ecx
1348
        inc     edx
1349
        cmp     edx, [cur_width]
1350
        ja      .ret
1351
        mov     ah, [keybar_bgr_color]
1352
        stosw
1353
        inc     ecx
1354
        jmp     .l
1355
.ret_pop:
1356
        pop     ecx
1357
.ret:
1358
        cmp     byte [edi-2], ' '
1359
        jnz     @f
1360
        dec     edi
1361
        dec     edi
1362
@@:
1363
        push    edi
1364
        mov     eax, [cur_width]
1365
        mov     edx, [cur_height]
1366
        call    get_console_ptr
1367
        mov     ecx, edi
1368
        pop     edi
1369
        sub     ecx, edi
1370
        shr     ecx, 1
1371
        mov     al, ' '
1372
        mov     ah, [keybar_name_color]
1373
        rep     stosw
1374
.done:
1375
        popad
1376
        ret
1377
 
1378
draw_cmdbar:
1379
        mov     esi, [active_panel]
1380
        add     esi, panel1_dir - panel1_data
1381
        xor     eax, eax
1382
        mov     edx, [cur_height]
1383
        dec     edx
1384
        dec     edx
1385
        call    get_console_ptr
1386
        mov     ah, [cmdbar_prefix_color]
1387
        mov     ecx, [cur_width]
1388
        dec     ecx
1389
@@:
1390
        lodsb
1391
        test    al, al
1392
        jz      @f
1393
        stosw
1394
        loop    @b
1395
@@:
1396
        mov     al, '>'
1397
        stosw
1398
        mov     al, ' '
1399
        mov     ah, [cmdbar_normal_color]
1400
        rep     stosw
1401
        ret
1402
 
1403
draw_border:
1404
        push    edi
1405
        mov     al, 0xC9
1406
        stosw
1407
        mov     al, 0xCD
1408
        lea     ecx, [ebx-2]
1409
        rep     stosw
1410
        mov     al, 0xBB
1411
        stosw
1412
        pop     edi
1413
        add     edi, [cur_width]
1414
        add     edi, [cur_width]
1415
        lea     ecx, [edx-2]
1416
.l:
1417
        push    edi
1418
        mov     al, 0xBA
1419
        stosw
1420
        mov     al, 0x20
1421
        push    ecx
1422
        lea     ecx, [ebx-2]
1423
        rep     stosw
1424
        pop     ecx
1425
        mov     al, 0xBA
1426
        stosw
1427
        pop     edi
1428
        add     edi, [cur_width]
1429
        add     edi, [cur_width]
1430
        loop    .l
1431
        mov     al, 0xC8
1432
        stosw
1433
        mov     al, 0xCD
1434
        lea     ecx, [ebx-2]
1435
        rep     stosw
1436
        mov     al, 0xBC
1437
        stosw
1438
        ret
1439
 
1440
draw_panel:
1441
        mov     eax, [ebp + panel1_left - panel1_data]
1442
        mov     edx, [ebp + panel1_top - panel1_data]
1443
        call    get_console_ptr
1444
; draw border
1445
        mov     ah, [panel_border_color]
1446
        mov     ebx, [ebp + panel1_width - panel1_data]
1447
        mov     edx, [ebp + panel1_height - panel1_data]
1448
        call    draw_border
1449
        push    eax
1450
        mov     eax, [ebp + panel1_left - panel1_data]
1451
        mov     edx, [ebp + panel1_top - panel1_data]
1452
        add     edx, [ebp + panel1_height - panel1_data]
1453
        sub     edx, 3
1454
        call    get_console_ptr
1455
        pop     eax
1456
        mov     al, 0xC7
1457
        stosw
1458
        mov     al, 0xC4
1459
        lea     ecx, [ebx-2]
1460
        rep     stosw
1461
        mov     al, 0xB6
1462
        stosw
1463
        mov     eax, [ebp + panel1_width - panel1_data]
1464
        sub     eax, 3
1465
        shr     eax, 1
1466
        mov     [column_width], eax
1467
        mov     eax, [ebp + panel1_left - panel1_data]
1468
        inc     eax
1469
        mov     [column_left], eax
1470
        add     eax, [column_width]
1471
        mov     edx, [ebp + panel1_top - panel1_data]
1472
        inc     edx
1473
        mov     [column_top], edx
1474
        dec     edx
1475
        call    get_console_ptr
1476
        mov     ah, [panel_border_color]
1477
        mov     al, 0xD1
1478
        mov     [edi], ax
1479
        add     edi, [cur_width]
1480
        add     edi, [cur_width]
1481
        mov     ecx, [ebp + panel1_height - panel1_data]
1482
        sub     ecx, 4
1483
        mov     [column_height], ecx
1484
        mov     al, 0xB3
1485
@@:
1486
        mov     [edi], ax
1487
        add     edi, [cur_width]
1488
        add     edi, [cur_width]
1489
        loop    @b
1490
        mov     al, 0xC1
1491
        stosw
1492
        mov     eax, [column_height]
1493
        dec     eax
1494
        mov     [ebp + panel1_colsz - panel1_data], eax
1495
        add     eax, eax
1496
        mov     [ebp + panel1_colst - panel1_data], eax
1497
        mov     eax, [ebp + panel1_start - panel1_data]
1498
        mov     [column_index], eax
1499
        call    draw_column
1500
        mov     eax, [ebp + panel1_width - panel1_data]
1501
        sub     eax, 3
1502
        mov     ecx, [column_width]
1503
        sub     eax, ecx
1504
        mov     [column_width], eax
1505
        inc     ecx
1506
        add     [column_left], ecx
1507
        call    draw_column
1508
; Заголовок панели (текущая папка)
1509
        lea     esi, [ebp + panel1_dir - panel1_data]
1510
        mov     edi, cur_header
1511
        mov     ecx, [ebp + panel1_width - panel1_data]
1512
        sub     ecx, 7
1513
        movsb
1514
@@:
1515
        lodsb
1516
        stosb
1517
        dec     ecx
1518
        test    al, al
1519
        jz      .header_created
1520
        cmp     al, '/'
1521
        jnz     @b
1522
        mov     edx, esi
1523
@@:
1524
        lodsb
1525
        test    al, al
1526
        jnz     @b
1527
        sub     esi, edx
1528
        dec     esi
1529
        cmp     esi, ecx
1530
        jbe     @f
1531
        mov     word [edi], '..'
1532
        mov     byte [edi+2], '.'
1533
        add     edi, 3
1534
        sub     ecx, 3
1535
        add     edx, esi
1536
        sub     edx, ecx
1537
@@:
1538
        mov     esi, edx
1539
@@:
1540
        lodsb
1541
        stosb
1542
        dec     ecx
1543
        test    al, al
1544
        jnz     @b
1545
.header_created:
1546
        mov     edx, [ebp + panel1_top - panel1_data]
1547
        mov     eax, [ebp + panel1_left - panel1_data]
1548
        shr     ecx, 1
1549
        lea     eax, [eax+ecx+3]
1550
        call    get_console_ptr
1551
        mov     ah, [panel_active_header_color]
1552
        cmp     ebp, [active_panel]
1553
        jz      @f
1554
        mov     ah, [panel_header_color]
1555
@@:
1556
        mov     al, ' '
1557
        stosw
1558
        mov     esi, cur_header
1559
@@:
1560
        lodsb
1561
        test    al, al
1562
        jz      @f
1563
        stosw
1564
        jmp     @b
1565
@@:
1566
        mov     al, ' '
1567
        stosw
1568
        mov     edx, [ebp + panel1_top - panel1_data]
1569
        inc     edx
1570
        mov     eax, [ebp + panel1_left - panel1_data]
1571
        inc     eax
1572
        call    get_console_ptr
1573
        movzx   eax, [ebp + panel1_sortmode - panel1_data]
1574
        mov     al, [compare_names+eax]
1575
        stosb
1576
        cmp     [ebp + panel1_numfiles - panel1_data], 0
1577
        jz      .skip_curinfo
1578
; Информация о выбранном файле
1579
        mov     ebx, [ebp + panel1_index - panel1_data]
1580
        mov     eax, [ebp + panel1_files - panel1_data]
1581
        mov     ebx, [eax+ebx*4]
1582
        mov     eax, [ebp + panel1_nfa - panel1_data]
1583
        lea     ebx, [ebx+eax*4+32]
1584
        add     ebx, [ebp + panel1_files - panel1_data]
1585
        mov     eax, [ebp + panel1_left - panel1_data]
1586
        add     eax, [ebp + panel1_width - panel1_data]
1587
        dec     eax
1588
        mov     edx, [ebp + panel1_top - panel1_data]
1589
        add     edx, [ebp + panel1_height - panel1_data]
1590
        dec     edx
1591
        dec     edx
1592
        call    get_console_ptr
1593
        mov     ecx, [ebp + panel1_width - panel1_data]
1594
        dec     ecx
1595
        dec     ecx
1596
; Время модификации
1597
        sub     edi, 5*2
1598
        sub     ecx, 6
1599
        mov     al, [ebx+24+2]
1600
        aam
1601
        or      ax, 0x3030
1602
        mov     [edi], ah
1603
        mov     [edi+2], al
1604
        mov     [edi+4], byte ':'
1605
        mov     al, [ebx+24+1]
1606
        aam
1607
        or      ax, 0x3030
1608
        mov     [edi+6], ah
1609
        mov     [edi+8], al
1610
        mov     al, [panel_normal_color]
1611
        mov     [edi+1], al
1612
        mov     [edi+3], al
1613
        mov     [edi+5], al
1614
        mov     [edi+7], al
1615
        mov     [edi+9], al
1616
        dec     edi
1617
        mov     [edi], al
1618
        dec     edi
1619
        mov     byte [edi], ' '
1620
; Дата модификации
1621
        sub     edi, 8*2
1622
        sub     ecx, 9
1623
        mov     al, [ebx+28+0]
1624
        aam
1625
        or      ax, 0x3030
1626
        mov     [edi], ah
1627
        mov     [edi+2], al
1628
        mov     [edi+4], byte '.'
1629
        mov     al, [ebx+28+1]
1630
        aam
1631
        or      ax, 0x3030
1632
        mov     [edi+6], ah
1633
        mov     [edi+8], al
1634
        mov     [edi+10], byte '.'
1635
        mov     ax, [ebx+28+2]
1636
        div     [_100]
1637
        mov     al, ah
1638
        aam
1639
        or      ax, 0x3030
1640
        mov     [edi+12], ah
1641
        mov     [edi+14], al
1642
        mov     al, [panel_normal_color]
1643
        mov     [edi+1], al
1644
        mov     [edi+3], al
1645
        mov     [edi+5], al
1646
        mov     [edi+7], al
1647
        mov     [edi+9], al
1648
        mov     [edi+11], al
1649
        mov     [edi+13], al
1650
        mov     [edi+15], al
1651
        dec     edi
1652
        mov     [edi], al
1653
        dec     edi
1654
        mov     [edi], byte ' '
1655
; Размер
1656
        std
1657
        mov     ah, [panel_normal_color]
1658
        dec     edi
1659
        dec     edi
1660
        dec     ecx
1661
        test    byte [ebx], 0x10
1662
        jz      .size_file
1663
        push    ecx
1664
        mov     esi, aFolder+aFolder.size-1
1665
        mov     ecx, aFolder.size
1666
        cmp     word [ebx+40], '..'
1667
        jnz     @f
1668
        cmp     byte [ebx+42], 0
1669
        jnz     @f
1670
        mov     esi, aUp+aUp.size-1
1671
        mov     cl, aUp.size
1672
@@:
1673
        sub     [esp], ecx
1674
@@:
1675
        lodsb
1676
        stosw
1677
        loop    @b
1678
        pop     ecx
1679
        jmp     .size_done
1680
.size_file:
1681
        mov     edx, [ebx+36]
1682
        test    edx, edx
1683
        jz      .size_less_4g
1684
        cmp     edx, 10*256
1685
        jae     .size_tera
1686
; в гигабайтах
1687
        mov     al, 'G'
1688
        jmp     .size_letter
1689
.size_tera:
1690
; в терабайтах
1691
        shr     edx, 8
1692
        mov     al, 'T'
1693
        jmp     .size_letter
1694
.size_less_4g:
1695
        mov     edx, [ebx+32]
1696
        cmp     edx, 10*(1 shl 20)
1697
        jae     .size_mega
1698
        cmp     edx, 1 shl 20
1699
        jb      .size_num
1700
        shr     edx, 10
1701
        mov     al, 'K'
1702
        jmp     .size_letter
1703
.size_mega:
1704
        mov     al, 'M'
1705
        shr     edx, 20
1706
.size_letter:
1707
        stosw
1708
        dec     ecx
1709
        mov     al, ' '
1710
        stosw
1711
        dec     ecx
1712
.size_num:
1713
        xchg    eax, edx
1714
        xor     edx, edx
1715
        div     [_10d]
1716
        xchg    eax, edx
1717
        add     al, '0'
1718
        mov     ah, [panel_normal_color]
1719
        stosw
1720
        dec     ecx
1721
        test    edx, edx
1722
        jnz     .size_num
1723
.size_done:
1724
        cld
1725
; Имя
1726
        sub     edi, ecx
1727
        sub     edi, ecx
1728
        lea     esi, [ebx+40]
1729
@@:
1730
        lodsb
1731
        test    al, al
1732
        jnz     @b
1733
        sub     esi, ebx
1734
        sub     esi, 41
1735
        mov     ah, [panel_normal_color]
1736
        cmp     esi, ecx
1737
        lea     edx, [ebx+40]
1738
        jbe     @f
1739
        mov     al, '{'
1740
        mov     [edi-2], ax
1741
        add     edx, esi
1742
        sub     edx, ecx
1743
@@:
1744
        mov     esi, edx
1745
@@:
1746
        lodsb
1747
        test    al, al
1748
        jz      @f
1749
        stosw
1750
        loop    @b
1751
@@:
1752
        mov     al, ' '
1753
        rep     stosw
1754
.skip_curinfo:
1755
        call    draw_image
1756
        ret
1757
 
1758
draw_column:
1759
        mov     eax, [column_left]
1760
        mov     edx, [column_top]
1761
        call    get_console_ptr
1762
; заголовок столбца
1763
        push    edi
1764
        mov     ah, [column_header_color]
1765
        mov     al, ' '
1766
        mov     ecx, [column_width]
1767
if lang eq ru
1768
        sub     ecx, 3
1769
else
1770
        sub     ecx, 4
1771
end if
1772
        shr     ecx, 1
1773
        rep     stosw
1774
if lang eq ru
1775
        mov     al, 'И'
1776
        stosw
1777
        mov     al, 'м'
1778
        stosw
1779
        mov     al, 'я'
1780
        stosw
1781
else
1782
        mov     al, 'N'
1783
        stosw
1784
        mov     al, 'a'
1785
        stosw
1786
        mov     al, 'm'
1787
        stosw
1788
        mov     al, 'e'
1789
        stosw
1790
end if
1791
        mov     al, ' '
1792
        mov     ecx, [column_width]
1793
if lang eq ru
1794
        sub     ecx, 2
1795
else
1796
        sub     ecx, 3
1797
end if
1798
        shr     ecx, 1
1799
        rep     stosw
1800
        pop     edi
1801
        add     edi, [cur_width]
1802
        add     edi, [cur_width]
1803
; файлы
1804
        mov     edx, [ebp + panel1_numfiles - panel1_data]
1805
        mov     ecx, [column_height]
1806
        dec     ecx
1807
.l:
1808
        cmp     [column_index], edx
1809
        jae     .ret
1810
        push    ecx
1811
        mov     esi, [column_index]
1812
        mov     ecx, [ebp + panel1_files - panel1_data]
1813
        mov     esi, [ecx+esi*4]
1814
        mov     ecx, [ebp + panel1_nfa - panel1_data]
1815
        lea     esi, [esi + ecx*4 + 32 + 40]
1816
        add     esi, [ebp + panel1_files - panel1_data]
1817
; подсветка
1818
;        call    insert_last_dot
1819
        xor     ecx, ecx
1820
.highlight_test_loop:
1821
        mov     ebx, [highlight_groups+ecx*4]
1822
        mov     al, [ebx + highlight.IncludeAttributes]
1823
        mov     ah, [esi - 40]
1824
        and     ah, al
1825
        cmp     ah, al
1826
        jnz     .highlight_test_failed
1827
        push    edi
1828
        lea     edi, [ebx + highlight.Mask]
1829
        call    match_mask
1830
        pop     edi
1831
        jc      .highlight_test_failed
1832
        mov     ah, [ebx + highlight.NormalColor]
1833
        cmp     ebp, [active_panel]
1834
        jnz     @f
1835
        mov     ecx, [column_index]
1836
        cmp     ecx, [ebp + panel1_index - panel1_data]
1837
        jnz     @f
1838
        mov     ah, [ebx + highlight.CursorColor]
1839
@@:
1840
        test    ah, ah
1841
        jz      .nohighlight
1842
        jmp     .doname
1843
.highlight_test_failed:
1844
        inc     ecx
1845
        cmp     ecx, [highlight_num_groups]
1846
        jb      .highlight_test_loop
1847
.nohighlight:
1848
        mov     ah, [panel_normal_color]
1849
        cmp     ebp, [active_panel]
1850
        jnz     @f
1851
        mov     ecx, [column_index]
1852
        cmp     ecx, [ebp + panel1_index - panel1_data]
1853
        jnz     @f
1854
        mov     ah, [panel_cursor_color]
1855
@@:
1856
.doname:
1857
;        call    delete_last_dot
1858
        mov     ecx, [column_width]
1859
        push    edi
1860
@@:
1861
        lodsb
1862
        test    al, al
1863
        jz      @f
1864
        stosw
1865
        loop    @b
1866
        cmp     byte [esi], 0
1867
        jz      @f
1868
        mov     byte [edi], '}'
1869
@@:
1870
        mov     al, ' '
1871
        rep     stosw
1872
        pop     edi
1873
        add     edi, [cur_width]
1874
        add     edi, [cur_width]
1875
        inc     [column_index]
1876
        pop     ecx
1877
        dec     ecx
1878
        jnz     .l
1879
.ret:
1880
        cmp     ebp, panel1_data
1881
        jnz     .ret2
1882
; Число экранов
1883
        mov     eax, [num_screens]
1884
        dec     eax
1885
        jz      .ret2
1886
        push    eax
1887
        xor     eax, eax
1888
        xor     edx, edx
1889
        call    get_console_ptr
1890
        mov     ah, [panel_nscreens_color]
1891
        mov     al, '['
1892
        stosw
1893
        pop     eax
1894
        push    -'0'
1895
@@:
1896
        xor     edx, edx
1897
        div     [_10d]
1898
        push    edx
1899
        test    eax, eax
1900
        jnz     @b
1901
@@:
1902
        pop     eax
1903
        add     eax, '0'
1904
        jz      @f
1905
        mov     ah, [panel_nscreens_color]
1906
        stosw
1907
        jmp     @b
1908
@@:
1909
        mov     al, ']'
1910
        mov     ah, [panel_nscreens_color]
1911
        stosw
1912
.ret2:
1913
        ret
1914
 
1915
;insert_last_dot:
1916
;        push    eax esi
1917
;        mov     ah, 0
1918
;.loop:
1919
;        lodsb
1920
;        test    al, al
1921
;        jz      .done
1922
;        cmp     al, '.'
1923
;        jnz     .loop
1924
;        mov     ah, 1
1925
;        jmp     .loop
1926
;.done:
1927
;        test    ah, ah
1928
;        jnz     @f
1929
;        mov     byte [esi-1], '.'
1930
;        mov     byte [esi], 0
1931
;@@:
1932
;        pop     esi eax
1933
;        ret
1934
 
1935
;delete_last_dot:
1936
;        push    esi
1937
;@@:
1938
;        cmp     byte [esi], 0
1939
;        jz      @f
1940
;        inc     esi
1941
;        jmp     @b
1942
;@@:
1943
;        cmp     byte [esi-1], '.'
1944
;        jnz     @f
1945
;        mov     byte [esi-1], 0
1946
;@@:     pop     esi
1947
;        ret
1948
 
1949
read_folder:
1950
        mov     eax, [ebp + panel1_nfa - panel1_data]
1951
        mov     [dirinfo.size], eax
1952
        shl     eax, 2
1953
        add     eax, [ebp + panel1_files - panel1_data]
1954
        mov     [dirinfo.dirdata], eax
1955
        lea     eax, [ebp + panel1_dir - panel1_data]
1956
        mov     [dirinfo.name], eax
1957
        push    70
1958
        pop     eax
1959
        mov     ebx, dirinfo
1960
        int     40h
1961
        test    eax, eax
1962
        jz      .ok
1963
        cmp     eax, 6
1964
        jz      .ok
1965
; TODO: add error handling
1966
        mov     [ebp + panel1_numfiles - panel1_data], 2
1967
        mov     eax, [ebp + panel1_nfa - panel1_data]
1968
        shl     eax, 2
1969
        add     eax, [ebp + panel1_files - panel1_data]
1970
        add     eax, 32+40
1971
        mov     word [eax], '..'
1972
        mov     byte [eax+2], 0
1973
        add     eax, 304
1974
        mov     dword [eax], 'Read'
1975
        mov     dword [eax+4], ' err'
1976
        mov     dword [eax+8], 'or'
1977
        mov     eax, [ebp + panel1_files - panel1_data]
1978
        mov     dword [eax], 0
1979
        mov     dword [eax+4], 304
1980
        and     dword [ebp + panel1_index - panel1_data], 0
1981
        and     dword [ebp + panel1_start - panel1_data], 0
1982
        ret
1983
.ok:
1984
        mov     eax, [dirinfo.dirdata]
1985
        cmp     [eax+8], ebx
1986
        jz      .readdone
1987
        push    eax
1988
        mov     eax, [ebp + panel1_files - panel1_data]
1989
        cmp     eax, buf1
1990
        jz      @f
1991
        cmp     eax, buf2
1992
        jz      @f
1993
        call    mf_free
1994
@@:
1995
        pop     eax
1996
        mov     eax, [eax+8]
1997
        add     eax, 0xF
1998
        and     eax, not 0xF
1999
        push    eax
2000
        imul    eax, 4+304
2001
        add     eax, 32
2002
        call    mf_alloc
2003
        test    eax, eax
2004
        jnz     .succ1
2005
        pop     eax
2006
; TODO: add error handling
2007
        jmp     .readdone
2008
.succ1:
2009
        mov     [ebp + panel1_files - panel1_data], eax
2010
        pop     [ebp + panel1_nfa - panel1_data]
2011
        jmp     read_folder
2012
.readdone:
2013
        and     [ebp + panel1_start - panel1_data], 0
2014
        and     [ebp + panel1_index - panel1_data], 0
2015
        and     [ebp + panel1_start - panel1_data], 0
2016
        mov     edi, [ebp + panel1_files - panel1_data]
2017
        mov     eax, [ebp + panel1_nfa - panel1_data]
2018
        lea     esi, [edi + eax*4 + 32]
2019
        xor     eax, eax
2020
        mov     ecx, [esi-32+4]
2021
        jecxz   .loopdone
2022
; Игнорируем специальные входы, соответствующие папке '.' и метке тома
2023
.ptrinit:
2024
        cmp     word [esi+eax+40], '.'
2025
        jz      .loopcont
2026
        test    byte [esi+eax], 8
2027
        jnz     .loopcont
2028
        stosd
2029
.loopcont:
2030
        add     eax, 304
2031
        loop    .ptrinit
2032
.loopdone:
2033
        sub     edi, [ebp + panel1_files - panel1_data]
2034
        shr     edi, 2
2035
        mov     [ebp + panel1_numfiles - panel1_data], edi
2036
.done:
2037
; Сортировка
2038
sort_files:
2039
        movzx   eax, [ebp + panel1_sortmode - panel1_data]
2040
        mov     ebx, [compare_fns + eax*4]
2041
        mov     edx, [ebp + panel1_files - panel1_data]
2042
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
2043
        call    sort
2044
        ret
2045
 
2046
compare_name:
2047
        push    eax
2048
        mov     eax, [ebp + panel1_nfa - panel1_data]
2049
        add     esi, [ebp + panel1_files - panel1_data]
2050
        add     edi, [ebp + panel1_files - panel1_data]
2051
        lea     esi, [esi+eax*4+0x20]
2052
        lea     edi, [edi+eax*4+0x20]
2053
        pop     eax
2054
        cmp     word [esi+40], '..'
2055
        jnz     @f
2056
        cmp     byte [esi+42], 0
2057
        jz      .less
2058
@@:     cmp     word [edi+40], '..'
2059
        jnz     @f
2060
        cmp     byte [edi+42], 0
2061
        jz      .greater
2062
@@:
2063
        test    byte [esi], 10h
2064
        jnz     .1dir
2065
        test    byte [edi], 10h
2066
        jnz     .greater
2067
.eq1:
2068
        add     esi, 40
2069
        add     edi, 40
2070
        jmp     strcmpi
2071
.greater:
2072
        test    esi, esi
2073
        ret
2074
.1dir:
2075
        test    byte [edi], 10h
2076
        jnz     .eq1
2077
.less:
2078
        xor     edi, edi
2079
        stc
2080
        ret
2081
 
2082
compare_name_rev:
2083
        push    eax
2084
        mov     eax, [ebp + panel1_nfa - panel1_data]
2085
        add     esi, [ebp + panel1_files - panel1_data]
2086
        add     edi, [ebp + panel1_files - panel1_data]
2087
        lea     esi, [esi+eax*4+0x20]
2088
        lea     edi, [edi+eax*4+0x20]
2089
        pop     eax
2090
        cmp     word [esi+40], '..'
2091
        jnz     @f
2092
        cmp     byte [esi+42], 0
2093
        jz      .less
2094
@@:     cmp     word [edi+40], '..'
2095
        jnz     @f
2096
        cmp     byte [edi+42], 0
2097
        jz      .greater
2098
@@:
2099
        test    byte [esi], 10h
2100
        jnz     .1dir
2101
        test    byte [edi], 10h
2102
        jnz     .greater
2103
.eq1:
2104
        add     esi, 40
2105
        add     edi, 40
2106
        xchg    esi, edi
2107
        jmp     strcmpi
2108
.greater:
2109
        test    esi, esi
2110
        ret
2111
.1dir:
2112
        test    byte [edi], 10h
2113
        jnz     .eq1
2114
.less:
2115
        xor     edi, edi
2116
        stc
2117
        ret
2118
 
2119
strcmpi:
2120
        push    eax
2121
@@:
2122
        lodsb
2123
        call    match_symbol
2124
        jnz     .ret
2125
        inc     edi
2126
        test    al, al
2127
        jnz     @b
2128
.ret:
2129
        pop     eax
2130
        ret
2131
 
2132
compare_ext:
2133
        push    eax
2134
        mov     eax, [ebp + panel1_nfa - panel1_data]
2135
        add     esi, [ebp + panel1_files - panel1_data]
2136
        add     edi, [ebp + panel1_files - panel1_data]
2137
        lea     esi, [esi+eax*4+0x20]
2138
        lea     edi, [edi+eax*4+0x20]
2139
        pop     eax
2140
        cmp     word [esi+40], '..'
2141
        jnz     @f
2142
        cmp     byte [esi+42], 0
2143
        jz      .less
2144
@@:     cmp     word [edi+40], '..'
2145
        jnz     @f
2146
        cmp     byte [edi+42], 0
2147
        jz      .greater
2148
@@:
2149
        test    byte [esi], 10h
2150
        jnz     .1dir
2151
        test    byte [edi], 10h
2152
        jnz     .greater
2153
.eq1:
2154
        add     esi, 40
2155
        add     edi, 40
2156
        push    esi edi
2157
        call    seek_ext
2158
        xchg    esi, edi
2159
        call    seek_ext
2160
        xchg    esi, edi
2161
        call    strcmpi
2162
        jnz     .ret
2163
        pop     edi esi
2164
        jmp     strcmpi
2165
.ret:
2166
        pop     edi esi
2167
        ret
2168
.greater:
2169
        test    esi, esi
2170
        ret
2171
.1dir:
2172
        test    byte [edi], 10h
2173
        jnz     .eq1
2174
.less:
2175
        xor     edi, edi
2176
        stc
2177
        ret
2178
 
2179
compare_ext_rev:
2180
        push    eax
2181
        mov     eax, [ebp + panel1_nfa - panel1_data]
2182
        add     esi, [ebp + panel1_files - panel1_data]
2183
        add     edi, [ebp + panel1_files - panel1_data]
2184
        lea     esi, [esi+eax*4+0x20]
2185
        lea     edi, [edi+eax*4+0x20]
2186
        pop     eax
2187
        cmp     word [esi+40], '..'
2188
        jnz     @f
2189
        cmp     byte [esi+42], 0
2190
        jz      .less
2191
@@:     cmp     word [edi+40], '..'
2192
        jnz     @f
2193
        cmp     byte [edi+42], 0
2194
        jz      .greater
2195
@@:
2196
        test    byte [esi], 10h
2197
        jnz     .1dir
2198
        test    byte [edi], 10h
2199
        jnz     .greater
2200
.eq1:
2201
        add     esi, 40
2202
        add     edi, 40
2203
        push    esi edi
2204
        call    seek_ext
2205
        xchg    esi, edi
2206
        call    seek_ext
2207
        call    strcmpi
2208
        jnz     .ret
2209
        pop     edi esi
2210
        xchg    esi, edi
2211
        jmp     strcmpi
2212
.ret:
2213
        pop     edi esi
2214
        ret
2215
.greater:
2216
        test    esi, esi
2217
        ret
2218
.1dir:
2219
        test    byte [edi], 10h
2220
        jnz     .eq1
2221
.less:
2222
        xor     edi, edi
2223
        stc
2224
        ret
2225
 
2226
seek_ext:
2227
        push    eax
2228
        xor     eax, eax
2229
.l:
2230
        inc     esi
2231
        cmp     byte [esi-1], '.'
2232
        jnz     @f
2233
        mov     eax, esi
2234
@@:
2235
        cmp     byte [esi-1], 0
2236
        jnz     .l
2237
        test    eax, eax
2238
        jnz     @f
2239
        lea     eax, [esi-1]
2240
@@:
2241
        mov     esi, eax
2242
        pop     eax
2243
        ret
2244
 
2245
compare_modified:
2246
        push    eax
2247
        mov     eax, [ebp + panel1_nfa - panel1_data]
2248
        add     esi, [ebp + panel1_files - panel1_data]
2249
        add     edi, [ebp + panel1_files - panel1_data]
2250
        lea     esi, [esi+eax*4+0x20]
2251
        lea     edi, [edi+eax*4+0x20]
2252
        pop     eax
2253
        cmp     word [esi+40], '..'
2254
        jnz     @f
2255
        cmp     byte [esi+42], 0
2256
        jz      .less
2257
@@:     cmp     word [edi+40], '..'
2258
        jnz     @f
2259
        cmp     byte [edi+42], 0
2260
        jz      .greater
2261
@@:
2262
        test    byte [esi], 10h
2263
        jnz     .1dir
2264
        test    byte [edi], 10h
2265
        jnz     .greater
2266
.eq1:
2267
        push    edi
2268
        mov     edi, [edi+28]
2269
        cmp     edi, [esi+28]
2270
        pop     edi
2271
        jnz     @f
2272
        push    edi
2273
        mov     edi, [edi+24]
2274
        cmp     edi, [esi+24]
2275
        pop     edi
2276
        jnz     @f
2277
        add     esi, 40
2278
        add     edi, 40
2279
        jmp     strcmpi
2280
@@:
2281
        ret
2282
.greater:
2283
        test    esi, esi
2284
        ret
2285
.1dir:
2286
        test    byte [edi], 10h
2287
        jnz     .eq1
2288
.less:
2289
        xor     edi, edi
2290
        stc
2291
        ret
2292
 
2293
compare_modified_rev:
2294
        push    eax
2295
        mov     eax, [ebp + panel1_nfa - panel1_data]
2296
        add     esi, [ebp + panel1_files - panel1_data]
2297
        add     edi, [ebp + panel1_files - panel1_data]
2298
        lea     esi, [esi+eax*4+0x20]
2299
        lea     edi, [edi+eax*4+0x20]
2300
        pop     eax
2301
        cmp     word [esi+40], '..'
2302
        jnz     @f
2303
        cmp     byte [esi+42], 0
2304
        jz      .less
2305
@@:     cmp     word [edi+40], '..'
2306
        jnz     @f
2307
        cmp     byte [edi+42], 0
2308
        jz      .greater
2309
@@:
2310
        test    byte [esi], 10h
2311
        jnz     .1dir
2312
        test    byte [edi], 10h
2313
        jnz     .greater
2314
.eq1:
2315
        push    esi
2316
        mov     esi, [esi+28]
2317
        cmp     esi, [edi+28]
2318
        pop     esi
2319
        jnz     @f
2320
        push    esi
2321
        mov     esi, [esi+24]
2322
        cmp     esi, [edi+24]
2323
        pop     esi
2324
        jnz     @f
2325
        add     esi, 40
2326
        add     edi, 40
2327
        xchg    esi, edi
2328
        jmp     strcmpi
2329
@@:
2330
        ret
2331
.greater:
2332
        test    esi, esi
2333
        ret
2334
.1dir:
2335
        test    byte [edi], 10h
2336
        jnz     .eq1
2337
.less:
2338
        xor     edi, edi
2339
        stc
2340
        ret
2341
 
2342
compare_size:
2343
        push    eax
2344
        mov     eax, [ebp + panel1_nfa - panel1_data]
2345
        add     esi, [ebp + panel1_files - panel1_data]
2346
        add     edi, [ebp + panel1_files - panel1_data]
2347
        lea     esi, [esi+eax*4+0x20]
2348
        lea     edi, [edi+eax*4+0x20]
2349
        pop     eax
2350
        cmp     word [esi+40], '..'
2351
        jnz     @f
2352
        cmp     byte [esi+42], 0
2353
        jz      .less
2354
@@:     cmp     word [edi+40], '..'
2355
        jnz     @f
2356
        cmp     byte [edi+42], 0
2357
        jz      .greater
2358
@@:
2359
        test    byte [esi], 10h
2360
        jnz     .1dir
2361
        test    byte [edi], 10h
2362
        jnz     .greater
2363
.eq1:
2364
        push    edi
2365
        mov     edi, [edi+36]
2366
        cmp     edi, [esi+36]
2367
        pop     edi
2368
        jnz     @f
2369
        push    edi
2370
        mov     edi, [edi+32]
2371
        cmp     edi, [esi+32]
2372
        pop     edi
2373
        jnz     @f
2374
        add     esi, 40
2375
        add     edi, 40
2376
        jmp     strcmpi
2377
@@:
2378
        ret
2379
.greater:
2380
        test    esi, esi
2381
        ret
2382
.1dir:
2383
        test    byte [edi], 10h
2384
        jnz     .eq1
2385
.less:
2386
        xor     edi, edi
2387
        stc
2388
        ret
2389
 
2390
compare_size_rev:
2391
        push    eax
2392
        mov     eax, [ebp + panel1_nfa - panel1_data]
2393
        add     esi, [ebp + panel1_files - panel1_data]
2394
        add     edi, [ebp + panel1_files - panel1_data]
2395
        lea     esi, [esi+eax*4+0x20]
2396
        lea     edi, [edi+eax*4+0x20]
2397
        pop     eax
2398
        cmp     word [esi+40], '..'
2399
        jnz     @f
2400
        cmp     byte [esi+42], 0
2401
        jz      .less
2402
@@:     cmp     word [edi+40], '..'
2403
        jnz     @f
2404
        cmp     byte [edi+42], 0
2405
        jz      .greater
2406
@@:
2407
        test    byte [esi], 10h
2408
        jnz     .1dir
2409
        test    byte [edi], 10h
2410
        jnz     .greater
2411
.eq1:
2412
        push    esi
2413
        mov     esi, [esi+36]
2414
        cmp     esi, [edi+36]
2415
        pop     esi
2416
        jnz     @f
2417
        push    esi
2418
        mov     esi, [esi+32]
2419
        cmp     esi, [edi+32]
2420
        pop     esi
2421
        jnz     @f
2422
        add     esi, 40
2423
        add     edi, 40
2424
        xchg    esi, edi
2425
        jmp     strcmpi
2426
@@:
2427
        ret
2428
.greater:
2429
        test    esi, esi
2430
        ret
2431
.1dir:
2432
        test    byte [edi], 10h
2433
        jnz     .eq1
2434
.less:
2435
        xor     edi, edi
2436
        stc
2437
        ret
2438
 
2439
compare_unordered:
2440
        cmp     esi, edi
2441
        ret
2442
compare_unordered_rev:
2443
        push    eax
2444
        mov     eax, [ebp + panel1_nfa - panel1_data]
2445
        add     esi, [ebp + panel1_files - panel1_data]
2446
        add     edi, [ebp + panel1_files - panel1_data]
2447
        lea     esi, [esi+eax*4+0x20]
2448
        lea     edi, [edi+eax*4+0x20]
2449
        pop     eax
2450
        cmp     word [esi+40], '..'
2451
        jnz     @f
2452
        cmp     byte [esi+42], 0
2453
        jz      .less
2454
@@:     cmp     word [edi+40], '..'
2455
        jnz     @f
2456
        cmp     byte [edi+42], 0
2457
        jz      .greater
2458
@@:
2459
        cmp     edi, esi
2460
        ret
2461
.greater:
2462
        test    esi, esi
2463
        ret
2464
.less:
2465
        xor     edi, edi
2466
        stc
2467
        ret
2468
 
2469
compare_created:
2470
        push    eax
2471
        mov     eax, [ebp + panel1_nfa - panel1_data]
2472
        add     esi, [ebp + panel1_files - panel1_data]
2473
        add     edi, [ebp + panel1_files - panel1_data]
2474
        lea     esi, [esi+eax*4+0x20]
2475
        lea     edi, [edi+eax*4+0x20]
2476
        pop     eax
2477
        cmp     word [esi+40], '..'
2478
        jnz     @f
2479
        cmp     byte [esi+42], 0
2480
        jz      .less
2481
@@:     cmp     word [edi+40], '..'
2482
        jnz     @f
2483
        cmp     byte [edi+42], 0
2484
        jz      .greater
2485
@@:
2486
        test    byte [esi], 10h
2487
        jnz     .1dir
2488
        test    byte [edi], 10h
2489
        jnz     .greater
2490
.eq1:
2491
        push    edi
2492
        mov     edi, [edi+12]
2493
        cmp     edi, [esi+12]
2494
        pop     edi
2495
        jnz     @f
2496
        push    edi
2497
        mov     edi, [edi+8]
2498
        cmp     edi, [esi+8]
2499
        pop     edi
2500
        jnz     @f
2501
        add     esi, 40
2502
        add     edi, 40
2503
        jmp     strcmpi
2504
@@:
2505
        ret
2506
.greater:
2507
        test    esi, esi
2508
        ret
2509
.1dir:
2510
        test    byte [edi], 10h
2511
        jnz     .eq1
2512
.less:
2513
        xor     edi, edi
2514
        stc
2515
        ret
2516
 
2517
compare_created_rev:
2518
        push    eax
2519
        mov     eax, [ebp + panel1_nfa - panel1_data]
2520
        add     esi, [ebp + panel1_files - panel1_data]
2521
        add     edi, [ebp + panel1_files - panel1_data]
2522
        lea     esi, [esi+eax*4+0x20]
2523
        lea     edi, [edi+eax*4+0x20]
2524
        pop     eax
2525
        cmp     word [esi+40], '..'
2526
        jnz     @f
2527
        cmp     byte [esi+42], 0
2528
        jz      .less
2529
@@:     cmp     word [edi+40], '..'
2530
        jnz     @f
2531
        cmp     byte [edi+42], 0
2532
        jz      .greater
2533
@@:
2534
        test    byte [esi], 10h
2535
        jnz     .1dir
2536
        test    byte [edi], 10h
2537
        jnz     .greater
2538
.eq1:
2539
        push    esi
2540
        mov     esi, [esi+12]
2541
        cmp     esi, [edi+12]
2542
        pop     esi
2543
        jnz     @f
2544
        push    esi
2545
        mov     esi, [esi+8]
2546
        cmp     esi, [edi+8]
2547
        pop     esi
2548
        jnz     @f
2549
        add     esi, 40
2550
        add     edi, 40
2551
        xchg    esi, edi
2552
        jmp     strcmpi
2553
@@:
2554
        ret
2555
.greater:
2556
        test    esi, esi
2557
        ret
2558
.1dir:
2559
        test    byte [edi], 10h
2560
        jnz     .eq1
2561
.less:
2562
        xor     edi, edi
2563
        stc
2564
        ret
2565
 
2566
compare_accessed:
2567
        push    eax
2568
        mov     eax, [ebp + panel1_nfa - panel1_data]
2569
        add     esi, [ebp + panel1_files - panel1_data]
2570
        add     edi, [ebp + panel1_files - panel1_data]
2571
        lea     esi, [esi+eax*4+0x20]
2572
        lea     edi, [edi+eax*4+0x20]
2573
        pop     eax
2574
        cmp     word [esi+40], '..'
2575
        jnz     @f
2576
        cmp     byte [esi+42], 0
2577
        jz      .less
2578
@@:     cmp     word [edi+40], '..'
2579
        jnz     @f
2580
        cmp     byte [edi+42], 0
2581
        jz      .greater
2582
@@:
2583
        test    byte [esi], 10h
2584
        jnz     .1dir
2585
        test    byte [edi], 10h
2586
        jnz     .greater
2587
.eq1:
2588
        push    edi
2589
        mov     edi, [edi+20]
2590
        cmp     edi, [esi+20]
2591
        pop     edi
2592
        jnz     @f
2593
        push    edi
2594
        mov     edi, [edi+16]
2595
        cmp     edi, [esi+16]
2596
        pop     edi
2597
        jnz     @f
2598
        add     esi, 40
2599
        add     edi, 40
2600
        jmp     strcmpi
2601
@@:
2602
        ret
2603
.greater:
2604
        test    esi, esi
2605
        ret
2606
.1dir:
2607
        test    byte [edi], 10h
2608
        jnz     .eq1
2609
.less:
2610
        xor     edi, edi
2611
        stc
2612
        ret
2613
 
2614
compare_accessed_rev:
2615
        push    eax
2616
        mov     eax, [ebp + panel1_nfa - panel1_data]
2617
        add     esi, [ebp + panel1_files - panel1_data]
2618
        add     edi, [ebp + panel1_files - panel1_data]
2619
        lea     esi, [esi+eax*4+0x20]
2620
        lea     edi, [edi+eax*4+0x20]
2621
        pop     eax
2622
        cmp     word [esi+40], '..'
2623
        jnz     @f
2624
        cmp     byte [esi+42], 0
2625
        jz      .less
2626
@@:     cmp     word [edi+40], '..'
2627
        jnz     @f
2628
        cmp     byte [edi+42], 0
2629
        jz      .greater
2630
@@:
2631
        test    byte [esi], 10h
2632
        jnz     .1dir
2633
        test    byte [edi], 10h
2634
        jnz     .greater
2635
.eq1:
2636
        push    esi
2637
        mov     esi, [esi+20]
2638
        cmp     esi, [edi+20]
2639
        pop     esi
2640
        jnz     @f
2641
        push    esi
2642
        mov     esi, [esi+16]
2643
        cmp     esi, [edi+16]
2644
        pop     esi
2645
        jnz     @f
2646
        add     esi, 40
2647
        add     edi, 40
2648
        xchg    esi, edi
2649
        jmp     strcmpi
2650
@@:
2651
        ret
2652
.greater:
2653
        test    esi, esi
2654
        ret
2655
.1dir:
2656
        test    byte [edi], 10h
2657
        jnz     .eq1
2658
.less:
2659
        xor     edi, edi
2660
        stc
2661
        ret
2662
 
2663
match_mask:
2664
; in: esi->name, edi->mask
2665
; out: CF clear <=> match
2666
        pusha
2667
        xchg    esi, edi
2668
.main_cycle:
2669
        push    esi
2670
@@:
2671
        lodsb
2672
        test    al, al
2673
        jz      @f
2674
        cmp     al, ','
2675
        jz      @f
2676
        cmp     al, '|'
2677
        jnz     @b
2678
@@:
2679
        mov     [esi-1], byte 0
2680
        xchg    esi, [esp]
2681
        call    match_single_mask
2682
        pop     esi
2683
        mov     [esi-1], al
2684
        jnc     .found
2685
        cmp     al, ','
2686
        jz      .main_cycle
2687
.done_fail:
2688
        stc
2689
        popa
2690
        ret
2691
.found:
2692
        test    al, al
2693
        jz      .done_succ
2694
        cmp     al, '|'
2695
        jz      .test_exclude
2696
        lodsb
2697
        jmp     .found
2698
.done_succ:
2699
        clc
2700
        popa
2701
        ret
2702
.test_exclude:
2703
        push    esi
2704
@@:
2705
        lodsb
2706
        test    al, al
2707
        jz      @f
2708
        cmp     al, ','
2709
        jnz     @b
2710
@@:
2711
        mov     byte [esi-1], 0
2712
        xchg    esi, [esp]
2713
        call    match_single_mask
2714
        pop     esi
2715
        mov     [esi-1], al
2716
        jnc     .done_fail
2717
        test    al, al
2718
        jz      .done_succ
2719
        jmp     .test_exclude
2720
 
2721
match_single_mask:
2722
; in: esi->mask, edi->name
2723
; out: CF clear <=> match
2724
        pusha
2725
.mask_symbol:
2726
        lodsb
2727
        test    al, al
2728
        jz      .mask_done
2729
        cmp     al, '*'
2730
        jz      .asterisk
2731
        cmp     al, '?'
2732
        jz      .quest
2733
        cmp     al, '['
2734
        jz      .list
2735
        call    match_symbol
2736
        jnz     .done_fail
2737
        inc     edi
2738
        jmp     .mask_symbol
2739
.done_fail:
2740
        stc
2741
        popa
2742
        ret
2743
.mask_done:
2744
        scasb
2745
        jnz     .done_fail
2746
.done_succ:
2747
        clc
2748
        popa
2749
        ret
2750
.quest:
2751
        mov     al, 0
2752
        scasb
2753
        jz      .done_fail
2754
        jmp     .mask_symbol
2755
.list:
2756
        lodsb
2757
        cmp     al, ']'
2758
        jz      .done_fail
2759
        cmp     byte [esi+1], '-'
2760
        jz      .range
2761
        call    match_symbol
2762
        jnz     .list
2763
.listok:
2764
        inc     edi
2765
@@:
2766
        lodsb
2767
        cmp     al, ']'
2768
        jnz     @b
2769
        jmp     .mask_symbol
2770
.range:
2771
        call    match_symbol
2772
        ja      @f
2773
        mov     al, [esi+2]
2774
        call    match_symbol
2775
        jae     .listok
2776
@@:
2777
        inc     esi
2778
        jmp     .list
2779
.asterisk:
2780
        push    edi
2781
@@:
2782
        call    match_single_mask
2783
        jnc     @f
2784
        mov     al, 0
2785
        scasb
2786
        jnz     @b
2787
        pop     edi
2788
        jmp     .done_fail
2789
@@:
2790
        pop     edi
2791
        jmp     .done_succ
2792
 
2793
tolower:
2794
        cmp     al, 'A'
2795
        jb      @f
2796
        cmp     al, 'Z'
2797
        ja      @f
2798
        add     al, ' '
2799
@@:     ret
2800
 
2801
match_symbol:
2802
; in: al,[edi]=symbols
2803
; out: flags as 'cmp al,[edi]'
2804
        push    eax
2805
        call    tolower
2806
        mov     ah, [edi]
2807
        xchg    al, ah
2808
        call    tolower
2809
        cmp     ah, al
2810
        pop     eax
2811
        ret
2812
 
2813
 
2814
header  db      'Kolibri Far 0.13'
2815
;.length = $ - header
2816
        db      0
2817
 
2818
nomem_draw      db      'No memory for redraw.',0
2819
.size = $ - nomem_draw
2820
 
2821
def_left_dir    db      '/rd/1',0
2822
def_right_dir   db      '/hd0/1',0
2823
 
2824
if lang eq ru
2825
aFolder         db      'Папка'
2826
.size = $-aFolder
2827
aUp             db      'Вверх'
2828
.size = $-aUp
2829
aDrive          db      'Диск',0
2830
aScreens        db      'Экраны',0
2831
else
2832
aFolder         db      'Folder'
2833
.size = $-aFolder
2834
aUp             db      'Up'
2835
.size = $-aUp
2836
aDrive          db      'Drive',0
2837
aScreens        db      'Screens',0
2838
end if
2839
 
2840
_10d dd 10
2841
_100d dd 100
2842
_10 db 10
2843
_100 db 100
2844
 
2845
fpu_cw  dw      000011100111111b
2846
 
2847
keybar_panels:
2848
if lang eq ru
2849
; без клавиш-модификаторов
2850
        db      'Помощь'
2851
        db      'ПользМ'
2852
        db      'Просм '
2853
        db      'Редакт'
2854
        db      'Копир '
2855
        db      'Перен '
2856
        db      'Папка '
2857
        db      'Удален'
2858
        db      'КонфМн'
2859
        db      'Выход '
2860
        db      'Модули'
2861
        db      'Экраны'
2862
; Shift
2863
        db      'Добавл'
2864
        db      'Распак'
2865
        db      'АрхКом'
2866
        db      'Редак.'
2867
        db      'Копир '
2868
        db      'Переим'
2869
        db      '      '
2870
        db      'Удален'
2871
        db      'Сохран'
2872
        db      'Послдн'
2873
        db      'Группы'
2874
        db      'Выбран'
2875
; Ctrl
2876
        db      'Левая '
2877
        db      'Правая'
2878
        db      'Имя   '
2879
        db      'Расшир'
2880
        db      'Модиф '
2881
        db      'Размер'
2882
        db      'Несорт'
2883
        db      'Создан'
2884
        db      'Доступ'
2885
        db      'Описан'
2886
        db      'Владел'
2887
        db      'Сорт  '
2888
; Ctrl+Shift
2889
        db      '      '
2890
        db      '      '
2891
        db      'Просм '
2892
        db      'Редакт'
2893
        db      '      '
2894
        db      '      '
2895
        db      '      '
2896
        db      '      '
2897
        db      '      '
2898
        db      '      '
2899
        db      '      '
2900
        db      '      '
2901
; Alt
2902
        db      'Левая '
2903
        db      'Правая'
2904
        db      'Смотр.'
2905
        db      'Редак.'
2906
        db      'Печать'
2907
        db      'Связь '
2908
        db      'Искать'
2909
        db      'Истор '
2910
        db      'Видео '
2911
        db      'Дерево'
2912
        db      'ИстПр '
2913
        db      'ИстПап'
2914
; Alt+Shift
2915
        db      '      '
2916
        db      '      '
2917
        db      '      '
2918
        db      '      '
2919
        db      '      '
2920
        db      '      '
2921
        db      '      '
2922
        db      '      '
2923
        db      'КонфПл'
2924
        db      '      '
2925
        db      '      '
2926
        db      '      '
2927
; Alt+Ctrl
2928
times 12 db     '      '
2929
; Alt+Ctrl+Shift
2930
times 12 db     '      '
2931
else
2932
; No modificators
2933
        db      'Help  '
2934
        db      'UserMn'
2935
        db      'View  '
2936
        db      'Edit  '
2937
        db      'Copy  '
2938
        db      'RenMov'
2939
        db      'MkFold'
2940
        db      'Delete'
2941
        db      'ConfMn'
2942
        db      'Quit  '
2943
        db      'Plugin'
2944
        db      'Screen'
2945
; Shift
2946
        db      'Add   '
2947
        db      'Extrct'
2948
        db      'ArcCmd'
2949
        db      'Edit..'
2950
        db      'Copy  '
2951
        db      'Rename'
2952
        db      '      '
2953
        db      'Delete'
2954
        db      'Save  '
2955
        db      'Last  '
2956
        db      'Group '
2957
        db      'SelUp '
2958
; Ctrl
2959
        db      'Left  '
2960
        db      'Right '
2961
        db      'Name  '
2962
        db      'Extens'
2963
        db      'Modifn'
2964
        db      'Size  '
2965
        db      'Unsort'
2966
        db      'Creatn'
2967
        db      'Access'
2968
        db      'Descr '
2969
        db      'Owner '
2970
        db      'Sort  '
2971
; Ctrl+Shift
2972
        db      '      '
2973
        db      '      '
2974
        db      'View  '
2975
        db      'Edit  '
2976
        db      '      '
2977
        db      '      '
2978
        db      '      '
2979
        db      '      '
2980
        db      '      '
2981
        db      '      '
2982
        db      '      '
2983
        db      '      '
2984
; Alt
2985
        db      'Left  '
2986
        db      'Right '
2987
        db      'View..'
2988
        db      'Edit..'
2989
        db      'Print '
2990
        db      'MkLink'
2991
        db      'Find  '
2992
        db      'Histry'
2993
        db      'Video '
2994
        db      'Tree  '
2995
        db      'ViewHs'
2996
        db      'FoldHs'
2997
; Alt+Shift
2998
        db      '      '
2999
        db      '      '
3000
        db      '      '
3001
        db      '      '
3002
        db      '      '
3003
        db      '      '
3004
        db      '      '
3005
        db      '      '
3006
        db      'ConfPl'
3007
        db      '      '
3008
        db      '      '
3009
        db      '      '
3010
; Alt+Ctrl
3011
times 12 db     '      '
3012
; Alt+Ctrl+Shift
3013
times 12 db     '      '
3014
end if
3015
 
3016
keybar_viewer:
3017
if lang eq ru
3018
; без клавиш-модификаторов
3019
        db      'Помощь'
3020
        db      'Развер'
3021
        db      'Выход '
3022
        db      'Код   '
3023
        db      '      '
3024
        db      'Редакт'
3025
        db      'Поиск '
3026
keybar_cp:
3027
        db      'cp1251'
3028
        db      '      '
3029
        db      'Выход '
3030
        db      'Модули'
3031
        db      'Экраны'
3032
; Shift
3033
        db      '      '
3034
        db      'Слова '
3035
        db      '      '
3036
        db      '      '
3037
        db      '      '
3038
        db      '      '
3039
        db      'Дальше'
3040
        db      'Таблиц'
3041
        db      '      '
3042
        db      '      '
3043
        db      '      '
3044
        db      '      '
3045
; Ctrl
3046
        db      '      '
3047
        db      '      '
3048
        db      '      '
3049
        db      '      '
3050
        db      '      '
3051
        db      '      '
3052
        db      '      '
3053
        db      '      '
3054
        db      '      '
3055
        db      'Позиц '
3056
        db      '      '
3057
        db      '      '
3058
; Ctrl+Shift
3059
        db      '      '
3060
        db      '      '
3061
        db      '      '
3062
        db      '      '
3063
        db      '      '
3064
        db      '      '
3065
        db      '      '
3066
        db      '      '
3067
        db      '      '
3068
        db      '      '
3069
        db      '      '
3070
        db      '      '
3071
; Alt
3072
        db      '      '
3073
        db      '      '
3074
        db      '      '
3075
        db      '      '
3076
        db      'Печать'
3077
        db      '      '
3078
        db      'Назад '
3079
        db      'Перейт'
3080
        db      'Видео '
3081
        db      '      '
3082
        db      'ИстПр '
3083
        db      '      '
3084
; Alt+Shift
3085
        db      '      '
3086
        db      '      '
3087
        db      '      '
3088
        db      '      '
3089
        db      '      '
3090
        db      '      '
3091
        db      '      '
3092
        db      '      '
3093
        db      'Конфиг'
3094
        db      '      '
3095
        db      '      '
3096
        db      '      '
3097
; Alt+Ctrl
3098
times 12 db     '      '
3099
; Alt+Ctrl+Shift
3100
times 12 db     '      '
3101
else
3102
; No modificators
3103
        db      'Help  '
3104
        db      'Unwrap'
3105
        db      'Quit  '
3106
        db      'Hex   '
3107
        db      '      '
3108
        db      'Edit  '
3109
        db      'Search'
3110
keybar_cp:
3111
        db      'cp1251'
3112
        db      '      '
3113
        db      'Quit  '
3114
        db      'Plugin'
3115
        db      'Screen'
3116
; Shift
3117
        db      '      '
3118
        db      'WWrap '
3119
        db      '      '
3120
        db      '      '
3121
        db      '      '
3122
        db      '      '
3123
        db      'Next  '
3124
        db      'Table '
3125
        db      '      '
3126
        db      '      '
3127
        db      '      '
3128
        db      '      '
3129
; Ctrl
3130
        db      '      '
3131
        db      '      '
3132
        db      '      '
3133
        db      '      '
3134
        db      '      '
3135
        db      '      '
3136
        db      '      '
3137
        db      '      '
3138
        db      '      '
3139
        db      'GoFile'
3140
        db      '      '
3141
        db      '      '
3142
; Ctrl+Shift
3143
        db      '      '
3144
        db      '      '
3145
        db      '      '
3146
        db      '      '
3147
        db      '      '
3148
        db      '      '
3149
        db      '      '
3150
        db      '      '
3151
        db      '      '
3152
        db      '      '
3153
        db      '      '
3154
        db      '      '
3155
; Alt
3156
        db      '      '
3157
        db      '      '
3158
        db      '      '
3159
        db      '      '
3160
        db      'Print '
3161
        db      '      '
3162
        db      'Prev  '
3163
        db      'Goto  '
3164
        db      'Video '
3165
        db      '      '
3166
        db      'ViewHs'
3167
        db      '      '
3168
; Alt+Shift
3169
        db      '      '
3170
        db      '      '
3171
        db      '      '
3172
        db      '      '
3173
        db      '      '
3174
        db      '      '
3175
        db      '      '
3176
        db      '      '
3177
        db      'Config'
3178
        db      '      '
3179
        db      '      '
3180
        db      '      '
3181
; Alt+Ctrl
3182
times 12 db     '      '
3183
; Alt+Ctrl+Shift
3184
times 12 db     '      '
3185
end if
3186
 
3187
        align   4
3188
cur_width       dd      80
3189
cur_height      dd      25
3190
max_width = 256
3191
max_height = 256
3192
 
3193
active_panel    dd      panel1_data
3194
 
3195
console_colors  dd      0x000000, 0x000080, 0x008000, 0x008080
3196
                dd      0x800000, 0x800080, 0x808000, 0xC0C0C0
3197
                dd      0x808080, 0x0000FF, 0x00FF00, 0x00FFFF
3198
                dd      0xFF0000, 0xFF00FF, 0xFFFF00, 0xFFFFFF
3199
 
3200
compare_fns     dd      compare_name
3201
                dd      compare_name_rev
3202
                dd      compare_ext
3203
                dd      compare_ext_rev
3204
                dd      compare_modified
3205
                dd      compare_modified_rev
3206
                dd      compare_size
3207
                dd      compare_size_rev
3208
                dd      compare_unordered
3209
                dd      compare_unordered_rev
3210
                dd      compare_created
3211
                dd      compare_created_rev
3212
                dd      compare_accessed
3213
                dd      compare_accessed_rev
3214
 
3215
ctrlkey_tests   dd      ctrlkey_test0
3216
                dd      ctrlkey_test1
3217
                dd      ctrlkey_test2
3218
                dd      ctrlkey_test3
3219
                dd      ctrlkey_test4
3220
ctrlkey_tests_num = 5
3221
 
3222
virtual at 0
3223
screen_vtable:
3224
        .OnRedraw       dd      ?
3225
        .OnKey          dd      ?
3226
        .keybar         dd      ?
3227
        .getname        dd      ?
3228
end virtual
3229
 
3230
panels_vtable:
3231
        dd      panels_OnRedraw
3232
        dd      panels_OnKey
3233
        dd      keybar_panels
3234
        dd      panels_getname
3235
 
3236
viewer_vtable:
3237
        dd      viewer_OnRedraw
3238
        dd      viewer_OnKey
3239
        dd      keybar_viewer
3240
        dd      viewer_getname
3241
 
3242
encodings:
3243
.cp866 = 0
3244
.cp1251 = 1
3245
 
3246
.names:
3247
        db      'cp866   '
3248
        db      'cp1251  '
3249
 
3250
.tables:
3251
; cp866 - trivial map
3252
        times 128 db %+127
3253
; cp1251
3254
        db      0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8,0x3F,0x25,0x3F,0x3C,0x3F,0x3F,0x3F,0x3F
3255
        db      0x3F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D,0x3F,0x54,0x3F,0x3E,0x3F,0x3F,0x3F,0x3F
3256
        db      0xFF,0xF6,0xF7,0x3F,0xFD,0x3F,0xB3,0x15,0xF0,0x63,0xF2,0x3C,0xBF,0x2D,0x52,0xF4
3257
        db      0xF8,0x2B,0x49,0x69,0x3F,0xE7,0x14,0xFA,0xF1,0xFC,0xF3,0x3E,0x3F,0x3F,0x3F,0xF5
3258
        times 0x30 db %-1+0x80
3259
        times 0x10 db %-1+0xE0
3260
 
3261
active_screen   dd      0
3262
tabsize         dd      8
3263
 
3264
ascii2scan:
3265
        times 32 db 0
3266
        db      0x39,0x02,0x03,0x04,0x05,0x06,0x08,0x28,0x0A,0x0B,0x09,0x0D,0x33,0x0C,0x34,0x35
3267
        db      0x0B,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x27,0x27,0x33,0x0D,0x34,0x35
3268
        db      0x03,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
3269
        db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x07,0x0C
3270
        db      0x29,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
3271
        db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x29,0x00
3272
        db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
3273
        db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
3274
        db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
3275
        times 48 db 0
3276
        db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
3277
        db      0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
3278
 
3279
; Клавишные сочетания
3280
; db scancode, reserved
3281
; dw ctrlstate
3282
; dd handler
3283
; ctrlstate: младшие 4 бита - для Shift, следующие - для Ctrl, следующие - для Alt
3284
; 0 = ни одна клавиша не нажата
3285
; 1 = ровно одна нажата
3286
; 2 = обе нажаты
3287
; 3 = левая нажата, правая нет
3288
; 4 = правая нажата, левая нет
3289
panels_ctrlkeys:
3290
        dw      0x48, 0
3291
        dd      panels_OnKey.up
3292
        dw      0x50, 0
3293
        dd      panels_OnKey.down
3294
        dw      0x4B, 0
3295
        dd      panels_OnKey.left
3296
        dw      0x4D, 0
3297
        dd      panels_OnKey.right
3298
        dw      0xF, 0
3299
        dd      panels_OnKey.tab
3300
        dw      0x47, 0
3301
        dd      panels_OnKey.home
3302
        dw      0x4F, 0
3303
        dd      panels_OnKey.end
3304
        dw      0x1C, 0
3305
        dd      panels_OnKey.enter
3306
        dw      0x3D, 0
3307
        dd      panels_OnKey.f3
3308
        dw      0x42, 0
3309
        dd      panels_OnKey.f8
3310
        dw      0x44, 0
3311
        dd      exit
3312
repeat 9-3+1
3313
        dw      0x3D+%-1, 0x10
3314
        dd      panels_OnKey.ctrl_f39
3315
end repeat
3316
        dw      0x3B, 0x100
3317
        dd      panels_OnKey.alt_f12
3318
        dw      0x3C, 0x100
3319
        dd      panels_OnKey.alt_f12
3320
        dw      0x58, 0
3321
        dd      F12
3322
        dw      0x13, 0x10
3323
        dd      panels_OnKey.ctrl_r
3324
        db      0
3325
 
3326
viewer_ctrlkeys:
3327
        dw      1, 0
3328
        dd      viewer_OnKey.exit
3329
        dw      0x51, 0
3330
        dd      viewer_OnKey.pgdn
3331
        dw      0x49, 0
3332
        dd      viewer_OnKey.pgup
3333
        dw      0x50, 0
3334
        dd      viewer_OnKey.down
3335
        dw      0x48, 0
3336
        dd      viewer_OnKey.up
3337
        dw      0x4B, 0
3338
        dd      viewer_OnKey.left
3339
        dw      0x4B, 0x10
3340
        dd      viewer_OnKey.ctrl_left
3341
        dw      0x4B, 0x11
3342
        dd      viewer_OnKey.ctrl_shift_left
3343
        dw      0x4C, 0
3344
        dd      viewer_OnKey.exit
3345
        dw      0x4D, 0
3346
        dd      viewer_OnKey.right
3347
        dw      0x4D, 0x10
3348
        dd      viewer_OnKey.ctrl_right
3349
        dw      0x4D, 0x11
3350
        dd      viewer_OnKey.ctrl_shift_right
3351
        dw      0x3C, 0
3352
        dd      viewer_OnKey.f2
3353
        dw      0x3D, 0
3354
        dd      viewer_OnKey.exit
3355
        dw      0x3E, 0
3356
        dd      viewer_OnKey.f4
3357
        dw      0x42, 0
3358
        dd      viewer_OnKey.f8
3359
        dw      0x44, 0
3360
        dd      viewer_OnKey.exit
3361
        dw      0x47, 0
3362
        dd      viewer_OnKey.home
3363
        dw      0x4F, 0
3364
        dd      viewer_OnKey.end
3365
        dw      0x58, 0
3366
        dd      F12
3367
        db      0
3368
 
3369
dirinfo:
3370
                dd      1
3371
.first          dd      0
3372
                dd      0
3373
.size           dd      300
3374
.dirdata        dd      0
3375
                db      0
3376
.name           dd      0
3377
 
3378
readinfo:
3379
                dd      0
3380
.first          dq      0
3381
.size           dd      0
3382
.data           dd      0
3383
                db      0
3384
.name           dd      0
3385
 
3386
attrinfo:
3387
                dd      5
3388
                dd      0
3389
                dd      0
3390
                dd      0
3391
                dd      .attr
3392
                db      0
3393
.name           dd      0
3394
 
3395
delinfo:
3396
                dd      8
3397
                dd      0
3398
                dd      0
3399
                dd      0
3400
                dd      0
3401
                db      0
3402
                dd      execdata
3403
 
3404
if lang eq ru
3405
compare_names   db      'иИрРмМаАнНсСдД'
3406
else
3407
compare_names   db      'nNxXmMsSuUcCaA'
3408
end if
3409
 
3410
; Панель
3411
panel_normal_color      db      1Bh
3412
panel_border_color      db      1Bh
3413
panel_cursor_color      db      30h
3414
panel_header_color      db      1Bh
3415
panel_active_header_color db    30h
3416
column_header_color     db      1Eh
3417
panel_nscreens_color    db      0Bh
3418
; Меню
3419
menu_normal_color       db      3Fh
3420
menu_selected_color     db      0Fh
3421
menu_highlight_color    db      3Eh
3422
menu_selected_highlight_color db 0Eh
3423
menu_border_color       db      3Fh
3424
menu_header_color       db      3Fh
3425
menu_scrollbar_color    db      3Fh
3426
; Линейка клавиш
3427
keybar_number_color     db      7
3428
keybar_name_color       db      30h
3429
keybar_bgr_color        db      7
3430
; Командная строка
3431
cmdbar_normal_color     db      7
3432
cmdbar_prefix_color     db      7
3433
; Просмотрщик
3434
view_normal_color       db      1Bh
3435
view_status_color       db      30h
3436
view_arrows_color       db      1Eh
3437
 
3438
; Подсветка файлов
3439
highlight_num_groups    dd      10
3440
highlight_groups        dd      highlight_group0
3441
                dd      highlight_group1
3442
                dd      highlight_group2
3443
                dd      highlight_group3
3444
                dd      highlight_group4
3445
                dd      highlight_group5
3446
                dd      highlight_group6
3447
                dd      highlight_group7
3448
                dd      highlight_group8
3449
                dd      highlight_group9
3450
 
3451
; Формат описания группы подсветки:
3452
virtual at 0
3453
highlight:
3454
        .NormalColor            db ?
3455
        .CursorColor            db ?
3456
        .IncludeAttributes      db ?
3457
        .Mask:                  ; ASCIIZ-string
3458
end virtual
3459
 
3460
highlight_group0:
3461
        db      13h
3462
        db      38h
3463
        db      2
3464
        db      '*',0
3465
highlight_group1:
3466
        db      13h
3467
        db      38h
3468
        db      4
3469
        db      '*',0
3470
highlight_group2:
3471
        db      1Fh
3472
        db      3Fh
3473
        db      10h
3474
        db      '*|..',0
3475
highlight_group3:
3476
        db      0
3477
        db      0
3478
        db      10h
3479
        db      '..',0
3480
highlight_group4:
3481
        db      1Ah
3482
        db      3Ah
3483
        db      0
3484
        db      '*.exe,*.com,*.bat,*.cmd',0
3485
highlight_group5:
3486
        db      1Ah
3487
        db      3Ah
3488
        db      0
3489
        db      '*|*.*',0
3490
highlight_group6:
3491
        db      1Dh
3492
        db      3Dh
3493
        db      0
3494
        db      '*.rar,*.zip,*.[zj],*.[bg7]z,*.[bg]zip,*.tar,*.t[ag]z,*.ar[cj],*.r[0-9][0-9],'
3495
        db      '*.a[0-9][0-9],*.bz2,*.cab,*.msi,*.jar,*.lha,*.lzh,*.ha,*.ac[bei],*.pa[ck],'
3496
        db      '*.rk,*.cpio,*.rpm,*.zoo,*.hqx,*.sit,*.ice,*.uc2,*.ain,*.imp,*.777,*.ufa,*.boa,'
3497
        db      '*.bs[2a],*.sea,*.hpk,*.ddi,*.x2,*.rkv,*.[lw]sz,*.h[ay]p,*.lim,*.sqz,*.chz',0
3498
highlight_group7:
3499
        db      16h
3500
        db      36h
3501
        db      0
3502
        db      '*.bak,*.tmp',0
3503
highlight_group8:
3504
        db      17h
3505
        db      37h
3506
        db      0
3507
        db      '*.asm,*.inc',0
3508
highlight_group9:
3509
        db      1Fh
3510
        db      3Fh
3511
        db      10h
3512
        db      '*',0
3513
 
3514
bWasE0          db      0
3515
ctrlstate       db      0
3516
MemForImage     dd      0
3517
 
3518
associations:
3519
        dd      aAsm, tinypad
3520
        dd      aInc, tinypad
3521
        dd      aTxt, tinypad
3522
        dd      aJpg, jpegview
3523
        dd      aJpeg, jpegview
3524
        dd      aGif, gifview
3525
        dd      aWav, ac97wav
3526
        dd      aMp3, ac97wav
3527
        dd      aMid, midamp
3528
        dd      aBmp, mv
3529
        dd      aPng, archer
3530
        dd      aRtf, rtfread
3531
associations_end:
3532
 
3533
aAsm db 'asm',0
3534
aInc db 'inc',0
3535
aTxt db 'txt',0
3536
tinypad db '/rd/1/TinyPad',0
3537
 
3538
aJpg db 'jpg',0
3539
aJpeg db 'jpeg',0
3540
jpegview db '/rd/1/JpegView',0
3541
 
3542
aGif db 'gif',0
3543
gifview db '/rd/1/GIFVIEW',0
3544
 
3545
aWav db 'wav',0
3546
aMp3 db 'mp3',0
3547
ac97wav db '/rd/1/AC97WAV',0
3548
 
3549
aMid db 'mid',0
3550
midamp db '/rd/1/MIDAMP',0
3551
 
3552
aBmp db 'bmp',0
3553
mv db '/rd/1/MV',0
3554
 
3555
aPng db 'png',0
3556
archer db '/rd/1/@rcher',0
3557
 
3558
aRtf db 'rtf',0
3559
rtfread db '/rd/1/RtfRead',0
3560
 
3561
execinfo:
3562
        dd      7
3563
        dd      0
3564
execparams dd   0
3565
        dd      0
3566
        dd      0
3567
        db      0
3568
execptr dd      ?
3569
 
3570
IncludeIGlobals
3571
 
3572
i_end:
3573
 
3574
IncludeUGlobals
3575
 
3576
execdata rb     1024
3577
        align   4
3578
attrinfo.attr   rb      40
3579
 
3580
panel1_data:
3581
panel1_left     dd      ?
3582
panel1_top      dd      ?
3583
panel1_width    dd      ?
3584
panel1_height   dd      ?
3585
panel1_index    dd      ?
3586
panel1_start    dd      ?
3587
panel1_colsz    dd      ?
3588
panel1_colst    dd      ?
3589
panel1_sortmode db      ?
3590
                rb      3
3591
panel1_nfa      dd      ?
3592
panel1_numfiles dd      ?
3593
panel1_files    dd      ?
3594
panel1_dir      rb      1024
3595
 
3596
panel2_data:
3597
panel2_left     dd      ?
3598
panel2_top      dd      ?
3599
panel2_width    dd      ?
3600
panel2_height   dd      ?
3601
panel2_index    dd      ?
3602
panel2_start    dd      ?
3603
panel2_colsz    dd      ?
3604
panel2_colst    dd      ?
3605
panel2_sortmode db      ?
3606
                rb      3
3607
panel2_nfa      dd      ?
3608
panel2_numfiles dd      ?
3609
panel2_files    dd      ?
3610
panel2_dir      rb      1024
3611
 
3612
console_data    rb      max_width*max_height*2
3613
 
3614
cur_header      rb      max_width
3615
tmp             dd      ?
3616
 
3617
skinh           dd      ?
3618
std_colors      rd      10
3619
 
3620
column_left     dd      ?
3621
column_top      dd      ?
3622
column_width    dd      ?
3623
column_height   dd      ?
3624
column_index    dd      ?
3625
 
3626
scrpos          dq      ?
3627
viewer_right_side dq    ?
3628
 
3629
saved_file_name:
3630
procinfo        rb      1024
3631
 
3632
driveinfo       rb      32+304
3633
tmpname         rb      32
3634
 
3635
screens         dd      ?
3636
num_screens     dd      ?
3637
active_screen_vtable dd ?
3638
active_screen_data dd   ?
3639
 
3640
; stack
3641
        align   512
3642
        rb      512
3643
stacktop:
3644
; buffers for directory - may be resized dynamically
3645
buf1    rb      4*304 + 32 + 304*304
3646
buf2    rb      4*304 + 32 + 304*304
3647
 
3648
mem: