Subversion Repositories Kolibri OS

Rev

Rev 378 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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