Subversion Repositories Kolibri OS

Rev

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