Subversion Repositories Kolibri OS

Rev

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