Subversion Repositories Kolibri OS

Rev

Rev 233 | 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.            lea eax,[eax+ebx*8]
  434.  
  435.            shl eax,14
  436.            add eax, LFBAddress+CURSOR_IMAGE_OFFSET
  437.            ret
  438. endp
  439.  
  440. align 4
  441. video_free:
  442.            pushfd
  443.            cli
  444.            sub eax, LFBAddress+CURSOR_IMAGE_OFFSET
  445.            shr eax, 14
  446.            mov ebx, cursor_map
  447.            bts [ebx], eax
  448.            shr eax, 3
  449.            and eax, not 3
  450.            add eax, ebx
  451.            cmp [cursor_start], eax
  452.            ja @f
  453.            popfd
  454.            ret
  455. @@:
  456.            mov [cursor_start], eax
  457.            popfd
  458.            ret
  459.  
  460. align 4
  461. proc ati_cursor stdcall, hcursor:dword, src:dword, flags:dword
  462.  
  463.            stdcall video_alloc
  464.  
  465.            mov edi, [hcursor]
  466.            mov [edi+CURSOR.base], eax
  467.  
  468.            mov esi, [src]
  469.            mov ebx, [flags]
  470.            cmp bx, LOAD_INDIRECT
  471.            je .indirect
  472.  
  473.            movzx ecx, word [esi+10]
  474.            movzx edx, word [esi+12]
  475.            mov [edi+CURSOR.hot_x], ecx
  476.            mov [edi+CURSOR.hot_y], edx
  477.  
  478.            stdcall ati_init_cursor, eax, esi
  479.            mov eax, [hcursor]
  480. .fail:
  481.            ret
  482. .indirect:
  483.            shr ebx, 16
  484.            movzx ecx, bh
  485.            movzx edx, bl
  486.            mov [edi+CURSOR.hot_x], ecx
  487.            mov [edi+CURSOR.hot_y], edx
  488.  
  489.            xchg edi, eax
  490.            push edi
  491.            mov ecx, 64*64
  492.            xor eax,eax
  493.            rep stosd
  494.  
  495.            mov esi, [src]
  496.            pop edi
  497.            mov ebx, 32
  498.            cld
  499. @@:
  500.            mov ecx, 32
  501.            rep movsd
  502.            add edi, 128
  503.            dec ebx
  504.            jnz @B
  505.            mov eax, [hcursor]
  506.            ret
  507. endp
  508.  
  509. align 4
  510. proc ati_init_cursor stdcall, dst:dword, src:dword
  511.            locals
  512.              rBase    dd ?
  513.              pQuad    dd ?
  514.              pBits    dd ?
  515.              pAnd     dd ?
  516.              width    dd ?
  517.              height   dd ?
  518.              counter  dd ?
  519.            endl
  520.  
  521.            mov esi, [src]
  522.            add esi,[esi+18]
  523.            mov eax,esi
  524.  
  525.            cmp [esi+BI.biBitCount], 24
  526.            je .img_24
  527.            cmp [esi+BI.biBitCount], 8
  528.            je .img_8
  529.            cmp [esi+BI.biBitCount], 4
  530.            je .img_4
  531.  
  532. .img_2:
  533.            add eax, [esi]
  534.            mov [pQuad],eax
  535.            add eax,8
  536.            mov [pBits],eax
  537.            add eax, 128
  538.            mov [pAnd],eax
  539.            mov eax,[esi+4]
  540.            mov [width],eax
  541.            mov ebx,[esi+8]
  542.            shr ebx,1
  543.            mov [height],ebx
  544.  
  545.            mov edi, pCursor
  546.            add edi, 32*31*4
  547.            mov [rBase],edi
  548.  
  549.            mov esi,[pQuad]
  550. .l21:
  551.            mov ebx, [pBits]
  552.            mov ebx, [ebx]
  553.            bswap ebx
  554.            mov eax, [pAnd]
  555.            mov eax, [eax]
  556.            bswap eax
  557.            mov [counter], 32
  558. @@:
  559.            xor edx, edx
  560.            shl eax,1
  561.            setc dl
  562.            dec edx
  563.  
  564.            xor ecx, ecx
  565.            shl ebx,1
  566.            setc cl
  567.            mov ecx, [esi+ecx*4]
  568.            and ecx, edx
  569.            and edx, 0xFF000000
  570.            or edx, ecx
  571.            mov [edi], edx
  572.  
  573.            add edi, 4
  574.            dec [counter]
  575.            jnz @B
  576.  
  577.            add [pBits], 4
  578.            add [pAnd], 4
  579.            mov edi,[rBase]
  580.            sub edi,128
  581.            mov [rBase],edi
  582.            sub [height],1
  583.            jnz .l21
  584.            jmp .copy
  585. .img_4:
  586.            add eax, [esi]
  587.            mov [pQuad],eax
  588.            add eax,64
  589.            mov [pBits],eax
  590.            add eax, 0x200
  591.            mov [pAnd],eax
  592.            mov eax,[esi+4]
  593.            mov [width],eax
  594.            mov ebx,[esi+8]
  595.            shr ebx,1
  596.            mov [height],ebx
  597.  
  598.            mov edi, pCursor
  599.            add edi, 32*31*4
  600.            mov [rBase],edi
  601.  
  602.            mov esi,[pQuad]
  603.            mov ebx, [pBits]
  604. .l4:
  605.            mov eax, [pAnd]
  606.            mov eax, [eax]
  607.            bswap eax
  608.            mov [counter], 16
  609. @@:
  610.            xor edx, edx
  611.            shl eax,1
  612.            setc dl
  613.            dec edx
  614.  
  615.            movzx ecx, byte [ebx]
  616.            and cl, 0xF0
  617.            shr ecx, 2
  618.            mov ecx, [esi+ecx]
  619.            and ecx, edx
  620.            and edx, 0xFF000000
  621.            or edx, ecx
  622.            mov [edi], edx
  623.  
  624.            xor edx, edx
  625.            shl eax,1
  626.            setc dl
  627.            dec edx
  628.  
  629.            movzx ecx, byte [ebx]
  630.            and cl, 0x0F
  631.            mov ecx, [esi+ecx*4]
  632.            and ecx, edx
  633.            and edx, 0xFF000000
  634.            or edx, ecx
  635.            mov [edi+4], edx
  636.  
  637.            inc ebx
  638.            add edi, 8
  639.            dec [counter]
  640.            jnz @B
  641.  
  642.            add [pAnd], 4
  643.            mov edi,[rBase]
  644.            sub edi,128
  645.            mov [rBase],edi
  646.            sub [height],1
  647.            jnz .l4
  648.            jmp .copy
  649. .img_8:
  650.            add eax, [esi]
  651.            mov [pQuad],eax
  652.            add eax,1024
  653.            mov [pBits],eax
  654.            add eax, 1024
  655.            mov [pAnd],eax
  656.            mov eax,[esi+4]
  657.            mov [width],eax
  658.            mov ebx,[esi+8]
  659.            shr ebx,1
  660.            mov [height],ebx
  661.  
  662.            mov edi, pCursor
  663.            add edi, 32*31*4
  664.            mov [rBase],edi
  665.  
  666.            mov esi,[pQuad]
  667.            mov ebx, [pBits]
  668. .l81:
  669.            mov eax, [pAnd]
  670.            mov eax, [eax]
  671.            bswap eax
  672.            mov [counter], 32
  673. @@:
  674.            xor edx, edx
  675.            shl eax,1
  676.            setc dl
  677.            dec edx
  678.  
  679.            movzx ecx,  byte [ebx]
  680.            mov ecx, [esi+ecx*4]
  681.            and ecx, edx
  682.            and edx, 0xFF000000
  683.            or edx, ecx
  684.            mov [edi], edx
  685.  
  686.            inc ebx
  687.            add edi, 4
  688.            dec [counter]
  689.            jnz @B
  690.  
  691.            add [pAnd], 4
  692.            mov edi,[rBase]
  693.            sub edi,128
  694.            mov [rBase],edi
  695.            sub [height],1
  696.            jnz .l81
  697.            jmp .copy
  698. .img_24:
  699.            add eax, [esi]
  700.            mov [pQuad],eax
  701.            add eax, 0xC00
  702.            mov [pAnd],eax
  703.            mov eax,[esi+BI.biWidth]
  704.            mov [width],eax
  705.            mov ebx,[esi+BI.biHeight]
  706.            shr ebx,1
  707.            mov [height],ebx
  708.  
  709.            mov edi, pCursor
  710.            add edi, 32*31*4
  711.            mov [rBase],edi
  712.  
  713.            mov esi,[pAnd]
  714.            mov ebx, [pQuad]
  715. .row_24:
  716.            mov eax, [esi]
  717.            bswap eax
  718.            mov [counter], 32
  719. @@:
  720.            xor edx, edx
  721.            shl eax,1
  722.            setc dl
  723.            dec edx
  724.  
  725.            mov ecx, [ebx]
  726.            and ecx, 0x00FFFFFF
  727.            and ecx, edx
  728.            and edx, 0xFF000000
  729.            or edx, ecx
  730.            mov [edi], edx
  731.            add ebx, 3
  732.            add edi, 4
  733.            dec [counter]
  734.            jnz @B
  735.  
  736.            add esi, 4
  737.            mov edi,[rBase]
  738.            sub edi,128
  739.            mov [rBase],edi
  740.            sub [height],1
  741.            jnz .row_24
  742. .copy:
  743.            mov edi, [dst]
  744.            mov ecx, 64*64
  745.            xor eax,eax
  746.            rep stosd
  747.  
  748.            mov esi, pCursor
  749.            mov edi, [dst]
  750.            mov ebx, 32
  751.            cld
  752. @@:
  753.            mov ecx, 32
  754.            rep movsd
  755.            add edi, 128
  756.            dec ebx
  757.            jnz @B
  758.            ret
  759. endp
  760.  
  761. align 4
  762. proc engFlush
  763.  
  764.            mov edi, [ati_io]
  765.  
  766.            mov eax, [edi+RD_RB2D_DSTCACHE_CTLSTAT]
  767.            or eax,RD_RB2D_DC_FLUSH_ALL
  768.            mov [edi+RD_RB2D_DSTCACHE_CTLSTAT],eax
  769.  
  770.            mov ecx, RD_TIMEOUT
  771. @@:
  772.            mov eax,[edi+RD_RB2D_DSTCACHE_CTLSTAT]
  773.            and eax, RD_RB2D_DC_BUSY
  774.            jz .exit
  775.  
  776.            sub ecx,1
  777.            jnz @B
  778. .exit:
  779.            ret
  780. endp
  781.  
  782. align 4
  783. engWaitForFifo:
  784. cnt equ bp+8
  785.            push ebp
  786.            mov ebp, esp
  787.  
  788.            mov edi, [ati_io]
  789.  
  790.            mov ecx, RD_TIMEOUT
  791. @@:
  792.            mov eax, [edi+RD_RBBM_STATUS]
  793.            and eax, RD_RBBM_FIFOCNT_MASK
  794.            cmp eax, [ebp+8]
  795.            jae .exit
  796.  
  797.            sub ecx,1
  798.            jmp @B
  799.  
  800. .exit:
  801.            leave
  802.            ret 4
  803.  
  804. align 4
  805. proc engWaitForIdle
  806.  
  807.            push dword 64
  808.            call engWaitForFifo
  809.  
  810.            mov edi, [ati_io]
  811.            mov ecx ,RD_TIMEOUT
  812. @@:
  813.            mov eax, [edi+RD_RBBM_STATUS]
  814.            and eax,RD_RBBM_ACTIVE
  815.            jz .exit
  816.  
  817.            sub ecx,1
  818.            jnz @B
  819. .exit:
  820.            call engFlush
  821.            ret
  822. endp
  823.  
  824. align 4
  825. proc engRestore
  826.  
  827. ;             push dword 1
  828. ;             call engWaitForFifo
  829.  
  830. ;             mov dword  [MMIO+RD_RB2D_DSTCACHE_MODE], 0
  831.  
  832.            push dword 3
  833.            call engWaitForFifo
  834.  
  835.            mov edi, [ati_io]
  836.  
  837.            mov eax, [edi+RD_DISPLAY_BASE_ADDR]
  838.            shr eax, 10d
  839.            or eax,(64d shl 22d)
  840.            mov [edi+RD_DEFAULT_OFFSET],eax
  841.            mov [edi+RD_SRC_PITCH_OFFSET],eax
  842.            mov [edi+RD_DST_PITCH_OFFSET],eax
  843.  
  844.            push dword 1
  845.            call engWaitForFifo
  846.  
  847.            mov edi, [ati_io]
  848.            mov eax, [edi+RD_DP_DATATYPE]
  849.            btr eax, 29d
  850.            mov [edi+RD_DP_DATATYPE],eax
  851.  
  852.            push dword 1
  853.            call engWaitForFifo
  854.  
  855.            mov edi, [ati_io]
  856.            mov dword [edi+RD_DEFAULT_SC_BOTTOM_RIGHT],\
  857.                      (RD_DEFAULT_SC_RIGHT_MAX or RD_DEFAULT_SC_BOTTOM_MAX)
  858.  
  859.            push dword 1
  860.            call engWaitForFifo
  861.  
  862.            mov edi, [ati_io]
  863.            mov dword [edi+RD_DP_GUI_MASTER_CNTL],\
  864.                      (RD_GMC_BRUSH_SOLID_COLOR or \
  865.                       RD_GMC_SRC_DATATYPE_COLOR or \
  866.                      (6 shl RD_GMC_DST_DATATYPE_SHIFT) or \
  867.                       RD_GMC_CLR_CMP_CNTL_DIS or \
  868.                       RD_ROP3_P or \
  869.                       RD_GMC_WR_MSK_DIS)
  870.  
  871.  
  872.            push dword 7
  873.            call engWaitForFifo
  874.  
  875.            mov edi, [ati_io]
  876.  
  877.            mov dword [edi+RD_DST_LINE_START],0
  878.            mov dword [edi+RD_DST_LINE_END], 0
  879.            mov dword [edi+RD_DP_BRUSH_FRGD_CLR], 808000ffh
  880.            mov dword [edi+RD_DP_BRUSH_BKGD_CLR], 002020ffh
  881.            mov dword [edi+RD_DP_SRC_FRGD_CLR],   808000ffh
  882.            mov dword [edi+RD_DP_SRC_BKGD_CLR],   004000ffh
  883.            mov dword [edi+RD_DP_WRITE_MASK],0ffffffffh
  884.  
  885.            call engWaitForIdle
  886.  
  887.            ret
  888. endp
  889.  
  890. align 4
  891. engSetupSolidFill:
  892.            push ebp
  893.            mov ebp, esp
  894.  
  895.            push dword 3
  896.            call engWaitForFifo
  897.  
  898.            wrr RD_DP_GUI_MASTER_CNTL, cmdSolidFill
  899.  
  900.            mov eax, [ebp+8]
  901.            wrr RD_DP_BRUSH_FRGD_CLR,eax
  902.  
  903.            mov edi, [ati_io]
  904.            mov dword [edi+RD_DP_CNTL],(RD_DST_X_LEFT_TO_RIGHT or RD_DST_Y_TOP_TO_BOTTOM)
  905.            leave
  906.            ret 4
  907.  
  908.  
  909. align 4
  910. drvSolidFill:
  911. ;x:word,y:word,w:word,h:word,color:dword
  912.             push ebp
  913.             mov ebp, esp
  914. x equ ebp+8
  915. y equ ebp+12
  916. w equ ebp+16
  917. h equ ebp+20
  918. color equ ebp+24
  919.  
  920.            push dword [ebp+24]
  921.            call engSetupSolidFill
  922.  
  923.            push dword 2
  924.            call engWaitForFifo
  925.  
  926.            mov edi, [ati_io]
  927.  
  928.            mov eax, [y]
  929.            mov ebx, [x]
  930.            shl eax,16
  931.            or eax, ebx
  932.  
  933.            mov ecx,  [w]
  934.            mov edx,  [h]
  935.            shl ecx,16
  936.            or ecx, edx
  937.            mov [edi+RD_DST_Y_X], eax
  938.            mov [edi+RD_DST_WIDTH_HEIGHT], ecx
  939.            call engFlush
  940.            leave
  941.            ret 20
  942.  
  943. align 4
  944. devices dd (R8500   shl 16)+VID_ATI
  945.         dd (R9000   shl 16)+VID_ATI
  946.         dd (R9200   shl 16)+VID_ATI
  947.         dd (R9500   shl 16)+VID_ATI
  948.         dd (R9500P  shl 16)+VID_ATI
  949.         dd (R9550   shl 16)+VID_ATI
  950.         dd (R9600   shl 16)+VID_ATI
  951.         dd (R9600XT shl 16)+VID_ATI
  952.         dd (R9700P  shl 16)+VID_ATI
  953.         dd (R9800   shl 16)+VID_ATI
  954.         dd (R9800P  shl 16)+VID_ATI
  955.         dd (R9800XT shl 16)+VID_ATI
  956.         dd 0    ;terminator
  957.  
  958. version dd 0x00010001
  959.  
  960. sz_ati_srv   db 'HWCURSOR',0
  961.  
  962. msgInit      db 'detect hardware...',13,10,0
  963. msgPCI       db 'PCI accsess not supported',13,10,0
  964. msgFail      db 'device not found',13,10,0
  965. msg_neg      db 'neg ecx',13,10,0
  966. buff         db 8 dup(0)
  967.              db 13,10, 0
  968.  
  969. section '.data' data readable writable align 16
  970.  
  971. pCursor  db 4096 dup(?)
  972.  
  973. cursors        rb CURSOR_SIZE*64
  974. cursor_map     rd 2
  975. cursor_start   rd 1
  976. cursor_end     rd 1
  977.  
  978. bus            dd ?
  979. devfn          dd ?
  980. ati_io         dd ?
  981.  
  982.  
  983.  
  984.