69
71
cs->num_last_stolen_cycles = 0;
70
72
cs->last_stolen_cycles_clk = (CLOCK)0;
73
cs->num_dma_per_opcode = 0;
71
74
cs->global_pending_int = IK_NONE;
72
75
cs->nmi_trap_func = NULL;
73
76
cs->reset_trap_func = NULL;
83
86
cs->pending_int[cs->num_ints - 1] = 0;
85
88
cs->int_name = (char **)lib_realloc(cs->int_name, cs->num_ints
86
* /*sizeof(*(cs->int_name))*/ 4);
87
90
cs->int_name[cs->num_ints - 1] = lib_stralloc(name);
89
92
return cs->num_ints - 1;
236
239
return cs->pending_int[int_num] & IK_NMI;
239
enum cpu_int get_int(interrupt_cpu_status_t *cs, int int_num)
242
void interrupt_fixup_int_clk(interrupt_cpu_status_t *cs, CLOCK cpu_clk,
241
return cs->pending_int[int_num];
245
unsigned int num_cycles_left = 0, last_num_cycles_left = 0, num_dma;
246
unsigned int cycles_left_to_trigger_irq =
247
(OPINFO_DELAYS_INTERRUPT(*cs->last_opcode_info_ptr) ? 2 : 1);
248
CLOCK last_start_clk = CLOCK_MAX;
252
log_debug("INTREQ %ld NUMWR %i", (long)cpu_clk,
253
maincpu_num_write_cycles());
254
for (i = 0; i < cs->num_dma_per_opcode; i++)
255
log_debug("%iCYLEFT %i STCLK %i", i, cs->num_cycles_left[i],
256
cs->dma_start_clk[i]);
260
num_dma = cs->num_dma_per_opcode;
261
while (num_dma != 0) {
263
num_cycles_left = cs->num_cycles_left[num_dma];
264
if ((cs->dma_start_clk[num_dma] - 1) <= cpu_clk)
266
last_num_cycles_left = num_cycles_left;
267
last_start_clk = cs->dma_start_clk[num_dma];
269
/* if the INTREQ happens between two CPU cycles, we have to interpolate */
270
if (num_cycles_left - last_num_cycles_left > last_start_clk - cpu_clk - 1)
271
num_cycles_left = last_num_cycles_left + last_start_clk - cpu_clk - 1;
273
/*log_debug("TAKENLEFT %i", num_cycles_left);*/
275
*int_clk = cs->last_stolen_cycles_clk;
276
if (num_cycles_left >= cycles_left_to_trigger_irq)
277
*int_clk -= (cycles_left_to_trigger_irq + 1);
279
/*log_debug("INTCLK %i", *int_clk);*/
244
282
/* ------------------------------------------------------------------------- */
323
int interrupt_write_new_snapshot(interrupt_cpu_status_t *cs, snapshot_module_t *m)
361
int interrupt_write_new_snapshot(interrupt_cpu_status_t *cs,
362
snapshot_module_t *m)
325
367
if (SMW_DW(m, cs->nirq) < 0
326
368
|| SMW_DW(m, cs->nnmi) < 0
327
369
|| SMW_DW(m, cs->global_pending_int) < 0)
372
if (SMW_DW(m, cs->num_dma_per_opcode) < 0)
375
for (i = 0; i < cs->num_dma_per_opcode; i++) {
376
if (SMW_DW(m, cs->dma_start_clk[i]) < 0)
378
if (SMW_DW(m, cs->num_cycles_left[i]) < 0)