📄 xio_dcr.c
字号:
/* $Id: xio_dcr.c,v 1.8 2002/07/26 20:27:56 moleres Exp $ */
/******************************************************************************
*
* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"
* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND
* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE,
* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION
* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,
* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE
* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY
* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE
* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF
* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE.
*
* (c) Copyright 2002 Xilinx Inc.
* All rights reserved.
*
******************************************************************************/
/*****************************************************************************/
/**
*
* @file xio_dcr.c
*
* The implementation of the XDcrIo interface. See xio_dcr.h for more
* information about the component.
*
* <pre>
* MODIFICATION HISTORY:
*
* Ver Who Date Changes
* ----- ---- -------- -----------------------------------------------
* 1.00a ecm 10/18/01 First release
* </pre>
*
* @internal
*
* The C functions which subsequently call into either the assembly code or into
* the provided table of functions are required since the registers assigned to
* the calling and return from functions are strictly defined in the ABI and that
* definition is used in the low-level functions directly. The use of macros is
* not recommended since the temporary registers in the ABI are defined but there
* is no way to force the compiler to use a specific register in a block of code.
*
*****************************************************************************/
/***************************** Include Files ********************************/
#include "xstatus.h"
#include "xbasic_types.h"
#include "xio_dcr.h"
/************************** Constant Definitions ****************************/
#define SUB_RETURN 0x4E800020 /* equals 'blr' */
#define MTDCR_FIXED 0x7C000386 /* this is the basic template*/
/* equals 'mtdcr 0, 0x00' */
#define MFDCR_FIXED 0x7C000286 /* this is the basic template*/
/* equals 'mfdcr 0, 0x00' */
#define GPR_SHIFT 21
#define DCR_SHIFT_LH 16 /* bits 5 - 9 shift value */
#define DCR_SHIFT_UH 11 /* bits 0 - 4 shift value */
#define DCR_REG_32 1 /* register 32 and above */
#define DCR_REG_512 17 /* register 512 and above */
/* defines for the mfdcr and mfdcr structures */
#define GPR_SOURCE_REG 4<<GPR_SHIFT
#define GPR_DEST_REG 3<<GPR_SHIFT
/**************************** Type Definitions ******************************/
typedef Xuint32 (*XIo_DcrOpCode)(void);
typedef struct DcrFunctionTableEntryTag
{
Xuint32 OpCode;
Xuint32 Return;
} DcrFunctionTableEntry;
static DcrFunctionTableEntry MtDcrTable[MAX_DCR_REGISTERS] =
{
{MTDCR_FIXED | GPR_SOURCE_REG | (0)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (1)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (2)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (3)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (4)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (5)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (6)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (7)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (8)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (9)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (10)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (11)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (12)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (13)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (14)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (15)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (16)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (17)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (18)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (19)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (20)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (21)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (22)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (23)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (24)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (25)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (26)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (27)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (28)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (29)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (30)<<DCR_SHIFT_LH,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | (31)<<DCR_SHIFT_LH,SUB_RETURN},
/* this is where the DCR register numbering goes weird*/
{MTDCR_FIXED | GPR_SOURCE_REG | ((0)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((1)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((2)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((3)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((4)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((5)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((6)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((7)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((8)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((9)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((10)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((11)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((12)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((13)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((14)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((15)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((16)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((17)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((18)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((19)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((20)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((21)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((22)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((23)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((24)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((25)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
{MTDCR_FIXED | GPR_SOURCE_REG | ((26)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -