Previous 199869 Revisions Next

r18149 Tuesday 25th September, 2012 at 18:17:14 UTC by Miodrag Milanović
modernized saturn a bit (no whatsnew)
[src/mame/drivers]saturn.c
[src/mame/includes]stv.h

trunk/src/mame/includes/stv.h
r18148r18149
202202   UINT32 screen_update_stv_vdp2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
203203   TIMER_DEVICE_CALLBACK_MEMBER(saturn_scanline);
204204   TIMER_DEVICE_CALLBACK_MEMBER(saturn_slave_scanline);
205   
206   void scu_do_transfer(UINT8 event);
207   void scu_test_pending_irq();
208   DECLARE_READ32_MEMBER(saturn_scu_r);
209   DECLARE_WRITE32_MEMBER(saturn_scu_w);
210   TIMER_CALLBACK_MEMBER(dma_lv0_ended);
211   TIMER_CALLBACK_MEMBER(dma_lv1_ended);
212   TIMER_CALLBACK_MEMBER(dma_lv2_ended);
213   void scu_single_transfer(address_space &space, UINT32 src, UINT32 dst,UINT8 *src_shift);
214   void scu_dma_direct(address_space &space, UINT8 dma_ch);
215   void scu_dma_indirect(address_space &space,UINT8 dma_ch);
216   DECLARE_WRITE16_MEMBER(saturn_soundram_w);
217   DECLARE_READ16_MEMBER(saturn_soundram_r);
218   DECLARE_WRITE32_MEMBER(minit_w);
219   DECLARE_WRITE32_MEMBER(sinit_w);
220   DECLARE_READ8_MEMBER(saturn_backupram_r);
221   DECLARE_WRITE8_MEMBER(saturn_backupram_w);
222   DECLARE_READ8_MEMBER(saturn_cart_type_r);
223   TIMER_CALLBACK_MEMBER(stv_rtc_increment);
224   DECLARE_READ32_MEMBER(saturn_null_ram_r);
225   DECLARE_WRITE32_MEMBER(saturn_null_ram_w);
226   DECLARE_READ32_MEMBER(saturn_cart_dram0_r);
227   DECLARE_WRITE32_MEMBER(saturn_cart_dram0_w);
228   DECLARE_READ32_MEMBER(saturn_cart_dram1_r);
229   DECLARE_WRITE32_MEMBER(saturn_cart_dram1_w);
230   DECLARE_READ32_MEMBER(saturn_cs1_r);
231   DECLARE_WRITE32_MEMBER(saturn_cs1_w);
232   WRITE_LINE_MEMBER(scsp_to_main_irq);
233   void saturn_init_driver(int rgn);
234
235   int m_scsp_last_line;
236   
205237};
206238
207239#define MASTER_CLOCK_352 57272720
trunk/src/mame/drivers/saturn.c
r18148r18149
121121   return res;
122122}
123123
124static void scu_do_transfer(running_machine &machine,UINT8 event);
125static void scu_dma_direct(address_space &space, UINT8 dma_ch);   /*DMA level 0 direct transfer function*/
126static void scu_dma_indirect(address_space &space, UINT8 dma_ch); /*DMA level 0 indirect transfer function*/
127
128124/**************************************************************************************/
129125
130126/*
r18148r18149
216212-Add level priority & DMA status register.
217213*/
218214
219#define DIRECT_MODE(_lv_)         (!(state->m_scu_regs[5+(_lv_*8)] & 0x01000000))
220#define INDIRECT_MODE(_lv_)           (state->m_scu_regs[5+(_lv_*8)] & 0x01000000)
221#define DRUP(_lv_)                 (state->m_scu_regs[5+(_lv_*8)] & 0x00010000)
222#define DWUP(_lv_)                    (state->m_scu_regs[5+(_lv_*8)] & 0x00000100)
215#define DIRECT_MODE(_lv_)         (!(m_scu_regs[5+(_lv_*8)] & 0x01000000))
216#define INDIRECT_MODE(_lv_)           (m_scu_regs[5+(_lv_*8)] & 0x01000000)
217#define DRUP(_lv_)                 (m_scu_regs[5+(_lv_*8)] & 0x00010000)
218#define DWUP(_lv_)                    (m_scu_regs[5+(_lv_*8)] & 0x00000100)
223219
224#define DMA_STATUS            (state->m_scu_regs[31])
220#define DMA_STATUS            (m_scu_regs[31])
225221/*These macros sets the various DMA status flags.*/
226222#define DnMV_1(_ch_) DMA_STATUS|=(0x10 << 4 * _ch_)
227223#define DnMV_0(_ch_) DMA_STATUS&=~(0x10 << 4 * _ch_)
228224
229225/*For area checking*/
230226#define BIOS_BUS(var)   (var & 0x07000000) == 0
231#define ABUS(_lv_)       ((state->m_scu.src[_lv_] & 0x07000000) >= 0x02000000) && ((state->m_scu.src[_lv_] & 0x07000000) <= 0x04000000)
227#define ABUS(_lv_)       ((m_scu.src[_lv_] & 0x07000000) >= 0x02000000) && ((m_scu.src[_lv_] & 0x07000000) <= 0x04000000)
232228#define BBUS(_lv_)       ((scu_##_lv_ & 0x07ffffff) >= 0x05a00000) && ((scu_##_lv_ & 0x07ffffff) <= 0x05ffffff)
233229#define VDP1_REGS(_lv_)  ((scu_##_lv_ & 0x07ffffff) >= 0x05d00000) && ((scu_##_lv_ & 0x07ffffff) <= 0x05dfffff)
234230#define VDP2(_lv_)       ((scu_##_lv_ & 0x07ffffff) >= 0x05e00000) && ((scu_##_lv_ & 0x07ffffff) <= 0x05fdffff)
r18148r18149
236232#define WORK_RAM_H(var) (var & 0x07000000) == 0x06000000
237233#define SOUND_RAM(_lv_)  ((scu_##_lv_ & 0x07ffffff) >= 0x05a00000) && ((scu_##_lv_ & 0x07ffffff) <= 0x05afffff)
238234
239static void scu_do_transfer(running_machine &machine,UINT8 event)
235void saturn_state::scu_do_transfer(UINT8 event)
240236{
241   saturn_state *state = machine.driver_data<saturn_state>();
242   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
237   address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
243238   int i;
244239
245240   for(i=0;i<3;i++)
246241   {
247      if(state->m_scu.enable_mask[i] && state->m_scu.start_factor[i] == event)
242      if(m_scu.enable_mask[i] && m_scu.start_factor[i] == event)
248243      {
249244         if(DIRECT_MODE(i))      { scu_dma_direct(space,i);   }
250245         else                { scu_dma_indirect(space,i); }
r18148r18149
253248}
254249
255250/* test pending irqs */
256static void scu_test_pending_irq(running_machine &machine)
251void saturn_state::scu_test_pending_irq()
257252{
258   saturn_state *state = machine.driver_data<saturn_state>();
259253   int i;
260254   const int irq_level[32] = { 0xf, 0xe, 0xd, 0xc,
261255                        0xb, 0xa, 0x9, 0x8,
r18148r18149
268262
269263   for(i=0;i<32;i++)
270264   {
271      if((!(state->m_scu.ism & 1 << i)) && (state->m_scu.ist & 1 << i))
265      if((!(m_scu.ism & 1 << i)) && (m_scu.ist & 1 << i))
272266      {
273267         if(irq_level[i] != -1) /* TODO: cheap check for undefined irqs */
274268         {
275            state->m_maincpu->set_input_line_and_vector(irq_level[i], HOLD_LINE, 0x40 + i);
276            state->m_scu.ist &= ~(1 << i);
269            m_maincpu->set_input_line_and_vector(irq_level[i], HOLD_LINE, 0x40 + i);
270            m_scu.ist &= ~(1 << i);
277271            return; /* avoid spurious irqs, correct? */
278272         }
279273      }
280274   }
281275}
282276
283static READ32_HANDLER( saturn_scu_r )
277READ32_MEMBER(saturn_state::saturn_scu_r)
284278{
285   saturn_state *state = space.machine().driver_data<saturn_state>();
286279   UINT32 res;
287280
288281   /*TODO: write only registers must return 0 or open bus */
r18148r18149
291284      case 0x5c/4:
292285      //  Super Major League and Shin Megami Tensei - Akuma Zensho reads from there (undocumented), DMA status mirror?
293286         if(LOG_SCU) logerror("(PC=%08x) DMA status reg read\n",space.device().safe_pc());
294         res = state->m_scu_regs[0x7c/4];
287         res = m_scu_regs[0x7c/4];
295288         break;
296289      case 0x7c/4:
297290         if(LOG_SCU) logerror("(PC=%08x) DMA status reg read\n",space.device().safe_pc());
298         res = state->m_scu_regs[offset];
291         res = m_scu_regs[offset];
299292         break;
300293      case 0x80/4:
301294         res = dsp_prg_ctrl_r(space);
302295         break;
303296      case 0x8c/4:
304         if(LOG_SCU) logerror( "DSP mem read at %08X\n", state->m_scu_regs[34]);
297         if(LOG_SCU) logerror( "DSP mem read at %08X\n", m_scu_regs[34]);
305298           res = dsp_ram_addr_r();
306299           break;
307300        case 0xa0/4:
308          if(LOG_SCU) logerror("(PC=%08x) IRQ mask reg read %08x MASK=%08x\n",space.device().safe_pc(),mem_mask,state->m_scu_regs[0xa0/4]);
309          res = state->m_scu.ism;
301          if(LOG_SCU) logerror("(PC=%08x) IRQ mask reg read %08x MASK=%08x\n",space.device().safe_pc(),mem_mask,m_scu_regs[0xa0/4]);
302          res = m_scu.ism;
310303          break;
311304       case 0xa4/4:
312          if(LOG_SCU) logerror("(PC=%08x) IRQ status reg read %08x MASK=%08x\n",space.device().safe_pc(),mem_mask,state->m_scu_regs[0xa0/4]);
313         res = state->m_scu.ist;
305          if(LOG_SCU) logerror("(PC=%08x) IRQ status reg read %08x MASK=%08x\n",space.device().safe_pc(),mem_mask,m_scu_regs[0xa0/4]);
306         res = m_scu.ist;
314307         break;
315308      case 0xc8/4:
316309         logerror("(PC=%08x) SCU version reg read\n",space.device().safe_pc());
317310         res = 0x00000004;/*SCU Version 4, OK? */
318311         break;
319312      default:
320          if(LOG_SCU) logerror("(PC=%08x) SCU reg read at %d = %08x\n",space.device().safe_pc(),offset,state->m_scu_regs[offset]);
321          res = state->m_scu_regs[offset];
313          if(LOG_SCU) logerror("(PC=%08x) SCU reg read at %d = %08x\n",space.device().safe_pc(),offset,m_scu_regs[offset]);
314          res = m_scu_regs[offset];
322315         break;
323316   }
324317
r18148r18149
327320
328321#define DMA_CH ((offset & 0x18) / 8)
329322
330static WRITE32_HANDLER( saturn_scu_w )
323WRITE32_MEMBER(saturn_state::saturn_scu_w)
331324{
332   saturn_state *state = space.machine().driver_data<saturn_state>();
325   COMBINE_DATA(&m_scu_regs[offset]);
333326
334   COMBINE_DATA(&state->m_scu_regs[offset]);
335
336327   switch(offset)
337328   {
338329      /*LV 0 DMA*/
339      case 0x00/4: case 0x20/4: case 0x40/4:  state->m_scu.src[DMA_CH]  = ((state->m_scu_regs[offset] & 0x07ffffff) >> 0); break;
340      case 0x04/4: case 0x24/4: case 0x44/4:  state->m_scu.dst[DMA_CH]  = ((state->m_scu_regs[offset] & 0x07ffffff) >> 0); break;
341      case 0x08/4: case 0x28/4: case 0x48/4:  state->m_scu.size[DMA_CH] = ((state->m_scu_regs[offset] & ((offset == 2) ? 0x000fffff : 0xfff)) >> 0); break;
330      case 0x00/4: case 0x20/4: case 0x40/4:  m_scu.src[DMA_CH]  = ((m_scu_regs[offset] & 0x07ffffff) >> 0); break;
331      case 0x04/4: case 0x24/4: case 0x44/4:  m_scu.dst[DMA_CH]  = ((m_scu_regs[offset] & 0x07ffffff) >> 0); break;
332      case 0x08/4: case 0x28/4: case 0x48/4:  m_scu.size[DMA_CH] = ((m_scu_regs[offset] & ((offset == 2) ? 0x000fffff : 0xfff)) >> 0); break;
342333      case 0x0c/4: case 0x2c/4: case 0x4c/4:
343         state->m_scu.src_add[DMA_CH] = (state->m_scu_regs[offset] & 0x100) ? 4 : 0;
344         state->m_scu.dst_add[DMA_CH] = 1 << (state->m_scu_regs[offset] & 7);
345         if(state->m_scu.dst_add[DMA_CH] == 1) { state->m_scu.dst_add[DMA_CH] = 0; }
334         m_scu.src_add[DMA_CH] = (m_scu_regs[offset] & 0x100) ? 4 : 0;
335         m_scu.dst_add[DMA_CH] = 1 << (m_scu_regs[offset] & 7);
336         if(m_scu.dst_add[DMA_CH] == 1) { m_scu.dst_add[DMA_CH] = 0; }
346337         break;
347338      case 0x10/4: case 0x30/4: case 0x50/4:
348         state->m_scu.enable_mask[DMA_CH] = (data & 0x100) >> 8;
349         if(state->m_scu.enable_mask[DMA_CH] && state->m_scu.start_factor[DMA_CH] == 7 && state->m_scu_regs[offset] & 1)
339         m_scu.enable_mask[DMA_CH] = (data & 0x100) >> 8;
340         if(m_scu.enable_mask[DMA_CH] && m_scu.start_factor[DMA_CH] == 7 && m_scu_regs[offset] & 1)
350341         {
351342            if(DIRECT_MODE(DMA_CH)) { scu_dma_direct(space,DMA_CH);   }
352343            else                { scu_dma_indirect(space,DMA_CH); }
353            state->m_scu_regs[offset]&=~1;//disable starting bit.
344            m_scu_regs[offset]&=~1;//disable starting bit.
354345         }
355346         break;
356347      case 0x14/4: case 0x34/4: case 0x54/4:
357348         if(INDIRECT_MODE(DMA_CH))
358349         {
359350            //if(LOG_SCU) logerror("Indirect Mode DMA lv %d set\n",DMA_CH);
360            if(!DWUP(DMA_CH)) state->m_scu.index[DMA_CH] = state->m_scu.dst[DMA_CH];
351            if(!DWUP(DMA_CH)) m_scu.index[DMA_CH] = m_scu.dst[DMA_CH];
361352         }
362353
363         state->m_scu.start_factor[DMA_CH] = state->m_scu_regs[offset] & 7;
354         m_scu.start_factor[DMA_CH] = m_scu_regs[offset] & 7;
364355         break;
365356
366357      case 0x60/4:
367         if(LOG_SCU) logerror("DMA Forced Stop Register set = %02x\n",state->m_scu_regs[24]);
358         if(LOG_SCU) logerror("DMA Forced Stop Register set = %02x\n",m_scu_regs[24]);
368359         break;
369360      case 0x7c/4: if(LOG_SCU) logerror("Warning: DMA status WRITE! Offset %02x(%d)\n",offset*4,offset); break;
370361      /*DSP section*/
371362      case 0x80/4:
372363         /* TODO: you can't overwrite some flags with this */
373         dsp_prg_ctrl_w(space, state->m_scu_regs[offset]);
364         dsp_prg_ctrl_w(space, m_scu_regs[offset]);
374365         if(LOG_SCU) logerror("SCU DSP: Program Control Port Access %08x\n",data);
375366         break;
376367      case 0x84/4:
377         dsp_prg_data(state->m_scu_regs[offset]);
368         dsp_prg_data(m_scu_regs[offset]);
378369         if(LOG_SCU) logerror("SCU DSP: Program RAM Data Port Access %08x\n",data);
379370         break;
380371      case 0x88/4:
381         dsp_ram_addr_ctrl(state->m_scu_regs[offset]);
372         dsp_ram_addr_ctrl(m_scu_regs[offset]);
382373         if(LOG_SCU) logerror("SCU DSP: Data RAM Address Port Access %08x\n",data);
383374         break;
384375      case 0x8c/4:
385         dsp_ram_addr_w(state->m_scu_regs[offset]);
376         dsp_ram_addr_w(m_scu_regs[offset]);
386377         if(LOG_SCU) logerror("SCU DSP: Data RAM Data Port Access %08x\n",data);
387378         break;
388      case 0x90/4: /*if(LOG_SCU) logerror("timer 0 compare data = %03x\n",state->m_scu_regs[36]);*/ break;
389      case 0x94/4: /*if(LOG_SCU) logerror("timer 1 set data = %08x\n",state->m_scu_regs[37]);*/ break;
390      case 0x98/4: /*if(LOG_SCU) logerror("timer 1 mode data = %08x\n",state->m_scu_regs[38]);*/ break;
379      case 0x90/4: /*if(LOG_SCU) logerror("timer 0 compare data = %03x\n",m_scu_regs[36]);*/ break;
380      case 0x94/4: /*if(LOG_SCU) logerror("timer 1 set data = %08x\n",m_scu_regs[37]);*/ break;
381      case 0x98/4: /*if(LOG_SCU) logerror("timer 1 mode data = %08x\n",m_scu_regs[38]);*/ break;
391382      case 0xa0/4: /* IRQ mask */
392         state->m_scu.ism = state->m_scu_regs[0xa0/4];
393         scu_test_pending_irq(space.machine());
383         m_scu.ism = m_scu_regs[0xa0/4];
384         scu_test_pending_irq();
394385         break;
395386      case 0xa4/4: /* IRQ control */
396         if(LOG_SCU) logerror("PC=%08x IRQ status reg set:%08x %08x\n",space.device().safe_pc(),state->m_scu_regs[41],mem_mask);
397         state->m_scu.ist &= state->m_scu_regs[offset];
387         if(LOG_SCU) logerror("PC=%08x IRQ status reg set:%08x %08x\n",space.device().safe_pc(),m_scu_regs[41],mem_mask);
388         m_scu.ist &= m_scu_regs[offset];
398389         break;
399      case 0xa8/4: if(LOG_SCU) logerror("A-Bus IRQ ACK %08x\n",state->m_scu_regs[42]); break;
400      case 0xc4/4: if(LOG_SCU) logerror("SCU SDRAM set: %02x\n",state->m_scu_regs[49]); break;
390      case 0xa8/4: if(LOG_SCU) logerror("A-Bus IRQ ACK %08x\n",m_scu_regs[42]); break;
391      case 0xc4/4: if(LOG_SCU) logerror("SCU SDRAM set: %02x\n",m_scu_regs[49]); break;
401392      default: if(LOG_SCU) logerror("Warning: unused SCU reg set %d = %08x\n",offset,data);
402393   }
403394}
404395
405396/*Lv 0 DMA end irq*/
406static TIMER_CALLBACK( dma_lv0_ended )
397TIMER_CALLBACK_MEMBER(saturn_state::dma_lv0_ended )
407398{
408   saturn_state *state = machine.driver_data<saturn_state>();
409
410   if(!(state->m_scu.ism & IRQ_DMALV0))
411      state->m_maincpu->set_input_line_and_vector(5, HOLD_LINE, 0x4b);
399   if(!(m_scu.ism & IRQ_DMALV0))
400      m_maincpu->set_input_line_and_vector(5, HOLD_LINE, 0x4b);
412401   else
413      state->m_scu.ist |= (IRQ_DMALV0);
402      m_scu.ist |= (IRQ_DMALV0);
414403
415404   DnMV_0(0);
416405}
417406
418407/*Lv 1 DMA end irq*/
419static TIMER_CALLBACK( dma_lv1_ended )
408TIMER_CALLBACK_MEMBER(saturn_state::dma_lv1_ended)
420409{
421   saturn_state *state = machine.driver_data<saturn_state>();
422
423   if(!(state->m_scu.ism & IRQ_DMALV1))
424      state->m_maincpu->set_input_line_and_vector(6, HOLD_LINE, 0x4a);
410   if(!(m_scu.ism & IRQ_DMALV1))
411      m_maincpu->set_input_line_and_vector(6, HOLD_LINE, 0x4a);
425412   else
426      state->m_scu.ist |= (IRQ_DMALV1);
413      m_scu.ist |= (IRQ_DMALV1);
427414
428415   DnMV_0(1);
429416}
430417
431418/*Lv 2 DMA end irq*/
432static TIMER_CALLBACK( dma_lv2_ended )
419TIMER_CALLBACK_MEMBER(saturn_state::dma_lv2_ended)
433420{
434   saturn_state *state = machine.driver_data<saturn_state>();
435
436   if(!(state->m_scu.ism & IRQ_DMALV2))
437      state->m_maincpu->set_input_line_and_vector(6, HOLD_LINE, 0x49);
421   if(!(m_scu.ism & IRQ_DMALV2))
422      m_maincpu->set_input_line_and_vector(6, HOLD_LINE, 0x49);
438423   else
439      state->m_scu.ist |= (IRQ_DMALV2);
424      m_scu.ist |= (IRQ_DMALV2);
440425
441426   DnMV_0(2);
442427}
443428
444static void scu_single_transfer(address_space &space, UINT32 src, UINT32 dst,UINT8 *src_shift)
429void saturn_state::scu_single_transfer(address_space &space, UINT32 src, UINT32 dst,UINT8 *src_shift)
445430{
446431   UINT32 src_data;
447432
r18148r18149
460445   *src_shift ^= 1;
461446}
462447
463static void scu_dma_direct(address_space &space, UINT8 dma_ch)
448void saturn_state::scu_dma_direct(address_space &space, UINT8 dma_ch)
464449{
465   saturn_state *state = space.machine().driver_data<saturn_state>();
466450   UINT32 tmp_src,tmp_dst,tmp_size;
467451   UINT8 cd_transfer_flag;
468452
469   if(state->m_scu.src_add[dma_ch] == 0 || (state->m_scu.dst_add[dma_ch] != 2 && state->m_scu.dst_add[dma_ch] != 4))
453   if(m_scu.src_add[dma_ch] == 0 || (m_scu.dst_add[dma_ch] != 2 && m_scu.dst_add[dma_ch] != 4))
470454   {
471455   if(LOG_SCU) printf("DMA lv %d transfer START\n"
472                      "Start %08x End %08x Size %04x\n",dma_ch,state->m_scu.src[dma_ch],state->m_scu.dst[dma_ch],state->m_scu.size[dma_ch]);
473   if(LOG_SCU) printf("Start Add %04x Destination Add %04x\n",state->m_scu.src_add[dma_ch],state->m_scu.dst_add[dma_ch]);
456                      "Start %08x End %08x Size %04x\n",dma_ch,m_scu.src[dma_ch],m_scu.dst[dma_ch],m_scu.size[dma_ch]);
457   if(LOG_SCU) printf("Start Add %04x Destination Add %04x\n",m_scu.src_add[dma_ch],m_scu.dst_add[dma_ch]);
474458   }
475459
476460   /* TODO: Game Basic trips this, bogus transfer from BIOS area to VDP1? */
477   if(BIOS_BUS(state->m_scu.src[dma_ch]))
461   if(BIOS_BUS(m_scu.src[dma_ch]))
478462      popmessage("Warning: SCU transfer from BIOS area, contact MAMEdev");
479463
480464   DnMV_1(dma_ch);
481465
482466   /* max size */
483   if(state->m_scu.size[dma_ch] == 0) { state->m_scu.size[dma_ch] = (dma_ch == 0) ? 0x00100000 : 0x1000; }
467   if(m_scu.size[dma_ch] == 0) { m_scu.size[dma_ch] = (dma_ch == 0) ? 0x00100000 : 0x1000; }
484468
485469   tmp_src = tmp_dst = 0;
486470
487   tmp_size = state->m_scu.size[dma_ch];
488   if(!(DRUP(dma_ch))) tmp_src = state->m_scu.src[dma_ch];
489   if(!(DWUP(dma_ch))) tmp_dst = state->m_scu.dst[dma_ch];
471   tmp_size = m_scu.size[dma_ch];
472   if(!(DRUP(dma_ch))) tmp_src = m_scu.src[dma_ch];
473   if(!(DWUP(dma_ch))) tmp_dst = m_scu.dst[dma_ch];
490474
491   cd_transfer_flag = state->m_scu.src_add[dma_ch] == 0 && state->m_scu.src[dma_ch] == 0x05818000;
475   cd_transfer_flag = m_scu.src_add[dma_ch] == 0 && m_scu.src[dma_ch] == 0x05818000;
492476
493477   /* TODO: Many games directly accesses CD-ROM register 0x05818000, it must be a dword access with current implementation otherwise it won't work */
494478   if(cd_transfer_flag)
495479   {
496480      int i;
497      if(WORK_RAM_H(state->m_scu.dst[dma_ch]))
498         state->m_scu.dst_add[dma_ch] = 4;
481      if(WORK_RAM_H(m_scu.dst[dma_ch]))
482         m_scu.dst_add[dma_ch] = 4;
499483      else
500         state->m_scu.dst_add[dma_ch] <<= 1;
484         m_scu.dst_add[dma_ch] <<= 1;
501485
502      for (i = 0; i < state->m_scu.size[dma_ch];i+=state->m_scu.dst_add[dma_ch])
486      for (i = 0; i < m_scu.size[dma_ch];i+=m_scu.dst_add[dma_ch])
503487      {
504         space.write_dword(state->m_scu.dst[dma_ch],space.read_dword(state->m_scu.src[dma_ch]));
505         if(state->m_scu.dst_add[dma_ch] == 8)
506            space.write_dword(state->m_scu.dst[dma_ch]+4,space.read_dword(state->m_scu.src[dma_ch]));
488         space.write_dword(m_scu.dst[dma_ch],space.read_dword(m_scu.src[dma_ch]));
489         if(m_scu.dst_add[dma_ch] == 8)
490            space.write_dword(m_scu.dst[dma_ch]+4,space.read_dword(m_scu.src[dma_ch]));
507491
508         state->m_scu.src[dma_ch]+=state->m_scu.src_add[dma_ch];
509         state->m_scu.dst[dma_ch]+=state->m_scu.dst_add[dma_ch];
492         m_scu.src[dma_ch]+=m_scu.src_add[dma_ch];
493         m_scu.dst[dma_ch]+=m_scu.dst_add[dma_ch];
510494      }
511495   }
512496   else
r18148r18149
514498      int i;
515499      UINT8  src_shift;
516500
517      src_shift = ((state->m_scu.src[dma_ch] & 2) >> 1) ^ 1;
501      src_shift = ((m_scu.src[dma_ch] & 2) >> 1) ^ 1;
518502
519      for (i = 0; i < state->m_scu.size[dma_ch];i+=2)
503      for (i = 0; i < m_scu.size[dma_ch];i+=2)
520504      {
521         scu_single_transfer(space,state->m_scu.src[dma_ch],state->m_scu.dst[dma_ch],&src_shift);
505         scu_single_transfer(space,m_scu.src[dma_ch],m_scu.dst[dma_ch],&src_shift);
522506
523507         if(src_shift)
524            state->m_scu.src[dma_ch]+=state->m_scu.src_add[dma_ch];
508            m_scu.src[dma_ch]+=m_scu.src_add[dma_ch];
525509
526510         /* if target is Work RAM H, the add value is fixed, behaviour confirmed by Final Romance 2, Virtual Mahjong and Burning Rangers */
527         state->m_scu.dst[dma_ch]+=(WORK_RAM_H(state->m_scu.dst[dma_ch])) ? 2 : state->m_scu.dst_add[dma_ch];
511         m_scu.dst[dma_ch]+=(WORK_RAM_H(m_scu.dst[dma_ch])) ? 2 : m_scu.dst_add[dma_ch];
528512      }
529513   }
530514
531   state->m_scu.size[dma_ch] = tmp_size;
532   if(!(DRUP(dma_ch))) state->m_scu.src[dma_ch] = tmp_src;
533   if(!(DWUP(dma_ch))) state->m_scu.dst[dma_ch] = tmp_dst;
515   m_scu.size[dma_ch] = tmp_size;
516   if(!(DRUP(dma_ch))) m_scu.src[dma_ch] = tmp_src;
517   if(!(DWUP(dma_ch))) m_scu.dst[dma_ch] = tmp_dst;
534518
535519   {
536520      /*TODO: this is completely wrong HW-wise ...  */
537521      switch(dma_ch)
538522      {
539         case 0: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv0_ended)); break;
540         case 1: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv1_ended)); break;
541         case 2: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv2_ended)); break;
523         case 0: machine().scheduler().timer_set(attotime::from_usec(300), timer_expired_delegate(FUNC(saturn_state::dma_lv0_ended),this)); break;
524         case 1: machine().scheduler().timer_set(attotime::from_usec(300), timer_expired_delegate(FUNC(saturn_state::dma_lv1_ended),this)); break;
525         case 2: machine().scheduler().timer_set(attotime::from_usec(300), timer_expired_delegate(FUNC(saturn_state::dma_lv2_ended),this)); break;
542526      }
543527   }
544528}
545529
546static void scu_dma_indirect(address_space &space,UINT8 dma_ch)
530void saturn_state::scu_dma_indirect(address_space &space,UINT8 dma_ch)
547531{
548   saturn_state *state = space.machine().driver_data<saturn_state>();
549
550532   /*Helper to get out of the cycle*/
551533   UINT8 job_done = 0;
552534   /*temporary storage for the transfer data*/
r18148r18149
556538
557539   DnMV_1(dma_ch);
558540
559   state->m_scu.index[dma_ch] = state->m_scu.dst[dma_ch];
541   m_scu.index[dma_ch] = m_scu.dst[dma_ch];
560542
561543   do{
562      tmp_src = state->m_scu.index[dma_ch];
544      tmp_src = m_scu.index[dma_ch];
563545
564      indirect_size = space.read_dword(state->m_scu.index[dma_ch]);
565      indirect_src  = space.read_dword(state->m_scu.index[dma_ch]+8);
566      indirect_dst  = space.read_dword(state->m_scu.index[dma_ch]+4);
546      indirect_size = space.read_dword(m_scu.index[dma_ch]);
547      indirect_src  = space.read_dword(m_scu.index[dma_ch]+8);
548      indirect_dst  = space.read_dword(m_scu.index[dma_ch]+4);
567549
568550      /*Indirect Mode end factor*/
569551      if(indirect_src & 0x80000000)
570552         job_done = 1;
571553
572      if(state->m_scu.src_add[dma_ch] == 0 || (state->m_scu.dst_add[dma_ch] != 2))
554      if(m_scu.src_add[dma_ch] == 0 || (m_scu.dst_add[dma_ch] != 2))
573555      {
574556         if(LOG_SCU) printf("DMA lv %d indirect mode transfer START\n"
575557                          "Index %08x Start %08x End %08x Size %04x\n",dma_ch,tmp_src,indirect_src,indirect_dst,indirect_size);
576         if(LOG_SCU) printf("Start Add %04x Destination Add %04x\n",state->m_scu.src_add[dma_ch],state->m_scu.dst_add[dma_ch]);
558         if(LOG_SCU) printf("Start Add %04x Destination Add %04x\n",m_scu.src_add[dma_ch],m_scu.dst_add[dma_ch]);
577559      }
578560
579561      indirect_src &=0x07ffffff;
r18148r18149
593575            scu_single_transfer(space,indirect_src,indirect_dst,&src_shift);
594576
595577            if(src_shift)
596               indirect_src+=state->m_scu.src_add[dma_ch];
578               indirect_src+=m_scu.src_add[dma_ch];
597579
598            indirect_dst+= (WORK_RAM_H(indirect_dst)) ? 2 : state->m_scu.dst_add[dma_ch];
580            indirect_dst+= (WORK_RAM_H(indirect_dst)) ? 2 : m_scu.dst_add[dma_ch];
599581         }
600582      }
601583
602      //if(DRUP(0))   space.write_dword(tmp_src+8,state->m_scu.src[0]|job_done ? 0x80000000 : 0);
603      //if(DWUP(0)) space.write_dword(tmp_src+4,state->m_scu.dst[0]);
584      //if(DRUP(0))   space.write_dword(tmp_src+8,m_scu.src[0]|job_done ? 0x80000000 : 0);
585      //if(DWUP(0)) space.write_dword(tmp_src+4,m_scu.dst[0]);
604586
605      state->m_scu.index[dma_ch] = tmp_src+0xc;
587      m_scu.index[dma_ch] = tmp_src+0xc;
606588
607589   }while(job_done == 0);
608590
r18148r18149
610592      /*TODO: this is completely wrong HW-wise ...  */
611593      switch(dma_ch)
612594      {
613         case 0: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv0_ended)); break;
614         case 1: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv1_ended)); break;
615         case 2: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv2_ended)); break;
595         case 0: machine().scheduler().timer_set(attotime::from_usec(300), timer_expired_delegate(FUNC(saturn_state::dma_lv0_ended),this)); break;
596         case 1: machine().scheduler().timer_set(attotime::from_usec(300), timer_expired_delegate(FUNC(saturn_state::dma_lv1_ended),this)); break;
597         case 2: machine().scheduler().timer_set(attotime::from_usec(300), timer_expired_delegate(FUNC(saturn_state::dma_lv2_ended),this)); break;
616598      }
617599   }
618600}
r18148r18149
620602
621603/**************************************************************************************/
622604
623static WRITE16_HANDLER( saturn_soundram_w )
605WRITE16_MEMBER(saturn_state::saturn_soundram_w)
624606{
625   saturn_state *state = space.machine().driver_data<saturn_state>();
607   //machine().scheduler().synchronize(); // force resync
626608
627   //space.machine().scheduler().synchronize(); // force resync
628
629   COMBINE_DATA(&state->m_sound_ram[offset]);
609   COMBINE_DATA(&m_sound_ram[offset]);
630610}
631611
632static READ16_HANDLER( saturn_soundram_r )
612READ16_MEMBER(saturn_state::saturn_soundram_r)
633613{
634   saturn_state *state = space.machine().driver_data<saturn_state>();
614   //machine().scheduler().synchronize(); // force resync
635615
636   //space.machine().scheduler().synchronize(); // force resync
637
638   return state->m_sound_ram[offset];
616   return m_sound_ram[offset];
639617}
640618
641619/* communication,SLAVE CPU acquires data from the MASTER CPU and triggers an irq.  */
642static WRITE32_HANDLER( minit_w )
620WRITE32_MEMBER(saturn_state::minit_w)
643621{
644   saturn_state *state = space.machine().driver_data<saturn_state>();
645
646622   //logerror("cpu %s (PC=%08X) MINIT write = %08x\n", space.device().tag(), space.device().safe_pc(),data);
647   space.machine().scheduler().boost_interleave(state->m_minit_boost_timeslice, attotime::from_usec(state->m_minit_boost));
648   space.machine().scheduler().trigger(1000);
649   sh2_set_frt_input(state->m_slave, PULSE_LINE);
623   machine().scheduler().boost_interleave(m_minit_boost_timeslice, attotime::from_usec(m_minit_boost));
624   machine().scheduler().trigger(1000);
625   sh2_set_frt_input(m_slave, PULSE_LINE);
650626}
651627
652static WRITE32_HANDLER( sinit_w )
628WRITE32_MEMBER(saturn_state::sinit_w)
653629{
654   saturn_state *state = space.machine().driver_data<saturn_state>();
655
656630   //logerror("cpu %s (PC=%08X) SINIT write = %08x\n", space.device().tag(), space.device().safe_pc(),data);
657   space.machine().scheduler().boost_interleave(state->m_sinit_boost_timeslice, attotime::from_usec(state->m_sinit_boost));
658   sh2_set_frt_input(state->m_maincpu, PULSE_LINE);
631   machine().scheduler().boost_interleave(m_sinit_boost_timeslice, attotime::from_usec(m_sinit_boost));
632   sh2_set_frt_input(m_maincpu, PULSE_LINE);
659633}
660634
661static READ8_HANDLER(saturn_backupram_r)
635READ8_MEMBER(saturn_state::saturn_backupram_r)
662636{
663   saturn_state *state = space.machine().driver_data<saturn_state>();
664
665637   if(!(offset & 1))
666638      return 0; // yes, it makes sure the "holes" are there.
667639
668   return state->m_backupram[offset >> 1] & 0xff;
640   return m_backupram[offset >> 1] & 0xff;
669641}
670642
671static WRITE8_HANDLER(saturn_backupram_w)
643WRITE8_MEMBER(saturn_state::saturn_backupram_w)
672644{
673   saturn_state *state = space.machine().driver_data<saturn_state>();
674
675645   if(!(offset & 1))
676646      return;
677647
678   state->m_backupram[offset >> 1] = data;
648   m_backupram[offset >> 1] = data;
679649}
680650
681651/* TODO: if you change the driver configuration then NVRAM contents gets screwed, needs mods in MAME framework */
r18148r18149
741711   }
742712}
743713
744static READ8_HANDLER( saturn_cart_type_r )
714READ8_MEMBER(saturn_state::saturn_cart_type_r)
745715{
746   saturn_state *state = space.machine().driver_data<saturn_state>();
747716   const int cart_ram_header[7] = { 0xff, 0x21, 0x22, 0x23, 0x24, 0x5a, 0x5c };
748717
749   return cart_ram_header[state->m_cart_type];
718   return cart_ram_header[m_cart_type];
750719}
751720
752721static ADDRESS_MAP_START( saturn_mem, AS_PROGRAM, 32, saturn_state )
753722   AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_SHARE("share6")  // bios
754723   AM_RANGE(0x00100000, 0x0010007f) AM_READWRITE8_LEGACY(saturn_SMPC_r, saturn_SMPC_w,0xffffffff)
755   AM_RANGE(0x00180000, 0x0018ffff) AM_READWRITE8_LEGACY(saturn_backupram_r, saturn_backupram_w,0xffffffff) AM_SHARE("share1")
724   AM_RANGE(0x00180000, 0x0018ffff) AM_READWRITE8(saturn_backupram_r, saturn_backupram_w,0xffffffff) AM_SHARE("share1")
756725   AM_RANGE(0x00200000, 0x002fffff) AM_RAM AM_MIRROR(0x20100000) AM_SHARE("workram_l")
757   AM_RANGE(0x01000000, 0x017fffff) AM_WRITE_LEGACY(minit_w)
758   AM_RANGE(0x01800000, 0x01ffffff) AM_WRITE_LEGACY(sinit_w)
726   AM_RANGE(0x01000000, 0x017fffff) AM_WRITE(minit_w)
727   AM_RANGE(0x01800000, 0x01ffffff) AM_WRITE(sinit_w)
759728   AM_RANGE(0x02000000, 0x023fffff) AM_ROM AM_SHARE("share7") AM_REGION("maincpu", 0x80000)   // cartridge space
760729//  AM_RANGE(0x02400000, 0x027fffff) AM_RAM //cart RAM area, dynamically allocated
761730//  AM_RANGE(0x04000000, 0x047fffff) AM_RAM //backup RAM area, dynamically allocated
762   AM_RANGE(0x04fffffc, 0x04ffffff) AM_READ8_LEGACY(saturn_cart_type_r,0x000000ff)
731   AM_RANGE(0x04fffffc, 0x04ffffff) AM_READ8(saturn_cart_type_r,0x000000ff)
763732   AM_RANGE(0x05800000, 0x0589ffff) AM_READWRITE_LEGACY(stvcd_r, stvcd_w)
764733   /* Sound */
765   AM_RANGE(0x05a00000, 0x05a7ffff) AM_READWRITE16_LEGACY(saturn_soundram_r, saturn_soundram_w,0xffffffff)
734   AM_RANGE(0x05a00000, 0x05a7ffff) AM_READWRITE16(saturn_soundram_r, saturn_soundram_w,0xffffffff)
766735   AM_RANGE(0x05b00000, 0x05b00fff) AM_DEVREADWRITE16_LEGACY("scsp", scsp_r, scsp_w, 0xffffffff)
767736   /* VDP1 */
768737   AM_RANGE(0x05c00000, 0x05c7ffff) AM_READWRITE_LEGACY(saturn_vdp1_vram_r, saturn_vdp1_vram_w)
r18148r18149
771740   AM_RANGE(0x05e00000, 0x05efffff) AM_READWRITE_LEGACY(saturn_vdp2_vram_r, saturn_vdp2_vram_w)
772741   AM_RANGE(0x05f00000, 0x05f7ffff) AM_READWRITE_LEGACY(saturn_vdp2_cram_r, saturn_vdp2_cram_w)
773742   AM_RANGE(0x05f80000, 0x05fbffff) AM_READWRITE16_LEGACY(saturn_vdp2_regs_r, saturn_vdp2_regs_w,0xffffffff)
774   AM_RANGE(0x05fe0000, 0x05fe00cf) AM_READWRITE_LEGACY(saturn_scu_r, saturn_scu_w)
743   AM_RANGE(0x05fe0000, 0x05fe00cf) AM_READWRITE(saturn_scu_r, saturn_scu_w)
775744   AM_RANGE(0x06000000, 0x060fffff) AM_RAM AM_MIRROR(0x21f00000) AM_SHARE("workram_h")
776745   AM_RANGE(0x20000000, 0x2007ffff) AM_ROM AM_SHARE("share6")  // bios mirror
777746   AM_RANGE(0x22000000, 0x24ffffff) AM_ROM AM_SHARE("share7")  // cart mirror
r18148r18149
782751static ADDRESS_MAP_START( stv_mem, AS_PROGRAM, 32, saturn_state )
783752   AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_SHARE("share6")  // bios
784753   AM_RANGE(0x00100000, 0x0010007f) AM_READWRITE8_LEGACY(stv_SMPC_r, stv_SMPC_w,0xffffffff)
785   AM_RANGE(0x00180000, 0x0018ffff) AM_READWRITE8_LEGACY(saturn_backupram_r,saturn_backupram_w,0xffffffff) AM_SHARE("share1")
754   AM_RANGE(0x00180000, 0x0018ffff) AM_READWRITE8(saturn_backupram_r,saturn_backupram_w,0xffffffff) AM_SHARE("share1")
786755   AM_RANGE(0x00200000, 0x002fffff) AM_RAM AM_MIRROR(0x20100000) AM_SHARE("workram_l")
787756//  AM_RANGE(0x00400000, 0x0040001f) AM_READWRITE_LEGACY(stv_ioga_r32, stv_io_w32) AM_SHARE("ioga") AM_MIRROR(0x20) /* installed with per-game specific */
788   AM_RANGE(0x01000000, 0x017fffff) AM_WRITE_LEGACY(minit_w)
789   AM_RANGE(0x01800000, 0x01ffffff) AM_WRITE_LEGACY(sinit_w)
757   AM_RANGE(0x01000000, 0x017fffff) AM_WRITE(minit_w)
758   AM_RANGE(0x01800000, 0x01ffffff) AM_WRITE(sinit_w)
790759   AM_RANGE(0x02000000, 0x04ffffff) AM_ROM AM_SHARE("share7") AM_REGION("abus", 0) // cartridge
791760   AM_RANGE(0x05800000, 0x0589ffff) AM_READWRITE_LEGACY(stvcd_r, stvcd_w)
792761   /* Sound */
793   AM_RANGE(0x05a00000, 0x05afffff) AM_READWRITE16_LEGACY(saturn_soundram_r, saturn_soundram_w,0xffffffff)
762   AM_RANGE(0x05a00000, 0x05afffff) AM_READWRITE16(saturn_soundram_r, saturn_soundram_w,0xffffffff)
794763   AM_RANGE(0x05b00000, 0x05b00fff) AM_DEVREADWRITE16_LEGACY("scsp", scsp_r, scsp_w, 0xffffffff)
795764   /* VDP1 */
796765   AM_RANGE(0x05c00000, 0x05c7ffff) AM_READWRITE_LEGACY(saturn_vdp1_vram_r, saturn_vdp1_vram_w)
r18148r18149
799768   AM_RANGE(0x05e00000, 0x05efffff) AM_READWRITE_LEGACY(saturn_vdp2_vram_r, saturn_vdp2_vram_w)
800769   AM_RANGE(0x05f00000, 0x05f7ffff) AM_READWRITE_LEGACY(saturn_vdp2_cram_r, saturn_vdp2_cram_w)
801770   AM_RANGE(0x05f80000, 0x05fbffff) AM_READWRITE16_LEGACY(saturn_vdp2_regs_r, saturn_vdp2_regs_w,0xffffffff)
802   AM_RANGE(0x05fe0000, 0x05fe00cf) AM_READWRITE_LEGACY(saturn_scu_r, saturn_scu_w)
771   AM_RANGE(0x05fe0000, 0x05fe00cf) AM_READWRITE(saturn_scu_r, saturn_scu_w)
803772   AM_RANGE(0x06000000, 0x060fffff) AM_RAM AM_MIRROR(0x21f00000) AM_SHARE("workram_h")
804773   AM_RANGE(0x20000000, 0x2007ffff) AM_ROM AM_SHARE("share6")  // bios mirror
805774   AM_RANGE(0x22000000, 0x24ffffff) AM_ROM AM_SHARE("share7")  // cart mirror
r18148r18149
824793
825794   if(oldval && !newval)
826795   {
827      //state->m_keyb.status &= ~8;
796      //m_keyb.status &= ~8;
828797      m_keyb.data = 0;
829798   }
830799}
r18148r18149
16281597static const sh2_cpu_core sh2_conf_master = { 0, NULL };
16291598static const sh2_cpu_core sh2_conf_slave  = { 1, NULL };
16301599
1631static int scsp_last_line = 0;
1632
16331600static void scsp_irq(device_t *device, int irq)
16341601{
16351602   saturn_state *state = device->machine().driver_data<saturn_state>();
r18148r18149
16421609
16431610   if (irq > 0)
16441611   {
1645      scsp_last_line = irq;
1612      state->m_scsp_last_line = irq;
16461613      device->machine().device("audiocpu")->execute().set_input_line(irq, ASSERT_LINE);
16471614   }
16481615   else if (irq < 0)
r18148r18149
16511618   }
16521619   else
16531620   {
1654      device->machine().device("audiocpu")->execute().set_input_line(scsp_last_line, CLEAR_LINE);
1621      device->machine().device("audiocpu")->execute().set_input_line(state->m_scsp_last_line, CLEAR_LINE);
16551622   }
16561623}
16571624
1658static WRITE_LINE_DEVICE_HANDLER( scsp_to_main_irq )
1625WRITE_LINE_MEMBER(saturn_state::scsp_to_main_irq)
16591626{
1660   saturn_state *drvstate = device->machine().driver_data<saturn_state>();
1661
1662   if(!(drvstate->m_scu.ism & IRQ_SOUND_REQ))
1627   if(!(m_scu.ism & IRQ_SOUND_REQ))
16631628   {
1664      drvstate->m_maincpu->set_input_line_and_vector(9, HOLD_LINE, 0x46);
1665      scu_do_transfer(device->machine(),5);
1629      m_maincpu->set_input_line_and_vector(9, HOLD_LINE, 0x46);
1630      scu_do_transfer(5);
16661631   }
16671632   else
1668      drvstate->m_scu.ist |= (IRQ_SOUND_REQ);
1633      m_scu.ist |= (IRQ_SOUND_REQ);
16691634}
16701635
16711636static const scsp_interface scsp_config =
16721637{
16731638   0,
16741639   scsp_irq,
1675   DEVCB_LINE(scsp_to_main_irq)
1640   DEVCB_DRIVER_LINE_MEMBER(saturn_state, scsp_to_main_irq)
16761641};
16771642
1678static TIMER_CALLBACK(stv_rtc_increment)
1643TIMER_CALLBACK_MEMBER(saturn_state::stv_rtc_increment)
16791644{
1680   saturn_state *state = machine.driver_data<saturn_state>();
16811645   static const UINT8 dpm[12] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 };
16821646   static int year_num, year_count;
16831647
16841648   /*
1685        state->m_smpc.rtc_data[0] = DectoBCD(systime.local_time.year /100);
1686        state->m_smpc.rtc_data[1] = DectoBCD(systime.local_time.year %100);
1687        state->m_smpc.rtc_data[2] = (systime.local_time.weekday << 4) | (systime.local_time.month+1);
1688        state->m_smpc.rtc_data[3] = DectoBCD(systime.local_time.mday);
1689        state->m_smpc.rtc_data[4] = DectoBCD(systime.local_time.hour);
1690        state->m_smpc.rtc_data[5] = DectoBCD(systime.local_time.minute);
1691        state->m_smpc.rtc_data[6] = DectoBCD(systime.local_time.second);
1649        m_smpc.rtc_data[0] = DectoBCD(systime.local_time.year /100);
1650        m_smpc.rtc_data[1] = DectoBCD(systime.local_time.year %100);
1651        m_smpc.rtc_data[2] = (systime.local_time.weekday << 4) | (systime.local_time.month+1);
1652        m_smpc.rtc_data[3] = DectoBCD(systime.local_time.mday);
1653        m_smpc.rtc_data[4] = DectoBCD(systime.local_time.hour);
1654        m_smpc.rtc_data[5] = DectoBCD(systime.local_time.minute);
1655        m_smpc.rtc_data[6] = DectoBCD(systime.local_time.second);
16921656    */
16931657
1694   state->m_smpc.rtc_data[6]++;
1658   m_smpc.rtc_data[6]++;
16951659
16961660   /* seconds from 9 -> 10*/
1697   if((state->m_smpc.rtc_data[6] & 0x0f) >= 0x0a)         { state->m_smpc.rtc_data[6]+=0x10; state->m_smpc.rtc_data[6]&=0xf0; }
1661   if((m_smpc.rtc_data[6] & 0x0f) >= 0x0a)         { m_smpc.rtc_data[6]+=0x10; m_smpc.rtc_data[6]&=0xf0; }
16981662   /* seconds from 59 -> 0 */
1699   if((state->m_smpc.rtc_data[6] & 0xf0) >= 0x60)         { state->m_smpc.rtc_data[5]++;     state->m_smpc.rtc_data[6] = 0; }
1663   if((m_smpc.rtc_data[6] & 0xf0) >= 0x60)         { m_smpc.rtc_data[5]++;     m_smpc.rtc_data[6] = 0; }
17001664   /* minutes from 9 -> 10 */
1701   if((state->m_smpc.rtc_data[5] & 0x0f) >= 0x0a)         { state->m_smpc.rtc_data[5]+=0x10; state->m_smpc.rtc_data[5]&=0xf0; }
1665   if((m_smpc.rtc_data[5] & 0x0f) >= 0x0a)         { m_smpc.rtc_data[5]+=0x10; m_smpc.rtc_data[5]&=0xf0; }
17021666   /* minutes from 59 -> 0 */
1703   if((state->m_smpc.rtc_data[5] & 0xf0) >= 0x60)         { state->m_smpc.rtc_data[4]++;     state->m_smpc.rtc_data[5] = 0; }
1667   if((m_smpc.rtc_data[5] & 0xf0) >= 0x60)         { m_smpc.rtc_data[4]++;     m_smpc.rtc_data[5] = 0; }
17041668   /* hours from 9 -> 10 */
1705   if((state->m_smpc.rtc_data[4] & 0x0f) >= 0x0a)         { state->m_smpc.rtc_data[4]+=0x10; state->m_smpc.rtc_data[4]&=0xf0; }
1669   if((m_smpc.rtc_data[4] & 0x0f) >= 0x0a)         { m_smpc.rtc_data[4]+=0x10; m_smpc.rtc_data[4]&=0xf0; }
17061670   /* hours from 23 -> 0 */
1707   if((state->m_smpc.rtc_data[4] & 0xff) >= 0x24)            { state->m_smpc.rtc_data[3]++; state->m_smpc.rtc_data[2]+=0x10; state->m_smpc.rtc_data[4] = 0; }
1671   if((m_smpc.rtc_data[4] & 0xff) >= 0x24)            { m_smpc.rtc_data[3]++; m_smpc.rtc_data[2]+=0x10; m_smpc.rtc_data[4] = 0; }
17081672   /* week day name sunday -> monday */
1709   if((state->m_smpc.rtc_data[2] & 0xf0) >= 0x70)            { state->m_smpc.rtc_data[2]&=0x0f; }
1673   if((m_smpc.rtc_data[2] & 0xf0) >= 0x70)            { m_smpc.rtc_data[2]&=0x0f; }
17101674   /* day number 9 -> 10 */
1711   if((state->m_smpc.rtc_data[3] & 0x0f) >= 0x0a)            { state->m_smpc.rtc_data[3]+=0x10; state->m_smpc.rtc_data[3]&=0xf0; }
1675   if((m_smpc.rtc_data[3] & 0x0f) >= 0x0a)            { m_smpc.rtc_data[3]+=0x10; m_smpc.rtc_data[3]&=0xf0; }
17121676
17131677   // year BCD to dec conversion (for the leap year stuff)
17141678   {
1715      year_num = (state->m_smpc.rtc_data[1] & 0xf);
1679      year_num = (m_smpc.rtc_data[1] & 0xf);
17161680
1717      for(year_count = 0; year_count < (state->m_smpc.rtc_data[1] & 0xf0); year_count += 0x10)
1681      for(year_count = 0; year_count < (m_smpc.rtc_data[1] & 0xf0); year_count += 0x10)
17181682         year_num += 0xa;
17191683
1720      year_num += (state->m_smpc.rtc_data[0] & 0xf)*0x64;
1684      year_num += (m_smpc.rtc_data[0] & 0xf)*0x64;
17211685
1722      for(year_count = 0; year_count < (state->m_smpc.rtc_data[0] & 0xf0); year_count += 0x10)
1686      for(year_count = 0; year_count < (m_smpc.rtc_data[0] & 0xf0); year_count += 0x10)
17231687         year_num += 0x3e8;
17241688   }
17251689
17261690   /* month +1 check */
17271691   /* the RTC have a range of 1980 - 2100, so we don't actually need to support the leap year special conditions */
1728   if(((year_num % 4) == 0) && (state->m_smpc.rtc_data[2] & 0xf) == 2)
1692   if(((year_num % 4) == 0) && (m_smpc.rtc_data[2] & 0xf) == 2)
17291693   {
1730      if((state->m_smpc.rtc_data[3] & 0xff) >= dpm[(state->m_smpc.rtc_data[2] & 0xf)-1]+1+1)
1731         { state->m_smpc.rtc_data[2]++; state->m_smpc.rtc_data[3] = 0x01; }
1694      if((m_smpc.rtc_data[3] & 0xff) >= dpm[(m_smpc.rtc_data[2] & 0xf)-1]+1+1)
1695         { m_smpc.rtc_data[2]++; m_smpc.rtc_data[3] = 0x01; }
17321696   }
1733   else if((state->m_smpc.rtc_data[3] & 0xff) >= dpm[(state->m_smpc.rtc_data[2] & 0xf)-1]+1){ state->m_smpc.rtc_data[2]++; state->m_smpc.rtc_data[3] = 0x01; }
1697   else if((m_smpc.rtc_data[3] & 0xff) >= dpm[(m_smpc.rtc_data[2] & 0xf)-1]+1){ m_smpc.rtc_data[2]++; m_smpc.rtc_data[3] = 0x01; }
17341698   /* year +1 check */
1735   if((state->m_smpc.rtc_data[2] & 0x0f) > 12)            { state->m_smpc.rtc_data[1]++;  state->m_smpc.rtc_data[2] = (state->m_smpc.rtc_data[2] & 0xf0) | 0x01; }
1699   if((m_smpc.rtc_data[2] & 0x0f) > 12)            { m_smpc.rtc_data[1]++;  m_smpc.rtc_data[2] = (m_smpc.rtc_data[2] & 0xf0) | 0x01; }
17361700   /* year from 9 -> 10 */
1737   if((state->m_smpc.rtc_data[1] & 0x0f) >= 0x0a)            { state->m_smpc.rtc_data[1]+=0x10; state->m_smpc.rtc_data[1]&=0xf0; }
1701   if((m_smpc.rtc_data[1] & 0x0f) >= 0x0a)            { m_smpc.rtc_data[1]+=0x10; m_smpc.rtc_data[1]&=0xf0; }
17381702   /* year from 99 -> 100 */
1739   if((state->m_smpc.rtc_data[1] & 0xf0) >= 0xa0)            { state->m_smpc.rtc_data[0]++; state->m_smpc.rtc_data[1] = 0; }
1703   if((m_smpc.rtc_data[1] & 0xf0) >= 0xa0)            { m_smpc.rtc_data[0]++; m_smpc.rtc_data[1] = 0; }
17401704
17411705   // probably not SO precise, here just for reference ...
17421706   /* year from 999 -> 1000 */
1743   //if((state->m_smpc.rtc_data[0] & 0x0f) >= 0x0a)               { state->m_smpc.rtc_data[0]+=0x10; state->m_smpc.rtc_data[0]&=0xf0; }
1707   //if((m_smpc.rtc_data[0] & 0x0f) >= 0x0a)               { m_smpc.rtc_data[0]+=0x10; m_smpc.rtc_data[0]&=0xf0; }
17441708   /* year from 9999 -> 0 */
1745   //if((state->m_smpc.rtc_data[0] & 0xf0) >= 0xa0)               { state->m_smpc.rtc_data[0] = 0; } //roll over
1709   //if((m_smpc.rtc_data[0] & 0xf0) >= 0xa0)               { m_smpc.rtc_data[0] = 0; } //roll over
17461710}
17471711
17481712MACHINE_START_MEMBER(saturn_state,stv)
r18148r18149
17701734   state_save_register_global(machine(), m_smpc.PDR2);
17711735   state_save_register_global(machine(), m_port_sel);
17721736   state_save_register_global(machine(), m_mux_data);
1773   state_save_register_global(machine(), scsp_last_line);
1737   state_save_register_global(machine(), m_scsp_last_line);
17741738
17751739   stv_register_protection_savestates(machine()); // machine/stvprot.c
17761740
r18148r18149
17841748    m_smpc.rtc_data[5] = DectoBCD(systime.local_time.minute);
17851749    m_smpc.rtc_data[6] = DectoBCD(systime.local_time.second);
17861750
1787   m_stv_rtc_timer = machine().scheduler().timer_alloc(FUNC(stv_rtc_increment));
1751   m_stv_rtc_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(saturn_state::stv_rtc_increment),this));
17881752}
17891753
17901754
r18148r18149
18121776   state_save_register_global(machine(), m_smpc.PDR2);
18131777//  state_save_register_global(machine(), m_port_sel);
18141778//  state_save_register_global(machine(), mux_data);
1815   state_save_register_global(machine(), scsp_last_line);
1779   state_save_register_global(machine(), m_scsp_last_line);
18161780   state_save_register_global(machine(), m_smpc.intback_stage);
18171781   state_save_register_global(machine(), m_smpc.pmode);
18181782   state_save_register_global(machine(), m_smpc.SR);
r18148r18149
18291793    m_smpc.rtc_data[5] = DectoBCD(systime.local_time.minute);
18301794    m_smpc.rtc_data[6] = DectoBCD(systime.local_time.second);
18311795
1832   m_stv_rtc_timer = machine().scheduler().timer_alloc(FUNC(stv_rtc_increment));
1796   m_stv_rtc_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(saturn_state::stv_rtc_increment),this));
18331797}
18341798
18351799
r18148r18149
18601824{
18611825   saturn_state *state = machine().driver_data<saturn_state>();
18621826   int scanline = param;
1863   int max_y = timer.machine().primary_screen->height();
1827   int max_y = machine().primary_screen->height();
18641828   int y_step,vblank_line;
18651829
18661830   y_step = 2;
r18148r18149
18741838
18751839   if(scanline == (0)*y_step)
18761840   {
1877      video_update_vdp1(timer.machine());
1841      video_update_vdp1(machine());
18781842
18791843      if(STV_VDP1_VBE)
18801844         m_vdp1.framebuffer_clear_on_next_frame = 1;
r18148r18149
18821846      if(!(m_scu.ism & IRQ_VDP1_END))
18831847      {
18841848         m_maincpu->set_input_line_and_vector(0x2, HOLD_LINE, 0x4d);
1885         scu_do_transfer(timer.machine(),6);
1849         scu_do_transfer(6);
18861850      }
18871851      else
18881852         m_scu.ist |= (IRQ_VDP1_END);
r18148r18149
18931857      if(!(m_scu.ism & IRQ_VBLANK_OUT))
18941858      {
18951859         m_maincpu->set_input_line_and_vector(0xe, HOLD_LINE, 0x41);
1896         scu_do_transfer(timer.machine(),1);
1860         scu_do_transfer(1);
18971861      }
18981862      else
18991863         m_scu.ist |= (IRQ_VBLANK_OUT);
r18148r18149
19041868      if(!(m_scu.ism & IRQ_VBLANK_IN))
19051869      {
19061870         m_maincpu->set_input_line_and_vector(0xf, HOLD_LINE ,0x40);
1907         scu_do_transfer(timer.machine(),0);
1871         scu_do_transfer(0);
19081872      }
19091873      else
19101874         m_scu.ist |= (IRQ_VBLANK_IN);
r18148r18149
19141878      if(!(m_scu.ism & IRQ_HBLANK_IN))
19151879      {
19161880         m_maincpu->set_input_line_and_vector(0xd, HOLD_LINE, 0x42);
1917         scu_do_transfer(timer.machine(),2);
1881         scu_do_transfer(2);
19181882      }
19191883      else
19201884         m_scu.ist |= (IRQ_HBLANK_IN);
r18148r18149
19251889      if(!(m_scu.ism & IRQ_TIMER_0))
19261890      {
19271891         m_maincpu->set_input_line_and_vector(0xc, HOLD_LINE, 0x43 );
1928         scu_do_transfer(timer.machine(),3);
1892         scu_do_transfer(3);
19291893      }
19301894      else
19311895         m_scu.ist |= (IRQ_TIMER_0);
r18148r18149
19401904         if(!(m_scu.ism & IRQ_TIMER_1))
19411905         {
19421906            m_maincpu->set_input_line_and_vector(0xb, HOLD_LINE, 0x44 );
1943            scu_do_transfer(timer.machine(),4);
1907            scu_do_transfer(4);
19441908         }
19451909         else
19461910            m_scu.ist |= (IRQ_TIMER_1);
r18148r18149
19511915TIMER_DEVICE_CALLBACK_MEMBER(saturn_state::saturn_slave_scanline )
19521916{
19531917   int scanline = param;
1954   int max_y = timer.machine().primary_screen->height();
1918   int max_y = machine().primary_screen->height();
19551919   int y_step,vblank_line;
19561920
19571921   y_step = 2;
r18148r18149
19681932}
19691933
19701934/* Die Hard Trilogy tests RAM address 0x25e7ffe bit 2 with Slave during FRT minit irq, in-development tool for breaking execution of it? */
1971static READ32_HANDLER( saturn_null_ram_r )
1935READ32_MEMBER(saturn_state::saturn_null_ram_r)
19721936{
19731937   return 0xffffffff;
19741938}
19751939
1976static WRITE32_HANDLER( saturn_null_ram_w )
1940WRITE32_MEMBER(saturn_state::saturn_null_ram_w)
19771941{
19781942
19791943}
19801944
1981static READ32_HANDLER( saturn_cart_dram0_r )
1945READ32_MEMBER(saturn_state::saturn_cart_dram0_r)
19821946{
1983   saturn_state *state = space.machine().driver_data<saturn_state>();
1984
1985   return state->m_cart_dram[offset];
1947   return m_cart_dram[offset];
19861948}
19871949
1988static WRITE32_HANDLER( saturn_cart_dram0_w )
1950WRITE32_MEMBER(saturn_state::saturn_cart_dram0_w)
19891951{
1990   saturn_state *state = space.machine().driver_data<saturn_state>();
1991
1992   COMBINE_DATA(&state->m_cart_dram[offset]);
1952   COMBINE_DATA(&m_cart_dram[offset]);
19931953}
19941954
1995static READ32_HANDLER( saturn_cart_dram1_r )
1955READ32_MEMBER(saturn_state::saturn_cart_dram1_r)
19961956{
1997   saturn_state *state = space.machine().driver_data<saturn_state>();
1998
1999   return state->m_cart_dram[offset+0x200000/4];
1957   return m_cart_dram[offset+0x200000/4];
20001958}
20011959
2002static WRITE32_HANDLER( saturn_cart_dram1_w )
1960WRITE32_MEMBER(saturn_state::saturn_cart_dram1_w)
20031961{
2004   saturn_state *state = space.machine().driver_data<saturn_state>();
2005
2006   COMBINE_DATA(&state->m_cart_dram[offset+0x200000/4]);
1962   COMBINE_DATA(&m_cart_dram[offset+0x200000/4]);
20071963}
20081964
2009static READ32_HANDLER( saturn_cs1_r )
1965READ32_MEMBER(saturn_state::saturn_cs1_r)
20101966{
2011   saturn_state *state = space.machine().driver_data<saturn_state>();
20121967   UINT32 res;
20131968
20141969   res = 0;
2015   //res  = state->m_cart_backupram[offset*4+0] << 24;
2016   res |= state->m_cart_backupram[offset*2+0] << 16;
2017   //res |= state->m_cart_backupram[offset*4+2] << 8;
2018   res |= state->m_cart_backupram[offset*2+1] << 0;
1970   //res  = m_cart_backupram[offset*4+0] << 24;
1971   res |= m_cart_backupram[offset*2+0] << 16;
1972   //res |= m_cart_backupram[offset*4+2] << 8;
1973   res |= m_cart_backupram[offset*2+1] << 0;
20191974
20201975   return res;
20211976}
20221977
2023static WRITE32_HANDLER( saturn_cs1_w )
1978WRITE32_MEMBER(saturn_state::saturn_cs1_w)
20241979{
2025   saturn_state *state = space.machine().driver_data<saturn_state>();
2026
20271980   if(ACCESSING_BITS_16_23)
2028      state->m_cart_backupram[offset*2+0] = (data & 0x00ff0000) >> 16;
1981      m_cart_backupram[offset*2+0] = (data & 0x00ff0000) >> 16;
20291982   if(ACCESSING_BITS_0_7)
2030      state->m_cart_backupram[offset*2+1] = (data & 0x000000ff) >> 0;
1983      m_cart_backupram[offset*2+1] = (data & 0x000000ff) >> 0;
20311984}
20321985
20331986MACHINE_RESET_MEMBER(saturn_state,saturn)
20341987{
1988   m_scsp_last_line = 0;
1989   
20351990   // don't let the slave cpu and the 68k go anywhere
20361991   machine().device("slave")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
20371992   machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
r18148r18149
20532008
20542009   m_cart_type = ioport("CART_AREA")->read() & 7;
20552010
2056   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x02400000, 0x027fffff, FUNC(saturn_null_ram_r), FUNC(saturn_null_ram_w));
2057   machine().device("slave")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x02400000, 0x027fffff, FUNC(saturn_null_ram_r), FUNC(saturn_null_ram_w));
2011   machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x02400000, 0x027fffff, read32_delegate(FUNC(saturn_state::saturn_null_ram_r),this), write32_delegate(FUNC(saturn_state::saturn_null_ram_w),this));
2012   machine().device("slave")->memory().space(AS_PROGRAM).install_readwrite_handler(0x02400000, 0x027fffff, read32_delegate(FUNC(saturn_state::saturn_null_ram_r),this), write32_delegate(FUNC(saturn_state::saturn_null_ram_w),this));
20582013
20592014   if(m_cart_type == 5)
20602015   {
r18148r18149
20622017      machine().device("maincpu")->memory().space(AS_PROGRAM).nop_readwrite(0x02400000, 0x027fffff);
20632018      machine().device("slave")->memory().space(AS_PROGRAM).nop_readwrite(0x02400000, 0x027fffff);
20642019
2065      machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x02400000, 0x0247ffff, FUNC(saturn_cart_dram0_r), FUNC(saturn_cart_dram0_w));
2066      machine().device("slave")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x02400000, 0x0247ffff, FUNC(saturn_cart_dram0_r), FUNC(saturn_cart_dram0_w));
2067      machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x02600000, 0x0267ffff, FUNC(saturn_cart_dram1_r), FUNC(saturn_cart_dram1_w));
2068      machine().device("slave")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x02600000, 0x0267ffff, FUNC(saturn_cart_dram1_r), FUNC(saturn_cart_dram1_w));
2020      machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x02400000, 0x0247ffff, read32_delegate(FUNC(saturn_state::saturn_cart_dram0_r),this), write32_delegate(FUNC(saturn_state::saturn_cart_dram0_w),this));
2021      machine().device("slave")->memory().space(AS_PROGRAM).install_readwrite_handler(0x02400000, 0x0247ffff, read32_delegate(FUNC(saturn_state::saturn_cart_dram0_r),this), write32_delegate(FUNC(saturn_state::saturn_cart_dram0_w),this));
2022      machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x02600000, 0x0267ffff, read32_delegate(FUNC(saturn_state::saturn_cart_dram1_r),this), write32_delegate(FUNC(saturn_state::saturn_cart_dram1_w),this));
2023      machine().device("slave")->memory().space(AS_PROGRAM).install_readwrite_handler(0x02600000, 0x0267ffff, read32_delegate(FUNC(saturn_state::saturn_cart_dram1_r),this), write32_delegate(FUNC(saturn_state::saturn_cart_dram1_w),this));
20692024   }
20702025
20712026   if(m_cart_type == 6)
r18148r18149
20742029      machine().device("maincpu")->memory().space(AS_PROGRAM).nop_readwrite(0x02400000, 0x027fffff);
20752030      machine().device("slave")->memory().space(AS_PROGRAM).nop_readwrite(0x02400000, 0x027fffff);
20762031
2077      machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x02400000, 0x025fffff, FUNC(saturn_cart_dram0_r), FUNC(saturn_cart_dram0_w));
2078      machine().device("slave")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x02400000, 0x025fffff, FUNC(saturn_cart_dram0_r), FUNC(saturn_cart_dram0_w));
2079      machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x02600000, 0x027fffff, FUNC(saturn_cart_dram1_r), FUNC(saturn_cart_dram1_w));
2080      machine().device("slave")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x02600000, 0x027fffff, FUNC(saturn_cart_dram1_r), FUNC(saturn_cart_dram1_w));
2032      machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x02400000, 0x025fffff, read32_delegate(FUNC(saturn_state::saturn_cart_dram0_r),this), write32_delegate(FUNC(saturn_state::saturn_cart_dram0_w),this));
2033      machine().device("slave")->memory().space(AS_PROGRAM).install_readwrite_handler(0x02400000, 0x025fffff, read32_delegate(FUNC(saturn_state::saturn_cart_dram0_r),this), write32_delegate(FUNC(saturn_state::saturn_cart_dram0_w),this));
2034      machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x02600000, 0x027fffff, read32_delegate(FUNC(saturn_state::saturn_cart_dram1_r),this), write32_delegate(FUNC(saturn_state::saturn_cart_dram1_w),this));
2035      machine().device("slave")->memory().space(AS_PROGRAM).install_readwrite_handler(0x02600000, 0x027fffff, read32_delegate(FUNC(saturn_state::saturn_cart_dram1_r),this), write32_delegate(FUNC(saturn_state::saturn_cart_dram1_w),this));
20812036   }
20822037
20832038   machine().device("maincpu")->memory().space(AS_PROGRAM).nop_readwrite(0x04000000, 0x047fffff);
r18148r18149
20922047      //mask = 0x7fffff >> 4-3 = 0x3fffff 16mbit
20932048      //mask = 0x7fffff >> 4-2 = 0x1fffff 8mbit
20942049      //mask = 0x7fffff >> 4-1 = 0x0fffff 4mbit
2095      machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x04000000, 0x04000000 | mask, FUNC(saturn_cs1_r), FUNC(saturn_cs1_w));
2096      machine().device("slave")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x04000000, 0x04000000 | mask, FUNC(saturn_cs1_r), FUNC(saturn_cs1_w));
2050      machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x04000000, 0x04000000 | mask, read32_delegate(FUNC(saturn_state::saturn_cs1_r),this), write32_delegate(FUNC(saturn_state::saturn_cs1_w),this));
2051      machine().device("slave")->memory().space(AS_PROGRAM).install_readwrite_handler(0x04000000, 0x04000000 | mask, read32_delegate(FUNC(saturn_state::saturn_cs1_r),this), write32_delegate(FUNC(saturn_state::saturn_cs1_w),this));
20972052   }
20982053
20992054
r18148r18149
21112066
21122067MACHINE_RESET_MEMBER(saturn_state,stv)
21132068{
2114
2069   m_scsp_last_line = 0;
2070   
21152071   // don't let the slave cpu and the 68k go anywhere
21162072   machine().device("slave")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
21172073   machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
r18148r18149
24032359MACHINE_CONFIG_END
24042360
24052361
2406static void saturn_init_driver(running_machine &machine, int rgn)
2362void saturn_state::saturn_init_driver(int rgn)
24072363{
2408   saturn_state *state = machine.driver_data<saturn_state>();
2364   m_saturn_region = rgn;
2365   m_vdp2.pal = (rgn == 12) ? 1 : 0;
24092366
2410   state->m_saturn_region = rgn;
2411   state->m_vdp2.pal = (rgn == 12) ? 1 : 0;
2412
24132367   // set compatible options
2414   sh2drc_set_options(machine.device("maincpu"), SH2DRC_STRICT_VERIFY|SH2DRC_STRICT_PCREL);
2415   sh2drc_set_options(machine.device("slave"), SH2DRC_STRICT_VERIFY|SH2DRC_STRICT_PCREL);
2368   sh2drc_set_options(machine().device("maincpu"), SH2DRC_STRICT_VERIFY|SH2DRC_STRICT_PCREL);
2369   sh2drc_set_options(machine().device("slave"), SH2DRC_STRICT_VERIFY|SH2DRC_STRICT_PCREL);
24162370
24172371   /* amount of time to boost interleave for on MINIT / SINIT, needed for communication to work */
2418   state->m_minit_boost = 400;
2419   state->m_sinit_boost = 400;
2420   state->m_minit_boost_timeslice = attotime::zero;
2421   state->m_sinit_boost_timeslice = attotime::zero;
2372   m_minit_boost = 400;
2373   m_sinit_boost = 400;
2374   m_minit_boost_timeslice = attotime::zero;
2375   m_sinit_boost_timeslice = attotime::zero;
24222376
2423   state->m_scu_regs = auto_alloc_array(machine, UINT32, 0x100/4);
2424   state->m_scsp_regs = auto_alloc_array(machine, UINT16, 0x1000/2);
2425   state->m_cart_dram = auto_alloc_array(machine, UINT32, 0x400000/4);
2426   state->m_backupram = auto_alloc_array(machine, UINT8, 0x8000);
2427   state->m_cart_backupram = auto_alloc_array(machine, UINT8, 0x400000);
2377   m_scu_regs = auto_alloc_array(machine(), UINT32, 0x100/4);
2378   m_scsp_regs = auto_alloc_array(machine(), UINT16, 0x1000/2);
2379   m_cart_dram = auto_alloc_array(machine(), UINT32, 0x400000/4);
2380   m_backupram = auto_alloc_array(machine(), UINT8, 0x8000);
2381   m_cart_backupram = auto_alloc_array(machine(), UINT8, 0x400000);
24282382}
24292383
24302384DRIVER_INIT_MEMBER(saturn_state,saturnus)
24312385{
2432   saturn_init_driver(machine(), 4);
2386   saturn_init_driver(4);
24332387}
24342388
24352389DRIVER_INIT_MEMBER(saturn_state,saturneu)
24362390{
2437   saturn_init_driver(machine(), 12);
2391   saturn_init_driver(12);
24382392}
24392393
24402394DRIVER_INIT_MEMBER(saturn_state,saturnjp)
24412395{
2442   saturn_init_driver(machine(), 1);
2396   saturn_init_driver(1);
24432397}
24442398
24452399

Previous 199869 Revisions Next


© 1997-2024 The MAME Team