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

📄 ncr.c

📁 国产CPU-龙芯(loongson)BIOS源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	SCR_REG_REG (scntl2, SCR_AND, 0x7f),		0,	SCR_CLR (SCR_ACK|SCR_ATN),		0,	/*	**	Wait for the disconnect.	*/	SCR_WAIT_DISC,		0,	/*	**	Profiling:	**	Set a time stamp,	**	and count the disconnects.	*/	SCR_COPY (sizeof (struct timeval)),		KVAR (KVAR_TIME),		NADDR (header.stamp.disconnect),	SCR_COPY (4),		NADDR (disc_phys),		RADDR (temp),	SCR_REG_REG (temp, SCR_ADD, 0x01),		0,	SCR_COPY (4),		RADDR (temp),		NADDR (disc_phys),	/*	**	Status is: DISCONNECTED.	*/	SCR_LOAD_REG (HS_REG, HS_DISCONNECT),		0,	SCR_JUMP,		PADDR (cleanup),}/*-------------------------< MSG_OUT >-------------------*/,{	/*	**	The target requests a message.	*/	SCR_MOVE_ABS (1) ^ SCR_MSG_OUT,		NADDR (msgout),	SCR_COPY (1),		RADDR (sfbr),		NADDR (lastmsg),	/*	**	If it was no ABORT message ...	*/	SCR_JUMP ^ IFTRUE (DATA (M_ABORT)),		PADDRH (msg_out_abort),	/*	**	... wait for the next phase	**	if it's a message out, send it again, ...	*/	SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)),		PADDR (msg_out),}/*-------------------------< MSG_OUT_DONE >--------------*/,{	/*	**	... else clear the message ...	*/	SCR_LOAD_REG (scratcha, M_NOOP),		0,	SCR_COPY (4),		RADDR (scratcha),		NADDR (msgout),	/*	**	... and process the next phase	*/	SCR_JUMP,		PADDR (dispatch),}/*------------------------< BADGETCC >---------------------*/,{	/*	**	If SIGP was set, clear it and try again.	*/	SCR_FROM_REG (ctest2),		0,	SCR_JUMP ^ IFTRUE (MASK (CSIGP,CSIGP)),		PADDRH (getcc2),	SCR_INT,		SIR_SENSE_FAILED,}/*-------------------------< RESELECT >--------------------*/,{	/*	**	This NOP will be patched with LED OFF	**	SCR_REG_REG (gpreg, SCR_OR, 0x01)	*/	SCR_NO_OP,		0,	/*	**	make the DSA invalid.	*/	SCR_LOAD_REG (dsa, 0xff),		0,	SCR_CLR (SCR_TRG),		0,	/*	**	Sleep waiting for a reselection.	**	If SIGP is set, special treatment.	**	**	Zu allem bereit ..	*/	SCR_WAIT_RESEL,		PADDR(reselect2),}/*-------------------------< RESELECT1 >--------------------*/,{	/*	**	This NOP will be patched with LED ON	**	SCR_REG_REG (gpreg, SCR_AND, 0xfe)	*/	SCR_NO_OP,		0,	/*	**	... zu nichts zu gebrauchen ?	**	**      load the target id into the SFBR	**	and jump to the control block.	**	**	Look at the declarations of	**	- struct ncb	**	- struct tcb	**	- struct lcb	**	- struct ccb	**	to understand what's going on.	*/	SCR_REG_SFBR (ssid, SCR_AND, 0x8F),		0,	SCR_TO_REG (ctest0),		0,	SCR_JUMP,		NADDR (jump_tcb),}/*-------------------------< RESELECT2 >-------------------*/,{	/*	**	This NOP will be patched with LED ON	**	SCR_REG_REG (gpreg, SCR_AND, 0xfe)	*/	SCR_NO_OP,		0,	/*	**	If it's not connected :(	**	-> interrupted by SIGP bit.	**	Jump to start.	*/	SCR_FROM_REG (ctest2),		0,	SCR_JUMP ^ IFTRUE (MASK (CSIGP,CSIGP)),		PADDR (start),	SCR_JUMP,		PADDR (reselect),}/*-------------------------< RESEL_TMP >-------------------*/,{	/*	**	The return address in TEMP	**	is in fact the data structure address,	**	so copy it to the DSA register.	*/	SCR_COPY (4),		RADDR (temp),		RADDR (dsa),	SCR_JUMP,		PADDR (prepare),}/*-------------------------< RESEL_LUN >-------------------*/,{	/*	**	come back to this point	**	to get an IDENTIFY message	**	Wait for a msg_in phase.	*//*<<<*/	SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_IN)),		48,	/*	**	message phase	**	It's not a sony, it's a trick:	**	read the data without acknowledging it.	*/	SCR_FROM_REG (sbdl),		0,/*<<<*/	SCR_JUMPR ^ IFFALSE (MASK (M_IDENTIFY, 0x98)),		32,	/*	**	It WAS an Identify message.	**	get it and ack it!	*/	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,		NADDR (msgin),	SCR_CLR (SCR_ACK),		0,	/*	**	Mask out the lun.	*/	SCR_REG_REG (sfbr, SCR_AND, 0x07),		0,	SCR_RETURN,		0,	/*	**	No message phase or no IDENTIFY message:	**	return 0.	*//*>>>*/	SCR_LOAD_SFBR (0),		0,	SCR_RETURN,		0,}/*-------------------------< RESEL_TAG >-------------------*/,{	/*	**	come back to this point	**	to get a SIMPLE_TAG message	**	Wait for a MSG_IN phase.	*//*<<<*/	SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_IN)),		64,	/*	**	message phase	**	It's a trick - read the data	**	without acknowledging it.	*/	SCR_FROM_REG (sbdl),		0,/*<<<*/	SCR_JUMPR ^ IFFALSE (DATA (M_SIMPLE_TAG)),		48,	/*	**	It WAS a SIMPLE_TAG message.	**	get it and ack it!	*/	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,		NADDR (msgin),	SCR_CLR (SCR_ACK),		0,	/*	**	Wait for the second byte (the tag)	*//*<<<*/	SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_IN)),		24,	/*	**	Get it and ack it!	*/	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,		NADDR (msgin),	SCR_CLR (SCR_ACK|SCR_CARRY),		0,	SCR_RETURN,		0,	/*	**	No message phase or no SIMPLE_TAG message	**	or no second byte: return 0.	*//*>>>*/	SCR_LOAD_SFBR (0),		0,	SCR_SET (SCR_CARRY),		0,	SCR_RETURN,		0,}/*-------------------------< DATA_IN >--------------------*/,{/***	Because the size depends on the**	#define MAX_SCATTER parameter,**	it is filled in at runtime.****	SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)),**		PADDR (no_data),**	SCR_COPY (sizeof (struct timeval)),**		KVAR (KVAR_TIME),**		NADDR (header.stamp.data),**	SCR_MOVE_TBL ^ SCR_DATA_IN,**		offsetof (struct dsb, data[ 0]),****  ##===========< i=1; i<MAX_SCATTER >=========**  ||	SCR_CALL ^ IFFALSE (WHEN (SCR_DATA_IN)),**  ||		PADDR (checkatn),**  ||	SCR_MOVE_TBL ^ SCR_DATA_IN,**  ||		offsetof (struct dsb, data[ i]),**  ##==========================================****	SCR_CALL,**		PADDR (checkatn),**	SCR_JUMP,**		PADDR (no_data),*/0}/*-------------------------< DATA_OUT >-------------------*/,{/***	Because the size depends on the**	#define MAX_SCATTER parameter,**	it is filled in at runtime.****	SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_OUT)),**		PADDR (no_data),**	SCR_COPY (sizeof (struct timeval)),**		KVAR (KVAR_TIME),**		NADDR (header.stamp.data),**	SCR_MOVE_TBL ^ SCR_DATA_OUT,**		offsetof (struct dsb, data[ 0]),****  ##===========< i=1; i<MAX_SCATTER >=========**  ||	SCR_CALL ^ IFFALSE (WHEN (SCR_DATA_OUT)),**  ||		PADDR (dispatch),**  ||	SCR_MOVE_TBL ^ SCR_DATA_OUT,**  ||		offsetof (struct dsb, data[ i]),**  ##==========================================****	SCR_CALL,**		PADDR (dispatch),**	SCR_JUMP,**		PADDR (no_data),****---------------------------------------------------------*/#ifdef __OpenBSD__0#else(u_long)&ident#endif}/*--------------------------------------------------------*/};static	struct scripth scripth0 = {/*-------------------------< TRYLOOP >---------------------*/{/***	Load an entry of the start queue into dsa**	and try to start it by jumping to TRYSEL.****	Because the size depends on the**	#define MAX_START parameter, it is filled**	in at runtime.****-----------------------------------------------------------****  ##===========< I=0; i<MAX_START >===========**  ||	SCR_COPY (4),**  ||		NADDR (squeue[i]),**  ||		RADDR (dsa),**  ||	SCR_CALL,**  ||		PADDR (trysel),**  ##==========================================****	SCR_JUMP,**		PADDRH(tryloop),****-----------------------------------------------------------*/0}/*-------------------------< MSG_PARITY >---------------*/,{	/*	**	count it	*/	SCR_REG_REG (PS_REG, SCR_ADD, 0x01),		0,	/*	**	send a "message parity error" message.	*/	SCR_LOAD_REG (scratcha, M_PARITY),		0,	SCR_JUMP,		PADDR (setmsg),}/*-------------------------< MSG_REJECT >---------------*/,{	/*	**	If a negotiation was in progress,	**	negotiation failed.	*/	SCR_FROM_REG (HS_REG),		0,	SCR_INT ^ IFTRUE (DATA (HS_NEGOTIATE)),		SIR_NEGO_FAILED,	/*	**	else make host log this message	*/	SCR_INT ^ IFFALSE (DATA (HS_NEGOTIATE)),		SIR_REJECT_RECEIVED,	SCR_JUMP,		PADDR (clrack),}/*-------------------------< MSG_IGN_RESIDUE >----------*/,{	/*	**	Terminate cycle	*/	SCR_CLR (SCR_ACK),		0,	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),		PADDR (dispatch),	/*	**	get residue size.	*/	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,		NADDR (msgin[1]),	/*	**	Check for message parity error.	*/	SCR_TO_REG (scratcha),		0,	SCR_FROM_REG (socl),		0,	SCR_JUMP ^ IFTRUE (MASK (CATN, CATN)),		PADDRH (msg_parity),	SCR_FROM_REG (scratcha),		0,	/*	**	Size is 0 .. ignore message.	*/	SCR_JUMP ^ IFTRUE (DATA (0)),		PADDR (clrack),	/*	**	Size is not 1 .. have to interrupt.	*//*<<<*/	SCR_JUMPR ^ IFFALSE (DATA (1)),		40,	/*	**	Check for residue byte in swide register	*/	SCR_FROM_REG (scntl2),		0,/*<<<*/	SCR_JUMPR ^ IFFALSE (MASK (WSR, WSR)),		16,	/*	**	There IS data in the swide register.	**	Discard it.	*/	SCR_REG_REG (scntl2, SCR_OR, WSR),		0,	SCR_JUMP,		PADDR (clrack),	/*	**	Load again the size to the sfbr register.	*//*>>>*/	SCR_FROM_REG (scratcha),		0,/*>>>*/	SCR_INT,		SIR_IGN_RESIDUE,	SCR_JUMP,		PADDR (clrack),}/*-------------------------< MSG_EXTENDED >-------------*/,{	/*	**	Terminate cycle	*/	SCR_CLR (SCR_ACK),		0,	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),		PADDR (dispatch),	/*	**	get length.	*/	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,		NADDR (msgin[1]),	/*	**	Check for message parity error.	*/	SCR_TO_REG (scratcha),		0,	SCR_FROM_REG (socl),		0,	SCR_JUMP ^ IFTRUE (MASK (CATN, CATN)),		PADDRH (msg_parity),	SCR_FROM_REG (scratcha),		0,	/*	*/	SCR_JUMP ^ IFTRUE (DATA (3)),		PADDRH (msg_ext_3),	SCR_JUMP ^ IFFALSE (DATA (2)),		PADDR (msg_bad),}/*-------------------------< MSG_EXT_2 >----------------*/,{	SCR_CLR (SCR_ACK),		0,	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),		PADDR (dispatch),	/*	**	get extended message code.	*/	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,		NADDR (msgin[2]),	/*	**	Check for message parity error.	*/	SCR_TO_REG (scratcha),		0,	SCR_FROM_REG (socl),		0,	SCR_JUMP ^ IFTRUE (MASK (CATN, CATN)),		PADDRH (msg_parity),	SCR_FROM_REG (scratcha),		0,	SCR_JUMP ^ IFTRUE (DATA (M_X_WIDE_REQ)),		PADDRH (msg_wdtr),	/*	**	unknown extended message	*/	SCR_JUMP,		PADDR (msg_bad)}/*-------------------------< MSG_WDTR >-----------------*/,{	SCR_CLR (SCR_ACK),		0,	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),		PADDR (dispatch),	/*	**	get data bus width	*/	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,		NADDR (msgin[3]),	SCR_FROM_REG (socl),		0,	SCR_JUMP ^ IFTRUE (MASK (CATN, CATN)),		PADDRH (msg_parity),	/*	**	let the host do the real work.	*/	SCR_INT,		SIR_NEGO_WIDE,	/*	**	let the target fetch our answer.	*/	SCR_SET (SCR_ATN),		0,	SCR_CLR (SCR_ACK),		0,	SCR_INT ^ IFFALSE (WHEN (SCR_MSG_OUT)),		SIR_NEGO_PROTO,	/*	**	Send the M_X_WIDE_REQ	*/	SCR_MOVE_ABS (4) ^ SCR_MSG_OUT,		NADDR (msgout),	SCR_CLR (SCR_ATN),		0,	SCR_COPY (1),		RADDR (sfbr),		NADDR (lastmsg),	SCR_JUMP,		PADDR (msg_out_done),}/*-------------------------< MSG_EXT_3 >----------------*/,{	SCR_CLR (SCR_ACK),		0,	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),		PADDR (dispatch),	/*	**	get extended message code.	*/	SCR_MOVE_ABS (1) ^ SCR_MSG_IN,		NADDR (msgin[2]),	/*	**	Check for message parity error.	*/	SCR_TO_REG (scratcha),		0,	SCR_FROM_REG (socl),		0,	SCR_JUMP ^ IFTRUE (MASK (CATN, CATN)),		PADDRH (msg_parity),	SCR_FROM_REG (scratcha),		0,	SCR_JUMP ^ IFTRUE (DATA (M_X_SYNC_REQ)),		PADDRH (msg_sdtr),	/*	**	unknown extended message	*/	SCR_JUMP,		PADDR (msg_bad)}/*-------------------------< MSG_SDTR >-----------------*/,{	SCR_CLR (SCR_ACK),		0,	SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),		PADDR (dispatch),	/*	**	get period and offset	*/	SCR_MOVE_ABS (2) ^ SCR_MSG_IN,		NADDR (msgin[3]),	SCR_FROM_REG (socl),		0,	SCR_JUMP ^ IFTRUE (MASK (CATN, CATN)),		PADDRH (msg_parity),	/*	**	let the host do the real work.	*/	SCR_INT,		SIR_NEGO_SYNC,	/*	**	let the target fetch our answer.	*/	SCR_SET (SCR_ATN),		0,	SCR_CLR (SCR_ACK),		0,	SCR_INT ^ IFFALSE (WHEN (SCR_MSG_OUT)),		SIR_NEGO_PROTO,	/*	**	Send the M_X_SYNC_REQ

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -