Previous 199869 Revisions Next

r17808 Wednesday 12th September, 2012 at 01:19:30 UTC by Ville Linde
sharc: Changed delayed IOP writes to use timers.
[src/emu/cpu/sharc]sharc.c

trunk/src/emu/cpu/sharc/sharc.c
r17807r17808
161161
162162   INT32 interrupt_active;
163163
164   INT32 iop_latency_cycles;
165   INT32 iop_latency_reg;
166   UINT32 iop_latency_data;
164   UINT32 iop_delayed_reg;
165   UINT32 iop_delayed_data;
166   emu_timer *delayed_iop_timer;
167167
168168   UINT32 delay_slot1, delay_slot2;
169169
r17807r17808
212212   cpustate->delay_slot2 = cpustate->daddr;
213213}
214214
215
216
217static void add_iop_write_latency_effect(SHARC_REGS *cpustate, int iop_reg, UINT32 data, int latency)
215static TIMER_CALLBACK(sharc_iop_delayed_write_callback)
218216{
219   cpustate->iop_latency_cycles = latency+1;
220   cpustate->iop_latency_reg = iop_reg;
221   cpustate->iop_latency_data = data;
222}
217   SHARC_REGS *cpustate = (SHARC_REGS *)ptr;
223218
224static void iop_write_latency_effect(SHARC_REGS *cpustate)
225{
226   UINT32 data = cpustate->iop_latency_data;
227
228   switch (cpustate->iop_latency_reg)
219   switch (cpustate->iop_delayed_reg)
229220   {
230221      case 0x1c:
231222      {
232         if (data & 0x1)
223         if (cpustate->iop_delayed_data & 0x1)
233224         {
234225            sharc_dma_exec(cpustate, 6);
235226         }
r17807r17808
238229
239230      case 0x1d:
240231      {
241         if (data & 0x1)
232         if (cpustate->iop_delayed_data & 0x1)
242233         {
243234            sharc_dma_exec(cpustate, 7);
244235         }
245236         break;
246237      }
247238
248      default:   fatalerror("SHARC: iop_write_latency_effect: unknown IOP register %02X\n", cpustate->iop_latency_reg);
239      default:   fatalerror("SHARC: sharc_iop_delayed_write: unknown IOP register %02X\n", cpustate->iop_delayed_reg);
249240   }
241
242   cpustate->delayed_iop_timer->adjust(attotime::never, 0);
250243}
251244
245static void sharc_iop_delayed_w(SHARC_REGS *cpustate, UINT32 reg, UINT32 data, int cycles)
246{
247   cpustate->iop_delayed_reg = reg;
248   cpustate->iop_delayed_data = data;
252249
250   cpustate->delayed_iop_timer->adjust(cpustate->device->cycles_to_attotime(cycles), 0);
251}
253252
253
254254/* IOP registers */
255255static UINT32 sharc_iop_r(SHARC_REGS *cpustate, UINT32 address)
256256{
r17807r17808
292292      case 0x1c:
293293      {
294294         cpustate->dma[6].control = data;
295         add_iop_write_latency_effect(cpustate, 0x1c, data, 1);
295         //add_iop_write_latency_effect(cpustate, 0x1c, data, 1);
296         sharc_iop_delayed_w(cpustate, 0x1c, data, 1);
296297         break;
297298      }
298299
r17807r17808
311312      case 0x1d:
312313      {
313314         cpustate->dma[7].control = data;
314         add_iop_write_latency_effect(cpustate, 0x1d, data, 30);
315         //add_iop_write_latency_effect(cpustate, 0x1d, data, 30);
316         sharc_iop_delayed_w(cpustate, 0x1d, data, 30);
315317         break;
316318      }
317319
r17807r17808
434436   cpustate->internal_ram_block0 = &cpustate->internal_ram[0];
435437   cpustate->internal_ram_block1 = &cpustate->internal_ram[0x20000/2];
436438
439   cpustate->delayed_iop_timer = device->machine().scheduler().timer_alloc(FUNC(sharc_iop_delayed_write_callback), cpustate);
440
437441   device->save_item(NAME(cpustate->pc));
438442   device->save_pointer(NAME(&cpustate->r[0].r), ARRAY_LENGTH(cpustate->r));
439443   device->save_pointer(NAME(&cpustate->reg_alt[0].r), ARRAY_LENGTH(cpustate->reg_alt));
r17807r17808
533537
534538   device->save_item(NAME(cpustate->interrupt_active));
535539
536   device->save_item(NAME(cpustate->iop_latency_cycles));
537   device->save_item(NAME(cpustate->iop_latency_reg));
538   device->save_item(NAME(cpustate->iop_latency_data));
540   device->save_item(NAME(cpustate->iop_delayed_reg));
541   device->save_item(NAME(cpustate->iop_delayed_data));
539542
540543   device->save_item(NAME(cpustate->delay_slot1));
541544   device->save_item(NAME(cpustate->delay_slot2));
r17807r17808
787790         }
788791      }
789792
790      // IOP register latency effect
791      if (cpustate->iop_latency_cycles > 0)
792      {
793         --cpustate->iop_latency_cycles;
794         if (cpustate->iop_latency_cycles <= 0)
795         {
796            iop_write_latency_effect(cpustate);
797         }
798      }
799
800793      // DMA transfer
801794      if (cpustate->dmaop_cycles > 0)
802795      {

Previous 199869 Revisions Next


© 1997-2024 The MAME Team