Subversion Repositories Kolibri OS

Rev

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