85
85
cpu_irq_callback irq_callback;
86
86
const device_config *device;
87
87
const address_space *program;
90
static minx_regs regs;
91
static int minx_icount;
93
#define RD(offset) memory_read_byte_8be( regs.program, offset )
94
#define WR(offset,data) memory_write_byte_8be( regs.program, offset, data )
95
#define GET_MINX_PC ( ( regs.PC & 0x8000 ) ? ( regs.V << 15 ) | (regs.PC & 0x7FFF ) : regs.PC )
98
INLINE UINT16 rd16( UINT32 offset )
91
#define RD(offset) memory_read_byte_8be( minx->program, offset )
92
#define WR(offset,data) memory_write_byte_8be( minx->program, offset, data )
93
#define GET_MINX_PC ( ( minx->PC & 0x8000 ) ? ( minx->V << 15 ) | (minx->PC & 0x7FFF ) : minx->PC )
95
INLINE minx_state *get_safe_token(const device_config *device)
97
assert(device != NULL);
98
assert(device->token != NULL);
99
assert(device->type == CPU);
100
assert(cpu_get_type(device) == CPU_MINX);
102
return (minx_state *)device->token;
105
INLINE UINT16 rd16( minx_state *minx, UINT32 offset )
100
107
return RD( offset ) | ( RD( offset + 1 ) << 8 );
104
INLINE void wr16( UINT32 offset, UINT16 data )
111
INLINE void wr16( minx_state *minx, UINT32 offset, UINT16 data )
106
113
WR( offset, ( data & 0x00FF ) );
107
114
WR( offset + 1, ( data >> 8 ) );
175
minx_state *minx = get_safe_token(device);
167
minx_icount = cycles;
177
minx->icount = cycles;
171
181
debugger_instruction_hook(device, GET_MINX_PC);
172
182
oldpc = GET_MINX_PC;
174
if ( regs.interrupt_pending )
184
if ( minx->interrupt_pending )
177
if ( ! ( regs.F & 0xc0 ) && regs.U == regs.V )
187
if ( ! ( minx->F & 0xc0 ) && minx->U == minx->V )
179
189
//logerror("minx_execute(): taking IRQ\n");
190
PUSH8( minx, minx->V );
191
PUSH16( minx, minx->PC );
192
PUSH8( minx, minx->F );
184
194
/* Set Interrupt Branch flag */
187
regs.PC = rd16( regs.irq_callback( regs.device, 0 ) << 1 );
188
minx_icount -= 28; /* This cycle count is a guess */
197
minx->PC = rd16( minx, minx->irq_callback( minx->device, 0 ) << 1 );
198
minx->icount -= 28; /* This cycle count is a guess */
194
minx_icount -= insnminx_cycles_CE[0xAE];
204
minx->icount -= insnminx_cycles_CE[0xAE];
200
minx_icount -= insnminx_cycles[op];
210
minx->icount -= insnminx_cycles[op];
202
} while ( minx_icount > 0 );
203
return cycles - minx_icount;
212
} while ( minx->icount > 0 );
213
return cycles - minx->icount;
207
217
static CPU_BURN( minx )
219
minx_state *minx = get_safe_token(device);
213
static unsigned minx_get_reg( int regnum )
224
static unsigned minx_get_reg( minx_state *minx, int regnum )
217
228
case REG_GENPC: return GET_MINX_PC;
218
case MINX_PC: return regs.PC;
229
case MINX_PC: return minx->PC;
220
case MINX_SP: return regs.SP;
221
case MINX_BA: return regs.BA;
222
case MINX_HL: return regs.HL;
223
case MINX_X: return regs.X;
224
case MINX_Y: return regs.Y;
225
case MINX_U: return regs.U;
226
case MINX_V: return regs.V;
227
case MINX_F: return regs.F;
228
case MINX_E: return regs.E;
229
case MINX_N: return regs.N;
230
case MINX_I: return regs.I;
231
case MINX_XI: return regs.XI;
232
case MINX_YI: return regs.YI;
231
case MINX_SP: return minx->SP;
232
case MINX_BA: return minx->BA;
233
case MINX_HL: return minx->HL;
234
case MINX_X: return minx->X;
235
case MINX_Y: return minx->Y;
236
case MINX_U: return minx->U;
237
case MINX_V: return minx->V;
238
case MINX_F: return minx->F;
239
case MINX_E: return minx->E;
240
case MINX_N: return minx->N;
241
case MINX_I: return minx->I;
242
case MINX_XI: return minx->XI;
243
case MINX_YI: return minx->YI;
238
static void minx_set_reg( int regnum, unsigned val )
249
static void minx_set_reg( minx_state *minx, int regnum, unsigned val )
242
253
case REG_GENPC: break;
243
case MINX_PC: regs.PC = val; break;
254
case MINX_PC: minx->PC = val; break;
245
case MINX_SP: regs.SP = val; break;
246
case MINX_BA: regs.BA = val; break;
247
case MINX_HL: regs.HL = val; break;
248
case MINX_X: regs.X = val; break;
249
case MINX_Y: regs.Y = val; break;
250
case MINX_U: regs.U = val; break;
251
case MINX_V: regs.V = val; break;
252
case MINX_F: regs.F = val; break;
253
case MINX_E: regs.E = val; break;
254
case MINX_N: regs.N = val; break;
255
case MINX_I: regs.I = val; break;
256
case MINX_XI: regs.XI = val; break;
257
case MINX_YI: regs.YI = val; break;
256
case MINX_SP: minx->SP = val; break;
257
case MINX_BA: minx->BA = val; break;
258
case MINX_HL: minx->HL = val; break;
259
case MINX_X: minx->X = val; break;
260
case MINX_Y: minx->Y = val; break;
261
case MINX_U: minx->U = val; break;
262
case MINX_V: minx->V = val; break;
263
case MINX_F: minx->F = val; break;
264
case MINX_E: minx->E = val; break;
265
case MINX_N: minx->N = val; break;
266
case MINX_I: minx->I = val; break;
267
case MINX_XI: minx->XI = val; break;
268
case MINX_YI: minx->YI = val; break;
262
static void minx_set_irq_line( int irqline, int state )
273
static void minx_set_irq_line( minx_state *minx, int irqline, int state )
264
275
if ( state == ASSERT_LINE )
266
regs.interrupt_pending = 1;
277
minx->interrupt_pending = 1;
270
regs.interrupt_pending = 0;
281
minx->interrupt_pending = 0;
275
286
static CPU_SET_INFO( minx )
288
minx_state *minx = get_safe_token(device);
279
291
case CPUINFO_INT_INPUT_STATE + 0:
280
minx_set_irq_line( state - CPUINFO_INT_INPUT_STATE, info->i ); break;
292
minx_set_irq_line( minx, state - CPUINFO_INT_INPUT_STATE, info->i ); break;
282
294
case CPUINFO_INT_REGISTER + MINX_PC:
283
295
case CPUINFO_INT_REGISTER + MINX_SP:
346
359
case CPUINFO_FCT_EXECUTE: info->execute = CPU_EXECUTE_NAME(minx); break;
347
360
case CPUINFO_FCT_BURN: info->burn = CPU_BURN_NAME(minx); break;
348
361
case CPUINFO_FCT_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(minx); break;
349
case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &minx_icount; break;
350
case CPUINFO_STR_NAME: strcpy( info->s, "Minx" ); break;
351
case CPUINFO_STR_CORE_FAMILY: strcpy( info->s, "Nintendo Minx" ); break;
352
case CPUINFO_STR_CORE_VERSION: strcpy( info->s, "0.1" ); break;
353
case CPUINFO_STR_CORE_FILE: strcpy( info->s, __FILE__ ); break;
354
case CPUINFO_STR_CORE_CREDITS: strcpy( info->s, "Copyright The MESS Team." ); break;
362
case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &minx->icount; break;
363
case DEVINFO_STR_NAME: strcpy( info->s, "Minx" ); break;
364
case DEVINFO_STR_FAMILY: strcpy( info->s, "Nintendo Minx" ); break;
365
case DEVINFO_STR_VERSION: strcpy( info->s, "0.1" ); break;
366
case DEVINFO_STR_SOURCE_FILE: strcpy( info->s, __FILE__ ); break;
367
case DEVINFO_STR_CREDITS: strcpy( info->s, "Copyright The MESS Team." ); break;
355
368
case CPUINFO_STR_FLAGS:
356
369
sprintf( info->s, "%c%c%c%c%c%c%c%c-%c%c%c%c%c",
357
regs.F & FLAG_I ? 'I' : '.',
358
regs.F & FLAG_D ? 'D' : '.',
359
regs.F & FLAG_L ? 'L' : '.',
360
regs.F & FLAG_B ? 'B' : '.',
361
regs.F & FLAG_S ? 'S' : '.',
362
regs.F & FLAG_O ? 'O' : '.',
363
regs.F & FLAG_C ? 'C' : '.',
364
regs.F & FLAG_Z ? 'Z' : '.',
365
regs.E & EXEC_X0 ? '0' : '.',
366
regs.E & EXEC_X1 ? '1' : '.',
367
regs.E & EXEC_X2 ? '2' : '.',
368
regs.E & EXEC_DZ ? 'z' : '.',
369
regs.E & EXEC_EN ? 'E' : '.' );
370
minx->F & FLAG_I ? 'I' : '.',
371
minx->F & FLAG_D ? 'D' : '.',
372
minx->F & FLAG_L ? 'L' : '.',
373
minx->F & FLAG_B ? 'B' : '.',
374
minx->F & FLAG_S ? 'S' : '.',
375
minx->F & FLAG_O ? 'O' : '.',
376
minx->F & FLAG_C ? 'C' : '.',
377
minx->F & FLAG_Z ? 'Z' : '.',
378
minx->E & EXEC_X0 ? '0' : '.',
379
minx->E & EXEC_X1 ? '1' : '.',
380
minx->E & EXEC_X2 ? '2' : '.',
381
minx->E & EXEC_DZ ? 'z' : '.',
382
minx->E & EXEC_EN ? 'E' : '.' );
371
case CPUINFO_STR_REGISTER + MINX_PC: sprintf( info->s, "PC:%04X", regs.PC ); break;
372
case CPUINFO_STR_REGISTER + MINX_SP: sprintf( info->s, "SP:%04X", regs.SP ); break;
373
case CPUINFO_STR_REGISTER + MINX_BA: sprintf( info->s, "BA:%04X", regs.BA ); break;
374
case CPUINFO_STR_REGISTER + MINX_HL: sprintf( info->s, "HL:%04X", regs.HL ); break;
375
case CPUINFO_STR_REGISTER + MINX_X: sprintf( info->s, "X:%04X", regs.X ); break;
376
case CPUINFO_STR_REGISTER + MINX_Y: sprintf( info->s, "Y:%04X", regs.Y ); break;
377
case CPUINFO_STR_REGISTER + MINX_U: sprintf( info->s, "U:%02X", regs.U ); break;
378
case CPUINFO_STR_REGISTER + MINX_V: sprintf( info->s, "V:%02X", regs.V ); break;
379
case CPUINFO_STR_REGISTER + MINX_F: sprintf( info->s, "F:%02X", regs.F ); break;
380
case CPUINFO_STR_REGISTER + MINX_E: sprintf( info->s, "E:%02X", regs.E ); break;
381
case CPUINFO_STR_REGISTER + MINX_N: sprintf( info->s, "N:%02X", regs.N ); break;
382
case CPUINFO_STR_REGISTER + MINX_I: sprintf( info->s, "I:%02X", regs.I ); break;
383
case CPUINFO_STR_REGISTER + MINX_XI: sprintf( info->s, "XI:%02X", regs.XI ); break;
384
case CPUINFO_STR_REGISTER + MINX_YI: sprintf( info->s, "YI:%02X", regs.YI ); break;
384
case CPUINFO_STR_REGISTER + MINX_PC: sprintf( info->s, "PC:%04X", minx->PC ); break;
385
case CPUINFO_STR_REGISTER + MINX_SP: sprintf( info->s, "SP:%04X", minx->SP ); break;
386
case CPUINFO_STR_REGISTER + MINX_BA: sprintf( info->s, "BA:%04X", minx->BA ); break;
387
case CPUINFO_STR_REGISTER + MINX_HL: sprintf( info->s, "HL:%04X", minx->HL ); break;
388
case CPUINFO_STR_REGISTER + MINX_X: sprintf( info->s, "X:%04X", minx->X ); break;
389
case CPUINFO_STR_REGISTER + MINX_Y: sprintf( info->s, "Y:%04X", minx->Y ); break;
390
case CPUINFO_STR_REGISTER + MINX_U: sprintf( info->s, "U:%02X", minx->U ); break;
391
case CPUINFO_STR_REGISTER + MINX_V: sprintf( info->s, "V:%02X", minx->V ); break;
392
case CPUINFO_STR_REGISTER + MINX_F: sprintf( info->s, "F:%02X", minx->F ); break;
393
case CPUINFO_STR_REGISTER + MINX_E: sprintf( info->s, "E:%02X", minx->E ); break;
394
case CPUINFO_STR_REGISTER + MINX_N: sprintf( info->s, "N:%02X", minx->N ); break;
395
case CPUINFO_STR_REGISTER + MINX_I: sprintf( info->s, "I:%02X", minx->I ); break;
396
case CPUINFO_STR_REGISTER + MINX_XI: sprintf( info->s, "XI:%02X", minx->XI ); break;
397
case CPUINFO_STR_REGISTER + MINX_YI: sprintf( info->s, "YI:%02X", minx->YI ); break;