;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                              ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License    ;;
;;                                                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

format MS COFF

DEBUG           equ 1

include 'proc32.inc'
include 'imports.inc'

R500_HW2D       equ 0

API_VERSION     equ 0x01000100

STRIDE          equ 8

VID_ATI         equ 0x1002

LOAD_FROM_FILE  equ 0
LOAD_FROM_MEM   equ 1
LOAD_INDIRECT   equ 2
LOAD_SYSTEM     equ 3

SRV_GETVERSION  equ 0

struc BITMAPINFOHEADER {
  .biSize          dd ? ; DWORD
  .biWidth         dd ? ; LONG
  .biHeight        dd ? ; LONG
  .biPlanes        dw ? ; WORD
  .biBitCount      dw ? ; WORD
  .biCompression   dd ? ; DWORD
  .biSizeImage     dd ? ; DWORD
  .biXPelsPerMeter dd ? ; LONG
  .biYPelsPerMeter dd ? ; LONG
  .biClrUsed       dd ? ; DWORD
  .biClrImportant  dd ? ; DWORD
}

virtual at 0
  BI BITMAPINFOHEADER
end virtual

struc CURSOR
{;common object header
   .magic       dd ?   ;'CURS'
   .destroy     dd ?   ;internal destructor
   .fd          dd ?   ;next object in list
   .bk          dd ?   ;prev object in list
   .pid         dd ?   ;owner id

 ;cursor data
   .base        dd ?   ;allocated memory
   .hot_x       dd ?   ;hotspot coords
   .hot_y       dd ?
}
virtual at 0
  CURSOR CURSOR
end virtual

CURSOR_SIZE      equ 32

OS_BASE          equ 0x80000000
SLOT_BASE        equ (OS_BASE+0x0080000)
LFB_BASE         equ 0xFE000000

PG_SW            equ 0x003
PG_NOCACHE       equ 0x018

PCI_MEMORY_MASK  equ 0xfffffff0

struc IOCTL
{  .handle           dd ?
   .io_code          dd ?
   .input            dd ?
   .inp_size         dd ?
   .output           dd ?
   .out_size         dd ?
}

virtual at 0
  IOCTL IOCTL
end virtual

;MMIO                   equ 0F9000000h
RD_RB3D_CNTL               equ 1c3ch

RD_MEM_CNTL                equ 0140h
RD_CRTC_GEN_CNTL           equ 0050h
RD_CRTC_CUR_EN             equ 10000h
RD_DISPLAY_BASE_ADDR       equ 023ch
RD_DEFAULT_OFFSET          equ 16e0h

CUR_HORZ_VERT_OFF          equ 0268h
CUR_HORZ_VERT_POSN         equ 0264h
CUR_OFFSET                 equ 0260h


RD_RB3D_CNTL               equ 1c3ch
RD_RBBM_STATUS             equ 0e40h
RD_RBBM_FIFOCNT_MASK       equ 007fh
RD_RBBM_ACTIVE             equ 80000000h
RD_TIMEOUT                 equ 2000000

RD_DP_GUI_MASTER_CNTL      equ 0146ch
RD_DP_BRUSH_BKGD_CLR       equ 01478h
RD_DP_BRUSH_FRGD_CLR       equ 0147ch
RD_DP_SRC_BKGD_CLR         equ 015dch
RD_DP_SRC_FRGD_CLR         equ 015d8h
RD_DP_CNTL                 equ 016c0h
RD_DP_DATATYPE             equ 016c4h
RD_DP_WRITE_MASK           equ 016cch
RD_DP_SRC_SOURCE_MEMORY    equ (2 shl 24)
RD_DP_SRC_SOURCE_HOST_DATA equ (3 shl 24)
RD_DEFAULT_SC_BOTTOM_RIGHT equ 16e8h
RD_GMC_BRUSH_SOLID_COLOR   equ (13 shl 4)
RD_DEFAULT_SC_RIGHT_MAX    equ 1fffh
RD_DEFAULT_SC_BOTTOM_MAX   equ 1fff0000h
RD_GMC_DST_DATATYPE_SHIFT  equ 8

RD_ROP3_S                  equ 00cc0000h
RD_ROP3_P                  equ 00f00000h

RD_RB2D_DSTCACHE_MODE      equ 03428h
RD_RB2D_DSTCACHE_CTLSTAT   equ 0342ch
RD_RB2D_DC_FLUSH_ALL       equ 000fh
RD_RB2D_DC_BUSY            equ 80000000h

RD_GMC_BRUSH_SOLID_COLOR   equ 000000D0h
RD_GMC_SRC_DATATYPE_COLOR  equ (3 shl 12)
RD_GMC_CLR_CMP_CNTL_DIS    equ (1 shl 28)
RD_GMC_WR_MSK_DIS          equ (1 shl 30)

cmdSolidFill               equ 73f036d0h

RD_DST_PITCH_OFFSET        equ 142ch
RD_SRC_PITCH_OFFSET        equ 1428h

RD_DST_X_LEFT_TO_RIGHT     equ 1
RD_DST_Y_TOP_TO_BOTTOM     equ 2
RD_DST_Y_X                 equ 1438h
RD_DST_WIDTH_HEIGHT        equ 1598h
RD_DST_LINE_START          equ 1600h
RD_DST_LINE_END            equ 1604h
R300_MEM_NUM_CHANNELS_MASK equ 0003h

macro rdr op1, op2
{
     mov edi, [ati_io]
     mov op1, [edi+op2]
}

macro BEGIN_RING
{
      mov edi, [rhd.ring_base]
      mov edx, [rhd.ring_wp]
}

macro COMMIT_RING
{
        and edx, 0x1FFF
        mov [rhd.ring_wp], edx

        lock add [esp], dword 0            ; Flush writes to ring

        wrr RADEON_CP_RB_WPTR, edx
        rdr eax, RADEON_CP_RB_RPTR
}

macro OUT_PACKET0 reg, count
{
     mov eax, (RADEON_CP_PACKET0 + (count shl 16) + (reg shr 2))
     mov [edi+edx*4], eax
     inc edx
}

macro OUT_PACKET3 pkt, count
{
     mov eax, (RADEON_CP_PACKET3 or pkt or (count shl 16))
     mov [edi+edx*4], eax
     inc edx
}

macro OUT_RING  val
{
     mov eax, val
     mov [edi+edx*4], eax
     inc edx
}

macro RADEON_WAIT_UNTIL_IDLE
{
     OUT_PACKET0 RADEON_WAIT_UNTIL, 0
     OUT_RING RADEON_WAIT_2D_IDLECLEAN + \
              RADEON_WAIT_3D_IDLECLEAN + \
              RADEON_WAIT_HOST_IDLECLEAN
}

macro RADEON_PURGE_CACHE
{
     OUT_PACKET0 R5XX_RB3D_DSTCACHE_CTLSTAT, 0
     OUT_RING  R5XX_RB3D_DC_FLUSH_ALL
}

macro RADEON_PURGE_ZCACHE
{
     OUT_PACKET0 RADEON_RB3D_ZCACHE_CTLSTAT, 0
     OUT_RING RADEON_RB3D_ZC_FLUSH_ALL
}

macro wrr dest, src
{
     mov edi, [ati_io]
     mov dword [edi+dest], src
}

macro rmask dest, val, mask
{
     mov edi, [ati_io]
     mov eax, [edi+dest]
     and eax, not mask
     or eax, (val and mask)
     mov [edi+dest], eax
}

public START
public service_proc
public version

CURSOR_IMAGE_OFFSET  equ 0x00500000

DRV_ENTRY equ 1
DRV_EXIT  equ -1

section '.flat' code readable align 16

proc START stdcall, state:dword

           cmp [state], 1
           jne .restore

     if DEBUG
           mov esi, msgInit
           call SysMsgBoardStr
     end if

           call detect_ati
           test eax, eax
           jz .fail

           mov ebx, [SelectHwCursor]
           mov ecx, [SetHwCursor]
           mov edx, [HwCursorRestore]
           mov esi, [HwCursorCreate]

           mov [oldSelect], ebx
           mov [oldSet], ecx
           mov [oldRestore], edx
           mov [oldCreate], esi

           call eax

           or eax, -1
           mov [cursor_map], eax
           mov [cursor_map+4], eax
           mov edx, cursor_map
           mov [cursor_start], edx
           add edx, 8
           mov [cursor_end], edx

           stdcall RegService, sz_ati_srv, service_proc
           test eax, eax
           jz .restore

if R500_HW2D
           stdcall RegService, sz_HDraw_srv, r500_HDraw

           mov ebx, START
           and ebx, -4096
           mov [eax+0x20], ebx
           mov [eax+0x24], dword 0                       ;hack
end if
           mov ebx, [fnSelect]
           mov ecx, [fnSet]

           mov [SelectHwCursor], ebx
           mov [SetHwCursor], ecx
           mov dword [HwCursorRestore], drv_restore
           mov dword [HwCursorCreate], ati_cursor

           ret
.restore:
           mov eax, [oldSelect]
           mov ebx, [oldSet]
           mov ecx, [oldRestore]
           mov edx, [oldCreate]

           mov [SelectHwCursor], eax
           mov [SetHwCursor], ebx
           mov [HwCursorRestore], ecx
           mov [HwCursorCreate], edx

           xor eax, eax
           ret

.fail:
     if DEBUG
           mov esi, msgFail
           call SysMsgBoardStr
     end if

           xor eax, eax
           ret
endp

handle     equ  IOCTL.handle
io_code    equ  IOCTL.io_code
input      equ  IOCTL.input
inp_size   equ  IOCTL.inp_size
output     equ  IOCTL.output
out_size   equ  IOCTL.out_size

align 4
proc service_proc stdcall, ioctl:dword

           mov ebx, [ioctl]
           cmp [ebx+io_code], SRV_GETVERSION
           jne .fail

           mov eax, [ebx+output]
           cmp [ebx+out_size], 4
           jne .fail
           mov [eax], dword API_VERSION
           xor eax, eax
           ret
.fail:
           or eax, -1
           ret
endp

restore   handle
restore   io_code
restore   input
restore   inp_size
restore   output
restore   out_size

align 4
proc detect_ati
           locals
             last_bus dd ?
           endl

           xor eax, eax
           mov [bus], eax
           inc eax
           call PciApi
           cmp eax, -1
           je .err

           mov [last_bus], eax

.next_bus:
           and [devfn], 0
.next_dev:
           stdcall PciRead32, [bus], [devfn], dword 0
           test eax, eax
           jz .next
           cmp eax, -1
           je .next

           mov edi, devices
@@:
           mov ebx, [edi]
           test ebx, ebx
           jz .next

           cmp eax, ebx
           je .found
           add edi, STRIDE
           jmp @B
.next:
           inc [devfn]
           cmp [devfn], 256
           jb  .next_dev
           mov eax, [bus]
           inc eax
           mov [bus], eax
           cmp eax, [last_bus]
           jna .next_bus
           xor eax, eax
           ret
.found:
           mov eax, [edi+4]
           ret
.err:
           xor eax, eax
           ret
endp

align 4
proc init_r200
           stdcall PciRead32, [bus], [devfn], dword 0x18
           and eax, PCI_MEMORY_MASK
           stdcall MapIoMem,eax,0x10000,(PG_SW+PG_NOCACHE)
           test eax, eax
           jz .fail

           mov [ati_io], eax
           mov edi, eax

           mov dword [edi+RD_RB3D_CNTL], 0
           call engRestore

           mov edi, [ati_io]
           mov eax, [edi+0x50]
           mov ebx,3
           shl ebx,20
           not ebx
           and eax,ebx
           mov ebx, 2
           shl ebx,20
           or eax, ebx
           mov [edi+0x50], eax

           call r200_ShowCursor

           mov [fnSelect], r200_SelectCursor
           mov [fnSet], r200_SetCursor

           xor eax, eax
           inc eax
.fail:
           ret
endp

if R500_HW2D
  include 'r500hw.inc'
end if

align 4
proc init_r500

           stdcall PciRead32, [bus], [devfn], dword 0x18
           and eax, PCI_MEMORY_MASK
           stdcall MapIoMem,eax,0x10000,(PG_SW+PG_NOCACHE)
           test eax, eax
           jz .fail

           mov [ati_io], eax

           mov [fnSelect], r500_SelectCursor
           mov [fnSet], r500_SetCursor

           rdr eax, 0x6110
           mov [r500_LFB], eax

if R500_HW2D
           call R5xx2DInit
end if
           wrr 0x6410, 0x001F001F
           wrr 0x6400, dword (3 shl 8)

           xor eax, eax
           inc eax
.fail:
           ret
endp


align 4
drv_restore:
           ret 8


align 4
proc r500_SelectCursor stdcall,hcursor:dword

           mov esi, [hcursor]

           mov edx, [esi+CURSOR.base]
           sub edx, LFB_BASE
           add edx, [r500_LFB]
           wrr 0x6408, edx

           mov eax, [esi+CURSOR.hot_x]
           shl eax, 16
           mov ax, word [esi+CURSOR.hot_y]
           wrr 0x6418, eax
           ret
endp

align 4
proc r500_SetCursor stdcall, hcursor:dword, x:dword, y:dword
           pushfd
           cli

           mov esi, [hcursor]
           mov edi, [ati_io]

           mov eax, [x]
           shl eax, 16
           mov ax, word [y]

           mov [edi+0x6414], eax
           or dword [edi+0x6400], 1

           popfd
           ret
endp

align 4
r500_ShowCursor:

           mov edi, [ati_io]
           or dword [edi+0x6400], 1
           ret

align 4
r200_ShowCursor:
           mov edi, [ati_io]

           mov eax, [edi+RD_CRTC_GEN_CNTL]
           bts eax,16
           mov [edi+RD_CRTC_GEN_CNTL], eax
           ret


align 4
proc r200_SelectCursor stdcall,hcursor:dword

           ret
endp

align 4
proc r200_SetCursor stdcall, hcursor:dword, x:dword, y:dword
           pushfd
           cli

           xor eax, eax
           xor edx, edx
           mov esi, [hcursor]
           mov ebx, [x]
           mov ecx, [y]

           sub ebx, [esi+CURSOR.hot_x]
           jnc @F
           neg ebx
           mov eax, ebx
           shl eax, 16
           xor ebx, ebx
@@:
           sub ecx, [esi+CURSOR.hot_y]
           jnc @F
           neg ecx
           mov ax, cx
           mov edx, ecx
           xor ecx, ecx
@@:
           or eax, 0x80000000
           wrr CUR_HORZ_VERT_OFF, eax

           shl ebx, 16
           mov bx, cx
           or ebx, 0x80000000
           wrr CUR_HORZ_VERT_POSN, ebx

           shl edx, 8
           add edx, [esi+CURSOR.base]
           sub edx, LFBAddress
           wrr CUR_OFFSET, edx
           popfd
           ret
endp

align 4
proc video_alloc

           pushfd
           cli
           mov ebx, [cursor_start]
           mov ecx, [cursor_end]
.l1:
           bsf eax,[ebx];
           jnz .found
           add ebx,4
           cmp ebx, ecx
           jb .l1
           popfd
           xor eax,eax
           ret
.found:
           btr [ebx], eax
           popfd

           mov [cursor_start],ebx
           sub ebx, cursor_map
           lea eax,[eax+ebx*8]

           shl eax,14
           add eax, LFBAddress+CURSOR_IMAGE_OFFSET
           ret
endp

align 4
video_free:
           pushfd
           cli
           sub eax, LFBAddress+CURSOR_IMAGE_OFFSET
           shr eax, 14
           mov ebx, cursor_map
           bts [ebx], eax
           shr eax, 3
           and eax, not 3
           add eax, ebx
           cmp [cursor_start], eax
           ja @f
           popfd
           ret
@@:
           mov [cursor_start], eax
           popfd
           ret

; param
;  eax= pid
;  ebx= src
;  ecx= flags

align 4
ati_cursor:
.src     equ esp
.flags   equ esp+4
.hcursor equ esp+8

           sub esp, 4          ;space for .hcursor
           push ecx
           push ebx

           mov ebx, eax
           mov eax, CURSOR_SIZE
           call CreateObject
           test eax, eax
           jz .fail

           mov [.hcursor],eax

           xor ebx, ebx
           mov [eax+CURSOR.magic], 'CURS'
           mov [eax+CURSOR.destroy], destroy_cursor
           mov [eax+CURSOR.hot_x], ebx
           mov [eax+CURSOR.hot_y], ebx

           call video_alloc
           mov edi, [.hcursor]
           mov [edi+CURSOR.base], eax

           mov esi, [.src]
           mov ebx, [.flags]
           cmp bx, LOAD_INDIRECT
           je .indirect

           movzx ecx, word [esi+10]
           movzx edx, word [esi+12]
           mov [edi+CURSOR.hot_x], ecx
           mov [edi+CURSOR.hot_y], edx

           stdcall ati_init_cursor, eax, esi
           mov eax, [.hcursor]
.fail:
           add esp, 12
           ret
.indirect:
           shr ebx, 16
           movzx ecx, bh
           movzx edx, bl
           mov [edi+CURSOR.hot_x], ecx
           mov [edi+CURSOR.hot_y], edx

           mov edi, eax
           mov ebx, eax
           mov ecx, 64*64
           xor eax,eax
           cld
           rep stosd
           mov edi, ebx

           mov esi, [.src]
           mov ebx, 32
           cld
@@:
           mov ecx, 32
           rep movsd
           add edi, 128
           dec ebx
           jnz @B
           mov eax, [.hcursor]
           add esp, 12
           ret

align 4
destroy_cursor:

           push eax
           mov eax, [eax+CURSOR.base]
           call video_free
           pop eax

           call DestroyObject
           ret

align 4
proc ati_init_cursor stdcall, dst:dword, src:dword
           locals
             rBase    dd ?
             pQuad    dd ?
             pBits    dd ?
             pAnd     dd ?
             width    dd ?
             height   dd ?
             counter  dd ?
           endl

           mov esi, [src]
           add esi,[esi+18]
           mov eax,esi

           cmp [esi+BI.biBitCount], 24
           je .img_24
           cmp [esi+BI.biBitCount], 8
           je .img_8
           cmp [esi+BI.biBitCount], 4
           je .img_4

.img_2:
           add eax, [esi]
           mov [pQuad],eax
           add eax,8
           mov [pBits],eax
           add eax, 128
           mov [pAnd],eax
           mov eax,[esi+4]
           mov [width],eax
           mov ebx,[esi+8]
           shr ebx,1
           mov [height],ebx

           mov edi, pCursor
           add edi, 32*31*4
           mov [rBase],edi

           mov esi,[pQuad]
.l21:
           mov ebx, [pBits]
           mov ebx, [ebx]
           bswap ebx
           mov eax, [pAnd]
           mov eax, [eax]
           bswap eax
           mov [counter], 32
@@:
           xor edx, edx
           shl eax,1
           setc dl
           dec edx

           xor ecx, ecx
           shl ebx,1
           setc cl
           mov ecx, [esi+ecx*4]
           and ecx, edx
           and edx, 0xFF000000
           or edx, ecx
           mov [edi], edx

           add edi, 4
           dec [counter]
           jnz @B

           add [pBits], 4
           add [pAnd], 4
           mov edi,[rBase]
           sub edi,128
           mov [rBase],edi
           sub [height],1
           jnz .l21
           jmp .copy
.img_4:
           add eax, [esi]
           mov [pQuad],eax
           add eax,64
           mov [pBits],eax
           add eax, 0x200
           mov [pAnd],eax
           mov eax,[esi+4]
           mov [width],eax
           mov ebx,[esi+8]
           shr ebx,1
           mov [height],ebx

           mov edi, pCursor
           add edi, 32*31*4
           mov [rBase],edi

           mov esi,[pQuad]
           mov ebx, [pBits]
.l4:
           mov eax, [pAnd]
           mov eax, [eax]
           bswap eax
           mov [counter], 16
@@:
           xor edx, edx
           shl eax,1
           setc dl
           dec edx

           movzx ecx, byte [ebx]
           and cl, 0xF0
           shr ecx, 2
           mov ecx, [esi+ecx]
           and ecx, edx
           and edx, 0xFF000000
           or edx, ecx
           mov [edi], edx

           xor edx, edx
           shl eax,1
           setc dl
           dec edx

           movzx ecx, byte [ebx]
           and cl, 0x0F
           mov ecx, [esi+ecx*4]
           and ecx, edx
           and edx, 0xFF000000
           or edx, ecx
           mov [edi+4], edx

           inc ebx
           add edi, 8
           dec [counter]
           jnz @B

           add [pAnd], 4
           mov edi,[rBase]
           sub edi,128
           mov [rBase],edi
           sub [height],1
           jnz .l4
           jmp .copy
.img_8:
           add eax, [esi]
           mov [pQuad],eax
           add eax,1024
           mov [pBits],eax
           add eax, 1024
           mov [pAnd],eax
           mov eax,[esi+4]
           mov [width],eax
           mov ebx,[esi+8]
           shr ebx,1
           mov [height],ebx

           mov edi, pCursor
           add edi, 32*31*4
           mov [rBase],edi

           mov esi,[pQuad]
           mov ebx, [pBits]
.l81:
           mov eax, [pAnd]
           mov eax, [eax]
           bswap eax
           mov [counter], 32
@@:
           xor edx, edx
           shl eax,1
           setc dl
           dec edx

           movzx ecx,  byte [ebx]
           mov ecx, [esi+ecx*4]
           and ecx, edx
           and edx, 0xFF000000
           or edx, ecx
           mov [edi], edx

           inc ebx
           add edi, 4
           dec [counter]
           jnz @B

           add [pAnd], 4
           mov edi,[rBase]
           sub edi,128
           mov [rBase],edi
           sub [height],1
           jnz .l81
           jmp .copy
.img_24:
           add eax, [esi]
           mov [pQuad],eax
           add eax, 0xC00
           mov [pAnd],eax
           mov eax,[esi+BI.biWidth]
           mov [width],eax
           mov ebx,[esi+BI.biHeight]
           shr ebx,1
           mov [height],ebx

           mov edi, pCursor
           add edi, 32*31*4
           mov [rBase],edi

           mov esi,[pAnd]
           mov ebx, [pQuad]
.row_24:
           mov eax, [esi]
           bswap eax
           mov [counter], 32
@@:
           xor edx, edx
           shl eax,1
           setc dl
           dec edx

           mov ecx, [ebx]
           and ecx, 0x00FFFFFF
           and ecx, edx
           and edx, 0xFF000000
           or edx, ecx
           mov [edi], edx
           add ebx, 3
           add edi, 4
           dec [counter]
           jnz @B

           add esi, 4
           mov edi,[rBase]
           sub edi,128
           mov [rBase],edi
           sub [height],1
           jnz .row_24
.copy:
           mov edi, [dst]
           mov ecx, 64*64
           xor eax,eax
           rep stosd

           mov esi, pCursor
           mov edi, [dst]
           mov ebx, 32
           cld
@@:
           mov ecx, 32
           rep movsd
           add edi, 128
           dec ebx
           jnz @B
           ret
endp

align 4
proc engFlush

           mov edi, [ati_io]

           mov eax, [edi+RD_RB2D_DSTCACHE_CTLSTAT]
           or eax,RD_RB2D_DC_FLUSH_ALL
           mov [edi+RD_RB2D_DSTCACHE_CTLSTAT],eax

           mov ecx, RD_TIMEOUT
@@:
           mov eax,[edi+RD_RB2D_DSTCACHE_CTLSTAT]
           and eax, RD_RB2D_DC_BUSY
           jz .exit

           sub ecx,1
           jnz @B
.exit:
           ret
endp


align 4
engWaitForFifo:
cnt equ bp+8
           push ebp
           mov ebp, esp

           mov edi, [ati_io]

           mov ecx, RD_TIMEOUT
@@:
           mov eax, [edi+RD_RBBM_STATUS]
           and eax, RD_RBBM_FIFOCNT_MASK
           cmp eax, [ebp+8]
           jae .exit

           sub ecx,1
           jmp @B

.exit:
           leave
           ret 4

align 4
proc engWaitForIdle

           push dword 64
           call engWaitForFifo

           mov edi, [ati_io]
           mov ecx ,RD_TIMEOUT
@@:
           mov eax, [edi+RD_RBBM_STATUS]
           and eax,RD_RBBM_ACTIVE
           jz .exit

           sub ecx,1
           jnz @B
.exit:
           call engFlush
           ret
endp


align 4
proc engRestore

;             push dword 1
;             call engWaitForFifo

;             mov dword  [MMIO+RD_RB2D_DSTCACHE_MODE], 0

           push dword 3
           call engWaitForFifo

           mov edi, [ati_io]

           mov eax, [edi+RD_DISPLAY_BASE_ADDR]
           shr eax, 10d
           or eax,(64d shl 22d)
           mov [edi+RD_DEFAULT_OFFSET],eax
           mov [edi+RD_SRC_PITCH_OFFSET],eax
           mov [edi+RD_DST_PITCH_OFFSET],eax

           push dword 1
           call engWaitForFifo

           mov edi, [ati_io]
           mov eax, [edi+RD_DP_DATATYPE]
           btr eax, 29d
           mov [edi+RD_DP_DATATYPE],eax

           push dword 1
           call engWaitForFifo

           mov edi, [ati_io]
           mov dword [edi+RD_DEFAULT_SC_BOTTOM_RIGHT],\
                     (RD_DEFAULT_SC_RIGHT_MAX or RD_DEFAULT_SC_BOTTOM_MAX)

           push dword 1
           call engWaitForFifo

           mov edi, [ati_io]
           mov dword [edi+RD_DP_GUI_MASTER_CNTL],\
                     (RD_GMC_BRUSH_SOLID_COLOR or \
                      RD_GMC_SRC_DATATYPE_COLOR or \
                     (6 shl RD_GMC_DST_DATATYPE_SHIFT) or \
                      RD_GMC_CLR_CMP_CNTL_DIS or \
                      RD_ROP3_P or \
                      RD_GMC_WR_MSK_DIS)


           push dword 7
           call engWaitForFifo

           mov edi, [ati_io]

           mov dword [edi+RD_DST_LINE_START],0
           mov dword [edi+RD_DST_LINE_END], 0
           mov dword [edi+RD_DP_BRUSH_FRGD_CLR], 808000ffh
           mov dword [edi+RD_DP_BRUSH_BKGD_CLR], 002020ffh
           mov dword [edi+RD_DP_SRC_FRGD_CLR],   808000ffh
           mov dword [edi+RD_DP_SRC_BKGD_CLR],   004000ffh
           mov dword [edi+RD_DP_WRITE_MASK],0ffffffffh

           call engWaitForIdle

           ret
endp



align 4
dword2str:
      mov  esi, hex_buff
      mov ecx, -8
@@:
      rol eax, 4
      mov ebx, eax
      and ebx, 0x0F
      mov bl, [ebx+hexletters]
      mov [8+esi+ecx], bl
      inc ecx
      jnz @B
      ret

hexletters   db '0123456789ABCDEF'
hex_buff     db 8 dup(0),13,10,0

R200M       equ 0x5a62  ;R300
R7000       equ 0x5159  ;R200
R750M       equ 0x4c57  ;M7 mobile rv200
R8500       equ 0x514C  ;R200
R9000       equ 0x4966  ;RV250
R9200       equ 0x5961  ;RV280
R9200SE     equ 0x5964  ;RV280
R9500       equ 0x4144  ;R300
R9500P      equ 0x4E45  ;R300
R9550       equ 0x4153  ;RV350
R9600       equ 0x4150  ;RV350
R9600XT     equ 0x4152  ;RV360
R9700P      equ 0x4E44  ;R300
R9800       equ 0x4E49  ;R350
R9800P      equ 0x4E48  ;R350
R9800XT     equ 0x4E4A  ;R360


align 4

devices:
        dd (R200M   shl 16)+VID_ATI, init_r200   ;R300
        dd (R7000   shl 16)+VID_ATI, init_r200
        dd (R750M   shl 16)+VID_ATI, init_r200   ;M7
        dd (R8500   shl 16)+VID_ATI, init_r200
        dd (R9000   shl 16)+VID_ATI, init_r200
        dd (0x514D  shl 16)+VID_ATI, init_r200   ;R200     9100

        dd (R9200   shl 16)+VID_ATI, init_r200
        dd (R9200SE shl 16)+VID_ATI, init_r200

        dd (0x5960  shl 16)+VID_ATI, init_r200   ;RV280    9250

        dd (R9500   shl 16)+VID_ATI, init_r200
        dd (R9500P  shl 16)+VID_ATI, init_r200
        dd (R9550   shl 16)+VID_ATI, init_r200

        dd (R9600   shl 16)+VID_ATI, init_r200
        dd (R9600XT shl 16)+VID_ATI, init_r200
        dd (0x4155  shl 16)+VID_ATI, init_r200   ;RV350    9600
        dd (0x4151  shl 16)+VID_ATI, init_r200   ;RV350    9600
        dd (0x4E51  shl 16)+VID_ATI, init_r200   ;RV350    9600

        dd (R9700P  shl 16)+VID_ATI, init_r200

        dd (0x4148  shl 16)+VID_ATI, init_r200   ;R350    9800
        dd (R9800   shl 16)+VID_ATI, init_r200
        dd (R9800P  shl 16)+VID_ATI, init_r200
        dd (R9800XT shl 16)+VID_ATI, init_r200

        dd (0x5B60  shl 16)+VID_ATI, init_r200   ;RV370    X300/X550
        dd (0x5B63  shl 16)+VID_ATI, init_r200   ;RV370    X550
        dd (0x5B62  shl 16)+VID_ATI, init_r200   ;RV380x   X600
        dd (0x3E50  shl 16)+VID_ATI, init_r200   ;RV380    X600/X550

        dd (0x5B4F  shl 16)+VID_ATI, init_r200   ;RV410    X700
        dd (0x5B4D  shl 16)+VID_ATI, init_r200   ;RV410    X700
        dd (0x5B4B  shl 16)+VID_ATI, init_r200   ;RV410    X700
        dd (0x5B4C  shl 16)+VID_ATI, init_r200   ;RV410    X700

        dd (0x4a49  shl 16)+VID_ATI, init_r200   ;R420     X800 PRO/GTO
        dd (0x4a4B  shl 16)+VID_ATI, init_r200   ;R420     X800
        dd (0x5549  shl 16)+VID_ATI, init_r200   ;R423     X800
        dd (0x4a4A  shl 16)+VID_ATI, init_r200   ;R420     X800
        dd (0x554F  shl 16)+VID_ATI, init_r200   ;R430     X800
        dd (0x554D  shl 16)+VID_ATI, init_r200   ;R430     X800
        dd (0x554E  shl 16)+VID_ATI, init_r200   ;R430     X800
        dd (0x5D57  shl 16)+VID_ATI, init_r200   ;R423     X800 XT
        dd (0x4A50  shl 16)+VID_ATI, init_r200   ;R420     X800 XT
        dd (0x554A  shl 16)+VID_ATI, init_r200   ;R423     X800 XT
        dd (0x5D4F  shl 16)+VID_ATI, init_r200   ;R423     X800/X850
        dd (0x554B  shl 16)+VID_ATI, init_r200   ;R423     X800 GT

        dd (0x4B4B  shl 16)+VID_ATI, init_r200   ;R481     X850
        dd (0x4B49  shl 16)+VID_ATI, init_r200   ;R481     X850
        dd (0x4B4C  shl 16)+VID_ATI, init_r200   ;R481     X850

        dd (0x5D4D  shl 16)+VID_ATI, init_r200   ;R480     X850
        dd (0x5D52  shl 16)+VID_ATI, init_r200   ;R480     X850

        dd (0x7100  shl 16)+VID_ATI, init_r500   ;Radeon X1800
        dd (0x7101  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1800 XT
        dd (0x7102  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1800
        dd (0x7103  shl 16)+VID_ATI, init_r500   ;Mobility FireGL V7200
        dd (0x7104  shl 16)+VID_ATI, init_r500   ;FireGL V7200
        dd (0x7105  shl 16)+VID_ATI, init_r500   ;FireGL V5300
        dd (0x7106  shl 16)+VID_ATI, init_r500   ;Mobility FireGL V7100
        dd (0x7108  shl 16)+VID_ATI, init_r500   ;Radeon X1800
        dd (0x7109  shl 16)+VID_ATI, init_r500   ;Radeon X1800
        dd (0x710A  shl 16)+VID_ATI, init_r500   ;Radeon X1800
        dd (0x710B  shl 16)+VID_ATI, init_r500   ;Radeon X1800
        dd (0x710C  shl 16)+VID_ATI, init_r500   ;Radeon X1800
        dd (0x710E  shl 16)+VID_ATI, init_r500   ;FireGL V7300
        dd (0x710F  shl 16)+VID_ATI, init_r500   ;FireGL V7350
        dd (0x7140  shl 16)+VID_ATI, init_r500   ;Radeon X1600/X1550
        dd (0x7141  shl 16)+VID_ATI, init_r500   ;RV505
        dd (0x7142  shl 16)+VID_ATI, init_r500   ;Radeon X1300/X1550
        dd (0x7143  shl 16)+VID_ATI, init_r500   ;Radeon X1550
        dd (0x7144  shl 16)+VID_ATI, init_r500   ;M54-GL
        dd (0x7145  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1400
        dd (0x7146  shl 16)+VID_ATI, init_r500   ;Radeon X1300/X1550
        dd (0x7147  shl 16)+VID_ATI, init_r500   ;Radeon X1550 64-bit
        dd (0x7149  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1300
        dd (0x714A  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1300
        dd (0x714B  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1300
        dd (0x714C  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1300
        dd (0x714D  shl 16)+VID_ATI, init_r500   ;Radeon X1300
        dd (0x714E  shl 16)+VID_ATI, init_r500   ;Radeon X1300
        dd (0x714F  shl 16)+VID_ATI, init_r500   ;RV505
        dd (0x7151  shl 16)+VID_ATI, init_r500   ;RV505
        dd (0x7152  shl 16)+VID_ATI, init_r500   ;FireGL V3300
        dd (0x7153  shl 16)+VID_ATI, init_r500   ;FireGL V3350
        dd (0x715E  shl 16)+VID_ATI, init_r500   ;Radeon X1300
        dd (0x715F  shl 16)+VID_ATI, init_r500   ;Radeon X1550 64-bit
        dd (0x7180  shl 16)+VID_ATI, init_r500   ;Radeon X1300/X1550
        dd (0x7181  shl 16)+VID_ATI, init_r500   ;Radeon X1600
        dd (0x7183  shl 16)+VID_ATI, init_r500   ;Radeon X1300/X1550
        dd (0x7186  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1450
        dd (0x7187  shl 16)+VID_ATI, init_r500   ;Radeon X1300/X1550
        dd (0x7188  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X2300
        dd (0x718A  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X2300
        dd (0x718B  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1350
        dd (0x718C  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1350
        dd (0x718D  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1450
        dd (0x718F  shl 16)+VID_ATI, init_r500   ;Radeon X1300
        dd (0x7193  shl 16)+VID_ATI, init_r500   ;Radeon X1550
        dd (0x7196  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1350
        dd (0x719B  shl 16)+VID_ATI, init_r500   ;FireMV 2250
        dd (0x719F  shl 16)+VID_ATI, init_r500   ;Radeon X1550 64-bit
        dd (0x71C0  shl 16)+VID_ATI, init_r500   ;Radeon X1600
        dd (0x71C1  shl 16)+VID_ATI, init_r500   ;Radeon X1650
        dd (0x71C2  shl 16)+VID_ATI, init_r500   ;Radeon X1600
        dd (0x71C3  shl 16)+VID_ATI, init_r500   ;Radeon X1600
        dd (0x71C4  shl 16)+VID_ATI, init_r500   ;Mobility FireGL V5200
        dd (0x71C5  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1600
        dd (0x71C6  shl 16)+VID_ATI, init_r500   ;Radeon X1650
        dd (0x71C7  shl 16)+VID_ATI, init_r500   ;Radeon X1650
        dd (0x71CD  shl 16)+VID_ATI, init_r500   ;Radeon X1600
        dd (0x71CE  shl 16)+VID_ATI, init_r500   ;Radeon X1300 XT/X1600 Pro
        dd (0x71D2  shl 16)+VID_ATI, init_r500   ;FireGL V3400
        dd (0x71D4  shl 16)+VID_ATI, init_r500   ;Mobility FireGL V5250
        dd (0x71D5  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1700
        dd (0x71D6  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1700 XT
        dd (0x71DA  shl 16)+VID_ATI, init_r500   ;FireGL V5200
        dd (0x71DE  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1700
        dd (0x7200  shl 16)+VID_ATI, init_r500   ;Radeon X2300HD
        dd (0x7210  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2300
        dd (0x7211  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2300
        dd (0x7240  shl 16)+VID_ATI, init_r500   ;Radeon X1950
        dd (0x7243  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x7244  shl 16)+VID_ATI, init_r500   ;Radeon X1950
        dd (0x7245  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x7246  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x7247  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x7248  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x7249  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x724A  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x724B  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x724C  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x724D  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x724E  shl 16)+VID_ATI, init_r500   ;AMD Stream Processor
        dd (0x724F  shl 16)+VID_ATI, init_r500   ;Radeon X1900
        dd (0x7280  shl 16)+VID_ATI, init_r500   ;Radeon X1950
        dd (0x7281  shl 16)+VID_ATI, init_r500   ;RV560
        dd (0x7283  shl 16)+VID_ATI, init_r500   ;RV560
        dd (0x7284  shl 16)+VID_ATI, init_r500   ;Mobility Radeon X1900
        dd (0x7287  shl 16)+VID_ATI, init_r500   ;RV560
        dd (0x7288  shl 16)+VID_ATI, init_r500   ;Radeon X1950 GT
        dd (0x7289  shl 16)+VID_ATI, init_r500   ;RV570
        dd (0x728B  shl 16)+VID_ATI, init_r500   ;RV570
        dd (0x728C  shl 16)+VID_ATI, init_r500   ;ATI FireGL V7400
        dd (0x7290  shl 16)+VID_ATI, init_r500   ;RV560
        dd (0x7291  shl 16)+VID_ATI, init_r500   ;Radeon X1650
        dd (0x7293  shl 16)+VID_ATI, init_r500   ;Radeon X1650
        dd (0x7297  shl 16)+VID_ATI, init_r500   ;RV560
        dd (0x791E  shl 16)+VID_ATI, init_r500   ;Radeon X1200
        dd (0x791F  shl 16)+VID_ATI, init_r500   ;Radeon X1200
        dd (0x793F  shl 16)+VID_ATI, init_r500   ;Radeon Xpress 1200
        dd (0x7941  shl 16)+VID_ATI, init_r500   ;Radeon Xpress 1200
        dd (0x7942  shl 16)+VID_ATI, init_r500   ;Radeon Xpress 1200 (M)
        dd (0x796C  shl 16)+VID_ATI, init_r500   ;RS740
        dd (0x796D  shl 16)+VID_ATI, init_r500   ;RS740M
        dd (0x796E  shl 16)+VID_ATI, init_r500   ;ATI Radeon 2100 RS740
        dd (0x796F  shl 16)+VID_ATI, init_r500   ;RS740M
        dd (0x9400  shl 16)+VID_ATI, init_r500   ;Radeon HD 2900 XT
        dd (0x9401  shl 16)+VID_ATI, init_r500   ;Radeon HD 2900 XT
        dd (0x9402  shl 16)+VID_ATI, init_r500   ;Radeon HD 2900 XT
        dd (0x9403  shl 16)+VID_ATI, init_r500   ;Radeon HD 2900 Pro
        dd (0x9405  shl 16)+VID_ATI, init_r500   ;Radeon HD 2900 GT
        dd (0x940A  shl 16)+VID_ATI, init_r500   ;FireGL V8650
        dd (0x940B  shl 16)+VID_ATI, init_r500   ;FireGL V8600
        dd (0x940F  shl 16)+VID_ATI, init_r500   ;FireGL V7600
        dd (0x94C0  shl 16)+VID_ATI, init_r500   ;RV610
        dd (0x94C1  shl 16)+VID_ATI, init_r500   ;Radeon HD 2400 XT
        dd (0x94C3  shl 16)+VID_ATI, init_r500   ;Radeon HD 2400 Pro
        dd (0x94C4  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2400 PRO AGP
        dd (0x94C5  shl 16)+VID_ATI, init_r500   ;FireGL V4000
        dd (0x94C6  shl 16)+VID_ATI, init_r500   ;RV610
        dd (0x94C7  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2350
        dd (0x94C8  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2400 XT
        dd (0x94C9  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2400
        dd (0x94CB  shl 16)+VID_ATI, init_r500   ;ATI RADEON E2400
        dd (0x94CC  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2400
        dd (0x9500  shl 16)+VID_ATI, init_r500   ;RV670
        dd (0x9501  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD3870
        dd (0x9504  shl 16)+VID_ATI, init_r500   ;ATI Mobility Radeon HD 3850
        dd (0x9505  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD3850
        dd (0x9506  shl 16)+VID_ATI, init_r500   ;ATI Mobility Radeon HD 3850 X2
        dd (0x9507  shl 16)+VID_ATI, init_r500   ;RV670
        dd (0x9508  shl 16)+VID_ATI, init_r500   ;ATI Mobility Radeon HD 3870
        dd (0x9509  shl 16)+VID_ATI, init_r500   ;ATI Mobility Radeon HD 3870 X2
        dd (0x950F  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD3870 X2
        dd (0x9511  shl 16)+VID_ATI, init_r500   ;ATI FireGL V7700
        dd (0x9515  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3850 AGP
        dd (0x9517  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3960
        dd (0x9519  shl 16)+VID_ATI, init_r500   ;FireStream 9170
        dd (0x9580  shl 16)+VID_ATI, init_r500   ;RV630
        dd (0x9581  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2600
        dd (0x9583  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 2600 XT
        dd (0x9586  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2600 XT AGP
        dd (0x9587  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2600 Pro AGP
        dd (0x9588  shl 16)+VID_ATI, init_r500   ;Radeon HD 2600 XT
        dd (0x9589  shl 16)+VID_ATI, init_r500   ;Radeon HD 2600 Pro
        dd (0x958A  shl 16)+VID_ATI, init_r500   ;Gemini RV630
        dd (0x958B  shl 16)+VID_ATI, init_r500   ;Gemini ATI Mobility Radeon HD 2600 XT
        dd (0x958C  shl 16)+VID_ATI, init_r500   ;FireGL V5600
        dd (0x958D  shl 16)+VID_ATI, init_r500   ;FireGL V3600
        dd (0x958E  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 2600 LE
        dd (0x958F  shl 16)+VID_ATI, init_r500   ;ATI Mobility FireGL Graphics Processor
        dd (0x9590  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3600 Series
        dd (0x9591  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 3650
        dd (0x9593  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 3670
        dd (0x9595  shl 16)+VID_ATI, init_r500   ;Mobility FireGL V5700
        dd (0x9596  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3650 AGP
        dd (0x9597  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3600 Series
        dd (0x9598  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3670
        dd (0x9599  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3600 Series
        dd (0x959B  shl 16)+VID_ATI, init_r500   ;Mobility FireGL Graphics Processor
        dd (0x95C0  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3470
        dd (0x95C2  shl 16)+VID_ATI, init_r500   ;ATI Mobility Radeon HD 3430 (M82)
        dd (0x95C4  shl 16)+VID_ATI, init_r500   ;Mobility Radeon HD 3400 Series (M82)
        dd (0x95C5  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3450
        dd (0x95C7  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3430
        dd (0x95CC  shl 16)+VID_ATI, init_r500   ;Fire PRO Professional Graphics ASIC
        dd (0x95CD  shl 16)+VID_ATI, init_r500   ;ATI FireMV 2450
        dd (0x95CE  shl 16)+VID_ATI, init_r500   ;ATI FireMV 2260
        dd (0x95CF  shl 16)+VID_ATI, init_r500   ;ATI FireMV 2260
        dd (0x9610  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3200 Graphics
        dd (0x9611  shl 16)+VID_ATI, init_r500   ;ATI Radeon 3100 Graphics
        dd (0x9612  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3200 Graphics
        dd (0x9613  shl 16)+VID_ATI, init_r500   ;ATI Radeon 3100 Graphics
        dd (0x9614  shl 16)+VID_ATI, init_r500   ;ATI Radeon HD 3300 Graphics
        dd (0x9440  shl 16)+VID_ATI, init_r500   ;ATI Radeon 4800 Series
        dd (0x9441  shl 16)+VID_ATI, init_r500   ;ATI Radeon 4870 X2
        dd (0x9442  shl 16)+VID_ATI, init_r500   ;ATI Radeon 4800 Series
        dd (0x9444  shl 16)+VID_ATI, init_r500   ;Everest ATI FirePro Graphics Accelerator
        dd (0x9446  shl 16)+VID_ATI, init_r500   ;K2 ATI FirePro Graphics Accelerator
        dd (0x944E  shl 16)+VID_ATI, init_r500   ;RV770
        dd (0x9456  shl 16)+VID_ATI, init_r500   ;Denali ATI FirePro Graphics

        dd 0    ;terminator

version      dd (5 shl 16) or (API_VERSION and 0xFFFF)

if R500_HW2D

align 16
R5xxRops  dd R5XX_ROP3_ZERO, R5XX_ROP3_ZERO  ;GXclear
          dd R5XX_ROP3_DSa,  R5XX_ROP3_DPa   ;Gxand
          dd R5XX_ROP3_SDna, R5XX_ROP3_PDna  ;GXandReverse
          dd R5XX_ROP3_S,    R5XX_ROP3_P     ;GXcopy
          dd R5XX_ROP3_DSna, R5XX_ROP3_DPna  ;GXandInverted
          dd R5XX_ROP3_D,    R5XX_ROP3_D     ;GXnoop
          dd R5XX_ROP3_DSx,  R5XX_ROP3_DPx   ;GXxor
          dd R5XX_ROP3_DSo,  R5XX_ROP3_DPo   ;GXor
          dd R5XX_ROP3_DSon, R5XX_ROP3_DPon  ;GXnor
          dd R5XX_ROP3_DSxn, R5XX_ROP3_PDxn  ;GXequiv
          dd R5XX_ROP3_Dn,   R5XX_ROP3_Dn    ;GXinvert
          dd R5XX_ROP3_SDno, R5XX_ROP3_PDno  ;GXorReverse
          dd R5XX_ROP3_Sn,   R5XX_ROP3_Pn    ;GXcopyInverted
          dd R5XX_ROP3_DSno, R5XX_ROP3_DPno  ;GXorInverted
          dd R5XX_ROP3_DSan, R5XX_ROP3_DPan  ;GXnand
          dd R5XX_ROP3_ONE,  R5XX_ROP3_ONE   ;GXset
end if


sz_ati_srv   db 'HWCURSOR',0

msgInit      db 'detect hardware...',13,10,0
msgPCI       db 'PCI accsess not supported',13,10,0
msgFail      db 'device not found',13,10,0
msg_neg      db 'neg ecx',13,10,0

if R500_HW2D

sz_HDraw_srv db 'HDRAW',0

msgR5xx2DFlushtimeout \
             db 'R5xx2DFlush timeout error',13,10,0
msgR5xxFIFOWaitLocaltimeout \
             db 'R5xxFIFOWaitLocal timeout error', 13, 10,0
msgR5xx2DIdleLocaltimeout \
             db 'R5xx2DIdleLocal timeout error', 13,10,0

align 4
R520_cp_microcode:
dd     0x4200e000, 0000000000
dd     0x4000e000, 0000000000
dd     0x00000099, 0x00000008
dd     0x0000009d, 0x00000008
dd     0x4a554b4a, 0000000000
dd     0x4a4a4467, 0000000000
dd     0x55526f75, 0000000000
dd     0x4a7e7d65, 0000000000
dd     0xe0dae6f6, 0000000000
dd     0x4ac54a4a, 0000000000
dd     0xc8828282, 0000000000
dd     0xbf4acfc1, 0000000000
dd     0x87b04ad5, 0000000000
dd     0xb5838383, 0000000000
dd     0x4a0f85ba, 0000000000
dd     0x000ca000, 0x00000004
dd     0x000d0012, 0x00000038
dd     0x0000e8b4, 0x00000004
dd     0x000d0014, 0x00000038
dd     0x0000e8b6, 0x00000004
dd     0x000d0016, 0x00000038
dd     0x0000e854, 0x00000004
dd     0x000d0018, 0x00000038
dd     0x0000e855, 0x00000004
dd     0x000d001a, 0x00000038
dd     0x0000e856, 0x00000004
dd     0x000d001c, 0x00000038
dd     0x0000e857, 0x00000004
dd     0x000d001e, 0x00000038
dd     0x0000e824, 0x00000004
dd     0x000d0020, 0x00000038
dd     0x0000e825, 0x00000004
dd     0x000d0022, 0x00000038
dd     0x0000e830, 0x00000004
dd     0x000d0024, 0x00000038
dd     0x0000f0c0, 0x00000004
dd     0x000d0026, 0x00000038
dd     0x0000f0c1, 0x00000004
dd     0x000d0028, 0x00000038
dd     0x0000e000, 0x00000004
dd     0x000d002a, 0x00000038
dd     0x0000e000, 0x00000004
dd     0x000d002c, 0x00000038
dd     0x0000e000, 0x00000004
dd     0x000d002e, 0x00000038
dd     0x0000e000, 0x00000004
dd     0x000d0030, 0x00000038
dd     0x0000e000, 0x00000004
dd     0x000d0032, 0x00000038
dd     0x0000f180, 0x00000004
dd     0x000d0034, 0x00000038
dd     0x0000f393, 0x00000004
dd     0x000d0036, 0x00000038
dd     0x0000f38a, 0x00000004
dd     0x000d0038, 0x00000038
dd     0x0000f38e, 0x00000004
dd     0x0000e821, 0x00000004
dd     0x0140a000, 0x00000004
dd     0x00000043, 0x00000018
dd     0x00cce800, 0x00000004
dd     0x001b0001, 0x00000004
dd     0x08004800, 0x00000004
dd     0x001b0001, 0x00000004
dd     0x08004800, 0x00000004
dd     0x001b0001, 0x00000004
dd     0x08004800, 0x00000004
dd     0x0000003a, 0x00000008
dd     0x0000a000, 0000000000
dd     0x2000451d, 0x00000004
dd     0x0000e580, 0x00000004
dd     0x000ce581, 0x00000004
dd     0x08004580, 0x00000004
dd     0x000ce581, 0x00000004
dd     0x00000047, 0x00000008
dd     0x0000a000, 0000000000
dd     0x000c2000, 0x00000004
dd     0x0000e50e, 0x00000004
dd     0x00032000, 0x00000004
dd     0x00022051, 0x00000028
dd     0x00000051, 0x00000024
dd     0x0800450f, 0x00000004
dd     0x0000a04b, 0x00000008
dd     0x0000e565, 0x00000004
dd     0x0000e566, 0x00000004
dd     0x00000052, 0x00000008
dd     0x03cca5b4, 0x00000004
dd     0x05432000, 0x00000004
dd     0x00022000, 0x00000004
dd     0x4ccce05e, 0x00000030
dd     0x08274565, 0x00000004
dd     0x0000005e, 0x00000030
dd     0x08004564, 0x00000004
dd     0x0000e566, 0x00000004
dd     0x00000055, 0x00000008
dd     0x00802061, 0x00000010
dd     0x00202000, 0x00000004
dd     0x001b00ff, 0x00000004
dd     0x01000064, 0x00000010
dd     0x001f2000, 0x00000004
dd     0x001c00ff, 0x00000004
dd     0000000000, 0x0000000c
dd     0x00000072, 0x00000030
dd     0x00000055, 0x00000008
dd     0x0000e576, 0x00000004
dd     0x0000e577, 0x00000004
dd     0x0000e50e, 0x00000004
dd     0x0000e50f, 0x00000004
dd     0x0140a000, 0x00000004
dd     0x00000069, 0x00000018
dd     0x00c0e5f9, 0x000000c2
dd     0x00000069, 0x00000008
dd     0x0014e50e, 0x00000004
dd     0x0040e50f, 0x00000004
dd     0x00c0006c, 0x00000008
dd     0x0000e570, 0x00000004
dd     0x0000e571, 0x00000004
dd     0x0000e572, 0x0000000c
dd     0x0000a000, 0x00000004
dd     0x0140a000, 0x00000004
dd     0x0000e568, 0x00000004
dd     0x000c2000, 0x00000004
dd     0x00000076, 0x00000018
dd     0x000b0000, 0x00000004
dd     0x18c0e562, 0x00000004
dd     0x00000078, 0x00000008
dd     0x00c00077, 0x00000008
dd     0x000700c7, 0x00000004
dd     0x00000080, 0x00000038
dd     0x0000e5bb, 0x00000004
dd     0x0000e5bc, 0000000000
dd     0x0000a000, 0x00000004
dd     0x0000e821, 0x00000004
dd     0x0000e800, 0000000000
dd     0x0000e821, 0x00000004
dd     0x0000e82e, 0000000000
dd     0x02cca000, 0x00000004
dd     0x00140000, 0x00000004
dd     0x000ce1cc, 0x00000004
dd     0x050de1cd, 0x00000004
dd     0x00400000, 0x00000004
dd     0x0000008f, 0x00000018
dd     0x00c0a000, 0x00000004
dd     0x0000008c, 0x00000008
dd     0x00000091, 0x00000020
dd     0x4200e000, 0000000000
dd     0x00000098, 0x00000038
dd     0x000ca000, 0x00000004
dd     0x00140000, 0x00000004
dd     0x000c2000, 0x00000004
dd     0x00160000, 0x00000004
dd     0x700ce000, 0x00000004
dd     0x00140094, 0x00000008
dd     0x4000e000, 0000000000
dd     0x02400000, 0x00000004
dd     0x400ee000, 0x00000004
dd     0x02400000, 0x00000004
dd     0x4000e000, 0000000000
dd     0x000c2000, 0x00000004
dd     0x0240e51b, 0x00000004
dd     0x0080e50a, 0x00000005
dd     0x0080e50b, 0x00000005
dd     0x00220000, 0x00000004
dd     0x000700c7, 0x00000004
dd     0x000000a4, 0x00000038
dd     0x0080e5bd, 0x00000005
dd     0x0000e5bb, 0x00000005
dd     0x0080e5bc, 0x00000005
dd     0x00210000, 0x00000004
dd     0x02800000, 0x00000004
dd     0x00c000ab, 0x00000018
dd     0x4180e000, 0x00000040
dd     0x000000ad, 0x00000024
dd     0x01000000, 0x0000000c
dd     0x0100e51d, 0x0000000c
dd     0x000045bb, 0x00000004
dd     0x000080a7, 0x00000008
dd     0x0000f3ce, 0x00000004
dd     0x0140a000, 0x00000004
dd     0x00cc2000, 0x00000004
dd     0x08c053cf, 0x00000040
dd     0x00008000, 0000000000
dd     0x0000f3d2, 0x00000004
dd     0x0140a000, 0x00000004
dd     0x00cc2000, 0x00000004
dd     0x08c053d3, 0x00000040
dd     0x00008000, 0000000000
dd     0x0000f39d, 0x00000004
dd     0x0140a000, 0x00000004
dd     0x00cc2000, 0x00000004
dd     0x08c0539e, 0x00000040
dd     0x00008000, 0000000000
dd     0x03c00830, 0x00000004
dd     0x4200e000, 0000000000
dd     0x0000a000, 0x00000004
dd     0x200045e0, 0x00000004
dd     0x0000e5e1, 0000000000
dd     0x00000001, 0000000000
dd     0x000700c4, 0x00000004
dd     0x0800e394, 0000000000
dd     0000000000, 0000000000
dd     0x0000e8c4, 0x00000004
dd     0x0000e8c5, 0x00000004
dd     0x0000e8c6, 0x00000004
dd     0x0000e928, 0x00000004
dd     0x0000e929, 0x00000004
dd     0x0000e92a, 0x00000004
dd     0x000000c8, 0x00000008
dd     0x0000e928, 0x00000004
dd     0x0000e929, 0x00000004
dd     0x0000e92a, 0x00000004
dd     0x000000cf, 0x00000008
dd     0xdeadbeef, 0000000000
dd     0x00000116, 0000000000
dd     0x000700d3, 0x00000004
dd     0x080050e7, 0x00000004
dd     0x000700d4, 0x00000004
dd     0x0800401c, 0x00000004
dd     0x0000e01d, 0000000000
dd     0x02c02000, 0x00000004
dd     0x00060000, 0x00000004
dd     0x000000de, 0x00000034
dd     0x000000db, 0x00000008
dd     0x00008000, 0x00000004
dd     0xc000e000, 0000000000
dd     0x0000e1cc, 0x00000004
dd     0x0500e1cd, 0x00000004
dd     0x000ca000, 0x00000004
dd     0x000000e5, 0x00000034
dd     0x000000e1, 0x00000008
dd     0x0000a000, 0000000000
dd     0x0019e1cc, 0x00000004
dd     0x001b0001, 0x00000004
dd     0x0500a000, 0x00000004
dd     0x080041cd, 0x00000004
dd     0x000ca000, 0x00000004
dd     0x000000fb, 0x00000034
dd     0x0000004a, 0x00000008
dd     0000000000, 0000000000
dd     0000000000, 0000000000
dd     0000000000, 0000000000
dd     0000000000, 0000000000
dd     0000000000, 0000000000
dd     0000000000, 0000000000
dd     0000000000, 0000000000
dd     0000000000, 0000000000
dd     0000000000, 0000000000
dd     0x000c2000, 0x00000004
dd     0x001d0018, 0x00000004
dd     0x001a0001, 0x00000004
dd     0x000000fb, 0x00000034
dd     0x0000004a, 0x00000008
dd     0x0500a04a, 0x00000008
dd     0000000000, 0000000000
dd     0000000000, 0000000000
dd     0000000000, 0000000000
dd     0000000000, 0000000000


end if

if 0
msg6100      db '6100:  ',0
msg6104      db '6104:  ',0
msg6108      db '6108:  ',0
msg6110      db '6110:  ',0
msg6120      db '6120:  ',0
msg6124      db '6124:  ',0
msg6128      db '6128:  ',0
msg612C      db '612C:  ',0
msg6130      db '6130:  ',0
msg6134      db '6134:  ',0
msg6138      db '6138:  ',0
end if

buff         db 8 dup(0)
             db 13,10, 0

section '.data' data readable writable align 16

pCursor  db 4096 dup(?)

cursor_map     rd 2
cursor_start   rd 1
cursor_end     rd 1

fnSelect       rd 1
fnSet          rd 1
oldSelect      rd 1
oldSet         rd 1
oldRestore     rd 1
oldCreate      rd 1

r500_LFB       rd 1

bus            dd ?
devfn          dd ?
ati_io         dd ?

if R500_HW2D

__xmin         rd 1
__xmax         rd 1
__ymin         rd 1
__ymax         rd 1

rhd            RHD

end if