~ubuntu-branches/ubuntu/lucid/sdlmame/lucid

« back to all changes in this revision

Viewing changes to src/emu/cpu/minx/minx.c

  • Committer: Bazaar Package Importer
  • Author(s): Cesare Falco
  • Date: 2009-11-03 17:10:15 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20091103171015-6hop4ory5lxnumpn
Tags: 0.135-0ubuntu1
* New upstream release - Closes (LP: #403212)
* debian/watch: unstable releases are no longer detected
* mame.ini: added the cheat subdirectories to cheatpath so zipped
  cheatfiles will be searched too
* renamed crsshair subdirectory to crosshair to reflect upstream change
* mame.ini: renamed references to crosshair subdirectory (see above)

Show diffs side-by-side

added added

removed removed

Lines of Context:
85
85
        cpu_irq_callback irq_callback;
86
86
        const device_config *device;
87
87
        const address_space *program;
88
 
} minx_regs;
89
 
 
90
 
static minx_regs regs;
91
 
static int minx_icount;
92
 
 
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 )
96
 
 
97
 
 
98
 
INLINE UINT16 rd16( UINT32 offset )
 
88
        int icount;
 
89
} minx_state;
 
90
 
 
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 )
 
94
 
 
95
INLINE minx_state *get_safe_token(const device_config *device)
 
96
{
 
97
        assert(device != NULL);
 
98
        assert(device->token != NULL);
 
99
        assert(device->type == CPU);
 
100
        assert(cpu_get_type(device) == CPU_MINX);
 
101
 
 
102
        return (minx_state *)device->token;
 
103
}
 
104
 
 
105
INLINE UINT16 rd16( minx_state *minx, UINT32 offset )
99
106
{
100
107
        return RD( offset ) | ( RD( offset + 1 ) << 8 );
101
108
}
102
109
 
103
110
 
104
 
INLINE void wr16( UINT32 offset, UINT16 data )
 
111
INLINE void wr16( minx_state *minx, UINT32 offset, UINT16 data )
105
112
{
106
113
        WR( offset, ( data & 0x00FF ) );
107
114
        WR( offset + 1, ( data >> 8 ) );
110
117
 
111
118
static CPU_INIT( minx )
112
119
{
113
 
        regs.irq_callback = irqcallback;
114
 
        regs.device = device;
115
 
        regs.program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
 
120
        minx_state *minx = get_safe_token(device);
 
121
        minx->irq_callback = irqcallback;
 
122
        minx->device = device;
 
123
        minx->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
116
124
        if ( device->static_config != NULL )
117
125
        {
118
126
        }
124
132
 
125
133
static CPU_RESET( minx )
126
134
{
127
 
        regs.SP = regs.BA = regs.HL = regs.X = regs.Y = 0;
128
 
        regs.U = regs.V = regs.F = regs.E = regs.I = regs.XI = regs.YI = 0;
129
 
        regs.halted = regs.interrupt_pending = 0;
 
135
        minx_state *minx = get_safe_token(device);
 
136
        minx->SP = minx->BA = minx->HL = minx->X = minx->Y = 0;
 
137
        minx->U = minx->V = minx->F = minx->E = minx->I = minx->XI = minx->YI = 0;
 
138
        minx->halted = minx->interrupt_pending = 0;
130
139
 
131
 
        regs.PC = rd16( 0 );
 
140
        minx->PC = rd16( minx, 0 );
132
141
}
133
142
 
134
143
 
137
146
}
138
147
 
139
148
 
140
 
INLINE UINT8 rdop( void )
 
149
INLINE UINT8 rdop( minx_state *minx )
141
150
{
142
151
        UINT8 op = RD( GET_MINX_PC );
143
 
        regs.PC++;
 
152
        minx->PC++;
144
153
        return op;
145
154
}
146
155
 
147
156
 
148
 
INLINE UINT16 rdop16( void )
 
157
INLINE UINT16 rdop16( minx_state *minx )
149
158
{
150
 
        UINT16 op = rdop();
151
 
        op = op | ( rdop() << 8 );
 
159
        UINT16 op = rdop(minx);
 
160
        op = op | ( rdop(minx) << 8 );
152
161
        return op;
153
162
}
154
163
 
163
172
{
164
173
        UINT32  oldpc;
165
174
        UINT8   op;
 
175
        minx_state *minx = get_safe_token(device);
166
176
 
167
 
        minx_icount = cycles;
 
177
        minx->icount = cycles;
168
178
 
169
179
        do
170
180
        {
171
181
                debugger_instruction_hook(device, GET_MINX_PC);
172
182
                oldpc = GET_MINX_PC;
173
183
 
174
 
                if ( regs.interrupt_pending )
 
184
                if ( minx->interrupt_pending )
175
185
                {
176
 
                        regs.halted = 0;
177
 
                        if ( ! ( regs.F & 0xc0 ) && regs.U == regs.V )
 
186
                        minx->halted = 0;
 
187
                        if ( ! ( minx->F & 0xc0 ) && minx->U == minx->V )
178
188
                        {
179
189
                                //logerror("minx_execute(): taking IRQ\n");
180
 
                                PUSH8( regs.V );
181
 
                                PUSH16( regs.PC );
182
 
                                PUSH8( regs.F );
 
190
                                PUSH8( minx, minx->V );
 
191
                                PUSH16( minx, minx->PC );
 
192
                                PUSH8( minx, minx->F );
183
193
 
184
194
                                /* Set Interrupt Branch flag */
185
 
                                regs.F |= 0x80;
186
 
                                regs.V = 0;
187
 
                                regs.PC = rd16( regs.irq_callback( regs.device, 0 ) << 1 );
188
 
                                minx_icount -= 28;              /* This cycle count is a guess */
 
195
                                minx->F |= 0x80;
 
196
                                minx->V = 0;
 
197
                                minx->PC = rd16( minx, minx->irq_callback( minx->device, 0 ) << 1 );
 
198
                                minx->icount -= 28;             /* This cycle count is a guess */
189
199
                        }
190
200
                }
191
201
 
192
 
                if ( regs.halted )
 
202
                if ( minx->halted )
193
203
                {
194
 
                        minx_icount -= insnminx_cycles_CE[0xAE];
 
204
                        minx->icount -= insnminx_cycles_CE[0xAE];
195
205
                }
196
206
                else
197
207
                {
198
 
                        op = rdop();
199
 
                        insnminx[op]();
200
 
                        minx_icount -= insnminx_cycles[op];
 
208
                        op = rdop(minx);
 
209
                        insnminx[op](minx);
 
210
                        minx->icount -= insnminx_cycles[op];
201
211
                }
202
 
        } while ( minx_icount > 0 );
203
 
        return cycles - minx_icount;
 
212
        } while ( minx->icount > 0 );
 
213
        return cycles - minx->icount;
204
214
}
205
215
 
206
216
 
207
217
static CPU_BURN( minx )
208
218
{
209
 
        minx_icount = 0;
 
219
        minx_state *minx = get_safe_token(device);
 
220
        minx->icount = 0;
210
221
}
211
222
 
212
223
 
213
 
static unsigned minx_get_reg( int regnum )
 
224
static unsigned minx_get_reg( minx_state *minx, int regnum )
214
225
{
215
226
        switch( regnum )
216
227
        {
217
228
        case REG_GENPC: return GET_MINX_PC;
218
 
        case MINX_PC:   return regs.PC;
 
229
        case MINX_PC:   return minx->PC;
219
230
        case REG_GENSP:
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;
233
244
        }
234
245
        return 0;
235
246
}
236
247
 
237
248
 
238
 
static void minx_set_reg( int regnum, unsigned val )
 
249
static void minx_set_reg( minx_state *minx, int regnum, unsigned val )
239
250
{
240
251
        switch( regnum )
241
252
        {
242
253
        case REG_GENPC: break;
243
 
        case MINX_PC:   regs.PC = val; break;
 
254
        case MINX_PC:   minx->PC = val; break;
244
255
        case REG_GENSP:
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;
258
269
        }
259
270
}
260
271
 
261
272
 
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 )
263
274
{
264
275
        if ( state == ASSERT_LINE )
265
276
        {
266
 
                regs.interrupt_pending = 1;
 
277
                minx->interrupt_pending = 1;
267
278
        }
268
279
        else
269
280
        {
270
 
                regs.interrupt_pending = 0;
 
281
                minx->interrupt_pending = 0;
271
282
        }
272
283
}
273
284
 
274
285
 
275
286
static CPU_SET_INFO( minx )
276
287
{
 
288
        minx_state *minx = get_safe_token(device);
277
289
        switch( state )
278
290
        {
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;
281
293
 
282
294
        case CPUINFO_INT_REGISTER + MINX_PC:
283
295
        case CPUINFO_INT_REGISTER + MINX_SP:
293
305
        case CPUINFO_INT_REGISTER + MINX_I:
294
306
        case CPUINFO_INT_REGISTER + MINX_XI:
295
307
        case CPUINFO_INT_REGISTER + MINX_YI:
296
 
                minx_set_reg( state - CPUINFO_INT_REGISTER, info->i ); break;
 
308
                minx_set_reg( minx, state - CPUINFO_INT_REGISTER, info->i ); break;
297
309
        }
298
310
}
299
311
 
300
312
 
301
313
CPU_GET_INFO( minx )
302
314
{
 
315
        minx_state *minx = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
303
316
        switch( state )
304
317
        {
305
 
        case CPUINFO_INT_CONTEXT_SIZE:                                                          info->i = sizeof(minx_regs); break;
 
318
        case CPUINFO_INT_CONTEXT_SIZE:                                                          info->i = sizeof(minx_state); break;
306
319
        case CPUINFO_INT_INPUT_LINES:                                                           info->i = 1; break;
307
320
        case CPUINFO_INT_DEFAULT_IRQ_VECTOR:                                            info->i = 0x00; break;
308
 
        case CPUINFO_INT_ENDIANNESS:                                                            info->i = ENDIANNESS_BIG; break;
 
321
        case DEVINFO_INT_ENDIANNESS:                                                            info->i = ENDIANNESS_BIG; break;
309
322
        case CPUINFO_INT_CLOCK_MULTIPLIER:                                                      info->i = 1; break;
310
323
        case CPUINFO_INT_CLOCK_DIVIDER:                                                         info->i = 1; break;
311
324
        case CPUINFO_INT_MIN_INSTRUCTION_BYTES:                                         info->i = 1; break;
337
350
        case CPUINFO_INT_REGISTER + MINX_N:
338
351
        case CPUINFO_INT_REGISTER + MINX_I:
339
352
        case CPUINFO_INT_REGISTER + MINX_XI:
340
 
        case CPUINFO_INT_REGISTER + MINX_YI:                                            info->i = minx_get_reg( state - CPUINFO_INT_REGISTER ); break;
 
353
        case CPUINFO_INT_REGISTER + MINX_YI:                                            info->i = minx_get_reg( minx, state - CPUINFO_INT_REGISTER ); break;
341
354
        case CPUINFO_INT_PREVIOUSPC:                                                            info->i = 0x0000; break;
342
355
        case CPUINFO_FCT_SET_INFO:                                                                      info->setinfo = CPU_SET_INFO_NAME(minx); break;
343
356
        case CPUINFO_FCT_INIT:                                                                          info->init = CPU_INIT_NAME(minx); break;
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' : '.' );
370
383
                break;
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;
385
398
        }
386
399
}
387
400