From f6cd8f7a8f7d715d2bd055a228b34c3a165b4308 Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Mon, 23 May 2011 16:23:41 +0000 Subject: [PATCH] More clean-ups, last ones at this cycle --- src/mame/drivers/saturn.c | 366 ++++++++++++++++++-------------------- 1 file changed, 173 insertions(+), 193 deletions(-) diff --git a/src/mame/drivers/saturn.c b/src/mame/drivers/saturn.c index 36500b4f307..14667bc72d6 100644 --- a/src/mame/drivers/saturn.c +++ b/src/mame/drivers/saturn.c @@ -431,6 +431,151 @@ static void smpc_system_reset(running_machine &machine) device_set_input_line(state->m_maincpu, INPUT_LINE_RESET, PULSE_LINE); } +static void smpc_change_clock(running_machine &machine, UINT8 cmd) +{ + saturn_state *state = machine.driver_data(); + UINT32 xtal; + + xtal = cmd ? MASTER_CLOCK_320 : MASTER_CLOCK_352; + + machine.device("maincpu")->set_unscaled_clock(xtal/2); + machine.device("slave")->set_unscaled_clock(xtal/2); + machine.device("audiocpu")->set_unscaled_clock(xtal/5); + + // TODO: pixel clock change goes there + + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); // ff said this causes nmi, should we set a timer then nmi? +} + +static void smpc_intbackhelper(running_machine &machine) +{ + saturn_state *state = machine.driver_data(); + int pad; + static const char *const padnames[] = { "JOY1", "JOY2" }; + + if (state->m_smpc.intback_stage == 1) + { + state->m_smpc.intback_stage++; + return; + } + + pad = input_port_read(machine, padnames[state->m_smpc.intback_stage-2]); + +// if (LOG_SMPC) logerror("SMPC: providing PAD data for intback, pad %d\n", intback_stage-2); + state->m_smpc_ram[33] = 0xf1; // no tap, direct connect + state->m_smpc_ram[35] = 0x02; // saturn pad + state->m_smpc_ram[37] = pad>>8; + state->m_smpc_ram[39] = pad & 0xff; + + if (state->m_smpc.intback_stage == 3) + { + state->m_smpc.smpcSR = (0x80 | state->m_smpc.pmode); // pad 2, no more data, echo back pad mode set by intback + } + else + { + state->m_smpc.smpcSR = (0xe0 | state->m_smpc.pmode); // pad 1, more data, echo back pad mode set by intback + } + + state->m_smpc.intback_stage++; +} + +/* sys_type 1 == STV, 0 == SATURN */ +static void smpc_intback(running_machine &machine, UINT8 sys_type,system_time systime) +{ + saturn_state *state = machine.driver_data(); + state->m_smpc_ram[0x21] = (0x80) | ((state->m_NMI_reset & 1) << 6); + + if(sys_type == 0) + { + state->m_smpc_ram[0x23] = dec_2_bcd(systime.local_time.year / 100); + state->m_smpc_ram[0x25] = dec_2_bcd(systime.local_time.year % 100); + state->m_smpc_ram[0x27] = (systime.local_time.weekday << 4) | (systime.local_time.month + 1); + state->m_smpc_ram[0x29] = dec_2_bcd(systime.local_time.mday); + state->m_smpc_ram[0x2b] = dec_2_bcd(systime.local_time.hour); + state->m_smpc_ram[0x2d] = dec_2_bcd(systime.local_time.minute); + state->m_smpc_ram[0x2f] = dec_2_bcd(systime.local_time.second); + } + + state->m_smpc_ram[0x31]=0x00; //? + + //state->m_smpc_ram[0x33]=input_port_read(space->machine(), "FAKE"); + + state->m_smpc_ram[0x35]=0x00; + state->m_smpc_ram[0x37]=0x00; + + state->m_smpc_ram[0x39]=sys_type ? 0xff : state->m_smpc.SMEM[0]; + state->m_smpc_ram[0x3b]=sys_type ? 0xff : state->m_smpc.SMEM[1]; + state->m_smpc_ram[0x3d]=sys_type ? 0xff : state->m_smpc.SMEM[2]; + state->m_smpc_ram[0x3f]=sys_type ? 0xff : state->m_smpc.SMEM[3]; + + state->m_smpc_ram[0x41]=0xff; + state->m_smpc_ram[0x43]=0xff; + state->m_smpc_ram[0x45]=0xff; + state->m_smpc_ram[0x47]=0xff; + state->m_smpc_ram[0x49]=0xff; + state->m_smpc_ram[0x4b]=0xff; + state->m_smpc_ram[0x4d]=0xff; + state->m_smpc_ram[0x4f]=0xff; + state->m_smpc_ram[0x51]=0xff; + state->m_smpc_ram[0x53]=0xff; + state->m_smpc_ram[0x55]=0xff; + state->m_smpc_ram[0x57]=0xff; + state->m_smpc_ram[0x59]=0xff; + state->m_smpc_ram[0x5b]=0xff; + state->m_smpc_ram[0x5d]=0xff; + + if(sys_type == 0) + { + state->m_smpc.smpcSR = 0x60; // peripheral data ready, no reset, etc. + state->m_smpc.pmode = state->m_smpc_ram[1]>>4; + + state->m_smpc.intback_stage = 1; + + smpc_intbackhelper(machine); + } + + // /*This is for RTC,cartridge code and similar stuff...*/ + //if(LOG_SMPC) logerror ("Interrupt: System Manager (SMPC) at scanline %04x, Vector 0x47 Level 0x08\n",scanline); + device_set_input_line_and_vector(state->m_maincpu, 8, (stv_irq.smpc) ? HOLD_LINE : CLEAR_LINE, 0x47); +} + +static void smpc_rtc_write(running_machine &machine) +{ + saturn_state *state = machine.driver_data(); + state->m_smpc_ram[0x2f] = state->m_smpc_ram[0x0d]; + state->m_smpc_ram[0x2d] = state->m_smpc_ram[0x0b]; + state->m_smpc_ram[0x2b] = state->m_smpc_ram[0x09]; + state->m_smpc_ram[0x29] = state->m_smpc_ram[0x07]; + state->m_smpc_ram[0x27] = state->m_smpc_ram[0x05]; + state->m_smpc_ram[0x25] = state->m_smpc_ram[0x03]; + state->m_smpc_ram[0x23] = state->m_smpc_ram[0x01]; +} + +static void smpc_memory_setting(running_machine &machine) +{ + saturn_state *state = machine.driver_data(); + state->m_smpc.SMEM[0] = state->m_smpc_ram[1]; + state->m_smpc.SMEM[1] = state->m_smpc_ram[3]; + state->m_smpc.SMEM[2] = state->m_smpc_ram[5]; + state->m_smpc.SMEM[3] = state->m_smpc_ram[7]; +} + +static void smpc_nmi_req(running_machine &machine) +{ + saturn_state *state = machine.driver_data(); + + /*NMI is unconditionally requested?*/ + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); +} + +static void smpc_nmi_set(running_machine &machine,UINT8 cmd) +{ + saturn_state *state = machine.driver_data(); + + state->m_NMI_reset = cmd ^ 1; + state->m_smpc_ram[0x21] = (0x80) | ((state->m_NMI_reset & 1) << 6); +} + static WRITE8_HANDLER( stv_SMPC_w8 ) { saturn_state *state = space->machine().driver_data(); @@ -486,7 +631,6 @@ static WRITE8_HANDLER( stv_SMPC_w8 ) state->m_smpc.IOSEL2 = (state->m_smpc_ram[0x7d] & 2) >> 1; } - /*TODO: probably this is wrong...*/ if(offset == 0x7f) { //enable PAD irq & VDP2 external latch for port 1/2 @@ -495,11 +639,11 @@ static WRITE8_HANDLER( stv_SMPC_w8 ) if(state->m_smpc.EXLE1 || state->m_smpc.EXLE2) { //if(LOG_SMPC) logerror ("Interrupt: PAD irq at scanline %04x, Vector 0x48 Level 0x08\n",scanline); - cputag_set_input_line_and_vector(space->machine(), "maincpu", 8, (stv_irq.pad) ? HOLD_LINE : CLEAR_LINE, 0x48); + //cputag_set_input_line_and_vector(space->machine(), "maincpu", 8, (stv_irq.pad) ? HOLD_LINE : CLEAR_LINE, 0x48); } } - if (offset == 0x1f) + if (offset == 0x1f) // COMREG { switch (data) { @@ -525,94 +669,33 @@ static WRITE8_HANDLER( stv_SMPC_w8 ) smpc_system_reset(space->machine()); break; case 0x0e: - if(LOG_SMPC) logerror ("SMPC: Change Clock to 352\n"); - space->machine().device("maincpu")->set_unscaled_clock(MASTER_CLOCK_352/2); - space->machine().device("slave")->set_unscaled_clock(MASTER_CLOCK_352/2); - space->machine().device("audiocpu")->set_unscaled_clock(MASTER_CLOCK_352/5); - cputag_set_input_line(space->machine(), "maincpu", INPUT_LINE_NMI, PULSE_LINE); // ff said this causes nmi, should we set a timer then nmi? - break; case 0x0f: - if(LOG_SMPC) logerror ("SMPC: Change Clock to 320\n"); - space->machine().device("maincpu")->set_unscaled_clock(MASTER_CLOCK_320/2); - space->machine().device("slave")->set_unscaled_clock(MASTER_CLOCK_320/2); - space->machine().device("audiocpu")->set_unscaled_clock(MASTER_CLOCK_320/5); - cputag_set_input_line(space->machine(), "maincpu", INPUT_LINE_NMI, PULSE_LINE); // ff said this causes nmi, should we set a timer then nmi? + if(LOG_SMPC) logerror ("SMPC: Change Clock to %s\n",data & 1 ? "320" : "352"); + smpc_change_clock(space->machine(),data & 1); break; /*"Interrupt Back"*/ case 0x10: if(LOG_SMPC) logerror ("SMPC: Status Acquire\n"); - state->m_smpc_ram[0x21] = (0x80) | ((state->m_NMI_reset & 1) << 6); - //state->m_smpc_ram[0x23] = DectoBCD(systime.local_time.year /100); - //state->m_smpc_ram[0x25] = DectoBCD(systime.local_time.year %100); - //state->m_smpc_ram[0x27] = (systime.local_time.weekday << 4) | (systime.local_time.month+1); - //state->m_smpc_ram[0x29] = DectoBCD(systime.local_time.mday); - //state->m_smpc_ram[0x2b] = DectoBCD(systime.local_time.hour); - //state->m_smpc_ram[0x2d] = DectoBCD(systime.local_time.minute); - //state->m_smpc_ram[0x2f] = DectoBCD(systime.local_time.second); - - state->m_smpc_ram[0x31]=0x00; //? - - //state->m_smpc_ram[0x33]=input_port_read(space->machine(), "FAKE"); - - state->m_smpc_ram[0x35]=0x00; - state->m_smpc_ram[0x37]=0x00; - - state->m_smpc_ram[0x39]=0xff; - state->m_smpc_ram[0x3b]=0xff; - state->m_smpc_ram[0x3d]=0xff; - state->m_smpc_ram[0x3f]=0xff; - state->m_smpc_ram[0x41]=0xff; - state->m_smpc_ram[0x43]=0xff; - state->m_smpc_ram[0x45]=0xff; - state->m_smpc_ram[0x47]=0xff; - state->m_smpc_ram[0x49]=0xff; - state->m_smpc_ram[0x4b]=0xff; - state->m_smpc_ram[0x4d]=0xff; - state->m_smpc_ram[0x4f]=0xff; - state->m_smpc_ram[0x51]=0xff; - state->m_smpc_ram[0x53]=0xff; - state->m_smpc_ram[0x55]=0xff; - state->m_smpc_ram[0x57]=0xff; - state->m_smpc_ram[0x59]=0xff; - state->m_smpc_ram[0x5b]=0xff; - state->m_smpc_ram[0x5d]=0xff; - - // /*This is for RTC,cartridge code and similar stuff...*/ - /*System Manager(SMPC) irq*/ - { - //if(LOG_SMPC) logerror ("Interrupt: System Manager (SMPC) at scanline %04x, Vector 0x47 Level 0x08\n",scanline); - cputag_set_input_line_and_vector(space->machine(), "maincpu", 8, (stv_irq.smpc) ? HOLD_LINE : CLEAR_LINE, 0x47); - } - break; + smpc_intback(space->machine(),1,systime); + break; /* RTC write*/ case 0x16: if(LOG_SMPC) logerror("SMPC: RTC write\n"); - state->m_smpc_ram[0x2f] = state->m_smpc_ram[0x0d]; - state->m_smpc_ram[0x2d] = state->m_smpc_ram[0x0b]; - state->m_smpc_ram[0x2b] = state->m_smpc_ram[0x09]; - state->m_smpc_ram[0x29] = state->m_smpc_ram[0x07]; - state->m_smpc_ram[0x27] = state->m_smpc_ram[0x05]; - state->m_smpc_ram[0x25] = state->m_smpc_ram[0x03]; - state->m_smpc_ram[0x23] = state->m_smpc_ram[0x01]; - break; + smpc_rtc_write(space->machine()); + break; /* SMPC memory setting*/ case 0x17: if(LOG_SMPC) logerror ("SMPC: memory setting\n"); - break; + //smpc_memory_setting(space->machine()); + break; case 0x18: if(LOG_SMPC) logerror ("SMPC: NMI request\n"); - /*NMI is unconditionally requested?*/ - cputag_set_input_line(space->machine(), "maincpu", INPUT_LINE_NMI, PULSE_LINE); + smpc_nmi_req(space->machine()); break; case 0x19: - if(LOG_SMPC) logerror ("SMPC: NMI Enable\n"); - state->m_NMI_reset = 0; - state->m_smpc_ram[0x21] = (0x80) | ((state->m_NMI_reset & 1) << 6); - break; case 0x1a: - if(LOG_SMPC) logerror ("SMPC: NMI Disable\n"); - state->m_NMI_reset = 1; - state->m_smpc_ram[0x21] = (0x80) | ((state->m_NMI_reset & 1) << 6); + if(LOG_SMPC) logerror ("SMPC: NMI %sable\n",data & 1 ? "Dis" : "En"); + smpc_nmi_set(space->machine(),data & 1); break; default: printf ("cpu '%s' (PC=%08X) SMPC: undocumented Command %02x\n", space->device().tag(), cpu_get_pc(&space->device()), data); @@ -625,39 +708,6 @@ static WRITE8_HANDLER( stv_SMPC_w8 ) } } - -static void smpc_intbackhelper(running_machine &machine) -{ - saturn_state *state = machine.driver_data(); - int pad; - static const char *const padnames[] = { "JOY1", "JOY2" }; - - if (state->m_smpc.intback_stage == 1) - { - state->m_smpc.intback_stage++; - return; - } - - pad = input_port_read(machine, padnames[state->m_smpc.intback_stage-2]); - -// if (LOG_SMPC) logerror("SMPC: providing PAD data for intback, pad %d\n", intback_stage-2); - state->m_smpc_ram[33] = 0xf1; // no tap, direct connect - state->m_smpc_ram[35] = 0x02; // saturn pad - state->m_smpc_ram[37] = pad>>8; - state->m_smpc_ram[39] = pad & 0xff; - - if (state->m_smpc.intback_stage == 3) - { - state->m_smpc.smpcSR = (0x80 | state->m_smpc.pmode); // pad 2, no more data, echo back pad mode set by intback - } - else - { - state->m_smpc.smpcSR = (0xe0 | state->m_smpc.pmode); // pad 1, more data, echo back pad mode set by intback - } - - state->m_smpc.intback_stage++; -} - static READ8_HANDLER( saturn_SMPC_r8 ) { saturn_state *state = space->machine().driver_data(); @@ -772,8 +822,8 @@ static WRITE8_HANDLER( saturn_SMPC_w8 ) //enable PAD irq & VDP2 external latch for port 1/2 state->m_smpc.EXLE1 = (state->m_smpc_ram[0x7f] & 1) >> 0; state->m_smpc.EXLE2 = (state->m_smpc_ram[0x7f] & 2) >> 1; - if(state->m_smpc.EXLE1 || state->m_smpc.EXLE2) - cputag_set_input_line_and_vector(space->machine(), "maincpu", 8, (stv_irq.pad) ? HOLD_LINE : CLEAR_LINE, 0x48); + //if(state->m_smpc.EXLE1 || state->m_smpc.EXLE2) + // cputag_set_input_line_and_vector(space->machine(), "maincpu", 8, (stv_irq.pad) ? HOLD_LINE : CLEAR_LINE, 0x48); } if (offset == 0x1f) @@ -803,110 +853,40 @@ static WRITE8_HANDLER( saturn_SMPC_w8 ) smpc_system_reset(space->machine()); break; case 0x0e: - if(LOG_SMPC) logerror ("SMPC: Change Clock to 352\n"); - machine.device("maincpu")->set_unscaled_clock(MASTER_CLOCK_352/2); - machine.device("slave")->set_unscaled_clock(MASTER_CLOCK_352/2); - machine.device("audiocpu")->set_unscaled_clock(MASTER_CLOCK_352/5); - cputag_set_input_line(machine, "maincpu", INPUT_LINE_NMI, PULSE_LINE); // ff said this causes nmi, should we set a timer then nmi? - break; case 0x0f: - if(LOG_SMPC) logerror ("SMPC: Change Clock to 320\n"); - machine.device("maincpu")->set_unscaled_clock(MASTER_CLOCK_320/2); - machine.device("slave")->set_unscaled_clock(MASTER_CLOCK_320/2); - machine.device("audiocpu")->set_unscaled_clock(MASTER_CLOCK_320/5); - cputag_set_input_line(machine, "maincpu", INPUT_LINE_NMI, PULSE_LINE); // ff said this causes nmi, should we set a timer then nmi? + if(LOG_SMPC) logerror ("SMPC: Change Clock to %s\n",data & 1 ? "320" : "352"); + smpc_change_clock(space->machine(),data & 1); break; /*"Interrupt Back"*/ case 0x10: - if(LOG_SMPC) logerror ("SMPC: Status Acquire (IntBack)\n"); - state->m_smpc_ram[0x21] = (0x80) | ((state->m_NMI_reset & 1) << 6); - state->m_smpc_ram[0x23] = dec_2_bcd(systime.local_time.year / 100); - state->m_smpc_ram[0x25] = dec_2_bcd(systime.local_time.year % 100); - state->m_smpc_ram[0x27] = (systime.local_time.weekday << 4) | (systime.local_time.month + 1); - state->m_smpc_ram[0x29] = dec_2_bcd(systime.local_time.mday); - state->m_smpc_ram[0x2b] = dec_2_bcd(systime.local_time.hour); - state->m_smpc_ram[0x2d] = dec_2_bcd(systime.local_time.minute); - state->m_smpc_ram[0x2f] = dec_2_bcd(systime.local_time.second); - - state->m_smpc_ram[0x31]=0x00; //? - - - state->m_smpc_ram[0x35]=0x00; - state->m_smpc_ram[0x37]=0x00; - - state->m_smpc_ram[0x39] = state->m_smpc.SMEM[0]; - state->m_smpc_ram[0x3b] = state->m_smpc.SMEM[1]; - state->m_smpc_ram[0x3d] = state->m_smpc.SMEM[2]; - state->m_smpc_ram[0x3f] = state->m_smpc.SMEM[3]; - - state->m_smpc_ram[0x41]=0xff; - state->m_smpc_ram[0x43]=0xff; - state->m_smpc_ram[0x45]=0xff; - state->m_smpc_ram[0x47]=0xff; - state->m_smpc_ram[0x49]=0xff; - state->m_smpc_ram[0x4b]=0xff; - state->m_smpc_ram[0x4d]=0xff; - state->m_smpc_ram[0x4f]=0xff; - state->m_smpc_ram[0x51]=0xff; - state->m_smpc_ram[0x53]=0xff; - state->m_smpc_ram[0x55]=0xff; - state->m_smpc_ram[0x57]=0xff; - state->m_smpc_ram[0x59]=0xff; - state->m_smpc_ram[0x5b]=0xff; - state->m_smpc_ram[0x5d]=0xff; - - state->m_smpc.smpcSR = 0x60; // peripheral data ready, no reset, etc. - state->m_smpc.pmode = state->m_smpc_ram[1]>>4; - - state->m_smpc.intback_stage = 1; - - // /*This is for RTC,cartridge code and similar stuff...*/ - { -// if(LOG_SMPC) logerror ("Interrupt: System Manager (SMPC) at scanline %04x, Vector 0x47 Level 0x08\n",scanline); - smpc_intbackhelper(machine); - cputag_set_input_line_and_vector(space->machine(), "maincpu", 8, (stv_irq.smpc) ? HOLD_LINE : CLEAR_LINE, 0x47); - } - break; + if(LOG_SMPC) logerror ("SMPC: Status Acquire (IntBack)\n"); + smpc_intback(space->machine(),0,systime); + break; /* RTC write*/ case 0x16: if(LOG_SMPC) logerror("SMPC: RTC write\n"); - state->m_smpc_ram[0x2f] = state->m_smpc_ram[0x0d]; - state->m_smpc_ram[0x2d] = state->m_smpc_ram[0x0b]; - state->m_smpc_ram[0x2b] = state->m_smpc_ram[0x09]; - state->m_smpc_ram[0x29] = state->m_smpc_ram[0x07]; - state->m_smpc_ram[0x27] = state->m_smpc_ram[0x05]; - state->m_smpc_ram[0x25] = state->m_smpc_ram[0x03]; - state->m_smpc_ram[0x23] = state->m_smpc_ram[0x01]; - break; + smpc_rtc_write(space->machine()); + break; /* SMPC memory setting*/ case 0x17: if(LOG_SMPC) logerror ("SMPC: memory setting\n"); - state->m_smpc.SMEM[0] = state->m_smpc_ram[1]; - state->m_smpc.SMEM[1] = state->m_smpc_ram[3]; - state->m_smpc.SMEM[2] = state->m_smpc_ram[5]; - state->m_smpc.SMEM[3] = state->m_smpc_ram[7]; - break; + smpc_memory_setting(space->machine()); + break; case 0x18: if(LOG_SMPC) logerror ("SMPC: NMI request\n"); - /*NMI is unconditionally requested?*/ - cputag_set_input_line(machine, "maincpu", INPUT_LINE_NMI, PULSE_LINE); + smpc_nmi_req(space->machine()); break; case 0x19: - if(LOG_SMPC) logerror ("SMPC: NMI Enable\n"); - state->m_NMI_reset = 0; - state->m_smpc_ram[0x21] = (0x80) | ((state->m_NMI_reset & 1) << 6); - break; case 0x1a: - if(LOG_SMPC) logerror ("SMPC: NMI Disable\n"); - state->m_NMI_reset = 1; - state->m_smpc_ram[0x21] = (0x80) | ((state->m_NMI_reset & 1) << 6); + if(LOG_SMPC) logerror ("SMPC: NMI %sable\n",data & 1 ? "Dis" : "En"); + smpc_nmi_set(space->machine(),data & 1); break; default: printf ("cpu %s (PC=%08X) SMPC: undocumented Command %02x\n", space->device().tag(), cpu_get_pc(&space->device()), data); } // we've processed the command, clear status flag - state->m_smpc_ram[0x5f] = data; //read-back command + state->m_smpc_ram[0x5f] = data; //read-back for last command issued state->m_smpc_ram[0x63] = 0x00; /*TODO:emulate the timing of each command...*/ }