forked from KolibriOS/kolibrios
cleanup
git-svn-id: svn://kolibrios.org@877 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
037ab747c1
commit
fb3e9a2b66
@ -1,15 +1,15 @@
|
|||||||
|
|
||||||
#define FILL_RECT 1
|
#define PX_CREATE 1
|
||||||
#define DRAW_RECT 2
|
#define PX_DESTROY 2
|
||||||
#define LINE_2P 3
|
#define PX_DRAW_RECT 3
|
||||||
#define BLIT 4
|
#define PX_FILL_RECT 4
|
||||||
#define COMPIZ 5
|
#define PX_LINE 5
|
||||||
#define PX_CREATE 6
|
#define PX_BLIT 6
|
||||||
#define PIXBLIT 7
|
#define PX_BLIT_TRANSPARENT 7
|
||||||
#define PIXLOCK 8
|
#define PX_BLIT_ALPHA 8
|
||||||
#define PIXUNLOCK 9
|
|
||||||
#define PIXDESTROY 10
|
//#define BLIT 4
|
||||||
#define TRANSBLIT 11
|
//#define COMPIZ 5
|
||||||
|
|
||||||
|
|
||||||
typedef unsigned int color_t;
|
typedef unsigned int color_t;
|
||||||
|
@ -1,4 +1,72 @@
|
|||||||
|
|
||||||
|
int Line(draw_t *draw)
|
||||||
|
{
|
||||||
|
local_pixmap_t *dstpixmap;
|
||||||
|
clip_t clip;
|
||||||
|
int x0, y0, x1, y1;
|
||||||
|
|
||||||
|
dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ;
|
||||||
|
|
||||||
|
x0 = draw->x0;
|
||||||
|
y0 = draw->y0;
|
||||||
|
|
||||||
|
x1 = draw->x1;
|
||||||
|
y1 = draw->y1;
|
||||||
|
|
||||||
|
clip.xmin = 0;
|
||||||
|
clip.ymin = 0;
|
||||||
|
clip.xmax = dstpixmap->width-1;
|
||||||
|
clip.ymax = dstpixmap->height-1;
|
||||||
|
|
||||||
|
if ( !LineClip(&clip, &x0, &y0, &x1, &y1 ))
|
||||||
|
{
|
||||||
|
u32_t efl;
|
||||||
|
u32_t *ring, write;
|
||||||
|
|
||||||
|
efl = safe_cli();
|
||||||
|
|
||||||
|
#if R300_PIO
|
||||||
|
|
||||||
|
R5xxFIFOWait(6);
|
||||||
|
|
||||||
|
OUTREG(R5XX_DP_GUI_MASTER_CNTL,
|
||||||
|
rhd.gui_control |
|
||||||
|
R5XX_GMC_BRUSH_SOLID_COLOR |
|
||||||
|
R5XX_GMC_SRC_DATATYPE_COLOR |
|
||||||
|
R5XX_GMC_CLR_CMP_CNTL_DIS |
|
||||||
|
R5XX_GMC_WR_MSK_DIS |
|
||||||
|
R5XX_ROP3_P
|
||||||
|
);
|
||||||
|
|
||||||
|
OUTREG(R5XX_DST_LINE_PATCOUNT, 0x55 << R5XX_BRES_CNTL_SHIFT);
|
||||||
|
|
||||||
|
OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color);
|
||||||
|
OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset);
|
||||||
|
|
||||||
|
OUTREG(R5XX_DST_LINE_START,(y0<<16)|x0);
|
||||||
|
OUTREG(R5XX_DST_LINE_END,(y1<<16)|x1);
|
||||||
|
#else
|
||||||
|
BEGIN_RING();
|
||||||
|
OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_POLYLINE, 4));
|
||||||
|
OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL |
|
||||||
|
RADEON_GMC_BRUSH_SOLID_COLOR |
|
||||||
|
RADEON_GMC_DST_32BPP |
|
||||||
|
RADEON_GMC_SRC_DATATYPE_COLOR |
|
||||||
|
R5XX_GMC_CLR_CMP_CNTL_DIS |
|
||||||
|
R5XX_GMC_WR_MSK_DIS |
|
||||||
|
R5XX_ROP3_P);
|
||||||
|
|
||||||
|
OUT_RING(dstpixmap->pitch_offset);
|
||||||
|
OUT_RING(draw->color);
|
||||||
|
OUT_RING((y0<<16)|x0);
|
||||||
|
OUT_RING((y1<<16)|x1);
|
||||||
|
COMMIT_RING();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
safe_sti(efl);
|
||||||
|
};
|
||||||
|
return ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
int DrawRect(draw_t* draw)
|
int DrawRect(draw_t* draw)
|
||||||
{
|
{
|
||||||
@ -215,170 +283,8 @@ int Blit(blit_t *blit)
|
|||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Line2P(draw_t *draw)
|
|
||||||
{
|
|
||||||
local_pixmap_t *dstpixmap;
|
|
||||||
int x0, y0, x1, y1;
|
|
||||||
|
|
||||||
dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ;
|
|
||||||
|
|
||||||
x0 = draw->x0;
|
|
||||||
y0 = draw->y0;
|
|
||||||
|
|
||||||
x1 = draw->x1;
|
|
||||||
y1 = draw->y1;
|
|
||||||
|
|
||||||
if ( !LineClip(&clip, &x0, &y0, &x1, &y1 ))
|
|
||||||
{
|
|
||||||
u32 efl;
|
|
||||||
u32 *ring, write;
|
|
||||||
|
|
||||||
efl = safe_cli();
|
|
||||||
|
|
||||||
#if R300_PIO
|
|
||||||
|
|
||||||
R5xxFIFOWait(6);
|
|
||||||
|
|
||||||
OUTREG(R5XX_DP_GUI_MASTER_CNTL,
|
|
||||||
rhd.gui_control |
|
|
||||||
R5XX_GMC_BRUSH_SOLID_COLOR |
|
|
||||||
R5XX_GMC_SRC_DATATYPE_COLOR |
|
|
||||||
R5XX_GMC_CLR_CMP_CNTL_DIS |
|
|
||||||
R5XX_GMC_WR_MSK_DIS |
|
|
||||||
R5XX_ROP3_P
|
|
||||||
);
|
|
||||||
|
|
||||||
OUTREG(R5XX_DST_LINE_PATCOUNT, 0x55 << R5XX_BRES_CNTL_SHIFT);
|
|
||||||
|
|
||||||
OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color);
|
|
||||||
OUTREG(R5XX_DST_PITCH_OFFSET, rhd.dst_pitch_offset);
|
|
||||||
|
|
||||||
OUTREG(R5XX_DST_LINE_START,(y0<<16)|x0);
|
|
||||||
OUTREG(R5XX_DST_LINE_END,(y1<<16)|x1);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
BEGIN_RING();
|
|
||||||
OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_POLYLINE, 4));
|
|
||||||
OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL |
|
|
||||||
RADEON_GMC_BRUSH_SOLID_COLOR |
|
|
||||||
RADEON_GMC_DST_32BPP |
|
|
||||||
RADEON_GMC_SRC_DATATYPE_COLOR |
|
|
||||||
R5XX_GMC_CLR_CMP_CNTL_DIS |
|
|
||||||
R5XX_GMC_WR_MSK_DIS |
|
|
||||||
R5XX_ROP3_P);
|
|
||||||
|
|
||||||
OUT_RING(rhd.dst_pitch_offset);
|
|
||||||
OUT_RING(draw->color);
|
|
||||||
OUT_RING((y0<<16)|x0);
|
|
||||||
OUT_RING((y1<<16)|x1);
|
|
||||||
COMMIT_RING();
|
|
||||||
|
|
||||||
#endif
|
|
||||||
safe_sti(efl);
|
|
||||||
|
|
||||||
};
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int CreatePixmap(pixmap_t *io)
|
|
||||||
{
|
|
||||||
local_pixmap_t *pixmap;
|
|
||||||
|
|
||||||
unsigned pitch;
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
void *local;
|
|
||||||
|
|
||||||
if( (io->width == 0) || (io->width > 2048)||
|
|
||||||
(io->height == 0)|| (io->height > 2048))
|
|
||||||
{
|
|
||||||
dbgprintf("Invalid pixmap size w:%d h:%d\n", io->width,io->height);
|
|
||||||
return ERR_PARAM;
|
|
||||||
};
|
|
||||||
|
|
||||||
pitch = ((io->width+15)&~15)*4;
|
|
||||||
size = pitch*io->height;
|
|
||||||
|
|
||||||
dbgprintf("pitch = %d\n", pitch);
|
|
||||||
|
|
||||||
local = rhd_mem_alloc(&rhd,RHD_MEM_FB,size) ;
|
|
||||||
if ( !local)
|
|
||||||
{
|
|
||||||
dbgprintf("Not enough memory for pixmap\n");
|
|
||||||
return ERR_PARAM;
|
|
||||||
};
|
|
||||||
|
|
||||||
pixmap = malloc(sizeof(local_pixmap_t));
|
|
||||||
if(!pixmap)
|
|
||||||
{
|
|
||||||
rhd_mem_free(&rhd, RHD_MEM_FB,local);
|
|
||||||
return ERR_PARAM;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
void *mapped;
|
|
||||||
|
|
||||||
size = (size+4095) & ~ 4095;
|
|
||||||
|
|
||||||
if (mapped = UserAlloc(size))
|
|
||||||
{
|
|
||||||
CommitPages(mapped, ((u32_t)local+rhd.PhisBase)|7|(1<<9), size);
|
|
||||||
|
|
||||||
io->mapped = mapped;
|
|
||||||
io->pitch = pitch;
|
|
||||||
io->handle = (u32_t)pixmap;
|
|
||||||
|
|
||||||
pixmap->width = io->width;
|
|
||||||
pixmap->height = io->height;
|
|
||||||
pixmap->format = PICT_a8r8g8b8;
|
|
||||||
pixmap->flags = io->flags;
|
|
||||||
pixmap->pitch = pitch;
|
|
||||||
pixmap->mapped = mapped;
|
|
||||||
pixmap->pitch_offset = ((pitch/64)<<22)| (((u32_t)local+rhd.FbIntAddress)>>10);
|
|
||||||
pixmap->local = local;
|
|
||||||
|
|
||||||
dbgprintf("pixmap.pitch_offset: %x\n", pixmap->pitch_offset);
|
|
||||||
dbgprintf("width: %d height: %d\n",pixmap->width,pixmap->height );
|
|
||||||
dbgprintf("map at %x\n", pixmap->mapped);
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
};
|
|
||||||
rhd_mem_free(&rhd, RHD_MEM_FB,local);
|
|
||||||
free(pixmap);
|
|
||||||
};
|
|
||||||
return ERR_PARAM;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
int DestroyPixmap( pixmap_t *io )
|
|
||||||
{
|
|
||||||
local_pixmap_t *pixmap;
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
dbgprintf("Destroy pixmap %x\n", io->handle);
|
|
||||||
|
|
||||||
if(io->handle == -1)
|
|
||||||
return ERR_PARAM;
|
|
||||||
else
|
|
||||||
pixmap = (local_pixmap_t*)io->handle;
|
|
||||||
|
|
||||||
size = (pixmap->pitch*pixmap->height+4095) & ~ 4095;
|
|
||||||
|
|
||||||
UnmapPages(pixmap->mapped, size);
|
|
||||||
UserFree(pixmap->mapped);
|
|
||||||
|
|
||||||
rhd_mem_free(&rhd,RHD_MEM_FB,pixmap->local);
|
|
||||||
free(pixmap);
|
|
||||||
|
|
||||||
io->format = 0;
|
|
||||||
io->pitch = 0;
|
|
||||||
io->mapped = NULL;
|
|
||||||
io->handle = 0;
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
};
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ static void Init3DEngine(RHDPtr rhdPtr)
|
|||||||
u32_t gb_tile_config, su_reg_dest, vap_cntl;
|
u32_t gb_tile_config, su_reg_dest, vap_cntl;
|
||||||
// ACCEL_PREAMBLE();
|
// ACCEL_PREAMBLE();
|
||||||
|
|
||||||
u32 *ring, write;
|
u32_t *ring, write;
|
||||||
|
|
||||||
// info->texW[0] = info->texH[0] = info->texW[1] = info->texH[1] = 1;
|
// info->texW[0] = info->texH[0] = info->texW[1] = info->texH[1] = 1;
|
||||||
|
|
||||||
@ -1098,7 +1098,7 @@ static void RadeonCompositeTile(int srcX, int srcY,
|
|||||||
xPointFixed srcTopLeft, srcTopRight, srcBottomLeft, srcBottomRight;
|
xPointFixed srcTopLeft, srcTopRight, srcBottomLeft, srcBottomRight;
|
||||||
xPointFixed maskTopLeft, maskTopRight, maskBottomLeft, maskBottomRight;
|
xPointFixed maskTopLeft, maskTopRight, maskBottomLeft, maskBottomRight;
|
||||||
|
|
||||||
u32 *ring, write;
|
u32_t *ring, write;
|
||||||
|
|
||||||
|
|
||||||
// ACCEL_PREAMBLE();
|
// ACCEL_PREAMBLE();
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
|
|
||||||
//ld -T ld.x -s --shared --image-base 0 --file-alignment 32 -o test.exe test.obj core.lib
|
#include "types.h"
|
||||||
|
|
||||||
#include "common.h"
|
#include <stdio.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <memory.h>
|
||||||
|
|
||||||
|
#include "syscall.h"
|
||||||
|
|
||||||
#include "ati2d.h"
|
#include "ati2d.h"
|
||||||
#include "accel_2d.h"
|
#include "accel_2d.h"
|
||||||
@ -12,26 +16,14 @@ static clip_t clip;
|
|||||||
|
|
||||||
static local_pixmap_t scr_pixmap;
|
static local_pixmap_t scr_pixmap;
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
void STDCALL (*SelectHwCursor)(cursor_t*)__asm__("SelectHwCursor");
|
|
||||||
void STDCALL (*SetHwCursor)(cursor_t*,int x,int y)__asm__("SetHwCursor");
|
|
||||||
void STDCALL (*HwCursorRestore)(int x, int y)__asm("HwCursorRestore");
|
|
||||||
cursor_t* IMPORT (*HwCursorCreate)(void)__asm("HwCursorCreate"); //params eax, ebx, ecx
|
|
||||||
|
|
||||||
void (__stdcall *old_select)(cursor_t*);
|
|
||||||
void (__stdcall *old_set)(cursor_t*,int x,int y);
|
|
||||||
void (__stdcall *old_restore)(int x, int y);
|
|
||||||
cursor_t* (*old_create)(void);
|
|
||||||
cursor_t* __create_cursor(void);
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void Init3DEngine(RHDPtr rhdPtr);
|
static void Init3DEngine(RHDPtr rhdPtr);
|
||||||
|
|
||||||
u32 __stdcall drvEntry(int action)
|
int __stdcall srv_2d(ioctl_t *io);
|
||||||
|
|
||||||
|
u32_t __stdcall drvEntry(int action)
|
||||||
{
|
{
|
||||||
RHDPtr rhdPtr;
|
RHDPtr rhdPtr;
|
||||||
u32 retval;
|
u32_t retval;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -65,26 +57,17 @@ u32 __stdcall drvEntry(int action)
|
|||||||
if(!RHDPreInit())
|
if(!RHDPreInit())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// old_select = SelectHwCursor;
|
|
||||||
// old_set = SetHwCursor;
|
|
||||||
// old_restore = HwCursorRestore ;
|
|
||||||
// old_create = HwCursorCreate;
|
|
||||||
|
|
||||||
R5xx2DInit();
|
R5xx2DInit();
|
||||||
rhd.has_tcl = 1;
|
rhd.has_tcl = 1;
|
||||||
|
|
||||||
// Init3DEngine(&rhd);
|
// Init3DEngine(&rhd);
|
||||||
|
|
||||||
//init_r500();
|
//init_r500();
|
||||||
|
|
||||||
// SelectHwCursor = r500_SelectCursor;
|
|
||||||
// SetHwCursor = r500_SetCursor;
|
|
||||||
// HwCursorCreate = __create_cursor;
|
|
||||||
// HwCursorRestore = r500_CursorRestore;
|
|
||||||
|
|
||||||
retval = RegService("HDRAW", srv_2d);
|
retval = RegService("HDRAW", srv_2d);
|
||||||
dbgprintf("reg service %s as: %x\n", "HDRAW", retval);
|
dbgprintf("reg service %s as: %x\n", "HDRAW", retval);
|
||||||
|
|
||||||
// retval = RegService("HWCURSOR", srv_cursor);
|
|
||||||
return retval;
|
return retval;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -93,36 +76,11 @@ u32 __stdcall drvEntry(int action)
|
|||||||
|
|
||||||
#define SRV_GETVERSION 0
|
#define SRV_GETVERSION 0
|
||||||
|
|
||||||
/*
|
|
||||||
int _stdcall srv_cursor(ioctl_t *io)
|
|
||||||
{
|
|
||||||
u32 *inp;
|
|
||||||
u32 *outp;
|
|
||||||
|
|
||||||
inp = io->input;
|
|
||||||
outp = io->output;
|
|
||||||
|
|
||||||
switch(io->io_code)
|
|
||||||
{
|
|
||||||
case SRV_GETVERSION:
|
|
||||||
if(io->out_size==4)
|
|
||||||
{
|
|
||||||
*(u32*)io->output = API_VERSION;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return ERR_PARAM;
|
|
||||||
};
|
|
||||||
return ERR_PARAM;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
int _stdcall srv_2d(ioctl_t *io)
|
int _stdcall srv_2d(ioctl_t *io)
|
||||||
{
|
{
|
||||||
u32 *inp;
|
u32_t *inp;
|
||||||
u32 *outp;
|
u32_t *outp;
|
||||||
|
|
||||||
inp = io->input;
|
inp = io->input;
|
||||||
outp = io->output;
|
outp = io->output;
|
||||||
@ -137,21 +95,42 @@ int _stdcall srv_2d(ioctl_t *io)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DRAW_RECT:
|
case PX_CREATE:
|
||||||
|
if(io->inp_size==7)
|
||||||
|
return CreatePixmap((pixmap_t*)inp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PX_DESTROY:
|
||||||
|
if(io->inp_size==7)
|
||||||
|
return DestroyPixmap((pixmap_t*)inp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PX_DRAW_RECT:
|
||||||
if(io->inp_size==6)
|
if(io->inp_size==6)
|
||||||
return DrawRect((draw_t*)inp);
|
return DrawRect((draw_t*)inp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FILL_RECT:
|
case PX_FILL_RECT:
|
||||||
if(io->inp_size==9)
|
if(io->inp_size==9)
|
||||||
return FillRect((fill_t*)inp);
|
return FillRect((fill_t*)inp);
|
||||||
break;
|
break;
|
||||||
/*
|
|
||||||
case LINE_2P:
|
case PX_BLIT:
|
||||||
if(io->inp_size==6)
|
if(io->inp_size==8)
|
||||||
return Line2P((draw_t*)inp);
|
return PixBlit((pixblit_t*)inp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PX_BLIT_TRANSPARENT:
|
||||||
|
if(io->inp_size==8)
|
||||||
|
return TransBlit((pixblit_t*)inp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PX_LINE:
|
||||||
|
if(io->inp_size==6)
|
||||||
|
return Line((draw_t*)inp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
case BLIT:
|
case BLIT:
|
||||||
if(io->inp_size==6)
|
if(io->inp_size==6)
|
||||||
return Blit((blit_t*)inp);
|
return Blit((blit_t*)inp);
|
||||||
@ -162,36 +141,6 @@ int _stdcall srv_2d(ioctl_t *io)
|
|||||||
return RadeonComposite((blit_t*)inp);
|
return RadeonComposite((blit_t*)inp);
|
||||||
break;
|
break;
|
||||||
*/
|
*/
|
||||||
case PX_CREATE:
|
|
||||||
if(io->inp_size==7)
|
|
||||||
return CreatePixmap((pixmap_t*)inp);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PIXBLIT:
|
|
||||||
if(io->inp_size==8)
|
|
||||||
return PixBlit((pixblit_t*)inp);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// case PIXLOCK:
|
|
||||||
// if(io->inp_size==6)
|
|
||||||
// return LockPixmap((userpixmap_t*)inp);
|
|
||||||
// break;
|
|
||||||
|
|
||||||
// case PIXUNLOCK:
|
|
||||||
// if(io->inp_size==6)
|
|
||||||
// return UnlockPixmap((userpixmap_t*)inp);
|
|
||||||
// break;
|
|
||||||
|
|
||||||
case PIXDESTROY:
|
|
||||||
if(io->inp_size==6)
|
|
||||||
return DestroyPixmap((pixmap_t*)inp);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TRANSBLIT:
|
|
||||||
if(io->inp_size==8)
|
|
||||||
return TransBlit((pixblit_t*)inp);
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return ERR_PARAM;
|
return ERR_PARAM;
|
||||||
@ -208,6 +157,7 @@ int _stdcall srv_2d(ioctl_t *io)
|
|||||||
#include "r500.inc"
|
#include "r500.inc"
|
||||||
|
|
||||||
#include "clip.inc"
|
#include "clip.inc"
|
||||||
|
#include "pixmap.inc"
|
||||||
#include "accel_2d.inc"
|
#include "accel_2d.inc"
|
||||||
#include "accel_3d.inc"
|
#include "accel_3d.inc"
|
||||||
|
|
||||||
|
@ -1,4 +1,13 @@
|
|||||||
|
|
||||||
|
typedef void *pointer;
|
||||||
|
|
||||||
|
typedef unsigned int Bool;
|
||||||
|
|
||||||
|
typedef unsigned int memType;
|
||||||
|
|
||||||
|
typedef struct { float hi, lo; } range;
|
||||||
|
|
||||||
|
|
||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
#include "rhd_regs.h"
|
#include "rhd_regs.h"
|
||||||
|
|
||||||
@ -105,17 +114,17 @@ enum RHD_FAMILIES {
|
|||||||
|
|
||||||
typedef struct RHDRec
|
typedef struct RHDRec
|
||||||
{
|
{
|
||||||
CARD32 MMIOBase;
|
u32_t MMIOBase;
|
||||||
CARD32 MMIOMapSize;
|
u32_t MMIOMapSize;
|
||||||
CARD32 videoRam;
|
u32_t videoRam;
|
||||||
|
|
||||||
// CARD32 FbBase; /* map base of fb */
|
// CARD32 FbBase; /* map base of fb */
|
||||||
CARD32 PhisBase;
|
u32_t PhisBase;
|
||||||
CARD32 FbIntAddress; /* card internal address of FB */
|
u32_t FbIntAddress; /* card internal address of FB */
|
||||||
CARD32 FbMapSize;
|
u32_t FbMapSize;
|
||||||
|
|
||||||
CARD32 FbFreeStart;
|
u32_t FbFreeStart;
|
||||||
CARD32 FbFreeSize;
|
u32_t FbFreeSize;
|
||||||
|
|
||||||
/* visible part of the framebuffer */
|
/* visible part of the framebuffer */
|
||||||
unsigned int FbScanoutStart;
|
unsigned int FbScanoutStart;
|
||||||
@ -128,38 +137,38 @@ typedef struct RHDRec
|
|||||||
|
|
||||||
Bool IsIGP;
|
Bool IsIGP;
|
||||||
|
|
||||||
CARD32 bus;
|
u32_t bus;
|
||||||
CARD32 devfn;
|
u32_t devfn;
|
||||||
|
|
||||||
PCITAG PciTag;
|
PCITAG PciTag;
|
||||||
CARD16 PciDeviceID;
|
u16_t PciDeviceID;
|
||||||
|
|
||||||
CARD16 subvendor_id;
|
u16_t subvendor_id;
|
||||||
CARD16 subdevice_id;
|
u16_t subdevice_id;
|
||||||
|
|
||||||
CARD32 memBase[6];
|
u32_t memBase[6];
|
||||||
CARD32 ioBase[6];
|
u32_t ioBase[6];
|
||||||
CARD32 memtype[6];
|
u32_t memtype[6];
|
||||||
CARD32 memsize[6];
|
u32_t memsize[6];
|
||||||
|
|
||||||
struct mem_block *fb_heap;
|
struct mem_block *fb_heap;
|
||||||
struct mem_block *gart_heap;
|
struct mem_block *gart_heap;
|
||||||
|
|
||||||
CARD32 displayWidth;
|
u32_t displayWidth;
|
||||||
CARD32 displayHeight;
|
u32_t displayHeight;
|
||||||
|
|
||||||
CARD32 __xmin;
|
int __xmin;
|
||||||
CARD32 __ymin;
|
int __ymin;
|
||||||
CARD32 __xmax;
|
int __xmax;
|
||||||
CARD32 __ymax;
|
int __ymax;
|
||||||
|
|
||||||
CARD32 gui_control;
|
u32_t gui_control;
|
||||||
CARD32 dst_pitch_offset;
|
u32_t dst_pitch_offset;
|
||||||
CARD32 surface_cntl;
|
u32_t surface_cntl;
|
||||||
|
|
||||||
u32 *ring_base;
|
u32_t *ring_base;
|
||||||
u32 ring_rp;
|
u32_t ring_rp;
|
||||||
u32 ring_wp;
|
u32_t ring_wp;
|
||||||
|
|
||||||
int num_gb_pipes;
|
int num_gb_pipes;
|
||||||
Bool has_tcl;
|
Bool has_tcl;
|
||||||
@ -253,34 +262,34 @@ typedef struct {
|
|||||||
|
|
||||||
|
|
||||||
extern inline void
|
extern inline void
|
||||||
OUTREG8(CARD16 offset, u8 value)
|
OUTREG8(u16_t offset, u8_t value)
|
||||||
{
|
{
|
||||||
*(volatile CARD8 *)((CARD8 *)(rhd.MMIOBase + offset)) = value;
|
*(volatile u8_t *)((u8_t *)(rhd.MMIOBase + offset)) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern inline CARD32 INREG(CARD16 offset)
|
extern inline u32_t INREG(u16_t offset)
|
||||||
{
|
{
|
||||||
return *(volatile CARD32 *)((CARD8*)(rhd.MMIOBase + offset));
|
return *(volatile u32_t *)((u8_t*)(rhd.MMIOBase + offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
//#define INREG(offset) *(volatile CARD32 *)((CARD8*)(rhd.MMIOBase + (offset)))
|
//#define INREG(offset) *(volatile CARD32 *)((CARD8*)(rhd.MMIOBase + (offset)))
|
||||||
|
|
||||||
extern inline void
|
extern inline void
|
||||||
OUTREG(CARD16 offset, CARD32 value)
|
OUTREG(u16_t offset, u32_t value)
|
||||||
{
|
{
|
||||||
*(volatile CARD32 *)((CARD8 *)(rhd.MMIOBase + offset)) = value;
|
*(volatile u32_t *)((u8_t *)(rhd.MMIOBase + offset)) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern inline CARD32 _RHDRegRead(RHDPtr rhdPtr, CARD16 offset)
|
extern inline u32_t _RHDRegRead(RHDPtr rhdPtr, u16_t offset)
|
||||||
{
|
{
|
||||||
return *(volatile CARD32 *)((CARD8*)(rhdPtr->MMIOBase + offset));
|
return *(volatile u32_t *)((u8_t*)(rhdPtr->MMIOBase + offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
extern inline void
|
extern inline void
|
||||||
MASKREG(CARD16 offset, CARD32 value, CARD32 mask)
|
MASKREG(u16_t offset, u32_t value, u32_t mask)
|
||||||
{
|
{
|
||||||
CARD32 tmp;
|
u32_t tmp;
|
||||||
|
|
||||||
tmp = INREG(offset);
|
tmp = INREG(offset);
|
||||||
tmp &= ~mask;
|
tmp &= ~mask;
|
||||||
@ -289,15 +298,15 @@ MASKREG(CARD16 offset, CARD32 value, CARD32 mask)
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern inline void
|
extern inline void
|
||||||
_RHDRegWrite(RHDPtr rhdPtr, CARD16 offset, CARD32 value)
|
_RHDRegWrite(RHDPtr rhdPtr, u16_t offset, u32_t value)
|
||||||
{
|
{
|
||||||
*(volatile CARD32 *)((CARD8 *)(rhdPtr->MMIOBase + offset)) = value;
|
*(volatile u32_t *)((u8_t *)(rhdPtr->MMIOBase + offset)) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern inline void
|
extern inline void
|
||||||
_RHDRegMask(RHDPtr rhdPtr, CARD16 offset, CARD32 value, CARD32 mask)
|
_RHDRegMask(RHDPtr rhdPtr, u16_t offset, u32_t value, u32_t mask)
|
||||||
{
|
{
|
||||||
CARD32 tmp;
|
u32_t tmp;
|
||||||
|
|
||||||
tmp = _RHDRegRead(rhdPtr, offset);
|
tmp = _RHDRegRead(rhdPtr, offset);
|
||||||
tmp &= ~mask;
|
tmp &= ~mask;
|
||||||
@ -325,15 +334,15 @@ int rhdInitHeap(RHDPtr rhdPtr);
|
|||||||
#pragma pack (push,1)
|
#pragma pack (push,1)
|
||||||
typedef struct s_cursor
|
typedef struct s_cursor
|
||||||
{
|
{
|
||||||
u32 magic; // 'CURS'
|
u32_t magic; // 'CURS'
|
||||||
void (*destroy)(struct s_cursor*); // destructor
|
void (*destroy)(struct s_cursor*); // destructor
|
||||||
u32 fd; // next object in list
|
u32_t fd; // next object in list
|
||||||
u32 bk; // prev object in list
|
u32_t bk; // prev object in list
|
||||||
u32 pid; // owner id
|
u32_t pid; // owner id
|
||||||
|
|
||||||
void *base; // allocated memory
|
void *base; // allocated memory
|
||||||
u32 hot_x; // hotspot coords
|
u32_t hot_x; // hotspot coords
|
||||||
u32 hot_y;
|
u32_t hot_y;
|
||||||
}cursor_t;
|
}cursor_t;
|
||||||
#pragma pack (pop)
|
#pragma pack (pop)
|
||||||
|
|
||||||
@ -341,7 +350,7 @@ typedef struct s_cursor
|
|||||||
#define LOAD_FROM_MEM 1
|
#define LOAD_FROM_MEM 1
|
||||||
#define LOAD_INDIRECT 2
|
#define LOAD_INDIRECT 2
|
||||||
|
|
||||||
cursor_t *create_cursor(u32 pid, void *src, u32 flags);
|
cursor_t *create_cursor(u32_t pid, void *src, u32_t flags);
|
||||||
void __stdcall copy_cursor(void *img, void *src);
|
void __stdcall copy_cursor(void *img, void *src);
|
||||||
void destroy_cursor(cursor_t *cursor);
|
void destroy_cursor(cursor_t *cursor);
|
||||||
void __destroy_cursor(cursor_t *cursor); // wrap
|
void __destroy_cursor(cursor_t *cursor); // wrap
|
||||||
|
181
programs/system/drivers/ati2d/clip.inc
Normal file
181
programs/system/drivers/ati2d/clip.inc
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
|
||||||
|
#define CLIP_TOP 1
|
||||||
|
#define CLIP_BOTTOM 2
|
||||||
|
#define CLIP_RIGHT 4
|
||||||
|
#define CLIP_LEFT 8
|
||||||
|
|
||||||
|
|
||||||
|
static int _L1OutCode( clip_t *clip, int x, int y )
|
||||||
|
/*=================================
|
||||||
|
|
||||||
|
Verify that a point is inside or outside the active viewport. */
|
||||||
|
{
|
||||||
|
int flag;
|
||||||
|
|
||||||
|
flag = 0;
|
||||||
|
if( x < clip->xmin ) {
|
||||||
|
flag |= CLIP_LEFT;
|
||||||
|
} else if( x > clip->xmax ) {
|
||||||
|
flag |= CLIP_RIGHT;
|
||||||
|
}
|
||||||
|
if( y < clip->ymin ) {
|
||||||
|
flag |= CLIP_TOP;
|
||||||
|
} else if( y > clip->ymax ) {
|
||||||
|
flag |= CLIP_BOTTOM;
|
||||||
|
}
|
||||||
|
return( flag );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void line_inter( int * x1, int* y1, int x2, int y2, int x )
|
||||||
|
/*===========================================================================
|
||||||
|
|
||||||
|
Find the intersection of a line with a boundary of the viewport.
|
||||||
|
(x1, y1) is outside and ( x2, y2 ) is inside the viewport.
|
||||||
|
NOTE : the signs of denom and ( x - *x1 ) cancel out during division
|
||||||
|
so make both of them positive before rounding. */
|
||||||
|
{
|
||||||
|
int numer;
|
||||||
|
int denom;
|
||||||
|
|
||||||
|
denom = abs( x2 - *x1 );
|
||||||
|
numer = 2L * (long)( y2 - *y1 ) * abs( x - *x1 );
|
||||||
|
if( numer > 0 ) {
|
||||||
|
numer += denom; /* round to closest pixel */
|
||||||
|
} else {
|
||||||
|
numer -= denom;
|
||||||
|
}
|
||||||
|
*y1 += numer / ( denom << 1 );
|
||||||
|
*x1 = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int LineClip( clip_t *clip, int *x1, int *y1, int *x2, int *y2 )
|
||||||
|
/*=============================================================
|
||||||
|
|
||||||
|
Clips the line with end points (x1,y1) and (x2,y2) to the active
|
||||||
|
viewport using the Cohen-Sutherland clipping algorithm. Return the
|
||||||
|
clipped coordinates and a decision drawing flag. */
|
||||||
|
{
|
||||||
|
int flag1;
|
||||||
|
int flag2;
|
||||||
|
|
||||||
|
flag1 = _L1OutCode( clip, *x1, *y1 );
|
||||||
|
flag2 = _L1OutCode( clip, *x2, *y2 );
|
||||||
|
for( ;; ) {
|
||||||
|
if( flag1 & flag2 ) break; /* trivially outside */
|
||||||
|
if( flag1 == flag2 ) break; /* completely inside */
|
||||||
|
if( flag1 == 0 ) { /* first point inside */
|
||||||
|
if( flag2 & CLIP_TOP ) {
|
||||||
|
line_inter( y2, x2, *y1, *x1, clip->ymin );
|
||||||
|
} else if( flag2 & CLIP_BOTTOM ) {
|
||||||
|
line_inter( y2, x2, *y1, *x1, clip->ymax );
|
||||||
|
} else if( flag2 & CLIP_RIGHT ) {
|
||||||
|
line_inter( x2, y2, *x1, *y1, clip->xmax );
|
||||||
|
} else if( flag2 & CLIP_LEFT ) {
|
||||||
|
line_inter( x2, y2, *x1, *y1, clip->xmin );
|
||||||
|
}
|
||||||
|
flag2 = _L1OutCode( clip, *x2, *y2 );
|
||||||
|
} else { /* second point inside */
|
||||||
|
if( flag1 & CLIP_TOP ) {
|
||||||
|
line_inter( y1, x1, *y2, *x2, clip->ymin );
|
||||||
|
} else if( flag1 & CLIP_BOTTOM ) {
|
||||||
|
line_inter( y1, x1, *y2, *x2, clip->ymax );
|
||||||
|
} else if( flag1 & CLIP_RIGHT ) {
|
||||||
|
line_inter( x1, y1, *x2, *y2, clip->xmax );
|
||||||
|
} else if( flag1 & CLIP_LEFT ) {
|
||||||
|
line_inter( x1, y1, *x2, *y2, clip->xmin );
|
||||||
|
}
|
||||||
|
flag1 = _L1OutCode( clip, *x1, *y1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return( flag1 & flag2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void block_inter( clip_t *clip, int *x, int *y, int flag )
|
||||||
|
/*======================================================
|
||||||
|
|
||||||
|
Find the intersection of a block with a boundary of the viewport. */
|
||||||
|
{
|
||||||
|
if( flag & CLIP_TOP ) {
|
||||||
|
*y = clip->ymin;
|
||||||
|
} else if( flag & CLIP_BOTTOM ) {
|
||||||
|
*y = clip->ymax;
|
||||||
|
} else if( flag & CLIP_RIGHT ) {
|
||||||
|
*x = clip->xmax;
|
||||||
|
} else if( flag & CLIP_LEFT ) {
|
||||||
|
*x = clip->xmin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int BlockClip(clip_t *clip, int *x1, int *y1, int *x2, int* y2 )
|
||||||
|
/*==============================================================
|
||||||
|
|
||||||
|
Clip a block with opposite corners (x1,y1) and (x2,y2) to the
|
||||||
|
active viewport based on the Cohen-Sutherland algorithm for line
|
||||||
|
clipping. Return the clipped coordinates and a decision drawing
|
||||||
|
flag ( 0 draw : 1 don't draw ). */
|
||||||
|
{
|
||||||
|
int flag1;
|
||||||
|
int flag2;
|
||||||
|
|
||||||
|
flag1 = _L1OutCode( clip, *x1, *y1 );
|
||||||
|
flag2 = _L1OutCode( clip, *x2, *y2 );
|
||||||
|
for( ;; ) {
|
||||||
|
if( flag1 & flag2 ) break; /* trivially outside */
|
||||||
|
if( flag1 == flag2 ) break; /* completely inside */
|
||||||
|
if( flag1 == 0 ) {
|
||||||
|
block_inter( clip, x2, y2, flag2 );
|
||||||
|
flag2 = _L1OutCode( clip, *x2, *y2 );
|
||||||
|
} else {
|
||||||
|
block_inter( clip, x1, y1, flag1 );
|
||||||
|
flag1 = _L1OutCode( clip, *x1, *y1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return( flag1 & flag2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int blit_clip(clip_t *dst_clip,int *dst_x,int *dst_y,
|
||||||
|
clip_t *src_clip,int *src_x, int *src_y,
|
||||||
|
int *w, int *h)
|
||||||
|
{
|
||||||
|
int sx0, sy0, sx1, sy1;
|
||||||
|
|
||||||
|
sx0 = *src_x;
|
||||||
|
sy0 = *src_y;
|
||||||
|
|
||||||
|
sx1 = sx0 + *w - 1;
|
||||||
|
sy1 = sy0 + *h - 1;
|
||||||
|
|
||||||
|
|
||||||
|
if( ! BlockClip( src_clip, &sx0, &sy0, &sx1, &sy1))
|
||||||
|
{
|
||||||
|
int dx0, dy0, dx1, dy1;
|
||||||
|
|
||||||
|
dx0 = *dst_x + sx0 - *src_x;
|
||||||
|
dy0 = *dst_y + sy0 - *src_y;
|
||||||
|
|
||||||
|
dx1 = dx0 + sx1 - sx0;
|
||||||
|
dy1 = dy0 + sy1 - sy0;
|
||||||
|
|
||||||
|
if( ! BlockClip( dst_clip, &dx0, &dy0, &dx1, &dy1))
|
||||||
|
{
|
||||||
|
*w = dx1 - dx0 + 1;
|
||||||
|
*h = dy1 - dy0 + 1;
|
||||||
|
|
||||||
|
*src_x += dx0 - *dst_x;
|
||||||
|
*src_y += dy0 - *dst_y;
|
||||||
|
|
||||||
|
*dst_x = dx0;
|
||||||
|
*dst_y = dx0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
};
|
||||||
|
|
@ -1,221 +0,0 @@
|
|||||||
|
|
||||||
#define OS_BASE 0x80000000
|
|
||||||
|
|
||||||
#include "xmd.h"
|
|
||||||
|
|
||||||
#define NULL (void*)(0)
|
|
||||||
|
|
||||||
#define FALSE 0
|
|
||||||
#define TRUE 1
|
|
||||||
|
|
||||||
typedef void *pointer;
|
|
||||||
|
|
||||||
typedef unsigned int Bool;
|
|
||||||
|
|
||||||
typedef unsigned char u8;
|
|
||||||
typedef unsigned short u16;
|
|
||||||
typedef unsigned int u32;
|
|
||||||
|
|
||||||
typedef unsigned char u8_t;
|
|
||||||
typedef unsigned short u16_t;
|
|
||||||
typedef unsigned int u32_t;
|
|
||||||
|
|
||||||
typedef unsigned int memType;
|
|
||||||
typedef unsigned int size_t;
|
|
||||||
|
|
||||||
typedef struct { float hi, lo; } range;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned handle;
|
|
||||||
unsigned io_code;
|
|
||||||
void *input;
|
|
||||||
int inp_size;
|
|
||||||
void *output;
|
|
||||||
int out_size;
|
|
||||||
}ioctl_t;
|
|
||||||
|
|
||||||
typedef int (_stdcall *srv_proc_t)(ioctl_t *);
|
|
||||||
|
|
||||||
#define ERR_OK 0
|
|
||||||
#define ERR_PARAM -1
|
|
||||||
|
|
||||||
|
|
||||||
u32_t __stdcall drvEntry(int)__asm__("_drvEntry");
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#define STDCALL __attribute__ ((stdcall)) __attribute__ ((dllimport))
|
|
||||||
#define IMPORT __attribute__ ((dllimport))
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#define PG_SW 0x003
|
|
||||||
#define PG_NOCACHE 0x018
|
|
||||||
|
|
||||||
void* STDCALL AllocKernelSpace(size_t size)__asm__("AllocKernelSpace");
|
|
||||||
void* STDCALL KernelAlloc(size_t size)__asm__("KernelAlloc");
|
|
||||||
void* STDCALL UserAlloc(size_t size)__asm__("UserAlloc");
|
|
||||||
int STDCALL UserFree(void *mem)__asm__("UserFree");
|
|
||||||
|
|
||||||
|
|
||||||
int KernelFree(void *);
|
|
||||||
|
|
||||||
void* STDCALL CreateRingBuffer(size_t size, u32 map)__asm__("CreateRingBuffer");
|
|
||||||
|
|
||||||
u32 STDCALL RegService(char *name, srv_proc_t proc)__asm__("RegService");
|
|
||||||
|
|
||||||
//void *CreateObject(u32 pid, size_t size);
|
|
||||||
//void *DestroyObject(void *obj);
|
|
||||||
|
|
||||||
CARD32 STDCALL MapIoMem(CARD32 Base,CARD32 size,CARD32 flags)__asm__("MapIoMem");
|
|
||||||
|
|
||||||
static inline u32_t GetPgAddr(void *mem)
|
|
||||||
{
|
|
||||||
u32_t retval;
|
|
||||||
|
|
||||||
asm volatile (
|
|
||||||
"call *__imp__GetPgAddr \n\t"
|
|
||||||
:"=eax" (retval)
|
|
||||||
:"a" (mem)
|
|
||||||
);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void CommitPages(void *mem, u32_t page, u32_t size)
|
|
||||||
{
|
|
||||||
size = (size+4095) & ~4095;
|
|
||||||
asm volatile (
|
|
||||||
"call *__imp__CommitPages"
|
|
||||||
:
|
|
||||||
:"a" (page), "b"(mem),"c"(size>>12)
|
|
||||||
:"edx"
|
|
||||||
);
|
|
||||||
asm volatile (
|
|
||||||
""
|
|
||||||
:
|
|
||||||
:
|
|
||||||
:"eax","ebx","ecx"
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
static inline void UnmapPages(void *mem, size_t size)
|
|
||||||
{
|
|
||||||
size = (size+4095) & ~4095;
|
|
||||||
asm volatile (
|
|
||||||
"call *__imp__UnmapPages"
|
|
||||||
:
|
|
||||||
:"a" (mem), "c"(size>>12)
|
|
||||||
:"edx"
|
|
||||||
);
|
|
||||||
asm volatile ("":::"eax","ecx");
|
|
||||||
|
|
||||||
}
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
u32 PciApi(int cmd);
|
|
||||||
|
|
||||||
u8 STDCALL PciRead8 (u32 bus, u32 devfn, u32 reg)__asm__("PciRead8");
|
|
||||||
u16 STDCALL PciRead16(u32 bus, u32 devfn, u32 reg)__asm__("PciRead16");
|
|
||||||
u32 STDCALL PciRead32(u32 bus, u32 devfn, u32 reg)__asm__("PciRead32");
|
|
||||||
|
|
||||||
u32 STDCALL PciWrite8 (u32 bus, u32 devfn, u32 reg,u8 val) __asm__("PciWrite8");
|
|
||||||
u32 STDCALL PciWrite16(u32 bus, u32 devfn, u32 reg,u16 val)__asm__("PciWrite16");
|
|
||||||
u32 STDCALL PciWrite32(u32 bus, u32 devfn, u32 reg,u32 val)__asm__("PciWrite32");
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#define SysMsgBoardStr __SysMsgBoardStr
|
|
||||||
#define PciApi __PciApi
|
|
||||||
//#define RegService __RegService
|
|
||||||
#define CreateObject __CreateObject
|
|
||||||
#define DestroyObject __DestroyObject
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void *malloc(size_t);
|
|
||||||
void *calloc( size_t num, size_t size );
|
|
||||||
void *realloc(void*, size_t);
|
|
||||||
void free(void*);
|
|
||||||
|
|
||||||
#define kmalloc malloc
|
|
||||||
#define kfree free
|
|
||||||
|
|
||||||
#define xcalloc calloc
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
int memcmp(const void *s1, const void *s2, size_t n);
|
|
||||||
void * memcpy(void * _dest, const void *_src, size_t _n);
|
|
||||||
char * strcpy(char *to, const char *from);
|
|
||||||
char * strcat(char *s, const char *append);
|
|
||||||
int strcmp(const char *s1, const char *s2);
|
|
||||||
size_t strlen(const char *str);
|
|
||||||
char * strdup(const char *_s);
|
|
||||||
char * strchr(const char *s, int c);
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
int snprintf(char *s, size_t n, const char *format, ...);
|
|
||||||
int printf(const char* format, ...);
|
|
||||||
int dbg_open(char *path);
|
|
||||||
int dbgprintf(const char* format, ...);
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
void usleep(u32 delay);
|
|
||||||
|
|
||||||
static int __attribute__ ((always_inline))
|
|
||||||
abs (int i)
|
|
||||||
{
|
|
||||||
return i < 0 ? -i : i;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __attribute__ ((always_inline))
|
|
||||||
__clear (void * dst, unsigned len)
|
|
||||||
{ u32 tmp;
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"xorl %%eax, %%eax \n\t"
|
|
||||||
"cld \n\t"
|
|
||||||
"rep stosb \n"
|
|
||||||
:"=c"(tmp),"=D"(tmp)
|
|
||||||
:"c"(len),"D"(dst)
|
|
||||||
:"eax"
|
|
||||||
);
|
|
||||||
asm volatile ("":::"ecx","edi");
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static inline u32 safe_cli(void)
|
|
||||||
{
|
|
||||||
u32 tmp;
|
|
||||||
asm volatile (
|
|
||||||
"pushf\n\t"
|
|
||||||
"popl %0\n\t"
|
|
||||||
"cli\n"
|
|
||||||
: "=r" (tmp)
|
|
||||||
);
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void safe_sti(u32 ipl)
|
|
||||||
{
|
|
||||||
asm volatile (
|
|
||||||
"pushl %0\n\t"
|
|
||||||
"popf\n"
|
|
||||||
: : "r" (ipl)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
int _stdcall srv_cursor(ioctl_t *io);
|
|
||||||
int _stdcall srv_2d(ioctl_t *io);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,366 +0,0 @@
|
|||||||
|
|
||||||
USE32
|
|
||||||
|
|
||||||
format MS COFF
|
|
||||||
|
|
||||||
include 'proc32.inc'
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
public ___create_cursor
|
|
||||||
public ___destroy_cursor
|
|
||||||
public _copy_cursor@8
|
|
||||||
|
|
||||||
extrn _create_cursor :dword
|
|
||||||
extrn _destroy_cursor :dword
|
|
||||||
extrn _tmp_cursor :dword
|
|
||||||
|
|
||||||
section 'AUTO' code readable executable align 16
|
|
||||||
|
|
||||||
align 16
|
|
||||||
___create_cursor:
|
|
||||||
push ecx
|
|
||||||
push ebx
|
|
||||||
push eax
|
|
||||||
call _create_cursor
|
|
||||||
add esp, 12
|
|
||||||
ret
|
|
||||||
align 16
|
|
||||||
___destroy_cursor:
|
|
||||||
push eax
|
|
||||||
call _destroy_cursor
|
|
||||||
add esp, 4
|
|
||||||
ret
|
|
||||||
align 16
|
|
||||||
proc _copy_cursor@8 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, _tmp_cursor
|
|
||||||
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, _tmp_cursor
|
|
||||||
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, _tmp_cursor
|
|
||||||
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, _tmp_cursor
|
|
||||||
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, _tmp_cursor
|
|
||||||
mov edi, [dst]
|
|
||||||
mov ebx, 32
|
|
||||||
cld
|
|
||||||
@@:
|
|
||||||
mov ecx, 32
|
|
||||||
rep movsd
|
|
||||||
add edi, 128
|
|
||||||
dec ebx
|
|
||||||
jnz @B
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
macro rdr op1, op2
|
|
||||||
{
|
|
||||||
mov op1, [edi+op2]
|
|
||||||
}
|
|
||||||
|
|
||||||
macro wrr dest, src
|
|
||||||
{
|
|
||||||
mov dword [edi+dest], src
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
;public _r500_SelectCursor@4
|
|
||||||
align 4
|
|
||||||
proc _r500_SelectCursor@4 stdcall,hcursor:dword
|
|
||||||
|
|
||||||
mov ecx, [hcursor]
|
|
||||||
mov edi, [_rhd]
|
|
||||||
|
|
||||||
mov edx, [ecx+CURSOR.base]
|
|
||||||
sub edx, [_rhd+3*4]
|
|
||||||
add edx, [_rhd+5*4]
|
|
||||||
mov [edi+0x6408], edx
|
|
||||||
|
|
||||||
mov eax, [ecx+CURSOR.hot_x]
|
|
||||||
shl eax, 16
|
|
||||||
mov ax, word [ecx+CURSOR.hot_y]
|
|
||||||
mov [edi+0x6418], eax
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
;public _r500_SetCursor@12
|
|
||||||
align 4
|
|
||||||
proc _r500_SetCursor@12 stdcall, hcursor:dword, x:dword, y:dword
|
|
||||||
pushfd
|
|
||||||
cli
|
|
||||||
|
|
||||||
mov edx, [_rhd]
|
|
||||||
|
|
||||||
mov eax, [x]
|
|
||||||
shl eax, 16
|
|
||||||
mov ax, word [y]
|
|
||||||
|
|
||||||
mov [edx+0x6414], eax
|
|
||||||
or dword [edx+0x6400], 1
|
|
||||||
|
|
||||||
popfd
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
@ -1,103 +0,0 @@
|
|||||||
|
|
||||||
char tmp_cursor[4096];
|
|
||||||
|
|
||||||
cursor_t *create_cursor(u32 pid, void *src, u32 flags)
|
|
||||||
{
|
|
||||||
void *img;
|
|
||||||
|
|
||||||
cursor_t *cursor = (cursor_t*)CreateObject(pid, 32);
|
|
||||||
|
|
||||||
if(cursor==NULL)
|
|
||||||
return 0;
|
|
||||||
dbgprintf("create object at %x\n", cursor);
|
|
||||||
|
|
||||||
cursor->magic = 0x53525543;
|
|
||||||
cursor->destroy = __destroy_cursor;
|
|
||||||
|
|
||||||
img = rhd_mem_alloc(&rhd,RHD_MEM_FB,64*64*4);
|
|
||||||
if(img==NULL)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
dbgprintf("alloc video memory at %x size %x\n",img,64*64*4);
|
|
||||||
dbgprintf("offset %x\n", img-rhd.FbBase);
|
|
||||||
cursor->base=img;
|
|
||||||
|
|
||||||
if( (u16)flags==LOAD_INDIRECT){
|
|
||||||
cursor->hot_x = (u8)(flags>>24);
|
|
||||||
cursor->hot_y = (u8)(flags>>16);
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"cld \n\t"
|
|
||||||
"rep stosl"
|
|
||||||
:
|
|
||||||
:"a"(0),"c"(64*64),"D"(img)
|
|
||||||
);
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"1: "
|
|
||||||
"movl $32, %%ecx \n\t"
|
|
||||||
"rep stosl \n\t"
|
|
||||||
"addl $128, %%edi \n\t"
|
|
||||||
"decl %%ebx \n\t"
|
|
||||||
"jnz 1b"
|
|
||||||
:
|
|
||||||
:"b"(32),"S"(src),"D"(img)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
cursor->hot_x = *(u16*)((char*)src+10);
|
|
||||||
cursor->hot_y = *(u16*)((char*)src+12);
|
|
||||||
copy_cursor(img, src);
|
|
||||||
dbgprintf("cursor loaded\n");
|
|
||||||
}
|
|
||||||
return cursor;
|
|
||||||
cleanup:
|
|
||||||
DestroyObject(cursor);
|
|
||||||
return NULL;
|
|
||||||
};
|
|
||||||
|
|
||||||
void destroy_cursor(cursor_t *cursor)
|
|
||||||
{
|
|
||||||
if(cursor->base)
|
|
||||||
rhd_mem_free(&rhd,RHD_MEM_FB,cursor->base);
|
|
||||||
DestroyObject(cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __stdcall r500_SelectCursor(cursor_t *cursor)
|
|
||||||
{
|
|
||||||
CARD32 base;
|
|
||||||
|
|
||||||
base = (CARD32)cursor->base - rhd.FbBase;
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"cli"
|
|
||||||
);
|
|
||||||
OUTREG (D1CUR_SURFACE_ADDRESS, rhd.FbIntAddress+base);
|
|
||||||
OUTREG (D1CUR_HOT_SPOT, (cursor->hot_x<<16)|(cursor->hot_y&0xFFFF));
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"sti"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __stdcall r500_SetCursor(cursor_t *cursor, int x, int y)
|
|
||||||
{
|
|
||||||
CARD32 tmp = (x<<16)|(y & 0xFFFF) ;
|
|
||||||
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"pushfl \n\t"
|
|
||||||
"cli"
|
|
||||||
);
|
|
||||||
|
|
||||||
OUTREG(D1CUR_POSITION, tmp);
|
|
||||||
OUTREG(D1CUR_CONTROL, 0x301);
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"popfl"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __stdcall r500_CursorRestore(int x, int y)
|
|
||||||
{};
|
|
||||||
|
|
@ -1,510 +0,0 @@
|
|||||||
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
char sec;
|
|
||||||
char min;
|
|
||||||
char hour;
|
|
||||||
char rsv;
|
|
||||||
}detime_t;
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
char day;
|
|
||||||
char month;
|
|
||||||
short year;
|
|
||||||
}dedate_t;
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
|
||||||
typedef struct
|
|
||||||
{ unsigned attr;
|
|
||||||
unsigned flags;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
detime_t ctime;
|
|
||||||
unsigned cr_time;
|
|
||||||
};
|
|
||||||
union
|
|
||||||
{
|
|
||||||
dedate_t cdate;
|
|
||||||
unsigned cr_date;
|
|
||||||
};
|
|
||||||
union
|
|
||||||
{
|
|
||||||
detime_t atime;
|
|
||||||
unsigned acc_time;
|
|
||||||
};
|
|
||||||
union
|
|
||||||
{
|
|
||||||
dedate_t adate;
|
|
||||||
unsigned acc_date;
|
|
||||||
};
|
|
||||||
union
|
|
||||||
{
|
|
||||||
detime_t mtime;
|
|
||||||
unsigned mod_time;
|
|
||||||
};
|
|
||||||
union
|
|
||||||
{
|
|
||||||
dedate_t mdate;
|
|
||||||
unsigned mod_date;
|
|
||||||
};
|
|
||||||
unsigned size;
|
|
||||||
unsigned size_high;
|
|
||||||
} FILEINFO;
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
char *path;
|
|
||||||
int offset;
|
|
||||||
} dbgfile_t;
|
|
||||||
|
|
||||||
static dbgfile_t dbgfile;
|
|
||||||
|
|
||||||
static void __SysMsgBoardStr(char *text)
|
|
||||||
{
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"call *__imp__SysMsgBoardStr"
|
|
||||||
:
|
|
||||||
:"S" (text)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
int get_fileinfo(const char *path,FILEINFO *info)
|
|
||||||
{
|
|
||||||
int retval;
|
|
||||||
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"movl %%eax, 1(%%esp) \n\t"
|
|
||||||
"pushl %%ebx \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $5 \n\t"
|
|
||||||
"movl %%esp, %%ebx \n\t"
|
|
||||||
"movl $70, %%eax \n\t"
|
|
||||||
"int $0x40 \n\t"
|
|
||||||
"addl $28, %%esp \n\t"
|
|
||||||
:"=eax" (retval)
|
|
||||||
:"a" (path), "b" (info)
|
|
||||||
);
|
|
||||||
return retval;
|
|
||||||
};
|
|
||||||
|
|
||||||
int create_file(const char *path)
|
|
||||||
{
|
|
||||||
int retval;
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"pushl %%ebx \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"movl %%eax, 1(%%esp) \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $2 \n\t"
|
|
||||||
"movl %%esp, %%ebx \n\t"
|
|
||||||
"movl $70, %%eax \n\t"
|
|
||||||
"int $0x40 \n\t"
|
|
||||||
"addl $28, %%esp \n\t"
|
|
||||||
"popl %%ebx"
|
|
||||||
:"=eax" (retval)
|
|
||||||
:"a" (path)
|
|
||||||
);
|
|
||||||
return retval;
|
|
||||||
};
|
|
||||||
|
|
||||||
int set_file_size(const char *path, unsigned size)
|
|
||||||
{
|
|
||||||
int retval;
|
|
||||||
asm __volatile__(
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"movl %%eax, 1(%%esp) \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl %%ebx \n\t"
|
|
||||||
"push $4 \n\t"
|
|
||||||
"movl %%esp, %%ebx \n\t"
|
|
||||||
"movl $70, %%eax \n\t"
|
|
||||||
"int $0x40 \n\t"
|
|
||||||
"addl $28, %%esp \n\t"
|
|
||||||
:"=eax" (retval)
|
|
||||||
:"a" (path), "b" (size)
|
|
||||||
);
|
|
||||||
return retval;
|
|
||||||
};
|
|
||||||
|
|
||||||
int write_file(const char *path,const void *buff,
|
|
||||||
unsigned offset,unsigned count,unsigned *writes)
|
|
||||||
{
|
|
||||||
int retval;
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"movl %%eax, 1(%%esp) \n\t"
|
|
||||||
"pushl %%ebx \n\t"
|
|
||||||
"pushl %%edx \n\t"
|
|
||||||
"pushl $0 \n\t"
|
|
||||||
"pushl %%ecx \n\t"
|
|
||||||
"pushl $3 \n\t"
|
|
||||||
"movl %%esp, %%ebx \n\t"
|
|
||||||
"mov $70, %%eax \n\t"
|
|
||||||
"int $0x40 \n\t"
|
|
||||||
"testl %%esi, %%esi \n\t"
|
|
||||||
"jz 1f \n\t"
|
|
||||||
"movl %%ebx, (%%esi) \n\t"
|
|
||||||
"1:"
|
|
||||||
"addl $28, %%esp \n\t"
|
|
||||||
:"=eax" (retval)
|
|
||||||
:"a"(path),"b"(buff),"c"(offset),"d"(count),"S"(writes)
|
|
||||||
);
|
|
||||||
return retval;
|
|
||||||
};
|
|
||||||
|
|
||||||
char * _putc(char *s, int c)
|
|
||||||
{
|
|
||||||
int i=0;
|
|
||||||
|
|
||||||
switch(c)
|
|
||||||
{
|
|
||||||
case '\n':
|
|
||||||
*s++ = '\r';
|
|
||||||
*s++ = '\n';
|
|
||||||
|
|
||||||
case '\r':
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '\t':
|
|
||||||
do
|
|
||||||
{
|
|
||||||
*s++ = ' ';
|
|
||||||
}
|
|
||||||
while (i % 8 != 0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
*s++ = c;
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *print_string(char *buff, char* s)
|
|
||||||
{
|
|
||||||
int i=0;
|
|
||||||
char c;
|
|
||||||
|
|
||||||
while (c=*s++)
|
|
||||||
{
|
|
||||||
switch(c)
|
|
||||||
{
|
|
||||||
case '\r':
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '\n':
|
|
||||||
*buff++ = '\r';
|
|
||||||
*buff++ = '\n';
|
|
||||||
i=0;
|
|
||||||
|
|
||||||
case '\t':
|
|
||||||
do
|
|
||||||
{
|
|
||||||
*buff++ = ' ';
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
while (i % 8 != 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
*buff++ = c;
|
|
||||||
i++;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return buff;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *print_dec(char *buff,int val)
|
|
||||||
{
|
|
||||||
char dbuff[16];
|
|
||||||
int i = 14;
|
|
||||||
|
|
||||||
dbuff[15] = '\0';
|
|
||||||
do
|
|
||||||
{
|
|
||||||
dbuff[i] = (val % 10) + '0';
|
|
||||||
val = val / 10;
|
|
||||||
i--;
|
|
||||||
} while(val);
|
|
||||||
|
|
||||||
return print_string(buff, &dbuff[i+1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char hexchars[] = "0123456789ABCDEF";
|
|
||||||
|
|
||||||
char *print_hex(char *buff,u32 val)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i=sizeof(u32)*8-4; i >= 0; i -= 4)
|
|
||||||
buff = _putc(buff,hexchars[((u32)val >> i) & 0xF]);
|
|
||||||
return buff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define va_start(v,l) __builtin_va_start(v,l)
|
|
||||||
#define va_end(v) __builtin_va_end(v)
|
|
||||||
#define va_arg(v,l) __builtin_va_arg(v,l)
|
|
||||||
#if !defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 199900L
|
|
||||||
#define va_copy(d,s) __builtin_va_copy(d,s)
|
|
||||||
#endif
|
|
||||||
#define __va_copy(d,s) __builtin_va_copy(d,s)
|
|
||||||
|
|
||||||
typedef __builtin_va_list __gnuc_va_list;
|
|
||||||
typedef __gnuc_va_list va_list;
|
|
||||||
|
|
||||||
#define arg(x) va_arg (ap, u32)
|
|
||||||
|
|
||||||
char txtbuf[128];
|
|
||||||
|
|
||||||
int printf(const char* format, ...)
|
|
||||||
{
|
|
||||||
u32 ret = 1;
|
|
||||||
u32 i = 0;
|
|
||||||
char *sbuf = txtbuf;
|
|
||||||
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start (ap, format);
|
|
||||||
|
|
||||||
if (format == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
while (*format)
|
|
||||||
{
|
|
||||||
switch (*(format))
|
|
||||||
{
|
|
||||||
case '%':
|
|
||||||
next_fmt:
|
|
||||||
switch (*(++format))
|
|
||||||
{
|
|
||||||
case 'l': case '-':
|
|
||||||
case '0': case '1': case '2': case '3': case '4':
|
|
||||||
case '5': case '6': case '7': case '8': case '9':
|
|
||||||
goto next_fmt;
|
|
||||||
|
|
||||||
case 'c':
|
|
||||||
sbuf = _putc (sbuf,arg (i));
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
sbuf = print_dec (sbuf,arg (i));
|
|
||||||
break;
|
|
||||||
case 'p':
|
|
||||||
case 'x':
|
|
||||||
sbuf = print_hex (sbuf,(u32) arg (i));
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
sbuf = print_string (sbuf,(char*) arg (i));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sbuf = print_string (sbuf,"?");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
sbuf = _putc (sbuf,*format);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
format++;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_end (ap);
|
|
||||||
*sbuf=0;
|
|
||||||
SysMsgBoardStr(txtbuf);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int dbg_open(char *path)
|
|
||||||
{
|
|
||||||
FILEINFO info;
|
|
||||||
|
|
||||||
dbgfile.offset = 0;
|
|
||||||
|
|
||||||
if(get_fileinfo(path,&info))
|
|
||||||
{
|
|
||||||
if(!create_file(path))
|
|
||||||
{
|
|
||||||
dbgfile.path = path;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
};
|
|
||||||
set_file_size(path, 0);
|
|
||||||
dbgfile.path = path;
|
|
||||||
dbgfile.offset = 0;
|
|
||||||
return TRUE;
|
|
||||||
};
|
|
||||||
|
|
||||||
int vsnprintf(char *s, size_t n, const char *format, va_list arg);
|
|
||||||
|
|
||||||
int dbgprintf(const char* format, ...)
|
|
||||||
{
|
|
||||||
unsigned writes;
|
|
||||||
|
|
||||||
int len=0;
|
|
||||||
// char *sbuf = txtbuf;
|
|
||||||
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, format);
|
|
||||||
if (format)
|
|
||||||
len = vsnprintf(txtbuf, 128, format, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
SysMsgBoardStr(txtbuf);
|
|
||||||
|
|
||||||
if(dbgfile.path)
|
|
||||||
{
|
|
||||||
write_file(dbgfile.path,txtbuf,dbgfile.offset,len,&writes);
|
|
||||||
dbgfile.offset+=writes;
|
|
||||||
};
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
int xf86DrvMsg(int skip, int code, const char* format, ...)
|
|
||||||
{
|
|
||||||
unsigned writes;
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
int len=0;
|
|
||||||
|
|
||||||
va_start(ap, format);
|
|
||||||
if (format)
|
|
||||||
len = vsnprintf(txtbuf, 128, format, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
SysMsgBoardStr(txtbuf);
|
|
||||||
|
|
||||||
if(dbgfile.path)
|
|
||||||
{
|
|
||||||
write_file(dbgfile.path,txtbuf,dbgfile.offset,len,&writes);
|
|
||||||
dbgfile.offset+=writes;
|
|
||||||
};
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
int snprintf(char *s, size_t n, const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
int retval;
|
|
||||||
|
|
||||||
va_start(ap, format);
|
|
||||||
retval = vsnprintf(s, n, format, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
int snprintf(char *buf,int count, const char* format, ...)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
|
|
||||||
// u32 ret = 1;
|
|
||||||
u32 i = 0;
|
|
||||||
char *sbuf = buf;
|
|
||||||
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start (ap, format);
|
|
||||||
|
|
||||||
if (format == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
while (*format)
|
|
||||||
{
|
|
||||||
switch (*(format))
|
|
||||||
{
|
|
||||||
case '%':
|
|
||||||
next_fmt:
|
|
||||||
switch (*(++format))
|
|
||||||
{
|
|
||||||
case 'l': case '-':
|
|
||||||
case '0': case '1': case '2': case '3': case '4':
|
|
||||||
case '5': case '6': case '7': case '8': case '9':
|
|
||||||
goto next_fmt;
|
|
||||||
|
|
||||||
case 'c':
|
|
||||||
sbuf = _putc (sbuf,arg (i));
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
sbuf = print_dec (sbuf,arg (i));
|
|
||||||
break;
|
|
||||||
case 'p':
|
|
||||||
case 'x':
|
|
||||||
sbuf = print_hex (sbuf,(u32) arg (i));
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
sbuf = print_string (sbuf,(char*) arg (i));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sbuf = print_string (sbuf,"?");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
sbuf = _putc (sbuf,*format);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
format++;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_end (ap);
|
|
||||||
*sbuf=0;
|
|
||||||
len = sbuf-txtbuf;
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
char *
|
|
||||||
RhdAppendString(char *s1, const char *s2)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (!s2)
|
|
||||||
return s1;
|
|
||||||
else
|
|
||||||
if (!s1)
|
|
||||||
return strdup(s2);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int len = strlen(s1) + strlen(s2) + 1;
|
|
||||||
char *result = (char *)kmalloc(len);
|
|
||||||
|
|
||||||
if (!result) return s1;
|
|
||||||
|
|
||||||
strcpy(result,s1);
|
|
||||||
strcat(result,s2);
|
|
||||||
kfree(s1);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
|||||||
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
void usleep(u32 delay)
|
|
||||||
{
|
|
||||||
if(!delay) delay++;
|
|
||||||
delay*=2000;
|
|
||||||
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"1:\n\t"
|
|
||||||
"xorl %%eax, %%eax \n\t"
|
|
||||||
"cpuid \n\t"
|
|
||||||
"decl %%edi \n\t"
|
|
||||||
"jnz 1b"
|
|
||||||
:
|
|
||||||
:"D"(delay)
|
|
||||||
:"eax","ebx","ecx","edx"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 __PciApi(int cmd)
|
|
||||||
{
|
|
||||||
u32 retval;
|
|
||||||
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"call *__imp__PciApi"
|
|
||||||
:"=eax" (retval)
|
|
||||||
:"a" (cmd)
|
|
||||||
:"memory"
|
|
||||||
);
|
|
||||||
return retval;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
u32 __RegService(char *name, srv_proc_t proc)
|
|
||||||
{
|
|
||||||
u32 retval;
|
|
||||||
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"pushl %%eax \n\t"
|
|
||||||
"pushl %%ebx \n\t"
|
|
||||||
"call *__imp__RegService \n\t"
|
|
||||||
:"=eax" (retval)
|
|
||||||
:"a" (proc), "b" (name)
|
|
||||||
:"memory"
|
|
||||||
);
|
|
||||||
return retval;
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
void *__CreateObject(u32 pid, size_t size)
|
|
||||||
{
|
|
||||||
void *retval;
|
|
||||||
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"call *__imp__CreateObject \n\t"
|
|
||||||
:"=eax" (retval)
|
|
||||||
:"a" (size),"b"(pid)
|
|
||||||
:"esi","edi", "memory"
|
|
||||||
);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *__DestroyObject(void *obj)
|
|
||||||
{
|
|
||||||
asm __volatile__
|
|
||||||
(
|
|
||||||
"call *__imp__DestroyObject"
|
|
||||||
:
|
|
||||||
:"a" (obj)
|
|
||||||
:"ebx","edx","esi","edi", "memory"
|
|
||||||
);
|
|
||||||
}
|
|
@ -4,7 +4,7 @@ static Bool
|
|||||||
rhdMapMMIO(RHDPtr rhdPtr)
|
rhdMapMMIO(RHDPtr rhdPtr)
|
||||||
{
|
{
|
||||||
rhdPtr->MMIOMapSize = 1 << rhdPtr->memsize[RHD_MMIO_BAR];
|
rhdPtr->MMIOMapSize = 1 << rhdPtr->memsize[RHD_MMIO_BAR];
|
||||||
rhdPtr->MMIOBase = MapIoMem(rhdPtr->memBase[RHD_MMIO_BAR],
|
rhdPtr->MMIOBase = MapIoMem((void*)rhdPtr->memBase[RHD_MMIO_BAR],
|
||||||
rhdPtr->MMIOMapSize,PG_SW+PG_NOCACHE);
|
rhdPtr->MMIOMapSize,PG_SW+PG_NOCACHE);
|
||||||
if( rhdPtr->MMIOBase==0)
|
if( rhdPtr->MMIOBase==0)
|
||||||
return 0;
|
return 0;
|
||||||
@ -15,17 +15,16 @@ rhdMapMMIO(RHDPtr rhdPtr)
|
|||||||
|
|
||||||
#define RADEON_NB_TOM 0x15c
|
#define RADEON_NB_TOM 0x15c
|
||||||
|
|
||||||
static CARD32
|
static size_t rhdGetVideoRamSize(RHDPtr rhdPtr)
|
||||||
rhdGetVideoRamSize(RHDPtr rhdPtr)
|
|
||||||
{
|
{
|
||||||
CARD32 RamSize, BARSize;
|
size_t RamSize, BARSize;
|
||||||
|
|
||||||
if (rhdPtr->ChipSet == RHD_RS690)
|
if (rhdPtr->ChipSet == RHD_RS690)
|
||||||
RamSize = (_RHDRegRead(rhdPtr, R5XX_CONFIG_MEMSIZE))>>10;
|
RamSize = (_RHDRegRead(rhdPtr, R5XX_CONFIG_MEMSIZE))>>10;
|
||||||
else
|
else
|
||||||
if (rhdPtr->IsIGP)
|
if (rhdPtr->IsIGP)
|
||||||
{
|
{
|
||||||
CARD32 tom = _RHDRegRead(rhdPtr, RADEON_NB_TOM);
|
u32_t tom = _RHDRegRead(rhdPtr, RADEON_NB_TOM);
|
||||||
RamSize = (((tom >> 16) - (tom & 0xffff) + 1) << 6);
|
RamSize = (((tom >> 16) - (tom & 0xffff) + 1) << 6);
|
||||||
_RHDRegWrite(rhdPtr,R5XX_CONFIG_MEMSIZE, RamSize<<10);
|
_RHDRegWrite(rhdPtr,R5XX_CONFIG_MEMSIZE, RamSize<<10);
|
||||||
}
|
}
|
||||||
@ -118,9 +117,9 @@ error1:
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
};
|
};
|
||||||
|
|
||||||
int KernelFree(void *p)
|
//int KernelFree(void *p)
|
||||||
{
|
//{
|
||||||
|
//
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
@ -4,26 +4,22 @@ FASM = e:/fasm/fasm.exe
|
|||||||
CFLAGS = -c -O2 -fomit-frame-pointer -fno-builtin-printf
|
CFLAGS = -c -O2 -fomit-frame-pointer -fno-builtin-printf
|
||||||
LDRHD = -shared -T ld.x -s --file-alignment 32
|
LDRHD = -shared -T ld.x -s --file-alignment 32
|
||||||
|
|
||||||
HFILES:= ati2d.h \
|
HFILES:= ati2d.h \
|
||||||
common.h \
|
syscall.h \
|
||||||
pci.h \
|
pci.h \
|
||||||
accel_2d.h \
|
accel_2d.h \
|
||||||
r5xx_regs.h \
|
r5xx_regs.h \
|
||||||
microcode.h
|
microcode.h
|
||||||
|
|
||||||
SRC_DEP:= init.c \
|
SRC_DEP:= init.c \
|
||||||
pci.c \
|
pci.c \
|
||||||
ati_mem.c \
|
ati_mem.c \
|
||||||
r500.inc \
|
r500.inc \
|
||||||
accel_2d.inc \
|
pixmap.inc \
|
||||||
|
accel_2d.inc \
|
||||||
accel_3d.inc
|
accel_3d.inc
|
||||||
|
|
||||||
ATI_SRC:= ati2d.c \
|
ATI_SRC:= ati2d.c
|
||||||
malloc.c \
|
|
||||||
helper.c \
|
|
||||||
string.c \
|
|
||||||
dbg.c \
|
|
||||||
memset.asm
|
|
||||||
|
|
||||||
ATI_OBJ:= ati2d.obj
|
ATI_OBJ:= ati2d.obj
|
||||||
|
|
||||||
@ -37,7 +33,7 @@ ATI2D = ati2d.dll
|
|||||||
all: $(ATI2D)
|
all: $(ATI2D)
|
||||||
|
|
||||||
$(ATI2D): $(ATI_OBJ) $(SRC_DEP) $(HFILES) Makefile
|
$(ATI2D): $(ATI_OBJ) $(SRC_DEP) $(HFILES) Makefile
|
||||||
wlink name ati2d.dll SYS nt_dll op offset=0 op nod op maxe=25 op el op STUB=stub.exe op START=_drvEntry @rhd.lk1
|
wlink name ati2d.dll SYS nt_dll lib libdrv op offset=0 op nod op maxe=25 op el op STUB=stub.exe op START=_drvEntry @rhd.lk1
|
||||||
kpack.exe ati2d.dll ati2d.drv
|
kpack.exe ati2d.dll ati2d.drv
|
||||||
|
|
||||||
ati2d.obj : ati2d.c $(SRC_DEP) $(HFILES)
|
ati2d.obj : ati2d.c $(SRC_DEP) $(HFILES)
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,52 +0,0 @@
|
|||||||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
|
||||||
##include<libc/asm.h>
|
|
||||||
# .file "memset.s"
|
|
||||||
.text
|
|
||||||
.global _memset
|
|
||||||
.align 4
|
|
||||||
_memset:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp,%ebp
|
|
||||||
pushl %edi
|
|
||||||
movl 8(%ebp),%edi
|
|
||||||
movl 12(%ebp),%eax
|
|
||||||
movl 16(%ebp),%ecx
|
|
||||||
cld
|
|
||||||
|
|
||||||
# We will handle memsets of <= 15 bytes one byte at a time.
|
|
||||||
# This avoids some extra overhead for small memsets, and
|
|
||||||
# knowing we are setting > 15 bytes eliminates some annoying
|
|
||||||
# checks in the "long move" case.
|
|
||||||
cmpl $15,%ecx
|
|
||||||
jle L3
|
|
||||||
|
|
||||||
# Otherwise, tile the byte value out into %eax.
|
|
||||||
# 0x41 -> 0x41414141, etc.
|
|
||||||
movb %al,%ah
|
|
||||||
movl %eax,%edx
|
|
||||||
sall $16,%eax
|
|
||||||
movw %dx,%ax
|
|
||||||
jmp L2
|
|
||||||
|
|
||||||
# Handle any cruft necessary to get %edi long-aligned.
|
|
||||||
L1: stosb
|
|
||||||
decl %ecx
|
|
||||||
L2: testl $3,%edi
|
|
||||||
jnz L1
|
|
||||||
|
|
||||||
# Now slam out all of the longs.
|
|
||||||
movl %ecx,%edx
|
|
||||||
shrl $2,%ecx
|
|
||||||
rep
|
|
||||||
stosl
|
|
||||||
|
|
||||||
# Finally, handle any trailing cruft. We know the high three bytes
|
|
||||||
# of %ecx must be zero, so just put the "slop count" in the low byte.
|
|
||||||
movb %dl,%cl
|
|
||||||
andb $3,%cl
|
|
||||||
L3: rep
|
|
||||||
stosb
|
|
||||||
popl %edi
|
|
||||||
movl 8(%ebp),%eax
|
|
||||||
leave
|
|
||||||
ret
|
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
static const u32 R300_cp_microcode[][2]={
|
static const u32_t R300_cp_microcode[][2]={
|
||||||
{ 0x4200e000, 0000000000 },
|
{ 0x4200e000, 0000000000 },
|
||||||
{ 0x4000e000, 0000000000 },
|
{ 0x4000e000, 0000000000 },
|
||||||
{ 0x000000ae, 0x00000008 },
|
{ 0x000000ae, 0x00000008 },
|
||||||
@ -258,7 +258,7 @@ static const u32 R300_cp_microcode[][2]={
|
|||||||
{ 0000000000, 0000000000 },
|
{ 0000000000, 0000000000 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const u32 R520_cp_microcode[][2]={
|
static const u32_t R520_cp_microcode[][2]={
|
||||||
{ 0x4200e000, 0000000000 },
|
{ 0x4200e000, 0000000000 },
|
||||||
{ 0x4000e000, 0000000000 },
|
{ 0x4000e000, 0000000000 },
|
||||||
{ 0x00000099, 0x00000008 },
|
{ 0x00000099, 0x00000008 },
|
||||||
|
@ -315,26 +315,26 @@ xf86TokenToString(SymTabPtr table, int token)
|
|||||||
RHDPtr FindPciDevice()
|
RHDPtr FindPciDevice()
|
||||||
{
|
{
|
||||||
const PciChipset_t *dev;
|
const PciChipset_t *dev;
|
||||||
u32 bus, last_bus;
|
u32_t bus, last_bus;
|
||||||
|
|
||||||
if( (last_bus = PciApi(1))==-1)
|
if( (last_bus = PciApi(1))==-1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for(bus=0;bus<=last_bus;bus++)
|
for(bus=0;bus<=last_bus;bus++)
|
||||||
{
|
{
|
||||||
u32 devfn;
|
u32_t devfn;
|
||||||
|
|
||||||
for(devfn=0;devfn<256;devfn++)
|
for(devfn=0;devfn<256;devfn++)
|
||||||
{
|
{
|
||||||
u32 id;
|
u32_t id;
|
||||||
id = PciRead32(bus,devfn, 0);
|
id = PciRead32(bus,devfn, 0);
|
||||||
|
|
||||||
if( (CARD16)id != VENDOR_ATI)
|
if( (u16_t)id != VENDOR_ATI)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( (dev=PciDevMatch(id>>16,RHDPCIchipsets))!=NULL)
|
if( (dev=PciDevMatch(id>>16,RHDPCIchipsets))!=NULL)
|
||||||
{
|
{
|
||||||
CARD32 reg2C;
|
u32_t reg2C;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
rhd.PciDeviceID = (id>>16);
|
rhd.PciDeviceID = (id>>16);
|
||||||
@ -352,7 +352,7 @@ RHDPtr FindPciDevice()
|
|||||||
|
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
CARD32 base;
|
u32_t base;
|
||||||
Bool validSize;
|
Bool validSize;
|
||||||
|
|
||||||
base = PciRead32(bus,devfn, PCI_MAP_REG_START + (i << 2));
|
base = PciRead32(bus,devfn, PCI_MAP_REG_START + (i << 2));
|
||||||
@ -360,12 +360,12 @@ RHDPtr FindPciDevice()
|
|||||||
{
|
{
|
||||||
if (base & PCI_MAP_IO)
|
if (base & PCI_MAP_IO)
|
||||||
{
|
{
|
||||||
rhd.ioBase[i] = (CARD32)PCIGETIO(base);
|
rhd.ioBase[i] = (u32_t)PCIGETIO(base);
|
||||||
rhd.memtype[i] = base & PCI_MAP_IO_ATTR_MASK;
|
rhd.memtype[i] = base & PCI_MAP_IO_ATTR_MASK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rhd.memBase[i] = (CARD32)PCIGETMEMORY(base);
|
rhd.memBase[i] = (u32_t)PCIGETMEMORY(base);
|
||||||
rhd.memtype[i] = base & PCI_MAP_MEMORY_ATTR_MASK;
|
rhd.memtype[i] = base & PCI_MAP_MEMORY_ATTR_MASK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -380,7 +380,7 @@ RHDPtr FindPciDevice()
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const PciChipset_t *PciDevMatch(CARD16 dev,const PciChipset_t *list)
|
const PciChipset_t *PciDevMatch(u16_t dev,const PciChipset_t *list)
|
||||||
{
|
{
|
||||||
while(list->device)
|
while(list->device)
|
||||||
{
|
{
|
||||||
@ -392,13 +392,13 @@ const PciChipset_t *PciDevMatch(CARD16 dev,const PciChipset_t *list)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CARD32 pciGetBaseSize(int bus, int devfn, int index, Bool destructive, Bool *min)
|
u32_t pciGetBaseSize(int bus, int devfn, int index, Bool destructive, Bool *min)
|
||||||
{
|
{
|
||||||
int offset;
|
int offset;
|
||||||
CARD32 addr1;
|
u32_t addr1;
|
||||||
CARD32 addr2;
|
u32_t addr2;
|
||||||
CARD32 mask1;
|
u32_t mask1;
|
||||||
CARD32 mask2;
|
u32_t mask2;
|
||||||
int bits = 0;
|
int bits = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
CARD16 device;
|
u16_t device;
|
||||||
CARD16 ChipSet;
|
u16_t ChipSet;
|
||||||
}PciChipset_t;
|
}PciChipset_t;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
@ -75,5 +75,5 @@ pciTag(int busnum, int devnum, int funcnum)
|
|||||||
return(PCI_MAKE_TAG(busnum,devnum,funcnum));
|
return(PCI_MAKE_TAG(busnum,devnum,funcnum));
|
||||||
}
|
}
|
||||||
|
|
||||||
const PciChipset_t *PciDevMatch(CARD16 dev,const PciChipset_t *list);
|
const PciChipset_t *PciDevMatch(u16_t dev,const PciChipset_t *list);
|
||||||
CARD32 pciGetBaseSize(int bus, int devfn, int index, Bool destructive, Bool *min);
|
u32_t pciGetBaseSize(int bus, int devfn, int index, Bool destructive, Bool *min);
|
||||||
|
98
programs/system/drivers/ati2d/pixmap.inc
Normal file
98
programs/system/drivers/ati2d/pixmap.inc
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
|
||||||
|
int CreatePixmap(pixmap_t *io)
|
||||||
|
{
|
||||||
|
local_pixmap_t *pixmap;
|
||||||
|
|
||||||
|
unsigned pitch;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
void *local;
|
||||||
|
|
||||||
|
if( (io->width == 0) || (io->width > 2048)||
|
||||||
|
(io->height == 0)|| (io->height > 2048))
|
||||||
|
{
|
||||||
|
dbgprintf("Invalid pixmap size w:%d h:%d\n", io->width,io->height);
|
||||||
|
return ERR_PARAM;
|
||||||
|
};
|
||||||
|
|
||||||
|
pitch = ((io->width+15)&~15)*4;
|
||||||
|
size = pitch*io->height;
|
||||||
|
|
||||||
|
dbgprintf("pitch = %d\n", pitch);
|
||||||
|
|
||||||
|
local = rhd_mem_alloc(&rhd,RHD_MEM_FB,size) ;
|
||||||
|
if ( !local)
|
||||||
|
{
|
||||||
|
dbgprintf("Not enough memory for pixmap\n");
|
||||||
|
return ERR_PARAM;
|
||||||
|
};
|
||||||
|
|
||||||
|
pixmap = malloc(sizeof(local_pixmap_t));
|
||||||
|
if(!pixmap)
|
||||||
|
{
|
||||||
|
rhd_mem_free(&rhd, RHD_MEM_FB,local);
|
||||||
|
return ERR_PARAM;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
void *mapped;
|
||||||
|
|
||||||
|
size = (size+4095) & ~ 4095;
|
||||||
|
|
||||||
|
if (mapped = UserAlloc(size))
|
||||||
|
{
|
||||||
|
CommitPages(mapped, ((u32_t)local+rhd.PhisBase)|7|(1<<9), size);
|
||||||
|
|
||||||
|
io->mapped = mapped;
|
||||||
|
io->pitch = pitch;
|
||||||
|
io->handle = (u32_t)pixmap;
|
||||||
|
|
||||||
|
pixmap->width = io->width;
|
||||||
|
pixmap->height = io->height;
|
||||||
|
pixmap->format = PICT_a8r8g8b8;
|
||||||
|
pixmap->flags = io->flags;
|
||||||
|
pixmap->pitch = pitch;
|
||||||
|
pixmap->mapped = mapped;
|
||||||
|
pixmap->pitch_offset = ((pitch/64)<<22)| (((u32_t)local+rhd.FbIntAddress)>>10);
|
||||||
|
pixmap->local = local;
|
||||||
|
|
||||||
|
dbgprintf("pixmap.pitch_offset: %x\n", pixmap->pitch_offset);
|
||||||
|
dbgprintf("width: %d height: %d\n",pixmap->width,pixmap->height );
|
||||||
|
dbgprintf("map at %x\n", pixmap->mapped);
|
||||||
|
|
||||||
|
return ERR_OK;
|
||||||
|
};
|
||||||
|
rhd_mem_free(&rhd, RHD_MEM_FB,local);
|
||||||
|
free(pixmap);
|
||||||
|
};
|
||||||
|
return ERR_PARAM;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int DestroyPixmap( pixmap_t *io )
|
||||||
|
{
|
||||||
|
local_pixmap_t *pixmap;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
dbgprintf("Destroy pixmap %x\n", io->handle);
|
||||||
|
|
||||||
|
if(io->handle == -1)
|
||||||
|
return ERR_PARAM;
|
||||||
|
else
|
||||||
|
pixmap = (local_pixmap_t*)io->handle;
|
||||||
|
|
||||||
|
size = (pixmap->pitch*pixmap->height+4095) & ~ 4095;
|
||||||
|
|
||||||
|
UnmapPages(pixmap->mapped, size);
|
||||||
|
UserFree(pixmap->mapped);
|
||||||
|
|
||||||
|
rhd_mem_free(&rhd,RHD_MEM_FB,pixmap->local);
|
||||||
|
free(pixmap);
|
||||||
|
|
||||||
|
io->format = 0;
|
||||||
|
io->pitch = 0;
|
||||||
|
io->mapped = NULL;
|
||||||
|
io->handle = 0;
|
||||||
|
|
||||||
|
return ERR_OK;
|
||||||
|
};
|
@ -119,7 +119,7 @@ void RADEONOUTPLL(int addr, u32_t data)
|
|||||||
|
|
||||||
|
|
||||||
static Bool
|
static Bool
|
||||||
R5xxFIFOWaitLocal(CARD32 required) //R100-R500
|
R5xxFIFOWaitLocal(u32_t required) //R100-R500
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -183,7 +183,7 @@ R5xx2DIdleLocal() //R100-R500
|
|||||||
static void
|
static void
|
||||||
R5xx2DReset()
|
R5xx2DReset()
|
||||||
{
|
{
|
||||||
CARD32 save, tmp;
|
u32_t save, tmp;
|
||||||
u32_t clock_cntl_index;
|
u32_t clock_cntl_index;
|
||||||
u32_t mclk_cntl;
|
u32_t mclk_cntl;
|
||||||
|
|
||||||
@ -285,7 +285,7 @@ R5xx2DSetup()
|
|||||||
R5xx2DIdleLocal();
|
R5xx2DIdleLocal();
|
||||||
}
|
}
|
||||||
|
|
||||||
void R5xxFIFOWait(CARD32 required)
|
void R5xxFIFOWait(u32_t required)
|
||||||
{
|
{
|
||||||
if (!R5xxFIFOWaitLocal(required)) {
|
if (!R5xxFIFOWaitLocal(required)) {
|
||||||
R5xx2DReset();
|
R5xx2DReset();
|
||||||
@ -303,7 +303,7 @@ void R5xx2DIdle()
|
|||||||
|
|
||||||
static void load_microcode()
|
static void load_microcode()
|
||||||
{
|
{
|
||||||
u32 ifl;
|
u32_t ifl;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ifl = safe_cli();
|
ifl = safe_cli();
|
||||||
@ -350,7 +350,7 @@ static void load_microcode()
|
|||||||
|
|
||||||
void R5xx2DInit()
|
void R5xx2DInit()
|
||||||
{
|
{
|
||||||
u32 base;
|
u32_t base;
|
||||||
|
|
||||||
#ifdef R300_TEST
|
#ifdef R300_TEST
|
||||||
rhd.displayWidth = 1024;
|
rhd.displayWidth = 1024;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
IMP
|
IMP
|
||||||
_KernelAlloc core.KernelAlloc,
|
_KernelAlloc core.KernelAlloc,
|
||||||
|
_KernelFree core.KernelFree,
|
||||||
_UserAlloc core.UserAlloc,
|
_UserAlloc core.UserAlloc,
|
||||||
_UserFree core.UserFree,
|
_UserFree core.UserFree,
|
||||||
_CommitPages core.CommitPages,
|
_CommitPages core.CommitPages,
|
||||||
@ -21,10 +22,5 @@ IMP
|
|||||||
|
|
||||||
|
|
||||||
FIL ati2d.obj,
|
FIL ati2d.obj,
|
||||||
helper.obj,
|
|
||||||
dbg.obj,
|
|
||||||
malloc.obj,
|
|
||||||
memset.obj,
|
|
||||||
string.obj,
|
|
||||||
vsprintf.obj,
|
vsprintf.obj,
|
||||||
icompute.obj
|
icompute.obj
|
||||||
|
@ -1,128 +0,0 @@
|
|||||||
#include "common.h"
|
|
||||||
|
|
||||||
char * strcat(char *s, const char *append)
|
|
||||||
{
|
|
||||||
int d0, d1, d2, d3;
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"repne\n\t"
|
|
||||||
"scasb\n\t"
|
|
||||||
"decl %1\n"
|
|
||||||
"1:\tlodsb\n\t"
|
|
||||||
"stosb\n\t"
|
|
||||||
"testb %%al,%%al\n\t"
|
|
||||||
"jne 1b"
|
|
||||||
: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
|
|
||||||
: "0" (append),"1"(s),"2"(0),"3" (0xffffffff):"memory");
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
memcmp(const void *s1, const void *s2, size_t n)
|
|
||||||
{
|
|
||||||
if (n != 0)
|
|
||||||
{
|
|
||||||
const unsigned char *p1 = s1, *p2 = s2;
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (*p1++ != *p2++)
|
|
||||||
return (*--p1 - *--p2);
|
|
||||||
} while (--n != 0);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void * memcpy(void * _dest, const void *_src, size_t _n)
|
|
||||||
{
|
|
||||||
int d0, d1, d2;
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"jcxz 1f\n\t"
|
|
||||||
"rep ; movsl\n\t"
|
|
||||||
"1:\t"
|
|
||||||
"testb $2,%b4\n\t"
|
|
||||||
"je 1f\n\t"
|
|
||||||
"movsw\n"
|
|
||||||
"1:\ttestb $1,%b4\n\t"
|
|
||||||
"je 2f\n\t"
|
|
||||||
"movsb\n"
|
|
||||||
"2:"
|
|
||||||
: "=&c" (d0), "=&D" (d1), "=&S" (d2)
|
|
||||||
:"0" (_n/4), "q" (_n),"1" ((long)_dest),"2" ((long)_src)
|
|
||||||
: "memory");
|
|
||||||
return (_dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
char * strcpy(char *to, const char *from)
|
|
||||||
{
|
|
||||||
int d0, d1, d2;
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"1:\tlodsb\n\t"
|
|
||||||
"stosb\n\t"
|
|
||||||
"testb %%al,%%al\n\t"
|
|
||||||
"jne 1b"
|
|
||||||
: "=&S" (d0), "=&D" (d1), "=&a" (d2)
|
|
||||||
:"0" (from),"1" (to) : "memory");
|
|
||||||
return to;
|
|
||||||
}
|
|
||||||
|
|
||||||
int strcmp(const char *s1, const char *s2)
|
|
||||||
{
|
|
||||||
int d0, d1;
|
|
||||||
register int __res;
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"1:\tlodsb\n\t"
|
|
||||||
"scasb\n\t"
|
|
||||||
"jne 2f\n\t"
|
|
||||||
"testb %%al,%%al\n\t"
|
|
||||||
"jne 1b\n\t"
|
|
||||||
"xorl %%eax,%%eax\n\t"
|
|
||||||
"jmp 3f\n"
|
|
||||||
"2:\tsbbl %%eax,%%eax\n\t"
|
|
||||||
"orb $1,%%al\n"
|
|
||||||
"3:"
|
|
||||||
:"=a" (__res), "=&S" (d0), "=&D" (d1)
|
|
||||||
:"1" (s1),"2" (s2));
|
|
||||||
return __res;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t strlen(const char *str)
|
|
||||||
{
|
|
||||||
int d0;
|
|
||||||
register int __res;
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"repne\n\t"
|
|
||||||
"scasb\n\t"
|
|
||||||
"notl %0\n\t"
|
|
||||||
"decl %0"
|
|
||||||
:"=c" (__res), "=&D" (d0) :"1" (str),"a" (0), "0" (0xffffffff));
|
|
||||||
return __res;
|
|
||||||
}
|
|
||||||
|
|
||||||
char * strdup(const char *_s)
|
|
||||||
{
|
|
||||||
char *rv;
|
|
||||||
if (_s == 0)
|
|
||||||
return 0;
|
|
||||||
rv = (char *)kmalloc(strlen(_s) + 1);
|
|
||||||
if (rv == 0)
|
|
||||||
return 0;
|
|
||||||
strcpy(rv, _s);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
char * strchr(const char *s, int c)
|
|
||||||
{
|
|
||||||
int d0;
|
|
||||||
register char * __res;
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"movb %%al,%%ah\n"
|
|
||||||
"1:\tlodsb\n\t"
|
|
||||||
"cmpb %%ah,%%al\n\t"
|
|
||||||
"je 2f\n\t"
|
|
||||||
"testb %%al,%%al\n\t"
|
|
||||||
"jne 1b\n\t"
|
|
||||||
"movl $1,%1\n"
|
|
||||||
"2:\tmovl %1,%0\n\t"
|
|
||||||
"decl %0"
|
|
||||||
:"=a" (__res), "=&S" (d0) : "1" (s),"0" (c));
|
|
||||||
return __res;
|
|
||||||
}
|
|
205
programs/system/drivers/ati2d/syscall.h
Normal file
205
programs/system/drivers/ati2d/syscall.h
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
|
||||||
|
#define OS_BASE 0x80000000
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u32_t handle;
|
||||||
|
u32_t io_code;
|
||||||
|
void *input;
|
||||||
|
int inp_size;
|
||||||
|
void *output;
|
||||||
|
int out_size;
|
||||||
|
}ioctl_t;
|
||||||
|
|
||||||
|
typedef int (__stdcall *srv_proc_t)(ioctl_t *);
|
||||||
|
|
||||||
|
#define ERR_OK 0
|
||||||
|
#define ERR_PARAM -1
|
||||||
|
|
||||||
|
|
||||||
|
u32_t __stdcall drvEntry(int)__asm__("_drvEntry");
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define STDCALL __attribute__ ((stdcall)) __attribute__ ((dllimport))
|
||||||
|
#define IMPORT __attribute__ ((dllimport))
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define SysMsgBoardStr __SysMsgBoardStr
|
||||||
|
#define PciApi __PciApi
|
||||||
|
//#define RegService __RegService
|
||||||
|
#define CreateObject __CreateObject
|
||||||
|
#define DestroyObject __DestroyObject
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define PG_SW 0x003
|
||||||
|
#define PG_NOCACHE 0x018
|
||||||
|
|
||||||
|
void* STDCALL AllocKernelSpace(size_t size)__asm__("AllocKernelSpace");
|
||||||
|
void* STDCALL KernelAlloc(size_t size)__asm__("KernelAlloc");
|
||||||
|
void* STDCALL KernelFree(void *mem)__asm__("KernelFree");
|
||||||
|
void* STDCALL UserAlloc(size_t size)__asm__("UserAlloc");
|
||||||
|
int STDCALL UserFree(void *mem)__asm__("UserFree");
|
||||||
|
|
||||||
|
void* STDCALL CreateRingBuffer(size_t size, u32_t map)__asm__("CreateRingBuffer");
|
||||||
|
|
||||||
|
u32_t STDCALL RegService(char *name, srv_proc_t proc)__asm__("RegService");
|
||||||
|
|
||||||
|
//void *CreateObject(u32 pid, size_t size);
|
||||||
|
//void *DestroyObject(void *obj);
|
||||||
|
|
||||||
|
u32_t STDCALL MapIoMem(void* base,size_t size,u32_t flags)__asm__("MapIoMem");
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static u32_t PciApi(int cmd);
|
||||||
|
|
||||||
|
u8_t STDCALL PciRead8 (u32_t bus, u32_t devfn, u32_t reg)__asm__("PciRead8");
|
||||||
|
u16_t STDCALL PciRead16(u32_t bus, u32_t devfn, u32_t reg)__asm__("PciRead16");
|
||||||
|
u32_t STDCALL PciRead32(u32_t bus, u32_t devfn, u32_t reg)__asm__("PciRead32");
|
||||||
|
|
||||||
|
u32_t STDCALL PciWrite8 (u32_t bus, u32_t devfn, u32_t reg,u8_t val) __asm__("PciWrite8");
|
||||||
|
u32_t STDCALL PciWrite16(u32_t bus, u32_t devfn, u32_t reg,u16_t val)__asm__("PciWrite16");
|
||||||
|
u32_t STDCALL PciWrite32(u32_t bus, u32_t devfn, u32_t reg,u32_t val)__asm__("PciWrite32");
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
int dbg_open(char *path);
|
||||||
|
int dbgprintf(const char* format, ...);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
extern inline u32_t GetPgAddr(void *mem)
|
||||||
|
{
|
||||||
|
u32_t retval;
|
||||||
|
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"call *__imp__GetPgAddr \n\t"
|
||||||
|
:"=eax" (retval)
|
||||||
|
:"a" (mem) );
|
||||||
|
return retval;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern inline void CommitPages(void *mem, u32_t page, u32_t size)
|
||||||
|
{
|
||||||
|
size = (size+4095) & ~4095;
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"call *__imp__CommitPages"
|
||||||
|
::"a" (page), "b"(mem),"c"(size>>12)
|
||||||
|
:"edx" );
|
||||||
|
__asm__ __volatile__ ("":::"eax","ebx","ecx");
|
||||||
|
};
|
||||||
|
|
||||||
|
extern inline void UnmapPages(void *mem, size_t size)
|
||||||
|
{
|
||||||
|
size = (size+4095) & ~4095;
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"call *__imp__UnmapPages"
|
||||||
|
::"a" (mem), "c"(size>>12)
|
||||||
|
:"edx");
|
||||||
|
__asm__ __volatile__ ("":::"eax","ecx");
|
||||||
|
};
|
||||||
|
|
||||||
|
extern inline void usleep(u32_t delay)
|
||||||
|
{
|
||||||
|
if( !delay )
|
||||||
|
delay++;
|
||||||
|
delay*=2000;
|
||||||
|
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"1:\n\t"
|
||||||
|
"xorl %%eax, %%eax \n\t"
|
||||||
|
"cpuid \n\t"
|
||||||
|
"decl %%edi \n\t"
|
||||||
|
"jnz 1b"
|
||||||
|
:
|
||||||
|
:"D"(delay)
|
||||||
|
:"eax","ebx","ecx","edx");
|
||||||
|
};
|
||||||
|
|
||||||
|
extern inline u32_t __PciApi(int cmd)
|
||||||
|
{
|
||||||
|
u32_t retval;
|
||||||
|
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"call *__imp__PciApi"
|
||||||
|
:"=a" (retval)
|
||||||
|
:"a" (cmd)
|
||||||
|
:"memory");
|
||||||
|
return retval;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern inline void* __CreateObject(u32_t pid, size_t size)
|
||||||
|
{
|
||||||
|
void *retval;
|
||||||
|
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"call *__imp__CreateObject \n\t"
|
||||||
|
:"=a" (retval)
|
||||||
|
:"a" (size),"b"(pid)
|
||||||
|
:"esi","edi", "memory");
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern inline void *__DestroyObject(void *obj)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"call *__imp__DestroyObject"
|
||||||
|
:
|
||||||
|
:"a" (obj)
|
||||||
|
:"ebx","edx","esi","edi", "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
u32 __RegService(char *name, srv_proc_t proc)
|
||||||
|
{
|
||||||
|
u32 retval;
|
||||||
|
|
||||||
|
asm __volatile__
|
||||||
|
(
|
||||||
|
"pushl %%eax \n\t"
|
||||||
|
"pushl %%ebx \n\t"
|
||||||
|
"call *__imp__RegService \n\t"
|
||||||
|
:"=eax" (retval)
|
||||||
|
:"a" (proc), "b" (name)
|
||||||
|
:"memory"
|
||||||
|
);
|
||||||
|
return retval;
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern inline u32_t safe_cli(void)
|
||||||
|
{
|
||||||
|
u32_t ifl;
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"pushf\n\t"
|
||||||
|
"popl %0\n\t"
|
||||||
|
"cli\n"
|
||||||
|
: "=r" (ifl));
|
||||||
|
return ifl;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern inline void safe_sti(u32_t ifl)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"pushl %0\n\t"
|
||||||
|
"popf\n"
|
||||||
|
: : "r" (ifl)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern inline void __clear (void * dst, unsigned len)
|
||||||
|
{
|
||||||
|
u32_t tmp;
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
// "xorl %%eax, %%eax \n\t"
|
||||||
|
"cld \n\t"
|
||||||
|
"rep stosb \n"
|
||||||
|
:"=c"(tmp),"=D"(tmp)
|
||||||
|
:"a"(0),"c"(len),"D"(dst));
|
||||||
|
__asm__ __volatile__ ("":::"ecx","edi");
|
||||||
|
};
|
||||||
|
|
19
programs/system/drivers/ati2d/types.h
Normal file
19
programs/system/drivers/ati2d/types.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
#define NULL (void*)0
|
||||||
|
|
||||||
|
|
||||||
|
typedef unsigned char u8_t;
|
||||||
|
typedef unsigned short int u16_t;
|
||||||
|
typedef unsigned int u32_t;
|
||||||
|
typedef unsigned long long u64_t;
|
||||||
|
|
||||||
|
typedef unsigned int size_t;
|
||||||
|
typedef unsigned int count_t;
|
||||||
|
typedef unsigned int eflags_t;
|
||||||
|
|
||||||
|
typedef int bool;
|
||||||
|
|
||||||
|
#define TRUE (bool)1
|
||||||
|
#define FALSE (bool)0
|
||||||
|
|
||||||
|
|
@ -1,203 +0,0 @@
|
|||||||
/* $XFree86: xc/include/Xmd.h,v 3.18tsi Exp $ */
|
|
||||||
/***********************************************************
|
|
||||||
|
|
||||||
Copyright 1987, 1998 The Open Group
|
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this software and its
|
|
||||||
documentation for any purpose is hereby granted without fee, provided that
|
|
||||||
the above copyright notice appear in all copies and that both that
|
|
||||||
copyright notice and this permission notice appear in supporting
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of The Open Group shall not be
|
|
||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization from The Open Group.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
|
||||||
|
|
||||||
All Rights Reserved
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software and its
|
|
||||||
documentation for any purpose and without fee is hereby granted,
|
|
||||||
provided that the above copyright notice appear in all copies and that
|
|
||||||
both that copyright notice and this permission notice appear in
|
|
||||||
supporting documentation, and that the name of Digital not be
|
|
||||||
used in advertising or publicity pertaining to distribution of the
|
|
||||||
software without specific, written prior permission.
|
|
||||||
|
|
||||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
||||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
||||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
||||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
******************************************************************/
|
|
||||||
#ifndef XMD_H
|
|
||||||
#define XMD_H 1
|
|
||||||
/* $Xorg: Xmd.h,v 1.4 2001/02/09 02:03:22 xorgcvs Exp $ */
|
|
||||||
/*
|
|
||||||
* Xmd.h: MACHINE DEPENDENT DECLARATIONS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Special per-machine configuration flags.
|
|
||||||
*/
|
|
||||||
#ifdef CRAY
|
|
||||||
#define WORD64 /* 64-bit architecture */
|
|
||||||
#endif
|
|
||||||
#if defined (_LP64) || \
|
|
||||||
defined(__alpha) || defined(__alpha__) || \
|
|
||||||
defined(__ia64__) || defined(ia64) || \
|
|
||||||
defined(__sparc64__) || \
|
|
||||||
defined(__s390x__) || \
|
|
||||||
(defined(__hppa__) && defined(__LP64__)) || \
|
|
||||||
defined(__amd64__) || defined(amd64) || \
|
|
||||||
defined(__powerpc64__) || \
|
|
||||||
(defined(sgi) && (_MIPS_SZLONG == 64))
|
|
||||||
#define LONG64 /* 32/64-bit architecture */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Stuff to handle large architecture machines; the constants were generated
|
|
||||||
* on a 32-bit machine and must coorespond to the protocol.
|
|
||||||
*/
|
|
||||||
#ifdef WORD64
|
|
||||||
#define MUSTCOPY
|
|
||||||
#endif /* WORD64 */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Definition of macro used to set constants for size of network structures;
|
|
||||||
* machines with preprocessors that can't handle all of the sz_ symbols
|
|
||||||
* can define this macro to be sizeof(x) if and only if their compiler doesn't
|
|
||||||
* pad out structures (esp. the xTextElt structure which contains only two
|
|
||||||
* one-byte fields). Network structures should always define sz_symbols.
|
|
||||||
*
|
|
||||||
* The sz_ prefix is used instead of something more descriptive so that the
|
|
||||||
* symbols are no more than 32 characters long (which causes problems for some
|
|
||||||
* compilers and preprocessors).
|
|
||||||
*
|
|
||||||
* The extra indirection in the __STDC__ case is to get macro arguments to
|
|
||||||
* expand correctly before the concatenation, rather than afterward.
|
|
||||||
*/
|
|
||||||
#if ((defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)) && !defined(UNIXCPP)) || defined(ANSICPP)
|
|
||||||
#define _SIZEOF(x) sz_##x
|
|
||||||
#define SIZEOF(x) _SIZEOF(x)
|
|
||||||
#else
|
|
||||||
#define SIZEOF(x) sz_/**/x
|
|
||||||
#endif /* if ANSI C compiler else not */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Bitfield suffixes for the protocol structure elements, if you
|
|
||||||
* need them. Note that bitfields are not guarranteed to be signed
|
|
||||||
* (or even unsigned) according to ANSI C.
|
|
||||||
*/
|
|
||||||
#ifdef WORD64
|
|
||||||
typedef long INT64;
|
|
||||||
typedef unsigned long CARD64;
|
|
||||||
#define B32 :32
|
|
||||||
#define B16 :16
|
|
||||||
#ifdef UNSIGNEDBITFIELDS
|
|
||||||
typedef unsigned int INT32;
|
|
||||||
typedef unsigned int INT16;
|
|
||||||
#else
|
|
||||||
#ifdef __STDC__
|
|
||||||
typedef signed int INT32;
|
|
||||||
typedef signed int INT16;
|
|
||||||
#else
|
|
||||||
typedef int INT32;
|
|
||||||
typedef int INT16;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define B32
|
|
||||||
#define B16
|
|
||||||
#ifdef LONG64
|
|
||||||
typedef long INT64;
|
|
||||||
typedef int INT32;
|
|
||||||
#else
|
|
||||||
typedef long INT32;
|
|
||||||
#endif
|
|
||||||
typedef short INT16;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__STDC__) || defined(sgi) || defined(AIXV3)
|
|
||||||
typedef signed char INT8;
|
|
||||||
#else
|
|
||||||
typedef char INT8;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LONG64
|
|
||||||
typedef unsigned long CARD64;
|
|
||||||
typedef unsigned int CARD32;
|
|
||||||
#else
|
|
||||||
typedef unsigned long CARD32;
|
|
||||||
#endif
|
|
||||||
typedef unsigned short CARD16;
|
|
||||||
typedef unsigned char CARD8;
|
|
||||||
|
|
||||||
typedef CARD32 BITS32;
|
|
||||||
typedef CARD16 BITS16;
|
|
||||||
|
|
||||||
#ifndef I_NEED_OS2_H
|
|
||||||
typedef CARD8 BYTE;
|
|
||||||
typedef CARD8 BOOL;
|
|
||||||
#else
|
|
||||||
#define BYTE CARD8
|
|
||||||
#define BOOL CARD8
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* definitions for sign-extending bitfields on 64-bit architectures
|
|
||||||
*/
|
|
||||||
#if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
|
|
||||||
#define cvtINT8toInt(val) (((val) & 0x00000080) ? ((val) | 0xffffffffffffff00) : (val))
|
|
||||||
#define cvtINT16toInt(val) (((val) & 0x00008000) ? ((val) | 0xffffffffffff0000) : (val))
|
|
||||||
#define cvtINT32toInt(val) (((val) & 0x80000000) ? ((val) | 0xffffffff00000000) : (val))
|
|
||||||
#define cvtINT8toShort(val) cvtINT8toInt(val)
|
|
||||||
#define cvtINT16toShort(val) cvtINT16toInt(val)
|
|
||||||
#define cvtINT32toShort(val) cvtINT32toInt(val)
|
|
||||||
#define cvtINT8toLong(val) cvtINT8toInt(val)
|
|
||||||
#define cvtINT16toLong(val) cvtINT16toInt(val)
|
|
||||||
#define cvtINT32toLong(val) cvtINT32toInt(val)
|
|
||||||
#else
|
|
||||||
#define cvtINT8toInt(val) (val)
|
|
||||||
#define cvtINT16toInt(val) (val)
|
|
||||||
#define cvtINT32toInt(val) (val)
|
|
||||||
#define cvtINT8toShort(val) (val)
|
|
||||||
#define cvtINT16toShort(val) (val)
|
|
||||||
#define cvtINT32toShort(val) (val)
|
|
||||||
#define cvtINT8toLong(val) (val)
|
|
||||||
#define cvtINT16toLong(val) (val)
|
|
||||||
#define cvtINT32toLong(val) (val)
|
|
||||||
#endif /* WORD64 and UNSIGNEDBITFIELDS */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef MUSTCOPY
|
|
||||||
/*
|
|
||||||
* This macro must not cast or else pointers will get aligned and be wrong
|
|
||||||
*/
|
|
||||||
#define NEXTPTR(p,t) (((char *) p) + SIZEOF(t))
|
|
||||||
#else /* else not MUSTCOPY, this is used for 32-bit machines */
|
|
||||||
/*
|
|
||||||
* this version should leave result of type (t *), but that should only be
|
|
||||||
* used when not in MUSTCOPY
|
|
||||||
*/
|
|
||||||
#define NEXTPTR(p,t) (((t *)(p)) + 1)
|
|
||||||
#endif /* MUSTCOPY - used machines whose C structs don't line up with proto */
|
|
||||||
|
|
||||||
#endif /* XMD_H */
|
|
Loading…
Reference in New Issue
Block a user