--- xmil/z80c/z80c.c 2004/08/11 12:08:17 1.4 +++ xmil/z80c/z80c.c 2004/08/20 23:01:16 1.8 @@ -11,15 +11,18 @@ #include "parts.h" #include "z80core.h" #include "z80c.h" +#include "pccore.h" +#include "iocore.h" #include "z80c.mcr" Z80CORE z80core; + UINT8 mainmem[0x10000]; - UINT8 ZSPtable[256]; - UINT8 z80inc_flag[256]; - UINT8 z80dec_flag[256]; + UINT8 z80inc_flag2[256]; + UINT8 z80dec_flag2[256]; UINT8 z80szc_flag[512]; + UINT8 z80szp_flag[256]; const UINT8 cycles_main[256] = { 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4, @@ -96,38 +99,30 @@ void CPUCALL z80c_initialize(void) { } } - ZSPtable[i] = (UINT8)f; + z80szp_flag[i] = (UINT8)f; - z80inc_flag[i] = (UINT8)(f & (~V_FLAG)); + z80inc_flag2[(i - 1) & 0xff] = (UINT8)(f & (~V_FLAG)); if (!(i & 0x0f)) { - z80inc_flag[i] |= H_FLAG; + z80inc_flag2[(i - 1) & 0xff] |= H_FLAG; } - z80dec_flag[i] = (UINT8)(f & (~V_FLAG)) | N_FLAG; + z80dec_flag2[(i + 1) & 0xff] = (UINT8)(f & (~V_FLAG)) | N_FLAG; if ((i & 0x0f) == 0x0f) { - z80dec_flag[i] |= H_FLAG; + z80dec_flag2[(i + 1) & 0xff] |= H_FLAG; } z80szc_flag[i] = (UINT8)(f & (~V_FLAG)); z80szc_flag[i+256] = (UINT8)(f & (~V_FLAG)) | C_FLAG; } - z80inc_flag[0x80] |= V_FLAG; - z80dec_flag[0x7f] |= V_FLAG; + z80inc_flag2[0x80 - 1] |= V_FLAG; + z80dec_flag2[0x7f + 1] |= V_FLAG; } void CPUCALL z80c_reset(void) { - z80c_initialize(); - ZeroMemory(&z80core.s, sizeof(z80core.s)); R_Z80R = rand_get(); } -REG8 CPUCALL z80c_ableinterrupt(void) { - - return((Z80_IFF & ((1 << IFF_IFLAG) | (1 << IFF_IRQ) | (1 << IFF_NMI))) - ?0:1); -} - void CPUCALL z80c_interrupt(REG8 vect) { REG16 pc; @@ -136,39 +131,6 @@ void CPUCALL z80c_interrupt(REG8 vect) { Z80_IFF ^= (1 << IFF_HALT); R_Z80PC++; } - Z80_IFF |= (1 << IFF_IRQ) | (1 << IFF_IFLAG); - switch(R_Z80IM) { - case 0: - if ((vect != 0xdd) && (vect != 0xed) && (vect != 0xfd)) { - Z80_COUNT(cycles_main[vect]); - z80c_mainop[vect](); - } - break; - - case 1: - Z80_COUNT(11); - R_Z80SP -= 2; - mem_write16(R_Z80SP, R_Z80PC); - R_Z80PC = 0x38; - break; - - case 2: - pc = mem_read16((R_Z80I << 8) + vect); - R_Z80SP -= 2; - mem_write16(R_Z80SP, R_Z80PC); - R_Z80PC = pc; - break; - } -} - -void CPUCALL z80c_interrupt2(REG8 vect) { - - REG16 pc; - - if (Z80_IFF & (1 << IFF_HALT)) { - Z80_IFF ^= (1 << IFF_HALT); - R_Z80PC++; - } Z80_IFF |= (1 << IFF_IFLAG); switch(R_Z80IM) { case 0: @@ -212,13 +174,23 @@ void CPUCALL z80c_execute(void) { UINT op; - do { - R_Z80R++; - GET_PC_BYTE(op); - Z80_COUNT(cycles_main[op]); - z80c_mainop[op](); - z80dmap(); - } while(CPU_REMCLOCK > 0); + if (!dma.working) { + do { + R_Z80R++; + GET_PC_BYTE(op); + Z80_COUNT(cycles_main[op]); + z80c_mainop[op](); + } while(CPU_REMCLOCK > 0); + } + else { + do { + R_Z80R++; + GET_PC_BYTE(op); + Z80_COUNT(cycles_main[op]); + z80c_mainop[op](); + z80dmap(); + } while(CPU_REMCLOCK > 0); + } } void CPUCALL z80c_step(void) {