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