⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cim_defs.h

📁 LX 800 WindowsCE 6.0 BSP
💻 H
📖 第 1 页 / 共 3 页
字号:
	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 + -