Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1832 yogev_ezra 1
;
2
; нарисовать прямоугольник
3
; x1,y1 ---------|
4
; |              |
5
; |              |
6
; |-------------x2,y2
7
;
8
  macro rect x1, y1, x2, y2, color
9
   {
10
     pushad
11
 
2296 leency 12
     ;mov edx, color
1832 yogev_ezra 13
     ; ------------
2296 leency 14
     ;mov eax, 38
1832 yogev_ezra 15
     mov ebx, x1
16
     shl ebx, 16
17
     add ebx, x2
18
     mov ecx, y1
19
     shl ecx, 16
20
     add ecx, y1
2296 leency 21
     ;int 40h
22
     mcall 38, ebx, ecx, color
1832 yogev_ezra 23
 
24
     ; ------------
2296 leency 25
     ;mov eax, 38
1832 yogev_ezra 26
     mov ebx, x1
27
     shl ebx, 16
28
     add ebx, x2
29
     mov ecx, y2
30
     shl ecx, 16
31
     add ecx, y2
2296 leency 32
     ;int 40h
33
     mcall 38, ebx, ecx, color
1832 yogev_ezra 34
     ; |
35
     ; |
36
     ; |
2296 leency 37
     ;mov eax, 38
1832 yogev_ezra 38
     mov ebx, x1
39
     shl ebx, 16
40
     add ebx, x1
41
     mov ecx, y1
42
     shl ecx, 16
43
     add ecx, y2
2296 leency 44
     ;int 40h
45
     mcall 38, ebx, ecx, color
1832 yogev_ezra 46
     ; |
47
     ; |
48
     ; |
2296 leency 49
     ;mov eax, 38
1832 yogev_ezra 50
     mov ebx, x2
51
     shl ebx, 16
52
     add ebx, x2
53
     mov ecx, y1
54
     shl ecx, 16
55
     add ecx, y2
2296 leency 56
     ;int 40h
57
     mcall 38, ebx, ecx, color
58
 
1832 yogev_ezra 59
     popad
60
   }
61
 
62
;
63
;   Вывод на экран буфера со строками
64
;
65
 
2296 leency 66
scbuff db 80*41 dup 0
67
; 60 - длина строки
68
; 41 - количество строк
1832 yogev_ezra 69
;
70
ind db 0   ; Текущий индекс
71
;
72
;
73
x_s dw 15   ;  Координаты левого верхнего угла  FIXIT
74
y_s dw 38  ;
75
 
76
; Высота строки
77
SH = 10
78
 
2296 leency 79
xlen dw 80   ; длина строки
1832 yogev_ezra 80
;ylen dw 128   ; количество строк
81
ylen dw 40
82
 
83
;Последние 4 байта в строке обозначают цвет
84
 
85
  printbuff:
86
    pushad
87
 
88
    ;
89
    ; Нарисуем белый прямоугольник
90
    ;
2296 leency 91
    ;mov eax, 13
92
    ;mov ebx, 15*65536+480
93
    ;mov ecx, 31*65536+418
94
    ;mov edx, 0FFFFFFh
95
    ;int 40h
96
    mcall 13, (15 * 65536 + 480), (31 * 65536 + 418), 0x00FFFFFF
1832 yogev_ezra 97
 
98
 
99
 
100
    xor ecx, ecx ; Счетчик
101
    ;xor eax, eax
102
    xor ebx, ebx
103
    ;xor edx, edx
104
 
105
  pb_loop:
106
    xor edx, edx
107
    xor eax, eax
108
    mov dl, [ind]     ;  Индекс
109
    mov ax, [ylen]
110
    ;mul edx
111
    cmp ecx, eax
112
    ja pr_end
113
    ;
114
    ;
115
    add edx, ecx    ;Прибавим счетчик
116
    xor eax, eax
117
    mov ax, [ylen]
118
    cmp edx, eax    ;Индекс меньше количества строк
119
    jna @f           ;<=
120
    sub edx, eax    ;Если больше, считаем с начала
121
    dec edx
122
  @@:
123
    ;
124
    mov bx, [x_s]    ; Координата X
125
    shl ebx, 16      ;
126
    push ecx
127
    mov eax, SH       ; Вычисляем местоположение строки
128
    imul eax, ecx     ;
129
    ;mov ecx, eax
130
    ;xor eax, eax
131
 
132
    ;mov ax , [x_s]
133
    xor ecx, ecx
134
    mov cx, [y_s]
135
    add ecx, eax
136
    add ebx, ecx    ; Координата Y
137
    ;
138
    xor eax, eax
139
    mov ax, [xlen]  ;длина строки
140
    imul edx, eax         ;Умножаем счетчик на длину строки, получаем смещение относительно начала буфера
141
    ;mov edx, eax
142
    add edx, scbuff
143
 
144
    xor eax, eax
145
    mov ax, [xlen]
146
    sub eax, 4
147
    xor ecx, ecx
148
    mov ecx, dword [edx+eax]  ; Последние 4 Байта с цветом
149
    or ecx, 0x80000000        ; Выводить ASCIIZ
2296 leency 150
    ;mov eax, 4
151
   ;mov esi, -1               ; For Menuet
152
    ;int 40h
153
    mcall 4, ebx, ecx, edx
1832 yogev_ezra 154
    pop ecx
155
    inc ecx
156
    jmp pb_loop
157
 
158
 
159
  pr_end:
160
    popad
161
  ret
162
 
163
;
164
;  Отладочные сообщения
165
;
166
  macro write_debug str
167
    {
2296 leency 168
     local ..string, ..label, ..end, ..loop, ..fin, ..n_inc
1832 yogev_ezra 169
     jmp ..label
170
 
171
     ..string db str, 0
172
 
173
    ..label:
174
     pushad
175
     xor eax, eax
176
     xor ebx, ebx
177
     xor ecx, ecx
178
     xor edx, edx
179
 
180
     mov bl, [ind]
181
     mov ax, [xlen]
182
     imul ebx, eax
183
     add ebx, scbuff
184
 
2296 leency 185
     ;
186
     ; Черный цвет вывода
187
     ;
188
     mov edx, ebx
189
     lea edx, [edx+eax]
190
     sub edx, 4            ;4 байта с цветом
191
     mov dword [edx], dword 0
192
     xor edx, edx
193
 
194
 
1832 yogev_ezra 195
   ..loop:
196
     mov dl, [..string+ecx]
197
     cmp dl, 0
198
     jz ..end
199
     mov [ebx+ecx], dl
200
     inc ecx
201
     jmp ..loop
202
 
203
   ..end:
204
     mov [ebx+ecx], dl
205
     xor ebx, ebx
206
     mov bl, [ind]
207
     cmp bx, [ylen]
2296 leency 208
     jz ..n_inc
1832 yogev_ezra 209
     inc bl
210
     jmp ..fin
2296 leency 211
   ..n_inc:
1832 yogev_ezra 212
    xor bl, bl
213
 
214
   ..fin:
2296 leency 215
     mov [ind], bl
1832 yogev_ezra 216
     call printbuff
217
     ;call draw_window
218
     popad
219
    }
220
 
221
;
222
;  Кнопка
223
;
224
  macro draw_button x, y, xlen, ylen, id, str
225
   {
226
    pushad
227
    local ..string, ..label
228
    jmp ..label
229
    ..string db str, 0
230
 
231
    ..label:
2296 leency 232
 
233
    mcall 8, (x*65536+xlen), (y*65536+ylen), id, 0x4466aa
1832 yogev_ezra 234
 
2296 leency 235
    mcall 4, ((x+5)*65536+y+ylen/2-3), 0x80FFFFFF, ..string
1832 yogev_ezra 236
 
237
    popad
238
   }
239
 
240
;
241
; Отладочный вывод данных
242
;
243
  macro data_debug str, rg
244
    {
245
     pushad
2296 leency 246
     local ..string, ..end, ..loop, ..strend, ..fin, ..label, ..n_inc
1832 yogev_ezra 247
     jmp ..label
248
     ..string db str, 20h, 0, 0, 0, 0, 0, 0, 0, 0, 0
249
     ..strend:
250
 
251
     ..label:
252
     ;xor eax, eax
253
     ;xor ebx, ebx
254
     xor ecx, ecx
255
     xor edx, edx
256
 
257
     mov eax, rg
258
     lea ebx, [..strend-9]
259
     call int2str
260
 
261
     xor eax, eax
262
     xor ebx, ebx
263
 
264
     mov bl, [ind]
265
     mov ax, [xlen]
266
     imul ebx, eax
267
     add ebx, scbuff
268
 
2296 leency 269
     ;
270
     ; Черный цвет вывода
271
     ;
272
     mov edx, ebx
273
     lea edx, [edx+eax]
274
     sub edx, 4            ;4 байта с цветом
275
     mov dword [edx], dword 0
276
     xor edx, edx
277
 
1832 yogev_ezra 278
   ..loop:
279
     mov dl, [..string+ecx]
280
     cmp dl, 0
281
     jz ..end
282
     mov [ebx+ecx], dl
283
     inc ecx
284
     jmp ..loop
285
 
286
   ..end:
287
     mov [ebx+ecx], dl
288
     xor ebx, ebx
289
     mov bl, [ind]
290
     cmp bx, [ylen]
2296 leency 291
     jz ..n_inc
1832 yogev_ezra 292
     inc bl
293
     jmp ..fin
2296 leency 294
    ..n_inc:
1832 yogev_ezra 295
     xor bl, bl
296
 
297
    ..fin:
298
     mov [ind], bl
299
 
300
 
301
 
302
     call printbuff
303
     ;call draw_window
304
 
305
     popad
306
    }
307
 
308
; <--EAX
309
; -->[ebx]
310
;
311
  int2str:
312
    pushf
313
    ;push ebx
314
    push ecx
315
    push edx
316
    push esi
317
 
318
    ;xor ebx, ebx
319
    xor ecx, ecx
320
 
321
   i_loop:
322
    mov edx, eax
323
    push ecx
324
    shl ecx, 2
325
    mov esi, 28
326
    sub esi, ecx
327
    mov ecx, esi
328
    shr edx, cl
329
    pop ecx
330
    and dl, 0fh    ;Отделить младшие 4 бита
331
    cmp dl, 0Ah    ;Буква
332
    jnc @f
333
    or dl, 0x30
334
    jmp i_n1
335
 
336
  @@:
337
    sub dl, 9
338
    or dl, 0x40
339
  i_n1:
340
    mov [ebx+ecx], dl
341
    inc ecx
342
    cmp ecx, 8
343
    jnz i_loop
344
 
345
 
346
    pop esi
347
    pop edx
348
    pop ecx
349
    ;pop ebx
350
    popf
351
  ret
352
 
353
 
354
 
355
;
356
;  Для вывода сообщений
357
;  [eax] <-- null-terminated string
358
;   ebx <-- color
359
;
360
  writemsg:
361
    pushad
2296 leency 362
     xor edi, edi
363
 
364
 
365
   wm_loop:
366
     xor esi, esi            ; Если 1 - есть еще символы в строке
367
     lea eax, [eax+edi]
368
 
1832 yogev_ezra 369
     push ebx
370
     push eax
371
 
372
     xor eax, eax
373
     xor ebx, ebx
374
 
2296 leency 375
 
1832 yogev_ezra 376
     mov bl, [ind]
377
     mov ax, [xlen]
378
     imul ebx, eax
379
     add ebx, scbuff
380
 
2296 leency 381
 
382
 
383
 
384
     ;
385
     ; Разбиваем строку сообщения на несколько строк по xlen-4 (т.к в конце двойное слово - цвет строки)
386
     ;
387
 
388
 
1832 yogev_ezra 389
     pop eax
390
     mov edx, eax
391
     call strlen
2296 leency 392
 
393
     movzx ecx, [xlen]
394
     cmp eax, ecx
395
     jc @f            ;<
396
 
397
     movzx edi, [xlen]
398
     lea edi, [edi-4]
399
 
1832 yogev_ezra 400
     mov ecx, eax
2296 leency 401
     inc esi
402
 
403
 
404
    @@:
405
 
406
 
1832 yogev_ezra 407
     mov eax, edx
408
     call strcpy
409
 
410
     mov [ebx+ecx], byte 0x00
411
 
412
     xor eax, eax
413
     mov ax, [xlen]
414
     sub eax, 4
415
     pop ecx
416
     mov dword [ebx+eax], ecx  ; Последние 4 Байта с цветом
417
 
418
 
2296 leency 419
     xor eax, eax
420
     mov al, [ind]
421
     cmp ax, [ylen]
1832 yogev_ezra 422
     jz @f
2296 leency 423
     inc al
1832 yogev_ezra 424
     jmp ..fin
425
   @@:
2296 leency 426
    xor al, al
1832 yogev_ezra 427
 
428
   ..fin:
2296 leency 429
     mov [ind], al
430
     mov ebx, ecx   ; цвет
431
     mov eax, edx   ; указатель на строку
1832 yogev_ezra 432
 
2296 leency 433
     cmp esi, 0
434
     jnz wm_loop
435
 
436
 
1832 yogev_ezra 437
     call printbuff
438
 
439
    popad
440
  ret
441
 
442
;
443
;
444
 
445
 
446
 
447
; <--EAX       Перевод из 16 в 10 форму
2296 leency 448
; -->[ebx]     строка
1832 yogev_ezra 449
; --> eax длина
450
  int2strd:
451
    pushf
452
    ;push ebx
453
    push ecx
454
    push edx
455
    push esi
456
    ;push edi
457
 
458
    ;xor ebx, ebx
459
    xor ecx, ecx
460
    mov esi, 10
461
 
462
 
463
   id_loop:
464
    xor edx, edx
465
 
466
    div esi
467
 
468
    and dl, 0fh    ;Отделить младшие 4 бита
469
    or dl, 0x30
470
 
471
    mov [ebx+ecx], dl
472
    cmp eax, 10
473
    inc ecx
474
    jnc id_loop
475
 
476
    and al, 0fh    ;Отделить младшие 4 бита
477
    or al, 0x30
478
 
479
    mov [ebx+ecx], al
480
    ;mov [ebx+ecx+1], byte 0
481
    inc ecx
482
    mov eax, ecx
483
    ; перевернуть полученную строку
484
    ;
485
    ;xor edx, edx
486
 
487
    ;mov esi, 2
488
    ;div esi
489
    shr eax, 1
490
 
491
    xor edx, edx
492
 
493
   id_loop2:
494
    cmp eax, 0
495
    jz id_end
496
 
497
 
498
    mov dl, [ebx+eax-1]
499
    lea esi, [ebx+ecx]
500
    sub esi, eax
501
    mov dh, [esi]
502
 
503
    mov [ebx+eax-1], dh
504
    mov [esi], dl
505
 
506
    dec eax
507
    jmp id_loop2
508
 
509
 
510
 
511
 
512
    id_end:
513
    mov eax, ecx
514
 
515
    ;pop edi
516
    pop esi
517
    pop edx
518
    pop ecx
519
    ;pop ebx
520
    popf
521
  ret
522
 
523
;
524
;
525
;
526
x_bb dw 550                ;  Координаты левого верхнего угла
527
y_bb dw 30                ;
528
;
529
bb_width dw 100           ; Ширина кнопок
2296 leency 530
bb_height dw 12          ; высота кнопок
1832 yogev_ezra 531
;
2296 leency 532
bb_dist  dw 6           ; Расстояние между кнопками
1832 yogev_ezra 533
 
534
; Идентификаторы кнопок начиная с 100
535
;
536
;  Для КЛ
537
;
538
;
539
  buttonbox:
540
    pushad
541
    pushf
542
 
543
    xor ecx, ecx
544
    xor eax, eax
545
    xor ebx, ebx
546
 
547
  bb_loop:
548
 
549
    ; Проверяем первый байт уина, если 0, кнопку рисовать не надо
2296 leency 550
    ;mov ebx, NAME_LEN
551
    ;imul ebx, ecx
552
 
553
    ;mov al, [names+ebx]
554
    ;cmp al, 0
555
    ;jz bb_end
556
 
557
    mov ebx, UIN_LEN
1832 yogev_ezra 558
    imul ebx, ecx
559
 
2296 leency 560
    mov al, [uins + ebx]
1832 yogev_ezra 561
    cmp al, 0
562
    jz bb_end
2296 leency 563
 
564
 
565
 
566
 
1832 yogev_ezra 567
    ; рисуем кнопку
568
    ; Цвет зависит от статуса UIN
569
    mov ebx, 4
570
    imul ebx, ecx
571
    mov eax, [stats+ebx]     ; В старшем слове дополнительный статус
572
    cmp ax, -1
573
    jz bb_offline
574
    cmp ax, 1
575
    jz bb_away
576
    cmp ax, 2
577
    jz bb_dnd
578
    cmp ax, 4
579
    jz bb_na
580
    cmp ax, 10h
581
    jz bb_bisy
582
    cmp ax, 20h
583
    jz bb_free4chat
584
    cmp ax, 100h
585
    jz bb_invis
586
    ; Online
587
    mov esi, 0x4466AA
588
    jmp bb_dr
589
 
590
  bb_offline:
591
    mov esi, 0xBEBEBE
592
    jmp bb_dr
593
 
594
  bb_away:
595
    mov esi, 0x14dcc3
596
    jmp bb_dr
597
 
598
  bb_dnd:
599
    mov esi, 0x14dcc3
600
    jmp bb_dr
601
 
602
  bb_na:
603
    mov esi, 0x14dcc3
604
    jmp bb_dr
605
 
606
  bb_bisy:
607
    mov esi, 0x14dcc3
608
    jmp bb_dr
609
 
610
  bb_free4chat:
611
    mov esi, 0x2233FF
612
    jmp bb_dr
613
 
614
  bb_invis:
615
    mov esi, 0xD0D0D0
616
 
617
  bb_dr:
618
 
619
    mov bx, [x_bb]
620
    shl ebx, 16
621
    mov bx, [bb_width]
622
    ;push ecx
623
    mov edx, ecx
624
    lea edx, [edx+100]      ; ID
625
    mov edi, ecx
626
    mov cx, [y_bb]
627
    movzx eax, [bb_height]
628
    add ax, [bb_dist]
629
    imul eax, edi
630
    add ecx, eax
631
    shl ecx, 16
632
    mov cx, [bb_height]
633
    mov eax, 8
634
    int 40h
635
 
636
    ;
637
    ; Надпись на кнопке
638
    ;
639
    add ebx, 50000h     ; Смещение от левого края
640
    shr ecx, 16
641
    movzx eax, [bb_height]
642
    shr eax, 1          ;  /2
643
    sub eax, 3          ; смещение вверх от центра
644
    add ecx, eax        ; + половина размера кнопки
645
    mov bx, cx
646
    mov ecx, 0x80FFFFFF ; Цвет
647
    mov edx, names
648
    mov esi, NAME_LEN
649
    imul esi, edi
650
    add edx, esi
651
    ;mov esi, -1
652
    mov eax, 4
653
    int 40h
654
 
655
    mov ecx, edi
656
    inc ecx
657
    cmp ecx, UINS
658
    ja bb_end
659
    jmp bb_loop
660
 
661
 
662
  bb_end:
663
    popf
664
    popad
665
  ret
666
;
667
; Массив с UIN
668
;
669
UIN_LEN = 11            ; Длина
2296 leency 670
UINS    = 22            ; Количество
1832 yogev_ezra 671
;
672
uins db UIN_LEN*UINS dup 0
673
;
674
; массив со статусами
675
;
676
stats dd UINS dup -1
677
;
678
; Массив с именами
679
;
680
NAME_LEN = 30
681
 
682
names db NAME_LEN*UINS dup 0
683
 
684
;
685
;
2296 leency 686
U1 db '405577261',0
687
U2 db '455395049',0
688
U3 db '488118046',0
1832 yogev_ezra 689
;
690
; Загрузка массива UIN
691
;
2296 leency 692
; FIXME будет удалена
1832 yogev_ezra 693
  loaduin:
694
    pushad
695
    mov eax, U1
696
    mov ebx, uins
697
    mov ecx, 9
698
    call strcpy
699
 
700
    mov ebx, names
701
    call strcpy
702
 
703
    mov eax, U2
704
    mov ebx, uins+UIN_LEN
705
    mov ecx, 9
706
    call strcpy
707
 
708
    mov ebx, names+NAME_LEN
709
    call strcpy
710
 
711
    mov eax, U3
712
    mov ebx, uins+UIN_LEN*2
713
    mov ecx, 9
714
    call strcpy
715
 
716
    mov ebx, names+NAME_LEN*2
717
    call strcpy
718
 
719
 
720
    popad
721
  ret
722
 
723
;
724
; Функция для загрузки КЛ никами и статусами
725
; eax    <--   Номер уина по порядку в массиве uins, начиная с 0
726
; [ebx]  <--   указатель на null-terminated строку с новым именем
727
; ecx    <--   Новый статус
728
;
729
   loadbb:
730
     pushad
731
     pushf
732
     ;
733
     ; Проверяем номер
734
     ;
735
     cmp eax, UINS
736
     jnc loadbb_end        ;>=
737
 
738
 
739
     ;
740
     ; Удаляем кнопку
741
     ;
742
     push ecx
743
     push ebx
744
     push eax
745
 
746
     lea edx, [eax+100]
747
     or edx, 0x80000000
748
     mov eax, 8
749
     int 40h
750
 
751
     ;
752
     ; Сохраняем новый статус в массиве статусов
753
     ;
754
     pop eax
755
     mov edx, 4                 ; DWORD
756
     imul edx, eax
757
     mov [stats+edx], ecx
758
     ;
759
     ; Сохраняем новое имя
760
     ;
761
     mov edi, eax               ; edi <-- Uin number
762
     pop eax                    ; <-- offset of string
763
     mov ebx, eax
764
     call strlen
765
     mov ecx, eax               ; Len
766
 
767
 
768
     mov eax, ebx               ;Source
769
     mov edx, NAME_LEN
770
     imul edx, edi
771
     lea ebx, [names+edx]       ; Dest
772
     call strcpy
773
     mov [names+edx+ecx], byte 0
774
 
775
     xchg edi, eax              ; eax - счетик, edi - указатель на строку
776
 
777
     pop ecx
778
     push edi
779
     ; рисуем кнопку
780
     ; Цвет зависит от статуса UIN
781
 
782
     cmp cx, -1
783
     jz l_offline
784
     cmp cx, 1
785
     jz l_away
786
     cmp cx, 2
787
     jz l_dnd
788
     cmp cx, 4
789
     jz l_na
790
     cmp cx, 10h
791
     jz l_bisy
792
     cmp cx, 20h
793
     jz l_free4chat
794
     cmp cx, 100h
795
     jz l_invis
796
     ; Online
797
     mov esi, 0x4466AA
798
     jmp l_dr
799
 
800
   l_offline:
801
     mov esi, 0xBEBEBE
802
     jmp l_dr
803
 
804
   l_away:
805
     mov esi, 0x14dcc3
806
     jmp l_dr
807
 
808
   l_dnd:
809
     mov esi, 0x14dcc3
810
     jmp l_dr
811
 
812
   l_na:
813
     mov esi, 0x14dcc3
814
     jmp l_dr
815
 
816
   l_bisy:
817
     mov esi, 0x14dcc3
818
     jmp l_dr
819
 
820
   l_free4chat:
821
     mov esi, 0x2233FF
822
     jmp l_dr
823
 
824
   l_invis:
825
     mov esi, 0xD0D0D0
826
 
827
   l_dr:
828
 
829
     mov bx, [x_bb]
830
     shl ebx, 16
831
     mov bx, [bb_width]
832
     ;push ecx
833
     mov edx, eax
834
     lea edx, [edx+100]      ; ID
835
     mov edi, eax
836
     mov cx, [y_bb]
837
     movzx eax, [bb_height]
838
     add ax, [bb_dist]
839
     imul eax, edi
840
     add ecx, eax
841
     shl ecx, 16
842
     mov cx, [bb_height]
843
     mov eax, 8
844
     int 40h
845
 
846
    ;
847
    ; Надпись на кнопке
848
    ;
849
    add ebx, 50000h     ; Смещение от левого края
850
    shr ecx, 16
851
    movzx eax, [bb_height]
852
    shr eax, 1          ;  /2
853
    sub eax, 3          ; смещение вверх от центра
854
    add ecx, eax        ; + половина размера кнопки
855
    mov bx, cx
856
    mov ecx, 0x80FFFFFF ; Цвет
857
    pop edx
858
   mov esi, -1
859
    mov eax, 4
860
    int 40h
861
 
862
 
863
 
864
   loadbb_end:
865
 
866
     popf
867
     popad
2296 leency 868
   ret
869
 
870
;
871
;
872
; Отладочная функция - выводит область памяти
873
; EAX - указатель на область
874
; EBX - количество байт
875
;
876
 
877
 print_mem:
878
   push eax
879
   push ebx
880
   push ecx
881
   push edx
882
   push esi
883
 
884
   xor ecx, ecx
885
   xor esi, esi
886
 
887
 
888
 pm_loop:
889
   cmp ecx, ebx
890
   jz pm_exit
891
 
892
 
893
   mov dl, [eax + ecx]
894
   shr dl, 4        ;Сдвинуть на 4 разряда вправо
895
 
896
   cmp dl, 0x0A
897
   jnb pm_chars
898
 
899
   or dl, 0x30
900
   jmp pm_write
901
 
902
  pm_chars:
903
   add dl, 0x37
904
 
905
  pm_write:
906
   mov [membuff + esi], dl
907
   inc esi
908
   ;
909
   ;
910
 
911
   mov dl, [eax + ecx]
912
   and dl, 0x0F
913
 
914
   cmp dl, 0x0A
915
   jnb pm_chars2
916
 
917
   or dl, 0x30
918
   jmp pm_write2
919
 
920
  pm_chars2:
921
   add dl, 0x37
922
 
923
  pm_write2:
924
   mov [membuff + esi], dl
925
   inc esi
926
 
927
 
928
   mov [membuff + esi], 0x20
929
   inc esi
930
 
931
   cmp esi, MEMBUFF_SIZE - 2
932
   jb pm_nwrite
933
   ;
934
   ; вывести буфер
935
   mov [membuff + esi], byte 0
936
 
937
   push eax
938
   push ebx
939
 
940
   mov eax, membuff
941
   xor ebx, ebx
942
   xor esi, esi
943
 
944
   call writemsg
945
 
946
   pop ebx
947
   pop eax
948
 
949
  pm_nwrite:
950
 
951
   inc ecx
952
   jmp pm_loop
953
 
954
 
955
 
956
  pm_exit:
957
 
958
   mov [membuff + esi], byte 0
959
 
960
 
961
   mov eax, membuff
962
   xor ebx, ebx
963
   xor esi, esi
964
 
965
   call writemsg
966
 
967
   pop esi
968
   pop edx
969
   pop ecx
970
   pop ebx
971
   pop eax
972
 ret