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

📄 makez80.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 5 页
字号:
	// ---- Exit -----------------------------------------------------------	fprintf(fp, "readExit%ld:				\n", dwGlobalLabel);	dwGlobalLabel++;}#elsevoid ReadValueFromMemory(UINT8 *pszAddress, UINT8 *pszTarget){	fprintf(fp, "		mov	edi, [_z80MemRead]	; Point to the read array\n\n");	fprintf(fp, "checkLoop%ld:\n", dwGlobalLabel);	fprintf(fp, "		cmp	%s, [edi]		; Are we smaller?\n", pszAddress);	fprintf(fp, "		jb	nextAddr%ld		; Yes, go to the next address\n", dwGlobalLabel);	fprintf(fp, "		cmp	%s, [edi+4]		; Are we bigger?\n", pszAddress);	fprintf(fp, "		jbe	callRoutine%ld\n\n", dwGlobalLabel);	fprintf(fp, "		cmp	[edi], word 0ffffh	; End of the list?\n");	fprintf(fp, "		je	memoryRead%ld\n", dwGlobalLabel);	fprintf(fp, "nextAddr%ld:\n", dwGlobalLabel);	fprintf(fp, "		add	edi, 10h		; Next structure!\n");	fprintf(fp, "		jmp	short checkLoop%ld\n\n", dwGlobalLabel);	fprintf(fp, "callRoutine%ld:\n", dwGlobalLabel);	// Check internal/external read	fprintf(fp, "		cmp	dword[edi+8],byte 0 	; [J3d!] Use internal read?\n");	fprintf(fp, "		jne	short callRead%ld\n", dwGlobalLabel);	// ---- Internal read --------------------------------------------------	fprintf(fp, "memoryRead%ld:\n", dwGlobalLabel);	fprintf(fp, "		mov	edi, [edi+12] 		; [J3d!] Get offset\n");	if (pszTarget[0] == 'b' && pszTarget[1] == 'y' && pszTarget[2] == 't')	{		fprintf(fp, "		push	edx\n");		fprintf(fp, "		mov	dl, [edi + e%s]\n", pszAddress);		fprintf(fp, "		mov	%s, dl\n", pszTarget);		fprintf(fp, "		pop	edx\n");	}	else		fprintf(fp, "		mov	%s, [edi + e%s]	; Get our data\n\n", pszTarget, pszAddress);	fprintf(fp, "		jmp	short readExit%ld\n\n", dwGlobalLabel);	// ---- External read --------------------------------------------------	fprintf(fp, "callRead%ld:\n", dwGlobalLabel);	if (strcmp(pszAddress, "dx") != 0)		fprintf(fp, "		mov	dx, %s		; Get our address\n", pszAddress);	fprintf(fp, "		call	ReadMemoryByte	; Standard read routine\n");	// Yes, these are intentionally reversed!	if (strcmp(pszTarget, "al") == 0)		fprintf(fp, "		mov	[_z80af], al	; Save our new accumulator\n");	else	if (strcmp(pszTarget, "ah") == 0)		fprintf(fp, "		mov	[_z80af + 1], al	; Save our new flags\n");	else		fprintf(fp, "		mov	%s, al	; Put our returned value here\n", pszTarget);	// And are properly restored HERE:	fprintf(fp, "		mov	ax, [_z80af]	; Get our AF back\n");	// Exit	fprintf(fp, "readExit%ld:\n", dwGlobalLabel);	dwGlobalLabel++;}#endif#ifdef WORD_ACCESSvoid ReadWordFromMemory(UINT8 *pszAddress, UINT8 *pszTarget){	if (strcmp(pszTarget, "di") == 0)	{	fprintf(fp, "		; ERROR !!\n");	}	fprintf(fp, "		mov	edi, [_z80MemRead]	; Point to the read array\n\n", cpubasename);	fprintf(fp, "checkLoop%ld:				\n", dwGlobalLabel);	fprintf(fp, "		cmp	%s, [edi]		; Are we smaller?\n", pszAddress);	fprintf(fp, "		jb	nextAddr%ld		; Yes, go to the next address\n", dwGlobalLabel);	fprintf(fp, "		cmp	%s, [edi+4]		; Are we bigger?\n", pszAddress);	fprintf(fp, "		jbe	callRoutine%ld		\n\n", dwGlobalLabel);	fprintf(fp, "		cmp	[edi], word 0ffffh 	; End of the list?\n");	fprintf(fp, "		je	memoryRead%ld		\n", dwGlobalLabel);	fprintf(fp, "nextAddr%ld:				\n", dwGlobalLabel);	fprintf(fp, "		add	edi, 10h		; Next structure!\n");	fprintf(fp, "		jmp	short checkLoop%ld	\n\n", dwGlobalLabel);	fprintf(fp, "callRoutine%ld:				\n", dwGlobalLabel);	// Check internal/external read	fprintf(fp, "		cmp	dword[edi+8],byte 0 	; [J3d!] Use internal read?\n");	fprintf(fp, "		jne	short callRead%ld	\n", dwGlobalLabel);	// ---- Internal read --------------------------------------------------	fprintf(fp, "memoryRead%ld:				\n", dwGlobalLabel);	fprintf(fp, "		mov	edi, [edi+12] 		; [J3d!] Get offset\n");	if (strlen(pszTarget) == 2)				// Register	{	fprintf(fp, "		mov	%s, [edi + e%s]		\n", pszTarget, pszAddress);	if (strcmp(pszTarget, "ax") == 0)	{	fprintf(fp, "		xchg	ah, al			; New AF/ACC\n");	}	}	else							// Memory	{	fprintf(fp, "		mov	dx, [edi + e%s]		\n", pszAddress);	fprintf(fp, "		mov	%s, dx			\n", pszTarget);	}	fprintf(fp, "		jmp	short readExit%ld\n\n", dwGlobalLabel);	// ---- External read --------------------------------------------------	fprintf(fp, "callRead%ld:\n", dwGlobalLabel);	if (strcmp(pszAddress, "dx") != 0)	fprintf(fp, "		mov	dx, %s			; Get our address\n", pszAddress);	if (strcmp(pszTarget, "ax") != 0)	fprintf(fp, "		push	ax			; Save this for later\n");	fprintf(fp, "		push	dx			; Save address\n");	fprintf(fp, "		call	ReadMemoryByte		; Standard read routine\n");	fprintf(fp, "		pop	dx			; Restore our address\n");	fprintf(fp, "		inc	dx			; Next byte, please\n");	fprintf(fp, "		push	ax			; Save returned byte\n");	fprintf(fp, "		call	ReadMemoryByte		; Standard read routine\n");	fprintf(fp, "		pop	dx			; Restore LSB\n");	fprintf(fp, "		mov	dh, al			; Our word is now in DX\n");	// DX Now has our data and our address is toast	if (strcmp(pszTarget, "ax") != 0)			// non-ax	{	fprintf(fp, "		pop	ax			; Restore this\n");	if (strcmp(pszTarget, "dx") != 0)	{	fprintf(fp, "		mov	%s, dx			; Store our word\n", pszTarget);	}	}	else							// ax	{	fprintf(fp, "		mov	ax, dx			\n");	fprintf(fp, "		xchg	ah, al			\n");	}	// ---- Exit -----------------------------------------------------------	fprintf(fp, "readExit%ld:				\n", dwGlobalLabel);	dwGlobalLabel++;}#endifvoid ReadValueFromIo(UINT8 *pszIoAddress, UINT8 *pszTarget){	fprintf(fp, "		mov	edi, [_z80IoRead]	; Point to the read array\n\n");	fprintf(fp, "checkLoop%ld:\n", dwGlobalLabel);	fprintf(fp, "		cmp	[edi], word 0ffffh ; End of the list?\n");	fprintf(fp, "		je		ioRead%ld\n", dwGlobalLabel);	fprintf(fp, "		cmp	%s, [edi]	; Are we smaller?\n", pszIoAddress);	fprintf(fp, "		jb		nextAddr%ld		; Yes, go to the next address\n", dwGlobalLabel);	fprintf(fp, "		cmp	%s, [edi+2]	; Are we bigger?\n", pszIoAddress);	fprintf(fp, "		jbe	callRoutine%ld\n\n", dwGlobalLabel);	fprintf(fp, "nextAddr%ld:\n", dwGlobalLabel);	fprintf(fp, "		add	edi, 0ch		; Next structure!\n");	fprintf(fp, "		jmp	short checkLoop%ld\n\n", dwGlobalLabel);	fprintf(fp, "callRoutine%ld:\n", dwGlobalLabel);	if (strcmp(pszIoAddress, "dx") != 0)		fprintf(fp, "		mov	dx, %s	; Get our address\n", pszIoAddress);	fprintf(fp, "		call	ReadIOByte	; Standard read routine\n");	// Yes, these are intentionally reversed!	if (strcmp(pszTarget, "al") == 0)		fprintf(fp, "		mov	[_z80af], al	; Save our new accumulator\n");	else	if (strcmp(pszTarget, "ah") == 0)		fprintf(fp, "		mov	[_z80af + 1], ah	; Save our new flags\n");	else	if (strcmp(pszTarget, "dl") == 0)		fprintf(fp, "		mov	[_z80de], al	; Put it in E\n");	else	if (strcmp(pszTarget, "dh") == 0)		fprintf(fp, "		mov	[_z80de + 1], al ; Put it in D\n");	else	if (strcmp(pszTarget, "*dl") == 0)		fprintf(fp, "		mov	dl, al	; Put it in DL for later consumption\n");	else		fprintf(fp, "		mov	%s, al	; Put our returned value here\n", pszTarget);	// And are properly restored HERE:	fprintf(fp, "		mov	ax, [_z80af]	; Get our AF back\n");	// Restore registers here...	fprintf(fp, "		jmp	short readExit%ld\n\n", dwGlobalLabel);	fprintf(fp, "ioRead%ld:\n", dwGlobalLabel);		if (strcmp(pszTarget, "*dl") == 0)		fprintf(fp, "		mov	dl, 0ffh	; An unreferenced read\n");	else		fprintf(fp, "		mov	%s, 0ffh	; An unreferenced read\n", pszTarget);	fprintf(fp, "readExit%ld:\n", dwGlobalLabel);	dwGlobalLabel++;}// Basic instruction set areavoid MiscHandler(UINT32 dwOpcode){	ProcBegin(dwOpcode);	if (dwOpcode == 0xe3)	{		if (bThroughCallHandler)		{			fprintf(fp, "		call	PopWord\n");			fprintf(fp, "		xchg	bx, [_wordval]\n");			fprintf(fp, "		call	PushWord\n");		}		else		{			fprintf(fp, "		mov	dx, word [_z80sp]\n");			fprintf(fp, "		xchg	bx, [ebp+edx]\n");			CLEAR_DH();		}	}	if (dwOpcode == 0x2a)	{		fprintf(fp, "		mov	dx, [esi]	; Get address to load\n");		fprintf(fp, "		add	esi, 2	; Skip over it so we don't execute it\n");#ifdef WORD_ACCESS		ReadWordFromMemory("dx", "bx");#else		ReadValueFromMemory("dx", "bl");		fprintf(fp, "		inc	dx\n");		ReadValueFromMemory("dx", "bh");#endif		CLEAR_DH();	}	if (dwOpcode == 0xfb)	{		fprintf(fp, "		mov	dword [_z80interruptState], 1	; Interrupts enabled now\n");		fprintf(fp, "		mov	dword [_z80inInterrupt], 0	; Not in an interrupt\n");	}	if (dwOpcode == 0xf9)		fprintf(fp, "		mov	word [_z80sp], bx\n");	if (dwOpcode == 0xd9)	{		fprintf(fp, "		mov	di, [_z80de]\n");		fprintf(fp, "		xchg	cx, [_z80bcprime]\n");		fprintf(fp, "		xchg	di, [_z80deprime]\n");		fprintf(fp, "		xchg	bx, [_z80hlprime]\n");		fprintf(fp, "		mov	[_z80de], di\n");	}	if (dwOpcode == 0x76)	{		fprintf(fp, "		mov	dword [_z80halted], 1	; We've halted the chip!\n");		fprintf(fp, "		mov	edx, dword [cyclesRemaining] ; Get the time remaining\n");		if (FALSE == bNoTiming)		{			fprintf(fp, "		add	[dwElapsedTicks], edx ; Fake like we did it\n");		}		fprintf(fp, "		inc	esi\n");		fprintf(fp, "		jmp	noMoreExec\n");	}	if (dwOpcode == 0x3f)	{		fprintf(fp, "		mov	dl, ah\n");		fprintf(fp, "		and	dl, 01h\n");		fprintf(fp, "		shl	dl, 4\n");		fprintf(fp, "		xor	ah, 01h\n");		fprintf(fp, "		and	ah, 0edh\n");		fprintf(fp, "		or	ah, dl\n");	}	if (dwOpcode == 0x37)	{		fprintf(fp, "		or	ah, 1\n");		fprintf(fp, "		and	ah,0edh\n");	}	if (dwOpcode == 0x27)	{		fprintf(fp, "		mov	dh, ah\n");		fprintf(fp, "		and	dh, 02ah\n");		fprintf(fp, "		test	ah, 02h	; Were we doing a subtraction?\n");		fprintf(fp, "		jnz	handleNeg ; Nope!\n");		fprintf(fp, "		sahf\n");		fprintf(fp, "		daa\n");		fprintf(fp, "		lahf\n");		fprintf(fp, "		jmp	short endDaa\n");		fprintf(fp, "handleNeg:\n");		fprintf(fp, "		sahf\n");		fprintf(fp, "		das\n");		fprintf(fp, "		lahf\n");		fprintf(fp, "endDaa:\n");		fprintf(fp, "		and	ah, 0d5h\n");		fprintf(fp, "		or	ah, dh\n");		CLEAR_DH();	}	if (dwOpcode == 0x08)	{		fprintf(fp, "		xchg	ah, al\n");		fprintf(fp, "		xchg	ax, [_z80afprime]\n");		fprintf(fp, "		xchg	ah, al\n");	}	if (dwOpcode == 0x07)	{		fprintf(fp, "		sahf\n");		fprintf(fp, "		rol	al, 1\n");		fprintf(fp, "		lahf\n");		fprintf(fp, "		and	ah, 0edh\n");	}	if (dwOpcode == 0x0f)	{		fprintf(fp, "		sahf\n");		fprintf(fp, "		ror	al, 1\n");		fprintf(fp, "		lahf\n");		fprintf(fp, "		and	ah, 0edh\n");	}	if (dwOpcode == 0xe9)	{		fprintf(fp, "		mov	si, bx\n");		fprintf(fp, "		and	esi, 0ffffh\n");		fprintf(fp, "		add	esi, ebp\n");	}	if (dwOpcode == 0xeb)		fprintf(fp, "		xchg	[_z80de], bx	; Exchange DE & HL\n");	if (dwOpcode == 0x2f)	{		fprintf(fp, "		not	al\n");		fprintf(fp, "		or	ah, 012h	; N And H are now on!\n");	}	if (dwOpcode == 0x10)	// DJNZ	{		fprintf(fp, "		mov	dl, [esi] ; Get our relative offset\n");		fprintf(fp, "		inc	esi	; Next instruction, please!\n");		fprintf(fp, "		dec	ch	; Decrement B\n");		fprintf(fp, "		jz	noJump	; Don't take the jump if it's done!\n");		fprintf(fp, "; Otherwise, take the jump\n");		if (FALSE == bNoTiming)		{			fprintf(fp, "		add	dword [dwElapsedTicks], 5\n");		}		if (FALSE == bSingleStep)			fprintf(fp, "		sub	dword [cyclesRemaining], 5\n");		fprintf(fp, "		xchg	ax, dx\n");		fprintf(fp, "		cbw\n");		fprintf(fp, "		xchg	ax, dx\n");		fprintf(fp, "		sub	esi, ebp\n");		fprintf(fp, "		add	si, dx\n");		fprintf(fp, "		add	esi, ebp\n");		fprintf(fp, "noJump:\n");		CLEAR_DH();	}	if (dwOpcode == 0x3a)	// LD A,(xxxx)	{		fprintf(fp, "		mov	dx, [esi]	; Get our address\n");		fprintf(fp, "		add	esi, 2		; Skip past the address\n");		ReadValueFromMemory("dx", "al");		CLEAR_DH();	}	if (dwOpcode == 0xf3)  	// DI	{		fprintf(fp, "		mov	dword [_z80interruptState], 0	; Interrupts disabled now\n");		fprintf(fp, "		mov	dword [_z80inInterrupt], 0	; Not in an interrupt\n");	}	FetchNextInstruction();}void LdRegPairImmediate(UINT32 dwOpcode){	UINT8 bOp = 0;	ProcBegin(dwOpcode);	bOp = (dwOpcode >> 4) & 0x3;	if (bOp == 0)		fprintf(fp, "		mov	cx, [esi]	; Get our immediate value of BC\n");	else	if (bOp == 2)		fprintf(fp, "		mov	bx, [esi]	; Get our immediate value of HL\n");	else	if (bOp == 1)	{		fprintf(fp, "		mov	di, [esi]	; Get our immediate value of DE\n");		fprintf(fp, "		mov	word [_z80de], di ; Store DE\n");	}	else	if (bOp == 3)	{		fprintf(fp, "		mov	di, [esi]	; Get our imme

⌨️ 快捷键说明

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