📄 cim_defs.h
字号:
rdmsr (addr, val1, val2); \
\
((Q_WORD *)(data64_ptr))->high = val2; \
((Q_WORD *)(data64_ptr))->low = val1; \
}
/*-----------------------------------------------------------------
* MSR_WRITE
* Read the contents of a 64 bit data structure to a MSR.
*-----------------------------------------------------------------*/
#define MSR_WRITE(msr_reg, device_add, data64_ptr) \
{ \
unsigned long addr, val1, val2; \
\
val2 = ((Q_WORD *)(data64_ptr))->high; \
val1 = ((Q_WORD *)(data64_ptr))->low; \
\
addr = (device_add & 0xFFFF0000) | (unsigned long)msr_reg; \
wrmsr(addr, val1, val2); \
}
#endif
#endif /* #ifdef CIMARRON_INCLUDE_MSR_MACROS */
/*-----------------------------------------------------------------*/
/* STRING MACROS */
/* These macros are included to facilitate the optimization of */
/* routines that write or copy large amounts of data. Two vesions */
/* of these macros are included. One is intended for operating */
/* systems that allow the use of inline assembly, while the other */
/* is a pure C implementation for stricter operating systems. */
/*-----------------------------------------------------------------*/
#ifdef CIMARRON_INCLUDE_STRING_MACROS
#if CIMARRON_OPTIMIZE_ASSEMBLY
/*-----------------------------------------------------------------
* WRITE_COMMAND_STRING32
* Write a series of DWORDs to the current command buffer offset
*-----------------------------------------------------------------*/
#define WRITE_COMMAND_STRING32(offset, dataptr, dataoffset, dword_count) \
{ \
_asm { cld } \
_asm { mov edi, cim_cmd_ptr } \
_asm { add edi, offset } \
_asm { mov esi, dataptr } \
_asm { add esi, dataoffset } \
_asm { mov ecx, dword_count } \
_asm { rep movsd } \
}
/*-----------------------------------------------------------------
* WRITE_FB_STRING32
* Write a series of DWORDS to video memory.
*-----------------------------------------------------------------*/
#define WRITE_FB_STRING32(offset, dataptr, dword_count) \
{ \
unsigned long temp = (unsigned long)(dataptr); \
_asm { cld } \
_asm { mov edi, cim_fb_ptr } \
_asm { add edi, offset } \
_asm { mov esi, temp } \
_asm { mov ecx, dword_count } \
_asm { rep movsd } \
}
/*-----------------------------------------------------------------
* WRITE_FB_CONSTANT
* Write a constant DWORD to multiple video memory addresses
*-----------------------------------------------------------------*/
#define WRITE_FB_CONSTANT(offset, value, dword_count) \
{ \
unsigned long outptr = (unsigned long)cim_fb_ptr + offset; \
unsigned long dwords = dword_count; \
_asm { cld } \
_asm { mov edi, outptr } \
_asm { mov eax, value } \
_asm { mov ecx, dwords } \
_asm { rep stosd } \
}
/*-----------------------------------------------------------------
* WRITE_HOST_SOURCE_STRING32
* Write a series of DWORDs to the GP host source register
*-----------------------------------------------------------------*/
#define WRITE_HOST_SOURCE_STRING32(dataptr, dataoffset, dword_count) \
{ \
_asm { cld } \
_asm { mov edi, cim_gp_ptr } \
_asm { add edi, GP3_HST_SRC_RANGE } \
_asm { mov esi, dataptr } \
_asm { add esi, dataoffset } \
_asm { mov ecx, dword_count } \
_asm { rep movsd } \
}
#elif CIMARRON_OPTIMIZE_FORLOOP
/*-----------------------------------------------------------------
* WRITE_COMMAND_STRING32
* Write a series of DWORDs to the current command buffer offset
*-----------------------------------------------------------------*/
#define WRITE_COMMAND_STRING32(offset, dataptr, dataoffset, dword_count) \
{ \
unsigned long i; \
unsigned long tempdata = (unsigned long)dataptr + (dataoffset); \
unsigned long byte_off = 0; \
for (i = 0; i < dword_count; i++, byte_off += 4) \
WRITE_COMMAND32 ((offset) + byte_off, *((unsigned long *)(tempdata + byte_off))); \
}
/*-----------------------------------------------------------------
* WRITE_FB_STRING32
* Write a series of DWORDS to video memory.
*-----------------------------------------------------------------*/
#define WRITE_FB_STRING32(offset, dataptr, dword_count) \
{ \
unsigned long i; \
unsigned long tempdata = (unsigned long)dataptr; \
unsigned long byte_off = 0; \
for (i = 0; i < dword_count; i++, byte_off += 4) \
WRITE_FB32 ((offset) + byte_off, *((unsigned long *)(tempdata + byte_off))); \
}
/*-----------------------------------------------------------------
* WRITE_FB_CONSTANT
* Write a constant DWORD to multiple video memory addresses
*-----------------------------------------------------------------*/
#define WRITE_FB_CONSTANT(offset, value, dword_count) \
{ \
unsigned long i; \
unsigned long tempoffset = offset; \
for (i = 0; i < dword_count; i++, tempoffset += 4) \
WRITE_FB32 (tempoffset, value); \
}
/*-----------------------------------------------------------------
* WRITE_HOST_SOURCE_STRING32
* Write a series of DWORDs to the GP host source register
*-----------------------------------------------------------------*/
#define WRITE_HOST_SOURCE_STRING32(dataptr, dataoffset, dword_count) \
{ \
unsigned long i; \
unsigned long tempdata = (unsigned long)dataptr + (dataoffset); \
unsigned long byte_off = 0; \
for (i = 0; i < dword_count; i++, byte_off += 4) \
WRITE_GP32 (byte_off + GP3_HST_SRC_RANGE, *((unsigned long *)(tempdata + byte_off))); \
}
#elif CIMARRON_OPTIMIZE_ABSTRACTED_ASM
#define move_dw(d,s,n) \
__asm__ __volatile__( \
" rep\n" \
" movsl\n" \
: "=&c" (d0), "=&S" (d1), "=&D" (d2) \
: "0" (n), "1" ((const char *)s), "2" ((char *)d) \
: "memory")
/*-----------------------------------------------------------------
* WRITE_COMMAND_STRING32
* Write a series of DWORDs to the current command buffer offset
*-----------------------------------------------------------------*/
#define WRITE_COMMAND_STRING32(offset, dataptr, dataoffset, dword_count) \
{ \
int d0, d1, d2; \
move_dw (cim_cmd_ptr+ ((unsigned long)(offset)), \
((unsigned long)(dataptr)+(dataoffset)), \
dword_count); \
}
/*-----------------------------------------------------------------
* WRITE_FB_STRING32
* Write a series of DWORDS to video memory.
*-----------------------------------------------------------------*/
#define WRITE_FB_STRING32(offset, dataptr, dword_count) \
{ \
unsigned long i; \
unsigned long tempdata = (unsigned long)dataptr; \
unsigned long byte_off = 0; \
for (i = 0; i < dword_count; i++, byte_off += 4) \
WRITE_FB32 ((offset) + byte_off, *((unsigned long *)(tempdata + byte_off))); \
}
/*-----------------------------------------------------------------
* WRITE_FB_CONSTANT
* Write a constant DWORD to multiple video memory addresses
*-----------------------------------------------------------------*/
#define WRITE_FB_CONSTANT(offset, value, dword_count) \
{ \
unsigned long i; \
unsigned long tempoffset = offset; \
for (i = 0; i < dword_count; i++, tempoffset += 4) \
WRITE_FB32 (tempoffset, value); \
}
/*-----------------------------------------------------------------
* WRITE_HOST_SOURCE_STRING32
* Write a series of DWORDs to the GP host source register
*-----------------------------------------------------------------*/
#define WRITE_HOST_SOURCE_STRING32(dataptr, dataoffset, dword_count) \
{ \
unsigned long i; \
unsigned long tempdata = (unsigned long)dataptr + (dataoffset); \
unsigned long byte_off = 0; \
for (i = 0; i < dword_count; i++, byte_off += 4) \
WRITE_GP32 (byte_off + GP3_HST_SRC_RANGE, *((unsigned long *)(tempdata + byte_off))); \
}
#endif
#endif /* #ifdef CIMARRON_INCLUDE_STRING_MACROS */
/*-----------------------------------------------------------------
* WRITE_COMMAND_STRING8
* Write a series of bytes to the current command buffer offset
*-----------------------------------------------------------------*/
#define WRITE_COMMAND_STRING8(offset, dataptr, dataoffset, byte_count) \
{ \
unsigned long i; \
unsigned long array = (unsigned long)dataptr + (dataoffset); \
for (i = 0; i < byte_count; i++) \
WRITE_COMMAND8 ((offset) + i, *((unsigned char *)(array + i))); \
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -