Subversion Repositories Kolibri OS

Rev

Rev 205 | Rev 314 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
180 heavyiron 1
use32
2
        db      'MENUET01'
3
        dd      1
4
        dd      start
5
        dd      i_end
6
memsize dd      mem
7
        dd      stacktop
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
283 diamond 21
        call    init_console
180 heavyiron 22
        call    draw_window
23
        push    66
24
        pop     eax
25
        push    1
26
        pop     ebx
27
        mov     ecx, ebx
28
        int     40h     ; set keyboard mode to scancodes
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
283 diamond 44
        mov     eax, 200
180 heavyiron 45
        mov     [panel1_nfa], eax
46
        mov     [panel2_nfa], eax
283 diamond 47
        mov     eax, 200*4 + 32 + 200*304
48
        push    eax
49
        call    mf_alloc
50
        mov     [panel1_files], eax
51
        pop     eax
52
        call    mf_alloc
53
        mov     [panel2_files], eax
54
        test    eax, eax
55
        jz      exit
56
        cmp     [panel1_files], eax
57
        jz      exit
180 heavyiron 58
        mov     [panel1_sortmode], 0    ; sort by name
59
        mov     [panel2_sortmode], 0
60
        mov     [num_screens], 1
61
        mov     eax, 8
62
        call    mf_alloc
63
        mov     [screens], eax
64
        mov     ecx, panels_vtable
65
        mov     [eax], ecx
66
        mov     [active_screen_vtable], ecx
67
        call    draw_keybar
68
        call    draw_cmdbar
69
        mov     ebp, panel1_data
70
        call    read_folder
71
        call    draw_panel
72
        mov     ebp, panel2_data
73
        call    read_folder
74
        call    draw_panel
75
event:
76
        push    10
77
        pop     eax
78
        int     40h
79
        dec     eax
80
        jz      redraw
81
        dec     eax
82
        jz      key
83
; button - we have only one button, close
84
exit:
85
        or      eax, -1
86
        int     40h
87
redraw:
283 diamond 88
; query kbd state from OS
89
        mov     al, 66
90
        push    3
91
        pop     ebx
92
        int     0x40
93
        and     eax, 0x3F
94
        cmp     al, [ctrlstate]
95
        mov     [ctrlstate], al
96
        jz      @f
97
        call    draw_keybar
98
@@:
180 heavyiron 99
        mov     al, 9
100
        mov     ebx, procinfo
101
        or      ecx, -1
102
        int     40h
103
; test if rolled up
104
; height of rolled up window is [skinh]+3
105
        mov     eax, [ebx+46]
106
        sub     eax, [skinh]
107
        cmp     eax, 5
108
        ja      @f
109
        mov     al, 12
110
        push    1
111
        pop     ebx
112
        int     0x40
113
        xor     eax, eax
114
; ebx, ecx, edi are ignored by function 0 after first redraw
115
        mov     edx, 0x13000000
116
        int     0x40
117
        mov     al, 12
118
        inc     ebx
119
        int     0x40
120
        jmp     event
121
@@:
122
        xor     ecx, ecx
123
        mov     eax, [ebx+42]
283 diamond 124
        sub     eax, 5*2-1
180 heavyiron 125
        jae     @f
126
        xor     eax, eax
127
@@:
128
        cdq
129
        mov     esi, font_width
130
        div     esi
131
        cmp     eax, 54
132
        jae     @f
133
        mov     al, 54
134
        mov     ch, 1
135
@@:
136
        cmp     eax, 255
137
        jbe     @f
138
        mov     eax, 255
139
        mov     ch, 1
140
@@:
141
        cmp     eax, [cur_width]
142
        mov     [cur_width], eax
143
        setnz   cl
144
        or      cl, ch
145
        test    edx, edx
146
        setnz   ch
147
        mov     eax, [ebx+46]
148
        sub     eax, [skinh]
283 diamond 149
        sub     eax, 5-1
180 heavyiron 150
        jns     @f
151
        xor     eax, eax
152
@@:
153
        cdq
154
        mov     esi, font_height
155
        div     esi
156
        cmp     eax, 8
157
        jae     @f
158
        mov     al, 8
159
        mov     cl, 1
160
@@:
161
        cmp     eax, 255
162
        jbe     @f
163
        mov     eax, 255
164
        mov     cl, 1
165
@@:
166
        cmp     eax, [cur_height]
167
        mov     [cur_height], eax
283 diamond 168
        jnz     .resize
169
        test    cl, cl
170
        jnz     .resize
171
        test    edx, edx
172
        setnz   cl
180 heavyiron 173
        or      cl, ch
174
        jz      @f
283 diamond 175
        test    byte [ebx+70], 1
176
        jnz     @f
177
.resize:
180 heavyiron 178
        push    67
179
        pop     eax
180
        or      ebx, -1
181
        or      ecx, -1
182
        mov     edx, [cur_width]
183
        imul    edx, font_width
283 diamond 184
        add     edx, 5*2-1
180 heavyiron 185
        mov     esi, [cur_height]
186
        imul    esi, font_height
187
        add     esi, [skinh]
283 diamond 188
        add     esi, 5-1
180 heavyiron 189
        int     40h
283 diamond 190
.resize_draw:
191
        call    init_console
192
;        call    draw_window
180 heavyiron 193
        call    draw_keybar
194
        mov     ebp, [active_screen_data]
195
        mov     eax, [active_screen_vtable]
196
        call    dword [eax+screen_vtable.OnRedraw]
197
        jmp     event
198
@@:
199
        call    draw_window
200
        jmp     event
283 diamond 201
alt_f9:
202
        cmp     [saved_width], -1
203
        jz      @f
204
        mov     eax, [saved_width]
205
        mov     [cur_width], eax
206
        or      [saved_width], -1
207
        mov     eax, [saved_height]
208
        mov     [cur_height], eax
209
        or      [saved_height], -1
210
        jmp     redraw.resize
211
@@:
212
        push    48
213
        pop     eax
214
        push    5
215
        pop     ebx
216
        int     0x40
217
        push    eax
218
        sub     eax, [esp+2]
219
        inc     eax
220
        movzx   eax, ax
221
        sub     eax, 10
222
        xor     edx, edx
223
        mov     ecx, font_width
224
        div     ecx
225
        xchg    [cur_width], eax
226
        mov     [saved_width], eax
227
        mov     eax, ebx
228
        shr     ebx, 16
229
        sub     eax, ebx
230
        sub     eax, 5-1
231
        sub     eax, [skinh]
232
        xor     edx, edx
233
        mov     ecx, font_height
234
        div     ecx
235
        xchg    [cur_height], eax
236
        mov     [saved_height], eax
237
        mov     ecx, ebx
238
        pop     ebx
239
        shr     ebx, 16
240
        mov     edx, [cur_width]
241
        imul    edx, font_width
242
        add     edx, 5*2-1
243
        mov     esi, [cur_height]
244
        imul    esi, font_height
245
        add     esi, [skinh]
246
        add     esi, 4
247
        push    67
248
        pop     eax
249
        int     0x40
250
        jmp     redraw.resize_draw
180 heavyiron 251
key:
252
        mov     al, 2
253
        int     40h
254
        test    al, al
255
        jnz     event
256
        xchg    al, ah
257
        cmp     al, 0xE0
258
        jnz     @f
259
        mov     [bWasE0], 1
260
        jmp     event
261
@@:
262
        xchg    ah, [bWasE0]
263
        mov     ebp, [active_screen_data]
264
        mov     edx, [active_screen_vtable]
265
        cmp     al, 0x1D
266
        jz      .ctrl_down
267
        cmp     al, 0x9D
268
        jz      .ctrl_up
269
        cmp     al, 0x2A
270
        jz      .lshift_down
271
        cmp     al, 0xAA
272
        jz      .lshift_up
273
        cmp     al, 0x36
274
        jz      .rshift_down
275
        cmp     al, 0xB6
276
        jz      .rshift_up
277
        cmp     al, 0x38
278
        jz      .alt_down
279
        cmp     al, 0xB8
280
        jz      .alt_up
281
        call    [edx+screen_vtable.OnKey]
282
        jmp     event
283
.ctrl_down:
284
        test    ah, ah
285
        jnz     .rctrl_down
286
        or      [ctrlstate], 4
287
        jmp     .keybar
288
.rctrl_down:
289
        or      [ctrlstate], 8
290
        jmp     .keybar
291
.ctrl_up:
292
        test    ah, ah
293
        jnz     .rctrl_up
294
        and     [ctrlstate], not 4
295
        jmp     .keybar
296
.rctrl_up:
297
        and     [ctrlstate], not 8
298
.keybar:
299
        call    draw_keybar
300
        call    draw_image
301
@@:     jmp     event
302
.lshift_down:
303
; ignore E0 2A sequence
304
; e.g. arrow keys with NumLock on generate sequence E0 2A E0 xx / E0 xx+80 E0 AA
305
; where xx is scancode, so we can safely ignore E0 2A
306
        test    ah, ah
307
        jnz     @b
308
        or      [ctrlstate], 1
309
        jmp     .keybar
310
.lshift_up:
311
; ignore E0 AA sequence
312
        test    ah, ah
313
        jnz     @b
314
        and     [ctrlstate], not 1
315
        jmp     .keybar
316
.rshift_down:
317
        or      [ctrlstate], 2
318
        jmp     .keybar
319
.rshift_up:
320
        and     [ctrlstate], not 2
321
        jmp     .keybar
322
.alt_down:
323
        test    ah, ah
324
        jnz     .ralt_down
325
        or      [ctrlstate], 0x10
326
        jmp     .keybar
327
.ralt_down:
328
        or      [ctrlstate], 0x20
329
        jmp     .keybar
330
.alt_up:
331
        test    ah, ah
332
        jnz     .ralt_up
333
        and     [ctrlstate], not 0x10
334
        jmp     .keybar
335
.ralt_up:
336
        and     [ctrlstate], not 0x20
337
        jmp     .keybar
338
 
339
process_ctrl_keys:
340
        cmp     byte [esi], 0
341
        jz      .done
342
        push    ecx
343
        cmp     al, [esi]
344
        jz      .check
345
.cont:
346
        pop     ecx
347
        add     esi, 8
348
        jmp     process_ctrl_keys
349
.done:
350
        stc
351
        ret
352
.check:
353
        mov     cl, 0
354
        call    .check_ctrlkey
355
        jc      .cont
356
        mov     cl, 2
357
        call    .check_ctrlkey
358
        jc      .cont
359
        mov     cl, 4
360
        call    .check_ctrlkey
361
        jc      .cont
362
        pop     ecx
363
        call    dword [esi+4]
364
        clc
365
        ret
366
.check_ctrlkey:
367
        push    eax edx
368
        movzx   edx, [ctrlstate]
369
        shr     edx, cl
370
        add     cl, cl
371
        movzx   eax, word [esi+2]
372
        shr     eax, cl
373
        and     eax, 15
374
        cmp     al, ctrlkey_tests_num
375
        jae     .fail
376
        xchg    eax, edx
377
        and     al, 3
378
        call    [ctrlkey_tests + edx*4]
379
        cmp     al, 1
380
        pop     edx eax
381
        ret
382
.fail:
383
        stc
384
        pop     edx eax
385
        ret
386
 
387
ctrlkey_test0:
388
        test    al, al
389
        setz    al
390
        ret
391
ctrlkey_test1:
392
        test    al, al
393
        setnp   al
394
        ret
395
ctrlkey_test2:
396
        cmp     al, 3
397
        setz    al
398
        ret
399
ctrlkey_test3:
400
        cmp     al, 1
401
        setz    al
402
        ret
403
ctrlkey_test4:
404
        cmp     al, 2
405
        setz    al
406
        ret
407
 
408
; TODO: add "no memory" error handling
409
new_screen:
410
        call    mf_alloc
411
        test    eax, eax
412
        jnz     @f
413
        ret
414
@@:
415
        mov     ebp, eax
416
        mov     ebx, [num_screens]
417
        inc     ebx
418
        shl     ebx, 3
419
        mov     eax, [screens]
420
        call    mf_realloc
421
        test    eax, eax
422
        jnz     @f
423
        mov     eax, ebp
424
        call    mf_free
425
        xor     eax, eax
426
        ret
427
@@:
428
        mov     [screens], eax
429
        inc     [num_screens]
430
        mov     [eax+ebx-8], edx
431
        mov     [eax+ebx-4], ebp
432
        mov     eax, [num_screens]
433
        dec     eax
434
        mov     [active_screen], eax
435
        mov     [active_screen_vtable], edx
436
        mov     [active_screen_data], ebp
437
        jmp     draw_keybar
438
 
439
next_screen:
440
        mov     eax, [active_screen]
441
        inc     eax
442
        cmp     eax, [num_screens]
443
        jnz     @f
444
        xor     eax, eax
445
@@:     mov     [active_screen], eax
446
        jmp     change_screen
447
 
448
delete_active_screen:
449
        mov     edi, [screens]
450
        mov     eax, [active_screen]
451
        shl     eax, 3
452
        add     edi, eax
453
        push    dword [edi+4]
454
        lea     esi, [edi+8]
455
        mov     ecx, [num_screens]
456
        sub     ecx, [active_screen]
457
        dec     ecx
458
        add     ecx, ecx
459
        rep     movsd
460
        dec     [num_screens]
461
        mov     ebx, [num_screens]
462
        shl     ebx, 3
463
        mov     eax, [screens]
464
        call    mf_realloc
465
        pop     eax
466
        call    mf_free
467
        and     [active_screen], 0
468
 
469
change_screen:
470
        pusha
471
        mov     eax, [active_screen]
472
        mov     esi, [screens]
473
        mov     ebp, [esi+eax*8+4]
474
        mov     eax, [esi+eax*8]
475
        mov     [active_screen_vtable], eax
476
        mov     [active_screen_data], ebp
477
        call    draw_keybar
478
        call    [eax+screen_vtable.OnRedraw]
479
        popa
480
        ret
481
 
482
F12:
483
        mov     eax, [cur_width]
484
        add     eax, 8
485
        mov     esi, eax
486
        mul     [num_screens]
487
        call    mf_alloc
488
        test    eax, eax
489
        jnz     @f
490
        ret
491
@@:
492
        mov     ebx, eax
493
        mov     edi, eax
494
        xor     ecx, ecx
495
.next:
496
        xor     eax, eax
497
        stosd
498
        inc     ecx
499
        cmp     ecx, [num_screens]
500
        jz      @f
501
        lea     eax, [edi+esi-4]
502
        mov     dword [edi-4], eax
503
@@:
504
        xor     eax, eax
505
        stosd
506
        dec     ecx
507
        jz      @f
508
        lea     eax, [edi-8]
509
        sub     eax, esi
510
        mov     dword [edi-4], eax
511
@@:
512
        mov     al, '&'
513
        stosb
514
        cmp     ecx, 36
515
        jae     .noletter
516
        lea     eax, [ecx+'0']
517
        cmp     al, '9'
518
        jbe     @f
519
        add     al, 7
520
@@:
521
        stosb
522
        mov     al, '.'
523
        stosb
524
        jmp     .letter_done
525
.noletter:
526
        mov     al, ' '
527
        stosb
528
        stosb
529
.letter_done:
530
        mov     al, ' '
531
        stosb
532
        pushad
533
        mov     eax, [screens]
534
        mov     ebp, [eax+ecx*8+4]
535
        mov     eax, [eax+ecx*8]
536
        mov     ecx, [cur_width]
537
        sub     ecx, 12
538
        call    [eax + screen_vtable.getname]
539
        popad
540
        sub     edi, 4
541
        add     edi, [cur_width]
542
        inc     ecx
543
        cmp     ecx, [num_screens]
544
        jb      .next
545
        mov     eax, [active_screen]
546
        mul     esi
547
        add     eax, ebx
548
        push    1
549
        push    aScreens
550
        push    eax
551
        call    menu
552
        cmp     eax, -1
553
        jz      @f
554
        sub     eax, ebx
555
        div     esi
556
        mov     [active_screen], eax
557
@@:
558
        mov     eax, ebx
559
        call    mf_free
560
        jmp     change_screen
561
 
562
panels_OnKey:
563
        mov     ebp, [active_panel]
564
        mov     ecx, [ebp + panel1_index - panel1_data]
565
        mov     edx, [ebp + panel1_start - panel1_data]
566
        mov     ebx, [ebp + panel1_colst - panel1_data]
567
        add     ebx, edx
568
        mov     esi, panels_ctrlkeys
569
        jmp     process_ctrl_keys
570
.ret:
571
        ret
572
.up:
573
        jecxz   .ret
574
        dec     ecx
575
        mov     [ebp + panel1_index - panel1_data], ecx
576
        cmp     ecx, edx
577
        jae     .done_redraw
578
        mov     [ebp + panel1_start - panel1_data], ecx
579
.done_redraw:
580
;        call    draw_panel
581
;        ret
582
        jmp     draw_panel
583
.down:
584
        inc     ecx
585
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
586
        jae     .ret
587
        mov     [ebp + panel1_index - panel1_data], ecx
588
        cmp     ecx, ebx
589
        jb      .done_redraw
590
        sub     ecx, [ebp + panel1_colst - panel1_data]
591
        inc     ecx
592
        mov     [ebp + panel1_start - panel1_data], ecx
593
        jmp     .done_redraw
594
.left:
595
        jecxz   .ret
596
        sub     ecx, [ebp + panel1_colsz - panel1_data]
597
        jae     @f
598
        xor     ecx, ecx
599
@@:
600
        mov     [ebp + panel1_index - panel1_data], ecx
601
        cmp     ecx, edx
602
        jae     .done_redraw
603
        sub     edx, [ebp + panel1_colsz - panel1_data]
604
        jae     @f
605
        xor     edx, edx
606
@@:
607
        mov     [ebp + panel1_start - panel1_data], edx
608
        jmp     .done_redraw
609
.right:
610
        add     ecx, [ebp + panel1_colsz - panel1_data]
611
        cmp     ecx, [ebp + panel1_numfiles - panel1_data]
612
        jb      @f
613
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
614
        dec     ecx
615
@@:
616
        mov     [ebp + panel1_index - panel1_data], ecx
617
        cmp     ecx, ebx
618
        jb      .done_redraw
619
        add     ebx, [ebp + panel1_colsz - panel1_data]
620
        cmp     ebx, [ebp + panel1_numfiles - panel1_data]
621
        jbe     @f
622
        mov     ebx, [ebp + panel1_numfiles - panel1_data]
623
@@:
624
        sub     ebx, [ebp + panel1_colst - panel1_data]
625
        jae     @f
626
        xor     ebx, ebx
627
@@:
628
        mov     [ebp + panel1_start - panel1_data], ebx
629
        jmp     .done_redraw
630
.tab:
631
        xor     [active_panel], panel1_data xor panel2_data
632
        call    draw_cmdbar
633
        call    draw_panel
634
        mov     ebp, [active_panel]
635
        jmp     .done_redraw
636
.home:
637
        and     [ebp + panel1_start - panel1_data], 0
638
        and     [ebp + panel1_index - panel1_data], 0
639
        jmp     .done_redraw
640
.end:
641
        mov     eax, [ebp + panel1_numfiles - panel1_data]
642
        dec     eax
643
        mov     [ebp + panel1_index - panel1_data], eax
644
        inc     eax
645
        sub     eax, [ebp + panel1_colst - panel1_data]
646
        jae     @f
647
        xor     eax, eax
648
@@:
649
        mov     [ebp + panel1_start - panel1_data], eax
650
        jmp     .done_redraw
651
.enter:
183 diamond 652
        call    get_curfile_folder_entry
180 heavyiron 653
        test    byte [ecx], 10h
654
        jnz     .enter_folder
283 diamond 655
        call    find_extension
656
        jc      .run_app
657
        jnz     .run_app
180 heavyiron 658
.run_association:
283 diamond 659
        mov     eax, [edi+4]
660
.run_association2:
180 heavyiron 661
        mov     [execparams], execdata
662
        mov     [execptr], eax
663
        jmp     .dorun
664
.run_app:
665
        mov     [execptr], execdata
666
        and     [execparams], 0
667
.dorun:
668
        lea     esi, [ebp + panel1_dir - panel1_data]
669
        mov     edi, execdata
670
; TODO: add overflow check
671
@@:
672
        lodsb
673
        test    al, al
674
        jz      @f
675
        stosb
676
        jmp     @b
677
@@:
678
        lea     esi, [ecx+40]
679
        mov     al, '/'
680
        stosb
681
@@:
682
        lodsb
683
        stosb
684
        test    al, al
685
        jnz     @b
283 diamond 686
; for fasm call - special handling, because
687
; 1) fasm command line convention is different : fasm infile,outfile[,path] rather than tinypad infile
688
; 2) fasm will probably create new file in directory, so we want to reload panel data
689
        xor     edx, edx
690
        cmp     [execparams], edx
691
        jz      .nofasm
692
        cmp     [execptr], fasm
693
        jnz     .nofasm
694
; TODO: add buffer/cmdline overflow check
695
        mov     esi, execdata
696
@@:
697
        lodsb
698
        stosb
699
        test    al, al
700
        jnz     @b
701
        mov     byte [esi-1], ','
702
        inc     edx
703
; output file: no extension if input file has extension, '.bin' otherwise
704
        push    edi
705
@@:
706
        dec     edi
707
        cmp     byte [edi], '.'
708
        jz      .ptfound
709
        cmp     byte [edi], '/'
710
        jnz     @b
711
        pop     edi
712
        mov     dword [edi-1], '.bin'
713
        mov     byte [edi+3], 0
714
        jmp     .nofasm
715
.ptfound:
716
        mov     byte [edi], 0
717
        pop     edi
718
.nofasm:
180 heavyiron 719
        push    70
720
        pop     eax
721
        mov     ebx, execinfo
722
        int     40h
283 diamond 723
        test    edx, edx
724
        jz      @f
725
        push    5
726
        pop     eax
727
        push    20
728
        pop     ebx
729
        int     0x40
730
        jmp     .ctrl_r
731
@@:
180 heavyiron 732
        ret
733
.enter_folder:
734
        lea     esi, [ecx+40]
735
        cmp     word [esi], '..'
736
        jnz     @f
737
        cmp     byte [esi+2], 0
738
        jz      .dotdot
739
@@:
740
        lea     edi, [ebp + panel1_dir - panel1_data]
741
        mov     al, 0
742
        or      ecx, -1
743
        repnz   scasb
744
        dec     edi
745
        mov     al, '/'
746
        cmp     [edi-1], al
747
        jz      @f
748
        stosb
749
@@:
750
; TODO: add buffer overflow check
751
@@:
752
        lodsb
753
        stosb
754
        test    al, al
755
        jnz     @b
756
.reread:
757
        call    read_folder
758
.done_cmdbar:
759
        call    draw_cmdbar
760
        jmp     .done_redraw
761
.dotdot:
762
        lea     edi, [ebp + panel1_dir - panel1_data]
763
        mov     al, 0
764
        or      ecx, -1
765
        repnz   scasb
766
        dec     edi
767
        mov     al, '/'
768
        std
769
        repnz   scasb
770
        cld
771
        inc     edi
772
        mov     byte [edi], 0
773
        inc     edi
774
        push    edi
775
        call    read_folder
776
        pop     edi
777
        mov     edx, [ebp + panel1_files - panel1_data]
778
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
779
.scanloop:
780
        mov     esi, [edx]
781
        mov     eax, [ebp + panel1_nfa - panel1_data]
782
        lea     esi, [esi+eax*4+32+40]
783
        add     esi, [ebp + panel1_files - panel1_data]
784
        push    esi edi
785
@@:
786
        lodsb
787
        call    match_symbol
788
        jnz     @f
789
        inc     edi
790
        test    al, al
791
        jnz     @b
792
@@:
793
        pop     edi esi
794
        jz      .scanfound
795
        add     edx, 4
796
        loop    .scanloop
797
        jmp     .scandone
798
.scanfound:
799
        sub     edx, [ebp + panel1_files - panel1_data]
800
        shr     edx, 2
801
        mov     [ebp + panel1_index - panel1_data], edx
802
        sub     edx, [ebp + panel1_colst - panel1_data]
803
        jb      .scandone
804
        inc     edx
805
        mov     [ebp + panel1_start - panel1_data], edx
806
.scandone:
807
        jmp     .done_cmdbar
808
.ctrl_f39:
809
        sub     al, 0x3D
810
        add     al, al
811
        mov     ah, [ebp + panel1_sortmode - panel1_data]
812
        and     ah, 0xFE
813
        cmp     al, ah
814
        jnz     @f
815
        and     [ebp + panel1_sortmode - panel1_data], 1
816
        or      al, [ebp + panel1_sortmode - panel1_data]
817
        xor     al, 1
818
@@:
819
        mov     [ebp + panel1_sortmode - panel1_data], al
820
        mov     eax, [ebp + panel1_index - panel1_data]
821
        mov     ecx, [ebp + panel1_files - panel1_data]
822
        push    dword [ecx+eax*4]
823
        push    ecx
824
        call    sort_files
825
        pop     edi
826
        pop     eax
827
        or      ecx, -1
828
        repnz   scasd
829
        not     ecx
830
        dec     ecx
831
        mov     [ebp + panel1_index - panel1_data], ecx
832
        sub     ecx, [ebp + panel1_start - panel1_data]
833
        jb      .less_start
834
        sub     ecx, [ebp + panel1_colst - panel1_data]
835
        jae     .gr_end
836
@@:     jmp     .done_redraw
837
.less_start:
838
        add     [ebp + panel1_start - panel1_data], ecx
839
        jmp     @b
840
.gr_end:
841
        inc     ecx
842
        add     [ebp + panel1_start - panel1_data], ecx
843
        jmp     @b
844
.alt_f12:
845
        mov     ebp, panel1_data
846
        cmp     al, 0x3B
847
        jz      @f
848
        mov     ebp, panel2_data
849
@@:
850
; get drives list
851
        mov     ebx, dirinfo
852
        mov     [ebx+dirinfo.size-dirinfo], 1
853
        mov     [ebx+dirinfo.dirdata-dirinfo], driveinfo
854
        mov     [ebx+dirinfo.name-dirinfo], tmpname
855
        mov     byte [tmpname], '/'
856
        xor     ecx, ecx
857
.drive_loop_e:
858
        mov     byte [tmpname+1], 0
859
        push    70
860
        pop     eax
861
        int     40h
862
        mov     ebx, dirinfo
863
        test    eax, eax
864
        jnz     .drive_loop_e_done
865
        mov     esi, driveinfo+32+40
866
        mov     edi, tmpname+1
867
@@:
868
        lodsb
869
        stosb
870
        test    al, al
871
        jnz     @b
872
        push    [ebx+dirinfo.first-dirinfo]
873
        and     [ebx+dirinfo.first-dirinfo], 0
874
.drive_loop_i:
875
        push    70
876
        pop     eax
877
        int     40h
878
        mov     ebx, dirinfo
879
        test    eax, eax
880
        jnz     .drive_loop_i_done
881
        mov     eax, 32+8
882
        call    mf_alloc
883
        test    eax, eax
884
        jz      .drive_loop_i_done
885
        jecxz   @f
886
        mov     [ecx], eax
887
@@:
888
        and     dword [eax], 0
889
        mov     [eax+4], ecx
890
        mov     ecx, eax
891
        lea     edi, [eax+8]
892
        mov     esi, tmpname
893
@@:
894
        lodsb
895
        test    al, al
896
        jz      @f
897
        stosb
898
        jmp     @b
899
@@:
900
        mov     esi, driveinfo+32+40
901
        mov     al, '/'
902
        stosb
903
@@:
904
        lodsb
905
        stosb
906
        test    al, al
907
        jnz     @b
908
        inc     [ebx+dirinfo.first-dirinfo]
909
        jmp     .drive_loop_i
910
.drive_loop_i_done:
911
        pop     [ebx+dirinfo.first-dirinfo]
912
        inc     [ebx+dirinfo.first-dirinfo]
913
        jmp     .drive_loop_e
914
.drive_loop_e_done:
915
        and     [ebx+dirinfo.first-dirinfo], 0
916
        lea     edi, [ebp + panel1_dir - panel1_data]
917
.find_cur_drive_loop:
918
        push    edi
919
        lea     esi, [ecx+8]
920
@@:
921
        lodsb
922
        test    al, al
923
        jz      .cur_drive_found
924
        call    match_symbol
925
        jnz     @f
926
        inc     edi
927
        jmp     @b
928
@@:
929
        cmp     dword [ecx+4], 0
930
        jz      @f
931
        pop     edi
932
        mov     ecx, [ecx+4]
933
        jmp     .find_cur_drive_loop
934
@@:
935
.cur_drive_found:
936
        pop     edi
937
        push    1
938
        push    aDrive
939
        push    ecx
940
        mov     eax, [ebp + panel1_height - panel1_data]
941
        sub     eax, 2
942
        jae     @f
943
        add     eax, 2
944
@@:
945
        push    eax
946
        push    [ebp + panel1_width - panel1_data]
947
        push    [ebp + panel1_top - panel1_data]
948
        push    [ebp + panel1_left - panel1_data]
949
        call    menu_centered_in
950
        cmp     eax, -1
951
        jz      .ret2
952
        lea     esi, [eax+8]
953
        lea     edi, [ebp + panel1_dir - panel1_data]
954
@@:
955
        lodsb
956
        stosb
957
        test    al, al
958
        jnz     @b
959
@@:
960
        cmp     dword [ecx+4], 0
961
        jz      @f
962
        mov     ecx, [ecx+4]
963
        jmp     @b
964
@@:
965
        mov     eax, ecx
966
        mov     ecx, [ecx]
967
        call    mf_free
968
        test    ecx, ecx
969
        jnz     @b
970
        call    read_folder
971
        jmp     .done_redraw
283 diamond 972
.shift_f5:
973
        call    get_curfile_folder_entry
974
        lea     esi, [ecx+40]
975
        mov     edi, CopyDestEditBuf
976
        mov     eax, CopyDestEditBuf.length
977
        stosd
978
        scasd
979
        xor     eax, eax
980
        stosd
981
        mov     edx, edi
982
@@:
983
        lodsb
984
        test    al, al
985
        jz      .f5_common
986
        stosb
987
        jmp     @b
988
.f5:
989
        mov     edi, CopyDestEditBuf
990
        mov     eax, CopyDestEditBuf.length
991
        stosd
992
        scasd
993
        xor     eax, eax
994
        stosd
995
        mov     edx, edi
996
        mov     esi, ebp
997
        xor     esi, panel1_data xor panel2_data
998
        add     esi, panel1_dir - panel1_data
999
@@:
1000
        lodsb
1001
        test    al, al
1002
        jz      @f
1003
        stosb
1004
        jmp     @b
1005
@@:
1006
        mov     al, '/'
1007
        stosb
1008
.f5_common:
1009
        mov     byte [edi], 0
1010
        sub     edi, edx
1011
        mov     [edx-8], edi
1012
        mov     edi, CopySourceTextBuf
1013
        mov     esi, aCopy1
1014
@@:
1015
        lodsb
1016
        test    al, al
1017
        jz      @f
1018
        stosb
1019
        jmp     @b
1020
@@:
1021
        call    get_curfile_folder_entry
1022
        lea     esi, [ecx+40]
1023
        lea     eax, [esi+1]
1024
@@:
1025
        inc     esi
1026
        cmp     byte [esi-1], 0
1027
        jnz     @b
1028
        sub     esi, eax
1029
        xchg    eax, esi
1030
        dec     esi
1031
        mov     edx, [cur_width]
1032
        sub     edx, 50
1033
        sub     eax, edx
1034
        jbe     @f
1035
        add     esi, eax
1036
        mov     al, '.'
1037
        stosb
1038
        stosb
1039
        stosb
1040
@@:
1041
        lodsb
1042
        test    al, al
1043
        jz      @f
1044
        stosb
1045
        jmp     @b
1046
@@:
1047
        mov     esi, aCopy2
1048
@@:
1049
        lodsb
1050
        stosb
1051
        test    al, al
1052
        jnz     @b
1053
        mov     ebx, copy_dlgdata
1054
        mov     eax, [cur_width]
1055
        sub     eax, 12
1056
        mov     [ebx + dlgtemplate.width], eax
1057
        dec     eax
1058
        dec     eax
1059
        mov     [ebx - copy_dlgdata + copy_dlgdata.width2], eax
1060
        mov     [ebx - copy_dlgdata + copy_dlgdata.width3], eax
1061
        shr     eax, 1
1062
        dec     eax
1063
        dec     eax
1064
        mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x2], eax
1065
        sub     eax, aCopyLength-1
1066
        mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x1], eax
1067
        add     eax, aCopyLength+3
1068
        mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x1], eax
1069
        add     eax, aCancelBLength - 1
1070
        mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x2], eax
1071
        mov     al, [dialog_border_color]
1072
        mov     [ebx + dlgtemplate.border_color], al
1073
        mov     al, [dialog_header_color]
1074
        mov     [ebx + dlgtemplate.header_color], al
1075
        mov     al, [dialog_main_color]
1076
        mov     [ebx + dlgtemplate.main_color], al
1077
        mov     byte [ebx - copy_dlgdata + copy_dlgdata.flags0], 0xC
1078
        and     byte [ebx - copy_dlgdata + copy_dlgdata.flags1], not 4
1079
        and     byte [ebx - copy_dlgdata + copy_dlgdata.flags2], not 4
1080
        push    ebx
1081
        call    DialogBox
1082
        cmp     eax, copy_dlgdata.copy_btn
1083
        jnz     .ret2
1084
; Копируем
1085
        mov     esi, CopyDestEditBuf+12
1086
        mov     edi, esi
1087
        xor     eax, eax
1088
        or      ecx, -1
1089
        repnz   scasb
1090
        dec     edi
1091
        dec     edi
1092
        cmp     edi, esi
1093
        jb      .ret2
1094
        cmp     byte [edi], '/'
1095
        jnz     @f
1096
; Наличие/отсутствие заканчивающего слэша важно только для копирования папок
1097
        cmp     edi, esi
1098
        jz      @f
1099
        mov     byte [edi], 0
1100
        dec     edi
1101
@@:
1102
; Если путь не начинается со слэша, считаем его относительно текущей папки
1103
        cmp     byte [esi], '/'
1104
        jz      .copy_absolute_path
1105
        push    esi
1106
        push    edi
1107
        lea     edi, [ebp + panel1_dir - panel1_data]
1108
        or      ecx, -1
1109
        xor     eax, eax
1110
        repnz   scasb
1111
        not     ecx
1112
        pop     edi
1113
        lea     edx, [edi+2]
1114
        sub     edx, esi
1115
        lea     edi, [edi+ecx+1]
1116
        xchg    ecx, edx
1117
        std
1118
        lea     esi, [esi+ecx-1]
1119
        rep     movsb
1120
        cld
1121
        pop     edi
1122
        lea     esi, [ebp + panel1_dir - panel1_data]
1123
        push    edi
1124
        mov     ecx, edx
1125
        rep     movsb
1126
        mov     byte [edi-1], '/'
1127
        pop     esi
1128
.copy_absolute_path:
1129
; Получаем атрибуты назначения
1130
        mov     cl, 0x10
1131
        xor     eax, eax
1132
        mov     edi, esi
1133
.countslashloop:
1134
        cmp     byte [edi], '/'
1135
        jnz     @f
1136
        inc     eax
1137
@@:
1138
        inc     edi
1139
        cmp     byte [edi], 0
1140
        jnz     .countslashloop
1141
        cmp     eax, 2
1142
        jbe     @f
1143
        mov     ebx, attrinfo
1144
        mov     [attrinfo.attr], 0
1145
        mov     [ebx + attrinfo.name - attrinfo], esi
1146
        push    70
1147
        pop     eax
1148
        int     0x40
1149
        mov     cl, byte [attrinfo.attr]
1150
@@:
1151
        test    cl, 0x10
1152
        jz      .copyfile
1153
; Нам подсунули каталог назначения, дописываем имя файла
1154
        mov     al, '/'
1155
        stosb
1156
        push    esi
1157
        call    get_curfile_folder_entry
1158
        lea     esi, [ecx+40]
1159
@@:
1160
        lodsb
1161
        stosb
1162
        test    al, al
1163
        jnz     @b
1164
        pop     esi
1165
.copyfile:
1166
; Имя исходного файла
1167
        push    esi
1168
        lea     esi, [ebp+panel1_dir-panel1_data]
1169
        mov     edi, saved_file_name
1170
        push    edi
1171
@@:
1172
        lodsb
1173
        test    al, al
1174
        jz      @f
1175
        stosb
1176
        jmp     @b
1177
@@:
1178
        mov     al, '/'
1179
        stosb
1180
        call    get_curfile_folder_entry
1181
        lea     esi, [ecx+40]
1182
@@:
1183
        lodsb
1184
        stosb
1185
        test    al, al
1186
        jnz     @b
1187
        pop     esi
1188
        pop     edi
1189
; Нельзя скопировать файл поверх самого себя!
1190
        push    esi edi
1191
        call    strcmpi
1192
        pop     edi esi
1193
        jz      .ret2
1194
; Собственно, копируем
1195
; esi->source name, edi->destination name
1196
        mov     [writeinfo.code], 2
1197
        mov     [writeinfo.name], edi
1198
        and     dword [writeinfo.first], 0
1199
        and     dword [writeinfo.first+4], 0
1200
        mov     [writeinfo.data], copy_buffer
1201
        mov     ebx, readinfo
1202
        and     dword [ebx+readinfo.first-readinfo], 0
1203
        and     dword [ebx+readinfo.first+4-readinfo], 0
1204
        mov     [ebx+readinfo.size-readinfo], copy_buffer_size
1205
        mov     [ebx+readinfo.data-readinfo], copy_buffer
1206
        mov     [ebx+readinfo.name-readinfo], esi
1207
.copyloop:
1208
        mov     ebx, readinfo
1209
        push    70
1210
        pop     eax
1211
        int     0x40
1212
        cmp     ebx, -1
1213
        jz      .copydone
1214
        test    ebx, ebx
1215
        jz      .copydone
1216
        add     dword [readinfo.first], ebx
1217
        adc     dword [readinfo.first+4], 0
1218
        mov     [writeinfo.size], ebx
1219
        mov     ebx, writeinfo
1220
        push    70
1221
        pop     eax
1222
        int     0x40
1223
        mov     ecx, [writeinfo.size]
1224
        add     dword [writeinfo.first], ecx
1225
        adc     dword [writeinfo.first+4], 0
1226
        mov     [writeinfo.code], 3
1227
        cmp     ecx, copy_buffer_size
1228
        jz      .copyloop
1229
.copydone:
1230
        push    ebp
1231
        call    .ctrl_r
1232
        pop     ebp
1233
        xor     ebp, panel1_data xor panel2_data
1234
        jmp     .ctrl_r
1235
 
180 heavyiron 1236
.f3:
1237
        call    view_file
1238
.ret2:
1239
        ret
1240
.f8:
183 diamond 1241
        call    get_curfile_folder_entry
1242
        cmp     [bConfirmDelete], 0
1243
        jz      .f8_allowed
1244
        mov     ebx, f8_confirm_dlgdata
1245
        mov     esi, aConfirmDeleteText
1246
        mov     edi, aConfirmDeleteTextBuf
1247
@@:
1248
        lodsb
1249
        stosb
1250
        test    al, al
1251
        jnz     @b
1252
        dec     edi
1253
        mov     esi, aDeleteFolder
1254
        test    byte [ecx], 10h
1255
        jnz     @f
1256
        mov     esi, aDeleteFile
1257
@@:
1258
        lodsb
1259
        stosb
1260
        test    al, al
1261
        jnz     @b
1262
        lea     esi, [ecx+40]
1263
        mov     [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.name], esi
1264
        or      eax, -1
1265
@@:
1266
        inc     eax
1267
        cmp     byte [eax+esi], 0
1268
        jnz     @b
1269
        sub     edi, aConfirmDeleteTextBuf+1
1270
        cmp     eax, edi
1271
        jae     @f
1272
        mov     eax, edi
1273
@@:
1274
        inc     eax
1275
        inc     eax
1276
        mov     edx, [cur_width]
1277
        sub     edx, 8
1278
        cmp     eax, edx
1279
        jbe     @f
1280
        mov     eax, edx
1281
@@:
1282
        mov     [ebx + dlgtemplate.width], eax
1283
        dec     eax
1284
        dec     eax
1285
        mov     [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.width2], eax
1286
        mov     [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.width3], eax
1287
        shr     eax, 1
1288
        mov     [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.del_x2], eax
1289
        sub     eax, aDeleteLength-1
1290
        mov     [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.del_x1], eax
1291
        add     eax, aDeleteLength
1292
        mov     [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.cnl_x1], eax
1293
        add     eax, aCancelLength - 1
1294
        mov     [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.cnl_x2], eax
1295
        mov     al, [dialog_border_color]
1296
        mov     [ebx + dlgtemplate.border_color], al
1297
        mov     al, [dialog_header_color]
1298
        mov     [ebx + dlgtemplate.header_color], al
1299
        mov     al, [dialog_main_color]
1300
        mov     [ebx + dlgtemplate.main_color], al
1301
        or      byte [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.flags1], 4
1302
        and     byte [ebx - f8_confirm_dlgdata + f8_confirm_dlgdata.flags2], not 4
1303
        push    ebx
1304
        call    DialogBox
1305
        cmp     eax, f8_confirm_dlgdata.del_btn
1306
        jnz     .ret2
1307
.f8_allowed:
180 heavyiron 1308
        lea     esi, [ebp + panel1_dir - panel1_data]
1309
        mov     edi, execdata
1310
@@:
1311
        lodsb
1312
        test    al, al
1313
        jz      @f
1314
        stosb
1315
        jmp     @b
1316
@@:
1317
        lea     esi, [ecx+40]
1318
        mov     al, '/'
1319
        stosb
1320
@@:
1321
        lodsb
1322
        stosb
1323
        test    al, al
1324
        jnz     @b
1325
        push    70
1326
        pop     eax
1327
        mov     ebx, delinfo
1328
        int     0x40
1329
.ctrl_r:
1330
; Rescan panel
1331
;       call    read_folder
1332
;       jmp     .done_redraw
1333
        mov     eax, [ebp + panel1_index - panel1_data]
1334
        push    eax
183 diamond 1335
        call    get_curfile_name
283 diamond 1336
        mov     esi, ecx
180 heavyiron 1337
        mov     edi, saved_file_name
1338
@@:
1339
        lodsb
1340
        stosb
1341
        test    al, al
1342
        jnz     @b
1343
        push    [ebp + panel1_start - panel1_data]
1344
        call    read_folder
1345
        pop     [ebp + panel1_start - panel1_data]
1346
        pop     [ebp + panel1_index - panel1_data]
1347
        or      eax, -1
1348
@@:
1349
        inc     eax
1350
        cmp     eax, [ebp + panel1_numfiles - panel1_data]
1351
        jae     .ctrl_r.notfound
1352
        mov     esi, [ebp + panel1_nfa - panel1_data]
1353
        mov     ecx, [ebp + panel1_files - panel1_data]
1354
        lea     esi, [ecx+esi*4+32+40]
1355
        add     esi, [ecx+eax*4]
1356
        mov     edi, saved_file_name
1357
        call    strcmpi
1358
        jnz     @b
1359
.ctrl_r.found:
1360
        mov     [ebp + panel1_index - panel1_data], eax
1361
.ctrl_r.notfound:
1362
        mov     eax, [ebp + panel1_numfiles - panel1_data]
1363
        dec     eax
1364
        cmp     [ebp + panel1_index - panel1_data], eax
1365
        jbe     @f
1366
        mov     [ebp + panel1_index - panel1_data], eax
1367
@@:
1368
        mov     eax, [ebp + panel1_index - panel1_data]
1369
        cmp     [ebp + panel1_start - panel1_data], eax
1370
        jbe     @f
1371
        mov     [ebp + panel1_start - panel1_data], eax
1372
@@:
1373
        inc     eax
1374
        sub     eax, [ebp + panel1_colst - panel1_data]
1375
        jae     @f
1376
        xor     eax, eax
1377
@@:
1378
        cmp     [ebp + panel1_start - panel1_data], eax
1379
        jae     @f
1380
        mov     [ebp + panel1_start - panel1_data], eax
1381
@@:
1382
        mov     eax, [ebp + panel1_numfiles - panel1_data]
1383
        sub     eax, [ebp + panel1_colst - panel1_data]
1384
        jbe     @f
1385
        cmp     [ebp + panel1_start - panel1_data], eax
1386
        jbe     @f
1387
        mov     [ebp + panel1_start - panel1_data], eax
1388
@@:
1389
        jmp     .done_redraw
283 diamond 1390
.menu:
1391
; display context menu
1392
; ignore folders
1393
        call    get_curfile_folder_entry
1394
        test    byte [ecx], 10h
1395
        jz      @f
1396
.menuret:
1397
        ret
1398
@@:
1399
        call    find_extension
1400
        jc      .menuret
1401
        jnz     .menuret
1402
; known extension
1403
        mov     ebx, [edi+8]
1404
        test    ebx, ebx
1405
        jz      .menuret
1406
        mov     ecx, esi
1407
@@:
1408
        inc     ecx
1409
        cmp     byte [ecx-1], 0
1410
        jnz     @b
1411
        sub     ecx, esi        ; ecx = длина имени файла+1 = длина заголовка+1
1412
        cmp     ecx, 15
1413
        jb      @f
1414
        mov     cl, 15
1415
@@:
1416
        xor     edx, edx
1417
.menucreateloop:
1418
        mov     eax, [ebx]
1419
        test    eax, eax
1420
        jz      .menucreated
1421
@@:
1422
        inc     eax
1423
        cmp     byte [eax-1], 0
1424
        jnz     @b
1425
        sub     eax, [ebx]
1426
        cmp     eax, ecx
1427
        ja      @f
1428
        mov     eax, ecx
1429
@@:
1430
        add     eax, 12
1431
        call    mf_alloc
1432
        test    eax, eax
1433
        jz      .menucreated
1434
        add     eax, 4
1435
        test    edx, edx
1436
        jz      @f
1437
        mov     [edx], eax
1438
@@:
1439
        mov     [eax+4], edx
1440
        mov     edx, eax
1441
        push    esi
1442
        mov     esi, [ebx+4]
1443
        mov     [eax-4], esi
1444
        mov     esi, [ebx]
1445
        lea     edi, [eax+8]
1446
@@:
1447
        lodsb
1448
        stosb
1449
        test    al, al
1450
        jnz     @b
1451
        sub     esi, [ebx]
1452
        sub     esi, ecx
1453
        jae     .menunoadd
1454
        neg     esi
1455
@@:
1456
        mov     byte [edi-1], ' '
1457
        stosb
1458
        dec     esi
1459
        jnz     @b
1460
.menunoadd:
1461
        pop     esi
1462
        add     ebx, 8
1463
        jmp     .menucreateloop
1464
.menucreated:
1465
        test    edx, edx
1466
        jz      .menuret
1467
        and     dword [edx], 0
1468
@@:
1469
        cmp     dword [edx+4], 0
1470
        jz      @f
1471
        mov     edx, [edx+4]
1472
        jmp     @b
1473
@@:
1474
        push    1
1475
        push    esi
1476
        push    edx
1477
        call    menu
1478
        cmp     eax, -1
1479
        jz      .menuret
1480
        push    dword [eax-4]
1481
@@:
1482
        test    edx, edx
1483
        jz      @f
1484
        lea     eax, [edx-4]
1485
        mov     edx, [edx]
1486
        call    mf_free
1487
        jmp     @b
1488
@@:
1489
        pop     eax
1490
        call    get_curfile_folder_entry
1491
        jmp     .run_association2
180 heavyiron 1492
 
1493
panels_OnRedraw:
1494
        call    draw_cmdbar
1495
        mov     ebp, panel1_data
1496
        call    draw_panel
1497
        mov     ebp, panel2_data
1498
        call    draw_panel
1499
        ret
1500
 
1501
init_console:
283 diamond 1502
        mov     eax, [console_data_ptr]
1503
        call    mf_free
1504
        mov     eax, [cur_width]
1505
        mul     [cur_height]
1506
        mov     ecx, eax
1507
        add     eax, eax
1508
        add     eax, eax
1509
        call    mf_alloc
1510
        test    eax, eax
1511
        jz      exit
1512
        mov     [console_data_ptr], eax
1513
        mov     edi, eax
180 heavyiron 1514
        mov     ax, 0720h
1515
        rep     stosw
283 diamond 1516
        mov     [panel1_left], ecx
1517
        mov     [panel1_top], ecx
1518
        mov     [panel2_top], ecx
180 heavyiron 1519
        mov     eax, [cur_width]
1520
        inc     eax
1521
        shr     eax, 1
1522
        mov     [panel1_width], eax
1523
        mov     [panel2_left], eax
1524
        sub     eax, [cur_width]
1525
        neg     eax
1526
        mov     [panel2_width], eax
1527
        mov     eax, [cur_height]
1528
        dec     eax
1529
        dec     eax
1530
        mov     [panel1_height], eax
1531
        mov     [panel2_height], eax
1532
        ret
1533
 
183 diamond 1534
get_curfile_folder_entry:
1535
        push    eax
1536
        mov     ecx, [ebp + panel1_index - panel1_data]
1537
        mov     eax, [ebp + panel1_files - panel1_data]
1538
        mov     ecx, [eax+ecx*4]
1539
        mov     eax, [ebp + panel1_nfa - panel1_data]
1540
        lea     ecx, [ecx+eax*4+32]
1541
        add     ecx, [ebp + panel1_files - panel1_data]
1542
        pop     eax
1543
        ret
1544
get_curfile_name:
1545
        call    get_curfile_folder_entry
1546
        add     ecx, 40
1547
        ret
1548
 
180 heavyiron 1549
panels_getname:
1550
if lang eq ru
1551
        mov     eax, 'Пане'
1552
        stosd
1553
        mov     eax, 'ли  '
1554
        stosd
1555
        mov     eax, '    '
1556
        stosd
1557
        stosb
1558
else
1559
        mov     eax, 'Pane'
1560
        stosd
1561
        mov     eax, 'ls  '
1562
        stosd
1563
        mov     eax, '    '
1564
        stosd
1565
        stosb
1566
end if
1567
        sub     ecx, 13
1568
        mov     ebp, [active_panel]
1569
        lea     esi, [ebp + panel1_dir - panel1_data]
1570
        push    3
1571
        pop     edx
1572
@@:
1573
        lodsb
1574
        stosb
1575
        dec     ecx
1576
        test    al, al
1577
        jz      @f
1578
        cmp     al, '/'
1579
        jnz     @b
1580
        dec     edx
1581
        jnz     @b
1582
@@:
1583
        test    al, al
1584
        jnz     @f
1585
        dec     esi
1586
        dec     edi
1587
@@:
1588
        push    esi
1589
@@:
1590
        lodsb
1591
        test    al, al
1592
        jnz     @b
1593
        dec     esi
1594
        mov     ebx, esi
1595
        sub     ebx, [esp]
1596
        dec     esi
1597
        push    esi
1598
        mov     edx, [ebp + panel1_files - panel1_data]
1599
        mov     esi, [ebp + panel1_index - panel1_data]
1600
        mov     esi, [edx+esi*4]
1601
        add     esi, edx
1602
        mov     edx, [ebp + panel1_nfa - panel1_data]
1603
        lea     esi, [esi+edx*4+32+40]
1604
        push    esi
1605
@@:
1606
        lodsb
1607
        test    al, al
1608
        jnz     @b
1609
        add     ebx, esi
1610
        sub     ebx, [esp]
1611
        dec     esi
1612
        cmp     ebx, ecx
1613
        jbe     @f
1614
        mov     al, '.'
1615
        stosb
1616
        stosb
1617
        stosb
1618
        sub     ecx, 3
1619
        mov     ebx, ecx
1620
@@:
1621
        add     edi, ebx
1622
        inc     ecx
1623
        std
1624
@@:
1625
        movsb
1626
        dec     ecx
1627
        jz      .nodir
1628
        cmp     esi, [esp]
1629
        jae     @b
1630
        mov     al, '/'
1631
        stosb
1632
        dec     ecx
1633
        jz      .nodir
1634
        mov     esi, [esp+4]
1635
@@:
1636
        cmp     esi, [esp+8]
1637
        jb      .nodir
1638
        movsb
1639
        loop    @b
1640
.nodir:
1641
        cld
1642
        pop     eax
1643
        pop     eax
1644
        pop     eax
1645
        ret
1646
 
1647
draw_window:
1648
        push    12
1649
        pop     eax
1650
        push    1
1651
        pop     ebx
1652
        int     40h
1653
        mov     al, 48
1654
        mov     bl, 4
1655
        int     40h
1656
        mov     [skinh], eax
1657
        mov     ebx, [cur_width]
1658
        imul    ebx, font_width
283 diamond 1659
        add     ebx, 100*65536 + 5*2-1
180 heavyiron 1660
        mov     ecx, [cur_height]
1661
        imul    ecx, font_height
283 diamond 1662
        lea     ecx, [eax+ecx+5-1+100*65536]
180 heavyiron 1663
        xor     eax, eax
1664
        mov     edx, 0x13000000
1665
        mov     edi, header
1666
        int     40h
1667
        mov     al, 48
1668
        push    3
1669
        pop     ebx
1670
        mov     ecx, std_colors
1671
        push    40
1672
        pop     edx
1673
        int     40h
1674
;        mov     bl, 7
1675
;        int     40h
1676
;        xor     ax, ax
1677
;        shr     ebx, 16
1678
;        or      ebx, eax
1679
;        mov     ecx, [std_colors+16]
1680
;        mov     edx, header
1681
;        push    header.length
1682
;        pop     esi
1683
;        push    4
1684
;        pop     eax
1685
;        int     40h
283 diamond 1686
;        xor     ecx, ecx
1687
;        call    draw_image
1688
        and     [min_x], 0
1689
        and     [min_y], 0
1690
        mov     eax, [cur_width]
1691
        dec     eax
1692
        mov     [max_x], eax
1693
        mov     eax, [cur_height]
1694
        dec     eax
1695
        mov     [max_y], eax
1696
        call    draw_image.force
1697
        mov     al, 12
180 heavyiron 1698
        push    2
1699
        pop     ebx
1700
        int     40h
1701
        ret
1702
 
1703
draw_image.nomem:
1704
        mov     al, 13
1705
        xor     edx, edx
1706
        mov     ebx, [cur_width]
1707
        imul    ebx, font_width
1708
        add     ebx, 5*65536
1709
        mov     ecx, [skinh-2]
1710
        mov     cx, word [cur_height]
1711
        imul    cx, font_height
1712
        int     40h
1713
        mov     al, 4
1714
        mov     ebx, 32*65536+32
1715
        mov     ecx, 0xFFFFFF
1716
        mov     edx, nomem_draw
1717
        push    nomem_draw.size
1718
        pop     esi
1719
        int     40h
1720
        ret
1721
 
1722
draw_image:
283 diamond 1723
; determine draw rectangle
1724
        and     [max_x], 0
1725
        or      [min_x], -1
1726
        or      [min_y], -1
1727
        mov     esi, [console_data_ptr]
1728
        xor     eax, eax
1729
        xor     edx, edx
1730
        mov     ecx, [cur_width]
1731
        imul    ecx, [cur_height]
1732
.m1:
1733
        mov     bx, [esi]
1734
        cmp     bx, [esi+ecx*2]
1735
        jz      .m2
1736
        cmp     eax, [min_x]
1737
        ja      @f
1738
        mov     [min_x], eax
1739
@@:
1740
        cmp     eax, [max_x]
1741
        jb      @f
1742
        mov     [max_x], eax
1743
@@:
1744
        cmp     edx, [min_y]
1745
        jae     @f
1746
        mov     [min_y], edx
1747
@@:
1748
        mov     [max_y], edx
1749
.m2:
1750
        add     esi, 2
1751
        inc     eax
1752
        cmp     eax, [cur_width]
1753
        jb      .m1
1754
        xor     eax, eax
1755
        inc     edx
1756
        cmp     edx, [cur_height]
1757
        jb      .m1
1758
        mov     eax, [cursor_x]
1759
        cmp     eax, -1
1760
        jz      .m3
1761
        cmp     eax, [min_x]
1762
        ja      @f
1763
        mov     [min_x], eax
1764
@@:
1765
        cmp     eax, [max_x]
1766
        jb      @f
1767
        mov     [max_x], eax
1768
@@:
1769
        mov     edx, [cursor_y]
1770
        cmp     edx, [min_y]
1771
        ja      @f
1772
        mov     [min_y], edx
1773
@@:
1774
        cmp     edx, [max_y]
1775
        jb      @f
1776
        mov     [max_y], edx
1777
@@:
1778
.m3:
1779
        xchg    eax, [old_cursor_x]
1780
        xchg    edx, [old_cursor_y]
1781
        cmp     eax, -1
1782
        jz      .m4
1783
        cmp     eax, [min_x]
1784
        ja      @f
1785
        mov     [min_x], eax
1786
@@:
1787
        cmp     eax, [max_x]
1788
        jb      @f
1789
        mov     [max_x], eax
1790
@@:
1791
        cmp     edx, [min_y]
1792
        ja      @f
1793
        mov     [min_y], edx
1794
@@:
1795
        cmp     edx, [max_y]
1796
        jb      @f
1797
        mov     [max_y], edx
1798
@@:
1799
.m4:
1800
        cmp     [min_y], -1
1801
        jz      .nodraw
1802
.force:
180 heavyiron 1803
; allocate memory for image
283 diamond 1804
        mov     ecx, [max_x]
1805
        sub     ecx, [min_x]
1806
        inc     ecx
1807
        mov     [used_width], ecx
1808
        mov     edx, [max_y]
1809
        sub     edx, [min_y]
1810
        inc     edx
1811
        mov     [used_height], edx
1812
        imul    ecx, edx
1813
        imul    ecx, font_width*font_height
1814
        add     ecx, [heapend]
1815
        push    64
1816
        pop     eax
1817
        push    1
1818
        pop     ebx
1819
        int     0x40
180 heavyiron 1820
        test    eax, eax
283 diamond 1821
        jnz     draw_image.nomem
1822
        mov     edi, [heapend]
1823
        mov     esi, [console_data_ptr]
1824
        mov     eax, [min_y]
1825
        imul    eax, [cur_width]
1826
        add     eax, [min_x]
1827
        lea     esi, [esi+eax*2]
1828
        mov     ecx, [used_height]
180 heavyiron 1829
.lh:
283 diamond 1830
        push    ecx esi
1831
        mov     ecx, [used_width]
1832
.lw:
180 heavyiron 1833
        push    ecx
283 diamond 1834
        mov     ebx, [esi]
1835
        mov     eax, [cur_width]
1836
        imul    eax, [cur_height]
1837
        mov     [eax*2+esi], bx
1838
        movzx   eax, bl
1839
        push    edi
1840
        movzx   ebx, bh
1841
        mov     ebp, ebx
1842
        shr     ebp, 4
1843
        and     ebx, 0xF
1844
        sub     ebx, ebp
1845
        add     esi, 2
180 heavyiron 1846
if font_width > 8
1847
        lea     edx, [eax+eax+font]
1848
else
1849
        lea     edx, [eax+font]
1850
end if
1851
        mov     ecx, font_height
1852
.sh:
283 diamond 1853
        push    ecx edx edi
180 heavyiron 1854
        xor     ecx, ecx
283 diamond 1855
        mov     edx, [edx]
180 heavyiron 1856
.sw:
283 diamond 1857
        shr     edx, 1
1858
        sbb     eax, eax
1859
        and     eax, ebx
1860
        add     eax, ebp
1861
        mov     [edi], al
1862
        add     ecx, 1
1863
        add     edi, 1
180 heavyiron 1864
        cmp     ecx, font_width
1865
        jb      .sw
283 diamond 1866
        pop     edi edx ecx
1867
        mov     eax, [used_width]
1868
        imul    eax, font_width
180 heavyiron 1869
        add     edi, eax
1870
if font_width > 8
1871
        add     edx, 256*2
1872
else
1873
        add     edx, 256
1874
end if
1875
        loop    .sh
283 diamond 1876
        pop     edi
1877
.skip_symbol:
1878
        pop     ecx
1879
        add     edi, font_width
1880
        dec     ecx
1881
        jnz     .lw
1882
        mov     eax, [used_width]
1883
        imul    eax, (font_height-1)*font_width
180 heavyiron 1884
        add     edi, eax
283 diamond 1885
        pop     esi ecx
1886
        add     esi, [cur_width]
1887
        add     esi, [cur_width]
1888
        dec     ecx
1889
        jnz     .lh
1890
; cursor
1891
        mov     eax, [cursor_y]
1892
        inc     eax
1893
        jz      .nocursor
1894
        sub     eax, [min_y]
1895
        mul     [used_width]
1896
        imul    eax, font_height*font_width
1897
        mov     edx, [cursor_x]
1898
        sub     edx, [min_x]
1899
        inc     edx
1900
        imul    edx, font_width
1901
        add     eax, edx
1902
        add     eax, [heapend]
1903
        mov     edx, [used_width]
1904
        imul    edx, font_width
1905
        neg     edx
1906
        mov     ecx, (font_height*15+50)/100
1907
.cursor_loop:
1908
        push    ecx
1909
        mov     ecx, font_width
1910
        add     eax, edx
1911
        push    eax
1912
@@:
1913
;        add     byte [eax-1], 0x10
1914
        xor     byte [eax-1], 7
1915
        sub     eax, 1
1916
        loop    @b
1917
        pop     eax
180 heavyiron 1918
        pop     ecx
283 diamond 1919
        loop    .cursor_loop
1920
.nocursor:
1921
        mov     ecx, [used_width]
1922
        imul    ecx, font_width*65536
1923
        mov     cx, word [used_height]
1924
        imul    cx, font_height
1925
        mov     edx, [min_x]
1926
        imul    edx, font_width
1927
        add     edx, 5
1928
        shl     edx, 16
1929
        mov     dx, word [min_y]
1930
        imul    dx, font_height
1931
        add     edx, [skinh]
1932
        push    65
180 heavyiron 1933
        pop     eax
283 diamond 1934
        mov     ebx, [heapend]
1935
        push    8
1936
        pop     esi
1937
        mov     edi, console_colors
1938
        int     0x40
1939
        push    64
1940
        pop     eax
1941
        push    1
1942
        pop     ebx
1943
        mov     ecx, [heapend]
1944
        int     0x40
1945
.nodraw:
180 heavyiron 1946
        ret
1947
 
1948
get_console_ptr:
1949
; in: eax=x, edx=y
1950
; out: edi->console data
1951
        push    edx
1952
        imul    edx, [cur_width]
1953
        add     edx, eax
283 diamond 1954
        mov     edi, [console_data_ptr]
1955
        lea     edi, [edi + edx*2]
180 heavyiron 1956
        pop     edx
1957
        ret
1958
 
1959
draw_keybar:
1960
        pushad
1961
        xor     eax, eax
1962
        test    [ctrlstate], 3
1963
        jz      @f
1964
        inc     eax
1965
@@:
1966
        test    [ctrlstate], 0xC
1967
        jz      @f
1968
        or      al, 2
1969
@@:
1970
        test    [ctrlstate], 0x30
1971
        jz      @f
1972
        or      al, 4
1973
@@:
1974
        imul    eax, 6*12
1975
        mov     esi, [active_screen_vtable]
1976
        mov     esi, [esi+screen_vtable.keybar]
1977
        add     esi, eax
1978
        xor     ecx, ecx
1979
        inc     ecx
1980
        xor     eax, eax
1981
        mov     edx, [cur_height]
1982
        dec     edx
1983
        call    get_console_ptr
1984
        push    6
1985
        pop     ebx
1986
        mov     eax, [cur_width]
1987
        sub     eax, 11+9+3*2+6
1988
        cmp     eax, 7*11
1989
        jl      @f
1990
        cdq
1991
        mov     bl, 11
1992
        div     ebx
1993
        mov     ebx, eax
1994
@@:
1995
        xor     edx, edx
1996
.l:
1997
        add     edx, 7
1998
        cmp     cl, 10
1999
        jb      @f
2000
        inc     edx
2001
@@:
2002
        cmp     edx, [cur_width]
2003
        ja      .ret
2004
        cmp     cl, 10
2005
        jae     .twodig
2006
        lea     eax, [ecx+'0']
2007
        stosb
2008
        mov     al, [keybar_number_color]
2009
        stosb
2010
        jmp     .cmn
2011
.twodig:
2012
        mov     al, cl
2013
        cbw
2014
        div     [_10]
2015
        add     al, '0'
2016
        stosb
2017
        mov     al, [keybar_number_color]
2018
        stosb
2019
        xchg    al, ah
2020
        add     al, '0'
2021
        stosw
2022
.cmn:
2023
        mov     ah, [keybar_name_color]
2024
        push    ecx
2025
        mov     cl, 6
2026
@@:
2027
        lodsb
2028
        stosw
2029
        loop    @b
2030
        mov     al, ' '
2031
        lea     ecx, [ebx-6]
2032
        cmp     byte [esp], 12
2033
        jz      .ret_pop
2034
        add     edx, ecx
2035
        rep     stosw
2036
        pop     ecx
2037
        inc     edx
2038
        cmp     edx, [cur_width]
2039
        ja      .ret
2040
        mov     ah, [keybar_bgr_color]
2041
        stosw
2042
        inc     ecx
2043
        jmp     .l
2044
.ret_pop:
2045
        pop     ecx
2046
.ret:
2047
        cmp     byte [edi-2], ' '
2048
        jnz     @f
2049
        dec     edi
2050
        dec     edi
2051
@@:
2052
        push    edi
283 diamond 2053
        xor     eax, eax
180 heavyiron 2054
        mov     edx, [cur_height]
2055
        call    get_console_ptr
2056
        mov     ecx, edi
2057
        pop     edi
2058
        sub     ecx, edi
2059
        shr     ecx, 1
2060
        mov     al, ' '
2061
        mov     ah, [keybar_name_color]
2062
        rep     stosw
2063
.done:
2064
        popad
2065
        ret
2066
 
2067
draw_cmdbar:
2068
        mov     esi, [active_panel]
2069
        add     esi, panel1_dir - panel1_data
2070
        xor     eax, eax
2071
        mov     edx, [cur_height]
2072
        dec     edx
2073
        dec     edx
2074
        call    get_console_ptr
2075
        mov     ah, [cmdbar_prefix_color]
2076
        mov     ecx, [cur_width]
2077
        dec     ecx
2078
@@:
2079
        lodsb
2080
        test    al, al
2081
        jz      @f
2082
        stosw
2083
        loop    @b
2084
@@:
2085
        mov     al, '>'
2086
        stosw
2087
        mov     al, ' '
2088
        mov     ah, [cmdbar_normal_color]
2089
        rep     stosw
2090
        ret
2091
 
2092
draw_border:
2093
        push    edi
2094
        mov     al, 0xC9
2095
        stosw
2096
        mov     al, 0xCD
2097
        lea     ecx, [ebx-2]
2098
        rep     stosw
2099
        mov     al, 0xBB
2100
        stosw
2101
        pop     edi
2102
        add     edi, [cur_width]
2103
        add     edi, [cur_width]
2104
        lea     ecx, [edx-2]
2105
.l:
2106
        push    edi
2107
        mov     al, 0xBA
2108
        stosw
2109
        mov     al, 0x20
2110
        push    ecx
2111
        lea     ecx, [ebx-2]
2112
        rep     stosw
2113
        pop     ecx
2114
        mov     al, 0xBA
2115
        stosw
2116
        pop     edi
2117
        add     edi, [cur_width]
2118
        add     edi, [cur_width]
2119
        loop    .l
2120
        mov     al, 0xC8
2121
        stosw
2122
        mov     al, 0xCD
2123
        lea     ecx, [ebx-2]
2124
        rep     stosw
2125
        mov     al, 0xBC
2126
        stosw
2127
        ret
2128
 
2129
draw_panel:
2130
        mov     eax, [ebp + panel1_left - panel1_data]
2131
        mov     edx, [ebp + panel1_top - panel1_data]
2132
        call    get_console_ptr
2133
; draw border
2134
        mov     ah, [panel_border_color]
2135
        mov     ebx, [ebp + panel1_width - panel1_data]
2136
        mov     edx, [ebp + panel1_height - panel1_data]
2137
        call    draw_border
2138
        push    eax
2139
        mov     eax, [ebp + panel1_left - panel1_data]
2140
        mov     edx, [ebp + panel1_top - panel1_data]
2141
        add     edx, [ebp + panel1_height - panel1_data]
2142
        sub     edx, 3
2143
        call    get_console_ptr
2144
        pop     eax
2145
        mov     al, 0xC7
2146
        stosw
2147
        mov     al, 0xC4
2148
        lea     ecx, [ebx-2]
2149
        rep     stosw
2150
        mov     al, 0xB6
2151
        stosw
2152
        mov     eax, [ebp + panel1_width - panel1_data]
2153
        sub     eax, 3
2154
        shr     eax, 1
2155
        mov     [column_width], eax
2156
        mov     eax, [ebp + panel1_left - panel1_data]
2157
        inc     eax
2158
        mov     [column_left], eax
2159
        add     eax, [column_width]
2160
        mov     edx, [ebp + panel1_top - panel1_data]
2161
        inc     edx
2162
        mov     [column_top], edx
2163
        dec     edx
2164
        call    get_console_ptr
2165
        mov     ah, [panel_border_color]
2166
        mov     al, 0xD1
2167
        mov     [edi], ax
2168
        add     edi, [cur_width]
2169
        add     edi, [cur_width]
2170
        mov     ecx, [ebp + panel1_height - panel1_data]
2171
        sub     ecx, 4
2172
        mov     [column_height], ecx
2173
        mov     al, 0xB3
2174
@@:
2175
        mov     [edi], ax
2176
        add     edi, [cur_width]
2177
        add     edi, [cur_width]
2178
        loop    @b
2179
        mov     al, 0xC1
2180
        stosw
2181
        mov     eax, [column_height]
2182
        dec     eax
2183
        mov     [ebp + panel1_colsz - panel1_data], eax
2184
        add     eax, eax
2185
        mov     [ebp + panel1_colst - panel1_data], eax
2186
        mov     eax, [ebp + panel1_start - panel1_data]
2187
        mov     [column_index], eax
2188
        call    draw_column
2189
        mov     eax, [ebp + panel1_width - panel1_data]
2190
        sub     eax, 3
2191
        mov     ecx, [column_width]
2192
        sub     eax, ecx
2193
        mov     [column_width], eax
2194
        inc     ecx
2195
        add     [column_left], ecx
2196
        call    draw_column
2197
; Заголовок панели (текущая папка)
2198
        lea     esi, [ebp + panel1_dir - panel1_data]
2199
        mov     edi, cur_header
2200
        mov     ecx, [ebp + panel1_width - panel1_data]
2201
        sub     ecx, 7
2202
        movsb
2203
@@:
2204
        lodsb
2205
        stosb
2206
        dec     ecx
2207
        test    al, al
2208
        jz      .header_created
2209
        cmp     al, '/'
2210
        jnz     @b
2211
        mov     edx, esi
2212
@@:
2213
        lodsb
2214
        test    al, al
2215
        jnz     @b
2216
        sub     esi, edx
2217
        dec     esi
2218
        cmp     esi, ecx
2219
        jbe     @f
2220
        mov     word [edi], '..'
2221
        mov     byte [edi+2], '.'
2222
        add     edi, 3
2223
        sub     ecx, 3
2224
        add     edx, esi
2225
        sub     edx, ecx
2226
@@:
2227
        mov     esi, edx
2228
@@:
2229
        lodsb
2230
        stosb
2231
        dec     ecx
2232
        test    al, al
2233
        jnz     @b
2234
.header_created:
2235
        mov     edx, [ebp + panel1_top - panel1_data]
2236
        mov     eax, [ebp + panel1_left - panel1_data]
2237
        shr     ecx, 1
2238
        lea     eax, [eax+ecx+3]
2239
        call    get_console_ptr
2240
        mov     ah, [panel_active_header_color]
2241
        cmp     ebp, [active_panel]
2242
        jz      @f
2243
        mov     ah, [panel_header_color]
2244
@@:
2245
        mov     al, ' '
2246
        stosw
2247
        mov     esi, cur_header
2248
@@:
2249
        lodsb
2250
        test    al, al
2251
        jz      @f
2252
        stosw
2253
        jmp     @b
2254
@@:
2255
        mov     al, ' '
2256
        stosw
2257
        mov     edx, [ebp + panel1_top - panel1_data]
2258
        inc     edx
2259
        mov     eax, [ebp + panel1_left - panel1_data]
2260
        inc     eax
2261
        call    get_console_ptr
2262
        movzx   eax, [ebp + panel1_sortmode - panel1_data]
2263
        mov     al, [compare_names+eax]
2264
        stosb
2265
        cmp     [ebp + panel1_numfiles - panel1_data], 0
2266
        jz      .skip_curinfo
2267
; Информация о выбранном файле
2268
        mov     ebx, [ebp + panel1_index - panel1_data]
2269
        mov     eax, [ebp + panel1_files - panel1_data]
2270
        mov     ebx, [eax+ebx*4]
2271
        mov     eax, [ebp + panel1_nfa - panel1_data]
2272
        lea     ebx, [ebx+eax*4+32]
2273
        add     ebx, [ebp + panel1_files - panel1_data]
2274
        mov     eax, [ebp + panel1_left - panel1_data]
2275
        add     eax, [ebp + panel1_width - panel1_data]
2276
        dec     eax
2277
        mov     edx, [ebp + panel1_top - panel1_data]
2278
        add     edx, [ebp + panel1_height - panel1_data]
2279
        dec     edx
2280
        dec     edx
2281
        call    get_console_ptr
2282
        mov     ecx, [ebp + panel1_width - panel1_data]
2283
        dec     ecx
2284
        dec     ecx
2285
; Время модификации
2286
        sub     edi, 5*2
2287
        sub     ecx, 6
2288
        mov     al, [ebx+24+2]
2289
        aam
2290
        or      ax, 0x3030
2291
        mov     [edi], ah
2292
        mov     [edi+2], al
2293
        mov     [edi+4], byte ':'
2294
        mov     al, [ebx+24+1]
2295
        aam
2296
        or      ax, 0x3030
2297
        mov     [edi+6], ah
2298
        mov     [edi+8], al
2299
        mov     al, [panel_normal_color]
2300
        mov     [edi+1], al
2301
        mov     [edi+3], al
2302
        mov     [edi+5], al
2303
        mov     [edi+7], al
2304
        mov     [edi+9], al
2305
        dec     edi
2306
        mov     [edi], al
2307
        dec     edi
2308
        mov     byte [edi], ' '
2309
; Дата модификации
2310
        sub     edi, 8*2
2311
        sub     ecx, 9
2312
        mov     al, [ebx+28+0]
2313
        aam
2314
        or      ax, 0x3030
2315
        mov     [edi], ah
2316
        mov     [edi+2], al
2317
        mov     [edi+4], byte '.'
2318
        mov     al, [ebx+28+1]
2319
        aam
2320
        or      ax, 0x3030
2321
        mov     [edi+6], ah
2322
        mov     [edi+8], al
2323
        mov     [edi+10], byte '.'
2324
        mov     ax, [ebx+28+2]
2325
        div     [_100]
2326
        mov     al, ah
2327
        aam
2328
        or      ax, 0x3030
2329
        mov     [edi+12], ah
2330
        mov     [edi+14], al
2331
        mov     al, [panel_normal_color]
2332
        mov     [edi+1], al
2333
        mov     [edi+3], al
2334
        mov     [edi+5], al
2335
        mov     [edi+7], al
2336
        mov     [edi+9], al
2337
        mov     [edi+11], al
2338
        mov     [edi+13], al
2339
        mov     [edi+15], al
2340
        dec     edi
2341
        mov     [edi], al
2342
        dec     edi
2343
        mov     [edi], byte ' '
2344
; Размер
2345
        std
2346
        mov     ah, [panel_normal_color]
2347
        dec     edi
2348
        dec     edi
2349
        dec     ecx
2350
        test    byte [ebx], 0x10
2351
        jz      .size_file
2352
        push    ecx
2353
        mov     esi, aFolder+aFolder.size-1
2354
        mov     ecx, aFolder.size
2355
        cmp     word [ebx+40], '..'
2356
        jnz     @f
2357
        cmp     byte [ebx+42], 0
2358
        jnz     @f
2359
        mov     esi, aUp+aUp.size-1
2360
        mov     cl, aUp.size
2361
@@:
2362
        sub     [esp], ecx
2363
@@:
2364
        lodsb
2365
        stosw
2366
        loop    @b
2367
        pop     ecx
2368
        jmp     .size_done
2369
.size_file:
2370
        mov     edx, [ebx+36]
2371
        test    edx, edx
2372
        jz      .size_less_4g
2373
        cmp     edx, 10*256
2374
        jae     .size_tera
2375
; в гигабайтах
2376
        mov     al, 'G'
283 diamond 2377
        shl     edx, 2
180 heavyiron 2378
        jmp     .size_letter
2379
.size_tera:
2380
; в терабайтах
2381
        shr     edx, 8
2382
        mov     al, 'T'
2383
        jmp     .size_letter
2384
.size_less_4g:
2385
        mov     edx, [ebx+32]
2386
        cmp     edx, 10*(1 shl 20)
2387
        jae     .size_mega
2388
        cmp     edx, 1 shl 20
2389
        jb      .size_num
2390
        shr     edx, 10
2391
        mov     al, 'K'
2392
        jmp     .size_letter
2393
.size_mega:
2394
        mov     al, 'M'
2395
        shr     edx, 20
2396
.size_letter:
2397
        stosw
2398
        dec     ecx
2399
        mov     al, ' '
2400
        stosw
2401
        dec     ecx
2402
.size_num:
2403
        xchg    eax, edx
2404
        xor     edx, edx
2405
        div     [_10d]
2406
        xchg    eax, edx
2407
        add     al, '0'
2408
        mov     ah, [panel_normal_color]
2409
        stosw
2410
        dec     ecx
2411
        test    edx, edx
2412
        jnz     .size_num
2413
.size_done:
2414
        cld
2415
; Имя
2416
        sub     edi, ecx
2417
        sub     edi, ecx
2418
        lea     esi, [ebx+40]
2419
@@:
2420
        lodsb
2421
        test    al, al
2422
        jnz     @b
2423
        sub     esi, ebx
2424
        sub     esi, 41
2425
        mov     ah, [panel_normal_color]
2426
        cmp     esi, ecx
2427
        lea     edx, [ebx+40]
2428
        jbe     @f
2429
        mov     al, '{'
2430
        mov     [edi-2], ax
2431
        add     edx, esi
2432
        sub     edx, ecx
2433
@@:
2434
        mov     esi, edx
2435
@@:
2436
        lodsb
2437
        test    al, al
2438
        jz      @f
2439
        stosw
2440
        loop    @b
2441
@@:
2442
        mov     al, ' '
2443
        rep     stosw
2444
.skip_curinfo:
2445
        call    draw_image
2446
        ret
2447
 
2448
draw_column:
2449
        mov     eax, [column_left]
2450
        mov     edx, [column_top]
2451
        call    get_console_ptr
2452
; заголовок столбца
2453
        push    edi
2454
        mov     ah, [column_header_color]
2455
        mov     al, ' '
2456
        mov     ecx, [column_width]
2457
if lang eq ru
2458
        sub     ecx, 3
2459
else
2460
        sub     ecx, 4
2461
end if
2462
        shr     ecx, 1
2463
        rep     stosw
2464
if lang eq ru
2465
        mov     al, 'И'
2466
        stosw
2467
        mov     al, 'м'
2468
        stosw
2469
        mov     al, 'я'
2470
        stosw
2471
else
2472
        mov     al, 'N'
2473
        stosw
2474
        mov     al, 'a'
2475
        stosw
2476
        mov     al, 'm'
2477
        stosw
2478
        mov     al, 'e'
2479
        stosw
2480
end if
2481
        mov     al, ' '
2482
        mov     ecx, [column_width]
2483
if lang eq ru
2484
        sub     ecx, 2
2485
else
2486
        sub     ecx, 3
2487
end if
2488
        shr     ecx, 1
2489
        rep     stosw
2490
        pop     edi
2491
        add     edi, [cur_width]
2492
        add     edi, [cur_width]
2493
; файлы
2494
        mov     edx, [ebp + panel1_numfiles - panel1_data]
2495
        mov     ecx, [column_height]
2496
        dec     ecx
2497
.l:
2498
        cmp     [column_index], edx
2499
        jae     .ret
2500
        push    ecx
2501
        mov     esi, [column_index]
2502
        mov     ecx, [ebp + panel1_files - panel1_data]
2503
        mov     esi, [ecx+esi*4]
2504
        mov     ecx, [ebp + panel1_nfa - panel1_data]
2505
        lea     esi, [esi + ecx*4 + 32 + 40]
2506
        add     esi, [ebp + panel1_files - panel1_data]
283 diamond 2507
        mov     ah, [esi - 40 + 5]
180 heavyiron 2508
        cmp     ebp, [active_panel]
2509
        jnz     @f
2510
        mov     ecx, [column_index]
2511
        cmp     ecx, [ebp + panel1_index - panel1_data]
2512
        jnz     @f
283 diamond 2513
        mov     ah, [esi - 40 + 6]
180 heavyiron 2514
@@:
2515
        mov     ecx, [column_width]
2516
        push    edi
2517
@@:
2518
        lodsb
2519
        test    al, al
2520
        jz      @f
2521
        stosw
2522
        loop    @b
2523
        cmp     byte [esi], 0
2524
        jz      @f
2525
        mov     byte [edi], '}'
2526
@@:
2527
        mov     al, ' '
2528
        rep     stosw
2529
        pop     edi
2530
        add     edi, [cur_width]
2531
        add     edi, [cur_width]
2532
        inc     [column_index]
2533
        pop     ecx
2534
        dec     ecx
2535
        jnz     .l
2536
.ret:
2537
        cmp     ebp, panel1_data
2538
        jnz     .ret2
2539
; Число экранов
2540
        mov     eax, [num_screens]
2541
        dec     eax
2542
        jz      .ret2
2543
        push    eax
2544
        xor     eax, eax
2545
        xor     edx, edx
2546
        call    get_console_ptr
2547
        mov     ah, [panel_nscreens_color]
2548
        mov     al, '['
2549
        stosw
2550
        pop     eax
2551
        push    -'0'
2552
@@:
2553
        xor     edx, edx
2554
        div     [_10d]
2555
        push    edx
2556
        test    eax, eax
2557
        jnz     @b
2558
@@:
2559
        pop     eax
2560
        add     eax, '0'
2561
        jz      @f
2562
        mov     ah, [panel_nscreens_color]
2563
        stosw
2564
        jmp     @b
2565
@@:
2566
        mov     al, ']'
2567
        mov     ah, [panel_nscreens_color]
2568
        stosw
2569
.ret2:
2570
        ret
2571
 
2572
;insert_last_dot:
2573
;        push    eax esi
2574
;        mov     ah, 0
2575
;.loop:
2576
;        lodsb
2577
;        test    al, al
2578
;        jz      .done
2579
;        cmp     al, '.'
2580
;        jnz     .loop
2581
;        mov     ah, 1
2582
;        jmp     .loop
2583
;.done:
2584
;        test    ah, ah
2585
;        jnz     @f
2586
;        mov     byte [esi-1], '.'
2587
;        mov     byte [esi], 0
2588
;@@:
2589
;        pop     esi eax
2590
;        ret
2591
 
2592
;delete_last_dot:
2593
;        push    esi
2594
;@@:
2595
;        cmp     byte [esi], 0
2596
;        jz      @f
2597
;        inc     esi
2598
;        jmp     @b
2599
;@@:
2600
;        cmp     byte [esi-1], '.'
2601
;        jnz     @f
2602
;        mov     byte [esi-1], 0
2603
;@@:     pop     esi
2604
;        ret
2605
 
2606
read_folder:
2607
        mov     eax, [ebp + panel1_nfa - panel1_data]
2608
        mov     [dirinfo.size], eax
2609
        shl     eax, 2
2610
        add     eax, [ebp + panel1_files - panel1_data]
2611
        mov     [dirinfo.dirdata], eax
2612
        lea     eax, [ebp + panel1_dir - panel1_data]
2613
        mov     [dirinfo.name], eax
2614
        push    70
2615
        pop     eax
2616
        mov     ebx, dirinfo
2617
        int     40h
2618
        test    eax, eax
2619
        jz      .ok
2620
        cmp     eax, 6
2621
        jz      .ok
2622
; TODO: add error handling
2623
        mov     [ebp + panel1_numfiles - panel1_data], 2
2624
        mov     eax, [ebp + panel1_nfa - panel1_data]
2625
        shl     eax, 2
2626
        add     eax, [ebp + panel1_files - panel1_data]
2627
        add     eax, 32+40
2628
        mov     word [eax], '..'
2629
        mov     byte [eax+2], 0
2630
        add     eax, 304
2631
        mov     dword [eax], 'Read'
2632
        mov     dword [eax+4], ' err'
2633
        mov     dword [eax+8], 'or'
2634
        mov     eax, [ebp + panel1_files - panel1_data]
2635
        mov     dword [eax], 0
2636
        mov     dword [eax+4], 304
2637
        and     dword [ebp + panel1_index - panel1_data], 0
2638
        and     dword [ebp + panel1_start - panel1_data], 0
2639
        ret
2640
.ok:
2641
        mov     eax, [dirinfo.dirdata]
2642
        cmp     [eax+8], ebx
2643
        jz      .readdone
2644
        push    eax
2645
        mov     eax, [ebp + panel1_files - panel1_data]
2646
        call    mf_free
2647
        pop     eax
2648
        mov     eax, [eax+8]
2649
        add     eax, 0xF
2650
        and     eax, not 0xF
2651
        push    eax
2652
        imul    eax, 4+304
2653
        add     eax, 32
2654
        call    mf_alloc
2655
        test    eax, eax
2656
        jnz     .succ1
2657
        pop     eax
2658
; TODO: add error handling
2659
        jmp     .readdone
2660
.succ1:
2661
        mov     [ebp + panel1_files - panel1_data], eax
2662
        pop     [ebp + panel1_nfa - panel1_data]
2663
        jmp     read_folder
2664
.readdone:
2665
        and     [ebp + panel1_start - panel1_data], 0
2666
        and     [ebp + panel1_index - panel1_data], 0
2667
        and     [ebp + panel1_start - panel1_data], 0
2668
        mov     edi, [ebp + panel1_files - panel1_data]
2669
        mov     eax, [ebp + panel1_nfa - panel1_data]
2670
        lea     esi, [edi + eax*4 + 32]
2671
        xor     eax, eax
2672
        mov     ecx, [esi-32+4]
283 diamond 2673
        test    ecx, ecx
2674
        jz      .loopdone
180 heavyiron 2675
; Игнорируем специальные входы, соответствующие папке '.' и метке тома
2676
.ptrinit:
2677
        cmp     word [esi+eax+40], '.'
2678
        jz      .loopcont
2679
        test    byte [esi+eax], 8
2680
        jnz     .loopcont
2681
        stosd
283 diamond 2682
; подсветка
2683
;        call    insert_last_dot
2684
        pushad
2685
        lea     ebp, [esi+eax]
2686
        lea     esi, [ebp+40]
2687
        mov     edi, lower_file_name
2688
        mov     edx, edi
2689
@@:
2690
        lodsb
2691
        call    tolower
2692
        stosb
2693
        test    al, al
2694
        jnz     @b
2695
        mov     esi, edx
2696
        lea     edx, [edi-1]
2697
        xor     ecx, ecx
2698
.highlight_test_loop:
2699
        mov     ebx, [highlight_groups+ecx*4]
2700
        mov     al, [ebx + highlight.IncludeAttributes]
2701
        mov     ah, [ebp]
2702
        and     ah, al
2703
        cmp     ah, al
2704
        jnz     .highlight_test_failed
2705
        lea     edi, [ebx + highlight.Mask]
2706
        call    match_mask_rev_lowercase
2707
        jc      .highlight_test_failed
2708
        mov     ah, [ebx + highlight.NormalColor]
2709
        test    ah, ah
2710
        jnz     @f
2711
        mov     ah, [panel_normal_color]
2712
@@:
2713
        mov     [ebp+5], ah
2714
        mov     ah, [ebx + highlight.CursorColor]
2715
        test    ah, ah
2716
        jnz     @f
2717
        mov     ah, [panel_cursor_color]
2718
@@:
2719
        mov     [ebp+6], ah
2720
        jmp     .doname
2721
.highlight_test_failed:
2722
        inc     ecx
2723
        cmp     ecx, [highlight_num_groups]
2724
        jb      .highlight_test_loop
2725
.nohighlight:
2726
        mov     ah, [panel_normal_color]
2727
        mov     [ebp+5], ah
2728
        mov     ah, [panel_cursor_color]
2729
        mov     [ebp+6], ah
2730
.doname:
2731
;        call    delete_last_dot
2732
        popad
180 heavyiron 2733
.loopcont:
2734
        add     eax, 304
283 diamond 2735
        dec     ecx
2736
        jnz     .ptrinit
180 heavyiron 2737
.loopdone:
2738
        sub     edi, [ebp + panel1_files - panel1_data]
2739
        shr     edi, 2
2740
        mov     [ebp + panel1_numfiles - panel1_data], edi
2741
.done:
2742
; Сортировка
2743
sort_files:
2744
        movzx   eax, [ebp + panel1_sortmode - panel1_data]
2745
        mov     ebx, [compare_fns + eax*4]
2746
        mov     edx, [ebp + panel1_files - panel1_data]
2747
        mov     ecx, [ebp + panel1_numfiles - panel1_data]
2748
        call    sort
2749
        ret
2750
 
2751
compare_name:
2752
        push    eax
2753
        mov     eax, [ebp + panel1_nfa - panel1_data]
2754
        add     esi, [ebp + panel1_files - panel1_data]
2755
        add     edi, [ebp + panel1_files - panel1_data]
2756
        lea     esi, [esi+eax*4+0x20]
2757
        lea     edi, [edi+eax*4+0x20]
2758
        pop     eax
2759
        cmp     word [esi+40], '..'
2760
        jnz     @f
2761
        cmp     byte [esi+42], 0
2762
        jz      .less
2763
@@:     cmp     word [edi+40], '..'
2764
        jnz     @f
2765
        cmp     byte [edi+42], 0
2766
        jz      .greater
2767
@@:
2768
        test    byte [esi], 10h
2769
        jnz     .1dir
2770
        test    byte [edi], 10h
2771
        jnz     .greater
2772
.eq1:
2773
        add     esi, 40
2774
        add     edi, 40
2775
        jmp     strcmpi
2776
.greater:
2777
        test    esi, esi
2778
        ret
2779
.1dir:
2780
        test    byte [edi], 10h
2781
        jnz     .eq1
2782
.less:
2783
        xor     edi, edi
2784
        stc
2785
        ret
2786
 
2787
compare_name_rev:
2788
        push    eax
2789
        mov     eax, [ebp + panel1_nfa - panel1_data]
2790
        add     esi, [ebp + panel1_files - panel1_data]
2791
        add     edi, [ebp + panel1_files - panel1_data]
2792
        lea     esi, [esi+eax*4+0x20]
2793
        lea     edi, [edi+eax*4+0x20]
2794
        pop     eax
2795
        cmp     word [esi+40], '..'
2796
        jnz     @f
2797
        cmp     byte [esi+42], 0
2798
        jz      .less
2799
@@:     cmp     word [edi+40], '..'
2800
        jnz     @f
2801
        cmp     byte [edi+42], 0
2802
        jz      .greater
2803
@@:
2804
        test    byte [esi], 10h
2805
        jnz     .1dir
2806
        test    byte [edi], 10h
2807
        jnz     .greater
2808
.eq1:
2809
        add     esi, 40
2810
        add     edi, 40
2811
        xchg    esi, edi
2812
        jmp     strcmpi
2813
.greater:
2814
        test    esi, esi
2815
        ret
2816
.1dir:
2817
        test    byte [edi], 10h
2818
        jnz     .eq1
2819
.less:
2820
        xor     edi, edi
2821
        stc
2822
        ret
2823
 
2824
strcmpi:
2825
        push    eax
2826
@@:
2827
        lodsb
2828
        call    match_symbol
2829
        jnz     .ret
2830
        inc     edi
2831
        test    al, al
2832
        jnz     @b
2833
.ret:
2834
        pop     eax
2835
        ret
2836
 
2837
compare_ext:
2838
        push    eax
2839
        mov     eax, [ebp + panel1_nfa - panel1_data]
2840
        add     esi, [ebp + panel1_files - panel1_data]
2841
        add     edi, [ebp + panel1_files - panel1_data]
2842
        lea     esi, [esi+eax*4+0x20]
2843
        lea     edi, [edi+eax*4+0x20]
2844
        pop     eax
2845
        cmp     word [esi+40], '..'
2846
        jnz     @f
2847
        cmp     byte [esi+42], 0
2848
        jz      .less
2849
@@:     cmp     word [edi+40], '..'
2850
        jnz     @f
2851
        cmp     byte [edi+42], 0
2852
        jz      .greater
2853
@@:
2854
        test    byte [esi], 10h
2855
        jnz     .1dir
2856
        test    byte [edi], 10h
2857
        jnz     .greater
2858
.eq1:
2859
        add     esi, 40
2860
        add     edi, 40
2861
        push    esi edi
2862
        call    seek_ext
2863
        xchg    esi, edi
2864
        call    seek_ext
2865
        xchg    esi, edi
2866
        call    strcmpi
2867
        jnz     .ret
2868
        pop     edi esi
2869
        jmp     strcmpi
2870
.ret:
2871
        pop     edi esi
2872
        ret
2873
.greater:
2874
        test    esi, esi
2875
        ret
2876
.1dir:
2877
        test    byte [edi], 10h
2878
        jnz     .eq1
2879
.less:
2880
        xor     edi, edi
2881
        stc
2882
        ret
2883
 
2884
compare_ext_rev:
2885
        push    eax
2886
        mov     eax, [ebp + panel1_nfa - panel1_data]
2887
        add     esi, [ebp + panel1_files - panel1_data]
2888
        add     edi, [ebp + panel1_files - panel1_data]
2889
        lea     esi, [esi+eax*4+0x20]
2890
        lea     edi, [edi+eax*4+0x20]
2891
        pop     eax
2892
        cmp     word [esi+40], '..'
2893
        jnz     @f
2894
        cmp     byte [esi+42], 0
2895
        jz      .less
2896
@@:     cmp     word [edi+40], '..'
2897
        jnz     @f
2898
        cmp     byte [edi+42], 0
2899
        jz      .greater
2900
@@:
2901
        test    byte [esi], 10h
2902
        jnz     .1dir
2903
        test    byte [edi], 10h
2904
        jnz     .greater
2905
.eq1:
2906
        add     esi, 40
2907
        add     edi, 40
2908
        push    esi edi
2909
        call    seek_ext
2910
        xchg    esi, edi
2911
        call    seek_ext
2912
        call    strcmpi
2913
        jnz     .ret
2914
        pop     edi esi
2915
        xchg    esi, edi
2916
        jmp     strcmpi
2917
.ret:
2918
        pop     edi esi
2919
        ret
2920
.greater:
2921
        test    esi, esi
2922
        ret
2923
.1dir:
2924
        test    byte [edi], 10h
2925
        jnz     .eq1
2926
.less:
2927
        xor     edi, edi
2928
        stc
2929
        ret
2930
 
2931
seek_ext:
2932
        push    eax
2933
        xor     eax, eax
2934
.l:
2935
        inc     esi
2936
        cmp     byte [esi-1], '.'
2937
        jnz     @f
2938
        mov     eax, esi
2939
@@:
2940
        cmp     byte [esi-1], 0
2941
        jnz     .l
2942
        test    eax, eax
2943
        jnz     @f
2944
        lea     eax, [esi-1]
2945
@@:
2946
        mov     esi, eax
2947
        pop     eax
2948
        ret
2949
 
2950
compare_modified:
2951
        push    eax
2952
        mov     eax, [ebp + panel1_nfa - panel1_data]
2953
        add     esi, [ebp + panel1_files - panel1_data]
2954
        add     edi, [ebp + panel1_files - panel1_data]
2955
        lea     esi, [esi+eax*4+0x20]
2956
        lea     edi, [edi+eax*4+0x20]
2957
        pop     eax
2958
        cmp     word [esi+40], '..'
2959
        jnz     @f
2960
        cmp     byte [esi+42], 0
2961
        jz      .less
2962
@@:     cmp     word [edi+40], '..'
2963
        jnz     @f
2964
        cmp     byte [edi+42], 0
2965
        jz      .greater
2966
@@:
2967
        test    byte [esi], 10h
2968
        jnz     .1dir
2969
        test    byte [edi], 10h
2970
        jnz     .greater
2971
.eq1:
2972
        push    edi
2973
        mov     edi, [edi+28]
2974
        cmp     edi, [esi+28]
2975
        pop     edi
2976
        jnz     @f
2977
        push    edi
2978
        mov     edi, [edi+24]
2979
        cmp     edi, [esi+24]
2980
        pop     edi
2981
        jnz     @f
2982
        add     esi, 40
2983
        add     edi, 40
2984
        jmp     strcmpi
2985
@@:
2986
        ret
2987
.greater:
2988
        test    esi, esi
2989
        ret
2990
.1dir:
2991
        test    byte [edi], 10h
2992
        jnz     .eq1
2993
.less:
2994
        xor     edi, edi
2995
        stc
2996
        ret
2997
 
2998
compare_modified_rev:
2999
        push    eax
3000
        mov     eax, [ebp + panel1_nfa - panel1_data]
3001
        add     esi, [ebp + panel1_files - panel1_data]
3002
        add     edi, [ebp + panel1_files - panel1_data]
3003
        lea     esi, [esi+eax*4+0x20]
3004
        lea     edi, [edi+eax*4+0x20]
3005
        pop     eax
3006
        cmp     word [esi+40], '..'
3007
        jnz     @f
3008
        cmp     byte [esi+42], 0
3009
        jz      .less
3010
@@:     cmp     word [edi+40], '..'
3011
        jnz     @f
3012
        cmp     byte [edi+42], 0
3013
        jz      .greater
3014
@@:
3015
        test    byte [esi], 10h
3016
        jnz     .1dir
3017
        test    byte [edi], 10h
3018
        jnz     .greater
3019
.eq1:
3020
        push    esi
3021
        mov     esi, [esi+28]
3022
        cmp     esi, [edi+28]
3023
        pop     esi
3024
        jnz     @f
3025
        push    esi
3026
        mov     esi, [esi+24]
3027
        cmp     esi, [edi+24]
3028
        pop     esi
3029
        jnz     @f
3030
        add     esi, 40
3031
        add     edi, 40
3032
        xchg    esi, edi
3033
        jmp     strcmpi
3034
@@:
3035
        ret
3036
.greater:
3037
        test    esi, esi
3038
        ret
3039
.1dir:
3040
        test    byte [edi], 10h
3041
        jnz     .eq1
3042
.less:
3043
        xor     edi, edi
3044
        stc
3045
        ret
3046
 
3047
compare_size:
3048
        push    eax
3049
        mov     eax, [ebp + panel1_nfa - panel1_data]
3050
        add     esi, [ebp + panel1_files - panel1_data]
3051
        add     edi, [ebp + panel1_files - panel1_data]
3052
        lea     esi, [esi+eax*4+0x20]
3053
        lea     edi, [edi+eax*4+0x20]
3054
        pop     eax
3055
        cmp     word [esi+40], '..'
3056
        jnz     @f
3057
        cmp     byte [esi+42], 0
3058
        jz      .less
3059
@@:     cmp     word [edi+40], '..'
3060
        jnz     @f
3061
        cmp     byte [edi+42], 0
3062
        jz      .greater
3063
@@:
3064
        test    byte [esi], 10h
3065
        jnz     .1dir
3066
        test    byte [edi], 10h
3067
        jnz     .greater
3068
.eq1:
3069
        push    edi
3070
        mov     edi, [edi+36]
3071
        cmp     edi, [esi+36]
3072
        pop     edi
3073
        jnz     @f
3074
        push    edi
3075
        mov     edi, [edi+32]
3076
        cmp     edi, [esi+32]
3077
        pop     edi
3078
        jnz     @f
3079
        add     esi, 40
3080
        add     edi, 40
3081
        jmp     strcmpi
3082
@@:
3083
        ret
3084
.greater:
3085
        test    esi, esi
3086
        ret
3087
.1dir:
3088
        test    byte [edi], 10h
3089
        jnz     .eq1
3090
.less:
3091
        xor     edi, edi
3092
        stc
3093
        ret
3094
 
3095
compare_size_rev:
3096
        push    eax
3097
        mov     eax, [ebp + panel1_nfa - panel1_data]
3098
        add     esi, [ebp + panel1_files - panel1_data]
3099
        add     edi, [ebp + panel1_files - panel1_data]
3100
        lea     esi, [esi+eax*4+0x20]
3101
        lea     edi, [edi+eax*4+0x20]
3102
        pop     eax
3103
        cmp     word [esi+40], '..'
3104
        jnz     @f
3105
        cmp     byte [esi+42], 0
3106
        jz      .less
3107
@@:     cmp     word [edi+40], '..'
3108
        jnz     @f
3109
        cmp     byte [edi+42], 0
3110
        jz      .greater
3111
@@:
3112
        test    byte [esi], 10h
3113
        jnz     .1dir
3114
        test    byte [edi], 10h
3115
        jnz     .greater
3116
.eq1:
3117
        push    esi
3118
        mov     esi, [esi+36]
3119
        cmp     esi, [edi+36]
3120
        pop     esi
3121
        jnz     @f
3122
        push    esi
3123
        mov     esi, [esi+32]
3124
        cmp     esi, [edi+32]
3125
        pop     esi
3126
        jnz     @f
3127
        add     esi, 40
3128
        add     edi, 40
3129
        xchg    esi, edi
3130
        jmp     strcmpi
3131
@@:
3132
        ret
3133
.greater:
3134
        test    esi, esi
3135
        ret
3136
.1dir:
3137
        test    byte [edi], 10h
3138
        jnz     .eq1
3139
.less:
3140
        xor     edi, edi
3141
        stc
3142
        ret
3143
 
3144
compare_unordered:
3145
        cmp     esi, edi
3146
        ret
3147
compare_unordered_rev:
3148
        push    eax
3149
        mov     eax, [ebp + panel1_nfa - panel1_data]
3150
        add     esi, [ebp + panel1_files - panel1_data]
3151
        add     edi, [ebp + panel1_files - panel1_data]
3152
        lea     esi, [esi+eax*4+0x20]
3153
        lea     edi, [edi+eax*4+0x20]
3154
        pop     eax
3155
        cmp     word [esi+40], '..'
3156
        jnz     @f
3157
        cmp     byte [esi+42], 0
3158
        jz      .less
3159
@@:     cmp     word [edi+40], '..'
3160
        jnz     @f
3161
        cmp     byte [edi+42], 0
3162
        jz      .greater
3163
@@:
3164
        cmp     edi, esi
3165
        ret
3166
.greater:
3167
        test    esi, esi
3168
        ret
3169
.less:
3170
        xor     edi, edi
3171
        stc
3172
        ret
3173
 
3174
compare_created:
3175
        push    eax
3176
        mov     eax, [ebp + panel1_nfa - panel1_data]
3177
        add     esi, [ebp + panel1_files - panel1_data]
3178
        add     edi, [ebp + panel1_files - panel1_data]
3179
        lea     esi, [esi+eax*4+0x20]
3180
        lea     edi, [edi+eax*4+0x20]
3181
        pop     eax
3182
        cmp     word [esi+40], '..'
3183
        jnz     @f
3184
        cmp     byte [esi+42], 0
3185
        jz      .less
3186
@@:     cmp     word [edi+40], '..'
3187
        jnz     @f
3188
        cmp     byte [edi+42], 0
3189
        jz      .greater
3190
@@:
3191
        test    byte [esi], 10h
3192
        jnz     .1dir
3193
        test    byte [edi], 10h
3194
        jnz     .greater
3195
.eq1:
3196
        push    edi
3197
        mov     edi, [edi+12]
3198
        cmp     edi, [esi+12]
3199
        pop     edi
3200
        jnz     @f
3201
        push    edi
3202
        mov     edi, [edi+8]
3203
        cmp     edi, [esi+8]
3204
        pop     edi
3205
        jnz     @f
3206
        add     esi, 40
3207
        add     edi, 40
3208
        jmp     strcmpi
3209
@@:
3210
        ret
3211
.greater:
3212
        test    esi, esi
3213
        ret
3214
.1dir:
3215
        test    byte [edi], 10h
3216
        jnz     .eq1
3217
.less:
3218
        xor     edi, edi
3219
        stc
3220
        ret
3221
 
3222
compare_created_rev:
3223
        push    eax
3224
        mov     eax, [ebp + panel1_nfa - panel1_data]
3225
        add     esi, [ebp + panel1_files - panel1_data]
3226
        add     edi, [ebp + panel1_files - panel1_data]
3227
        lea     esi, [esi+eax*4+0x20]
3228
        lea     edi, [edi+eax*4+0x20]
3229
        pop     eax
3230
        cmp     word [esi+40], '..'
3231
        jnz     @f
3232
        cmp     byte [esi+42], 0
3233
        jz      .less
3234
@@:     cmp     word [edi+40], '..'
3235
        jnz     @f
3236
        cmp     byte [edi+42], 0
3237
        jz      .greater
3238
@@:
3239
        test    byte [esi], 10h
3240
        jnz     .1dir
3241
        test    byte [edi], 10h
3242
        jnz     .greater
3243
.eq1:
3244
        push    esi
3245
        mov     esi, [esi+12]
3246
        cmp     esi, [edi+12]
3247
        pop     esi
3248
        jnz     @f
3249
        push    esi
3250
        mov     esi, [esi+8]
3251
        cmp     esi, [edi+8]
3252
        pop     esi
3253
        jnz     @f
3254
        add     esi, 40
3255
        add     edi, 40
3256
        xchg    esi, edi
3257
        jmp     strcmpi
3258
@@:
3259
        ret
3260
.greater:
3261
        test    esi, esi
3262
        ret
3263
.1dir:
3264
        test    byte [edi], 10h
3265
        jnz     .eq1
3266
.less:
3267
        xor     edi, edi
3268
        stc
3269
        ret
3270
 
3271
compare_accessed:
3272
        push    eax
3273
        mov     eax, [ebp + panel1_nfa - panel1_data]
3274
        add     esi, [ebp + panel1_files - panel1_data]
3275
        add     edi, [ebp + panel1_files - panel1_data]
3276
        lea     esi, [esi+eax*4+0x20]
3277
        lea     edi, [edi+eax*4+0x20]
3278
        pop     eax
3279
        cmp     word [esi+40], '..'
3280
        jnz     @f
3281
        cmp     byte [esi+42], 0
3282
        jz      .less
3283
@@:     cmp     word [edi+40], '..'
3284
        jnz     @f
3285
        cmp     byte [edi+42], 0
3286
        jz      .greater
3287
@@:
3288
        test    byte [esi], 10h
3289
        jnz     .1dir
3290
        test    byte [edi], 10h
3291
        jnz     .greater
3292
.eq1:
3293
        push    edi
3294
        mov     edi, [edi+20]
3295
        cmp     edi, [esi+20]
3296
        pop     edi
3297
        jnz     @f
3298
        push    edi
3299
        mov     edi, [edi+16]
3300
        cmp     edi, [esi+16]
3301
        pop     edi
3302
        jnz     @f
3303
        add     esi, 40
3304
        add     edi, 40
3305
        jmp     strcmpi
3306
@@:
3307
        ret
3308
.greater:
3309
        test    esi, esi
3310
        ret
3311
.1dir:
3312
        test    byte [edi], 10h
3313
        jnz     .eq1
3314
.less:
3315
        xor     edi, edi
3316
        stc
3317
        ret
3318
 
3319
compare_accessed_rev:
3320
        push    eax
3321
        mov     eax, [ebp + panel1_nfa - panel1_data]
3322
        add     esi, [ebp + panel1_files - panel1_data]
3323
        add     edi, [ebp + panel1_files - panel1_data]
3324
        lea     esi, [esi+eax*4+0x20]
3325
        lea     edi, [edi+eax*4+0x20]
3326
        pop     eax
3327
        cmp     word [esi+40], '..'
3328
        jnz     @f
3329
        cmp     byte [esi+42], 0
3330
        jz      .less
3331
@@:     cmp     word [edi+40], '..'
3332
        jnz     @f
3333
        cmp     byte [edi+42], 0
3334
        jz      .greater
3335
@@:
3336
        test    byte [esi], 10h
3337
        jnz     .1dir
3338
        test    byte [edi], 10h
3339
        jnz     .greater
3340
.eq1:
3341
        push    esi
3342
        mov     esi, [esi+20]
3343
        cmp     esi, [edi+20]
3344
        pop     esi
3345
        jnz     @f
3346
        push    esi
3347
        mov     esi, [esi+16]
3348
        cmp     esi, [edi+16]
3349
        pop     esi
3350
        jnz     @f
3351
        add     esi, 40
3352
        add     edi, 40
3353
        xchg    esi, edi
3354
        jmp     strcmpi
3355
@@:
3356
        ret
3357
.greater:
3358
        test    esi, esi
3359
        ret
3360
.1dir:
3361
        test    byte [edi], 10h
3362
        jnz     .eq1
3363
.less:
3364
        xor     edi, edi
3365
        stc
3366
        ret
3367
 
283 diamond 3368
if 0
180 heavyiron 3369
match_mask:
3370
; in: esi->name, edi->mask
3371
; out: CF clear <=> match
3372
        pusha
3373
        xchg    esi, edi
3374
.main_cycle:
3375
        push    esi
3376
@@:
3377
        lodsb
3378
        test    al, al
3379
        jz      @f
3380
        cmp     al, ','
3381
        jz      @f
3382
        cmp     al, '|'
3383
        jnz     @b
3384
@@:
3385
        mov     [esi-1], byte 0
3386
        xchg    esi, [esp]
3387
        call    match_single_mask
3388
        pop     esi
3389
        mov     [esi-1], al
3390
        jnc     .found
3391
        cmp     al, ','
3392
        jz      .main_cycle
3393
.done_fail:
3394
        stc
3395
        popa
3396
        ret
3397
.found:
3398
        test    al, al
3399
        jz      .done_succ
3400
        cmp     al, '|'
3401
        jz      .test_exclude
3402
        lodsb
3403
        jmp     .found
3404
.done_succ:
3405
        clc
3406
        popa
3407
        ret
3408
.test_exclude:
3409
        push    esi
3410
@@:
3411
        lodsb
3412
        test    al, al
3413
        jz      @f
3414
        cmp     al, ','
3415
        jnz     @b
3416
@@:
3417
        mov     byte [esi-1], 0
3418
        xchg    esi, [esp]
3419
        call    match_single_mask
3420
        pop     esi
3421
        mov     [esi-1], al
3422
        jnc     .done_fail
3423
        test    al, al
3424
        jz      .done_succ
3425
        jmp     .test_exclude
3426
 
3427
match_single_mask:
3428
; in: esi->mask, edi->name
3429
; out: CF clear <=> match
3430
        pusha
3431
.mask_symbol:
3432
        lodsb
3433
        test    al, al
3434
        jz      .mask_done
3435
        cmp     al, '*'
3436
        jz      .asterisk
3437
        cmp     al, '?'
3438
        jz      .quest
3439
        cmp     al, '['
3440
        jz      .list
3441
        call    match_symbol
3442
        jnz     .done_fail
3443
        inc     edi
3444
        jmp     .mask_symbol
3445
.done_fail:
3446
        stc
3447
        popa
3448
        ret
3449
.mask_done:
3450
        scasb
3451
        jnz     .done_fail
3452
.done_succ:
3453
        clc
3454
        popa
3455
        ret
3456
.quest:
3457
        mov     al, 0
3458
        scasb
3459
        jz      .done_fail
3460
        jmp     .mask_symbol
3461
.list:
3462
        lodsb
3463
        cmp     al, ']'
3464
        jz      .done_fail
3465
        cmp     byte [esi+1], '-'
3466
        jz      .range
3467
        call    match_symbol
3468
        jnz     .list
3469
.listok:
3470
        inc     edi
3471
@@:
3472
        lodsb
3473
        cmp     al, ']'
3474
        jnz     @b
3475
        jmp     .mask_symbol
3476
.range:
3477
        call    match_symbol
3478
        ja      @f
3479
        mov     al, [esi+2]
3480
        call    match_symbol
3481
        jae     .listok
3482
@@:
3483
        inc     esi
3484
        jmp     .list
3485
.asterisk:
283 diamond 3486
        cmp     byte [esi], 0
3487
        jz      .done_succ
3488
        cmp     byte [esi], '?'
3489
        jnz     @f
3490
        mov     al, 0
3491
        scasb
3492
        jz      .done_fail
3493
        inc     esi
3494
        jmp     .asterisk
3495
@@:
3496
        cmp     byte [esi], '['
3497
        jz      .asterisk_common
3498
; the mask is ...*...
3499
.asterisk_normal:
3500
        mov     al, [esi]
3501
@@:
3502
        cmp     byte [edi], 0
3503
        jz      .done_fail
3504
        call    match_symbol
3505
        jz      @f
3506
        inc     edi
3507
        jmp     @b
3508
@@:
3509
        inc     edi
3510
        inc     esi
3511
        call    match_single_mask
3512
        jnc     .done_succ
3513
        dec     esi
3514
        jmp     .asterisk_normal
3515
.asterisk_common:
180 heavyiron 3516
        push    edi
3517
@@:
3518
        call    match_single_mask
3519
        jnc     @f
3520
        mov     al, 0
3521
        scasb
3522
        jnz     @b
3523
        pop     edi
3524
        jmp     .done_fail
3525
@@:
3526
        pop     edi
3527
        jmp     .done_succ
3528
 
283 diamond 3529
match_mask_rev:
3530
; in: esi->name, edx->end of name, edi->mask
3531
; out: CF clear <=> match
3532
        pusha
3533
        xchg    esi, edx
3534
        xchg    esi, edi
3535
.main_cycle:
3536
        mov     ecx, esi
3537
@@:
3538
        lodsb
3539
        test    al, al
3540
        jz      @f
3541
        cmp     al, ','
3542
        jz      @f
3543
        cmp     al, '|'
3544
        jnz     @b
3545
@@:
3546
        dec     esi
3547
        mov     [esi], byte 0
3548
        call    match_single_mask_rev2
3549
        mov     [esi], al
3550
        inc     esi
3551
        jnc     .found
3552
        cmp     al, ','
3553
        jz      .main_cycle
3554
.done_fail:
3555
        stc
3556
        popa
3557
        ret
3558
.found:
3559
        test    al, al
3560
        jz      .done_succ
3561
        cmp     al, '|'
3562
        jz      .test_exclude
3563
        lodsb
3564
        jmp     .found
3565
.done_succ:
3566
        clc
3567
        popa
3568
        ret
3569
.test_exclude:
3570
        mov     ecx, esi
3571
@@:
3572
        lodsb
3573
        test    al, al
3574
        jz      @f
3575
        cmp     al, ','
3576
        jnz     @b
3577
@@:
3578
        dec     esi
3579
        mov     byte [esi], 0
3580
        call    match_single_mask_rev2
3581
        mov     [esi], al
3582
        inc     esi
3583
        jnc     .done_fail
3584
        test    al, al
3585
        jz      .done_succ
3586
        jmp     .test_exclude
3587
 
3588
match_single_mask_rev2:
3589
        pusha
3590
        jmp     match_single_mask_rev.mask_symbol
3591
match_single_mask_rev:
3592
; in: esi->mask, edi->end of name, edx->start of name
3593
; out: CF clear <=> match
3594
        pusha
3595
        mov     ecx, esi
3596
@@:
3597
        lodsb
3598
        test    al, al
3599
        jnz     @b
3600
        dec     esi
3601
; esi->end of mask, ecx->start of mask
3602
.mask_symbol:
3603
        dec     esi
3604
        cmp     esi, ecx
3605
        jb      .mask_done
3606
        mov     al, [esi]
3607
        cmp     al, '*'
3608
        jz      .asterisk
3609
        cmp     al, '?'
3610
        jz      .quest
3611
        cmp     al, ']'
3612
        jz      .list
3613
        dec     edi
3614
        cmp     edi, edx
3615
        jb      .done_fail
3616
        call    match_symbol
3617
        jz      .mask_symbol
3618
.done_fail:
3619
        stc
3620
        popa
3621
        ret
3622
.mask_done:
3623
        cmp     edi, edx
3624
        jnz     .done_fail
3625
.done_succ:
3626
        clc
3627
        popa
3628
        ret
3629
.quest:
3630
        dec     edi
3631
        cmp     edi, edx
3632
        jb      .done_fail
3633
        jmp     .mask_symbol
3634
.list:
3635
        dec     edi
3636
        cmp     edi, edx
3637
        jb      .done_fail
3638
.list_check:
3639
        dec     esi
3640
        cmp     esi, ecx
3641
        jbe     .done_fail
3642
        mov     al, [esi]
3643
        cmp     al, '['
3644
        jz      .done_fail
3645
        cmp     byte [esi-1], '-'
3646
        jz      .range
3647
        call    match_symbol
3648
        jnz     .list_check
3649
.listok:
3650
@@:
3651
        dec     esi
3652
        cmp     esi, ecx
3653
        jb      .done_fail
3654
        cmp     byte [esi], '['
3655
        jnz     @b
3656
        jmp     .mask_symbol
3657
.range:
3658
        call    match_symbol
3659
        jb      @f
3660
        mov     al, [esi-2]
3661
        call    match_symbol
3662
        jbe     .listok
3663
@@:
3664
        dec     esi
3665
        dec     esi
3666
        jmp     .list_check
3667
.asterisk:
3668
        cmp     esi, ecx
3669
        jz      .done_succ
3670
        cmp     byte [esi-1], '?'
3671
        jnz     @f
3672
        cmp     edi, edx
3673
        jz      .done_fail
3674
        dec     esi
3675
        jmp     .asterisk
3676
@@:
3677
        cmp     byte [esi-1], ']'
3678
        jz      .asterisk_common
3679
; the mask is ...*...
3680
.asterisk_normal:
3681
        mov     al, [esi-1]
3682
@@:
3683
        cmp     edi, edx
3684
        jz      .done_fail
3685
        call    match_symbol
3686
        jz      @f
3687
        dec     edi
3688
        jmp     @b
3689
@@:
3690
        dec     edi
3691
        dec     esi
3692
        call    match_single_mask_rev2
3693
        jnc     .done_succ
3694
        inc     esi
3695
        jmp     .asterisk_normal
3696
.asterisk_common:
3697
        push    edi
3698
@@:
3699
        call    match_single_mask_rev2
3700
        jnc     @f
3701
        dec     edi
3702
        cmp     edi, edx
3703
        jae     @b
3704
        pop     edi
3705
        jmp     .done_fail
3706
@@:
3707
        pop     edi
3708
        jmp     .done_succ
3709
end if
3710
 
180 heavyiron 3711
tolower:
3712
        cmp     al, 'A'
3713
        jb      @f
3714
        cmp     al, 'Z'
3715
        ja      @f
3716
        add     al, ' '
3717
@@:     ret
3718
 
3719
match_symbol:
3720
; in: al,[edi]=symbols
3721
; out: flags as 'cmp al,[edi]'
3722
        push    eax
3723
        call    tolower
3724
        mov     ah, [edi]
3725
        xchg    al, ah
3726
        call    tolower
3727
        cmp     ah, al
3728
        pop     eax
3729
        ret
3730
 
283 diamond 3731
match_mask_rev_lowercase:
3732
; in: esi->name, edx->end of name, edi->mask
3733
; out: CF clear <=> match
3734
        pusha
3735
        xchg    esi, edx
3736
        xchg    esi, edi
3737
.main_cycle:
3738
        mov     ecx, esi
3739
@@:
3740
        lodsb
3741
        test    al, al
3742
        jz      @f
3743
        cmp     al, ','
3744
        jz      @f
3745
        cmp     al, '|'
3746
        jnz     @b
3747
@@:
3748
        dec     esi
3749
        mov     [esi], byte 0
3750
        call    match_single_mask_rev_lowercase
3751
        mov     [esi], al
3752
        inc     esi
3753
        jnc     .found
3754
        cmp     al, ','
3755
        jz      .main_cycle
3756
.done_fail:
3757
        stc
3758
        popa
3759
        ret
3760
.found:
3761
        test    al, al
3762
        jz      .done_succ
3763
        cmp     al, '|'
3764
        jz      .test_exclude
3765
        lodsb
3766
        jmp     .found
3767
.done_succ:
3768
        clc
3769
        popa
3770
        ret
3771
.test_exclude:
3772
        mov     ecx, esi
3773
@@:
3774
        lodsb
3775
        test    al, al
3776
        jz      @f
3777
        cmp     al, ','
3778
        jnz     @b
3779
@@:
3780
        dec     esi
3781
        mov     byte [esi], 0
3782
        call    match_single_mask_rev_lowercase
3783
        mov     [esi], al
3784
        inc     esi
3785
        jnc     .done_fail
3786
        test    al, al
3787
        jz      .done_succ
3788
        jmp     .test_exclude
180 heavyiron 3789
 
283 diamond 3790
match_single_mask_rev_lowercase:
3791
; in: esi->end of mask, ecx->start of mask, edi->end of name, edx->start of name
3792
; out: CF clear <=> match
3793
        push    esi edi eax
3794
.mask_symbol:
3795
        dec     esi
3796
        cmp     esi, ecx
3797
        jb      .mask_done
3798
        mov     al, [esi]
3799
        cmp     al, '*'
3800
        jz      .asterisk
3801
        cmp     al, '?'
3802
        jz      .quest
3803
        cmp     al, ']'
3804
        jz      .list
3805
        dec     edi
3806
        cmp     edi, edx
3807
        jb      .done_fail
3808
        cmp     al, [edi]
3809
        jz      .mask_symbol
3810
.done_fail:
3811
        stc
3812
        pop     eax edi esi
3813
        ret
3814
.mask_done:
3815
        cmp     edi, edx
3816
        jnz     .done_fail
3817
.done_succ:
3818
        clc
3819
        pop     eax edi esi
3820
        ret
3821
.quest:
3822
        dec     edi
3823
        cmp     edi, edx
3824
        jb      .done_fail
3825
        jmp     .mask_symbol
3826
.list:
3827
        dec     edi
3828
        cmp     edi, edx
3829
        jb      .done_fail
3830
.list_check:
3831
        dec     esi
3832
        cmp     esi, ecx
3833
        jbe     .done_fail
3834
        mov     al, [esi]
3835
        cmp     al, '['
3836
        jz      .done_fail
3837
        cmp     byte [esi-1], '-'
3838
        jz      .range
3839
        cmp     al, [edi]
3840
        jnz     .list_check
3841
.listok:
3842
@@:
3843
        dec     esi
3844
        cmp     esi, ecx
3845
        jb      .done_fail
3846
        cmp     byte [esi], '['
3847
        jnz     @b
3848
        jmp     .mask_symbol
3849
.range:
3850
        cmp     al, [edi]
3851
        jb      @f
3852
        mov     al, [esi-2]
3853
        cmp     al, [edi]
3854
        jbe     .listok
3855
@@:
3856
        dec     esi
3857
        dec     esi
3858
        jmp     .list_check
3859
.asterisk:
3860
        cmp     esi, ecx
3861
        jz      .done_succ
3862
        cmp     byte [esi-1], '?'
3863
        jnz     @f
3864
        cmp     edi, edx
3865
        jz      .done_fail
3866
        dec     esi
3867
        jmp     .asterisk
3868
@@:
3869
        cmp     byte [esi-1], ']'
3870
        jz      .asterisk_common
3871
; the mask is ...*...
3872
.asterisk_normal:
3873
        mov     al, [esi-1]
3874
@@:
3875
        cmp     edi, edx
3876
        jz      .done_fail
3877
        cmp     al, [edi]
3878
        jz      @f
3879
        dec     edi
3880
        jmp     @b
3881
@@:
3882
        dec     edi
3883
        dec     esi
3884
        call    match_single_mask_rev_lowercase
3885
        jnc     .done_succ
3886
        inc     esi
3887
        jmp     .asterisk_normal
3888
.asterisk_common:
3889
        push    edi
3890
@@:
3891
        call    match_single_mask_rev_lowercase
3892
        jnc     @f
3893
        dec     edi
3894
        cmp     edi, edx
3895
        jae     @b
3896
        pop     edi
3897
        jmp     .done_fail
3898
@@:
3899
        pop     edi
3900
        jmp     .done_succ
180 heavyiron 3901
 
283 diamond 3902
find_extension:
3903
        lea     esi, [ecx+40]
3904
        push    esi
3905
@@:
3906
        lodsb
3907
        test    al, al
3908
        jnz     @b
3909
@@:
3910
        dec     esi
3911
        cmp     byte [esi], '.'
3912
        jz      .found_ext
3913
        cmp     esi, [esp]
3914
        ja      @b
3915
; empty extension
3916
        pop     esi
3917
        stc
3918
        ret
3919
.found_ext:
3920
        inc     esi
3921
        mov     edi, associations
3922
@@:
3923
        push    esi edi
3924
        mov     edi, [edi]
3925
        call    strcmpi
3926
        pop     edi esi
3927
        jz      @f
3928
        add     edi, 12
3929
        cmp     edi, associations_end
3930
        jb      @b
3931
; unknown extension
3932
        inc     edi
3933
@@:
3934
        pop     esi
3935
        ret
3936
 
3937
header  db      'Kolibri Far 0.19',0
3938
 
180 heavyiron 3939
nomem_draw      db      'No memory for redraw.',0
3940
.size = $ - nomem_draw
3941
 
3942
def_left_dir    db      '/rd/1',0
3943
def_right_dir   db      '/hd0/1',0
3944
 
3945
if lang eq ru
3946
aFolder         db      'Папка'
3947
.size = $-aFolder
3948
aUp             db      'Вверх'
3949
.size = $-aUp
3950
aDrive          db      'Диск',0
3951
aScreens        db      'Экраны',0
3952
else
3953
aFolder         db      'Folder'
3954
.size = $-aFolder
3955
aUp             db      'Up'
3956
.size = $-aUp
3957
aDrive          db      'Drive',0
3958
aScreens        db      'Screens',0
3959
end if
3960
 
3961
_10d dd 10
3962
_100d dd 100
3963
_10 db 10
3964
_100 db 100
3965
 
3966
fpu_cw  dw      000011100111111b
3967
 
3968
keybar_panels:
3969
if lang eq ru
3970
; без клавиш-модификаторов
3971
        db      'Помощь'
3972
        db      'ПользМ'
3973
        db      'Просм '
3974
        db      'Редакт'
3975
        db      'Копир '
3976
        db      'Перен '
3977
        db      'Папка '
3978
        db      'Удален'
3979
        db      'КонфМн'
3980
        db      'Выход '
3981
        db      'Модули'
3982
        db      'Экраны'
3983
; Shift
3984
        db      'Добавл'
3985
        db      'Распак'
3986
        db      'АрхКом'
3987
        db      'Редак.'
3988
        db      'Копир '
3989
        db      'Переим'
3990
        db      '      '
3991
        db      'Удален'
3992
        db      'Сохран'
3993
        db      'Послдн'
3994
        db      'Группы'
3995
        db      'Выбран'
3996
; Ctrl
3997
        db      'Левая '
3998
        db      'Правая'
3999
        db      'Имя   '
4000
        db      'Расшир'
4001
        db      'Модиф '
4002
        db      'Размер'
4003
        db      'Несорт'
4004
        db      'Создан'
4005
        db      'Доступ'
4006
        db      'Описан'
4007
        db      'Владел'
4008
        db      'Сорт  '
4009
; Ctrl+Shift
4010
        db      '      '
4011
        db      '      '
4012
        db      'Просм '
4013
        db      'Редакт'
4014
        db      '      '
4015
        db      '      '
4016
        db      '      '
4017
        db      '      '
4018
        db      '      '
4019
        db      '      '
4020
        db      '      '
4021
        db      '      '
4022
; Alt
4023
        db      'Левая '
4024
        db      'Правая'
4025
        db      'Смотр.'
4026
        db      'Редак.'
4027
        db      'Печать'
4028
        db      'Связь '
4029
        db      'Искать'
4030
        db      'Истор '
4031
        db      'Видео '
4032
        db      'Дерево'
4033
        db      'ИстПр '
4034
        db      'ИстПап'
4035
; Alt+Shift
4036
        db      '      '
4037
        db      '      '
4038
        db      '      '
4039
        db      '      '
4040
        db      '      '
4041
        db      '      '
4042
        db      '      '
4043
        db      '      '
4044
        db      'КонфПл'
4045
        db      '      '
4046
        db      '      '
4047
        db      '      '
4048
; Alt+Ctrl
4049
times 12 db     '      '
4050
; Alt+Ctrl+Shift
4051
times 12 db     '      '
4052
else
4053
; No modificators
4054
        db      'Help  '
4055
        db      'UserMn'
4056
        db      'View  '
4057
        db      'Edit  '
4058
        db      'Copy  '
4059
        db      'RenMov'
4060
        db      'MkFold'
4061
        db      'Delete'
4062
        db      'ConfMn'
4063
        db      'Quit  '
4064
        db      'Plugin'
4065
        db      'Screen'
4066
; Shift
4067
        db      'Add   '
4068
        db      'Extrct'
4069
        db      'ArcCmd'
4070
        db      'Edit..'
4071
        db      'Copy  '
4072
        db      'Rename'
4073
        db      '      '
4074
        db      'Delete'
4075
        db      'Save  '
4076
        db      'Last  '
4077
        db      'Group '
4078
        db      'SelUp '
4079
; Ctrl
4080
        db      'Left  '
4081
        db      'Right '
4082
        db      'Name  '
4083
        db      'Extens'
4084
        db      'Modifn'
4085
        db      'Size  '
4086
        db      'Unsort'
4087
        db      'Creatn'
4088
        db      'Access'
4089
        db      'Descr '
4090
        db      'Owner '
4091
        db      'Sort  '
4092
; Ctrl+Shift
4093
        db      '      '
4094
        db      '      '
4095
        db      'View  '
4096
        db      'Edit  '
4097
        db      '      '
4098
        db      '      '
4099
        db      '      '
4100
        db      '      '
4101
        db      '      '
4102
        db      '      '
4103
        db      '      '
4104
        db      '      '
4105
; Alt
4106
        db      'Left  '
4107
        db      'Right '
4108
        db      'View..'
4109
        db      'Edit..'
4110
        db      'Print '
4111
        db      'MkLink'
4112
        db      'Find  '
4113
        db      'Histry'
4114
        db      'Video '
4115
        db      'Tree  '
4116
        db      'ViewHs'
4117
        db      'FoldHs'
4118
; Alt+Shift
4119
        db      '      '
4120
        db      '      '
4121
        db      '      '
4122
        db      '      '
4123
        db      '      '
4124
        db      '      '
4125
        db      '      '
4126
        db      '      '
4127
        db      'ConfPl'
4128
        db      '      '
4129
        db      '      '
4130
        db      '      '
4131
; Alt+Ctrl
4132
times 12 db     '      '
4133
; Alt+Ctrl+Shift
4134
times 12 db     '      '
4135
end if
4136
 
4137
keybar_viewer:
4138
if lang eq ru
4139
; без клавиш-модификаторов
4140
        db      'Помощь'
4141
        db      'Развер'
4142
        db      'Выход '
4143
        db      'Код   '
4144
        db      '      '
4145
        db      'Редакт'
4146
        db      'Поиск '
4147
keybar_cp:
4148
        db      'cp1251'
4149
        db      '      '
4150
        db      'Выход '
4151
        db      'Модули'
4152
        db      'Экраны'
4153
; Shift
4154
        db      '      '
4155
        db      'Слова '
4156
        db      '      '
4157
        db      '      '
4158
        db      '      '
4159
        db      '      '
4160
        db      'Дальше'
4161
        db      'Таблиц'
4162
        db      '      '
4163
        db      '      '
4164
        db      '      '
4165
        db      '      '
4166
; Ctrl
4167
        db      '      '
4168
        db      '      '
4169
        db      '      '
4170
        db      '      '
4171
        db      '      '
4172
        db      '      '
4173
        db      '      '
4174
        db      '      '
4175
        db      '      '
4176
        db      'Позиц '
4177
        db      '      '
4178
        db      '      '
4179
; Ctrl+Shift
4180
        db      '      '
4181
        db      '      '
4182
        db      '      '
4183
        db      '      '
4184
        db      '      '
4185
        db      '      '
4186
        db      '      '
4187
        db      '      '
4188
        db      '      '
4189
        db      '      '
4190
        db      '      '
4191
        db      '      '
4192
; Alt
4193
        db      '      '
4194
        db      '      '
4195
        db      '      '
4196
        db      '      '
4197
        db      'Печать'
4198
        db      '      '
4199
        db      'Назад '
4200
        db      'Перейт'
4201
        db      'Видео '
4202
        db      '      '
4203
        db      'ИстПр '
4204
        db      '      '
4205
; Alt+Shift
4206
        db      '      '
4207
        db      '      '
4208
        db      '      '
4209
        db      '      '
4210
        db      '      '
4211
        db      '      '
4212
        db      '      '
4213
        db      '      '
4214
        db      'Конфиг'
4215
        db      '      '
4216
        db      '      '
4217
        db      '      '
4218
; Alt+Ctrl
4219
times 12 db     '      '
4220
; Alt+Ctrl+Shift
4221
times 12 db     '      '
4222
else
4223
; No modificators
4224
        db      'Help  '
4225
        db      'Unwrap'
4226
        db      'Quit  '
4227
        db      'Hex   '
4228
        db      '      '
4229
        db      'Edit  '
4230
        db      'Search'
4231
keybar_cp:
4232
        db      'cp1251'
4233
        db      '      '
4234
        db      'Quit  '
4235
        db      'Plugin'
4236
        db      'Screen'
4237
; Shift
4238
        db      '      '
4239
        db      'WWrap '
4240
        db      '      '
4241
        db      '      '
4242
        db      '      '
4243
        db      '      '
4244
        db      'Next  '
4245
        db      'Table '
4246
        db      '      '
4247
        db      '      '
4248
        db      '      '
4249
        db      '      '
4250
; Ctrl
4251
        db      '      '
4252
        db      '      '
4253
        db      '      '
4254
        db      '      '
4255
        db      '      '
4256
        db      '      '
4257
        db      '      '
4258
        db      '      '
4259
        db      '      '
4260
        db      'GoFile'
4261
        db      '      '
4262
        db      '      '
4263
; Ctrl+Shift
4264
        db      '      '
4265
        db      '      '
4266
        db      '      '
4267
        db      '      '
4268
        db      '      '
4269
        db      '      '
4270
        db      '      '
4271
        db      '      '
4272
        db      '      '
4273
        db      '      '
4274
        db      '      '
4275
        db      '      '
4276
; Alt
4277
        db      '      '
4278
        db      '      '
4279
        db      '      '
4280
        db      '      '
4281
        db      'Print '
4282
        db      '      '
4283
        db      'Prev  '
4284
        db      'Goto  '
4285
        db      'Video '
4286
        db      '      '
4287
        db      'ViewHs'
4288
        db      '      '
4289
; Alt+Shift
4290
        db      '      '
4291
        db      '      '
4292
        db      '      '
4293
        db      '      '
4294
        db      '      '
4295
        db      '      '
4296
        db      '      '
4297
        db      '      '
4298
        db      'Config'
4299
        db      '      '
4300
        db      '      '
4301
        db      '      '
4302
; Alt+Ctrl
4303
times 12 db     '      '
4304
; Alt+Ctrl+Shift
4305
times 12 db     '      '
4306
end if
4307
 
4308
        align   4
4309
cur_width       dd      80
4310
cur_height      dd      25
283 diamond 4311
saved_width     dd      -1
4312
saved_height    dd      -1
180 heavyiron 4313
max_width = 256
4314
max_height = 256
283 diamond 4315
console_data_ptr dd     0
180 heavyiron 4316
 
283 diamond 4317
cursor_x        dd      -1
4318
cursor_y        dd      -1
4319
old_cursor_x    dd      -1
4320
old_cursor_y    dd      -1
4321
 
180 heavyiron 4322
active_panel    dd      panel1_data
4323
 
4324
console_colors  dd      0x000000, 0x000080, 0x008000, 0x008080
4325
                dd      0x800000, 0x800080, 0x808000, 0xC0C0C0
4326
                dd      0x808080, 0x0000FF, 0x00FF00, 0x00FFFF
4327
                dd      0xFF0000, 0xFF00FF, 0xFFFF00, 0xFFFFFF
4328
 
4329
compare_fns     dd      compare_name
4330
                dd      compare_name_rev
4331
                dd      compare_ext
4332
                dd      compare_ext_rev
4333
                dd      compare_modified
4334
                dd      compare_modified_rev
4335
                dd      compare_size
4336
                dd      compare_size_rev
4337
                dd      compare_unordered
4338
                dd      compare_unordered_rev
4339
                dd      compare_created
4340
                dd      compare_created_rev
4341
                dd      compare_accessed
4342
                dd      compare_accessed_rev
4343
 
4344
ctrlkey_tests   dd      ctrlkey_test0
4345
                dd      ctrlkey_test1
4346
                dd      ctrlkey_test2
4347
                dd      ctrlkey_test3
4348
                dd      ctrlkey_test4
4349
ctrlkey_tests_num = 5
4350
 
4351
virtual at 0
4352
screen_vtable:
4353
        .OnRedraw       dd      ?
4354
        .OnKey          dd      ?
4355
        .keybar         dd      ?
4356
        .getname        dd      ?
4357
end virtual
4358
 
4359
panels_vtable:
4360
        dd      panels_OnRedraw
4361
        dd      panels_OnKey
4362
        dd      keybar_panels
4363
        dd      panels_getname
4364
 
4365
viewer_vtable:
4366
        dd      viewer_OnRedraw
4367
        dd      viewer_OnKey
4368
        dd      keybar_viewer
4369
        dd      viewer_getname
4370
 
4371
encodings:
4372
.cp866 = 0
4373
.cp1251 = 1
4374
 
4375
.names:
4376
        db      'cp866   '
4377
        db      'cp1251  '
4378
 
4379
.tables:
4380
; cp866 - trivial map
4381
        times 128 db %+127
4382
; cp1251
4383
        db      0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8,0x3F,0x25,0x3F,0x3C,0x3F,0x3F,0x3F,0x3F
4384
        db      0x3F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D,0x3F,0x54,0x3F,0x3E,0x3F,0x3F,0x3F,0x3F
4385
        db      0xFF,0xF6,0xF7,0x3F,0xFD,0x3F,0xB3,0x15,0xF0,0x63,0xF2,0x3C,0xBF,0x2D,0x52,0xF4
4386
        db      0xF8,0x2B,0x49,0x69,0x3F,0xE7,0x14,0xFA,0xF1,0xFC,0xF3,0x3E,0x3F,0x3F,0x3F,0xF5
4387
        times 0x30 db %-1+0x80
4388
        times 0x10 db %-1+0xE0
4389
 
4390
active_screen   dd      0
4391
tabsize         dd      8
4392
 
4393
ascii2scan:
4394
        times 32 db 0
4395
        db      0x39,0x02,0x03,0x04,0x05,0x06,0x08,0x28,0x0A,0x0B,0x09,0x0D,0x33,0x0C,0x34,0x35
4396
        db      0x0B,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x27,0x27,0x33,0x0D,0x34,0x35
4397
        db      0x03,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
4398
        db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x07,0x0C
4399
        db      0x29,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
4400
        db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x29,0x00
4401
        db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
4402
        db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
4403
        db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
4404
        times 48 db 0
4405
        db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
4406
        db      0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
4407
 
4408
; Клавишные сочетания
4409
; db scancode, reserved
4410
; dw ctrlstate
4411
; dd handler
4412
; ctrlstate: младшие 4 бита - для Shift, следующие - для Ctrl, следующие - для Alt
4413
; 0 = ни одна клавиша не нажата
4414
; 1 = ровно одна нажата
4415
; 2 = обе нажаты
4416
; 3 = левая нажата, правая нет
4417
; 4 = правая нажата, левая нет
4418
panels_ctrlkeys:
4419
        dw      0x48, 0
4420
        dd      panels_OnKey.up
4421
        dw      0x50, 0
4422
        dd      panels_OnKey.down
4423
        dw      0x4B, 0
4424
        dd      panels_OnKey.left
4425
        dw      0x4D, 0
4426
        dd      panels_OnKey.right
4427
        dw      0xF, 0
4428
        dd      panels_OnKey.tab
4429
        dw      0x47, 0
4430
        dd      panels_OnKey.home
4431
        dw      0x4F, 0
4432
        dd      panels_OnKey.end
4433
        dw      0x1C, 0
4434
        dd      panels_OnKey.enter
4435
        dw      0x3D, 0
4436
        dd      panels_OnKey.f3
283 diamond 4437
        dw      0x3F, 0
4438
        dd      panels_OnKey.f5
4439
        dw      0x3F, 1
4440
        dd      panels_OnKey.shift_f5
180 heavyiron 4441
        dw      0x42, 0
4442
        dd      panels_OnKey.f8
283 diamond 4443
        dw      0x43, 0x100
4444
        dd      alt_f9
180 heavyiron 4445
        dw      0x44, 0
4446
        dd      exit
283 diamond 4447
        dw      0x5D, 0
4448
        dd      panels_OnKey.menu
180 heavyiron 4449
repeat 9-3+1
4450
        dw      0x3D+%-1, 0x10
4451
        dd      panels_OnKey.ctrl_f39
4452
end repeat
4453
        dw      0x3B, 0x100
4454
        dd      panels_OnKey.alt_f12
4455
        dw      0x3C, 0x100
4456
        dd      panels_OnKey.alt_f12
4457
        dw      0x58, 0
4458
        dd      F12
4459
        dw      0x13, 0x10
4460
        dd      panels_OnKey.ctrl_r
4461
        db      0
4462
 
4463
viewer_ctrlkeys:
4464
        dw      1, 0
4465
        dd      viewer_OnKey.exit
4466
        dw      0x51, 0
4467
        dd      viewer_OnKey.pgdn
4468
        dw      0x49, 0
4469
        dd      viewer_OnKey.pgup
4470
        dw      0x50, 0
4471
        dd      viewer_OnKey.down
4472
        dw      0x48, 0
4473
        dd      viewer_OnKey.up
4474
        dw      0x4B, 0
4475
        dd      viewer_OnKey.left
4476
        dw      0x4B, 0x10
4477
        dd      viewer_OnKey.ctrl_left
4478
        dw      0x4B, 0x11
4479
        dd      viewer_OnKey.ctrl_shift_left
4480
        dw      0x4C, 0
4481
        dd      viewer_OnKey.exit
4482
        dw      0x4D, 0
4483
        dd      viewer_OnKey.right
4484
        dw      0x4D, 0x10
4485
        dd      viewer_OnKey.ctrl_right
4486
        dw      0x4D, 0x11
4487
        dd      viewer_OnKey.ctrl_shift_right
4488
        dw      0x3C, 0
4489
        dd      viewer_OnKey.f2
4490
        dw      0x3D, 0
4491
        dd      viewer_OnKey.exit
4492
        dw      0x3E, 0
4493
        dd      viewer_OnKey.f4
4494
        dw      0x42, 0
4495
        dd      viewer_OnKey.f8
4496
        dw      0x44, 0
4497
        dd      viewer_OnKey.exit
4498
        dw      0x47, 0
4499
        dd      viewer_OnKey.home
4500
        dw      0x4F, 0
4501
        dd      viewer_OnKey.end
4502
        dw      0x58, 0
4503
        dd      F12
283 diamond 4504
        dw      0x43, 0x100
4505
        dd      alt_f9
180 heavyiron 4506
        db      0
4507
 
4508
dirinfo:
4509
                dd      1
4510
.first          dd      0
4511
                dd      0
4512
.size           dd      300
4513
.dirdata        dd      0
4514
                db      0
4515
.name           dd      0
4516
 
4517
readinfo:
4518
                dd      0
4519
.first          dq      0
4520
.size           dd      0
4521
.data           dd      0
4522
                db      0
4523
.name           dd      0
4524
 
283 diamond 4525
writeinfo:
4526
.code           dd      2
4527
.first          dq      0
4528
.size           dd      0
4529
.data           dd      0
4530
                db      0
4531
.name           dd      0
4532
 
180 heavyiron 4533
attrinfo:
4534
                dd      5
4535
                dd      0
4536
                dd      0
4537
                dd      0
4538
                dd      .attr
4539
                db      0
4540
.name           dd      0
4541
 
4542
delinfo:
4543
                dd      8
4544
                dd      0
4545
                dd      0
4546
                dd      0
4547
                dd      0
4548
                db      0
4549
                dd      execdata
4550
 
4551
if lang eq ru
4552
compare_names   db      'иИрРмМаАнНсСдД'
4553
else
4554
compare_names   db      'nNxXmMsSuUcCaA'
4555
end if
4556
 
183 diamond 4557
; Здесь начинаются конфигурационные данные - в текущей реализации они зашиты в бинарник
4558
 
180 heavyiron 4559
; Панель
4560
panel_normal_color      db      1Bh
4561
panel_border_color      db      1Bh
4562
panel_cursor_color      db      30h
4563
panel_header_color      db      1Bh
4564
panel_active_header_color db    30h
4565
column_header_color     db      1Eh
4566
panel_nscreens_color    db      0Bh
183 diamond 4567
; Диалоги
4568
dialog_main_color       db      70h
4569
dialog_border_color     db      70h
4570
dialog_header_color     db      70h
4571
dialog_normal_btn_color db      70h
4572
dialog_selected_btn_color db    30h
283 diamond 4573
dialog_edit_color       db      30h
4574
dialog_unmodified_edit_color db 38h
180 heavyiron 4575
; Меню
4576
menu_normal_color       db      3Fh
4577
menu_selected_color     db      0Fh
4578
menu_highlight_color    db      3Eh
4579
menu_selected_highlight_color db 0Eh
4580
menu_border_color       db      3Fh
4581
menu_header_color       db      3Fh
4582
menu_scrollbar_color    db      3Fh
4583
; Линейка клавиш
4584
keybar_number_color     db      7
4585
keybar_name_color       db      30h
4586
keybar_bgr_color        db      7
4587
; Командная строка
4588
cmdbar_normal_color     db      7
4589
cmdbar_prefix_color     db      7
4590
; Просмотрщик
4591
view_normal_color       db      1Bh
4592
view_status_color       db      30h
4593
view_arrows_color       db      1Eh
4594
 
4595
; Подсветка файлов
4596
highlight_num_groups    dd      10
4597
highlight_groups        dd      highlight_group0
4598
                dd      highlight_group1
4599
                dd      highlight_group2
4600
                dd      highlight_group3
4601
                dd      highlight_group4
4602
                dd      highlight_group5
4603
                dd      highlight_group6
4604
                dd      highlight_group7
4605
                dd      highlight_group8
4606
                dd      highlight_group9
4607
 
4608
; Формат описания группы подсветки:
4609
virtual at 0
4610
highlight:
4611
        .NormalColor            db ?
4612
        .CursorColor            db ?
4613
        .IncludeAttributes      db ?
4614
        .Mask:                  ; ASCIIZ-string
4615
end virtual
4616
 
283 diamond 4617
; all highlight masks must be in lowercase!
180 heavyiron 4618
highlight_group0:
4619
        db      13h
4620
        db      38h
4621
        db      2
4622
        db      '*',0
4623
highlight_group1:
4624
        db      13h
4625
        db      38h
4626
        db      4
4627
        db      '*',0
4628
highlight_group2:
4629
        db      1Fh
4630
        db      3Fh
4631
        db      10h
4632
        db      '*|..',0
4633
highlight_group3:
4634
        db      0
4635
        db      0
4636
        db      10h
4637
        db      '..',0
4638
highlight_group4:
4639
        db      1Ah
4640
        db      3Ah
4641
        db      0
4642
        db      '*.exe,*.com,*.bat,*.cmd',0
4643
highlight_group5:
4644
        db      1Ah
4645
        db      3Ah
4646
        db      0
4647
        db      '*|*.*',0
4648
highlight_group6:
4649
        db      1Dh
4650
        db      3Dh
4651
        db      0
4652
        db      '*.rar,*.zip,*.[zj],*.[bg7]z,*.[bg]zip,*.tar,*.t[ag]z,*.ar[cj],*.r[0-9][0-9],'
4653
        db      '*.a[0-9][0-9],*.bz2,*.cab,*.msi,*.jar,*.lha,*.lzh,*.ha,*.ac[bei],*.pa[ck],'
4654
        db      '*.rk,*.cpio,*.rpm,*.zoo,*.hqx,*.sit,*.ice,*.uc2,*.ain,*.imp,*.777,*.ufa,*.boa,'
4655
        db      '*.bs[2a],*.sea,*.hpk,*.ddi,*.x2,*.rkv,*.[lw]sz,*.h[ay]p,*.lim,*.sqz,*.chz',0
4656
highlight_group7:
4657
        db      16h
4658
        db      36h
4659
        db      0
4660
        db      '*.bak,*.tmp',0
4661
highlight_group8:
4662
        db      17h
4663
        db      37h
4664
        db      0
4665
        db      '*.asm,*.inc',0
4666
highlight_group9:
4667
        db      1Fh
4668
        db      3Fh
4669
        db      10h
4670
        db      '*',0
4671
 
4672
associations:
283 diamond 4673
        dd      aAsm, tinypad, AsmMenu
4674
        dd      aInc, tinypad, 0
4675
        dd      aTxt, tinypad, 0
4676
        dd      aJpg, jpegview, 0
4677
        dd      aJpeg, jpegview, 0
4678
        dd      aGif, gifview, GifMenu
4679
        dd      aWav, ac97, 0
4680
        dd      aMp3, ac97, 0
4681
        dd      aMid, midamp, 0
4682
        dd      aBmp, mv, BmpMenu
4683
        dd      aPng, archer, 0
4684
        dd      aRtf, rtfread, 0
4685
        dd      a3ds, view3ds, 0
4686
        dd      aLif, life2, 0
180 heavyiron 4687
associations_end:
4688
 
4689
aAsm db 'asm',0
4690
aInc db 'inc',0
4691
aTxt db 'txt',0
4692
tinypad db '/rd/1/TinyPad',0
4693
 
4694
aJpg db 'jpg',0
4695
aJpeg db 'jpeg',0
4696
jpegview db '/rd/1/JpegView',0
4697
 
4698
aGif db 'gif',0
4699
gifview db '/rd/1/GIFVIEW',0
4700
 
4701
aWav db 'wav',0
4702
aMp3 db 'mp3',0
205 heavyiron 4703
ac97 db '/rd/1/AC97SND',0
180 heavyiron 4704
 
4705
aMid db 'mid',0
4706
midamp db '/rd/1/MIDAMP',0
4707
 
4708
aBmp db 'bmp',0
4709
mv db '/rd/1/MV',0
4710
 
4711
aPng db 'png',0
4712
archer db '/rd/1/@rcher',0
4713
 
4714
aRtf db 'rtf',0
4715
rtfread db '/rd/1/RtfRead',0
4716
 
205 heavyiron 4717
a3ds db '3ds',0
4718
view3ds db '/rd/1/3d/view3ds',0
4719
 
4720
aLif db 'lif',0
4721
life2 db '/rd/1/demos/life2',0
4722
 
283 diamond 4723
AsmMenu:
4724
        dd      aEdit, tinypad
4725
        dd      aCompile, fasm
4726
        dd      0
4727
BmpMenu:
4728
        dd      aView, mv
4729
        dd      aEdit, animage
4730
        dd      0
4731
GifMenu:
4732
        dd      aView, gifview
4733
        dd      aEdit, animage
4734
        dd      0
4735
 
4736
if lang eq en
4737
aView   db      '&View',0
4738
aCompile db     '&Compile',0
4739
aEdit   db      '&Edit',0
4740
else
4741
aView   db      '&Просмотр',0
4742
aCompile db     '&Компилировать',0
4743
aEdit   db      '&Редактор',0
4744
end if
4745
 
4746
fasm    db      '/rd/1/develop/fasm',0
4747
animage db      '/rd/1/animage',0
4748
 
183 diamond 4749
bConfirmDelete  db      1
4750
 
4751
; Здесь заканчиваются конфигурационные данные
4752
 
4753
bWasE0          db      0
4754
ctrlstate       db      0
4755
 
4756
align   4
4757
f8_confirm_dlgdata:
4758
        dd      0
4759
.x      dd      -1
4760
.y      dd      -1
4761
.width  dd      ?
4762
.height dd      3
4763
        dd      4
4764
        dd      2
4765
        dd      aDeleteCaption
4766
.main_color db ?
4767
.border_color db ?
4768
.header_color db ?
4769
        db      0
4770
        dd      0
4771
        dd      0
4772
        dd      4
4773
; строка "Вы хотите удалить ..."
4774
        dd      1
4775
        dd      1,0
4776
.width2 dd      ?
4777
        dd      0
4778
        dd      aConfirmDeleteTextBuf
4779
        dd      1
4780
; строка с именем файла/папки
4781
        dd      1
4782
        dd      1,1
4783
.width3 dd      ?
4784
        dd      1
4785
.name   dd      ?
4786
        dd      1
4787
; кнопка "удалить"
4788
.del_btn:
4789
        dd      2
4790
.del_x1 dd      ?
4791
        dd      2
4792
.del_x2 dd      ?
4793
        dd      2
4794
        dd      aDelete
4795
.flags1 dd      4
4796
; кнопка "отменить"
4797
        dd      2
4798
.cnl_x1 dd      ?
4799
        dd      2
4800
.cnl_x2 dd      ?
4801
        dd      2
4802
        dd      aCancel
4803
.flags2 dd      0
4804
 
283 diamond 4805
; диалог копирования
4806
copy_dlgdata:
4807
        dd      0
4808
.x      dd      -1
4809
.y      dd      -1
4810
.width  dd      ?
4811
.height dd      4
4812
        dd      4
4813
        dd      2
4814
        dd      aCopyCaption
4815
.main_color db ?
4816
.border_color db ?
4817
.header_color db ?
4818
        db      0
4819
        dd      0
4820
        dd      0
4821
        dd      4
4822
; строка 'Копировать "%s" в:'
4823
        dd      1
4824
        dd      1,0
4825
.width2 dd      ?
4826
        dd      0
4827
        dd      CopySourceTextBuf
4828
        dd      0
4829
; поле редактирования с именем файла/папки назначения
4830
        dd      3
4831
        dd      1,1
4832
.width3 dd      ?
4833
        dd      1
4834
        dd      CopyDestEditBuf
4835
.flags0 dd      0
4836
; кнопка "копировать"
4837
.copy_btn:
4838
        dd      2
4839
.copy_x1 dd     ?
4840
        dd      3
4841
.copy_x2 dd     ?
4842
        dd      3
4843
        dd      aCopy
4844
.flags1 dd      18h
4845
; кнопка "отменить"
4846
        dd      2
4847
.cnl_x1 dd      ?
4848
        dd      3
4849
.cnl_x2 dd      ?
4850
        dd      3
4851
        dd      aCancelB
4852
.flags2 dd      8
4853
 
4854
 
183 diamond 4855
if lang eq ru
4856
aDeleteCaption          db      'Удаление',0
4857
aConfirmDeleteText      db      'Вы хотите удалить ',0
4858
aDeleteFolder           db      'папку',0
4859
aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
4860
aDeleteFile             db      'файл',0
4861
aDelete                 db      ' Удалить ',0
4862
aDeleteLength = $ - aDelete - 1
4863
aCancel                 db      ' Отменить ',0
4864
aCancelLength = $ - aCancel - 1
283 diamond 4865
aCancelB                db      '[ Отменить ]',0
4866
aCancelBLength = $ - aCancelB - 1
4867
aCopyCaption            db      'Копирование',0
4868
aCopy                   db      '[ Копировать ]',0
4869
aCopyLength = $ - aCopy - 1
4870
aCopy1                  db      'Копировать "',0
4871
aCopy2                  db      '" в:',0
183 diamond 4872
else
4873
aDeleteCaption          db      'Delete',0
4874
aConfirmDeleteText      db      'Do you wish to delete ',0
4875
aDeleteFolder           db      'the folder',0
4876
aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
4877
aDeleteFile             db      'the file',0
4878
aDelete                 db      ' Delete ',0
4879
aDeleteLength = $ - aDelete - 1
4880
aCancel                 db      ' Cancel ',0
4881
aCancelLength = $ - aCancel - 1
283 diamond 4882
aCancelB                db      '[ Cancel ]',0
4883
aCancelBLength = $ - aCancelB - 1
4884
aCopyCaption            db      'Copy',0
4885
aCopy                   db      '[ Copy ]',0
4886
aCopyLength = $ - aCopy - 1
4887
aCopy1                  db      'Copy "',0
4888
aCopy2                  db      '" to:',0
183 diamond 4889
end if
4890
 
180 heavyiron 4891
execinfo:
4892
        dd      7
4893
        dd      0
4894
execparams dd   0
4895
        dd      0
4896
        dd      0
4897
        db      0
4898
execptr dd      ?
4899
 
4900
IncludeIGlobals
4901
 
4902
i_end:
4903
 
4904
IncludeUGlobals
4905
 
4906
execdata rb     1024
4907
        align   4
4908
attrinfo.attr   rb      40
4909
 
4910
panel1_data:
4911
panel1_left     dd      ?
4912
panel1_top      dd      ?
4913
panel1_width    dd      ?
4914
panel1_height   dd      ?
4915
panel1_index    dd      ?
4916
panel1_start    dd      ?
4917
panel1_colsz    dd      ?
4918
panel1_colst    dd      ?
4919
panel1_sortmode db      ?
4920
                rb      3
4921
panel1_nfa      dd      ?
4922
panel1_numfiles dd      ?
4923
panel1_files    dd      ?
4924
panel1_dir      rb      1024
4925
 
4926
panel2_data:
4927
panel2_left     dd      ?
4928
panel2_top      dd      ?
4929
panel2_width    dd      ?
4930
panel2_height   dd      ?
4931
panel2_index    dd      ?
4932
panel2_start    dd      ?
4933
panel2_colsz    dd      ?
4934
panel2_colst    dd      ?
4935
panel2_sortmode db      ?
4936
                rb      3
4937
panel2_nfa      dd      ?
4938
panel2_numfiles dd      ?
4939
panel2_files    dd      ?
4940
panel2_dir      rb      1024
4941
 
283 diamond 4942
;console_data    rb      max_width*max_height*2
180 heavyiron 4943
 
4944
cur_header      rb      max_width
4945
tmp             dd      ?
4946
 
4947
skinh           dd      ?
4948
std_colors      rd      10
4949
 
283 diamond 4950
min_y           dd      ?
4951
max_y           dd      ?
4952
min_x           dd      ?
4953
max_x           dd      ?
4954
used_width      dd      ?
4955
used_height     dd      ?
4956
 
180 heavyiron 4957
column_left     dd      ?
4958
column_top      dd      ?
4959
column_width    dd      ?
4960
column_height   dd      ?
4961
column_index    dd      ?
4962
 
4963
scrpos          dq      ?
4964
viewer_right_side dq    ?
4965
 
4966
saved_file_name:
4967
procinfo        rb      1024
283 diamond 4968
lower_file_name = procinfo + 512
180 heavyiron 4969
 
4970
driveinfo       rb      32+304
4971
tmpname         rb      32
4972
 
4973
screens         dd      ?
4974
num_screens     dd      ?
4975
active_screen_vtable dd ?
4976
active_screen_data dd   ?
4977
 
183 diamond 4978
aConfirmDeleteTextBuf   rb      aConfirmDeleteTextMax + 1
283 diamond 4979
CopySourceTextBuf       rb      512
4980
CopyDestEditBuf         rb      12+512+1
4981
.length = $ - CopyDestEditBuf - 9
183 diamond 4982
 
283 diamond 4983
align 4
4984
layout          rb      128
4985
 
4986
copy_buffer_size = 32768
4987
copy_buffer     rb      copy_buffer_size
4988
 
180 heavyiron 4989
; stack
183 diamond 4990
        align   4
180 heavyiron 4991
        rb      512
4992
stacktop:
4993
 
4994
mem: