Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | 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. DEBUG           equ 1
  11.  
  12. include 'proc32.inc'
  13. include 'imports.inc'
  14.  
  15. R500_HW2D       equ 0
  16.  
  17. API_VERSION     equ 0x01000100
  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. PCI_MEMORY_MASK  equ 0xfffffff0
  75.  
  76. struc IOCTL
  77. {  .handle           dd ?
  78.    .io_code          dd ?
  79.    .input            dd ?
  80.    .inp_size         dd ?
  81.    .output           dd ?
  82.    .out_size         dd ?
  83. }
  84.  
  85. virtual at 0
  86.   IOCTL IOCTL
  87. end virtual
  88.  
  89. ;MMIO                   equ 0F9000000h
  90. RD_RB3D_CNTL               equ 1c3ch
  91.  
  92. RD_MEM_CNTL                equ 0140h
  93. RD_CRTC_GEN_CNTL           equ 0050h
  94. RD_CRTC_CUR_EN             equ 10000h
  95. RD_DISPLAY_BASE_ADDR       equ 023ch
  96. RD_DEFAULT_OFFSET          equ 16e0h
  97.  
  98. CUR_HORZ_VERT_OFF          equ 0268h
  99. CUR_HORZ_VERT_POSN         equ 0264h
  100. CUR_OFFSET                 equ 0260h
  101.  
  102.  
  103. RD_RB3D_CNTL               equ 1c3ch
  104. RD_RBBM_STATUS             equ 0e40h
  105. RD_RBBM_FIFOCNT_MASK       equ 007fh
  106. RD_RBBM_ACTIVE             equ 80000000h
  107. RD_TIMEOUT                 equ 2000000
  108.  
  109. RD_DP_GUI_MASTER_CNTL      equ 0146ch
  110. RD_DP_BRUSH_BKGD_CLR       equ 01478h
  111. RD_DP_BRUSH_FRGD_CLR       equ 0147ch
  112. RD_DP_SRC_BKGD_CLR         equ 015dch
  113. RD_DP_SRC_FRGD_CLR         equ 015d8h
  114. RD_DP_CNTL                 equ 016c0h
  115. RD_DP_DATATYPE             equ 016c4h
  116. RD_DP_WRITE_MASK           equ 016cch
  117. RD_DP_SRC_SOURCE_MEMORY    equ (2 shl 24)
  118. RD_DP_SRC_SOURCE_HOST_DATA equ (3 shl 24)
  119. RD_DEFAULT_SC_BOTTOM_RIGHT equ 16e8h
  120. RD_GMC_BRUSH_SOLID_COLOR   equ (13 shl 4)
  121. RD_DEFAULT_SC_RIGHT_MAX    equ 1fffh
  122. RD_DEFAULT_SC_BOTTOM_MAX   equ 1fff0000h
  123. RD_GMC_DST_DATATYPE_SHIFT  equ 8
  124.  
  125. RD_ROP3_S                  equ 00cc0000h
  126. RD_ROP3_P                  equ 00f00000h
  127.  
  128. RD_RB2D_DSTCACHE_MODE      equ 03428h
  129. RD_RB2D_DSTCACHE_CTLSTAT   equ 0342ch
  130. RD_RB2D_DC_FLUSH_ALL       equ 000fh
  131. RD_RB2D_DC_BUSY            equ 80000000h
  132.  
  133. RD_GMC_BRUSH_SOLID_COLOR   equ 000000D0h
  134. RD_GMC_SRC_DATATYPE_COLOR  equ (3 shl 12)
  135. RD_GMC_CLR_CMP_CNTL_DIS    equ (1 shl 28)
  136. RD_GMC_WR_MSK_DIS          equ (1 shl 30)
  137.  
  138. cmdSolidFill               equ 73f036d0h
  139.  
  140. RD_DST_PITCH_OFFSET        equ 142ch
  141. RD_SRC_PITCH_OFFSET        equ 1428h
  142.  
  143. RD_DST_X_LEFT_TO_RIGHT     equ 1
  144. RD_DST_Y_TOP_TO_BOTTOM     equ 2
  145. RD_DST_Y_X                 equ 1438h
  146. RD_DST_WIDTH_HEIGHT        equ 1598h
  147. RD_DST_LINE_START          equ 1600h
  148. RD_DST_LINE_END            equ 1604h
  149. R300_MEM_NUM_CHANNELS_MASK equ 0003h
  150.  
  151. macro rdr op1, op2
  152. {
  153.      mov edi, [ati_io]
  154.      mov op1, [edi+op2]
  155. }
  156.  
  157. macro BEGIN_RING
  158. {
  159.       mov edi, [rhd.ring_base]
  160.       mov edx, [rhd.ring_wp]
  161. }
  162.  
  163. macro COMMIT_RING
  164. {
  165.         and edx, 0x1FFF
  166.         mov [rhd.ring_wp], edx
  167.  
  168.         lock add [esp], dword 0            ; Flush writes to ring
  169.  
  170.         wrr RADEON_CP_RB_WPTR, edx
  171.         rdr eax, RADEON_CP_RB_RPTR
  172. }
  173.  
  174. macro OUT_PACKET0 reg, count
  175. {
  176.      mov eax, (RADEON_CP_PACKET0 + (count shl 16) + (reg shr 2))
  177.      mov [edi+edx*4], eax
  178.      inc edx
  179. }
  180.  
  181. macro OUT_PACKET3 pkt, count
  182. {
  183.      mov eax, (RADEON_CP_PACKET3 or pkt or (count shl 16))
  184.      mov [edi+edx*4], eax
  185.      inc edx
  186. }
  187.  
  188. macro OUT_RING  val
  189. {
  190.      mov eax, val
  191.      mov [edi+edx*4], eax
  192.      inc edx
  193. }
  194.  
  195. macro RADEON_WAIT_UNTIL_IDLE
  196. {
  197.      OUT_PACKET0 RADEON_WAIT_UNTIL, 0
  198.      OUT_RING RADEON_WAIT_2D_IDLECLEAN + \
  199.               RADEON_WAIT_3D_IDLECLEAN + \
  200.               RADEON_WAIT_HOST_IDLECLEAN
  201. }
  202.  
  203. macro RADEON_PURGE_CACHE
  204. {
  205.      OUT_PACKET0 R5XX_RB3D_DSTCACHE_CTLSTAT, 0
  206.      OUT_RING  R5XX_RB3D_DC_FLUSH_ALL
  207. }
  208.  
  209. macro RADEON_PURGE_ZCACHE
  210. {
  211.      OUT_PACKET0 RADEON_RB3D_ZCACHE_CTLSTAT, 0
  212.      OUT_RING RADEON_RB3D_ZC_FLUSH_ALL
  213. }
  214.  
  215. macro wrr dest, src
  216. {
  217.      mov edi, [ati_io]
  218.      mov dword [edi+dest], src
  219. }
  220.  
  221. macro rmask dest, val, mask
  222. {
  223.      mov edi, [ati_io]
  224.      mov eax, [edi+dest]
  225.      and eax, not mask
  226.      or eax, (val and mask)
  227.      mov [edi+dest], eax
  228. }
  229.  
  230. public START
  231. public service_proc
  232. public version
  233.  
  234. CURSOR_IMAGE_OFFSET  equ 0x00500000
  235.  
  236. DRV_ENTRY equ 1
  237. DRV_EXIT  equ -1
  238.  
  239. section '.flat' code readable align 16
  240.  
  241. proc START stdcall, state:dword
  242.  
  243.            cmp [state], 1
  244.            jne .restore
  245.  
  246.      if DEBUG
  247.            mov esi, msgInit
  248.            call SysMsgBoardStr
  249.      end if
  250.  
  251.            call detect_ati
  252.            test eax, eax
  253.            jz .fail
  254.  
  255.            mov ebx, [SelectHwCursor]
  256.            mov ecx, [SetHwCursor]
  257.            mov edx, [HwCursorRestore]
  258.            mov esi, [HwCursorCreate]
  259.  
  260.            mov [oldSelect], ebx
  261.            mov [oldSet], ecx
  262.            mov [oldRestore], edx
  263.            mov [oldCreate], esi
  264.  
  265.            call eax
  266.  
  267.            or eax, -1
  268.            mov [cursor_map], eax
  269.            mov [cursor_map+4], eax
  270.            mov edx, cursor_map
  271.            mov [cursor_start], edx
  272.            add edx, 8
  273.            mov [cursor_end], edx
  274.  
  275.            stdcall RegService, sz_ati_srv, service_proc
  276.            test eax, eax
  277.            jz .restore
  278.  
  279. if R500_HW2D
  280.            stdcall RegService, sz_HDraw_srv, r500_HDraw
  281.  
  282.            mov ebx, START
  283.            and ebx, -4096
  284.            mov [eax+0x20], ebx
  285.            mov [eax+0x24], dword 0                       ;hack
  286. end if
  287.            mov ebx, [fnSelect]
  288.            mov ecx, [fnSet]
  289.  
  290.            mov [SelectHwCursor], ebx
  291.            mov [SetHwCursor], ecx
  292.            mov dword [HwCursorRestore], drv_restore
  293.            mov dword [HwCursorCreate], ati_cursor
  294.  
  295.            ret
  296. .restore:
  297.            mov eax, [oldSelect]
  298.            mov ebx, [oldSet]
  299.            mov ecx, [oldRestore]
  300.            mov edx, [oldCreate]
  301.  
  302.            mov [SelectHwCursor], eax
  303.            mov [SetHwCursor], ebx
  304.            mov [HwCursorRestore], ecx
  305.            mov [HwCursorCreate], edx
  306.  
  307.            xor eax, eax
  308.            ret
  309.  
  310. .fail:
  311.      if DEBUG
  312.            mov esi, msgFail
  313.            call SysMsgBoardStr
  314.      end if
  315.  
  316.            xor eax, eax
  317.            ret
  318. endp
  319.  
  320. handle     equ  IOCTL.handle
  321. io_code    equ  IOCTL.io_code
  322. input      equ  IOCTL.input
  323. inp_size   equ  IOCTL.inp_size
  324. output     equ  IOCTL.output
  325. out_size   equ  IOCTL.out_size
  326.  
  327. align 4
  328. proc service_proc stdcall, ioctl:dword
  329.  
  330.            mov ebx, [ioctl]
  331.            cmp [ebx+io_code], SRV_GETVERSION
  332.            jne .fail
  333.  
  334.            mov eax, [ebx+output]
  335.            cmp [ebx+out_size], 4
  336.            jne .fail
  337.            mov [eax], dword API_VERSION
  338.            xor eax, eax
  339.            ret
  340. .fail:
  341.            or eax, -1
  342.            ret
  343. endp
  344.  
  345. restore   handle
  346. restore   io_code
  347. restore   input
  348. restore   inp_size
  349. restore   output
  350. restore   out_size
  351.  
  352. align 4
  353. proc detect_ati
  354.            locals
  355.              last_bus dd ?
  356.            endl
  357.  
  358.            xor eax, eax
  359.            mov [bus], eax
  360.            inc eax
  361.            call PciApi
  362.            cmp eax, -1
  363.            je .err
  364.  
  365.            mov [last_bus], eax
  366.  
  367. .next_bus:
  368.            and [devfn], 0
  369. .next_dev:
  370.            stdcall PciRead32, [bus], [devfn], dword 0
  371.            test eax, eax
  372.            jz .next
  373.            cmp eax, -1
  374.            je .next
  375.  
  376.            mov edi, devices
  377. @@:
  378.            mov ebx, [edi]
  379.            test ebx, ebx
  380.            jz .next
  381.  
  382.            cmp eax, ebx
  383.            je .found
  384.            add edi, STRIDE
  385.            jmp @B
  386. .next:
  387.            inc [devfn]
  388.            cmp [devfn], 256
  389.            jb  .next_dev
  390.            mov eax, [bus]
  391.            inc eax
  392.            mov [bus], eax
  393.            cmp eax, [last_bus]
  394.            jna .next_bus
  395.            xor eax, eax
  396.            ret
  397. .found:
  398.            mov eax, [edi+4]
  399.            ret
  400. .err:
  401.            xor eax, eax
  402.            ret
  403. endp
  404.  
  405. align 4
  406. proc init_r200
  407.            stdcall PciRead32, [bus], [devfn], dword 0x18
  408.            and eax, PCI_MEMORY_MASK
  409.            stdcall MapIoMem,eax,0x10000,(PG_SW+PG_NOCACHE)
  410.            test eax, eax
  411.            jz .fail
  412.  
  413.            mov [ati_io], eax
  414.            mov edi, eax
  415.  
  416.            mov dword [edi+RD_RB3D_CNTL], 0
  417.            call engRestore
  418.  
  419.            mov edi, [ati_io]
  420.            mov eax, [edi+0x50]
  421.            mov ebx,3
  422.            shl ebx,20
  423.            not ebx
  424.            and eax,ebx
  425.            mov ebx, 2
  426.            shl ebx,20
  427.            or eax, ebx
  428.            mov [edi+0x50], eax
  429.  
  430.            call r200_ShowCursor
  431.  
  432.            mov [fnSelect], r200_SelectCursor
  433.            mov [fnSet], r200_SetCursor
  434.  
  435.            xor eax, eax
  436.            inc eax
  437. .fail:
  438.            ret
  439. endp
  440.  
  441. if R500_HW2D
  442.   include 'r500hw.inc'
  443. end if
  444.  
  445. align 4
  446. proc init_r500
  447.  
  448.            stdcall PciRead32, [bus], [devfn], dword 0x18
  449.            and eax, PCI_MEMORY_MASK
  450.            stdcall MapIoMem,eax,0x10000,(PG_SW+PG_NOCACHE)
  451.            test eax, eax
  452.            jz .fail
  453.  
  454.            mov [ati_io], eax
  455.  
  456.            mov [fnSelect], r500_SelectCursor
  457.            mov [fnSet], r500_SetCursor
  458.  
  459.            rdr eax, 0x6110
  460.            mov [r500_LFB], eax
  461.  
  462. if R500_HW2D
  463.            call R5xx2DInit
  464. end if
  465.            wrr 0x6410, 0x001F001F
  466.            wrr 0x6400, dword (3 shl 8)
  467.  
  468.            xor eax, eax
  469.            inc eax
  470. .fail:
  471.            ret
  472. endp
  473.  
  474.  
  475. align 4
  476. drv_restore:
  477.            ret 8
  478.  
  479.  
  480. align 4
  481. proc r500_SelectCursor stdcall,hcursor:dword
  482.  
  483.            mov esi, [hcursor]
  484.  
  485.            mov edx, [esi+CURSOR.base]
  486.            sub edx, LFB_BASE
  487.            add edx, [r500_LFB]
  488.            wrr 0x6408, edx
  489.  
  490.            mov eax, [esi+CURSOR.hot_x]
  491.            shl eax, 16
  492.            mov ax, word [esi+CURSOR.hot_y]
  493.            wrr 0x6418, eax
  494.            ret
  495. endp
  496.  
  497. align 4
  498. proc r500_SetCursor stdcall, hcursor:dword, x:dword, y:dword
  499.            pushfd
  500.            cli
  501.  
  502.            mov esi, [hcursor]
  503.            mov edi, [ati_io]
  504.  
  505.            mov eax, [x]
  506.            shl eax, 16
  507.            mov ax, word [y]
  508.  
  509.            mov [edi+0x6414], eax
  510.            or dword [edi+0x6400], 1
  511.  
  512.            popfd
  513.            ret
  514. endp
  515.  
  516. align 4
  517. r500_ShowCursor:
  518.  
  519.            mov edi, [ati_io]
  520.            or dword [edi+0x6400], 1
  521.            ret
  522.  
  523. align 4
  524. r200_ShowCursor:
  525.            mov edi, [ati_io]
  526.  
  527.            mov eax, [edi+RD_CRTC_GEN_CNTL]
  528.            bts eax,16
  529.            mov [edi+RD_CRTC_GEN_CNTL], eax
  530.            ret
  531.  
  532.  
  533. align 4
  534. proc r200_SelectCursor stdcall,hcursor:dword
  535.  
  536.            ret
  537. endp
  538.  
  539. align 4
  540. proc r200_SetCursor stdcall, hcursor:dword, x:dword, y:dword
  541.            pushfd
  542.            cli
  543.  
  544.            xor eax, eax
  545.            xor edx, edx
  546.            mov esi, [hcursor]
  547.            mov ebx, [x]
  548.            mov ecx, [y]
  549.  
  550.            sub ebx, [esi+CURSOR.hot_x]
  551.            jnc @F
  552.            neg ebx
  553.            mov eax, ebx
  554.            shl eax, 16
  555.            xor ebx, ebx
  556. @@:
  557.            sub ecx, [esi+CURSOR.hot_y]
  558.            jnc @F
  559.            neg ecx
  560.            mov ax, cx
  561.            mov edx, ecx
  562.            xor ecx, ecx
  563. @@:
  564.            or eax, 0x80000000
  565.            wrr CUR_HORZ_VERT_OFF, eax
  566.  
  567.            shl ebx, 16
  568.            mov bx, cx
  569.            or ebx, 0x80000000
  570.            wrr CUR_HORZ_VERT_POSN, ebx
  571.  
  572.            shl edx, 8
  573.            add edx, [esi+CURSOR.base]
  574.            sub edx, LFBAddress
  575.            wrr CUR_OFFSET, edx
  576.            popfd
  577.            ret
  578. endp
  579.  
  580. align 4
  581. proc video_alloc
  582.  
  583.            pushfd
  584.            cli
  585.            mov ebx, [cursor_start]
  586.            mov ecx, [cursor_end]
  587. .l1:
  588.            bsf eax,[ebx];
  589.            jnz .found
  590.            add ebx,4
  591.            cmp ebx, ecx
  592.            jb .l1
  593.            popfd
  594.            xor eax,eax
  595.            ret
  596. .found:
  597.            btr [ebx], eax
  598.            popfd
  599.  
  600.            mov [cursor_start],ebx
  601.            sub ebx, cursor_map
  602.            lea eax,[eax+ebx*8]
  603.  
  604.            shl eax,14
  605.            add eax, LFBAddress+CURSOR_IMAGE_OFFSET
  606.            ret
  607. endp
  608.  
  609. align 4
  610. video_free:
  611.            pushfd
  612.            cli
  613.            sub eax, LFBAddress+CURSOR_IMAGE_OFFSET
  614.            shr eax, 14
  615.            mov ebx, cursor_map
  616.            bts [ebx], eax
  617.            shr eax, 3
  618.            and eax, not 3
  619.            add eax, ebx
  620.            cmp [cursor_start], eax
  621.            ja @f
  622.            popfd
  623.            ret
  624. @@:
  625.            mov [cursor_start], eax
  626.            popfd
  627.            ret
  628.  
  629. ; param
  630. ;  eax= pid
  631. ;  ebx= src
  632. ;  ecx= flags
  633.  
  634. align 4
  635. ati_cursor:
  636. .src     equ esp
  637. .flags   equ esp+4
  638. .hcursor equ esp+8
  639.  
  640.            sub esp, 4          ;space for .hcursor
  641.            push ecx
  642.            push ebx
  643.  
  644.            mov ebx, eax
  645.            mov eax, CURSOR_SIZE
  646.            call CreateObject
  647.            test eax, eax
  648.            jz .fail
  649.  
  650.            mov [.hcursor],eax
  651.  
  652.            xor ebx, ebx
  653.            mov [eax+CURSOR.magic], 'CURS'
  654.            mov [eax+CURSOR.destroy], destroy_cursor
  655.            mov [eax+CURSOR.hot_x], ebx
  656.            mov [eax+CURSOR.hot_y], ebx
  657.  
  658.            call video_alloc
  659.            mov edi, [.hcursor]
  660.            mov [edi+CURSOR.base], eax
  661.  
  662.            mov esi, [.src]
  663.            mov ebx, [.flags]
  664.            cmp bx, LOAD_INDIRECT
  665.            je .indirect
  666.  
  667.            movzx ecx, word [esi+10]
  668.            movzx edx, word [esi+12]
  669.            mov [edi+CURSOR.hot_x], ecx
  670.            mov [edi+CURSOR.hot_y], edx
  671.  
  672.            stdcall ati_init_cursor, eax, esi
  673.            mov eax, [.hcursor]
  674. .fail:
  675.            add esp, 12
  676.            ret
  677. .indirect:
  678.            shr ebx, 16
  679.            movzx ecx, bh
  680.            movzx edx, bl
  681.            mov [edi+CURSOR.hot_x], ecx
  682.            mov [edi+CURSOR.hot_y], edx
  683.  
  684.            mov edi, eax
  685.            mov ebx, eax
  686.            mov ecx, 64*64
  687.            xor eax,eax
  688.            cld
  689.            rep stosd
  690.            mov edi, ebx
  691.  
  692.            mov esi, [.src]
  693.            mov ebx, 32
  694.            cld
  695. @@:
  696.            mov ecx, 32
  697.            rep movsd
  698.            add edi, 128
  699.            dec ebx
  700.            jnz @B
  701.            mov eax, [.hcursor]
  702.            add esp, 12
  703.            ret
  704.  
  705. align 4
  706. destroy_cursor:
  707.  
  708.            push eax
  709.            mov eax, [eax+CURSOR.base]
  710.            call video_free
  711.            pop eax
  712.  
  713.            call DestroyObject
  714.            ret
  715.  
  716. align 4
  717. proc ati_init_cursor stdcall, dst:dword, src:dword
  718.            locals
  719.              rBase    dd ?
  720.              pQuad    dd ?
  721.              pBits    dd ?
  722.              pAnd     dd ?
  723.              width    dd ?
  724.              height   dd ?
  725.              counter  dd ?
  726.            endl
  727.  
  728.            mov esi, [src]
  729.            add esi,[esi+18]
  730.            mov eax,esi
  731.  
  732.            cmp [esi+BI.biBitCount], 24
  733.            je .img_24
  734.            cmp [esi+BI.biBitCount], 8
  735.            je .img_8
  736.            cmp [esi+BI.biBitCount], 4
  737.            je .img_4
  738.  
  739. .img_2:
  740.            add eax, [esi]
  741.            mov [pQuad],eax
  742.            add eax,8
  743.            mov [pBits],eax
  744.            add eax, 128
  745.            mov [pAnd],eax
  746.            mov eax,[esi+4]
  747.            mov [width],eax
  748.            mov ebx,[esi+8]
  749.            shr ebx,1
  750.            mov [height],ebx
  751.  
  752.            mov edi, pCursor
  753.            add edi, 32*31*4
  754.            mov [rBase],edi
  755.  
  756.            mov esi,[pQuad]
  757. .l21:
  758.            mov ebx, [pBits]
  759.            mov ebx, [ebx]
  760.            bswap ebx
  761.            mov eax, [pAnd]
  762.            mov eax, [eax]
  763.            bswap eax
  764.            mov [counter], 32
  765. @@:
  766.            xor edx, edx
  767.            shl eax,1
  768.            setc dl
  769.            dec edx
  770.  
  771.            xor ecx, ecx
  772.            shl ebx,1
  773.            setc cl
  774.            mov ecx, [esi+ecx*4]
  775.            and ecx, edx
  776.            and edx, 0xFF000000
  777.            or edx, ecx
  778.            mov [edi], edx
  779.  
  780.            add edi, 4
  781.            dec [counter]
  782.            jnz @B
  783.  
  784.            add [pBits], 4
  785.            add [pAnd], 4
  786.            mov edi,[rBase]
  787.            sub edi,128
  788.            mov [rBase],edi
  789.            sub [height],1
  790.            jnz .l21
  791.            jmp .copy
  792. .img_4:
  793.            add eax, [esi]
  794.            mov [pQuad],eax
  795.            add eax,64
  796.            mov [pBits],eax
  797.            add eax, 0x200
  798.            mov [pAnd],eax
  799.            mov eax,[esi+4]
  800.            mov [width],eax
  801.            mov ebx,[esi+8]
  802.            shr ebx,1
  803.            mov [height],ebx
  804.  
  805.            mov edi, pCursor
  806.            add edi, 32*31*4
  807.            mov [rBase],edi
  808.  
  809.            mov esi,[pQuad]
  810.            mov ebx, [pBits]
  811. .l4:
  812.            mov eax, [pAnd]
  813.            mov eax, [eax]
  814.            bswap eax
  815.            mov [counter], 16
  816. @@:
  817.            xor edx, edx
  818.            shl eax,1
  819.            setc dl
  820.            dec edx
  821.  
  822.            movzx ecx, byte [ebx]
  823.            and cl, 0xF0
  824.            shr ecx, 2
  825.            mov ecx, [esi+ecx]
  826.            and ecx, edx
  827.            and edx, 0xFF000000
  828.            or edx, ecx
  829.            mov [edi], edx
  830.  
  831.            xor edx, edx
  832.            shl eax,1
  833.            setc dl
  834.            dec edx
  835.  
  836.            movzx ecx, byte [ebx]
  837.            and cl, 0x0F
  838.            mov ecx, [esi+ecx*4]
  839.            and ecx, edx
  840.            and edx, 0xFF000000
  841.            or edx, ecx
  842.            mov [edi+4], edx
  843.  
  844.            inc ebx
  845.            add edi, 8
  846.            dec [counter]
  847.            jnz @B
  848.  
  849.            add [pAnd], 4
  850.            mov edi,[rBase]
  851.            sub edi,128
  852.            mov [rBase],edi
  853.            sub [height],1
  854.            jnz .l4
  855.            jmp .copy
  856. .img_8:
  857.            add eax, [esi]
  858.            mov [pQuad],eax
  859.            add eax,1024
  860.            mov [pBits],eax
  861.            add eax, 1024
  862.            mov [pAnd],eax
  863.            mov eax,[esi+4]
  864.            mov [width],eax
  865.            mov ebx,[esi+8]
  866.            shr ebx,1
  867.            mov [height],ebx
  868.  
  869.            mov edi, pCursor
  870.            add edi, 32*31*4
  871.            mov [rBase],edi
  872.  
  873.            mov esi,[pQuad]
  874.            mov ebx, [pBits]
  875. .l81:
  876.            mov eax, [pAnd]
  877.            mov eax, [eax]
  878.            bswap eax
  879.            mov [counter], 32
  880. @@:
  881.            xor edx, edx
  882.            shl eax,1
  883.            setc dl
  884.            dec edx
  885.  
  886.            movzx ecx,  byte [ebx]
  887.            mov ecx, [esi+ecx*4]
  888.            and ecx, edx
  889.            and edx, 0xFF000000
  890.            or edx, ecx
  891.            mov [edi], edx
  892.  
  893.            inc ebx
  894.            add edi, 4
  895.            dec [counter]
  896.            jnz @B
  897.  
  898.            add [pAnd], 4
  899.            mov edi,[rBase]
  900.            sub edi,128
  901.            mov [rBase],edi
  902.            sub [height],1
  903.            jnz .l81
  904.            jmp .copy
  905. .img_24:
  906.            add eax, [esi]
  907.            mov [pQuad],eax
  908.            add eax, 0xC00
  909.            mov [pAnd],eax
  910.            mov eax,[esi+BI.biWidth]
  911.            mov [width],eax
  912.            mov ebx,[esi+BI.biHeight]
  913.            shr ebx,1
  914.            mov [height],ebx
  915.  
  916.            mov edi, pCursor
  917.            add edi, 32*31*4
  918.            mov [rBase],edi
  919.  
  920.            mov esi,[pAnd]
  921.            mov ebx, [pQuad]
  922. .row_24:
  923.            mov eax, [esi]
  924.            bswap eax
  925.            mov [counter], 32
  926. @@:
  927.            xor edx, edx
  928.            shl eax,1
  929.            setc dl
  930.            dec edx
  931.  
  932.            mov ecx, [ebx]
  933.            and ecx, 0x00FFFFFF
  934.            and ecx, edx
  935.            and edx, 0xFF000000
  936.            or edx, ecx
  937.            mov [edi], edx
  938.            add ebx, 3
  939.            add edi, 4
  940.            dec [counter]
  941.            jnz @B
  942.  
  943.            add esi, 4
  944.            mov edi,[rBase]
  945.            sub edi,128
  946.            mov [rBase],edi
  947.            sub [height],1
  948.            jnz .row_24
  949. .copy:
  950.            mov edi, [dst]
  951.            mov ecx, 64*64
  952.            xor eax,eax
  953.            rep stosd
  954.  
  955.            mov esi, pCursor
  956.            mov edi, [dst]
  957.            mov ebx, 32
  958.            cld
  959. @@:
  960.            mov ecx, 32
  961.            rep movsd
  962.            add edi, 128
  963.            dec ebx
  964.            jnz @B
  965.            ret
  966. endp
  967.  
  968. align 4
  969. proc engFlush
  970.  
  971.            mov edi, [ati_io]
  972.  
  973.            mov eax, [edi+RD_RB2D_DSTCACHE_CTLSTAT]
  974.            or eax,RD_RB2D_DC_FLUSH_ALL
  975.            mov [edi+RD_RB2D_DSTCACHE_CTLSTAT],eax
  976.  
  977.            mov ecx, RD_TIMEOUT
  978. @@:
  979.            mov eax,[edi+RD_RB2D_DSTCACHE_CTLSTAT]
  980.            and eax, RD_RB2D_DC_BUSY
  981.            jz .exit
  982.  
  983.            sub ecx,1
  984.            jnz @B
  985. .exit:
  986.            ret
  987. endp
  988.  
  989.  
  990. align 4
  991. engWaitForFifo:
  992. cnt equ bp+8
  993.            push ebp
  994.            mov ebp, esp
  995.  
  996.            mov edi, [ati_io]
  997.  
  998.            mov ecx, RD_TIMEOUT
  999. @@:
  1000.            mov eax, [edi+RD_RBBM_STATUS]
  1001.            and eax, RD_RBBM_FIFOCNT_MASK
  1002.            cmp eax, [ebp+8]
  1003.            jae .exit
  1004.  
  1005.            sub ecx,1
  1006.            jmp @B
  1007.  
  1008. .exit:
  1009.            leave
  1010.            ret 4
  1011.  
  1012. align 4
  1013. proc engWaitForIdle
  1014.  
  1015.            push dword 64
  1016.            call engWaitForFifo
  1017.  
  1018.            mov edi, [ati_io]
  1019.            mov ecx ,RD_TIMEOUT
  1020. @@:
  1021.            mov eax, [edi+RD_RBBM_STATUS]
  1022.            and eax,RD_RBBM_ACTIVE
  1023.            jz .exit
  1024.  
  1025.            sub ecx,1
  1026.            jnz @B
  1027. .exit:
  1028.            call engFlush
  1029.            ret
  1030. endp
  1031.  
  1032.  
  1033. align 4
  1034. proc engRestore
  1035.  
  1036. ;             push dword 1
  1037. ;             call engWaitForFifo
  1038.  
  1039. ;             mov dword  [MMIO+RD_RB2D_DSTCACHE_MODE], 0
  1040.  
  1041.            push dword 3
  1042.            call engWaitForFifo
  1043.  
  1044.            mov edi, [ati_io]
  1045.  
  1046.            mov eax, [edi+RD_DISPLAY_BASE_ADDR]
  1047.            shr eax, 10d
  1048.            or eax,(64d shl 22d)
  1049.            mov [edi+RD_DEFAULT_OFFSET],eax
  1050.            mov [edi+RD_SRC_PITCH_OFFSET],eax
  1051.            mov [edi+RD_DST_PITCH_OFFSET],eax
  1052.  
  1053.            push dword 1
  1054.            call engWaitForFifo
  1055.  
  1056.            mov edi, [ati_io]
  1057.            mov eax, [edi+RD_DP_DATATYPE]
  1058.            btr eax, 29d
  1059.            mov [edi+RD_DP_DATATYPE],eax
  1060.  
  1061.            push dword 1
  1062.            call engWaitForFifo
  1063.  
  1064.            mov edi, [ati_io]
  1065.            mov dword [edi+RD_DEFAULT_SC_BOTTOM_RIGHT],\
  1066.                      (RD_DEFAULT_SC_RIGHT_MAX or RD_DEFAULT_SC_BOTTOM_MAX)
  1067.  
  1068.            push dword 1
  1069.            call engWaitForFifo
  1070.  
  1071.            mov edi, [ati_io]
  1072.            mov dword [edi+RD_DP_GUI_MASTER_CNTL],\
  1073.                      (RD_GMC_BRUSH_SOLID_COLOR or \
  1074.                       RD_GMC_SRC_DATATYPE_COLOR or \
  1075.                      (6 shl RD_GMC_DST_DATATYPE_SHIFT) or \
  1076.                       RD_GMC_CLR_CMP_CNTL_DIS or \
  1077.                       RD_ROP3_P or \
  1078.                       RD_GMC_WR_MSK_DIS)
  1079.  
  1080.  
  1081.            push dword 7
  1082.            call engWaitForFifo
  1083.  
  1084.            mov edi, [ati_io]
  1085.  
  1086.            mov dword [edi+RD_DST_LINE_START],0
  1087.            mov dword [edi+RD_DST_LINE_END], 0
  1088.            mov dword [edi+RD_DP_BRUSH_FRGD_CLR], 808000ffh
  1089.            mov dword [edi+RD_DP_BRUSH_BKGD_CLR], 002020ffh
  1090.            mov dword [edi+RD_DP_SRC_FRGD_CLR],   808000ffh
  1091.            mov dword [edi+RD_DP_SRC_BKGD_CLR],   004000ffh
  1092.            mov dword [edi+RD_DP_WRITE_MASK],0ffffffffh
  1093.  
  1094.            call engWaitForIdle
  1095.  
  1096.            ret
  1097. endp
  1098.  
  1099.  
  1100.  
  1101. align 4
  1102. dword2str:
  1103.       mov  esi, hex_buff
  1104.       mov ecx, -8
  1105. @@:
  1106.       rol eax, 4
  1107.       mov ebx, eax
  1108.       and ebx, 0x0F
  1109.       mov bl, [ebx+hexletters]
  1110.       mov [8+esi+ecx], bl
  1111.       inc ecx
  1112.       jnz @B
  1113.       ret
  1114.  
  1115. hexletters   db '0123456789ABCDEF'
  1116. hex_buff     db 8 dup(0),13,10,0
  1117.  
  1118. R200M       equ 0x5a62  ;R300
  1119. R7000       equ 0x5159  ;R200
  1120. R750M       equ 0x4c57  ;M7 mobile rv200
  1121. R8500       equ 0x514C  ;R200
  1122. R9000       equ 0x4966  ;RV250
  1123. R9200       equ 0x5961  ;RV280
  1124. R9200SE     equ 0x5964  ;RV280
  1125. R9500       equ 0x4144  ;R300
  1126. R9500P      equ 0x4E45  ;R300
  1127. R9550       equ 0x4153  ;RV350
  1128. R9600       equ 0x4150  ;RV350
  1129. R9600XT     equ 0x4152  ;RV360
  1130. R9700P      equ 0x4E44  ;R300
  1131. R9800       equ 0x4E49  ;R350
  1132. R9800P      equ 0x4E48  ;R350
  1133. R9800XT     equ 0x4E4A  ;R360
  1134.  
  1135.  
  1136. align 4
  1137.  
  1138. devices:
  1139.         dd (R200M   shl 16)+VID_ATI, init_r200   ;R300
  1140.         dd (R7000   shl 16)+VID_ATI, init_r200
  1141.         dd (R750M   shl 16)+VID_ATI, init_r200   ;M7
  1142.         dd (R8500   shl 16)+VID_ATI, init_r200
  1143.         dd (R9000   shl 16)+VID_ATI, init_r200
  1144.         dd (0x514D  shl 16)+VID_ATI, init_r200   ;R200     9100
  1145.  
  1146.         dd (R9200   shl 16)+VID_ATI, init_r200
  1147.         dd (R9200SE shl 16)+VID_ATI, init_r200
  1148.  
  1149.         dd (0x5960  shl 16)+VID_ATI, init_r200   ;RV280    9250
  1150.  
  1151.         dd (R9500   shl 16)+VID_ATI, init_r200
  1152.         dd (R9500P  shl 16)+VID_ATI, init_r200
  1153.         dd (R9550   shl 16)+VID_ATI, init_r200
  1154.  
  1155.         dd (R9600   shl 16)+VID_ATI, init_r200
  1156.         dd (R9600XT shl 16)+VID_ATI, init_r200
  1157.         dd (0x4155  shl 16)+VID_ATI, init_r200   ;RV350    9600
  1158.         dd (0x4151  shl 16)+VID_ATI, init_r200   ;RV350    9600
  1159.         dd (0x4E51  shl 16)+VID_ATI, init_r200   ;RV350    9600
  1160.  
  1161.         dd (R9700P  shl 16)+VID_ATI, init_r200
  1162.  
  1163.         dd (0x4148  shl 16)+VID_ATI, init_r200   ;R350    9800
  1164.         dd (R9800   shl 16)+VID_ATI, init_r200
  1165.         dd (R9800P  shl 16)+VID_ATI, init_r200
  1166.         dd (R9800XT shl 16)+VID_ATI, init_r200
  1167.  
  1168.         dd (0x5B60  shl 16)+VID_ATI, init_r200   ;RV370    X300/X550
  1169.         dd (0x5B63  shl 16)+VID_ATI, init_r200   ;RV370    X550
  1170.         dd (0x5B62  shl 16)+VID_ATI, init_r200   ;RV380x   X600
  1171.         dd (0x3E50  shl 16)+VID_ATI, init_r200   ;RV380    X600/X550
  1172.  
  1173.         dd (0x5B4F  shl 16)+VID_ATI, init_r200   ;RV410    X700
  1174.         dd (0x5B4D  shl 16)+VID_ATI, init_r200   ;RV410    X700
  1175.         dd (0x5B4B  shl 16)+VID_ATI, init_r200   ;RV410    X700
  1176.         dd (0x5B4C  shl 16)+VID_ATI, init_r200   ;RV410    X700
  1177.  
  1178.         dd (0x4a49  shl 16)+VID_ATI, init_r200   ;R420     X800 PRO/GTO
  1179.         dd (0x4a4B  shl 16)+VID_ATI, init_r200   ;R420     X800
  1180.         dd (0x5549  shl 16)+VID_ATI, init_r200   ;R423     X800
  1181.         dd (0x4a4A  shl 16)+VID_ATI, init_r200   ;R420     X800
  1182.         dd (0x554F  shl 16)+VID_ATI, init_r200   ;R430     X800
  1183.         dd (0x554D  shl 16)+VID_ATI, init_r200   ;R430     X800
  1184.         dd (0x554E  shl 16)+VID_ATI, init_r200   ;R430     X800
  1185.         dd (0x5D57  shl 16)+VID_ATI, init_r200   ;R423     X800 XT
  1186.         dd (0x4A50  shl 16)+VID_ATI, init_r200   ;R420     X800 XT
  1187.         dd (0x554A  shl 16)+VID_ATI, init_r200   ;R423     X800 XT
  1188.         dd (0x5D4F  shl 16)+VID_ATI, init_r200   ;R423     X800/X850
  1189.         dd (0x554B  shl 16)+VID_ATI, init_r200   ;R423     X800 GT
  1190.  
  1191.         dd (0x4B4B  shl 16)+VID_ATI, init_r200   ;R481     X850
  1192.         dd (0x4B49  shl 16)+VID_ATI, init_r200   ;R481     X850
  1193.         dd (0x4B4C  shl 16)+VID_ATI, init_r200   ;R481     X850
  1194.  
  1195.         dd (0x5D4D  shl 16)+VID_ATI, init_r200   ;R480     X850
  1196.         dd (0x5D52  shl 16)+VID_ATI, init_r200   ;R480     X850
  1197.  
  1198.         dd (0x7100  shl 16)+VID_ATI, init_r500   ;Radeon X1800
  1199.         dd (0x7101  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1800 XT
  1200.         dd (0x7102  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1800
  1201.         dd (0x7103  shl 16)+VID_ATI, init_r500   ;Mobility FireGL V7200
  1202.         dd (0x7104  shl 16)+VID_ATI, init_r500   ;FireGL V7200
  1203.         dd (0x7105  shl 16)+VID_ATI, init_r500   ;FireGL V5300
  1204.         dd (0x7106  shl 16)+VID_ATI, init_r500   ;Mobility FireGL V7100
  1205.         dd (0x7108  shl 16)+VID_ATI, init_r500   ;Radeon X1800
  1206.         dd (0x7109  shl 16)+VID_ATI, init_r500   ;Radeon X1800
  1207.         dd (0x710A  shl 16)+VID_ATI, init_r500   ;Radeon X1800
  1208.         dd (0x710B  shl 16)+VID_ATI, init_r500   ;Radeon X1800
  1209.         dd (0x710C  shl 16)+VID_ATI, init_r500   ;Radeon X1800
  1210.         dd (0x710E  shl 16)+VID_ATI, init_r500   ;FireGL V7300
  1211.         dd (0x710F  shl 16)+VID_ATI, init_r500   ;FireGL V7350
  1212.         dd (0x7140  shl 16)+VID_ATI, init_r500   ;Radeon X1600/X1550
  1213.         dd (0x7141  shl 16)+VID_ATI, init_r500   ;RV505
  1214.         dd (0x7142  shl 16)+VID_ATI, init_r500   ;Radeon X1300/X1550
  1215.         dd (0x7143  shl 16)+VID_ATI, init_r500   ;Radeon X1550
  1216.         dd (0x7144  shl 16)+VID_ATI, init_r500   ;M54-GL
  1217.         dd (0x7145  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1400
  1218.         dd (0x7146  shl 16)+VID_ATI, init_r500   ;Radeon X1300/X1550
  1219.         dd (0x7147  shl 16)+VID_ATI, init_r500   ;Radeon X1550 64-bit
  1220.         dd (0x7149  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1300
  1221.         dd (0x714A  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1300
  1222.         dd (0x714B  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1300
  1223.         dd (0x714C  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1300
  1224.         dd (0x714D  shl 16)+VID_ATI, init_r500   ;Radeon X1300
  1225.         dd (0x714E  shl 16)+VID_ATI, init_r500   ;Radeon X1300
  1226.         dd (0x714F  shl 16)+VID_ATI, init_r500   ;RV505
  1227.         dd (0x7151  shl 16)+VID_ATI, init_r500   ;RV505
  1228.         dd (0x7152  shl 16)+VID_ATI, init_r500   ;FireGL V3300
  1229.         dd (0x7153  shl 16)+VID_ATI, init_r500   ;FireGL V3350
  1230.         dd (0x715E  shl 16)+VID_ATI, init_r500   ;Radeon X1300
  1231.         dd (0x715F  shl 16)+VID_ATI, init_r500   ;Radeon X1550 64-bit
  1232.         dd (0x7180  shl 16)+VID_ATI, init_r500   ;Radeon X1300/X1550
  1233.         dd (0x7181  shl 16)+VID_ATI, init_r500   ;Radeon X1600
  1234.         dd (0x7183  shl 16)+VID_ATI, init_r500   ;Radeon X1300/X1550
  1235.         dd (0x7186  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1450
  1236.         dd (0x7187  shl 16)+VID_ATI, init_r500   ;Radeon X1300/X1550
  1237.         dd (0x7188  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X2300
  1238.         dd (0x718A  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X2300
  1239.         dd (0x718B  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1350
  1240.         dd (0x718C  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1350
  1241.         dd (0x718D  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1450
  1242.         dd (0x718F  shl 16)+VID_ATI, init_r500   ;Radeon X1300
  1243.         dd (0x7193  shl 16)+VID_ATI, init_r500   ;Radeon X1550
  1244.         dd (0x7196  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1350
  1245.         dd (0x719B  shl 16)+VID_ATI, init_r500   ;FireMV 2250
  1246.         dd (0x719F  shl 16)+VID_ATI, init_r500   ;Radeon X1550 64-bit
  1247.         dd (0x71C0  shl 16)+VID_ATI, init_r500   ;Radeon X1600
  1248.         dd (0x71C1  shl 16)+VID_ATI, init_r500   ;Radeon X1650
  1249.         dd (0x71C2  shl 16)+VID_ATI, init_r500   ;Radeon X1600
  1250.         dd (0x71C3  shl 16)+VID_ATI, init_r500   ;Radeon X1600
  1251.         dd (0x71C4  shl 16)+VID_ATI, init_r500   ;Mobility FireGL V5200
  1252.         dd (0x71C5  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1600
  1253.         dd (0x71C6  shl 16)+VID_ATI, init_r500   ;Radeon X1650
  1254.         dd (0x71C7  shl 16)+VID_ATI, init_r500   ;Radeon X1650
  1255.         dd (0x71CD  shl 16)+VID_ATI, init_r500   ;Radeon X1600
  1256.         dd (0x71CE  shl 16)+VID_ATI, init_r500   ;Radeon X1300 XT/X1600 Pro
  1257.         dd (0x71D2  shl 16)+VID_ATI, init_r500   ;FireGL V3400
  1258.         dd (0x71D4  shl 16)+VID_ATI, init_r500   ;Mobility FireGL V5250
  1259.         dd (0x71D5  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1700
  1260.         dd (0x71D6  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1700 XT
  1261.         dd (0x71DA  shl 16)+VID_ATI, init_r500   ;FireGL V5200
  1262.         dd (0x71DE  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1700
  1263.         dd (0x7200  shl 16)+VID_ATI, init_r500   ;Radeon X2300HD
  1264.         dd (0x7210  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2300
  1265.         dd (0x7211  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2300
  1266.         dd (0x7240  shl 16)+VID_ATI, init_r500   ;Radeon X1950
  1267.         dd (0x7243  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1268.         dd (0x7244  shl 16)+VID_ATI, init_r500   ;Radeon X1950
  1269.         dd (0x7245  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1270.         dd (0x7246  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1271.         dd (0x7247  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1272.         dd (0x7248  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1273.         dd (0x7249  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1274.         dd (0x724A  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1275.         dd (0x724B  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1276.         dd (0x724C  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1277.         dd (0x724D  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1278.         dd (0x724E  shl 16)+VID_ATI, init_r500   ;AMD Stream Processor
  1279.         dd (0x724F  shl 16)+VID_ATI, init_r500   ;Radeon X1900
  1280.         dd (0x7280  shl 16)+VID_ATI, init_r500   ;Radeon X1950
  1281.         dd (0x7281  shl 16)+VID_ATI, init_r500   ;RV560
  1282.         dd (0x7283  shl 16)+VID_ATI, init_r500   ;RV560
  1283.         dd (0x7284  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1900
  1284.         dd (0x7287  shl 16)+VID_ATI, init_r500   ;RV560
  1285.         dd (0x7288  shl 16)+VID_ATI, init_r500   ;Radeon X1950 GT
  1286.         dd (0x7289  shl 16)+VID_ATI, init_r500   ;RV570
  1287.         dd (0x728B  shl 16)+VID_ATI, init_r500   ;RV570
  1288.         dd (0x728C  shl 16)+VID_ATI, init_r500   ;ATI FireGL V7400
  1289.         dd (0x7290  shl 16)+VID_ATI, init_r500   ;RV560
  1290.         dd (0x7291  shl 16)+VID_ATI, init_r500   ;Radeon X1650
  1291.         dd (0x7293  shl 16)+VID_ATI, init_r500   ;Radeon X1650
  1292.         dd (0x7297  shl 16)+VID_ATI, init_r500   ;RV560
  1293.         dd (0x791E  shl 16)+VID_ATI, init_r500   ;Radeon X1200
  1294.         dd (0x791F  shl 16)+VID_ATI, init_r500   ;Radeon X1200
  1295.         dd (0x793F  shl 16)+VID_ATI, init_r500   ;Radeon Xpress 1200
  1296.         dd (0x7941  shl 16)+VID_ATI, init_r500   ;Radeon Xpress 1200
  1297.         dd (0x7942  shl 16)+VID_ATI, init_r500   ;Radeon Xpress 1200 (M)
  1298.         dd (0x796C  shl 16)+VID_ATI, init_r500   ;RS740
  1299.         dd (0x796D  shl 16)+VID_ATI, init_r500   ;RS740M
  1300.         dd (0x796E  shl 16)+VID_ATI, init_r500   ;ATI Radeon 2100 RS740
  1301.         dd (0x796F  shl 16)+VID_ATI, init_r500   ;RS740M
  1302.         dd (0x9400  shl 16)+VID_ATI, init_r500   ;Radeon HD 2900 XT
  1303.         dd (0x9401  shl 16)+VID_ATI, init_r500   ;Radeon HD 2900 XT
  1304.         dd (0x9402  shl 16)+VID_ATI, init_r500   ;Radeon HD 2900 XT
  1305.         dd (0x9403  shl 16)+VID_ATI, init_r500   ;Radeon HD 2900 Pro
  1306.         dd (0x9405  shl 16)+VID_ATI, init_r500   ;Radeon HD 2900 GT
  1307.         dd (0x940A  shl 16)+VID_ATI, init_r500   ;FireGL V8650
  1308.         dd (0x940B  shl 16)+VID_ATI, init_r500   ;FireGL V8600
  1309.         dd (0x940F  shl 16)+VID_ATI, init_r500   ;FireGL V7600
  1310.         dd (0x94C0  shl 16)+VID_ATI, init_r500   ;RV610
  1311.         dd (0x94C1  shl 16)+VID_ATI, init_r500   ;Radeon HD 2400 XT
  1312.         dd (0x94C3  shl 16)+VID_ATI, init_r500   ;Radeon HD 2400 Pro
  1313.         dd (0x94C4  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2400 PRO AGP
  1314.         dd (0x94C5  shl 16)+VID_ATI, init_r500   ;FireGL V4000
  1315.         dd (0x94C6  shl 16)+VID_ATI, init_r500   ;RV610
  1316.         dd (0x94C7  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2350
  1317.         dd (0x94C8  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2400 XT
  1318.         dd (0x94C9  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2400
  1319.         dd (0x94CB  shl 16)+VID_ATI, init_r500   ;ATI RADEON E2400
  1320.         dd (0x94CC  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2400
  1321.         dd (0x9500  shl 16)+VID_ATI, init_r500   ;RV670
  1322.         dd (0x9501  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD3870
  1323.         dd (0x9504  shl 16)+VID_ATI, init_r500   ;ATI Mobility Radeon HD 3850
  1324.         dd (0x9505  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD3850
  1325.         dd (0x9506  shl 16)+VID_ATI, init_r500   ;ATI Mobility Radeon HD 3850 X2
  1326.         dd (0x9507  shl 16)+VID_ATI, init_r500   ;RV670
  1327.         dd (0x9508  shl 16)+VID_ATI, init_r500   ;ATI Mobility Radeon HD 3870
  1328.         dd (0x9509  shl 16)+VID_ATI, init_r500   ;ATI Mobility Radeon HD 3870 X2
  1329.         dd (0x950F  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD3870 X2
  1330.         dd (0x9511  shl 16)+VID_ATI, init_r500   ;ATI FireGL V7700
  1331.         dd (0x9515  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3850 AGP
  1332.         dd (0x9517  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3960
  1333.         dd (0x9519  shl 16)+VID_ATI, init_r500   ;FireStream 9170
  1334.         dd (0x9580  shl 16)+VID_ATI, init_r500   ;RV630
  1335.         dd (0x9581  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2600
  1336.         dd (0x9583  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2600 XT
  1337.         dd (0x9586  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2600 XT AGP
  1338.         dd (0x9587  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2600 Pro AGP
  1339.         dd (0x9588  shl 16)+VID_ATI, init_r500   ;Radeon HD 2600 XT
  1340.         dd (0x9589  shl 16)+VID_ATI, init_r500   ;Radeon HD 2600 Pro
  1341.         dd (0x958A  shl 16)+VID_ATI, init_r500   ;Gemini RV630
  1342.         dd (0x958B  shl 16)+VID_ATI, init_r500   ;Gemini ATI Mobility Radeon HD 2600 XT
  1343.         dd (0x958C  shl 16)+VID_ATI, init_r500   ;FireGL V5600
  1344.         dd (0x958D  shl 16)+VID_ATI, init_r500   ;FireGL V3600
  1345.         dd (0x958E  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2600 LE
  1346.         dd (0x958F  shl 16)+VID_ATI, init_r500   ;ATI Mobility FireGL Graphics Processor
  1347.         dd (0x9590  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3600 Series
  1348.         dd (0x9591  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 3650
  1349.         dd (0x9593  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 3670
  1350.         dd (0x9595  shl 16)+VID_ATI, init_r500   ;Mobility FireGL V5700
  1351.         dd (0x9596  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3650 AGP
  1352.         dd (0x9597  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3600 Series
  1353.         dd (0x9598  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3670
  1354.         dd (0x9599  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3600 Series
  1355.         dd (0x959B  shl 16)+VID_ATI, init_r500   ;Mobility FireGL Graphics Processor
  1356.         dd (0x95C0  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3470
  1357.         dd (0x95C2  shl 16)+VID_ATI, init_r500   ;ATI Mobility Radeon HD 3430 (M82)
  1358.         dd (0x95C4  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 3400 Series (M82)
  1359.         dd (0x95C5  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3450
  1360.         dd (0x95C7  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3430
  1361.         dd (0x95CC  shl 16)+VID_ATI, init_r500   ;Fire PRO Professional Graphics ASIC
  1362.         dd (0x95CD  shl 16)+VID_ATI, init_r500   ;ATI FireMV 2450
  1363.         dd (0x95CE  shl 16)+VID_ATI, init_r500   ;ATI FireMV 2260
  1364.         dd (0x95CF  shl 16)+VID_ATI, init_r500   ;ATI FireMV 2260
  1365.         dd (0x9610  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3200 Graphics
  1366.         dd (0x9611  shl 16)+VID_ATI, init_r500   ;ATI Radeon 3100 Graphics
  1367.         dd (0x9612  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3200 Graphics
  1368.         dd (0x9613  shl 16)+VID_ATI, init_r500   ;ATI Radeon 3100 Graphics
  1369.         dd (0x9614  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3300 Graphics
  1370.         dd (0x9440  shl 16)+VID_ATI, init_r500   ;ATI Radeon 4800 Series
  1371.         dd (0x9441  shl 16)+VID_ATI, init_r500   ;ATI Radeon 4870 X2
  1372.         dd (0x9442  shl 16)+VID_ATI, init_r500   ;ATI Radeon 4800 Series
  1373.         dd (0x9444  shl 16)+VID_ATI, init_r500   ;Everest ATI FirePro Graphics Accelerator
  1374.         dd (0x9446  shl 16)+VID_ATI, init_r500   ;K2 ATI FirePro Graphics Accelerator
  1375.         dd (0x944E  shl 16)+VID_ATI, init_r500   ;RV770
  1376.         dd (0x9456  shl 16)+VID_ATI, init_r500   ;Denali ATI FirePro Graphics
  1377.  
  1378.         dd 0    ;terminator
  1379.  
  1380. version      dd (5 shl 16) or (API_VERSION and 0xFFFF)
  1381.  
  1382. if R500_HW2D
  1383.  
  1384. align 16
  1385. R5xxRops  dd R5XX_ROP3_ZERO, R5XX_ROP3_ZERO  ;GXclear
  1386.           dd R5XX_ROP3_DSa,  R5XX_ROP3_DPa   ;Gxand
  1387.           dd R5XX_ROP3_SDna, R5XX_ROP3_PDna  ;GXandReverse
  1388.           dd R5XX_ROP3_S,    R5XX_ROP3_P     ;GXcopy
  1389.           dd R5XX_ROP3_DSna, R5XX_ROP3_DPna  ;GXandInverted
  1390.           dd R5XX_ROP3_D,    R5XX_ROP3_D     ;GXnoop
  1391.           dd R5XX_ROP3_DSx,  R5XX_ROP3_DPx   ;GXxor
  1392.           dd R5XX_ROP3_DSo,  R5XX_ROP3_DPo   ;GXor
  1393.           dd R5XX_ROP3_DSon, R5XX_ROP3_DPon  ;GXnor
  1394.           dd R5XX_ROP3_DSxn, R5XX_ROP3_PDxn  ;GXequiv
  1395.           dd R5XX_ROP3_Dn,   R5XX_ROP3_Dn    ;GXinvert
  1396.           dd R5XX_ROP3_SDno, R5XX_ROP3_PDno  ;GXorReverse
  1397.           dd R5XX_ROP3_Sn,   R5XX_ROP3_Pn    ;GXcopyInverted
  1398.           dd R5XX_ROP3_DSno, R5XX_ROP3_DPno  ;GXorInverted
  1399.           dd R5XX_ROP3_DSan, R5XX_ROP3_DPan  ;GXnand
  1400.           dd R5XX_ROP3_ONE,  R5XX_ROP3_ONE   ;GXset
  1401. end if
  1402.  
  1403.  
  1404. sz_ati_srv   db 'HWCURSOR',0
  1405.  
  1406. msgInit      db 'detect hardware...',13,10,0
  1407. msgPCI       db 'PCI accsess not supported',13,10,0
  1408. msgFail      db 'device not found',13,10,0
  1409. msg_neg      db 'neg ecx',13,10,0
  1410.  
  1411. if R500_HW2D
  1412.  
  1413. sz_HDraw_srv db 'HDRAW',0
  1414.  
  1415. msgR5xx2DFlushtimeout \
  1416.              db 'R5xx2DFlush timeout error',13,10,0
  1417. msgR5xxFIFOWaitLocaltimeout \
  1418.              db 'R5xxFIFOWaitLocal timeout error', 13, 10,0
  1419. msgR5xx2DIdleLocaltimeout \
  1420.              db 'R5xx2DIdleLocal timeout error', 13,10,0
  1421.  
  1422. align 4
  1423. R520_cp_microcode:
  1424. dd     0x4200e000, 0000000000
  1425. dd     0x4000e000, 0000000000
  1426. dd     0x00000099, 0x00000008
  1427. dd     0x0000009d, 0x00000008
  1428. dd     0x4a554b4a, 0000000000
  1429. dd     0x4a4a4467, 0000000000
  1430. dd     0x55526f75, 0000000000
  1431. dd     0x4a7e7d65, 0000000000
  1432. dd     0xe0dae6f6, 0000000000
  1433. dd     0x4ac54a4a, 0000000000
  1434. dd     0xc8828282, 0000000000
  1435. dd     0xbf4acfc1, 0000000000
  1436. dd     0x87b04ad5, 0000000000
  1437. dd     0xb5838383, 0000000000
  1438. dd     0x4a0f85ba, 0000000000
  1439. dd     0x000ca000, 0x00000004
  1440. dd     0x000d0012, 0x00000038
  1441. dd     0x0000e8b4, 0x00000004
  1442. dd     0x000d0014, 0x00000038
  1443. dd     0x0000e8b6, 0x00000004
  1444. dd     0x000d0016, 0x00000038
  1445. dd     0x0000e854, 0x00000004
  1446. dd     0x000d0018, 0x00000038
  1447. dd     0x0000e855, 0x00000004
  1448. dd     0x000d001a, 0x00000038
  1449. dd     0x0000e856, 0x00000004
  1450. dd     0x000d001c, 0x00000038
  1451. dd     0x0000e857, 0x00000004
  1452. dd     0x000d001e, 0x00000038
  1453. dd     0x0000e824, 0x00000004
  1454. dd     0x000d0020, 0x00000038
  1455. dd     0x0000e825, 0x00000004
  1456. dd     0x000d0022, 0x00000038
  1457. dd     0x0000e830, 0x00000004
  1458. dd     0x000d0024, 0x00000038
  1459. dd     0x0000f0c0, 0x00000004
  1460. dd     0x000d0026, 0x00000038
  1461. dd     0x0000f0c1, 0x00000004
  1462. dd     0x000d0028, 0x00000038
  1463. dd     0x0000e000, 0x00000004
  1464. dd     0x000d002a, 0x00000038
  1465. dd     0x0000e000, 0x00000004
  1466. dd     0x000d002c, 0x00000038
  1467. dd     0x0000e000, 0x00000004
  1468. dd     0x000d002e, 0x00000038
  1469. dd     0x0000e000, 0x00000004
  1470. dd     0x000d0030, 0x00000038
  1471. dd     0x0000e000, 0x00000004
  1472. dd     0x000d0032, 0x00000038
  1473. dd     0x0000f180, 0x00000004
  1474. dd     0x000d0034, 0x00000038
  1475. dd     0x0000f393, 0x00000004
  1476. dd     0x000d0036, 0x00000038
  1477. dd     0x0000f38a, 0x00000004
  1478. dd     0x000d0038, 0x00000038
  1479. dd     0x0000f38e, 0x00000004
  1480. dd     0x0000e821, 0x00000004
  1481. dd     0x0140a000, 0x00000004
  1482. dd     0x00000043, 0x00000018
  1483. dd     0x00cce800, 0x00000004
  1484. dd     0x001b0001, 0x00000004
  1485. dd     0x08004800, 0x00000004
  1486. dd     0x001b0001, 0x00000004
  1487. dd     0x08004800, 0x00000004
  1488. dd     0x001b0001, 0x00000004
  1489. dd     0x08004800, 0x00000004
  1490. dd     0x0000003a, 0x00000008
  1491. dd     0x0000a000, 0000000000
  1492. dd     0x2000451d, 0x00000004
  1493. dd     0x0000e580, 0x00000004
  1494. dd     0x000ce581, 0x00000004
  1495. dd     0x08004580, 0x00000004
  1496. dd     0x000ce581, 0x00000004
  1497. dd     0x00000047, 0x00000008
  1498. dd     0x0000a000, 0000000000
  1499. dd     0x000c2000, 0x00000004
  1500. dd     0x0000e50e, 0x00000004
  1501. dd     0x00032000, 0x00000004
  1502. dd     0x00022051, 0x00000028
  1503. dd     0x00000051, 0x00000024
  1504. dd     0x0800450f, 0x00000004
  1505. dd     0x0000a04b, 0x00000008
  1506. dd     0x0000e565, 0x00000004
  1507. dd     0x0000e566, 0x00000004
  1508. dd     0x00000052, 0x00000008
  1509. dd     0x03cca5b4, 0x00000004
  1510. dd     0x05432000, 0x00000004
  1511. dd     0x00022000, 0x00000004
  1512. dd     0x4ccce05e, 0x00000030
  1513. dd     0x08274565, 0x00000004
  1514. dd     0x0000005e, 0x00000030
  1515. dd     0x08004564, 0x00000004
  1516. dd     0x0000e566, 0x00000004
  1517. dd     0x00000055, 0x00000008
  1518. dd     0x00802061, 0x00000010
  1519. dd     0x00202000, 0x00000004
  1520. dd     0x001b00ff, 0x00000004
  1521. dd     0x01000064, 0x00000010
  1522. dd     0x001f2000, 0x00000004
  1523. dd     0x001c00ff, 0x00000004
  1524. dd     0000000000, 0x0000000c
  1525. dd     0x00000072, 0x00000030
  1526. dd     0x00000055, 0x00000008
  1527. dd     0x0000e576, 0x00000004
  1528. dd     0x0000e577, 0x00000004
  1529. dd     0x0000e50e, 0x00000004
  1530. dd     0x0000e50f, 0x00000004
  1531. dd     0x0140a000, 0x00000004
  1532. dd     0x00000069, 0x00000018
  1533. dd     0x00c0e5f9, 0x000000c2
  1534. dd     0x00000069, 0x00000008
  1535. dd     0x0014e50e, 0x00000004
  1536. dd     0x0040e50f, 0x00000004
  1537. dd     0x00c0006c, 0x00000008
  1538. dd     0x0000e570, 0x00000004
  1539. dd     0x0000e571, 0x00000004
  1540. dd     0x0000e572, 0x0000000c
  1541. dd     0x0000a000, 0x00000004
  1542. dd     0x0140a000, 0x00000004
  1543. dd     0x0000e568, 0x00000004
  1544. dd     0x000c2000, 0x00000004
  1545. dd     0x00000076, 0x00000018
  1546. dd     0x000b0000, 0x00000004
  1547. dd     0x18c0e562, 0x00000004
  1548. dd     0x00000078, 0x00000008
  1549. dd     0x00c00077, 0x00000008
  1550. dd     0x000700c7, 0x00000004
  1551. dd     0x00000080, 0x00000038
  1552. dd     0x0000e5bb, 0x00000004
  1553. dd     0x0000e5bc, 0000000000
  1554. dd     0x0000a000, 0x00000004
  1555. dd     0x0000e821, 0x00000004
  1556. dd     0x0000e800, 0000000000
  1557. dd     0x0000e821, 0x00000004
  1558. dd     0x0000e82e, 0000000000
  1559. dd     0x02cca000, 0x00000004
  1560. dd     0x00140000, 0x00000004
  1561. dd     0x000ce1cc, 0x00000004
  1562. dd     0x050de1cd, 0x00000004
  1563. dd     0x00400000, 0x00000004
  1564. dd     0x0000008f, 0x00000018
  1565. dd     0x00c0a000, 0x00000004
  1566. dd     0x0000008c, 0x00000008
  1567. dd     0x00000091, 0x00000020
  1568. dd     0x4200e000, 0000000000
  1569. dd     0x00000098, 0x00000038
  1570. dd     0x000ca000, 0x00000004
  1571. dd     0x00140000, 0x00000004
  1572. dd     0x000c2000, 0x00000004
  1573. dd     0x00160000, 0x00000004
  1574. dd     0x700ce000, 0x00000004
  1575. dd     0x00140094, 0x00000008
  1576. dd     0x4000e000, 0000000000
  1577. dd     0x02400000, 0x00000004
  1578. dd     0x400ee000, 0x00000004
  1579. dd     0x02400000, 0x00000004
  1580. dd     0x4000e000, 0000000000
  1581. dd     0x000c2000, 0x00000004
  1582. dd     0x0240e51b, 0x00000004
  1583. dd     0x0080e50a, 0x00000005
  1584. dd     0x0080e50b, 0x00000005
  1585. dd     0x00220000, 0x00000004
  1586. dd     0x000700c7, 0x00000004
  1587. dd     0x000000a4, 0x00000038
  1588. dd     0x0080e5bd, 0x00000005
  1589. dd     0x0000e5bb, 0x00000005
  1590. dd     0x0080e5bc, 0x00000005
  1591. dd     0x00210000, 0x00000004
  1592. dd     0x02800000, 0x00000004
  1593. dd     0x00c000ab, 0x00000018
  1594. dd     0x4180e000, 0x00000040
  1595. dd     0x000000ad, 0x00000024
  1596. dd     0x01000000, 0x0000000c
  1597. dd     0x0100e51d, 0x0000000c
  1598. dd     0x000045bb, 0x00000004
  1599. dd     0x000080a7, 0x00000008
  1600. dd     0x0000f3ce, 0x00000004
  1601. dd     0x0140a000, 0x00000004
  1602. dd     0x00cc2000, 0x00000004
  1603. dd     0x08c053cf, 0x00000040
  1604. dd     0x00008000, 0000000000
  1605. dd     0x0000f3d2, 0x00000004
  1606. dd     0x0140a000, 0x00000004
  1607. dd     0x00cc2000, 0x00000004
  1608. dd     0x08c053d3, 0x00000040
  1609. dd     0x00008000, 0000000000
  1610. dd     0x0000f39d, 0x00000004
  1611. dd     0x0140a000, 0x00000004
  1612. dd     0x00cc2000, 0x00000004
  1613. dd     0x08c0539e, 0x00000040
  1614. dd     0x00008000, 0000000000
  1615. dd     0x03c00830, 0x00000004
  1616. dd     0x4200e000, 0000000000
  1617. dd     0x0000a000, 0x00000004
  1618. dd     0x200045e0, 0x00000004
  1619. dd     0x0000e5e1, 0000000000
  1620. dd     0x00000001, 0000000000
  1621. dd     0x000700c4, 0x00000004
  1622. dd     0x0800e394, 0000000000
  1623. dd     0000000000, 0000000000
  1624. dd     0x0000e8c4, 0x00000004
  1625. dd     0x0000e8c5, 0x00000004
  1626. dd     0x0000e8c6, 0x00000004
  1627. dd     0x0000e928, 0x00000004
  1628. dd     0x0000e929, 0x00000004
  1629. dd     0x0000e92a, 0x00000004
  1630. dd     0x000000c8, 0x00000008
  1631. dd     0x0000e928, 0x00000004
  1632. dd     0x0000e929, 0x00000004
  1633. dd     0x0000e92a, 0x00000004
  1634. dd     0x000000cf, 0x00000008
  1635. dd     0xdeadbeef, 0000000000
  1636. dd     0x00000116, 0000000000
  1637. dd     0x000700d3, 0x00000004
  1638. dd     0x080050e7, 0x00000004
  1639. dd     0x000700d4, 0x00000004
  1640. dd     0x0800401c, 0x00000004
  1641. dd     0x0000e01d, 0000000000
  1642. dd     0x02c02000, 0x00000004
  1643. dd     0x00060000, 0x00000004
  1644. dd     0x000000de, 0x00000034
  1645. dd     0x000000db, 0x00000008
  1646. dd     0x00008000, 0x00000004
  1647. dd     0xc000e000, 0000000000
  1648. dd     0x0000e1cc, 0x00000004
  1649. dd     0x0500e1cd, 0x00000004
  1650. dd     0x000ca000, 0x00000004
  1651. dd     0x000000e5, 0x00000034
  1652. dd     0x000000e1, 0x00000008
  1653. dd     0x0000a000, 0000000000
  1654. dd     0x0019e1cc, 0x00000004
  1655. dd     0x001b0001, 0x00000004
  1656. dd     0x0500a000, 0x00000004
  1657. dd     0x080041cd, 0x00000004
  1658. dd     0x000ca000, 0x00000004
  1659. dd     0x000000fb, 0x00000034
  1660. dd     0x0000004a, 0x00000008
  1661. dd     0000000000, 0000000000
  1662. dd     0000000000, 0000000000
  1663. dd     0000000000, 0000000000
  1664. dd     0000000000, 0000000000
  1665. dd     0000000000, 0000000000
  1666. dd     0000000000, 0000000000
  1667. dd     0000000000, 0000000000
  1668. dd     0000000000, 0000000000
  1669. dd     0000000000, 0000000000
  1670. dd     0x000c2000, 0x00000004
  1671. dd     0x001d0018, 0x00000004
  1672. dd     0x001a0001, 0x00000004
  1673. dd     0x000000fb, 0x00000034
  1674. dd     0x0000004a, 0x00000008
  1675. dd     0x0500a04a, 0x00000008
  1676. dd     0000000000, 0000000000
  1677. dd     0000000000, 0000000000
  1678. dd     0000000000, 0000000000
  1679. dd     0000000000, 0000000000
  1680.  
  1681.  
  1682. end if
  1683.  
  1684. if 0
  1685. msg6100      db '6100:  ',0
  1686. msg6104      db '6104:  ',0
  1687. msg6108      db '6108:  ',0
  1688. msg6110      db '6110:  ',0
  1689. msg6120      db '6120:  ',0
  1690. msg6124      db '6124:  ',0
  1691. msg6128      db '6128:  ',0
  1692. msg612C      db '612C:  ',0
  1693. msg6130      db '6130:  ',0
  1694. msg6134      db '6134:  ',0
  1695. msg6138      db '6138:  ',0
  1696. end if
  1697.  
  1698. buff         db 8 dup(0)
  1699.              db 13,10, 0
  1700.  
  1701. section '.data' data readable writable align 16
  1702.  
  1703. pCursor  db 4096 dup(?)
  1704.  
  1705. cursor_map     rd 2
  1706. cursor_start   rd 1
  1707. cursor_end     rd 1
  1708.  
  1709. fnSelect       rd 1
  1710. fnSet          rd 1
  1711. oldSelect      rd 1
  1712. oldSet         rd 1
  1713. oldRestore     rd 1
  1714. oldCreate      rd 1
  1715.  
  1716. r500_LFB       rd 1
  1717.  
  1718. bus            dd ?
  1719. devfn          dd ?
  1720. ati_io         dd ?
  1721.  
  1722. if R500_HW2D
  1723.  
  1724. __xmin         rd 1
  1725. __xmax         rd 1
  1726. __ymin         rd 1
  1727. __ymax         rd 1
  1728.  
  1729. rhd            RHD
  1730.  
  1731. end if
  1732.