Subversion Repositories Kolibri OS

Rev

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