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

📄 makez80.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 5 页
字号:
	{0xda,  RESSETHandler},	{0xdb,  RESSETHandler},	{0xdc,  RESSETHandler},	{0xdd,  RESSETHandler},	{0xde,  RESSETHandler},	{0xdf,  RESSETHandler},	{0xe0,  RESSETHandler},	{0xe1,  RESSETHandler},	{0xe2,  RESSETHandler},	{0xe3,  RESSETHandler},	{0xe4,  RESSETHandler},	{0xe5,  RESSETHandler},	{0xe6,  RESSETHandler},	{0xe7,  RESSETHandler},	{0xe8,  RESSETHandler},	{0xe9,  RESSETHandler},	{0xea,  RESSETHandler},	{0xeb,  RESSETHandler},	{0xec,  RESSETHandler},	{0xed,  RESSETHandler},	{0xee,  RESSETHandler},	{0xef,  RESSETHandler},	{0xf0,  RESSETHandler},	{0xf1,  RESSETHandler},	{0xf2,  RESSETHandler},	{0xf3,  RESSETHandler},	{0xf4,  RESSETHandler},	{0xf5,  RESSETHandler},	{0xf6,  RESSETHandler},	{0xf7,  RESSETHandler},	{0xf8,  RESSETHandler},	{0xf9,  RESSETHandler},	{0xfa,  RESSETHandler},	{0xfb,  RESSETHandler},	{0xfc,  RESSETHandler},	{0xfd,  RESSETHandler},	{0xfe,  RESSETHandler},	{0xff,  RESSETHandler},	// Terminator	{0xffffffff, NULL}  };struct sOp EDOps[] ={	{0x67,  RRDRLDHandler},	{0x6f,  RRDRLDHandler},	{0x42,  AdcSbcRegpair},	{0x4a,  AdcSbcRegpair},	{0x52,  AdcSbcRegpair},	{0x5a,  AdcSbcRegpair},	{0x62,  AdcSbcRegpair},	{0x6a,  AdcSbcRegpair},	{0x72,  AdcSbcRegpair},	{0x7a,  AdcSbcRegpair},  	{0x45,  RetIRetNHandler},	{0x4d,  RetIRetNHandler},	{0x44,	NegHandler},	{0xa0,  LDILDRLDIRLDDRHandler},	{0xa8,  LDILDRLDIRLDDRHandler},	{0xb0,  LDILDRLDIRLDDRHandler},	{0xb8,  LDILDRLDIRLDDRHandler},	{0x57, IRHandler},	{0x5F, IRHandler},	{0x47, IRHandler},	{0x4F, IRHandler},	{0x46,  IMHandler},	{0x56,  IMHandler},	{0x5e,  IMHandler},	{0x4b,	LdRegpair},	{0x5b,	LdRegpair},	{0x7b,	LdRegpair},	{0x43,	ExtendedRegIntoMemory},	{0x53,	ExtendedRegIntoMemory},	{0x63,	ExtendedRegIntoMemory},	{0x73,	ExtendedRegIntoMemory},	{0x40, ExtendedInHandler},	{0x48, ExtendedInHandler},	{0x50, ExtendedInHandler},	{0x58, ExtendedInHandler},	{0x60, ExtendedInHandler},	{0x68, ExtendedInHandler},	{0x78, ExtendedInHandler},	{0x41, ExtendedOutHandler},	{0x49, ExtendedOutHandler},	{0x51, ExtendedOutHandler},	{0x59, ExtendedOutHandler},	{0x61, ExtendedOutHandler},	{0x69, ExtendedOutHandler},	{0x79, ExtendedOutHandler}, 	{0xa1,	CPICPDCPIRCPDRHandler},	{0xa9,	CPICPDCPIRCPDRHandler},	{0xb1,	CPICPDCPIRCPDRHandler},	{0xb9,	CPICPDCPIRCPDRHandler},	{0xbb,	OTIROTDROUTIOUTDHandler},			// OTDR	{0xb3,	OTIROTDROUTIOUTDHandler},			// OTIR	{0xab,	OTIROTDROUTIOUTDHandler},			// OUTD	{0xa3,	OTIROTDROUTIOUTDHandler},			// OUTI	{0xb2,	INIRINDRINIINDHandler},				// INIR	{0xba,	INIRINDRINIINDHandler},				// INDR	{0xa2,	INIRINDRINIINDHandler},				// INI	{0xaa,	INIRINDRINIINDHandler},				// IND	// Terminator	{0xffffffff, NULL}  };struct sOp DDFDOps[] ={	{0x35,  IncDecIndexed},	{0x34,  IncDecIndexed}, 	{0xcb,  DDFDCBHandler},	{0x86,  MathOperationIndexed},	{0x8e,  MathOperationIndexed},	{0x96,  MathOperationIndexed},	{0x9e,  MathOperationIndexed},	{0xa6,  MathOperationIndexed},	{0xae,  MathOperationIndexed},	{0xb6,  MathOperationIndexed},	{0xbe,  MathOperationIndexed},	{0xe1,  PushPopOperationsIndexed},	{0xe5,  PushPopOperationsIndexed},	{0x21,  LoadImmediate},	{0xe9,  JPIXIYHandler},	{0x09,  AddIndexHandler},	{0x19,  AddIndexHandler},	{0x29,  AddIndexHandler},	{0x39,  AddIndexHandler},	{0xf9,  SPToIndex},	{0x36,  LdByteToIndex},	{0x46,  LdRegIndexOffset},	{0x4e,  LdRegIndexOffset},	{0x56,  LdRegIndexOffset},	{0x5e,  LdRegIndexOffset},	{0x66,  LdRegIndexOffset},	{0x6e,  LdRegIndexOffset},	{0x7e,  LdRegIndexOffset}, 	{0x70,  LdIndexPtrReg},	{0x71,  LdIndexPtrReg},	{0x72,  LdIndexPtrReg},	{0x73,  LdIndexPtrReg},	{0x74,  LdIndexPtrReg},	{0x75,  LdIndexPtrReg},	{0x77,  LdIndexPtrReg},	{0x23,  IncDecIndexReg},	{0x2b,  IncDecIndexReg},	{0x22,  StoreIndexReg},	{0x2a,  LoadIndexReg},	{0xe3,  ExIndexed},	{0x44,	UndocRegToIndex},	{0x45,	UndocRegToIndex},	{0x4c,	UndocRegToIndex},	{0x4d,	UndocRegToIndex},	{0x54,	UndocRegToIndex},	{0x55,	UndocRegToIndex},	{0x5c,	UndocRegToIndex},	{0x5d,	UndocRegToIndex},	{0x7c,	UndocRegToIndex},	{0x7d,	UndocRegToIndex},	{0x60,	UndocIndexToReg},	{0x61,	UndocIndexToReg},	{0x62,	UndocIndexToReg},	{0x63,	UndocIndexToReg},	{0x64,	UndocIndexToReg},	{0x65,	UndocIndexToReg},	{0x67,	UndocIndexToReg},	{0x68,	UndocIndexToReg},	{0x69,	UndocIndexToReg},	{0x6a,	UndocIndexToReg},	{0x6b,	UndocIndexToReg},	{0x6c,	UndocIndexToReg},	{0x6d,	UndocIndexToReg},	{0x6f,	UndocIndexToReg},	{0x24,	UndocIncDecIndexReg},	{0x25,	UndocIncDecIndexReg},	{0x2c,	UndocIncDecIndexReg},	{0x2d,	UndocIncDecIndexReg},	{0x26,	UndocLoadHalfIndexReg},	{0x2e,	UndocLoadHalfIndexReg},	{0x84,	UndocMathIndex},	{0x85,	UndocMathIndex},	{0x8c,	UndocMathIndex},	{0x8d,	UndocMathIndex},	{0x94,	UndocMathIndex},	{0x95,	UndocMathIndex},	{0x9c,	UndocMathIndex},	{0x9d,	UndocMathIndex},	{0xa4,	UndocMathIndex},	{0xa5,	UndocMathIndex},	{0xac,	UndocMathIndex},	{0xad,	UndocMathIndex},	{0xb4,	UndocMathIndex},	{0xb5,	UndocMathIndex},	{0xbc,	UndocMathIndex},	{0xbd,	UndocMathIndex},	// Terminator	{0xffffffff, NULL}};struct sOp DDFDCBOps[] ={	{0x06,  ddcbBitWise},	{0x0e,  ddcbBitWise},	{0x16,  ddcbBitWise},	{0x1e,  ddcbBitWise},	{0x26,  ddcbBitWise},	{0x2e,  ddcbBitWise},	{0x3e,  ddcbBitWise},	{0x46,  ddcbBitWise},	{0x4e,  ddcbBitWise},	{0x56,  ddcbBitWise},	{0x5e,  ddcbBitWise},	{0x66,  ddcbBitWise},	{0x6e,  ddcbBitWise},	{0x76,  ddcbBitWise},	{0x7e,  ddcbBitWise},	{0x86,  ddcbBitWise},	{0x8e,  ddcbBitWise},	{0x96,  ddcbBitWise},	{0x9e,  ddcbBitWise},	{0xa6,  ddcbBitWise},	{0xae,  ddcbBitWise},	{0xb6,  ddcbBitWise},	{0xbe,  ddcbBitWise},	{0xc6,  ddcbBitWise},	{0xce,  ddcbBitWise},	{0xd6,  ddcbBitWise},	{0xde,  ddcbBitWise},	{0xe6,  ddcbBitWise},	{0xee,  ddcbBitWise},	{0xf6,  ddcbBitWise},	{0xfe,  ddcbBitWise},	// Terminator	{0xffffffff, NULL}};UINT32 Timing(UINT8 bWho, UINT32 dwOpcode){	UINT32 dwTiming = 0;	assert(dwOpcode < 0x100);	if (TIMING_REGULAR == bWho)	// Regular?		dwTiming = bTimingRegular[dwOpcode];	else	if (TIMING_CB == bWho)		dwTiming = bTimingCB[dwOpcode];	else	if (TIMING_DDFD == bWho)		dwTiming = bTimingDDFD[dwOpcode];	else	if (TIMING_ED == bWho)		dwTiming = bTimingED[dwOpcode];	else	if (TIMING_XXCB == bWho) 		dwTiming = bTimingXXCB[dwOpcode];	else	if (TIMING_EXCEPT == bWho)		dwTiming = dwOpcode;	else		assert(0);	if (0 == dwTiming)	{			fprintf(stderr, "Opcode: %.2x:%.2x - Not zero!\n", bWho, (UINT8) dwOpcode);		fclose(fp);		exit(1);	}	return(dwTiming);}void IndexedOffset(UINT8 *Localmz80Index){	fprintf(fp, "		mov	dl, [esi]	; Fetch our offset\n");	fprintf(fp, "		inc	esi		; Move past the offset\n");	fprintf(fp, "		or	dl, dl		; Is this bad boy signed?\n");	fprintf(fp, "		jns	notSigned%ld	; Nope!\n", dwGlobalLabel);	fprintf(fp, "		dec	dh			; Make it FFable\n");	fprintf(fp, "notSigned%ld:\n", dwGlobalLabel);	fprintf(fp, "		add	dx, [_z80%s]	; Our offset!\n", Localmz80Index);	++dwGlobalLabel;}void CBHandler(UINT32 dwOpcode){	fprintf(fp, ";\n");	fprintf(fp, "; Handler for all CBxx instructions\n");	fprintf(fp, ";\n");	sprintf(string, "RegInst%.2x", (UINT8) dwOpcode);	ProcBegin(0xffffffff);	fprintf(fp, "		mov	[_baseFixup], dword 1\n");	fprintf(fp, "		mov	dl, [esi]\n");	fprintf(fp, "		inc	esi\n");	fprintf(fp, "		jmp	dword [z80PrefixCB+edx*4]\n\n");	fprintf(fp, "\n\n");}void EDHandler(UINT32 dwOpcode){	fprintf(fp, ";\n");	fprintf(fp, "; Handler for all EDxx instructions\n");	fprintf(fp, ";\n");	sprintf(string, "RegInst%.2x", (UINT8) dwOpcode);	ProcBegin(0xffffffff);	fprintf(fp, "		mov	[_baseFixup], dword 1\n");	fprintf(fp,     "		mov	dl, [esi]\n");	fprintf(fp, "		inc	esi\n");	fprintf(fp,     "		jmp	dword [z80PrefixED+edx*4]\n\n");	fprintf(fp, "\n\n");}void DDHandler(UINT32 dwOpcode){	fprintf(fp, ";\n");	fprintf(fp, "; Handler for all DDxx instructions\n");	fprintf(fp, ";\n");	sprintf(string, "RegInst%.2x", (UINT8) dwOpcode);	ProcBegin(0xffffffff);	fprintf(fp, "		mov	[_baseFixup], dword 1\n");	fprintf(fp,     "		mov	dl, [esi]\n");	fprintf(fp, "		inc	esi\n");	fprintf(fp,     "		jmp	dword [z80PrefixDD+edx*4]\n\n");	fprintf(fp, "\n\n");}void FDHandler(UINT32 dwOpcode){	fprintf(fp, ";\n");	fprintf(fp, "; Handler for all FDxx instructions\n");	fprintf(fp, ";\n");	sprintf(string, "RegInst%.2x", (UINT8) dwOpcode);	ProcBegin(0xffffffff);	fprintf(fp, "		mov	[_baseFixup], dword 1\n");	fprintf(fp,     "		mov	dl, [esi]\n");	fprintf(fp, "		inc	esi\n");	fprintf(fp,     "		jmp	dword [z80PrefixFD+edx*4]\n\n");	fprintf(fp, "\n\n");}void StandardHeader(void){	fprintf(fp,"; For assembly by NASM only\n");	fprintf(fp,"bits 32\n\n");	fprintf(fp,"; Theory of operation\n\n");	fprintf(fp,"; EDI=General purpose\n");	fprintf(fp,"; ESI=Program counter + base address\n");	fprintf(fp,"; EBP=mz80Base\n");	fprintf(fp,"; AX=AF\n");	fprintf(fp,"; BX=HL\n");	fprintf(fp,"; CX=BC\n");	fprintf(fp,"; DX=General purpose\n\n"); 	if (bUseStack)		fprintf(fp, "; Using stack calling conventions\n");	else		fprintf(fp, "; Using register calling conventions\n");	if (bSingleStep)		fprintf(fp, "; Single step version (debug)\n");	if (b16BitIo)		fprintf(fp, "; Extended input/output instructions treat (BC) as I/O address\n");	else		fprintf(fp, "; Extended input/output instructions treat (C) as I/O address\n");	fprintf(fp, "\n\n");}void Alignment(void){	fprintf(fp, "\ntimes ($$-$) & 3 nop	; pad with NOPs to 4-byte boundary\n\n");}void ProcBegin(UINT32 dwOpcode){	Alignment();	fprintf(fp, "%s:\n", procname);#if 0	fprintf(fp, "		push	eax\n");	fprintf(fp, "		push	edx\n");	fprintf(fp, "		push	ebx\n");	fprintf(fp, "		mov	ebx, 0b0000h\n");	fprintf(fp, "		mov	al, dl\n");	fprintf(fp, "		and	al, 0f0h\n");	fprintf(fp, "		shr	al, 4\n");	fprintf(fp, "		cmp	al, 9\n");	fprintf(fp, "		jbe	noHose%ld\n", dwGlobalLabel);	fprintf(fp, "		add	al, 7\n");	fprintf(fp, "noHose%ld:\n", dwGlobalLabel++);	fprintf(fp, "		add	al, '0'\n");	fprintf(fp, "		mov	[ds:ebx], al\n");	fprintf(fp, "		mov	al, dl\n");	fprintf(fp, "		and	al, 0fh\n");	fprintf(fp, "		cmp	al, 9\n");	fprintf(fp, "		jbe	noHose%ld\n", dwGlobalLabel);	fprintf(fp, "		add	al, 7\n");	fprintf(fp, "noHose%ld:\n", dwGlobalLabel++);	fprintf(fp, "		add	al, '0'\n");	fprintf(fp, "		mov	[ds:ebx+2], al\n");	fprintf(fp, "		pop	ebx\n");	fprintf(fp, "		pop	edx\n");	fprintf(fp, "		pop	eax\n");#endif	if (0xffffffff != dwOpcode)	{		if (FALSE == bSingleStep)		{					fprintf(fp, "		sub	dword [cyclesRemaining], byte %ld\n", Timing(bCurrentMode, dwOpcode));					if (bCurrentMode == TIMING_REGULAR)				fprintf(fp, "		js	near noMoreExec\n");			else				fprintf(fp, "		js	near noMoreExec2\n");		}		else		{			fprintf(fp, "		dec	dword [cyclesRemaining]	; Single stepping (debugger)\n");			if (bCurrentMode == TIMING_REGULAR)				fprintf(fp, "		js	near noMoreExec\n");

⌨️ 快捷键说明

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