for (i = start_addr >> shift; i <= end_addr >> shift; i++) {\r
map[i] = addr >> 1;\r
if (is_func)\r
- map[i] |= (uptr)1 << (sizeof(addr) * 8 - 1);\r
+ map[i] |= MAP_FLAG;\r
}\r
}\r
\r
const void *func_or_mh, int is_func)\r
{\r
xmap_set(map, M68K_MEM_SHIFT, start_addr, end_addr, func_or_mh, is_func);\r
+#ifdef EMU_F68K\r
+ // setup FAME fetchmap\r
+ if (!is_func)\r
+ {\r
+ int shiftout = 24 - FAMEC_FETCHBITS;\r
+ int i = start_addr >> shiftout;\r
+ uptr base = (uptr)func_or_mh - (i << shiftout);\r
+ for (; i <= (end_addr >> shiftout); i++)\r
+ PicoCpuFM68k.Fetch[i] = base;\r
+ }\r
+#endif\r
}\r
\r
// more specialized/optimized function (does same as above)\r
addr >>= 1;\r
for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
r8map[i] = r16map[i] = w8map[i] = w16map[i] = addr;\r
+#ifdef EMU_F68K\r
+ // setup FAME fetchmap\r
+ {\r
+ M68K_CONTEXT *ctx = is_sub ? &PicoCpuFS68k : &PicoCpuFM68k;\r
+ int shiftout = 24 - FAMEC_FETCHBITS;\r
+ i = start_addr >> shiftout;\r
+ addr = (uptr)ptr - (i << shiftout);\r
+ for (; i <= (end_addr >> shiftout); i++)\r
+ ctx->Fetch[i] = addr;\r
+ }\r
+#endif\r
}\r
\r
static u32 m68k_unmapped_read8(u32 a)\r
\r
addr = (uptr)m68k_unmapped_read8;\r
for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
- m68k_read8_map[i] = (addr >> 1) | (1 << 31);\r
+ m68k_read8_map[i] = (addr >> 1) | MAP_FLAG;\r
\r
addr = (uptr)m68k_unmapped_read16;\r
for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
- m68k_read16_map[i] = (addr >> 1) | (1 << 31);\r
+ m68k_read16_map[i] = (addr >> 1) | MAP_FLAG;\r
\r
addr = (uptr)m68k_unmapped_write8;\r
for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
- m68k_write8_map[i] = (addr >> 1) | (1 << 31);\r
+ m68k_write8_map[i] = (addr >> 1) | MAP_FLAG;\r
\r
addr = (uptr)m68k_unmapped_write16;\r
for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
- m68k_write16_map[i] = (addr >> 1) | (1 << 31);\r
+ m68k_write16_map[i] = (addr >> 1) | MAP_FLAG;\r
}\r
\r
MAKE_68K_READ8(m68k_read8, m68k_read8_map)\r
Pico.ioports[a] = d;\r
}\r
\r
+// lame..\r
+static int z80_cycles_from_68k(void)\r
+{\r
+ return z80_cycle_aim\r
+ + cycles_68k_to_z80(SekCyclesDone() - last_z80_sync);\r
+}\r
+\r
void NOINLINE ctl_write_z80busreq(u32 d)\r
{\r
d&=1; d^=1;\r
{\r
if (d)\r
{\r
- z80_cycle_cnt = cycles_68k_to_z80(SekCyclesDone());\r
+ z80_cycle_cnt = z80_cycles_from_68k();\r
}\r
else\r
{\r
- z80stopCycle = SekCyclesDone();\r
if ((PicoOpt&POPT_EN_Z80) && !Pico.m.z80_reset) {\r
pprof_start(m68k);\r
- PicoSyncZ80(z80stopCycle);\r
+ PicoSyncZ80(SekCyclesDone());\r
pprof_end_sub(m68k);\r
}\r
}\r
}\r
else\r
{\r
- z80_cycle_cnt = cycles_68k_to_z80(SekCyclesDone());\r
+ z80_cycle_cnt = z80_cycles_from_68k();\r
z80_reset();\r
}\r
Pico.m.z80_reset = d;\r
EEPROM_write16(d);\r
}\r
else {\r
- // XXX: hardware could easily use MSB too..\r
u8 *pm = (u8 *)(SRam.data - SRam.start + a);\r
- if (*pm != (u8)d) {\r
+ if (pm[0] != (u8)(d >> 8)) {\r
SRam.changed = 1;\r
- *pm = (u8)d;\r
+ pm[0] = (u8)(d >> 8);\r
+ }\r
+ if (pm[1] != (u8)d) {\r
+ SRam.changed = 1;\r
+ pm[1] = (u8)d;\r
}\r
}\r
}\r
}\r
\r
if ((a & 0x4000) == 0x0000) { // z80 RAM\r
- SekCyclesBurn(2); // hack\r
+ SekCyclesBurnRun(2); // FIXME hack\r
Pico.zram[a & 0x1fff] = (u8)d;\r
return;\r
}\r
{\r
int i;\r
// by default, point everything to first 64k of ROM\r
- for (i = 0; i < M68K_FETCHBANK1; i++)\r
+ for (i = 0; i < M68K_FETCHBANK1 * 0xe0 / 0x100; i++)\r
PicoCpuFM68k.Fetch[i] = (unsigned long)Pico.rom - (i<<(24-FAMEC_FETCHBITS));\r
// now real ROM\r
for (i = 0; i < M68K_FETCHBANK1 && (i<<(24-FAMEC_FETCHBITS)) < Pico.romsize; i++)\r
PicoCpuFM68k.Fetch[i] = (unsigned long)Pico.rom;\r
- // .. and RAM\r
- for (i = M68K_FETCHBANK1*14/16; i < M68K_FETCHBANK1; i++)\r
- PicoCpuFM68k.Fetch[i] = (unsigned long)Pico.ram - (i<<(24-FAMEC_FETCHBITS));\r
+ // RAM already set\r
}\r
#endif\r
#ifdef EMU_M68K\r
int scanline = get_scanline(is_from_z80);\r
//elprintf(EL_STATUS, "%03i -> %03i dac w %08x z80 %i", PsndDacLine, scanline, d, is_from_z80);\r
ym2612.dacout = ((int)d - 0x80) << 6;\r
- if (PsndOut && ym2612.dacen && scanline >= PsndDacLine)\r
+ if (ym2612.dacen)\r
PsndDoDAC(scanline);\r
return 0;\r
}\r
timer_a_step = TIMER_A_TICK_ZCYCLES * (1024 - TAnew);\r
if (ym2612.OPN.ST.mode & 1) {\r
// this is not right, should really be done on overflow only\r
- int cycles = is_from_z80 ? z80_cyclesDone() : cycles_68k_to_z80(SekCyclesDone());\r
+ int cycles = is_from_z80 ? z80_cyclesDone() : z80_cycles_from_68k();\r
timer_a_next_oflow = (cycles << 8) + timer_a_step;\r
}\r
elprintf(EL_YMTIMER, "timer a set to %i, %i", 1024 - TAnew, timer_a_next_oflow>>8);\r
//ym2612.OPN.ST.TBT = 0;\r
timer_b_step = TIMER_B_TICK_ZCYCLES * (256 - d); // 262800\r
if (ym2612.OPN.ST.mode & 2) {\r
- int cycles = is_from_z80 ? z80_cyclesDone() : cycles_68k_to_z80(SekCyclesDone());\r
+ int cycles = is_from_z80 ? z80_cyclesDone() : z80_cycles_from_68k();\r
timer_b_next_oflow = (cycles << 8) + timer_b_step;\r
}\r
elprintf(EL_YMTIMER, "timer b set to %i, %i", 256 - d, timer_b_next_oflow>>8);\r
return 0;\r
case 0x27: { /* mode, timer control */\r
int old_mode = ym2612.OPN.ST.mode;\r
- int cycles = is_from_z80 ? z80_cyclesDone() : cycles_68k_to_z80(SekCyclesDone());\r
+ int cycles = is_from_z80 ? z80_cyclesDone() : z80_cycles_from_68k();\r
ym2612.OPN.ST.mode = d;\r
\r
elprintf(EL_YMTIMER, "st mode %02x", d);\r
}\r
case 0x2b: { /* DAC Sel (YM2612) */\r
int scanline = get_scanline(is_from_z80);\r
- ym2612.dacen = d & 0x80;\r
- if (d & 0x80) PsndDacLine = scanline;\r
+ if (ym2612.dacen != (d & 0x80)) {\r
+ ym2612.dacen = d & 0x80;\r
+ PsndDacLine = scanline;\r
+ }\r
#ifdef __GP2X__\r
if (PicoOpt & POPT_EXT_FM) YM2612Write_940(a, d, scanline);\r
#endif\r
\r
static u32 ym2612_read_local_68k(void)\r
{\r
- int xcycles = cycles_68k_to_z80(SekCyclesDone()) << 8;\r
+ int xcycles = z80_cycles_from_68k() << 8;\r
\r
ym2612_read_local();\r
\r
\r
static unsigned char z80_md_vdp_read(unsigned short a)\r
{\r
- // TODO?\r
+ if ((a & 0x00e0) == 0x0000)\r
+ return PicoVideoRead8(a); // FIXME: depends on 68k cycles\r
+\r
elprintf(EL_ANOMALY, "z80 invalid r8 [%06x] %02x", a, 0xff);\r
return 0xff;\r
}\r
\r
static void z80_md_vdp_br_write(unsigned int a, unsigned char data)\r
{\r
- // TODO: allow full VDP access\r
if ((a&0xfff9) == 0x7f11) // 7f11 7f13 7f15 7f17\r
{\r
if (PicoOpt & POPT_EN_PSG)\r
SN76496Write(data);\r
return;\r
}\r
+ // at least VDP data writes hang my machine\r
\r
if ((a>>8) == 0x60)\r
{\r