Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
214 serge 1
 
2
3
 
4
5
 
6
 
7
8
 
227 serge 9
214 serge 10
 
11
12
 
227 serge 13
LOAD_FROM_MEM   equ 1
14
LOAD_INDIRECT   equ 2
15
LOAD_SYSTEM     equ 3
16
17
 
18
  .biSize          dd ? ; DWORD
19
  .biWidth         dd ? ; LONG
20
  .biHeight        dd ? ; LONG
21
  .biPlanes        dw ? ; WORD
22
  .biBitCount      dw ? ; WORD
23
  .biCompression   dd ? ; DWORD
24
  .biSizeImage     dd ? ; DWORD
25
  .biXPelsPerMeter dd ? ; LONG
26
  .biYPelsPerMeter dd ? ; LONG
27
  .biClrUsed       dd ? ; DWORD
28
  .biClrImportant  dd ? ; DWORD
29
}
30
31
 
32
  BI BITMAPINFOHEADER
33
end virtual
34
35
 
36
{  .magic       dd ?
37
   .size        dd ?
38
   .pid         dd ?
39
   .base        dd ?
40
   .hot_x       dd ?
41
   .hot_y       dd ?
42
}
43
virtual at 0
44
  CURSOR CURSOR
45
end virtual
46
47
 
48
49
 
214 serge 50
R9000       equ 0x4966  ;RV250
51
R9200       equ 0x5961  ;RV280
52
R9500       equ 0x4144  ;R300
53
R9500P      equ 0x4E45  ;R300
54
R9550       equ 0x4153  ;RV350
55
R9600       equ 0x4150  ;RV350
56
R9600XT     equ 0x4152  ;RV360
57
R9700P      equ 0x4E44  ;R300
58
R9800       equ 0x4E49  ;R350
59
R9800P      equ 0x4E48  ;R350
60
R9800XT     equ 0x4E4A  ;R360
61
62
 
63
new_app_base    equ 0x60400000;   0x01000000
64
PROC_BASE       equ OS_BASE+0x0080000
65
66
 
67
PG_NOCACHE   equ 0x018
68
69
 
70
{  .handle           dd ?
71
   .io_code          dd ?
72
   .input            dd ?
73
   .inp_size         dd ?
74
   .output           dd ?
75
   .out_size         dd ?
76
}
77
78
 
79
  IOCTL IOCTL
80
end virtual
81
82
 
83
RD_RB3D_CNTL          equ 1c3ch
84
85
 
86
RD_CRTC_GEN_CNTL           equ 0050h
87
RD_CRTC_CUR_EN             equ 10000h
88
RD_DISPLAY_BASE_ADDR       equ 023ch
89
RD_DEFAULT_OFFSET          equ 16e0h
90
CUR_HORZ_VERT_OFF          equ 0268h
91
CUR_HORZ_VERT_POSN         equ 0264h
92
CUR_OFFSET                 equ 0260h
93
RD_RB3D_CNTL               equ 1c3ch
94
RD_RBBM_STATUS             equ 0e40h
95
RD_RBBM_FIFOCNT_MASK       equ 007fh
96
RD_RBBM_ACTIVE             equ 80000000h
97
RD_TIMEOUT                 equ 2000000
98
99
 
100
RD_DP_BRUSH_BKGD_CLR       equ 01478h
101
RD_DP_BRUSH_FRGD_CLR       equ 0147ch
102
RD_DP_SRC_BKGD_CLR         equ 015dch
103
RD_DP_SRC_FRGD_CLR         equ 015d8h
104
RD_DP_CNTL                 equ 016c0h
105
RD_DP_DATATYPE             equ 016c4h
106
RD_DP_WRITE_MASK           equ 016cch
107
RD_DP_SRC_SOURCE_MEMORY    equ (2 shl 24)
108
RD_DP_SRC_SOURCE_HOST_DATA equ (3 shl 24)
109
RD_DEFAULT_SC_BOTTOM_RIGHT equ 16e8h
110
RD_GMC_BRUSH_SOLID_COLOR   equ (13 shl 4)
111
RD_DEFAULT_SC_RIGHT_MAX    equ 1fffh
112
RD_DEFAULT_SC_BOTTOM_MAX   equ 1fff0000h
113
RD_GMC_DST_DATATYPE_SHIFT  equ 8
114
115
 
116
RD_ROP3_P                  equ 00f00000h
117
118
 
119
RD_RB2D_DSTCACHE_CTLSTAT   equ 0342ch
120
RD_RB2D_DC_FLUSH_ALL       equ 000fh
121
RD_RB2D_DC_BUSY            equ 80000000h
122
123
 
124
RD_GMC_SRC_DATATYPE_COLOR  equ (3 shl 12)
125
RD_GMC_CLR_CMP_CNTL_DIS    equ (1 shl 28)
126
RD_GMC_WR_MSK_DIS          equ (1 shl 30)
127
128
 
129
130
 
131
RD_SRC_PITCH_OFFSET        equ 1428h
132
133
 
134
RD_DST_Y_TOP_TO_BOTTOM     equ 2
135
RD_DST_Y_X                 equ 1438h
136
RD_DST_WIDTH_HEIGHT        equ 1598h
137
RD_DST_LINE_START          equ 1600h
138
RD_DST_LINE_END            equ 1604h
139
R300_MEM_NUM_CHANNELS_MASK equ 0003h
140
141
 
142
{
143
     mov edi, [ati_io]
144
     mov op1, [edi+op2]
145
}
146
147
 
148
{
149
     mov edi, [ati_io]
150
     mov dword [edi+dest], src
151
}
152
153
 
154
 
155
public service_proc
156
public version
227 serge 157
214 serge 158
 
159
extrn PciApi
160
extrn PciRead32
161
extrn AllocKernelSpace
162
extrn MapPage
163
extrn RegService
164
extrn SetHwCursor
165
extrn HwCursorRestore
227 serge 166
extrn HwCursorCreate
167
extrn LFBAddress
214 serge 168
extrn LoadFile
169
170
 
171
172
 
173
DRV_EXIT  equ -1
174
175
 
176
177
 
178
179
 
227 serge 180
           jne .exit
181
182
 
214 serge 183
           mov esi, msgInit
184
           call SysMsgBoardStr
185
     end if
186
187
 
188
           test eax, eax
227 serge 189
           jz .fail
214 serge 190
191
 
192
           test eax, eax
193
           jz .fail
194
195
 
227 serge 196
           mov edi, cursors
197
           mov ecx, CURSOR_SIZE*16
198
           cld
199
           rep stosd
200
201
 
202
           mov [cursor_map], eax
203
           mov [cursor_map+4], eax
204
           mov edx, cursor_map
205
           mov [cursor_start], edx
206
           add edx, 4
207
           mov [cursor_end], edx
208
209
 
214 serge 210
           test eax, eax
211
           jz .fail
212
           mov dword [SetHwCursor], drvCursorPos ;enable hardware cursor
227 serge 213
           mov dword [HwCursorRestore], drv_restore
214
           mov dword [HwCursorCreate], ati_cursor
215
           ret
216
.fail:
214 serge 217
     if DEBUG
218
           mov esi, msgFail
227 serge 219
           call SysMsgBoardStr
214 serge 220
     end if
221
222
 
223
           xor eax, eax
224
;           mov ebx, SetHwCursor
227 serge 225
;           mov dword [ebx], eax    ;force disable hardware cursor
226
           ret
214 serge 227
endp
228
229
 
230
io_code    equ  IOCTL.io_code
231
input      equ  IOCTL.input
232
inp_size   equ  IOCTL.inp_size
233
output     equ  IOCTL.output
234
out_size   equ  IOCTL.out_size
235
236
 
237
proc service_proc stdcall, ioctl:dword
238
239
 
240
;           mov eax, [edi+io_code]
241
242
 
227 serge 243
            ret
244
endp
214 serge 245
246
 
247
restore   io_code
248
restore   input
249
restore   inp_size
250
restore   output
251
restore   out_size
252
253
 
254
proc detect_ati
255
           locals
227 serge 256
             last_bus dd ?
257
           endl
258
214 serge 259
 
227 serge 260
           mov [bus], eax
261
           inc eax
262
           call PciApi
214 serge 263
           cmp eax, -1
227 serge 264
           je .err
214 serge 265
266
 
227 serge 267
214 serge 268
 
269
           and [devfn], 0
227 serge 270
.next_dev:
214 serge 271
           stdcall PciRead32, [bus], [devfn], dword 0
272
           test eax, eax
227 serge 273
           jz .next
274
           cmp eax, -1
275
           je .next
276
214 serge 277
 
227 serge 278
@@:
214 serge 279
           mov ebx, [edi]
227 serge 280
           test ebx, ebx
281
           jz .next
282
214 serge 283
 
227 serge 284
           je .found
285
           add edi, 4
214 serge 286
           jmp @B
227 serge 287
214 serge 288
 
227 serge 289
           inc [devfn]
290
           cmp [devfn], 256
291
           jb  .next_dev
292
           mov eax, [bus]
293
           inc eax
294
           mov [bus], eax
295
           cmp eax, [last_bus]
296
           jna .next_bus
297
           xor eax, eax
298
           ret
299
.found:
214 serge 300
           xor eax, eax
227 serge 301
           inc eax
214 serge 302
           ret
227 serge 303
.err:
214 serge 304
           xor eax, eax
305
           ret
306
endp
307
308
 
309
proc init_ati
310
311
 
312
           test eax, eax
313
           jz .fail
314
315
 
316
317
 
318
           and eax, 0xFFFF0000
319
           mov esi, eax
320
321
 
322
           mov edx, 16
323
@@:
324
           stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
325
           add edi, 0x1000
227 serge 326
           add esi, 0x1000
214 serge 327
           dec edx
328
           jnz @B
329
330
 
331
           mov dword [edi+RD_RB3D_CNTL], 0
332
           call engRestore
333
334
 
335
           mov eax, [edi+0x50]
336
           mov ebx,3
337
           shl ebx,20
338
           not ebx
339
           and eax,ebx
340
           mov ebx, 2
341
           shl ebx,20
342
           or eax, ebx
343
           mov [edi+0x50], eax
344
345
 
346
           xor eax, eax
347
           inc eax
348
.fail:
349
           ret
350
endp
351
352
 
353
drv_restore:
227 serge 354
           ret 8
355
356
 
357
drvShowCursor:
214 serge 358
           mov edi, [ati_io]
359
360
 
361
           bts eax,16
362
           mov [edi+RD_CRTC_GEN_CNTL], eax
363
           ret
364
365
 
366
proc drvCursorPos stdcall, hcursor:dword, x:dword, y:dword
227 serge 367
368
 
214 serge 369
           wrr CUR_HORZ_VERT_OFF, eax
370
371
 
227 serge 372
           shl eax, 16
214 serge 373
           or eax, [y]
227 serge 374
           or eax, 80000000h
214 serge 375
           wrr CUR_HORZ_VERT_POSN, eax
376
377
 
227 serge 378
           mov eax, [esi+CURSOR.base]
379
           sub eax, LFBAddress
380
           wrr CUR_OFFSET, eax
214 serge 381
           ret
227 serge 382
endp
383
214 serge 384
 
385
proc video_alloc
227 serge 386
387
 
388
           cli
389
           mov ebx, [cursor_start]
390
           mov ecx, [cursor_end]
391
.l1:
392
           bsf eax,[ebx];
393
           jnz .found
394
           add ebx,4
395
           cmp ebx, ecx
396
           jb .l1
397
           popfd
398
           xor eax,eax
399
           ret
400
.found:
401
           btr [ebx], eax
402
           popfd
403
404
 
405
           sub ebx, cursor_map
406
           shl ebx, 3
407
           add eax,ebx
408
409
 
410
           add eax, LFBAddress+CURSOR_IMAGE_OFFSET
411
           ret
412
endp
413
414
 
415
proc ati_cursor stdcall, hcursor:dword, src:dword, flags:dword
416
417
 
418
419
 
420
           mov [edi+CURSOR.base], eax
421
422
 
423
           mov ebx, [flags]
424
           cmp bx, LOAD_INDIRECT
425
           je .indirect
426
427
 
428
           movzx edx, word [esi+12]
429
           mov [edi+CURSOR.hot_x], ecx
430
           mov [edi+CURSOR.hot_y], edx
431
432
 
433
           mov eax, [hcursor]
434
.fail:
435
           ret
436
.indirect:
437
           shr ebx, 16
438
           movzx ecx, bh
439
           movzx edx, bl
440
           mov [eax+CURSOR.hot_x], ecx
441
           mov [eax+CURSOR.hot_y], edx
442
443
 
444
           push edi
445
           mov ecx, 64*64
446
           xor eax,eax
447
           rep stosd
448
449
 
450
           pop edi
451
           mov ebx, 32
452
           cld
453
@@:
454
           mov ecx, 32
455
           rep movsd
456
           add edi, 128
457
           dec ebx
458
           jnz @B
459
           mov eax, [hcursor]
460
           ret
461
endp
462
463
 
464
proc ati_init_cursor stdcall, dst:dword, src:dword
465
           locals
214 serge 466
             rBase    dd ?
467
             pQuad    dd ?
468
             pBits    dd ?
469
             pAnd     dd ?
470
             width    dd ?
471
             height   dd ?
472
             counter  dd ?
473
           endl
474
475
 
227 serge 476
           add esi,[esi+18]
477
           mov eax,esi
478
214 serge 479
 
227 serge 480
           je .img_24
481
.img_4:
482
           add eax, [esi]
214 serge 483
           mov [pQuad],eax
484
           add eax,64
485
           mov [pBits],eax
486
           add eax, 0x200
487
           mov [pAnd],eax
488
           mov eax,[esi+4]
489
           mov [width],eax
490
           mov ebx,[esi+8]
491
           shr ebx,1
492
           mov [height],ebx
493
494
 
495
           add edi, 32*31*4
496
           mov [rBase],edi
497
498
 
499
           mov ebx, [pBits]
500
.l1:
501
           mov eax, [esi]
502
           bswap eax
503
           mov [counter], 16
504
@@:
505
           xor edx, edx
506
           shl eax,1
507
           setc dl
508
           dec edx
509
510
 
511
           and ecx, 0xF0
512
           shr ecx, 2
513
           add ecx, [pQuad]
514
           mov ecx, [ecx]
515
           and ecx, edx
516
           and edx, 0xFF000000
517
           or edx, ecx
518
           mov [edi], edx
519
520
 
521
           shl eax,1
522
           setc dl
523
           dec edx
524
525
 
526
           and ecx, 0x0F
527
           shl ecx, 2
528
           add ecx, [pQuad]
529
           mov ecx, [ecx]
530
           and ecx, edx
531
           and edx, 0xFF000000
532
           or edx, ecx
533
           mov [edi+4], edx
534
535
 
536
           add edi, 8
537
           dec [counter]
538
           jnz @B
539
540
 
541
           mov edi,[rBase]
542
           sub edi,128
543
           mov [rBase],edi
544
           sub [height],1
545
           jnz .l1
546
           jmp .copy
227 serge 547
214 serge 548
 
227 serge 549
           add eax, [esi]
550
           mov [pQuad],eax
551
           add eax, 0xC00
552
           mov [pAnd],eax
553
           mov eax,[esi+BI.biWidth]
554
           mov [width],eax
555
           mov ebx,[esi+BI.biHeight]
556
           shr ebx,1
557
           mov [height],ebx
558
559
 
560
           add edi, 32*31*4
561
           mov [rBase],edi
562
563
 
564
           mov ebx, [pQuad]
565
.row_24:
566
           mov eax, [esi]
567
           bswap eax
568
           mov [counter], 32
569
@@:
570
           xor edx, edx
571
           shl eax,1
572
           setc dl
573
           dec edx
574
575
 
576
           and ecx, 0x00FFFFFF
577
           and ecx, edx
578
           and edx, 0xFF000000
579
           or edx, ecx
580
           mov [edi], edx
581
           add ebx, 3
582
           add edi, 4
583
           dec [counter]
584
           jnz @B
585
586
 
587
           mov edi,[rBase]
588
           sub edi,128
589
           mov [rBase],edi
590
           sub [height],1
591
           jnz .row_24
592
.copy:
593
           mov edi, [dst]
594
           mov ecx, 64*64
214 serge 595
           xor eax,eax
596
           rep stosd
597
598
 
599
           mov edi, [dst]
227 serge 600
           mov ebx, 32
214 serge 601
           cld
227 serge 602
@@:
603
           mov ecx, 32
214 serge 604
           rep movsd
227 serge 605
           add edi, 128
214 serge 606
           dec ebx
227 serge 607
           jnz @B
608
214 serge 609
 
610
endp
611
612
 
613
proc engFlush
614
615
 
616
617
 
618
           or eax,RD_RB2D_DC_FLUSH_ALL
619
           mov [edi+RD_RB2D_DSTCACHE_CTLSTAT],eax
620
621
 
622
@@:
623
           mov eax,[edi+RD_RB2D_DSTCACHE_CTLSTAT]
624
           and eax, RD_RB2D_DC_BUSY
625
           jz .exit
626
627
 
628
           jnz @B
629
.exit:
630
           ret
631
endp
632
633
 
634
engWaitForFifo:
635
cnt equ bp+8
636
           push ebp
637
           mov ebp, esp
638
639
 
640
641
 
642
@@:
643
           mov eax, [edi+RD_RBBM_STATUS]
644
           and eax, RD_RBBM_FIFOCNT_MASK
645
           cmp eax, [ebp+8]
646
           jae .exit
647
648
 
649
           jmp @B
650
651
 
652
           leave
653
           ret 4
654
655
 
656
proc engWaitForIdle
657
658
 
227 serge 659
           call engWaitForFifo
660
214 serge 661
 
227 serge 662
           mov ecx ,RD_TIMEOUT
663
@@:
214 serge 664
           mov eax, [edi+RD_RBBM_STATUS]
227 serge 665
           and eax,RD_RBBM_ACTIVE
666
           jz .exit
667
214 serge 668
 
227 serge 669
           jnz @B
670
.exit:
214 serge 671
           call engFlush
227 serge 672
           ret
673
endp
214 serge 674
675
 
676
proc engRestore
677
678
 
679
;             call engWaitForFifo
680
681
 
682
683
 
227 serge 684
           call engWaitForFifo
685
214 serge 686
 
687
688
 
689
           shr eax, 10d
690
           or eax,(64d shl 22d)
691
           mov [edi+RD_DEFAULT_OFFSET],eax
692
           mov [edi+RD_SRC_PITCH_OFFSET],eax
693
           mov [edi+RD_DST_PITCH_OFFSET],eax
694
695
 
696
           call engWaitForFifo
697
698
 
699
           mov eax, [edi+RD_DP_DATATYPE]
700
           btr eax, 29d
701
           mov [edi+RD_DP_DATATYPE],eax
702
703
 
704
           call engWaitForFifo
705
706
 
707
           mov dword [edi+RD_DEFAULT_SC_BOTTOM_RIGHT],\
708
                     (RD_DEFAULT_SC_RIGHT_MAX or RD_DEFAULT_SC_BOTTOM_MAX)
709
710
 
711
           call engWaitForFifo
712
713
 
714
           mov dword [edi+RD_DP_GUI_MASTER_CNTL],\
715
                     (RD_GMC_BRUSH_SOLID_COLOR or \
716
                      RD_GMC_SRC_DATATYPE_COLOR or \
717
                     (6 shl RD_GMC_DST_DATATYPE_SHIFT) or \
718
                      RD_GMC_CLR_CMP_CNTL_DIS or \
719
                      RD_ROP3_P or \
720
                      RD_GMC_WR_MSK_DIS)
721
722
 
723
 
724
           call engWaitForFifo
725
726
 
727
728
 
729
           mov dword [edi+RD_DST_LINE_END], 0
730
           mov dword [edi+RD_DP_BRUSH_FRGD_CLR], 808000ffh
731
           mov dword [edi+RD_DP_BRUSH_BKGD_CLR], 002020ffh
732
           mov dword [edi+RD_DP_SRC_FRGD_CLR],   808000ffh
733
           mov dword [edi+RD_DP_SRC_BKGD_CLR],   004000ffh
734
           mov dword [edi+RD_DP_WRITE_MASK],0ffffffffh
735
736
 
737
738
 
739
endp
740
741
 
742
engSetupSolidFill:
743
           push ebp
744
           mov ebp, esp
745
746
 
747
           call engWaitForFifo
748
749
 
750
751
 
752
           wrr RD_DP_BRUSH_FRGD_CLR,eax
753
754
 
755
           mov dword [edi+RD_DP_CNTL],(RD_DST_X_LEFT_TO_RIGHT or RD_DST_Y_TOP_TO_BOTTOM)
756
           leave
757
           ret 4
758
759
 
760
 
761
drvSolidFill:
762
;x:word,y:word,w:word,h:word,color:dword
763
            push ebp
764
            mov ebp, esp
765
x equ ebp+8
766
y equ ebp+12
767
w equ ebp+16
768
h equ ebp+20
769
color equ ebp+24
770
771
 
227 serge 772
           call engSetupSolidFill
773
214 serge 774
 
227 serge 775
           call engWaitForFifo
776
214 serge 777
 
227 serge 778
214 serge 779
 
227 serge 780
           mov ebx, [x]
781
           shl eax,16
782
           or eax, ebx
783
214 serge 784
 
227 serge 785
           mov edx,  [h]
786
           shl ecx,16
787
           or ecx, edx
788
           mov [edi+RD_DST_Y_X], eax
789
           mov [edi+RD_DST_WIDTH_HEIGHT], ecx
790
           call engFlush
791
           leave
792
           ret 20
793
214 serge 794
 
795
devices dd (R8500   shl 16)+VID_ATI
796
        dd (R9000   shl 16)+VID_ATI
797
        dd (R9200   shl 16)+VID_ATI
798
        dd (R9500   shl 16)+VID_ATI
799
        dd (R9500P  shl 16)+VID_ATI
800
        dd (R9550   shl 16)+VID_ATI
801
        dd (R9600   shl 16)+VID_ATI
802
        dd (R9600XT shl 16)+VID_ATI
803
        dd (R9700P  shl 16)+VID_ATI
804
        dd (R9800   shl 16)+VID_ATI
805
        dd (R9800P  shl 16)+VID_ATI
806
        dd (R9800XT shl 16)+VID_ATI
807
        dd 0    ;terminator
808
809
 
227 serge 810
214 serge 811
 
227 serge 812
214 serge 813
 
814
msgPCI       db 'PCI accsess not supported',13,10,0
815
msgFail      db 'device not found',13,10,0
816
817
 
818
 
819
820
 
821
822
 
227 serge 823
cursor_map     rd 2
824
cursor_start   rd 1
825
cursor_end     rd 1
826
214 serge 827
 
227 serge 828
devfn          dd ?
829
ati_io         dd ?
830