Subversion Repositories Kolibri OS

Rev

Rev 214 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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