📄 makez80.c
字号:
{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 + -