コード例 #1
0
unsigned m68020_get_reg(int regnum)
{
	switch( regnum )
	{
		case M68K_PC:  return m68k_get_reg(NULL, M68K_REG_PC);
		case REG_PREVIOUSPC: return m68k_get_reg(NULL, M68K_REG_PPC);
	}
	return m68ec020_get_reg(regnum);
}
コード例 #2
0
unsigned m68010_get_reg(int regnum)
{
	switch( regnum )
	{
		case M68K_VBR: return m68k_get_reg(NULL, M68K_REG_VBR);
		case M68K_SFC: return m68k_get_reg(NULL, M68K_REG_SFC);
		case M68K_DFC: return m68k_get_reg(NULL, M68K_REG_DFC);
		default:       return m68000_get_reg(regnum);
	}
	return 0;
}
コード例 #3
0
unsigned m68ec020_get_reg(int regnum)
{
	switch( regnum )
	{
		case M68K_MSP: return m68k_get_reg(NULL, M68K_REG_MSP);
		case M68K_CACR:  return m68k_get_reg(NULL, M68K_REG_CACR);
		case M68K_CAAR:  return m68k_get_reg(NULL, M68K_REG_CAAR);
		default:       return m68010_get_reg(regnum);
	}
	return 0;
}
コード例 #4
0
ファイル: neogeo.c プロジェクト: fabrice-martinez/neocd
/*-------------------------------------------------------------------------

	Watchdog timer callback.

	Input:	Timer		Pointer to the timer that triggered the callback.
			Data		Data associated with the timer.

---------------------------------------------------------------------------*/
void neogeo_watchdog_callback ( TIMER *Timer, Uint32 Data )
{
	LOG ( "WARNING: Watchdog timer triggered (PC=%06X, SR=%04X); Machine reset.\n",
		m68k_get_reg ( NULL, M68K_REG_PPC ),
		m68k_get_reg ( NULL, M68K_REG_SR ) );

	debugger_log ( "WARNING: Watchdog timer triggered (PC=%06X, SR=%04X); Machine reset.\n",
				m68k_get_reg ( NULL, M68K_REG_PPC ),
				m68k_get_reg ( NULL, M68K_REG_SR ) );

	neogeo_cold_reset();
	neogeo_show_debugger = 1;
}
コード例 #5
0
ファイル: Register.cpp プロジェクト: Meradrin/Genesis-Plus-GX
uint32 GetStackAddr(RegistersHandle _Register)
{
    switch ((uint32)_Register)
    {
    case kRegister_Z80:
        return gRegisterZ80[5]->d;
    case kRegister_M68000:
        return m68k_get_reg(M68K_REG_SP);
    case kRegister_S68000:
        return m68k_get_reg(M68K_REG_SP);
    default:
        return 0;
    }
}
コード例 #6
0
ファイル: Register.cpp プロジェクト: Meradrin/Genesis-Plus-GX
uint32 GetRunningAddr(RegistersHandle _Register)
{
    switch ((uint32)_Register)
    {
    case kRegister_Z80:
        return gRegisterZ80[0]->d;
    case kRegister_M68000:
        return m68k_get_reg(M68K_REG_PC);
    case kRegister_S68000:
        return m68k_get_reg(M68K_REG_PC);
    default:
        return 0;
    }
}
コード例 #7
0
ファイル: mem68k.c プロジェクト: auntieNeo/genplus-gx
unsigned int m68k_read_bus_16(unsigned int address)
{
#ifdef LOGERROR
  error("Unused read16 %08X (%08X)\n", address, m68k_get_reg (NULL, M68K_REG_PC));
#endif
  return m68k_read_pcrelative_16(REG_PC);
}
コード例 #8
0
ファイル: brd_hyperduel.cpp プロジェクト: dreiss/M1-Android
static void write_memory_8(unsigned int address, unsigned int data)
{
	if (address < 0x004000)
		workram[address] = data;

	else if ((address >= 0x4000) && (address < 0x8000))
		workram[0x10000 + (address & 0x3fff)] = data;

	else if (address == 0x400001)
		ym2151_last_adr = data; 

	else if (address == 0x400003)
		YM2151WriteReg(0, ym2151_last_adr, data);

	else if (address == 0x400005)
		OKIM6295_data_0_w(0, data);
	
	else if ((address >= 0xc00000) && (address < 0xc08000))
		workram[address & 0x7fff] = data;

	else if ((address >= 0xfe0000) && (address < 0xffffff))
		workram[0x10000 + (address & 0x1ffff)] = data;

	else
		printf("W8: %x @ %x (PC=%x)\n", data, address, m68k_get_reg(NULL, M68K_REG_PC));
}
コード例 #9
0
void DACWriteWord(uint32_t offset, uint16_t data, uint32_t who/*= UNKNOWN*/)
{
	if (offset == LTXD + 2)
		*ltxd = data;
	else if (offset == RTXD + 2)
		*rtxd = data;
	else if (offset == SCLK + 2)					// Sample rate
	{
		WriteLog("DAC: Writing %u to SCLK (by %s)...\n", data, whoName[who]);

		*sclk = data & 0xFF;
		JERRYI2SInterruptTimer = -1;
		RemoveCallback(JERRYI2SCallback);
		JERRYI2SCallback();
	}
	else if (offset == SMODE + 2)
	{
//		serialMode = data;
		*smode = data;
		WriteLog("DAC: %s writing to SMODE. Bits: %s%s%s%s%s%s [68K PC=%08X]\n", whoName[who],
			(data & 0x01 ? "INTERNAL " : ""), (data & 0x02 ? "MODE " : ""),
			(data & 0x04 ? "WSEN " : ""), (data & 0x08 ? "RISING " : ""),
			(data & 0x10 ? "FALLING " : ""), (data & 0x20 ? "EVERYWORD" : ""),
			m68k_get_reg(NULL, M68K_REG_PC));
	}
}
コード例 #10
0
void DACWriteWord(uint32 offset, uint16 data, uint32 who/*= UNKNOWN*/)
{
	if (offset == LTXD + 2)
	{
		ltxd = data;
	}
	else if (offset == RTXD + 2)
	{
		rtxd = data;
	}
	else if (offset == SCLK + 2)					// Sample rate
	{
		WriteLog("DAC: Writing %u to SCLK...\n", data);

		if ((uint8)data != SCLKFrequencyDivider)
			SCLKFrequencyDivider = (uint8)data;
	}
	else if (offset == SMODE + 2)
	{
		serialMode = data;
		WriteLog("DAC: %s writing to SMODE. Bits: %s%s%s%s%s%s [68K PC=%08X]\n", whoName[who],
			(data & 0x01 ? "INTERNAL " : ""), (data & 0x02 ? "MODE " : ""),
			(data & 0x04 ? "WSEN " : ""), (data & 0x08 ? "RISING " : ""),
			(data & 0x10 ? "FALLING " : ""), (data & 0x20 ? "EVERYWORD" : ""),
			m68k_get_reg(NULL, M68K_REG_PC));
	}
}
コード例 #11
0
void m68000_set_reg(int regnum, unsigned val)
{
	switch( regnum )
	{
		case M68K_PC:  m68k_set_reg(M68K_REG_PC, val); break;
		case M68K_SP:  m68k_set_reg(M68K_REG_SP, val); break;
		case M68K_ISP: m68k_set_reg(M68K_REG_ISP, val); break;
		case M68K_USP: m68k_set_reg(M68K_REG_USP, val); break;
		case M68K_SR:  m68k_set_reg(M68K_REG_SR, val); break;
		case M68K_D0:  m68k_set_reg(M68K_REG_D0, val); break;
		case M68K_D1:  m68k_set_reg(M68K_REG_D1, val); break;
		case M68K_D2:  m68k_set_reg(M68K_REG_D2, val); break;
		case M68K_D3:  m68k_set_reg(M68K_REG_D3, val); break;
		case M68K_D4:  m68k_set_reg(M68K_REG_D4, val); break;
		case M68K_D5:  m68k_set_reg(M68K_REG_D5, val); break;
		case M68K_D6:  m68k_set_reg(M68K_REG_D6, val); break;
		case M68K_D7:  m68k_set_reg(M68K_REG_D7, val); break;
		case M68K_A0:  m68k_set_reg(M68K_REG_A0, val); break;
		case M68K_A1:  m68k_set_reg(M68K_REG_A1, val); break;
		case M68K_A2:  m68k_set_reg(M68K_REG_A2, val); break;
		case M68K_A3:  m68k_set_reg(M68K_REG_A3, val); break;
		case M68K_A4:  m68k_set_reg(M68K_REG_A4, val); break;
		case M68K_A5:  m68k_set_reg(M68K_REG_A5, val); break;
		case M68K_A6:  m68k_set_reg(M68K_REG_A6, val); break;
		case M68K_A7:  m68k_set_reg(M68K_REG_A7, val); break;
/* TODO: set contents of [SP + wordsize * (REG_SP_CONTENTS-regnum)] */
		default:
			if( regnum < REG_SP_CONTENTS )
			{
				unsigned offset = m68k_get_reg(NULL, M68K_REG_SP) + 4 * (REG_SP_CONTENTS - regnum);
				if( offset < 0xfffffd )
					m68k_write_memory_16( offset, val );
			}
	}
}
コード例 #12
0
unsigned int m68k_read_bus_16(unsigned int address)
{
#ifdef LOGERROR
  error("Unused read16 %08X (%08X)\n", address, m68k_get_reg(M68K_REG_PC));
#endif
  address = m68k.pc;
  return *(uint16 *)(m68k.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff));
}
コード例 #13
0
unsigned int m68k_read_bus_8(unsigned int address)
{
#ifdef LOGERROR
  error("Unused read8 %08X (%08X)\n", address, m68k_get_reg(M68K_REG_PC));
#endif
  address = m68k.pc | (address & 1);
  return READ_BYTE(m68k.memory_map[((address)>>16)&0xff].base, (address) & 0xffff);
}
コード例 #14
0
ファイル: cpu68k.c プロジェクト: joshdekock/jim-ps2ware
inline u32 M68K_GetAReg(u32 num)
{
#ifdef CPU68K_USE_MUSASHI
    return m68k_get_reg(NULL, M68K_REG_A0 + num);
#endif

#ifdef CPU68K_USE_C68K
    return C68k_Get_AReg(&C68K, num);
#endif
}
コード例 #15
0
ファイル: cpu68k.c プロジェクト: joshdekock/jim-ps2ware
inline u32 M68K_GetUSP(void)
{
#ifdef CPU68K_USE_MUSASHI
    return m68k_get_reg(NULL, M68K_REG_USP);
#endif

#ifdef CPU68K_USE_C68K
    return C68k_Get_USP(&C68K);
#endif
}
コード例 #16
0
ファイル: mem68k.c プロジェクト: auntieNeo/genplus-gx
void m68k_lockup_w_16 (unsigned int address, unsigned int data)
{
#ifdef LOGERROR
  error ("Lockup %08X = %04X (%08X)\n", address, data, m68k_get_reg (NULL, M68K_REG_PC));
#endif
  if (!config.force_dtack)
  {
    m68k_pulse_halt();
  }
}
コード例 #17
0
void m68k_lockup_w_8 (unsigned int address, unsigned int data)
{
#ifdef LOGERROR
  error ("Lockup %08X = %02X (%08X)\n", address, data, m68k_get_reg(M68K_REG_PC));
#endif
  if (!config.force_dtack)
  {
    m68k_pulse_halt();
    m68k.cycles = m68k.cycle_end;
  }
}
コード例 #18
0
ファイル: mem68k.c プロジェクト: auntieNeo/genplus-gx
unsigned int m68k_lockup_r_16 (unsigned int address)
{
#ifdef LOGERROR
  error ("Lockup %08X.w (%08X)\n", address, m68k_get_reg (NULL, M68K_REG_PC));
#endif
  if (!config.force_dtack)
  {
    m68k_pulse_halt();
  }
  return m68k_read_pcrelative_16(REG_PC);
}
コード例 #19
0
unsigned int m68k_lockup_r_16 (unsigned int address)
{
#ifdef LOGERROR
  error ("Lockup %08X.w (%08X)\n", address, m68k_get_reg(M68K_REG_PC));
#endif
  if (!config.force_dtack)
  {
    m68k_pulse_halt();
    m68k.cycles = m68k.cycle_end;
  }
  address = m68k.pc;
  return *(uint16 *)(m68k.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff));
}
コード例 #20
0
unsigned int m68k_lockup_r_8 (unsigned int address)
{ 
#ifdef LOGERROR
  error ("Lockup %08X.b (%08X)\n", address, m68k_get_reg(M68K_REG_PC));
#endif
  if (!config.force_dtack)
  {
    m68k_pulse_halt();
    m68k.cycles = m68k.cycle_end;
  }
  address = m68k.pc | (address & 1);
  return READ_BYTE(m68k.memory_map[((address)>>16)&0xff].base, (address) & 0xffff);
}
コード例 #21
0
ファイル: genemu.cpp プロジェクト: harlowja/genemu
void gentrace(void)
{
    return;
    if (TRACE_COUNT > 0 || VDP.vcounter() == 33)
    {
        uint32_t pc = m68k_get_reg(NULL, M68K_REG_PC);
        char buf[2048];
        int oplen = m68k_disassemble(buf, pc, M68K_CPU_TYPE_68000);
        fprintf(stdout, "%06x\t%s\t\t[HC=%x]\n", pc, buf, VDP.hcounter());

        --TRACE_COUNT;
    }
}
コード例 #22
0
static unsigned int csd_read_memory_32(unsigned int address)
{
	address &= 0xffffff;

	if (address < 0x8000)
	{
		return mem_readlong_swap((unsigned int *)(prgrom+address));
	}

	if ((address >= 0x1c000) && (address <= 0x1cfff))
	{
		return mem_readlong_swap((unsigned int *)(workram+address));
	}

	printf("Unknown read 32 at %x PC=%x\n", address, m68k_get_reg(NULL, M68K_REG_PC));
	return 0;
}
コード例 #23
0
ファイル: Register.cpp プロジェクト: Meradrin/Genesis-Plus-GX
const char* GetRegisterValue(RegistersHandle _Register, int _iRegisterIndex)
{
    static char szRegisters[128];

    szRegisters[0] = '\0';

    switch ((uint32)_Register)
    {
    case kRegister_Z80:
        sprintf(szRegisters, gszRegisterFormatZ80[_iRegisterIndex], gRegisterZ80[_iRegisterIndex]->d);
        break;
    case kRegister_M68000:
        sprintf(szRegisters, gszRegisterFormat68000[_iRegisterIndex], m68k_get_reg(guiConv68000DebugToEmu[_iRegisterIndex]));
        break;
    case kRegister_S68000:
        sprintf(szRegisters, gszRegisterFormat68000[_iRegisterIndex], s68k_get_reg(guiConv68000DebugToEmu[_iRegisterIndex]));
        break;
    }

    return szRegisters;
}
コード例 #24
0
static unsigned int csd_read_memory_8(unsigned int address)
{
	address &= 0xffffff;

	if (address < 0x8000)
	{
		return prgrom[address];
	}

	if (address >= 0x18000 && address <= 0x18007)
	{
		return pia_0_r((address&0xf)>>1);
	}

	if (address >= 0x1c000 && address <= 0x1cfff)
	{
		return workram[address];
	}

	printf("Unknown read 8 at %x PC=%x\n", address, m68k_get_reg(NULL, M68K_REG_PC));

	return 0;
}
コード例 #25
0
ファイル: sek.c プロジェクト: alban-rochel/pixbox-picodrive
// Pack the cpu into a common format:
// XXX: rename
PICO_INTERNAL void SekPackCpu(unsigned char *cpu, int is_sub)
{
  unsigned int pc=0;

#if defined(EMU_C68K)
  struct Cyclone *context = is_sub ? &PicoCpuCS68k : &PicoCpuCM68k;
  memcpy(cpu,context->d,0x40);
  pc=context->pc-context->membase;
  *(unsigned int *)(cpu+0x44)=CycloneGetSr(context);
  *(unsigned int *)(cpu+0x48)=context->osp;
  cpu[0x4c] = context->irq;
  cpu[0x4d] = context->state_flags & 1;
#elif defined(EMU_M68K)
  void *oldcontext = m68ki_cpu_p;
  m68k_set_context(is_sub ? &PicoCpuMS68k : &PicoCpuMM68k);
  memcpy(cpu,m68ki_cpu_p->dar,0x40);
  pc=m68ki_cpu_p->pc;
  *(unsigned int  *)(cpu+0x44)=m68k_get_reg(NULL, M68K_REG_SR);
  *(unsigned int  *)(cpu+0x48)=m68ki_cpu_p->sp[m68ki_cpu_p->s_flag^SFLAG_SET];
  cpu[0x4c] = CPU_INT_LEVEL>>8;
  cpu[0x4d] = CPU_STOPPED;
  m68k_set_context(oldcontext);
#elif defined(EMU_F68K)
  M68K_CONTEXT *context = is_sub ? &PicoCpuFS68k : &PicoCpuFM68k;
  memcpy(cpu,context->dreg,0x40);
  pc=context->pc;
  *(unsigned int  *)(cpu+0x44)=context->sr;
  *(unsigned int  *)(cpu+0x48)=context->asp;
  cpu[0x4c] = context->interrupts[0];
  cpu[0x4d] = (context->execinfo & FM68K_HALTED) ? 1 : 0;
#endif

  *(unsigned int *)(cpu+0x40) = pc;
  *(unsigned int *)(cpu+0x50) =
    is_sub ? SekCycleCntS68k : SekCycleCnt;
}
コード例 #26
0
ファイル: state.cpp プロジェクト: harlowja/genemu
// Use the Genecyst format
//
void savestate(const char *fn)
{
    uint32_t val;
    FILE *f = fopen(fn, "wb");
    assert(f);

    fprintf(f, "GST");
    assert(ftell(f) == 3);
    pad(f, 3);
    assert(ftell(f) == 6);
    fprintf(f, "\xE0\x40");
    pad(f, 0x80-8);
    assert(ftell(f) == 0x80);

    for (int i=0;i<16;i++)
    {
        val = m68k_get_reg(NULL, (m68k_register_t)i);
        fwrite(&val, 1, 4, f);
    }
    assert(ftell(f) == 0xC0);
    pad(f, 8);
    assert(ftell(f) == 0xC8);
    val = m68k_get_reg(NULL, M68K_REG_PC);
    fwrite(&val, 1, 4, f);
    pad(f, 4);
    assert(ftell(f) == 0xD0);
    val = m68k_get_reg(NULL, M68K_REG_SR);
    fwrite(&val, 1, 2, f);
    val = m68k_get_reg(NULL, M68K_REG_USP);
    fwrite(&val, 1, 4, f);
    val = m68k_get_reg(NULL, M68K_REG_ISP);
    fwrite(&val, 1, 4, f);

    assert(ftell(f) == 0xDA);
    pad(f, 0xFA-0xDA);
    assert(ftell(f) == 0xFA);

    fwrite(VDP.regs, 1, 24, f);
    fwrite(VDP.CRAM, 1, 128, f);
    fwrite(VDP.VSRAM, 1, 80, f);

    pad(f, 2);
    assert(ftell(f) == 0x1E4);

    uint8_t opnregs[512];
    YM2612SaveRegs(opnregs);
    fwrite(opnregs, 1, 512, f);

    assert(ftell(f) == 0x3E4);
    pad(f, 0x404-0x3E4);
    assert(ftell(f) == 0x404);

    fwrite(&CPU_Z80._cpu.AF.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.BC.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.DE.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.HL.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.IX.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.IY.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.PC.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.SP.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.AF1.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.BC1.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.DE1.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.HL1.W, 1, 4, f);
    fwrite(&CPU_Z80._cpu.I, 1, 1, f);
    pad(f, 1);
    fwrite(&CPU_Z80._cpu.IFF, 1, 1, f);
    pad(f, 1);

    fwrite(&CPU_Z80._reset_line, 1, 1, f);
    fwrite(&CPU_Z80._busreq_line, 1, 1, f);
    pad(f, 1);
    pad(f, 1);
    fwrite(&Z80_BANK, 1, 4, f);

    assert(ftell(f) == 0x440);
    pad(f, 0x474-0x440);
    assert(ftell(f) == 0x474);

    fwrite(ZRAM, 1, sizeof(ZRAM), f);
    pad(f, 4);
    fwrite(RAM, 1, sizeof(RAM), f);
    fwrite(VDP.VRAM, 1, sizeof(VDP.VRAM), f);
    assert(ftell(f) == 0x22478);
    fclose(f);
}
コード例 #27
0
void CPUBrowserWindow::RefreshContents(void)
{
	char string[1024], buf[64];
	QString s;

	// 68K
	uint32_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC);
	uint32_t m68kSR = m68k_get_reg(NULL, M68K_REG_SR);
	sprintf(string, "PC: %06X&nbsp;&nbsp;SR: %04X<br><br>", m68kPC, m68kSR);
	s += QString(string);

	uint32_t m68kA0 = m68k_get_reg(NULL, M68K_REG_A0);
	uint32_t m68kA1 = m68k_get_reg(NULL, M68K_REG_A1);
	uint32_t m68kA2 = m68k_get_reg(NULL, M68K_REG_A2);
	uint32_t m68kA3 = m68k_get_reg(NULL, M68K_REG_A3);
	sprintf(string, "A0: %08X&nbsp;&nbsp;A1: %08X&nbsp;&nbsp;A2: %08X&nbsp;&nbsp;A3: %08X<br>", m68kA0, m68kA1, m68kA2, m68kA3);
	s += QString(string);

	uint32_t m68kA4 = m68k_get_reg(NULL, M68K_REG_A4);
	uint32_t m68kA5 = m68k_get_reg(NULL, M68K_REG_A5);
	uint32_t m68kA6 = m68k_get_reg(NULL, M68K_REG_A6);
	uint32_t m68kA7 = m68k_get_reg(NULL, M68K_REG_A7);
	sprintf(string, "A4: %08X&nbsp;&nbsp;A5: %08X&nbsp;&nbsp;A6: %08X&nbsp;&nbsp;A7: %08X<br><br>", m68kA4, m68kA5, m68kA6, m68kA7);
	s += QString(string);

	uint32_t m68kD0 = m68k_get_reg(NULL, M68K_REG_D0);
	uint32_t m68kD1 = m68k_get_reg(NULL, M68K_REG_D1);
	uint32_t m68kD2 = m68k_get_reg(NULL, M68K_REG_D2);
	uint32_t m68kD3 = m68k_get_reg(NULL, M68K_REG_D3);
	sprintf(string, "D0: %08X&nbsp;&nbsp;D1: %08X&nbsp;&nbsp;D2: %08X&nbsp;&nbsp;D3: %08X<br>", m68kD0, m68kD1, m68kD2, m68kD3);
	s += QString(string);

	uint32_t m68kD4 = m68k_get_reg(NULL, M68K_REG_D4);
	uint32_t m68kD5 = m68k_get_reg(NULL, M68K_REG_D5);
	uint32_t m68kD6 = m68k_get_reg(NULL, M68K_REG_D6);
	uint32_t m68kD7 = m68k_get_reg(NULL, M68K_REG_D7);
	sprintf(string, "D4: %08X&nbsp;&nbsp;D5: %08X&nbsp;&nbsp;D6: %08X&nbsp;&nbsp;D7: %08X<br><br>", m68kD4, m68kD5, m68kD6, m68kD7);
	s += QString(string);

	// GPU
	sprintf(string, "GPU PC: %06X&nbsp;&nbsp;FLAGS: %08X<br><br>", GPUReadLong(0xF02010), GPUReadLong(0xF02000));
	s += QString(string);

	// DSP
	sprintf(string, "DSP PC: %06X&nbsp;&nbsp;FLAGS: %08X<br><br>", DSPReadLong(0xF1A110), DSPReadLong(0xF1A100));
	s += QString(string);

	text->clear();
	text->setText(s);
}
コード例 #28
0
unsigned m68000_get_reg(int regnum)
{
	switch( regnum )
	{
		case M68K_PC:  return m68k_get_reg(NULL, M68K_REG_PC);
		case M68K_SP:  return m68k_get_reg(NULL, M68K_REG_SP);
		case M68K_ISP: return m68k_get_reg(NULL, M68K_REG_ISP);
		case M68K_USP: return m68k_get_reg(NULL, M68K_REG_USP);
		case M68K_SR:  return m68k_get_reg(NULL, M68K_REG_SR);
		case M68K_D0:  return m68k_get_reg(NULL, M68K_REG_D0);
		case M68K_D1:  return m68k_get_reg(NULL, M68K_REG_D1);
		case M68K_D2:  return m68k_get_reg(NULL, M68K_REG_D2);
		case M68K_D3:  return m68k_get_reg(NULL, M68K_REG_D3);
		case M68K_D4:  return m68k_get_reg(NULL, M68K_REG_D4);
		case M68K_D5:  return m68k_get_reg(NULL, M68K_REG_D5);
		case M68K_D6:  return m68k_get_reg(NULL, M68K_REG_D6);
		case M68K_D7:  return m68k_get_reg(NULL, M68K_REG_D7);
		case M68K_A0:  return m68k_get_reg(NULL, M68K_REG_A0);
		case M68K_A1:  return m68k_get_reg(NULL, M68K_REG_A1);
		case M68K_A2:  return m68k_get_reg(NULL, M68K_REG_A2);
		case M68K_A3:  return m68k_get_reg(NULL, M68K_REG_A3);
		case M68K_A4:  return m68k_get_reg(NULL, M68K_REG_A4);
		case M68K_A5:  return m68k_get_reg(NULL, M68K_REG_A5);
		case M68K_A6:  return m68k_get_reg(NULL, M68K_REG_A6);
		case M68K_A7:  return m68k_get_reg(NULL, M68K_REG_A7);
		case M68K_PREF_ADDR:  return m68k_get_reg(NULL, M68K_REG_PREF_ADDR);
		case M68K_PREF_DATA:  return m68k_get_reg(NULL, M68K_REG_PREF_DATA);
		case REG_PREVIOUSPC: return m68k_get_reg(NULL, M68K_REG_PPC);
/* TODO: return contents of [SP + wordsize * (REG_SP_CONTENTS-regnum)] */
		default:
			if( regnum < REG_SP_CONTENTS )
			{
				unsigned offset = m68k_get_reg(NULL, M68K_REG_SP) + 4 * (REG_SP_CONTENTS - regnum);
				if( offset < 0xfffffd )
					return m68k_read_memory_32( offset );
			}
	}
	return 0;
}
コード例 #29
0
ファイル: state.c プロジェクト: ben401/OpenEmu
int state_save(unsigned char *buffer)
{
  /* buffer size */
  int bufferptr = 0;

  /* version string */
  char version[16];
  strncpy(version,STATE_VERSION,16);
  save_param(version, 16);

  // GENESIS
  save_param(work_ram, sizeof(work_ram));
  save_param(zram, sizeof(zram));
  save_param(&zbusreq, sizeof(zbusreq));
  save_param(&zreset, sizeof(zreset));
  save_param(&zbank, sizeof(zbank));

  // IO
  save_param(io_reg, sizeof(io_reg));

  // VDP
  save_param(sat, sizeof(sat));
  save_param(vram, sizeof(vram));
  save_param(cram, sizeof(cram));
  save_param(vsram, sizeof(vsram));
  save_param(reg, sizeof(reg));
  save_param(&addr, sizeof(addr));
  save_param(&addr_latch, sizeof(addr_latch));
  save_param(&code, sizeof(code));
  save_param(&pending, sizeof(pending));
  save_param(&status, sizeof(status));
  save_param(&dmafill, sizeof(dmafill));
  save_param(&hint_pending, sizeof(hint_pending));
  save_param(&vint_pending, sizeof(vint_pending));
  save_param(&irq_status, sizeof(irq_status));

  // FM 
  save_param(YM2612GetContextPtr(),YM2612GetContextSize());

  // PSG 
  save_param(SN76489_GetContextPtr(),SN76489_GetContextSize());

  // 68000 
  uint16 tmp16;
  uint32 tmp32;
  tmp32 = m68k_get_reg(NULL, M68K_REG_D0);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_D1);   save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_D2);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_D3);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_D4);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_D5);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_D6);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_D7);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_A0);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_A1);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_A2);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_A3);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_A4);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_A5);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_A6);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_A7);  save_param(&tmp32, 4);
  tmp32 = m68k_get_reg(NULL, M68K_REG_PC);  save_param(&tmp32, 4);
  tmp16 = m68k_get_reg(NULL, M68K_REG_SR);  save_param(&tmp16, 2); 
  tmp32 = m68k_get_reg(NULL, M68K_REG_USP);  save_param(&tmp32, 4);

  // Z80 
  save_param(&Z80, sizeof(Z80_Regs));

  /* compress state file */
  unsigned long inbytes   = bufferptr;
  unsigned long outbytes  = STATE_SIZE;
  compress2 ((Bytef *)(buffer + 4), &outbytes, (Bytef *)state, inbytes, 9);
  memcpy(buffer, &outbytes, 4);

  /* return total size */
  return (outbytes + 4);
}
コード例 #30
0
void m68k_unused_16_w(unsigned int address, unsigned int data)
{
#ifdef LOGERROR
  error("Unused write16 %08X = %04X (%08X)\n", address, data, m68k_get_reg(M68K_REG_PC));
#endif
}