Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
180 heavyiron 1
virtual at 0
2
viewer_data:
3
        .buf_start      dq      ?
4
        .cur_pos        dq      ?
5
        .filesize       dq      ?
6
        .buf_pos        dd      ?
7
        .buf_size       dd      ?
8
        .col            dq      ?
9
        .encoding       db      ?
10
        .bEofReached    db      ?
11
        .flags          db      ?       ; & 1: hex mode
12
                                        ; & 2: unwrap
474 diamond 13
                                        ; & 4: big-endian unicode
180 heavyiron 14
                        rb      1
15
        .filename       rb      1024
16
        .buf            rb      16384
17
        .size = $
18
end virtual
19
 
20
view_file:
21
        mov     eax, [ebp + panel1_files - panel1_data]
22
        mov     ecx, [eax+ecx*4]
23
        test    byte [ecx], 10h
24
        jz      .file
25
        ret
26
.file:
27
        lea     esi, [ebp + panel1_dir - panel1_data]
474 diamond 28
        push    ecx
29
        mov     ecx, viewer_data.size
180 heavyiron 30
        mov     edx, viewer_vtable
31
        call    new_screen
474 diamond 32
        pop     ecx
180 heavyiron 33
        test    eax, eax
34
        jnz     @f
35
        ret
36
@@:
37
        mov     [ebp+viewer_data.encoding], encodings.cp866
38
        mov     [ebp+viewer_data.flags], 0
39
        and     dword [ebp+viewer_data.col], 0
40
        and     dword [ebp+viewer_data.col+4], 0
41
        lea     edi, [ebp+viewer_data.filename]
42
        push    edi
43
@@:
44
        lodsb
45
        test    al, al
46
        jz      @f
47
        stosb
48
        jmp     @b
49
@@:
50
        lea     esi, [ecx+40]
51
        mov     al, '/'
52
        stosb
53
@@:
54
        lodsb
55
        stosb
56
        test    al, al
57
        jnz     @b
58
        pop     eax
59
        push    eax
60
        mov     ebx, attrinfo
61
        mov     [ebx+21], eax
321 diamond 62
.attr_retry:
180 heavyiron 63
        push    70
64
        pop     eax
65
        int     40h
321 diamond 66
        test    eax, eax
67
        jz      @f
68
        lea     ebx, [ebp+viewer_data.filename]
69
        push    ebx
70
        push    aCannotReadFile
71
        call    get_error_msg
72
        push    eax
73
        mov     eax, esp
74
        push    RetryOrCancelBtn
75
        push    2
76
        push    eax
77
        push    3
78
        push    -1
79
        push    -1
80
        push    aError
81
        call    SayErr
82
        add     esp, 3*4
83
        mov     ebx, attrinfo
84
        test    eax, eax
85
        jz      .attr_retry
86
        jmp     delete_active_screen
87
@@:
180 heavyiron 88
        mov     eax, dword [attrinfo.attr+32]
89
        mov     dword [ebp+viewer_data.filesize], eax
90
        mov     eax, dword [attrinfo.attr+36]
91
        mov     dword [ebp+viewer_data.filesize+4], eax
92
        mov     ebx, readinfo
93
        xor     eax, eax
94
        mov     dword [ebx+readinfo.first-readinfo], eax
95
        mov     dword [ebx+readinfo.first+4-readinfo], eax
96
        mov     dword [ebp+viewer_data.buf_start], eax
97
        mov     dword [ebp+viewer_data.buf_start+4], eax
98
        mov     dword [ebp+viewer_data.cur_pos], eax
99
        mov     dword [ebp+viewer_data.cur_pos+4], eax
100
        mov     [ebx+readinfo.size-readinfo], 16384
101
        lea     eax, [ebp+viewer_data.buf]
102
        mov     [readinfo.data], eax
103
        mov     [ebp+viewer_data.buf_pos], eax
104
        pop     dword [readinfo.name]
321 diamond 105
.retry:
180 heavyiron 106
        push    70
107
        pop     eax
108
        int     40h
109
        mov     [ebp+viewer_data.buf_size], ebx
321 diamond 110
        test    eax, eax
111
        jz      .readok
112
        cmp     eax, 6
113
        jz      .readok
114
        lea     ebx, [ebp+viewer_data.filename]
115
        push    ebx
116
        push    aCannotReadFile
117
        call    get_error_msg
118
        push    eax
119
        mov     eax, esp
120
        push    RetryOrCancelBtn
121
        push    2
122
        push    eax
123
        push    3
124
        push    -1
125
        push    -1
126
        push    aError
127
        call    SayErr
128
        add     esp, 3*4
129
        mov     ebx, readinfo
130
        test    eax, eax
131
        jz      .attr_retry
132
        jmp     delete_active_screen
133
.readok:
474 diamond 134
        cmp     ebx, 2
135
        jb      .nounicode
136
        cmp     word [ebp+viewer_data.buf], 0xFEFF
137
        jz      @f
138
        cmp     word [ebp+viewer_data.buf], 0xFFFE
139
        jnz     .nounicode
140
        or      byte [ebp+viewer_data.flags], 4
141
@@:
142
        mov     [ebp+viewer_data.encoding], encodings.unicode
143
.nounicode:
180 heavyiron 144
        call    viewer_set_keybar
145
        call    viewer_draw_text
146
        ret
147
 
148
viewer_get_next_char:
149
        pusha
474 diamond 150
        cmp     [ebp+viewer_data.encoding], encodings.unicode
151
        jnz     @f
152
        cmp     [bForHex], 0
153
        jnz     @f
154
        cmp     dword [ebp+viewer_data.buf_start], 0
155
        jnz     @f
156
        cmp     dword [ebp+viewer_data.buf_start+4], 0
157
        jnz     @f
158
        lea     eax, [ebp+viewer_data.buf]
159
        cmp     eax, [ebp+viewer_data.buf_pos]
160
        jnz     @f
161
        cmp     word [eax], 0xFFFE
162
        jz      .skip
163
        cmp     word [eax], 0xFEFF
164
        jnz     @f
165
.skip:
166
        add     [ebp+viewer_data.buf_pos], 2
167
@@:
180 heavyiron 168
        mov     eax, [ebp+viewer_data.buf_pos]
169
        lea     ecx, [ebp+viewer_data.buf]
170
        add     ecx, [ebp+viewer_data.buf_size]
171
        cmp     eax, ecx
172
        jb      .buffered
173
        mov     al, ' '
174
        sub     ecx, ebp
175
        cmp     ecx, viewer_data.buf + 16384
176
        jb      .err
177
        mov     eax, dword [ebp+viewer_data.buf_start]
178
        add     eax, 8192
179
        mov     dword [ebp+viewer_data.buf_start], eax
180
        mov     edx, dword [ebp+viewer_data.buf_start+4]
181
        adc     edx, 0
182
        mov     dword [ebp+viewer_data.buf_start+4], edx
183
        add     eax, 16384-8192
184
        adc     edx, 0
185
        mov     dword [readinfo.first], eax
186
        mov     dword [readinfo.first+4], edx
187
        mov     dword [readinfo.size], 8192
188
        lea     edi, [ebp+viewer_data.buf]
189
        lea     esi, [edi+8192]
190
        mov     ecx, (16384-8192)/4
191
        rep     movsd
192
        mov     [readinfo.data], edi
193
        lea     eax, [ebp+viewer_data.filename]
194
        mov     [readinfo.name], eax
321 diamond 195
.readretry:
180 heavyiron 196
        mov     ebx, readinfo
197
        push    70
198
        pop     eax
199
        int     40h
321 diamond 200
        test    eax, eax
201
        jz      .readok
202
        cmp     eax, 6
203
        jz      .readok
204
        call    ask_retry_ignore
205
        jz      .readretry
206
.readok:
180 heavyiron 207
        sub     [ebp+viewer_data.buf_pos], 8192
208
        add     ebx, 16384-8192
209
        mov     [ebp+viewer_data.buf_size], ebx
210
        mov     eax, [ebp+viewer_data.buf_pos]
211
        cmp     ecx, 16384-8192
212
        jnz     .buffered
213
.err:
214
        stc
215
        popa
216
        ret
217
.buffered:
474 diamond 218
        cmp     [ebp+viewer_data.encoding], encodings.unicode
219
        jz      .unicode
180 heavyiron 220
        mov     al, [eax]
221
.done:
222
        mov     [esp+28], al
223
        inc     [ebp+viewer_data.buf_pos]
224
        clc
225
        popa
226
        ret
227
 
474 diamond 228
.unicode:
229
        inc     [ebp+viewer_data.buf_pos]
230
        cmp     [bForHex], 0
231
        jnz     @f
232
        call    read_unicode_char
233
        jmp     .done
234
@@:
235
        mov     ax, [eax]
236
        mov     [esp+29], ah
237
        jmp     .done
238
 
180 heavyiron 239
viewer_get_prev_char:
240
        pusha
241
        lea     ecx, [ebp+viewer_data.buf]
242
        cmp     [ebp+viewer_data.buf_pos], ecx
243
        ja      .buffered
244
        mov     eax, dword [ebp+viewer_data.buf_start]
245
        mov     edx, dword [ebp+viewer_data.buf_start+4]
246
        test    eax, eax
247
        jnz     @f
248
        test    edx, edx
249
        jnz     @f
250
        stc
251
        jmp     .ret
252
@@:
253
        sub     eax, 8192
254
        sbb     edx, 0
255
        jnc     @f
256
        xor     eax, eax
257
        xor     edx, edx
258
@@:
259
        call    viewer_seek
260
        add     [ebp+viewer_data.buf_pos], 8192
261
.buffered:
262
        mov     eax, [ebp+viewer_data.buf_pos]
263
        dec     eax
474 diamond 264
        cmp     [ebp+viewer_data.encoding], encodings.unicode
265
        jz      .unicode
180 heavyiron 266
        mov     [ebp+viewer_data.buf_pos], eax
267
        mov     al, [eax]
268
        mov     [esp+28], al
474 diamond 269
.done:
180 heavyiron 270
        clc
271
.ret:
272
        popa
273
        ret
274
 
474 diamond 275
.unicode:
276
        dec     eax
277
        mov     [ebp+viewer_data.buf_pos], eax
278
        call    read_unicode_char
279
        jmp     .done
280
 
281
read_unicode_char:
282
        mov     ax, [eax]
283
uni2ansi_char:
284
        test    [ebp+viewer_data.flags], 4
285
        jz      @f
286
        xchg    al, ah
287
@@:
288
        cmp     ax, 0x80
289
        jb      .ret
290
        cmp     ax, 0x401
291
        jz      .yo1
292
        cmp     ax, 0x451
293
        jz      .yo2
294
        cmp     ax, 0x410
295
        jb      .unk
296
        cmp     ax, 0x440
297
        jb      .rus1
298
        cmp     ax, 0x450
299
        jb      .rus2
300
.unk:
301
        mov     al, ' '
302
.ret:
303
        ret
304
.yo1:
305
        mov     al, 'Ё'
306
        ret
307
.yo2:
308
        mov     al, 'ё'
309
        ret
310
.rus1:
311
; 0x410-0x43F -> 0x80-0xAF
312
        add     al, 0x70
313
        ret
314
.rus2:
315
; 0x440-0x44F -> 0xE0-0xEF
316
        add     al, 0xA0
317
        ret
318
 
180 heavyiron 319
fld_uint64:
320
        fild    qword [eax]
321
        test    byte [eax+7], 80h
322
        jz      .ret
323
        fadd    [@f]
324
.ret:
325
        ret
326
@@      dq      18446744073709551616.0 ;0x10000000000000000
327
 
328
viewer_draw_text:
329
        call    viewer_seek_to_current
330
        xor     eax, eax
331
        xor     edx, edx
332
        call    get_console_ptr
333
        mov     ah, [view_status_color]
334
        lea     esi, [ebp+viewer_data.filename]
335
        mov     dl, 3
336
        mov     ecx, [cur_width]
337
        sub     ecx, 44
338
        cmp     ecx, 20
339
        jae     .5
340
        mov     cl, 20
341
.5:
342
        lodsb
343
        cmp     al, '/'
344
        jnz     @f
345
        dec     edx
346
        jz      .6
347
@@:
348
        stosw
349
        loop    .5
350
.6:
351
        dec     ecx
352
        stosw
353
        push    esi
354
@@:
355
        inc     esi
356
        cmp     byte [esi-1], 0
357
        jnz     @b
358
        sub     esi, [esp]
359
        dec     esi
360
        cmp     ecx, esi
361
        jae     .7
362
        mov     al, '.'
363
        stosw
364
        stosw
365
        stosw
366
        sub     ecx, 3
367
        sub     esi, ecx
368
        add     [esp], esi
369
.7:
370
        pop     esi
371
@@:
372
        lodsb
373
        test    al, al
374
        jz      @f
375
        dec     ecx
376
        stosw
377
        jmp     @b
378
@@:
379
        mov     al, ' '
380
        add     ecx, 8
381
        rep     stosw
382
        movzx   esi, [ebp+viewer_data.encoding]
383
        lea     esi, [encodings.names+esi*8]
384
        mov     cl, 8
385
@@:
386
        lodsb
387
        stosw
388
        loop    @b
389
        mov     al, ' '
390
        mov     cl, 8
391
        rep     stosw
392
        std
393
        push    edi
394
        mov     edx, dword [ebp+viewer_data.filesize+4]
395
        mov     eax, dword [ebp+viewer_data.filesize]
396
        mov     cl, 10
397
@@:
398
        push    eax
399
        mov     eax, edx
400
        xor     edx, edx
401
        div     ecx
402
        xchg    eax, [esp]
403
        div     ecx
404
        xchg    eax, edx
405
        add     al, '0'
406
        mov     ah, [view_status_color]
407
        stosw
408
        xchg    eax, edx
409
        pop     edx
410
        test    eax, eax
411
        jnz     @b
412
        test    edx, edx
413
        jnz     @b
414
        mov     al, ' '
415
        mov     ah, [view_status_color]
416
        stosw
417
        cld
418
        pop     edi
419
        inc     edi
420
        inc     edi
421
        mov     al, ' '
422
        mov     cl, 5
423
        rep     stosw
424
if lang eq ru
425
        mov     al, 'К'
426
        stosw
427
        mov     al, 'о'
428
        stosw
429
        mov     al, 'л'
430
        stosw
431
else
432
        mov     al, 'C'
433
        stosw
434
        mov     al, 'o'
435
        stosw
436
        mov     al, 'l'
437
        stosw
438
end if
439
        mov     al, ' '
440
        stosw
441
        push    edi
442
        mov     eax, dword [ebp+viewer_data.col]
443
        mov     edx, dword [ebp+viewer_data.col+4]
444
        test    edx, edx
445
        jnz     .col_big
446
        cmp     eax, 100000
447
        jae     .col_big
448
        mov     cl, 10
449
        push    -'0'
450
@@:
451
        div     ecx
452
        push    edx
453
        xor     edx, edx
454
        test    eax, eax
455
        jnz     @b
456
@@:
457
        pop     eax
458
        add     eax, '0'
459
        jz      .col_done
460
        mov     ah, [view_status_color]
461
        stosw
462
        jmp     @b
463
.col_big:
464
        push    eax
465
        mov     al, '.'
466
        mov     ah, [view_status_color]
467
        stosw
468
        stosw
469
        stosw
470
        xor     eax, eax
471
        xchg    eax, edx
472
        mov     cl, 100
473
        div     ecx
474
        pop     eax
475
        div     ecx
476
        mov     cl, 10
477
        xor     eax, eax
478
        xchg    eax, edx
479
        div     ecx
480
        add     al, '0'
481
        mov     ah, [view_status_color]
482
        stosw
483
        mov     al, dl
484
        add     al, '0'
485
        stosw
486
.col_done:
487
        pop     ecx
488
        add     ecx, 10*2
489
        sub     ecx, edi
490
        shr     ecx, 1
491
        mov     al, ' '
492
        mov     ah, [view_status_color]
493
        rep     stosw
494
        finit
495
        fldcw   [fpu_cw]
496
        mov     [tmp], 100
497
        lea     eax, [ebp+viewer_data.filesize]
498
        cmp     dword [eax], 0
499
        jnz     @f
500
        cmp     dword [eax+4], 0
501
        jz      .size_zero
502
@@:
503
        call    fld_uint64
504
        lea     eax, [ebp+viewer_data.cur_pos]
505
        call    fld_uint64
506
        fdivrp
507
        fimul   [_100d]
508
        fistp   [tmp]
509
.size_zero:
510
        mov     byte [edi-2], '%'
511
        sub     edi, 4
512
        mov     eax, [tmp]
513
        mov     cl, 10
514
@@:
515
        xor     edx, edx
516
        div     ecx
517
        xchg    eax, edx
518
        add     al, '0'
519
        mov     [edi], al
520
        sub     edi, 2
521
        xchg    eax, edx
522
        test    eax, eax
523
        jnz     @b
524
        xor     eax, eax
525
        push    1
526
        pop     edx
527
        call    get_console_ptr
528
        test    [ebp+viewer_data.flags], 1
529
        jnz     .DrawHex
530
        push    2
531
        pop     edx
532
        xor     ecx, ecx
533
        mov     dword [scrpos], ecx
534
        mov     dword [scrpos+4], ecx
535
        mov     dword [viewer_right_side], ecx
536
        mov     dword [viewer_right_side+4], ecx
537
.1:
538
        call    viewer_get_next_char
539
        jc      .done
540
.2:
541
        cmp     al, 0xD
542
        jz      .newline
543
        cmp     al, 0xA
544
        jz      .newline
545
        cmp     ecx, [cur_width]
546
        jb      .no_newline
547
        test    [ebp+viewer_data.flags], 2
548
        jnz     .no_newline
549
.newline:
550
        push    eax
551
        mov     ecx, dword [scrpos]
552
        mov     eax, dword [scrpos+4]
553
        sub     ecx, dword [ebp+viewer_data.col]
554
        sbb     eax, dword [ebp+viewer_data.col+4]
555
        ja      .line_filled
556
        jb      .line_full
557
        cmp     ecx, [cur_width]
558
        ja      .line_filled
559
        jmp     @f
560
.line_full:
561
        xor     ecx, ecx
562
@@:
563
        test    ecx, ecx
564
        jnz     @f
565
        mov     eax, dword [scrpos]
566
        or      eax, dword [scrpos+4]
567
        jz      @f
568
        inc     ecx
569
@@:
570
        sub     ecx, [cur_width]
571
        neg     ecx
572
        mov     al, ' '
573
        mov     ah, [view_normal_color]
574
        rep     stosw
575
.line_filled:
576
        mov     eax, dword [scrpos]
577
        sub     eax, dword [viewer_right_side]
578
        mov     eax, dword [scrpos+4]
579
        sbb     eax, dword [viewer_right_side+4]
580
        jb      @f
581
        mov     eax, dword [scrpos]
582
        mov     dword [viewer_right_side], eax
583
        mov     eax, dword [scrpos+4]
584
        mov     dword [viewer_right_side+4], eax
585
@@:
586
        xor     ecx, ecx
587
        mov     dword [scrpos], ecx
588
        mov     dword [scrpos+4], ecx
589
        inc     edx
590
        pop     eax
591
        cmp     edx, [cur_height]
592
        jae     .done
593
.no_newline:
594
        cmp     al, 0xD
595
        jz      .3
596
        cmp     al, 0xA
597
        jz      .3
598
.4:
599
        test    al, al
600
        jns     @f
601
        movzx   esi, [ebp+viewer_data.encoding]
474 diamond 602
        cmp     esi, encodings.unicode
603
        jz      @f
180 heavyiron 604
        shl     esi, 7
605
        movzx   eax, al
606
        mov     al, [encodings.tables-80h+esi+eax]
607
@@:
608
        cmp     al, 9
609
        jz      .tab
610
        call    .write_char
611
        inc     ecx
612
        jns     .1
613
        push    edx
614
        mov     eax, ecx
615
        xor     edx, edx
616
        div     [tabsize]
617
        mov     ecx, edx
618
        pop     edx
619
        jmp     .1
620
.3:
621
        mov     bl, al
622
        call    viewer_get_next_char
623
        jc      .done
624
        xor     bl, al
625
        cmp     bl, 0xA xor 0xD
626
        jz      .1
627
        jmp     .2
628
.tab:
629
        push    edx
630
        push    ecx
631
        mov     eax, ecx
632
        mov     ecx, [tabsize]
633
        xor     edx, edx
634
        div     ecx
635
        pop     eax
636
        sub     ecx, edx
637
        add     eax, ecx
638
        test    [ebp+viewer_data.flags], 2
639
        jnz     @f
640
        cmp     eax, [cur_width]
641
        jbe     @f
642
        sub     eax, [cur_width]
643
        sub     ecx, eax
644
        mov     eax, [cur_width]
645
@@:
646
        push    eax
647
        mov     al, ' '
648
@@:
649
        call    .write_char
650
        loop    @b
651
        pop     ecx
652
        pop     edx
653
        jmp     .1
654
.done:
655
        setc    [ebp+viewer_data.bEofReached]
656
.done2:
657
        inc     edx
658
        cmp     edx, [cur_height]
659
        jnc     @f
660
        mov     eax, dword [ebp+viewer_data.cur_pos]
661
        or      eax, dword [ebp+viewer_data.cur_pos+4]
662
        jz      @f
663
        call    viewer_seek_to_current
664
        call    viewer_prev_newline
665
        jmp     viewer_draw_text
666
@@:
667
        push    edi
668
        xor     eax, eax
669
        mov     edx, [cur_height]
670
        dec     edx
671
        call    get_console_ptr
672
        mov     ecx, edi
673
        pop     edi
674
        sub     ecx, edi
675
        shr     ecx, 1
676
        mov     al, ' '
677
        mov     ah, [view_normal_color]
678
        rep     stosw
679
        cmp     [ebp+viewer_data.bEofReached], 0
680
        jz      @f
681
        xor     edx, edx
682
        mov     eax, [cur_width]
683
        sub     eax, 4
684
        call    get_console_ptr
685
        mov     ah, [view_status_color]
686
        mov     al, '1'
687
        stosw
688
        mov     al, '0'
689
        stosw
690
        stosw
691
@@:
692
        call    draw_image
693
        ret
694
.DrawHex:
695
        xor     esi, esi
696
        mov     [ebp+viewer_data.bEofReached], 0
697
.line:
698
        mov     al, ' '
699
        mov     ah, [view_normal_color]
700
        push    edi
701
        mov     ecx, [cur_width]
702
        rep     stosw
703
        mov     ebx, edi
704
        pop     edi
474 diamond 705
        mov     [bForHex], 1
180 heavyiron 706
        call    viewer_get_next_char
474 diamond 707
        mov     [bForHex], 0
180 heavyiron 708
        jc      .hexdone
709
        push    eax
710
        push    edi
711
        add     edi, 36*2
712
        mov     al, 0xB3
474 diamond 713
        mov     ah, [view_normal_color]
180 heavyiron 714
        call    .safechar
715
        pop     edi
716
        mov     eax, dword [ebp+viewer_data.cur_pos]
717
        mov     edx, dword [ebp+viewer_data.cur_pos+4]
718
        push    esi
719
        shl     esi, 4
720
        add     eax, esi
721
        adc     edx, 0
722
        pop     esi
723
        push    eax
724
        mov     al, dl
725
        shr     eax, 4
726
        and     al, 0xF
727
        call    .hex_digit
728
        mov     al, dl
729
        and     al, 0xF
730
        call    .hex_digit
731
        pop     eax
732
        push    8
733
        pop     ecx
734
        add     edi, 7*2
735
        std
736
@@:
737
        push    eax
738
        and     al, 0xF
739
        call    .hex_digit
740
        pop     eax
741
        shr     eax, 4
742
        loop    @b
743
        cld
744
        add     edi, 9*2
745
        mov     al, ':'
746
        mov     ah, [view_normal_color]
747
        stosw
748
        mov     al, ' '
749
        stosw
750
        xor     ecx, ecx
751
        pop     eax
752
        jmp     @f
753
.hexchar:
474 diamond 754
        mov     [bForHex], 1
180 heavyiron 755
        call    viewer_get_next_char
474 diamond 756
        mov     [bForHex], 0
180 heavyiron 757
        jc      .hexdone
758
@@:
474 diamond 759
        cmp     [ebp+viewer_data.encoding], encodings.unicode
760
        jz      .hexchar_unicode
180 heavyiron 761
        push    eax
762
        shr     al, 4
763
        call    .hex_digit
764
        pop     eax
765
        push    eax
766
        and     al, 0xF
767
        call    .hex_digit
768
        mov     al, ' '
769
        call    .safechar
770
        pop     eax
771
        push    edi
772
        add     edi, 48*2
773
        push    ecx
774
        shl     ecx, 2
775
        sub     edi, ecx
776
        pop     ecx
777
        cmp     ecx, 8
778
        jb      @f
779
        sub     edi, 4
780
@@:
781
        test    al, al
782
        jns     @f
783
        movzx   edx, [ebp+viewer_data.encoding]
784
        shl     edx, 7
785
        movzx   eax, al
786
        mov     al, [encodings.tables+eax+edx-80h]
787
        mov     ah, [view_normal_color]
788
@@:
789
        call    .safechar
790
        pop     edi
791
        inc     ecx
792
        cmp     ecx, 8
793
        jnz     @f
794
        mov     al, 0xB3
795
        call    .safechar
796
        mov     al, ' '
797
        call    .safechar
798
@@:
799
        cmp     ecx, 16
800
        jnz     .hexchar
474 diamond 801
        jmp     .hexchar_nextline
802
.hexchar_unicode:
803
        push    eax
804
        shr     eax, 12
805
        call    .hex_digit
806
        pop     eax
807
        push    eax
808
        shr     eax, 8
809
        and     al, 0xF
810
        call    .hex_digit
811
        pop     eax
812
        push    eax
813
        shr     al, 4
814
        call    .hex_digit
815
        pop     eax
816
        push    eax
817
        and     al, 0xF
818
        call    .hex_digit
819
        mov     al, ' '
820
        mov     ah, [view_normal_color]
821
        call    .safechar
822
        pop     eax
823
        push    edi
824
        add     edi, 38*2
825
        push    ecx
826
        shl     ecx, 3
827
        sub     edi, ecx
828
        pop     ecx
829
        cmp     ecx, 4
830
        jb      @f
831
        sub     edi, 4
832
@@:
833
        call    uni2ansi_char
834
        mov     ah, [view_normal_color]
835
        call    .safechar
836
        pop     edi
837
        inc     ecx
838
        cmp     ecx, 4
839
        jnz     @f
840
        mov     al, 0xB3
841
        call    .safechar
842
        mov     al, ' '
843
        call    .safechar
844
@@:
845
        cmp     ecx, 8
846
        jnz     .hexchar
847
.hexchar_nextline:
180 heavyiron 848
        mov     edi, ebx
849
        add     esi, 3
850
        mov     edx, esi
851
        cmp     esi, [cur_height]
852
        jae     .done2
853
        dec     esi
854
        dec     esi
855
        jmp     .line
856
.hexdone:
857
        mov     [ebp+viewer_data.bEofReached], 1
858
        mov     edi, ebx
859
        lea     edx, [esi+2]
860
        jmp     .done2
861
 
862
.hex_digit:
863
        push    eax
864
        cmp     al, 10
865
        sbb     al, 69h
866
        das
867
        mov     ah, [view_normal_color]
868
        call    .safechar
869
        pop     eax
870
        ret
871
.safechar:
872
        cmp     edi, ebx
873
        jae     @f
874
        stosw
875
@@:
876
        ret
877
.write_char:
878
        push    ecx eax
879
        mov     ecx, dword [scrpos]
880
        mov     eax, dword [scrpos+4]
881
        sub     ecx, dword [ebp+viewer_data.col]
882
        sbb     eax, dword [ebp+viewer_data.col+4]
883
        jb      .left
884
        ja      .skip
885
        test    ecx, ecx
886
        jnz     @f
887
        mov     eax, dword [scrpos]
888
        or      eax, dword [scrpos+4]
889
        jnz     .skip
890
@@:
891
        cmp     ecx, [cur_width]
892
        ja      .skip
893
        jb      .do
894
        mov     al, '>'
895
        mov     [edi-2], al
896
        mov     al, [view_arrows_color]
897
        mov     [edi-1], al
898
        jmp     .skip
899
.left:
900
        mov     eax, dword [scrpos]
901
        or      eax, dword [scrpos+4]
902
        jnz     .skip
903
        mov     al, '<'
904
        mov     ah, [view_arrows_color]
905
        stosw
906
        jmp     .skip
907
.do:
908
        mov     al, [esp]
909
        mov     ah, [view_normal_color]
910
        stosw
911
.skip:
912
        pop     eax ecx
913
        add     dword [scrpos], 1
914
        adc     dword [scrpos+4], 0
915
        ret
916
 
917
viewer_seek_to_current:
918
        mov     eax, dword [ebp+viewer_data.cur_pos]
919
        mov     edx, dword [ebp+viewer_data.cur_pos+4]
920
viewer_seek:
921
        push    eax edx
922
        sub     eax, dword [ebp+viewer_data.buf_start]
923
        sbb     edx, dword [ebp+viewer_data.buf_start+4]
924
        jb      .prev
925
        ja      .next
926
        cmp     eax, 16384
927
        jae     .next
928
        lea     eax, [ebp+viewer_data.buf+eax]
929
        mov     [ebp+viewer_data.buf_pos], eax
930
        pop     edx eax
931
        ret
932
.prev:
933
        inc     edx
934
        jnz     .read_full
935
        and     eax, not 511
936
        cmp     eax, -16384
937
        jbe     .read_full
938
        lea     edi, [ebp+viewer_data.buf+16384-4]
939
        lea     esi, [edi+eax]
940
        lea     ecx, [eax+16384]
941
        push    ecx
942
        shr     ecx, 2
943
        std
944
        rep     movsd
945
        cld
946
        pop     ecx
947
        add     dword [ebp+viewer_data.buf_start], eax
948
        adc     dword [ebp+viewer_data.buf_start+4], -1
949
        neg     eax
950
        cmp     dword [ebp+viewer_data.buf_size], ecx
951
        jb      .doread
952
        mov     dword [ebp+viewer_data.buf_size], ecx
953
        jmp     .doread
954
.read_full:
955
        pop     edx eax
956
        push    eax edx
957
        and     eax, not 511
958
        sub     eax, 8192-512
959
        sbb     edx, 0
960
        jnc     @f
961
        xor     eax, eax
962
        xor     edx, edx
963
@@:
964
        mov     dword [ebp+viewer_data.buf_start], eax
965
        mov     dword [ebp+viewer_data.buf_start+4], edx
966
        and     dword [ebp+viewer_data.buf_size], 0
967
        mov     eax, 16384
968
.doread:
969
        mov     ebx, readinfo
970
        push    dword [ebp+viewer_data.buf_start]
971
        pop     dword [ebx+4]
972
        push    dword [ebp+viewer_data.buf_start+4]
973
        pop     dword [ebx+8]
974
        mov     [ebx+12], eax
975
        lea     eax, [ebp+viewer_data.buf]
976
        mov     [ebx+16], eax
977
        lea     eax, [ebp+viewer_data.filename]
978
        mov     [ebx+21], eax
979
        push    70
980
        pop     eax
981
        int     40h
321 diamond 982
        test    eax, eax
983
        jz      .readok
984
        cmp     eax, 6
985
        jz      .readok
986
        call    ask_retry_ignore
987
        jz      .doread
988
.readok:
180 heavyiron 989
        cmp     ebx, [readinfo.size]
990
        jnz     @f
991
        add     ebx, [ebp+viewer_data.buf_size]
992
@@:
993
.ret:
994
        mov     [ebp+viewer_data.buf_size], ebx
995
        pop     edx eax
996
        sub     eax, dword [ebp+viewer_data.buf_start]
997
        lea     eax, [ebp+eax+viewer_data.buf]
998
        mov     [ebp+viewer_data.buf_pos], eax
999
        ret
1000
.next:
1001
        or      eax, 511
1002
        sub     eax, 16384-1
1003
        sbb     edx, 0
1004
        jnz     .read_full
1005
        cmp     eax, 16384
1006
        jae     .read_full
1007
        cmp     [ebp+viewer_data.buf_size], 16384
1008
        jb      .read_full
1009
        lea     edi, [ebp+viewer_data.buf]
1010
        lea     esi, [edi+eax]
1011
        mov     ecx, 16384
1012
        sub     ecx, eax
1013
        shr     ecx, 2
1014
        rep     movsd
1015
        add     dword [ebp+viewer_data.buf_start], eax
1016
        adc     dword [ebp+viewer_data.buf_start+4], 0
1017
        mov     ebx, readinfo
1018
        mov     [ebx+16], edi
1019
        sub     edi, ebp
1020
        sub     edi, viewer_data.buf
1021
        mov     edx, dword [ebp+viewer_data.buf_start]
1022
        add     edx, edi
1023
        mov     [ebx+4], edx
1024
        mov     edx, dword [ebp+viewer_data.buf_start+4]
1025
        adc     edx, 0
1026
        mov     [ebx+8], edx
1027
        mov     [ebx+12], eax
1028
        lea     eax, [ebp+viewer_data.filename]
1029
        mov     [ebx+21], eax
321 diamond 1030
@@:
180 heavyiron 1031
        push    70
1032
        pop     eax
1033
        int     40h
321 diamond 1034
        test    eax, eax
1035
        jz      @f
1036
        cmp     eax, 6
1037
        jz      @f
1038
        call    ask_retry_ignore
1039
        jnz     @f
1040
        mov     ebx, readinfo
1041
        jmp     @b
1042
@@:
180 heavyiron 1043
        sub     ebx, [readinfo.size]
1044
        add     ebx, 16384
1045
        jmp     .ret
1046
 
321 diamond 1047
ask_retry_ignore:
1048
        push    esi
1049
        lea     esi, [ebp+viewer_data.filename]
1050
        push    esi
1051
        push    aCannotReadFile
1052
        call    get_error_msg
1053
        push    eax
1054
        mov     eax, esp
1055
        push    RetryOrIgnoreBtn
1056
        push    2
1057
        push    eax
1058
        push    3
1059
        push    -1
1060
        push    -1
1061
        push    aError
1062
        call    SayErr
1063
        add     esp, 3*4
1064
        pop     esi
1065
        test    eax, eax
1066
        ret
1067
 
180 heavyiron 1068
viewer_set_curpos:
1069
        mov     eax, [ebp+viewer_data.buf_pos]
1070
        sub     eax, ebp
1071
        sub     eax, viewer_data.buf
1072
        xor     edx, edx
1073
        add     eax, dword [ebp+viewer_data.buf_start]
1074
        adc     edx, dword [ebp+viewer_data.buf_start+4]
1075
        mov     dword [ebp+viewer_data.cur_pos], eax
1076
        mov     dword [ebp+viewer_data.cur_pos+4], edx
1077
        ret
1078
 
1079
viewer_next_newline:
1080
        test    [ebp+viewer_data.flags], 1
1081
        jz      .nohex
474 diamond 1082
        push    8
180 heavyiron 1083
        pop     ecx
474 diamond 1084
        cmp     [ebp+viewer_data.encoding], encodings.unicode
1085
        jz      @f
1086
        add     ecx, ecx
180 heavyiron 1087
@@:
1088
        call    viewer_get_next_char
1089
        jc      @f
1090
        loop    @b
1091
        call    viewer_set_curpos
1092
        clc
1093
@@:     ret
1094
.nohex:
1095
        xor     ecx, ecx
1096
@@:
1097
        call    viewer_get_next_char
1098
        jc      .ret
1099
        cmp     al, 0xD
1100
        jz      .1
1101
        cmp     al, 0xA
1102
        jz      .1
1103
        cmp     al, 9
1104
        jz      .tab
1105
        inc     ecx
1106
.next:
1107
        test    [ebp+viewer_data.flags], 2
1108
        jnz     @b
1109
        cmp     ecx, [cur_width]
1110
        jbe     @b
1111
        call    viewer_get_prev_char
1112
        jmp     .2
1113
.tab:
1114
        push    ecx
1115
        mov     eax, ecx
1116
        mov     ecx, [tabsize]
1117
        xor     edx, edx
1118
        div     ecx
1119
        sub     ecx, edx
1120
        add     [esp], ecx
1121
        pop     ecx
1122
        jmp     .next
1123
.1:
1124
        mov     cl, al
1125
        call    viewer_get_next_char
1126
        jc      .ret
1127
        xor     cl, al
1128
        cmp     cl, 0xD xor 0xA
1129
        jz      .2
1130
        dec     [ebp+viewer_data.buf_pos]
474 diamond 1131
        cmp     [ebp+viewer_data.encoding], encodings.unicode
1132
        jnz     .2
1133
        dec     [ebp+viewer_data.buf_pos]
180 heavyiron 1134
.2:
1135
.ret:
1136
        call    viewer_set_curpos
1137
        ret
1138
 
1139
viewer_prev_newline:
1140
        test    [ebp+viewer_data.flags], 1
1141
        jz      .nohex
474 diamond 1142
        push    8
180 heavyiron 1143
        pop     ecx
474 diamond 1144
        cmp     [ebp+viewer_data.encoding], encodings.unicode
1145
        jz      @f
1146
        add     ecx, ecx
180 heavyiron 1147
@@:
1148
        call    viewer_get_prev_char
1149
        jc      @f
1150
        loop    @b
1151
@@:     call    viewer_set_curpos
1152
        ret
1153
.nohex:
1154
        mov     eax, 8192
1155
        push    eax
1156
        cdq
1157
        div     [cur_width]
1158
        pop     eax
1159
        sub     eax, edx
1160
        mov     edx, eax
1161
        call    viewer_get_prev_char
1162
        jc      .0
1163
        dec     edx
1164
        cmp     al, 0xD
1165
        jz      .2
1166
        cmp     al, 0xA
1167
        jnz     .3
1168
.2:
1169
        mov     cl, al
1170
        call    viewer_get_prev_char
1171
        jc      .0
1172
        dec     edx
1173
        xor     cl, al
1174
        cmp     cl, 0xD xor 0xA
1175
        jnz     .3
1176
@@:
1177
        call    viewer_get_prev_char
1178
        jc      .0
1179
        dec     edx
1180
        jz      .0
1181
.3:
1182
        cmp     al, 0xD
1183
        jz      .1
1184
        cmp     al, 0xA
1185
        jnz     @b
1186
.1:
1187
        call    viewer_get_next_char
1188
.0:
1189
        push    dword [ebp+viewer_data.cur_pos+4]
1190
        push    dword [ebp+viewer_data.cur_pos]
1191
        call    viewer_set_curpos
1192
@@:
1193
        push    dword [ebp+viewer_data.cur_pos+4]
1194
        push    dword [ebp+viewer_data.cur_pos]
1195
        call    viewer_next_newline
1196
        jc      .ret3
1197
        mov     eax, dword [ebp+viewer_data.cur_pos]
1198
        mov     edx, dword [ebp+viewer_data.cur_pos+4]
1199
        sub     eax, [esp+8]
1200
        sbb     edx, [esp+12]
1201
        jae     .ret3
1202
        pop     eax
1203
        pop     eax
1204
        jmp     @b
1205
.ret3:
1206
        pop     dword [ebp+viewer_data.cur_pos]
1207
        pop     dword [ebp+viewer_data.cur_pos+4]
1208
.ret:
1209
        pop     eax
1210
        pop     eax
1211
        jmp     viewer_seek_to_current
1212
 
1213
viewer_set_keybar:
1214
        mov     eax, keybar_viewer
1215
if lang eq ru
1216
        test    [ebp+viewer_data.flags], 1
1217
        jnz     .hex
1218
        mov     dword [eax+(4-1)*6], 'Код '
1219
        mov     word [eax+(4-1)*6+4], '  '
1220
        jmp     @f
1221
.hex:
1222
        mov     dword [eax+(4-1)*6], 'Текс'
1223
        mov     word [eax+(4-1)*6+4], 'т '
1224
@@:
1225
        test    [ebp+viewer_data.flags], 2
1226
        jnz     .unwrap
1227
        mov     dword [eax+6], 'Разв'
1228
        mov     word [eax+6+4], 'ер'
1229
        jmp     @f
1230
.unwrap:
1231
        mov     dword [eax+6], 'Свер'
1232
        mov     word [eax+6+4], 'н '
1233
@@:
1234
else
1235
        test    [ebp+viewer_data.flags], 1
1236
        jnz     .hex
1237
        mov     dword [eax+(4-1)*6], 'Hex '
1238
;        mov     word [eax+(4-1)*6+4], '  '
1239
        jmp     @f
1240
.hex:
1241
        mov     dword [eax+(4-1)*6], 'Text'
1242
;        mov     word [eax+(4-1)*6+4], '  '
1243
@@:
1244
        test    [ebp+viewer_data.flags], 2
1245
        jnz     .unwrap
1246
        mov     dword [eax+6], 'Unwr'
1247
        mov     word [eax+6+4], 'ap'
1248
        jmp     @f
1249
.unwrap:
1250
        mov     dword [eax+6], 'Wrap'
1251
        mov     word [eax+6+4], '  '
1252
@@:
1253
end if
1254
        movzx   esi, [ebp+viewer_data.encoding]
474 diamond 1255
        dec     esi
1256
        jz      @f
1257
        push    1
1258
        pop     esi
1259
@@:
180 heavyiron 1260
        lea     esi, [encodings.names+esi*8]
1261
        lea     edi, [eax+keybar_cp-keybar_viewer]
1262
        movsd
1263
        movsw
1264
        jmp     draw_keybar
1265
 
1266
viewer_OnRedraw:
1267
        call    viewer_set_keybar
1268
        call    viewer_draw_text
1269
        ret
1270
 
1271
viewer_OnKey:
1272
        mov     esi, viewer_ctrlkeys
1273
        jmp     process_ctrl_keys
1274
.exit:
1275
        call    delete_active_screen
1276
        ret
1277
.down:
1278
        cmp     [ebp+viewer_data.bEofReached], 0
1279
        jnz     .ret
1280
        call    viewer_seek_to_current
1281
        call    viewer_next_newline
1282
        jc      .ret
1283
        call    viewer_draw_text
1284
        ret
1285
.pgdn:
1286
        cmp     [ebp+viewer_data.bEofReached], 0
1287
        jnz     .ret
1288
        call    viewer_seek_to_current
1289
        mov     ebx, [cur_height]
1290
        sub     ebx, 3
1291
@@:
1292
        call    viewer_next_newline
1293
        jc      .ret
1294
        dec     ebx
1295
        jnz     @b
1296
        call    viewer_draw_text
1297
        ret
1298
.up:
1299
        call    viewer_seek_to_current
1300
        call    viewer_prev_newline
1301
        call    viewer_draw_text
1302
        ret
1303
.pgup:
1304
        call    viewer_seek_to_current
1305
        mov     ebx, [cur_height]
1306
        sub     ebx, 3
1307
@@:
1308
        call    viewer_prev_newline
1309
        dec     ebx
1310
        jnz     @b
1311
.done_redraw:
1312
        call    viewer_draw_text
1313
.ret:
1314
        ret
1315
.f8:
1316
        movzx   esi, [ebp+viewer_data.encoding]
474 diamond 1317
        dec     [ebp+viewer_data.encoding]
1318
        jz      .done_redraw_keybar
1319
        mov     [ebp+viewer_data.encoding], 1
1320
        jmp     .done_redraw_keybar
180 heavyiron 1321
.f2:
1322
        xor     [ebp+viewer_data.flags], 2
474 diamond 1323
.done_redraw_keybar:
180 heavyiron 1324
        call    viewer_set_keybar
1325
        jmp     .done_redraw
1326
.f4:
1327
        xor     [ebp+viewer_data.flags], 1
1328
        pushf
1329
        call    viewer_set_keybar
1330
        popf
1331
        jnz     .tohex
474 diamond 1332
        push    1
1333
        pop     eax
1334
        cmp     [ebp+viewer_data.encoding], encodings.unicode
1335
        jnz     @f
1336
        add     eax, eax
1337
@@:
1338
        add     dword [ebp+viewer_data.cur_pos], eax
180 heavyiron 1339
        adc     dword [ebp+viewer_data.cur_pos+4], 0
1340
        call    viewer_seek_to_current
1341
        call    viewer_prev_newline
1342
        jmp     .done_redraw
1343
.tohex:
1344
        and     byte [ebp+viewer_data.cur_pos], 0xF0
1345
        jmp     .done_redraw
1346
.home:
1347
        xor     eax, eax
1348
        mov     dword [ebp+viewer_data.cur_pos], eax
1349
        mov     dword [ebp+viewer_data.cur_pos+4], eax
1350
        mov     dword [ebp+viewer_data.col], eax
1351
        mov     dword [ebp+viewer_data.col+4], eax
1352
        jmp     .done_redraw
1353
.end:
1354
        mov     eax, dword [ebp+viewer_data.filesize]
1355
        mov     edx, dword [ebp+viewer_data.filesize+4]
1356
        and     al, 0xF0
1357
        mov     dword [ebp+viewer_data.cur_pos], eax
1358
        mov     dword [ebp+viewer_data.cur_pos+4], edx
1359
        and     dword [ebp+viewer_data.col], 0
1360
        and     dword [ebp+viewer_data.col+4], 0
1361
        jmp     .done_redraw
1362
.right:
1363
        add     dword [ebp+viewer_data.col], 1
1364
        adc     dword [ebp+viewer_data.col+4], 0
1365
        jnc     .done_redraw
1366
        sub     dword [ebp+viewer_data.col], 1
1367
        sbb     dword [ebp+viewer_data.col+4], 0
1368
        ret
1369
.left:
1370
        sub     dword [ebp+viewer_data.col], 1
1371
        sbb     dword [ebp+viewer_data.col+4], 0
1372
        jnc     .done_redraw
1373
        add     dword [ebp+viewer_data.col], 1
1374
        adc     dword [ebp+viewer_data.col+4], 0
1375
        ret
1376
.ctrl_left:
1377
        test    [ebp+viewer_data.flags], 1
1378
        jnz     .ctrl_left_hex
1379
        sub     dword [ebp+viewer_data.col], 20
1380
        sbb     dword [ebp+viewer_data.col+4], 0
1381
        jnc     .done_redraw
1382
.ctrl_shift_left:
1383
        and     dword [ebp+viewer_data.col], 0
1384
        and     dword [ebp+viewer_data.col+4], 0
1385
        jmp     .done_redraw
1386
.ctrl_left_hex:
1387
        call    viewer_seek_to_current
1388
        call    viewer_get_prev_char
1389
        jc      @f
1390
        call    viewer_set_curpos
1391
        jmp     .done_redraw
1392
.ctrl_right:
1393
        test    [ebp+viewer_data.flags], 1
1394
        jnz     .ctrl_right_hex
1395
        add     dword [ebp+viewer_data.col], 20
1396
        adc     dword [ebp+viewer_data.col+4], 0
1397
        jnc     .done_redraw
1398
        sub     dword [ebp+viewer_data.col], 20
1399
        sbb     dword [ebp+viewer_data.col+4], 0
1400
@@:     ret
1401
.ctrl_right_hex:
1402
        call    viewer_seek_to_current
1403
        call    viewer_get_next_char
1404
        call    viewer_set_curpos
1405
        jmp     .done_redraw
1406
.ctrl_shift_right:
1407
        test    [ebp+viewer_data.flags], 1
1408
        jnz     @b
1409
        mov     eax, dword [viewer_right_side]
1410
        mov     edx, dword [viewer_right_side+4]
1411
        sub     eax, [cur_width]
1412
        sbb     edx, 0
1413
        jnc     @f
1414
        xor     eax, eax
1415
        xor     edx, edx
1416
@@:
1417
        mov     dword [ebp+viewer_data.col], eax
1418
        mov     dword [ebp+viewer_data.col+4], edx
1419
        jmp     .done_redraw
474 diamond 1420
.shift_f8:
1421
        mov     ecx, encodings.menu.1
1422
        mov     al, [ebp+viewer_data.encoding]
1423
@@:
1424
        cmp     byte [ecx-1], al
1425
        jz      @f
1426
        mov     ecx, [ecx]
1427
        jmp     @b
1428
@@:
1429
        push    1
1430
        push    aTables
1431
        push    ecx
1432
        call    menu
1433
        cmp     eax, -1
1434
        jz      .ret
1435
        mov     al, [eax-1]
1436
        mov     [ebp+viewer_data.encoding], al
1437
        cmp     al, encodings.unicode
1438
        jnz     .done_redraw_keybar
1439
        add     dword [ebp+viewer_data.cur_pos], 1
1440
        adc     dword [ebp+viewer_data.cur_pos+4], 0
1441
        and     dword [ebp+viewer_data.cur_pos], not 1
1442
        jmp     .done_redraw_keybar
180 heavyiron 1443
 
1444
viewer_getname:
1445
if lang eq ru
1446
        mov     eax, 'Прос'
1447
        stosd
1448
        mov     eax, 'мотр'
1449
        stosd
1450
        mov     eax, '    '
1451
        stosd
1452
        stosb
1453
else
1454
        mov     eax, 'View'
1455
        stosd
1456
        mov     eax, '    '
1457
        stosd
1458
        stosd
1459
        stosb
1460
end if
1461
        sub     ecx, 13
1462
        lea     esi, [ebp+viewer_data.filename]
1463
        push    3
1464
        pop     edx
1465
@@:
1466
        lodsb
1467
        stosb
1468
        dec     ecx
1469
        cmp     al, '/'
1470
        jnz     @b
1471
        dec     edx
1472
        jnz     @b
1473
        push    esi
1474
@@:
1475
        lodsb
1476
        test    al, al
1477
        jnz     @b
1478
        sub     esi, [esp]
1479
        dec     esi
1480
        cmp     esi, ecx
1481
        jbe     @f
1482
        mov     al, '.'
1483
        stosb
1484
        stosb
1485
        stosb
1486
        sub     ecx, 3
1487
        sub     esi, ecx
1488
        add     [esp], esi
1489
@@:
1490
        pop     esi
1491
@@:
1492
        lodsb
1493
        stosb
1494
        test    al, al
1495
        jnz     @b
1496
        ret