Subversion Repositories Kolibri OS

Rev

Rev 669 | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. format MS COFF
  9.  
  10. include 'proc32.inc'
  11. include 'imports.inc'
  12.  
  13. R500_HW2D       equ 0
  14.  
  15. API_VERSION     equ 0x01000100
  16.  
  17. DEBUG           equ 1
  18.  
  19. STRIDE          equ 8
  20.  
  21. VID_ATI         equ 0x1002
  22.  
  23. LOAD_FROM_FILE  equ 0
  24. LOAD_FROM_MEM   equ 1
  25. LOAD_INDIRECT   equ 2
  26. LOAD_SYSTEM     equ 3
  27.  
  28. SRV_GETVERSION  equ 0
  29.  
  30. struc BITMAPINFOHEADER {
  31.   .biSize          dd ? ; DWORD
  32.   .biWidth         dd ? ; LONG
  33.   .biHeight        dd ? ; LONG
  34.   .biPlanes        dw ? ; WORD
  35.   .biBitCount      dw ? ; WORD
  36.   .biCompression   dd ? ; DWORD
  37.   .biSizeImage     dd ? ; DWORD
  38.   .biXPelsPerMeter dd ? ; LONG
  39.   .biYPelsPerMeter dd ? ; LONG
  40.   .biClrUsed       dd ? ; DWORD
  41.   .biClrImportant  dd ? ; DWORD
  42. }
  43.  
  44. virtual at 0
  45.   BI BITMAPINFOHEADER
  46. end virtual
  47.  
  48. struc CURSOR
  49. {;common object header
  50.    .magic       dd ?   ;'CURS'
  51.    .destroy     dd ?   ;internal destructor
  52.    .fd          dd ?   ;next object in list
  53.    .bk          dd ?   ;prev object in list
  54.    .pid         dd ?   ;owner id
  55.  
  56.  ;cursor data
  57.    .base        dd ?   ;allocated memory
  58.    .hot_x       dd ?   ;hotspot coords
  59.    .hot_y       dd ?
  60. }
  61. virtual at 0
  62.   CURSOR CURSOR
  63. end virtual
  64.  
  65. CURSOR_SIZE     equ 32
  66.  
  67. OS_BASE         equ 0x80000000
  68. SLOT_BASE       equ (OS_BASE+0x0080000)
  69. LFB_BASE        equ 0xFE000000
  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.  
  96. CUR_HORZ_VERT_OFF          equ 0268h
  97. CUR_HORZ_VERT_POSN         equ 0264h
  98. CUR_OFFSET                 equ 0260h
  99.  
  100.  
  101. RD_RB3D_CNTL               equ 1c3ch
  102. RD_RBBM_STATUS             equ 0e40h
  103. RD_RBBM_FIFOCNT_MASK       equ 007fh
  104. RD_RBBM_ACTIVE             equ 80000000h
  105. RD_TIMEOUT                 equ 2000000
  106.  
  107. RD_DP_GUI_MASTER_CNTL      equ 0146ch
  108. RD_DP_BRUSH_BKGD_CLR       equ 01478h
  109. RD_DP_BRUSH_FRGD_CLR       equ 0147ch
  110. RD_DP_SRC_BKGD_CLR         equ 015dch
  111. RD_DP_SRC_FRGD_CLR         equ 015d8h
  112. RD_DP_CNTL                 equ 016c0h
  113. RD_DP_DATATYPE             equ 016c4h
  114. RD_DP_WRITE_MASK           equ 016cch
  115. RD_DP_SRC_SOURCE_MEMORY    equ (2 shl 24)
  116. RD_DP_SRC_SOURCE_HOST_DATA equ (3 shl 24)
  117. RD_DEFAULT_SC_BOTTOM_RIGHT equ 16e8h
  118. RD_GMC_BRUSH_SOLID_COLOR   equ (13 shl 4)
  119. RD_DEFAULT_SC_RIGHT_MAX    equ 1fffh
  120. RD_DEFAULT_SC_BOTTOM_MAX   equ 1fff0000h
  121. RD_GMC_DST_DATATYPE_SHIFT  equ 8
  122.  
  123. RD_ROP3_S                  equ 00cc0000h
  124. RD_ROP3_P                  equ 00f00000h
  125.  
  126. RD_RB2D_DSTCACHE_MODE      equ 03428h
  127. RD_RB2D_DSTCACHE_CTLSTAT   equ 0342ch
  128. RD_RB2D_DC_FLUSH_ALL       equ 000fh
  129. RD_RB2D_DC_BUSY            equ 80000000h
  130.  
  131. RD_GMC_BRUSH_SOLID_COLOR   equ 000000D0h
  132. RD_GMC_SRC_DATATYPE_COLOR  equ (3 shl 12)
  133. RD_GMC_CLR_CMP_CNTL_DIS    equ (1 shl 28)
  134. RD_GMC_WR_MSK_DIS          equ (1 shl 30)
  135.  
  136. cmdSolidFill               equ 73f036d0h
  137.  
  138. RD_DST_PITCH_OFFSET        equ 142ch
  139. RD_SRC_PITCH_OFFSET        equ 1428h
  140.  
  141. RD_DST_X_LEFT_TO_RIGHT     equ 1
  142. RD_DST_Y_TOP_TO_BOTTOM     equ 2
  143. RD_DST_Y_X                 equ 1438h
  144. RD_DST_WIDTH_HEIGHT        equ 1598h
  145. RD_DST_LINE_START          equ 1600h
  146. RD_DST_LINE_END            equ 1604h
  147. R300_MEM_NUM_CHANNELS_MASK equ 0003h
  148.  
  149. macro rdr op1, op2
  150. {
  151.      mov edi, [ati_io]
  152.      mov op1, [edi+op2]
  153. }
  154.  
  155. macro wrr dest, src
  156. {
  157.      mov edi, [ati_io]
  158.      mov dword [edi+dest], src
  159. }
  160.  
  161. macro rmask dest, val, mask
  162. {
  163.      mov edi, [ati_io]
  164.      mov eax, [edi+dest]
  165.      and eax, not mask
  166.      or eax, (val and mask)
  167.      mov [edi+dest], eax
  168. }
  169.  
  170. public START
  171. public service_proc
  172. public version
  173.  
  174. CURSOR_IMAGE_OFFSET  equ 0x00500000
  175.  
  176. DRV_ENTRY equ 1
  177. DRV_EXIT  equ -1
  178.  
  179. section '.flat' code readable align 16
  180.  
  181. proc START stdcall, state:dword
  182.  
  183.            cmp [state], 1
  184.            jne .restore
  185.  
  186.      if DEBUG
  187.            mov esi, msgInit
  188.            call SysMsgBoardStr
  189.      end if
  190.  
  191.            call detect_ati
  192.            test eax, eax
  193.            jz .fail
  194.  
  195.            mov ebx, [SelectHwCursor]
  196.            mov ecx, [SetHwCursor]
  197.            mov edx, [HwCursorRestore]
  198.            mov esi, [HwCursorCreate]
  199.  
  200.            mov [oldSelect], ebx
  201.            mov [oldSet], ecx
  202.            mov [oldRestore], edx
  203.            mov [oldCreate], esi
  204.  
  205.            call eax
  206.  
  207.            or eax, -1
  208.            mov [cursor_map], eax
  209.            mov [cursor_map+4], eax
  210.            mov edx, cursor_map
  211.            mov [cursor_start], edx
  212.            add edx, 8
  213.            mov [cursor_end], edx
  214.  
  215.            stdcall RegService, sz_ati_srv, service_proc
  216.            test eax, eax
  217.            jz .restore
  218.  
  219.            mov ebx, [fnSelect]
  220.            mov ecx, [fnSet]
  221.  
  222.            mov [SelectHwCursor], ebx
  223.            mov [SetHwCursor], ecx
  224.            mov dword [HwCursorRestore], drv_restore
  225.            mov dword [HwCursorCreate], ati_cursor
  226.  
  227.            ret
  228. .restore:
  229.            mov eax, [oldSelect]
  230.            mov ebx, [oldSet]
  231.            mov ecx, [oldRestore]
  232.            mov edx, [oldCreate]
  233.  
  234.            mov [SelectHwCursor], eax
  235.            mov [SetHwCursor], ebx
  236.            mov [HwCursorRestore], ecx
  237.            mov [HwCursorCreate], edx
  238.  
  239.            xor eax, eax
  240.            ret
  241.  
  242. .fail:
  243.      if DEBUG
  244.            mov esi, msgFail
  245.            call SysMsgBoardStr
  246.      end if
  247.  
  248.            xor eax, eax
  249.            ret
  250. endp
  251.  
  252. handle     equ  IOCTL.handle
  253. io_code    equ  IOCTL.io_code
  254. input      equ  IOCTL.input
  255. inp_size   equ  IOCTL.inp_size
  256. output     equ  IOCTL.output
  257. out_size   equ  IOCTL.out_size
  258.  
  259. align 4
  260. proc service_proc stdcall, ioctl:dword
  261.  
  262.            mov ebx, [ioctl]
  263.            cmp [ebx+io_code], SRV_GETVERSION
  264.            jne .fail
  265.  
  266.            mov eax, [ebx+output]
  267.            cmp [ebx+out_size], 4
  268.            jne .fail
  269.            mov [eax], dword API_VERSION
  270.            xor eax, eax
  271.            ret
  272. .fail:
  273.            or eax, -1
  274.            ret
  275. endp
  276.  
  277. restore   handle
  278. restore   io_code
  279. restore   input
  280. restore   inp_size
  281. restore   output
  282. restore   out_size
  283.  
  284. align 4
  285. proc detect_ati
  286.            locals
  287.              last_bus dd ?
  288.            endl
  289.  
  290.            xor eax, eax
  291.            mov [bus], eax
  292.            inc eax
  293.            call PciApi
  294.            cmp eax, -1
  295.            je .err
  296.  
  297.            mov [last_bus], eax
  298.  
  299. .next_bus:
  300.            and [devfn], 0
  301. .next_dev:
  302.            stdcall PciRead32, [bus], [devfn], dword 0
  303.            test eax, eax
  304.            jz .next
  305.            cmp eax, -1
  306.            je .next
  307.  
  308.            mov edi, devices
  309. @@:
  310.            mov ebx, [edi]
  311.            test ebx, ebx
  312.            jz .next
  313.  
  314.            cmp eax, ebx
  315.            je .found
  316.            add edi, STRIDE
  317.            jmp @B
  318. .next:
  319.            inc [devfn]
  320.            cmp [devfn], 256
  321.            jb  .next_dev
  322.            mov eax, [bus]
  323.            inc eax
  324.            mov [bus], eax
  325.            cmp eax, [last_bus]
  326.            jna .next_bus
  327.            xor eax, eax
  328.            ret
  329. .found:
  330.            mov eax, [edi+4]
  331.            ret
  332. .err:
  333.            xor eax, eax
  334.            ret
  335. endp
  336.  
  337. align 4
  338. proc init_r200
  339.  
  340.            stdcall AllocKernelSpace, dword 0x10000
  341.            test eax, eax
  342.            jz .fail
  343.  
  344.            mov [ati_io], eax
  345.  
  346.            stdcall PciRead32, [bus], [devfn], dword 0x18
  347.            and eax, 0xFFFF0000
  348.            mov esi, eax
  349.  
  350.            mov edi, [ati_io]
  351.            mov edx, 16
  352. @@:
  353.            stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
  354.            add edi, 0x1000
  355.            add esi, 0x1000
  356.            dec edx
  357.            jnz @B
  358.  
  359.            mov edi, [ati_io]
  360.            mov dword [edi+RD_RB3D_CNTL], 0
  361.            call engRestore
  362.  
  363.            mov edi, [ati_io]
  364.            mov eax, [edi+0x50]
  365.            mov ebx,3
  366.            shl ebx,20
  367.            not ebx
  368.            and eax,ebx
  369.            mov ebx, 2
  370.            shl ebx,20
  371.            or eax, ebx
  372.            mov [edi+0x50], eax
  373.  
  374.            call r200_ShowCursor
  375.  
  376.            mov [fnSelect], r200_SelectCursor
  377.            mov [fnSet], r200_SetCursor
  378.  
  379.            xor eax, eax
  380.            inc eax
  381. .fail:
  382.            ret
  383. endp
  384.  
  385. if R500_HW2D
  386.   include 'r500hw.inc'
  387. end if
  388.  
  389. align 4
  390. proc init_r500
  391.  
  392.            stdcall AllocKernelSpace, dword 0x10000
  393.            test eax, eax
  394.            jz .fail
  395.  
  396.            mov [ati_io], eax
  397.  
  398.            stdcall PciRead32, [bus], [devfn], dword 0x18
  399.            and eax, 0xFFFF0000
  400.            mov esi, eax
  401.  
  402.            mov edi, [ati_io]
  403.            mov edx, 16
  404. @@:
  405.            stdcall MapPage,edi,esi,PG_SW+PG_NOCACHE
  406.            add edi, 0x1000
  407.            add esi, 0x1000
  408.            dec edx
  409.            jnz @B
  410.  
  411.            mov [fnSelect], r500_SelectCursor
  412.            mov [fnSet], r500_SetCursor
  413.  
  414.            rdr eax, 0x6110
  415.            mov [r500_LFB], eax
  416.  
  417. if R500_HW2D
  418.            call R5xx2DInit
  419. end if
  420.            wrr 0x6410, 0x001F001F
  421.            wrr 0x6400, dword (3 shl 8)
  422.  
  423.            xor eax, eax
  424.            inc eax
  425. .fail:
  426.            ret
  427. endp
  428.  
  429.  
  430. align 4
  431. drv_restore:
  432.            ret 8
  433.  
  434.  
  435. align 4
  436. proc r500_SelectCursor stdcall,hcursor:dword
  437.  
  438.            mov esi, [hcursor]
  439.  
  440.            mov edx, [esi+CURSOR.base]
  441.            sub edx, LFB_BASE
  442.            add edx, [r500_LFB]
  443.            wrr 0x6408, edx
  444.  
  445.            mov eax, [esi+CURSOR.hot_x]
  446.            shl eax, 16
  447.            mov ax, word [esi+CURSOR.hot_y]
  448.            wrr 0x6418, eax
  449.            ret
  450. endp
  451.  
  452. align 4
  453. proc r500_SetCursor stdcall, hcursor:dword, x:dword, y:dword
  454.            pushfd
  455.            cli
  456.  
  457.            mov esi, [hcursor]
  458.            mov edi, [ati_io]
  459.  
  460.            mov eax, [x]
  461.            shl eax, 16
  462.            mov ax, word [y]
  463.  
  464.            mov [edi+0x6414], eax
  465.            or dword [edi+0x6400], 1
  466.  
  467. if 0
  468.            stdcall R5xxSetupForSolidFill, 0x80808080, 3, 0xFFFFFFFF
  469.            stdcall R5xxSolidFillRect, 100,100, 100,100
  470.  
  471.            stdcall R5xxSetupForSolidFill, 0xFFFF0000, 3, 0xFFFFFFFF
  472.            stdcall R5xxSolidFillRect, 110,110, 80,80
  473.  
  474.            stdcall R5xxSetupForSolidFill, 0xFF00FF00, 3, 0xFFFFFFFF
  475.            stdcall R5xxSolidFillRect, 120,120, 60,60
  476.  
  477.            stdcall R5xxSetupForSolidFill, 0xFF0000FF, 3, 0xFFFFFFFF
  478.            stdcall R5xxSolidFillRect, 130,130, 40,40
  479. end if
  480.  
  481.            popfd
  482.            ret
  483. endp
  484.  
  485. align 4
  486. r500_ShowCursor:
  487.  
  488.            mov edi, [ati_io]
  489.            or dword [edi+0x6400], 1
  490.            ret
  491.  
  492. align 4
  493. r200_ShowCursor:
  494.            mov edi, [ati_io]
  495.  
  496.            mov eax, [edi+RD_CRTC_GEN_CNTL]
  497.            bts eax,16
  498.            mov [edi+RD_CRTC_GEN_CNTL], eax
  499.            ret
  500.  
  501.  
  502. align 4
  503. proc r200_SelectCursor stdcall,hcursor:dword
  504.  
  505.            ret
  506. endp
  507.  
  508. align 4
  509. proc r200_SetCursor stdcall, hcursor:dword, x:dword, y:dword
  510.            pushfd
  511.            cli
  512.  
  513.            xor eax, eax
  514.            xor edx, edx
  515.            mov esi, [hcursor]
  516.            mov ebx, [x]
  517.            mov ecx, [y]
  518.  
  519.            sub ebx, [esi+CURSOR.hot_x]
  520.            jnc @F
  521.            neg ebx
  522.            mov eax, ebx
  523.            shl eax, 16
  524.            xor ebx, ebx
  525. @@:
  526.            sub ecx, [esi+CURSOR.hot_y]
  527.            jnc @F
  528.            neg ecx
  529.            mov ax, cx
  530.            mov edx, ecx
  531.            xor ecx, ecx
  532. @@:
  533.            or eax, 0x80000000
  534.            wrr CUR_HORZ_VERT_OFF, eax
  535.  
  536.            shl ebx, 16
  537.            mov bx, cx
  538.            or ebx, 0x80000000
  539.            wrr CUR_HORZ_VERT_POSN, ebx
  540.  
  541.            shl edx, 8
  542.            add edx, [esi+CURSOR.base]
  543.            sub edx, LFBAddress
  544.            wrr CUR_OFFSET, edx
  545.            popfd
  546.            ret
  547. endp
  548.  
  549. align 4
  550. proc video_alloc
  551.  
  552.            pushfd
  553.            cli
  554.            mov ebx, [cursor_start]
  555.            mov ecx, [cursor_end]
  556. .l1:
  557.            bsf eax,[ebx];
  558.            jnz .found
  559.            add ebx,4
  560.            cmp ebx, ecx
  561.            jb .l1
  562.            popfd
  563.            xor eax,eax
  564.            ret
  565. .found:
  566.            btr [ebx], eax
  567.            popfd
  568.  
  569.            mov [cursor_start],ebx
  570.            sub ebx, cursor_map
  571.            lea eax,[eax+ebx*8]
  572.  
  573.            shl eax,14
  574.            add eax, LFBAddress+CURSOR_IMAGE_OFFSET
  575.            ret
  576. endp
  577.  
  578. align 4
  579. video_free:
  580.            pushfd
  581.            cli
  582.            sub eax, LFBAddress+CURSOR_IMAGE_OFFSET
  583.            shr eax, 14
  584.            mov ebx, cursor_map
  585.            bts [ebx], eax
  586.            shr eax, 3
  587.            and eax, not 3
  588.            add eax, ebx
  589.            cmp [cursor_start], eax
  590.            ja @f
  591.            popfd
  592.            ret
  593. @@:
  594.            mov [cursor_start], eax
  595.            popfd
  596.            ret
  597.  
  598. ; param
  599. ;  eax= pid
  600. ;  ebx= src
  601. ;  ecx= flags
  602.  
  603. align 4
  604. ati_cursor:
  605. .src     equ esp
  606. .flags   equ esp+4
  607. .hcursor equ esp+8
  608.  
  609.            sub esp, 4          ;space for .hcursor
  610.            push ecx
  611.            push ebx
  612.  
  613.            mov ebx, eax
  614.            mov eax, CURSOR_SIZE
  615.            call CreateObject
  616.            test eax, eax
  617.            jz .fail
  618.  
  619.            mov [.hcursor],eax
  620.  
  621.            xor ebx, ebx
  622.            mov [eax+CURSOR.magic], 'CURS'
  623.            mov [eax+CURSOR.destroy], destroy_cursor
  624.            mov [eax+CURSOR.hot_x], ebx
  625.            mov [eax+CURSOR.hot_y], ebx
  626.  
  627.            call video_alloc
  628.            mov edi, [.hcursor]
  629.            mov [edi+CURSOR.base], eax
  630.  
  631.            mov esi, [.src]
  632.            mov ebx, [.flags]
  633.            cmp bx, LOAD_INDIRECT
  634.            je .indirect
  635.  
  636.            movzx ecx, word [esi+10]
  637.            movzx edx, word [esi+12]
  638.            mov [edi+CURSOR.hot_x], ecx
  639.            mov [edi+CURSOR.hot_y], edx
  640.  
  641.            stdcall ati_init_cursor, eax, esi
  642.            mov eax, [.hcursor]
  643. .fail:
  644.            add esp, 12
  645.            ret
  646. .indirect:
  647.            shr ebx, 16
  648.            movzx ecx, bh
  649.            movzx edx, bl
  650.            mov [edi+CURSOR.hot_x], ecx
  651.            mov [edi+CURSOR.hot_y], edx
  652.  
  653.            mov edi, eax
  654.            mov ebx, eax
  655.            mov ecx, 64*64
  656.            xor eax,eax
  657.            cld
  658.            rep stosd
  659.            mov edi, ebx
  660.  
  661.            mov esi, [.src]
  662.            mov ebx, 32
  663.            cld
  664. @@:
  665.            mov ecx, 32
  666.            rep movsd
  667.            add edi, 128
  668.            dec ebx
  669.            jnz @B
  670.            mov eax, [.hcursor]
  671.            add esp, 12
  672.            ret
  673.  
  674. align 4
  675. destroy_cursor:
  676.  
  677.            push eax
  678.            mov eax, [eax+CURSOR.base]
  679.            call video_free
  680.            pop eax
  681.  
  682.            call DestroyObject
  683.            ret
  684.  
  685. align 4
  686. proc ati_init_cursor stdcall, dst:dword, src:dword
  687.            locals
  688.              rBase    dd ?
  689.              pQuad    dd ?
  690.              pBits    dd ?
  691.              pAnd     dd ?
  692.              width    dd ?
  693.              height   dd ?
  694.              counter  dd ?
  695.            endl
  696.  
  697.            mov esi, [src]
  698.            add esi,[esi+18]
  699.            mov eax,esi
  700.  
  701.            cmp [esi+BI.biBitCount], 24
  702.            je .img_24
  703.            cmp [esi+BI.biBitCount], 8
  704.            je .img_8
  705.            cmp [esi+BI.biBitCount], 4
  706.            je .img_4
  707.  
  708. .img_2:
  709.            add eax, [esi]
  710.            mov [pQuad],eax
  711.            add eax,8
  712.            mov [pBits],eax
  713.            add eax, 128
  714.            mov [pAnd],eax
  715.            mov eax,[esi+4]
  716.            mov [width],eax
  717.            mov ebx,[esi+8]
  718.            shr ebx,1
  719.            mov [height],ebx
  720.  
  721.            mov edi, pCursor
  722.            add edi, 32*31*4
  723.            mov [rBase],edi
  724.  
  725.            mov esi,[pQuad]
  726. .l21:
  727.            mov ebx, [pBits]
  728.            mov ebx, [ebx]
  729.            bswap ebx
  730.            mov eax, [pAnd]
  731.            mov eax, [eax]
  732.            bswap eax
  733.            mov [counter], 32
  734. @@:
  735.            xor edx, edx
  736.            shl eax,1
  737.            setc dl
  738.            dec edx
  739.  
  740.            xor ecx, ecx
  741.            shl ebx,1
  742.            setc cl
  743.            mov ecx, [esi+ecx*4]
  744.            and ecx, edx
  745.            and edx, 0xFF000000
  746.            or edx, ecx
  747.            mov [edi], edx
  748.  
  749.            add edi, 4
  750.            dec [counter]
  751.            jnz @B
  752.  
  753.            add [pBits], 4
  754.            add [pAnd], 4
  755.            mov edi,[rBase]
  756.            sub edi,128
  757.            mov [rBase],edi
  758.            sub [height],1
  759.            jnz .l21
  760.            jmp .copy
  761. .img_4:
  762.            add eax, [esi]
  763.            mov [pQuad],eax
  764.            add eax,64
  765.            mov [pBits],eax
  766.            add eax, 0x200
  767.            mov [pAnd],eax
  768.            mov eax,[esi+4]
  769.            mov [width],eax
  770.            mov ebx,[esi+8]
  771.            shr ebx,1
  772.            mov [height],ebx
  773.  
  774.            mov edi, pCursor
  775.            add edi, 32*31*4
  776.            mov [rBase],edi
  777.  
  778.            mov esi,[pQuad]
  779.            mov ebx, [pBits]
  780. .l4:
  781.            mov eax, [pAnd]
  782.            mov eax, [eax]
  783.            bswap eax
  784.            mov [counter], 16
  785. @@:
  786.            xor edx, edx
  787.            shl eax,1
  788.            setc dl
  789.            dec edx
  790.  
  791.            movzx ecx, byte [ebx]
  792.            and cl, 0xF0
  793.            shr ecx, 2
  794.            mov ecx, [esi+ecx]
  795.            and ecx, edx
  796.            and edx, 0xFF000000
  797.            or edx, ecx
  798.            mov [edi], edx
  799.  
  800.            xor edx, edx
  801.            shl eax,1
  802.            setc dl
  803.            dec edx
  804.  
  805.            movzx ecx, byte [ebx]
  806.            and cl, 0x0F
  807.            mov ecx, [esi+ecx*4]
  808.            and ecx, edx
  809.            and edx, 0xFF000000
  810.            or edx, ecx
  811.            mov [edi+4], edx
  812.  
  813.            inc ebx
  814.            add edi, 8
  815.            dec [counter]
  816.            jnz @B
  817.  
  818.            add [pAnd], 4
  819.            mov edi,[rBase]
  820.            sub edi,128
  821.            mov [rBase],edi
  822.            sub [height],1
  823.            jnz .l4
  824.            jmp .copy
  825. .img_8:
  826.            add eax, [esi]
  827.            mov [pQuad],eax
  828.            add eax,1024
  829.            mov [pBits],eax
  830.            add eax, 1024
  831.            mov [pAnd],eax
  832.            mov eax,[esi+4]
  833.            mov [width],eax
  834.            mov ebx,[esi+8]
  835.            shr ebx,1
  836.            mov [height],ebx
  837.  
  838.            mov edi, pCursor
  839.            add edi, 32*31*4
  840.            mov [rBase],edi
  841.  
  842.            mov esi,[pQuad]
  843.            mov ebx, [pBits]
  844. .l81:
  845.            mov eax, [pAnd]
  846.            mov eax, [eax]
  847.            bswap eax
  848.            mov [counter], 32
  849. @@:
  850.            xor edx, edx
  851.            shl eax,1
  852.            setc dl
  853.            dec edx
  854.  
  855.            movzx ecx,  byte [ebx]
  856.            mov ecx, [esi+ecx*4]
  857.            and ecx, edx
  858.            and edx, 0xFF000000
  859.            or edx, ecx
  860.            mov [edi], edx
  861.  
  862.            inc ebx
  863.            add edi, 4
  864.            dec [counter]
  865.            jnz @B
  866.  
  867.            add [pAnd], 4
  868.            mov edi,[rBase]
  869.            sub edi,128
  870.            mov [rBase],edi
  871.            sub [height],1
  872.            jnz .l81
  873.            jmp .copy
  874. .img_24:
  875.            add eax, [esi]
  876.            mov [pQuad],eax
  877.            add eax, 0xC00
  878.            mov [pAnd],eax
  879.            mov eax,[esi+BI.biWidth]
  880.            mov [width],eax
  881.            mov ebx,[esi+BI.biHeight]
  882.            shr ebx,1
  883.            mov [height],ebx
  884.  
  885.            mov edi, pCursor
  886.            add edi, 32*31*4
  887.            mov [rBase],edi
  888.  
  889.            mov esi,[pAnd]
  890.            mov ebx, [pQuad]
  891. .row_24:
  892.            mov eax, [esi]
  893.            bswap eax
  894.            mov [counter], 32
  895. @@:
  896.            xor edx, edx
  897.            shl eax,1
  898.            setc dl
  899.            dec edx
  900.  
  901.            mov ecx, [ebx]
  902.            and ecx, 0x00FFFFFF
  903.            and ecx, edx
  904.            and edx, 0xFF000000
  905.            or edx, ecx
  906.            mov [edi], edx
  907.            add ebx, 3
  908.            add edi, 4
  909.            dec [counter]
  910.            jnz @B
  911.  
  912.            add esi, 4
  913.            mov edi,[rBase]
  914.            sub edi,128
  915.            mov [rBase],edi
  916.            sub [height],1
  917.            jnz .row_24
  918. .copy:
  919.            mov edi, [dst]
  920.            mov ecx, 64*64
  921.            xor eax,eax
  922.            rep stosd
  923.  
  924.            mov esi, pCursor
  925.            mov edi, [dst]
  926.            mov ebx, 32
  927.            cld
  928. @@:
  929.            mov ecx, 32
  930.            rep movsd
  931.            add edi, 128
  932.            dec ebx
  933.            jnz @B
  934.            ret
  935. endp
  936.  
  937. align 4
  938. proc engFlush
  939.  
  940.            mov edi, [ati_io]
  941.  
  942.            mov eax, [edi+RD_RB2D_DSTCACHE_CTLSTAT]
  943.            or eax,RD_RB2D_DC_FLUSH_ALL
  944.            mov [edi+RD_RB2D_DSTCACHE_CTLSTAT],eax
  945.  
  946.            mov ecx, RD_TIMEOUT
  947. @@:
  948.            mov eax,[edi+RD_RB2D_DSTCACHE_CTLSTAT]
  949.            and eax, RD_RB2D_DC_BUSY
  950.            jz .exit
  951.  
  952.            sub ecx,1
  953.            jnz @B
  954. .exit:
  955.            ret
  956. endp
  957.  
  958.  
  959. align 4
  960. engWaitForFifo:
  961. cnt equ bp+8
  962.            push ebp
  963.            mov ebp, esp
  964.  
  965.            mov edi, [ati_io]
  966.  
  967.            mov ecx, RD_TIMEOUT
  968. @@:
  969.            mov eax, [edi+RD_RBBM_STATUS]
  970.            and eax, RD_RBBM_FIFOCNT_MASK
  971.            cmp eax, [ebp+8]
  972.            jae .exit
  973.  
  974.            sub ecx,1
  975.            jmp @B
  976.  
  977. .exit:
  978.            leave
  979.            ret 4
  980.  
  981. align 4
  982. proc engWaitForIdle
  983.  
  984.            push dword 64
  985.            call engWaitForFifo
  986.  
  987.            mov edi, [ati_io]
  988.            mov ecx ,RD_TIMEOUT
  989. @@:
  990.            mov eax, [edi+RD_RBBM_STATUS]
  991.            and eax,RD_RBBM_ACTIVE
  992.            jz .exit
  993.  
  994.            sub ecx,1
  995.            jnz @B
  996. .exit:
  997.            call engFlush
  998.            ret
  999. endp
  1000.  
  1001.  
  1002. align 4
  1003. proc engRestore
  1004.  
  1005. ;             push dword 1
  1006. ;             call engWaitForFifo
  1007.  
  1008. ;             mov dword  [MMIO+RD_RB2D_DSTCACHE_MODE], 0
  1009.  
  1010.            push dword 3
  1011.            call engWaitForFifo
  1012.  
  1013.            mov edi, [ati_io]
  1014.  
  1015.            mov eax, [edi+RD_DISPLAY_BASE_ADDR]
  1016.            shr eax, 10d
  1017.            or eax,(64d shl 22d)
  1018.            mov [edi+RD_DEFAULT_OFFSET],eax
  1019.            mov [edi+RD_SRC_PITCH_OFFSET],eax
  1020.            mov [edi+RD_DST_PITCH_OFFSET],eax
  1021.  
  1022.            push dword 1
  1023.            call engWaitForFifo
  1024.  
  1025.            mov edi, [ati_io]
  1026.            mov eax, [edi+RD_DP_DATATYPE]
  1027.            btr eax, 29d
  1028.            mov [edi+RD_DP_DATATYPE],eax
  1029.  
  1030.            push dword 1
  1031.            call engWaitForFifo
  1032.  
  1033.            mov edi, [ati_io]
  1034.            mov dword [edi+RD_DEFAULT_SC_BOTTOM_RIGHT],\
  1035.                      (RD_DEFAULT_SC_RIGHT_MAX or RD_DEFAULT_SC_BOTTOM_MAX)
  1036.  
  1037.            push dword 1
  1038.            call engWaitForFifo
  1039.  
  1040.            mov edi, [ati_io]
  1041.            mov dword [edi+RD_DP_GUI_MASTER_CNTL],\
  1042.                      (RD_GMC_BRUSH_SOLID_COLOR or \
  1043.                       RD_GMC_SRC_DATATYPE_COLOR or \
  1044.                      (6 shl RD_GMC_DST_DATATYPE_SHIFT) or \
  1045.                       RD_GMC_CLR_CMP_CNTL_DIS or \
  1046.                       RD_ROP3_P or \
  1047.                       RD_GMC_WR_MSK_DIS)
  1048.  
  1049.  
  1050.            push dword 7
  1051.            call engWaitForFifo
  1052.  
  1053.            mov edi, [ati_io]
  1054.  
  1055.            mov dword [edi+RD_DST_LINE_START],0
  1056.            mov dword [edi+RD_DST_LINE_END], 0
  1057.            mov dword [edi+RD_DP_BRUSH_FRGD_CLR], 808000ffh
  1058.            mov dword [edi+RD_DP_BRUSH_BKGD_CLR], 002020ffh
  1059.            mov dword [edi+RD_DP_SRC_FRGD_CLR],   808000ffh
  1060.            mov dword [edi+RD_DP_SRC_BKGD_CLR],   004000ffh
  1061.            mov dword [edi+RD_DP_WRITE_MASK],0ffffffffh
  1062.  
  1063.            call engWaitForIdle
  1064.  
  1065.            ret
  1066. endp
  1067.  
  1068.  
  1069.  
  1070. align 4
  1071. dword2str:
  1072.       mov  esi, hex_buff
  1073.       mov ecx, -8
  1074. @@:
  1075.       rol eax, 4
  1076.       mov ebx, eax
  1077.       and ebx, 0x0F
  1078.       mov bl, [ebx+hexletters]
  1079.       mov [8+esi+ecx], bl
  1080.       inc ecx
  1081.       jnz @B
  1082.       ret
  1083.  
  1084. hexletters   db '0123456789ABCDEF'
  1085. hex_buff     db 8 dup(0),13,10,0
  1086.  
  1087. R200M       equ 0x5a62  ;R300
  1088. R7000       equ 0x5159  ;R200
  1089. R8500       equ 0x514C  ;R200
  1090. R9000       equ 0x4966  ;RV250
  1091. R9200       equ 0x5961  ;RV280
  1092. R9200SE     equ 0x5964  ;RV280
  1093. R9500       equ 0x4144  ;R300
  1094. R9500P      equ 0x4E45  ;R300
  1095. R9550       equ 0x4153  ;RV350
  1096. R9600       equ 0x4150  ;RV350
  1097. R9600XT     equ 0x4152  ;RV360
  1098. R9700P      equ 0x4E44  ;R300
  1099. R9800       equ 0x4E49  ;R350
  1100. R9800P      equ 0x4E48  ;R350
  1101. R9800XT     equ 0x4E4A  ;R360
  1102.  
  1103.  
  1104. align 4
  1105.  
  1106. devices:
  1107.         dd (R200M   shl 16)+VID_ATI, init_r200   ;R300
  1108.         dd (R7000   shl 16)+VID_ATI, init_r200
  1109.         dd (R8500   shl 16)+VID_ATI, init_r200
  1110.         dd (R9000   shl 16)+VID_ATI, init_r200
  1111.         dd (0x514D  shl 16)+VID_ATI, init_r200   ;R200     9100
  1112.  
  1113.         dd (R9200   shl 16)+VID_ATI, init_r200
  1114.         dd (R9200SE shl 16)+VID_ATI, init_r200
  1115.  
  1116.         dd (0x5960  shl 16)+VID_ATI, init_r200   ;RV280    9250
  1117.  
  1118.         dd (R9500   shl 16)+VID_ATI, init_r200
  1119.         dd (R9500P  shl 16)+VID_ATI, init_r200
  1120.         dd (R9550   shl 16)+VID_ATI, init_r200
  1121.  
  1122.         dd (R9600   shl 16)+VID_ATI, init_r200
  1123.         dd (R9600XT shl 16)+VID_ATI, init_r200
  1124.         dd (0x4155  shl 16)+VID_ATI, init_r200   ;RV350    9600
  1125.         dd (0x4151  shl 16)+VID_ATI, init_r200   ;RV350    9600
  1126.         dd (0x4E51  shl 16)+VID_ATI, init_r200   ;RV350    9600
  1127.  
  1128.         dd (R9700P  shl 16)+VID_ATI, init_r200
  1129.  
  1130.         dd (0x4148  shl 16)+VID_ATI, init_r200   ;R350    9800
  1131.         dd (R9800   shl 16)+VID_ATI, init_r200
  1132.         dd (R9800P  shl 16)+VID_ATI, init_r200
  1133.         dd (R9800XT shl 16)+VID_ATI, init_r200
  1134.  
  1135.         dd (0x5B60  shl 16)+VID_ATI, init_r200   ;RV370    X300/X550
  1136.         dd (0x5B63  shl 16)+VID_ATI, init_r200   ;RV370    X550
  1137.         dd (0x5B62  shl 16)+VID_ATI, init_r200   ;RV380x   X600
  1138.         dd (0x3E50  shl 16)+VID_ATI, init_r200   ;RV380    X600/X550
  1139.  
  1140.         dd (0x5B4F  shl 16)+VID_ATI, init_r200   ;RV410    X700
  1141.         dd (0x5B4D  shl 16)+VID_ATI, init_r200   ;RV410    X700
  1142.         dd (0x5B4B  shl 16)+VID_ATI, init_r200   ;RV410    X700
  1143.         dd (0x5B4C  shl 16)+VID_ATI, init_r200   ;RV410    X700
  1144.  
  1145.         dd (0x4a49  shl 16)+VID_ATI, init_r200   ;R420     X800 PRO/GTO
  1146.         dd (0x4a4B  shl 16)+VID_ATI, init_r200   ;R420     X800
  1147.         dd (0x5549  shl 16)+VID_ATI, init_r200   ;R423     X800
  1148.         dd (0x4a4A  shl 16)+VID_ATI, init_r200   ;R420     X800
  1149.         dd (0x554F  shl 16)+VID_ATI, init_r200   ;R430     X800
  1150.         dd (0x554D  shl 16)+VID_ATI, init_r200   ;R430     X800
  1151.         dd (0x554E  shl 16)+VID_ATI, init_r200   ;R430     X800
  1152.         dd (0x5D57  shl 16)+VID_ATI, init_r200   ;R423     X800 XT
  1153.         dd (0x4A50  shl 16)+VID_ATI, init_r200   ;R420     X800 XT
  1154.         dd (0x554A  shl 16)+VID_ATI, init_r200   ;R423     X800 XT
  1155.         dd (0x5D4F  shl 16)+VID_ATI, init_r200   ;R423     X800/X850
  1156.         dd (0x554B  shl 16)+VID_ATI, init_r200   ;R423     X800 GT
  1157.  
  1158.         dd (0x4B4B  shl 16)+VID_ATI, init_r200   ;R481     X850
  1159.         dd (0x4B49  shl 16)+VID_ATI, init_r200   ;R481     X850
  1160.         dd (0x4B4C  shl 16)+VID_ATI, init_r200   ;R481     X850
  1161.  
  1162.         dd (0x5D4D  shl 16)+VID_ATI, init_r200   ;R480     X850
  1163.         dd (0x5D52  shl 16)+VID_ATI, init_r200   ;R480     X850
  1164.  
  1165.         dd (0x791E  shl 16)+VID_ATI, init_r500   ;RS690   X1200
  1166.  
  1167.         dd (0x7140  shl 16)+VID_ATI, init_r500   ;RV515   X1300
  1168.         dd (0x7142  shl 16)+VID_ATI, init_r500   ;RV515   X1300
  1169.         dd (0x7146  shl 16)+VID_ATI, init_r500   ;RV515   X1300
  1170.         dd (0x714D  shl 16)+VID_ATI, init_r500   ;RV515   X1300
  1171.         dd (0x714E  shl 16)+VID_ATI, init_r500   ;RV515   X1300
  1172.  
  1173.         dd (0x7183  shl 16)+VID_ATI, init_r500   ;RV515   X1300
  1174.         dd (0x7187  shl 16)+VID_ATI, init_r500   ;RV515   X1300
  1175.         dd (0x718F  shl 16)+VID_ATI, init_r500   ;RV515   X1300
  1176.  
  1177.         dd (0x7143  shl 16)+VID_ATI, init_r500   ;RV515   X1550
  1178.         dd (0x7147  shl 16)+VID_ATI, init_r500   ;RV515   X1550
  1179.         dd (0x715F  shl 16)+VID_ATI, init_r500   ;RV515   X1550
  1180.         dd (0x7193  shl 16)+VID_ATI, init_r500   ;RV515   X1550
  1181.         dd (0x719F  shl 16)+VID_ATI, init_r500   ;RV515   X1550
  1182.  
  1183.         dd (0x71C0  shl 16)+VID_ATI, init_r500   ;RV530   X1600
  1184.         dd (0x71C1  shl 16)+VID_ATI, init_r500   ;RV535   X1650
  1185.         dd (0x71C2  shl 16)+VID_ATI, init_r500   ;RV530   X1600
  1186.         dd (0x71C3  shl 16)+VID_ATI, init_r500   ;RV535   X1600
  1187.         dd (0x71C6  shl 16)+VID_ATI, init_r500   ;RV530   X1600
  1188.         dd (0x71C7  shl 16)+VID_ATI, init_r500   ;RV534   X1650
  1189.  
  1190.         dd (0x7181  shl 16)+VID_ATI, init_r500   ;RV515   X1600
  1191.         dd (0x71CD  shl 16)+VID_ATI, init_r500   ;RV530   X1600
  1192.  
  1193.         dd (0x7291  shl 16)+VID_ATI, init_r500   ;R580    X1650
  1194.         dd (0x7293  shl 16)+VID_ATI, init_r500   ;R580    X1650
  1195.  
  1196.         dd (0x7100  shl 16)+VID_ATI, init_r500   ;RV520   X1800
  1197.         dd (0x7109  shl 16)+VID_ATI, init_r500   ;RV520   X1800
  1198.         dd (0x710A  shl 16)+VID_ATI, init_r500   ;RV520   X1800 GTO
  1199.  
  1200.         dd (0x7249  shl 16)+VID_ATI, init_r500   ;RV580   X1900
  1201.         dd (0x724B  shl 16)+VID_ATI, init_r500   ;RV580   X1900 GT
  1202.  
  1203.         dd (0x7240  shl 16)+VID_ATI, init_r500   ;RV580   X1950
  1204.         dd (0x7244  shl 16)+VID_ATI, init_r500   ;RV580   X1950
  1205.         dd (0x7248  shl 16)+VID_ATI, init_r500   ;RV580   X1950
  1206.  
  1207.         dd (0x7288  shl 16)+VID_ATI, init_r500   ;R580    X1950 GT
  1208.         dd (0x7280  shl 16)+VID_ATI, init_r500   ;R580    X1950 PRO
  1209.  
  1210.         dd (0x94C3  shl 16)+VID_ATI, init_r500   ;RV610   HD 2400 PRO
  1211.         dd (0x94C1  shl 16)+VID_ATI, init_r500   ;RV610   HD 2400 XT
  1212.  
  1213.         dd (0x9589  shl 16)+VID_ATI, init_r500   ;RV630   HD 2600 PRO
  1214.         dd (0x958A  shl 16)+VID_ATI, init_r500   ;RV630   HD 2600 X2
  1215.         dd (0x9588  shl 16)+VID_ATI, init_r500   ;RV630   HD 2600 XT
  1216.  
  1217.         dd (0x9403  shl 16)+VID_ATI, init_r500   ;R600    HD 2900 PRO
  1218.         dd (0x9409  shl 16)+VID_ATI, init_r500   ;R600    HD 2900 XT
  1219.  
  1220.  
  1221.         dd 0    ;terminator
  1222.  
  1223. version      dd (5 shl 16) or (API_VERSION and 0xFFFF)
  1224.  
  1225. if R500_HW2D
  1226.  
  1227. align 16
  1228. R5xxRops  dd R5XX_ROP3_ZERO, R5XX_ROP3_ZERO  ;GXclear
  1229.           dd R5XX_ROP3_DSa,  R5XX_ROP3_DPa   ;Gxand
  1230.           dd R5XX_ROP3_SDna, R5XX_ROP3_PDna  ;GXandReverse
  1231.           dd R5XX_ROP3_S,    R5XX_ROP3_P     ;GXcopy
  1232.           dd R5XX_ROP3_DSna, R5XX_ROP3_DPna  ;GXandInverted
  1233.           dd R5XX_ROP3_D,    R5XX_ROP3_D     ;GXnoop
  1234.           dd R5XX_ROP3_DSx,  R5XX_ROP3_DPx   ;GXxor
  1235.           dd R5XX_ROP3_DSo,  R5XX_ROP3_DPo   ;GXor
  1236.           dd R5XX_ROP3_DSon, R5XX_ROP3_DPon  ;GXnor
  1237.           dd R5XX_ROP3_DSxn, R5XX_ROP3_PDxn  ;GXequiv
  1238.           dd R5XX_ROP3_Dn,   R5XX_ROP3_Dn    ;GXinvert
  1239.           dd R5XX_ROP3_SDno, R5XX_ROP3_PDno  ;GXorReverse
  1240.           dd R5XX_ROP3_Sn,   R5XX_ROP3_Pn    ;GXcopyInverted
  1241.           dd R5XX_ROP3_DSno, R5XX_ROP3_DPno  ;GXorInverted
  1242.           dd R5XX_ROP3_DSan, R5XX_ROP3_DPan  ;GXnand
  1243.           dd R5XX_ROP3_ONE,  R5XX_ROP3_ONE   ;GXset
  1244. end if
  1245.  
  1246.  
  1247. sz_ati_srv   db 'HWCURSOR',0
  1248.  
  1249. msgInit      db 'detect hardware...',13,10,0
  1250. msgPCI       db 'PCI accsess not supported',13,10,0
  1251. msgFail      db 'device not found',13,10,0
  1252. msg_neg      db 'neg ecx',13,10,0
  1253.  
  1254. if R500_HW2D
  1255.  
  1256. msgR5xx2DFlushtimeout \
  1257.              db 'R5xx2DFlush timeout error',13,10,0
  1258. msgR5xxFIFOWaitLocaltimeout \
  1259.              db 'R5xxFIFOWaitLocal timeout error', 13, 10,0
  1260. msgR5xx2DIdleLocaltimeout \
  1261.              db 'R5xx2DIdleLocal timeout error', 13,10,0
  1262. end if
  1263.  
  1264. if 0
  1265. msg6100      db '6100:  ',0
  1266. msg6104      db '6104:  ',0
  1267. msg6108      db '6108:  ',0
  1268. msg6110      db '6110:  ',0
  1269. msg6120      db '6120:  ',0
  1270. msg6124      db '6124:  ',0
  1271. msg6128      db '6128:  ',0
  1272. msg612C      db '612C:  ',0
  1273. msg6130      db '6130:  ',0
  1274. msg6134      db '6134:  ',0
  1275. msg6138      db '6138:  ',0
  1276. end if
  1277.  
  1278. buff         db 8 dup(0)
  1279.              db 13,10, 0
  1280.  
  1281. section '.data' data readable writable align 16
  1282.  
  1283. pCursor  db 4096 dup(?)
  1284.  
  1285. cursor_map     rd 2
  1286. cursor_start   rd 1
  1287. cursor_end     rd 1
  1288.  
  1289. fnSelect       rd 1
  1290. fnSet          rd 1
  1291. oldSelect      rd 1
  1292. oldSet         rd 1
  1293. oldRestore     rd 1
  1294. oldCreate      rd 1
  1295.  
  1296. r500_LFB       rd 1
  1297.  
  1298. bus            dd ?
  1299. devfn          dd ?
  1300. ati_io         dd ?
  1301.  
  1302. if R500_HW2D
  1303.  
  1304. rhd            RHD
  1305.  
  1306. end if
  1307.