Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. format MS COFF
  3.  
  4. include 'proc32.inc'
  5.  
  6. DEBUG     equ 1
  7.  
  8. VID_ATI     equ 0x1002
  9.  
  10. LOAD_FROM_FILE  equ 0
  11. LOAD_FROM_MEM   equ 1
  12. LOAD_INDIRECT   equ 2
  13. LOAD_SYSTEM     equ 3
  14.  
  15. VIDEO_FREE      equ 2
  16.  
  17. struc BITMAPINFOHEADER {
  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. virtual at 0
  32.   BI BITMAPINFOHEADER
  33. end virtual
  34.  
  35. struc CURSOR
  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. CURSOR_SIZE     equ 24
  48.  
  49. R8500       equ 0x514C  ;R200
  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. OS_BASE         equ 0;  0x80400000
  63. new_app_base    equ 0x60400000;   0x01000000
  64. PROC_BASE       equ OS_BASE+0x0080000
  65.  
  66. PG_SW        equ 0x003
  67. PG_NOCACHE   equ 0x018
  68.  
  69. struc IOCTL
  70. {  .handle           dd ?
  71.    .io_code          dd ?
  72.    .input            dd ?
  73.    .inp_size         dd ?
  74.    .output           dd ?
  75.    .out_size         dd ?
  76. }
  77.  
  78. virtual at 0
  79.   IOCTL IOCTL
  80. end virtual
  81.  
  82. ;MMIO                  equ 0F9000000h
  83. RD_RB3D_CNTL          equ 1c3ch
  84.  
  85. RD_MEM_CNTL                equ 0140h
  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. RD_DP_GUI_MASTER_CNTL      equ 0146ch
  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. RD_ROP3_S                  equ 00cc0000h
  116. RD_ROP3_P                  equ 00f00000h
  117.  
  118. RD_RB2D_DSTCACHE_MODE      equ 03428h
  119. RD_RB2D_DSTCACHE_CTLSTAT   equ 0342ch
  120. RD_RB2D_DC_FLUSH_ALL       equ 000fh
  121. RD_RB2D_DC_BUSY            equ 80000000h
  122.  
  123. RD_GMC_BRUSH_SOLID_COLOR   equ 000000D0h
  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. cmdSolidFill               equ 73f036d0h
  129.  
  130. RD_DST_PITCH_OFFSET        equ 142ch
  131. RD_SRC_PITCH_OFFSET        equ 1428h
  132.  
  133. RD_DST_X_LEFT_TO_RIGHT     equ 1
  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. macro rdr op1, op2
  142. {
  143.      mov edi, [ati_io]
  144.      mov op1, [edi+op2]
  145. }
  146.  
  147. macro wrr dest, src
  148. {
  149.      mov edi, [ati_io]
  150.      mov dword [edi+dest], src
  151. }
  152.  
  153.  
  154. public START
  155. public service_proc
  156. public version
  157.  
  158. extrn SysMsgBoardStr
  159. extrn PciApi
  160. extrn PciRead32
  161. extrn AllocKernelSpace
  162. extrn MapPage
  163. extrn RegService
  164. extrn SetHwCursor
  165. extrn HwCursorRestore
  166. extrn HwCursorCreate
  167. extrn LFBAddress
  168. extrn LoadFile
  169.  
  170. CURSOR_IMAGE_OFFSET  equ 0x00500000
  171.  
  172. DRV_ENTRY equ 1
  173. DRV_EXIT  equ -1
  174.  
  175. section '.flat' code readable align 16
  176.  
  177. proc START stdcall, state:dword
  178.  
  179.            cmp [state], 1
  180.            jne .exit
  181.  
  182.      if DEBUG
  183.            mov esi, msgInit
  184.            call SysMsgBoardStr
  185.      end if
  186.  
  187.            call detect_ati
  188.            test eax, eax
  189.            jz .fail
  190.  
  191.            call init_ati
  192.            test eax, eax
  193.            jz .fail
  194.  
  195.            xor eax, eax
  196.            mov edi, cursors
  197.            mov ecx, CURSOR_SIZE*16
  198.            cld
  199.            rep stosd
  200.  
  201.            not eax
  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.            stdcall RegService, sz_ati_srv, service_proc
  210.            test eax, eax
  211.            jz .fail
  212.            mov dword [SetHwCursor], drvCursorPos ;enable hardware cursor
  213.            mov dword [HwCursorRestore], drv_restore
  214.            mov dword [HwCursorCreate], ati_cursor
  215.            ret
  216. .fail:
  217.      if DEBUG
  218.            mov esi, msgFail
  219.            call SysMsgBoardStr
  220.      end if
  221.  
  222. .exit:
  223.            xor eax, eax
  224. ;           mov ebx, SetHwCursor
  225. ;           mov dword [ebx], eax    ;force disable hardware cursor
  226.            ret
  227. endp
  228.  
  229. handle     equ  IOCTL.handle
  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. align 4
  237. proc service_proc stdcall, ioctl:dword
  238.  
  239.            mov edi, [ioctl]
  240.            mov ebx, [edi+io_code]
  241.            cmp ebx, VIDEO_FREE
  242.            jne .fail
  243.  
  244.            mov eax, [edi+input]
  245.            call video_free
  246. .fail:
  247.            xor eax, eax
  248.            ret
  249. endp
  250.  
  251. restore   handle
  252. restore   io_code
  253. restore   input
  254. restore   inp_size
  255. restore   output
  256. restore   out_size
  257.  
  258. align 4
  259. proc detect_ati
  260.            locals
  261.              last_bus dd ?
  262.            endl
  263.  
  264.            xor eax, eax
  265.            mov [bus], eax
  266.            inc eax
  267.            call PciApi
  268.            cmp eax, -1
  269.            je .err
  270.  
  271.            mov [last_bus], eax
  272.  
  273. .next_bus:
  274.            and [devfn], 0
  275. .next_dev:
  276.            stdcall PciRead32, [bus], [devfn], dword 0
  277.            test eax, eax
  278.            jz .next
  279.            cmp eax, -1
  280.            je .next
  281.  
  282.            mov edi, devices
  283. @@:
  284.            mov ebx, [edi]
  285.            test ebx, ebx
  286.            jz .next
  287.  
  288.            cmp eax, ebx
  289.            je .found
  290.            add edi, 4
  291.            jmp @B
  292.  
  293. .next:
  294.            inc [devfn]
  295.            cmp [devfn], 256
  296.            jb  .next_dev
  297.            mov eax, [bus]
  298.            inc eax
  299.            mov [bus], eax
  300.            cmp eax, [last_bus]
  301.            jna .next_bus
  302.            xor eax, eax
  303.            ret
  304. .found:
  305.            xor eax, eax
  306.            inc eax
  307.            ret
  308. .err:
  309.            xor eax, eax
  310.            ret
  311. endp
  312.  
  313. align 4
  314. proc init_ati
  315.  
  316.            stdcall AllocKernelSpace, dword 0x10000
  317.            test eax, eax
  318.            jz .fail
  319.  
  320.            mov [ati_io], eax
  321.  
  322.            stdcall PciRead32, [bus], [devfn], dword 0x18
  323.            and eax, 0xFFFF0000
  324.            mov esi, eax
  325.  
  326.            mov edi, [ati_io]
  327.            mov edx, 16
  328. @@:
  329.            stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
  330.            add edi, 0x1000
  331.            add esi, 0x1000
  332.            dec edx
  333.            jnz @B
  334.  
  335.            mov edi, [ati_io]
  336.            mov dword [edi+RD_RB3D_CNTL], 0
  337.            call engRestore
  338.  
  339.            mov edi, [ati_io]
  340.            mov eax, [edi+0x50]
  341.            mov ebx,3
  342.            shl ebx,20
  343.            not ebx
  344.            and eax,ebx
  345.            mov ebx, 2
  346.            shl ebx,20
  347.            or eax, ebx
  348.            mov [edi+0x50], eax
  349.  
  350.            call drvShowCursor
  351.            xor eax, eax
  352.            inc eax
  353. .fail:
  354.            ret
  355. endp
  356.  
  357. align 4
  358. drv_restore:
  359.            ret 8
  360.  
  361. align 4
  362. drvShowCursor:
  363.            mov edi, [ati_io]
  364.  
  365.            mov eax, [edi+RD_CRTC_GEN_CNTL]
  366.            bts eax,16
  367.            mov [edi+RD_CRTC_GEN_CNTL], eax
  368.            ret
  369.  
  370. align 4
  371. proc drvCursorPos stdcall, hcursor:dword, x:dword, y:dword
  372.            pushfd
  373.            cli
  374.  
  375.            xor eax, eax
  376.            xor edx, edx
  377.            mov esi, [hcursor]
  378.            mov ebx, [x]
  379.            mov ecx, [y]
  380.  
  381.            sub ebx, [esi+CURSOR.hot_x]
  382.            jnc @F
  383.            neg ebx
  384.            mov eax, ebx
  385.            shl eax, 16
  386.            xor ebx, ebx
  387. @@:
  388.            sub ecx, [esi+CURSOR.hot_y]
  389.            jnc @F
  390.            neg ecx
  391.            mov ax, cx
  392.            mov edx, ecx
  393.            xor ecx, ecx
  394. @@:
  395.            or eax, 0x80000000
  396.            wrr CUR_HORZ_VERT_OFF, eax
  397.  
  398.            shl ebx, 16
  399.            mov bx, cx
  400.            or ebx, 0x80000000
  401.            wrr CUR_HORZ_VERT_POSN, ebx
  402.  
  403.            shl edx, 8
  404.            add edx, [esi+CURSOR.base]
  405.            sub edx, LFBAddress
  406.            wrr CUR_OFFSET, edx
  407.            popfd
  408.            ret
  409. endp
  410.  
  411. align 4
  412. proc video_alloc
  413.  
  414.            pushfd
  415.            cli
  416.            mov ebx, [cursor_start]
  417.            mov ecx, [cursor_end]
  418. .l1:
  419.            bsf eax,[ebx];
  420.            jnz .found
  421.            add ebx,4
  422.            cmp ebx, ecx
  423.            jb .l1
  424.            popfd
  425.            xor eax,eax
  426.            ret
  427. .found:
  428.            btr [ebx], eax
  429.            popfd
  430.  
  431.            mov [cursor_start],ebx
  432.            sub ebx, cursor_map
  433.            shl ebx, 3
  434.            add eax,ebx
  435.  
  436.            shl eax,14
  437.            add eax, LFBAddress+CURSOR_IMAGE_OFFSET
  438.            ret
  439. endp
  440.  
  441. align 4
  442. video_free:
  443.            pushfd
  444.            cli
  445.            sub eax, LFBAddress+CURSOR_IMAGE_OFFSET
  446.            shr eax, 14
  447.            mov ebx, cursor_map
  448.            bts [ebx], eax
  449.            shr eax, 3
  450.            and eax, not 3
  451.            add eax, ebx
  452.            cmp [cursor_start], eax
  453.            ja @f
  454.            popfd
  455.            ret
  456. @@:
  457.            mov [cursor_start], eax
  458.            popfd
  459.            ret
  460.  
  461. align 4
  462. proc ati_cursor stdcall, hcursor:dword, src:dword, flags:dword
  463.  
  464.            stdcall video_alloc
  465.  
  466.            mov edi, [hcursor]
  467.            mov [edi+CURSOR.base], eax
  468.  
  469.            mov esi, [src]
  470.            mov ebx, [flags]
  471.            cmp bx, LOAD_INDIRECT
  472.            je .indirect
  473.  
  474.            movzx ecx, word [esi+10]
  475.            movzx edx, word [esi+12]
  476.            mov [edi+CURSOR.hot_x], ecx
  477.            mov [edi+CURSOR.hot_y], edx
  478.  
  479.            stdcall ati_init_cursor, eax, esi
  480.            mov eax, [hcursor]
  481. .fail:
  482.            ret
  483. .indirect:
  484.            shr ebx, 16
  485.            movzx ecx, bh
  486.            movzx edx, bl
  487.            mov [edi+CURSOR.hot_x], ecx
  488.            mov [edi+CURSOR.hot_y], edx
  489.  
  490.            xchg edi, eax
  491.            push edi
  492.            mov ecx, 64*64
  493.            xor eax,eax
  494.            rep stosd
  495.  
  496.            mov esi, [src]
  497.            pop edi
  498.            mov ebx, 32
  499.            cld
  500. @@:
  501.            mov ecx, 32
  502.            rep movsd
  503.            add edi, 128
  504.            dec ebx
  505.            jnz @B
  506.            mov eax, [hcursor]
  507.            ret
  508. endp
  509.  
  510. align 4
  511. proc ati_init_cursor stdcall, dst:dword, src:dword
  512.            locals
  513.              rBase    dd ?
  514.              pQuad    dd ?
  515.              pBits    dd ?
  516.              pAnd     dd ?
  517.              width    dd ?
  518.              height   dd ?
  519.              counter  dd ?
  520.            endl
  521.  
  522.            mov esi, [src]
  523.            add esi,[esi+18]
  524.            mov eax,esi
  525.  
  526.            cmp [esi+BI.biBitCount], 24
  527.            je .img_24
  528.            cmp [esi+BI.biBitCount], 8
  529.            je .img_8
  530.            cmp [esi+BI.biBitCount], 4
  531.            je .img_4
  532.  
  533. .img_2:
  534.            add eax, [esi]
  535.            mov [pQuad],eax
  536.            add eax,8
  537.            mov [pBits],eax
  538.            add eax, 128
  539.            mov [pAnd],eax
  540.            mov eax,[esi+4]
  541.            mov [width],eax
  542.            mov ebx,[esi+8]
  543.            shr ebx,1
  544.            mov [height],ebx
  545.  
  546.            mov edi, pCursor
  547.            add edi, 32*31*4
  548.            mov [rBase],edi
  549.  
  550.            mov esi,[pQuad]
  551. .l21:
  552.            mov ebx, [pBits]
  553.            mov ebx, [ebx]
  554.            bswap ebx
  555.            mov eax, [pAnd]
  556.            mov eax, [eax]
  557.            bswap eax
  558.            mov [counter], 32
  559. @@:
  560.            xor edx, edx
  561.            shl eax,1
  562.            setc dl
  563.            dec edx
  564.  
  565.            xor ecx, ecx
  566.            shl ebx,1
  567.            setc cl
  568.            mov ecx, [esi+ecx*4]
  569.            and ecx, edx
  570.            and edx, 0xFF000000
  571.            or edx, ecx
  572.            mov [edi], edx
  573.  
  574.            add edi, 4
  575.            dec [counter]
  576.            jnz @B
  577.  
  578.            add [pBits], 4
  579.            add [pAnd], 4
  580.            mov edi,[rBase]
  581.            sub edi,128
  582.            mov [rBase],edi
  583.            sub [height],1
  584.            jnz .l21
  585.            jmp .copy
  586. .img_4:
  587.            add eax, [esi]
  588.            mov [pQuad],eax
  589.            add eax,64
  590.            mov [pBits],eax
  591.            add eax, 0x200
  592.            mov [pAnd],eax
  593.            mov eax,[esi+4]
  594.            mov [width],eax
  595.            mov ebx,[esi+8]
  596.            shr ebx,1
  597.            mov [height],ebx
  598.  
  599.            mov edi, pCursor
  600.            add edi, 32*31*4
  601.            mov [rBase],edi
  602.  
  603.            mov esi,[pQuad]
  604.            mov ebx, [pBits]
  605. .l4:
  606.            mov eax, [pAnd]
  607.            mov eax, [eax]
  608.            bswap eax
  609.            mov [counter], 16
  610. @@:
  611.            xor edx, edx
  612.            shl eax,1
  613.            setc dl
  614.            dec edx
  615.  
  616.            movzx ecx, byte [ebx]
  617.            and cl, 0xF0
  618.            shr ecx, 2
  619.            mov ecx, [esi+ecx]
  620.            and ecx, edx
  621.            and edx, 0xFF000000
  622.            or edx, ecx
  623.            mov [edi], edx
  624.  
  625.            xor edx, edx
  626.            shl eax,1
  627.            setc dl
  628.            dec edx
  629.  
  630.            movzx ecx, byte [ebx]
  631.            and cl, 0x0F
  632.            mov ecx, [esi+ecx*4]
  633.            and ecx, edx
  634.            and edx, 0xFF000000
  635.            or edx, ecx
  636.            mov [edi+4], edx
  637.  
  638.            inc ebx
  639.            add edi, 8
  640.            dec [counter]
  641.            jnz @B
  642.  
  643.            add [pAnd], 4
  644.            mov edi,[rBase]
  645.            sub edi,128
  646.            mov [rBase],edi
  647.            sub [height],1
  648.            jnz .l4
  649.            jmp .copy
  650. .img_8:
  651.            add eax, [esi]
  652.            mov [pQuad],eax
  653.            add eax,1024
  654.            mov [pBits],eax
  655.            add eax, 1024
  656.            mov [pAnd],eax
  657.            mov eax,[esi+4]
  658.            mov [width],eax
  659.            mov ebx,[esi+8]
  660.            shr ebx,1
  661.            mov [height],ebx
  662.  
  663.            mov edi, pCursor
  664.            add edi, 32*31*4
  665.            mov [rBase],edi
  666.  
  667.            mov esi,[pQuad]
  668.            mov ebx, [pBits]
  669. .l81:
  670.            mov eax, [pAnd]
  671.            mov eax, [eax]
  672.            bswap eax
  673.            mov [counter], 32
  674. @@:
  675.            xor edx, edx
  676.            shl eax,1
  677.            setc dl
  678.            dec edx
  679.  
  680.            movzx ecx,  byte [ebx]
  681.            mov ecx, [esi+ecx*4]
  682.            and ecx, edx
  683.            and edx, 0xFF000000
  684.            or edx, ecx
  685.            mov [edi], edx
  686.  
  687.            inc ebx
  688.            add edi, 4
  689.            dec [counter]
  690.            jnz @B
  691.  
  692.            add [pAnd], 4
  693.            mov edi,[rBase]
  694.            sub edi,128
  695.            mov [rBase],edi
  696.            sub [height],1
  697.            jnz .l81
  698.            jmp .copy
  699. .img_24:
  700.            add eax, [esi]
  701.            mov [pQuad],eax
  702.            add eax, 0xC00
  703.            mov [pAnd],eax
  704.            mov eax,[esi+BI.biWidth]
  705.            mov [width],eax
  706.            mov ebx,[esi+BI.biHeight]
  707.            shr ebx,1
  708.            mov [height],ebx
  709.  
  710.            mov edi, pCursor
  711.            add edi, 32*31*4
  712.            mov [rBase],edi
  713.  
  714.            mov esi,[pAnd]
  715.            mov ebx, [pQuad]
  716. .row_24:
  717.            mov eax, [esi]
  718.            bswap eax
  719.            mov [counter], 32
  720. @@:
  721.            xor edx, edx
  722.            shl eax,1
  723.            setc dl
  724.            dec edx
  725.  
  726.            mov ecx, [ebx]
  727.            and ecx, 0x00FFFFFF
  728.            and ecx, edx
  729.            and edx, 0xFF000000
  730.            or edx, ecx
  731.            mov [edi], edx
  732.            add ebx, 3
  733.            add edi, 4
  734.            dec [counter]
  735.            jnz @B
  736.  
  737.            add esi, 4
  738.            mov edi,[rBase]
  739.            sub edi,128
  740.            mov [rBase],edi
  741.            sub [height],1
  742.            jnz .row_24
  743. .copy:
  744.            mov edi, [dst]
  745.            mov ecx, 64*64
  746.            xor eax,eax
  747.            rep stosd
  748.  
  749.            mov esi, pCursor
  750.            mov edi, [dst]
  751.            mov ebx, 32
  752.            cld
  753. @@:
  754.            mov ecx, 32
  755.            rep movsd
  756.            add edi, 128
  757.            dec ebx
  758.            jnz @B
  759.            ret
  760. endp
  761.  
  762. align 4
  763. proc engFlush
  764.  
  765.            mov edi, [ati_io]
  766.  
  767.            mov eax, [edi+RD_RB2D_DSTCACHE_CTLSTAT]
  768.            or eax,RD_RB2D_DC_FLUSH_ALL
  769.            mov [edi+RD_RB2D_DSTCACHE_CTLSTAT],eax
  770.  
  771.            mov ecx, RD_TIMEOUT
  772. @@:
  773.            mov eax,[edi+RD_RB2D_DSTCACHE_CTLSTAT]
  774.            and eax, RD_RB2D_DC_BUSY
  775.            jz .exit
  776.  
  777.            sub ecx,1
  778.            jnz @B
  779. .exit:
  780.            ret
  781. endp
  782.  
  783. align 4
  784. engWaitForFifo:
  785. cnt equ bp+8
  786.            push ebp
  787.            mov ebp, esp
  788.  
  789.            mov edi, [ati_io]
  790.  
  791.            mov ecx, RD_TIMEOUT
  792. @@:
  793.            mov eax, [edi+RD_RBBM_STATUS]
  794.            and eax, RD_RBBM_FIFOCNT_MASK
  795.            cmp eax, [ebp+8]
  796.            jae .exit
  797.  
  798.            sub ecx,1
  799.            jmp @B
  800.  
  801. .exit:
  802.            leave
  803.            ret 4
  804.  
  805. align 4
  806. proc engWaitForIdle
  807.  
  808.            push dword 64
  809.            call engWaitForFifo
  810.  
  811.            mov edi, [ati_io]
  812.            mov ecx ,RD_TIMEOUT
  813. @@:
  814.            mov eax, [edi+RD_RBBM_STATUS]
  815.            and eax,RD_RBBM_ACTIVE
  816.            jz .exit
  817.  
  818.            sub ecx,1
  819.            jnz @B
  820. .exit:
  821.            call engFlush
  822.            ret
  823. endp
  824.  
  825. align 4
  826. proc engRestore
  827.  
  828. ;             push dword 1
  829. ;             call engWaitForFifo
  830.  
  831. ;             mov dword  [MMIO+RD_RB2D_DSTCACHE_MODE], 0
  832.  
  833.            push dword 3
  834.            call engWaitForFifo
  835.  
  836.            mov edi, [ati_io]
  837.  
  838.            mov eax, [edi+RD_DISPLAY_BASE_ADDR]
  839.            shr eax, 10d
  840.            or eax,(64d shl 22d)
  841.            mov [edi+RD_DEFAULT_OFFSET],eax
  842.            mov [edi+RD_SRC_PITCH_OFFSET],eax
  843.            mov [edi+RD_DST_PITCH_OFFSET],eax
  844.  
  845.            push dword 1
  846.            call engWaitForFifo
  847.  
  848.            mov edi, [ati_io]
  849.            mov eax, [edi+RD_DP_DATATYPE]
  850.            btr eax, 29d
  851.            mov [edi+RD_DP_DATATYPE],eax
  852.  
  853.            push dword 1
  854.            call engWaitForFifo
  855.  
  856.            mov edi, [ati_io]
  857.            mov dword [edi+RD_DEFAULT_SC_BOTTOM_RIGHT],\
  858.                      (RD_DEFAULT_SC_RIGHT_MAX or RD_DEFAULT_SC_BOTTOM_MAX)
  859.  
  860.            push dword 1
  861.            call engWaitForFifo
  862.  
  863.            mov edi, [ati_io]
  864.            mov dword [edi+RD_DP_GUI_MASTER_CNTL],\
  865.                      (RD_GMC_BRUSH_SOLID_COLOR or \
  866.                       RD_GMC_SRC_DATATYPE_COLOR or \
  867.                      (6 shl RD_GMC_DST_DATATYPE_SHIFT) or \
  868.                       RD_GMC_CLR_CMP_CNTL_DIS or \
  869.                       RD_ROP3_P or \
  870.                       RD_GMC_WR_MSK_DIS)
  871.  
  872.  
  873.            push dword 7
  874.            call engWaitForFifo
  875.  
  876.            mov edi, [ati_io]
  877.  
  878.            mov dword [edi+RD_DST_LINE_START],0
  879.            mov dword [edi+RD_DST_LINE_END], 0
  880.            mov dword [edi+RD_DP_BRUSH_FRGD_CLR], 808000ffh
  881.            mov dword [edi+RD_DP_BRUSH_BKGD_CLR], 002020ffh
  882.            mov dword [edi+RD_DP_SRC_FRGD_CLR],   808000ffh
  883.            mov dword [edi+RD_DP_SRC_BKGD_CLR],   004000ffh
  884.            mov dword [edi+RD_DP_WRITE_MASK],0ffffffffh
  885.  
  886.            call engWaitForIdle
  887.  
  888.            ret
  889. endp
  890.  
  891. align 4
  892. engSetupSolidFill:
  893.            push ebp
  894.            mov ebp, esp
  895.  
  896.            push dword 3
  897.            call engWaitForFifo
  898.  
  899.            wrr RD_DP_GUI_MASTER_CNTL, cmdSolidFill
  900.  
  901.            mov eax, [ebp+8]
  902.            wrr RD_DP_BRUSH_FRGD_CLR,eax
  903.  
  904.            mov edi, [ati_io]
  905.            mov dword [edi+RD_DP_CNTL],(RD_DST_X_LEFT_TO_RIGHT or RD_DST_Y_TOP_TO_BOTTOM)
  906.            leave
  907.            ret 4
  908.  
  909.  
  910. align 4
  911. drvSolidFill:
  912. ;x:word,y:word,w:word,h:word,color:dword
  913.             push ebp
  914.             mov ebp, esp
  915. x equ ebp+8
  916. y equ ebp+12
  917. w equ ebp+16
  918. h equ ebp+20
  919. color equ ebp+24
  920.  
  921.            push dword [ebp+24]
  922.            call engSetupSolidFill
  923.  
  924.            push dword 2
  925.            call engWaitForFifo
  926.  
  927.            mov edi, [ati_io]
  928.  
  929.            mov eax, [y]
  930.            mov ebx, [x]
  931.            shl eax,16
  932.            or eax, ebx
  933.  
  934.            mov ecx,  [w]
  935.            mov edx,  [h]
  936.            shl ecx,16
  937.            or ecx, edx
  938.            mov [edi+RD_DST_Y_X], eax
  939.            mov [edi+RD_DST_WIDTH_HEIGHT], ecx
  940.            call engFlush
  941.            leave
  942.            ret 20
  943.  
  944. align 4
  945. devices dd (R8500   shl 16)+VID_ATI
  946.         dd (R9000   shl 16)+VID_ATI
  947.         dd (R9200   shl 16)+VID_ATI
  948.         dd (R9500   shl 16)+VID_ATI
  949.         dd (R9500P  shl 16)+VID_ATI
  950.         dd (R9550   shl 16)+VID_ATI
  951.         dd (R9600   shl 16)+VID_ATI
  952.         dd (R9600XT shl 16)+VID_ATI
  953.         dd (R9700P  shl 16)+VID_ATI
  954.         dd (R9800   shl 16)+VID_ATI
  955.         dd (R9800P  shl 16)+VID_ATI
  956.         dd (R9800XT shl 16)+VID_ATI
  957.         dd 0    ;terminator
  958.  
  959. version dd 0x00010001
  960.  
  961. sz_ati_srv   db 'HWCURSOR',0
  962.  
  963. msgInit      db 'detect hardware...',13,10,0
  964. msgPCI       db 'PCI accsess not supported',13,10,0
  965. msgFail      db 'device not found',13,10,0
  966. msg_neg      db 'neg ecx',13,10,0
  967. buff         db 8 dup(0)
  968.              db 13,10, 0
  969.  
  970. section '.data' data readable writable align 16
  971.  
  972. pCursor  db 4096 dup(?)
  973.  
  974. cursors        rb CURSOR_SIZE*64
  975. cursor_map     rd 2
  976. cursor_start   rd 1
  977. cursor_end     rd 1
  978.  
  979. bus            dd ?
  980. devfn          dd ?
  981. ati_io         dd ?
  982.  
  983.  
  984.  
  985.