Subversion Repositories Kolibri OS

Rev

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