?? makez80.c
字號(hào):
{ fprintf(fp, " psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */\n"); fprintf(fp, " while (psMemWrite->lowAddr != 0xffffffff)\n"); fprintf(fp, " {\n"); fprintf(fp, " if ((%s >= psMemWrite->lowAddr) && (%s <= psMemWrite->highAddr))\n", pszAddress, pszAddress); fprintf(fp, " {\n"); fprintf(fp, " cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;\n"); fprintf(fp, " if (psMemWrite->memoryCall)\n"); fprintf(fp, " {\n"); fprintf(fp, " psMemWrite->memoryCall(%s, %s, psMemWrite);\n", pszAddress, pszValue); fprintf(fp, " }\n"); fprintf(fp, " else\n"); fprintf(fp, " {\n"); fprintf(fp, " *((UINT8 *) psMemWrite->pUserArea + (%s - psMemWrite->lowAddr)) = %s;\n", pszAddress, pszValue); fprintf(fp, " }\n"); fprintf(fp, " psMemWrite = NULL;\n"); fprintf(fp, " break;\n"); fprintf(fp, " }\n"); fprintf(fp, " ++psMemWrite;\n"); fprintf(fp, " }\n\n"); fprintf(fp, " if (psMemWrite)\n"); fprintf(fp, " {\n"); fprintf(fp, " cpu.z80Base[%s] = (UINT8) %s;\n", pszAddress, pszValue); fprintf(fp, " }\n\n"); }}void WriteWordToMemory(UINT8 *pszAddress, UINT8 *pszTarget){ if (MZ80_ASSEMBLY_X86 == bWhat) { fprintf(fp, " mov [cyclesRemaining], edi\n"); fprintf(fp, " mov edi, [_z80MemWrite] ; Point to the write array\n\n", cpubasename); fprintf(fp, "checkLoop%ld:\n", dwGlobalLabel); fprintf(fp, " cmp [edi], word 0ffffh ; End of the list?\n"); fprintf(fp, " je memoryWrite%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, "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); // [Kayamon] - big internal/external system was added here // Check internal/external write fprintf(fp, " cmp dword[edi+8],byte 0 ; Use internal write?\n"); fprintf(fp, " jne short callWrite%ld \n", dwGlobalLabel); // ---- Internal write ------------------------------------------------- fprintf(fp, "memoryWrite%ld: \n", dwGlobalLabel); fprintf(fp, " mov edi, [edi+12] ; Get offset\n"); if (strlen(pszTarget) != 2) // It's not a register { fprintf(fp, " push eax \n"); fprintf(fp, " mov ax, %s \n", pszTarget); fprintf(fp, " mov [edi + e%s], ax ; Store our word\n", pszAddress); fprintf(fp, " pop eax \n"); } else { // It's a register if (strcmp(pszTarget, "ax") != 0) // not ax { fprintf(fp, " mov [edi + e%s], %s ; Store our word\n", pszAddress, pszTarget); } else { // ax fprintf(fp, " xchg ah, al ; Swap for later\n"); fprintf(fp, " mov [edi + e%s], ax ; Store our word\n", pszAddress); fprintf(fp, " xchg ah, al ; Restore\n"); } } fprintf(fp, " jmp short writeExit%ld \n", dwGlobalLabel); // ---- External write ------------------------------------------------- fprintf(fp, "callWrite%ld: \n", dwGlobalLabel); fprintf(fp, " push ax ; Save this for later\n"); // Write the LSB fprintf(fp, " push dx\n"); if (strcmp(pszTarget, "ax") != 0) { fprintf(fp, " mov ax, %s\n", pszTarget); } else { fprintf(fp, " xchg ah, al\n"); } fprintf(fp, " call WriteMemoryByte\n"); fprintf(fp, " pop dx\n"); fprintf(fp, " pop ax\n"); fprintf(fp, " inc dx\n\n"); fprintf(fp, " push ax\n"); fprintf(fp, " push dx\n"); if (strcmp(pszTarget, "ax") != 0) { fprintf(fp, " mov ax, %s\n", pszTarget); fprintf(fp, " xchg ah, al\n"); } fprintf(fp, " call WriteMemoryByte\n"); fprintf(fp, " pop dx\n"); fprintf(fp, " pop ax ; Restore us!\n"); fprintf(fp, "writeExit%ld:\n", dwGlobalLabel); fprintf(fp, " mov edi, [cyclesRemaining]\n"); dwGlobalLabel++; } else if (MZ80_C == bWhat) { fprintf(fp, " psMemWrite = cpu.z80MemWrite; /* Beginning of our handler */\n"); fprintf(fp, " while (psMemWrite->lowAddr != 0xffffffff)\n"); fprintf(fp, " {\n"); fprintf(fp, " if ((%s >= psMemWrite->lowAddr) && (%s <= psMemWrite->highAddr))\n", pszAddress, pszAddress); fprintf(fp, " {\n"); fprintf(fp, " cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;\n"); fprintf(fp, " if (psMemWrite->memoryCall)\n"); fprintf(fp, " {\n"); fprintf(fp, " psMemWrite->memoryCall(%s, (%s & 0xff), psMemWrite);\n", pszAddress, pszTarget); fprintf(fp, " psMemWrite->memoryCall(%s + 1, (%s >> 8), psMemWrite);\n", pszAddress, pszTarget); fprintf(fp, " }\n"); fprintf(fp, " else\n"); fprintf(fp, " {\n"); fprintf(fp, " *((UINT8 *) psMemWrite->pUserArea + (%s - psMemWrite->lowAddr)) = %s;\n", pszAddress, pszTarget); fprintf(fp, " *((UINT8 *) psMemWrite->pUserArea + (%s - psMemWrite->lowAddr) + 1) = %s >> 8;\n", pszAddress, pszTarget); fprintf(fp, " }\n"); fprintf(fp, " psMemWrite = NULL;\n"); fprintf(fp, " break;\n"); fprintf(fp, " }\n"); fprintf(fp, " ++psMemWrite;\n"); fprintf(fp, " }\n\n"); fprintf(fp, " if (psMemWrite)\n"); fprintf(fp, " {\n"); fprintf(fp, " cpu.z80Base[%s] = (UINT8) %s;\n", pszAddress, pszTarget); fprintf(fp, " cpu.z80Base[%s + 1] = (UINT8) ((UINT32) %s >> 8);\n", pszAddress, pszTarget); fprintf(fp, " }\n\n"); } else { assert(0); }}void WriteValueToIo(UINT8 *pszIoAddress, UINT8 *pszValue){ if (MZ80_ASSEMBLY_X86 == bWhat) { fprintf(fp, " mov [cyclesRemaining], edi\n"); fprintf(fp, " mov [_z80af], ax ; Store AF\n"); if (strcmp(pszValue, "al") != 0) fprintf(fp, " mov al, %s ; And our data to write\n", pszValue); if (strcmp(pszValue, "[esi]") == 0) // Immediate value? fprintf(fp, " inc esi ; Increment our program counter\n"); fprintf(fp, " mov edi, [_z80IoWrite] ; Point to the I/O write array\n\n", cpubasename); fprintf(fp, "checkLoop%ld:\n", dwGlobalLabel); fprintf(fp, " cmp [edi], word 0ffffh ; End of our list?\n"); fprintf(fp, " je WriteMacroExit%ld ; Yes - ignore it!\n", dwGlobalLabel); fprintf(fp, " cmp %s, [edi] ; Are we smaller?\n", pszIoAddress); fprintf(fp, " jb nextAddr%ld ; Yes... go to the next addr\n", dwGlobalLabel); fprintf(fp, " cmp %s, [edi+2] ; Are we bigger?\n", pszIoAddress); fprintf(fp, " jbe callRoutine%ld ; If not, go call it!\n\n", dwGlobalLabel); fprintf(fp, "nextAddr%ld:\n", dwGlobalLabel); fprintf(fp, " add edi, 0ch ; Next structure, please\n"); fprintf(fp, " jmp short checkLoop%ld\n\n", dwGlobalLabel); fprintf(fp, "callRoutine%ld:\n", dwGlobalLabel); // Save off our registers! if (strcmp(pszIoAddress, "dx") != 0) fprintf(fp, " mov dx, %s ; Get our address to target\n", pszIoAddress); fprintf(fp, " call WriteIOByte ; Go write the data!\n"); fprintf(fp, "WriteMacroExit%ld:\n", dwGlobalLabel); fprintf(fp, " mov edi, [cyclesRemaining]\n"); } else if (MZ80_C == bWhat) { fprintf(fp, " psIoWrite = cpu.z80IoWrite; /* Beginning of our handler */\n"); fprintf(fp, " while (psIoWrite->lowIoAddr != 0xffff)\n"); fprintf(fp, " {\n"); fprintf(fp, " if ((%s >= psIoWrite->lowIoAddr) && (%s <= psIoWrite->highIoAddr))\n", pszIoAddress, pszIoAddress); fprintf(fp, " {\n"); fprintf(fp, " cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;\n"); fprintf(fp, " psIoWrite->IOCall(%s, %s, psIoWrite);\n", pszIoAddress, pszValue); fprintf(fp, " psIoWrite = NULL;\n"); fprintf(fp, " break;\n"); fprintf(fp, " }\n"); fprintf(fp, " ++psIoWrite;\n"); fprintf(fp, " }\n\n"); } else { assert(0); } ++dwGlobalLabel;}void ReadValueFromMemory(UINT8 *pszAddress, UINT8 *pszTarget){ if (MZ80_ASSEMBLY_X86 == bWhat) { fprintf(fp, " mov [cyclesRemaining], edi\n"); fprintf(fp, " mov edi, [_z80MemRead] ; Point to the read array\n\n", cpubasename); fprintf(fp, "checkLoop%ld:\n", dwGlobalLabel); fprintf(fp, " cmp [edi], word 0ffffh ; End of the list?\n"); fprintf(fp, " je memoryRead%ld\n", dwGlobalLabel); fprintf(fp, " cmp e%s, [edi] ; Are we smaller?\n", pszAddress); fprintf(fp, " jb nextAddr%ld ; Yes, go to the next address\n", dwGlobalLabel); fprintf(fp, " cmp e%s, [edi+4] ; Are we bigger?\n", pszAddress); fprintf(fp, " jbe callRoutine%ld\n\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); // [Kayamon] - big internal/external read section goes here // ---- Check internal/external read ----------------------------------- fprintf(fp, "callRoutine%ld: \n", dwGlobalLabel); fprintf(fp, " cmp dword[edi+8],byte 0 ; 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] ; 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", 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"); // Restore registers here... fprintf(fp, "readExit%ld:\n", dwGlobalLabel); fprintf(fp, " mov edi, [cyclesRemaining]\n"); dwGlobalLabel++; } else if (MZ80_C == bWhat) { fprintf(fp, " psMemRead = cpu.z80MemRead; /* Beginning of our handler */\n"); fprintf(fp, " while (psMemRead->lowAddr != 0xffffffff)\n"); fprintf(fp, " {\n"); fprintf(fp, " if ((%s >= psMemRead->lowAddr) && (%s <= psMemRead->highAddr))\n", pszAddress, pszAddress); fprintf(fp, " {\n"); fprintf(fp, " cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;\n"); fprintf(fp, " if (psMemRead->memoryCall)\n"); fprintf(fp, " {\n"); fprintf(fp, " %s = psMemRead->memoryCall(%s, psMemRead);\n", pszTarget, pszAddress); fprintf(fp, " }\n"); fprintf(fp, " else\n"); fprintf(fp, " {\n"); fprintf(fp, " %s = *((UINT8 *) psMemRead->pUserArea + (%s - psMemRead->lowAddr));\n", pszTarget, pszAddress); fprintf(fp, " }\n"); fprintf(fp, " psMemRead = NULL;\n"); fprintf(fp, " break;\n"); fprintf(fp, " }\n"); fprintf(fp, " ++psMemRead;\n"); fprintf(fp, " }\n\n"); fprintf(fp, " if (psMemRead)\n"); fprintf(fp, " {\n"); fprintf(fp, " %s = cpu.z80Base[%s];\n", pszTarget, pszAddress); fprintf(fp, " }\n\n"); } else { assert(0); }}void ReadWordFromMemory(UINT8 *pszAddress, UINT8 *pszTarget){ if (MZ80_ASSEMBLY_X86 == bWhat) { fprintf(fp, " mov [cyclesRemaining], edi\n"); fprintf(fp, " mov edi, [_z80MemRead] ; Point to the read array\n\n", cpubasename); fprintf(fp, "checkLoop%ld:\n", dwGlobalLabel); fprintf(fp, " cmp [edi], word 0ffffh ; End of the list?\n"); fprintf(fp, " je memoryRead%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, "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); // [Kayamon] - another big internal/external read section... // Check internal/external read fprintf(fp, " cmp dword[edi+8],byte 0 ; 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] ; 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, " xchg ah, al ; Swap for endian's sake\n"); fprintf(fp, " pop dx ; Restore LSB\n"); fprintf(fp, " mov dh, ah ; Our word is now in DX\n"); // DX Now has our data and our address is toast if (strcmp(pszTarget, "ax") != 0) { fprintf(fp, " pop ax ; Restore this\n"); if (strcmp(pszTarget, "dx") != 0) { fprintf(fp, " mov %s, dx ; Store our word\n", pszTarget); } } else fprintf(fp, " mov ax, dx\n"); if (strcmp(pszTarget, "ax") == 0) { fprintf(fp, " xchg ah, al\n"); } fprintf(fp, "readExit%ld:\n", dwGlobalLabel); fprintf(fp, " mov edi, [cyclesRemaining]\n"); } else if (MZ80_C == bWhat) { fprintf(fp, " psMemRead = cpu.z80MemRead; /* Beginning of our handler */\n"); fprintf(fp, " while (psMemRead->lowAddr != 0xffffffff)\n"); fprintf(fp, " {\n"); fprintf(fp, " if ((%s >= psMemRead->lowAddr) && (%s <= psMemRead->highAddr))\n", pszAddress, pszAddress); fprintf(fp, " {\n"); fprintf(fp, " cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;\n"); fprintf(fp, " if (psMemRead->memoryCall)\n"); fprintf(fp, " {\n"); fprintf(fp, " %s = psMemRead->memoryCall(%s, psMemRead);\n", pszTarget, pszAddress); fprintf(fp, " %s |= (UINT32) ((UINT32) psMemRead->memoryC
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -