mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
-vsmile: Turn the 'test point' GPIO port C bit off. Fixes choppy sprites. Promoted vsmile, vsmilef, vsmileg back to working. [Ryan Holtz]
-spg2xx: Various changes: [Ryan Holtz] * Fixed Timer A and B counting at half the intended rate. * Made do_sprite_dma write into m_spriteram shared pointer rather than hitting the memory system twice. * Fixed vblank to automatically clear the IRQ on vblank-out. * Made IRQ checking more consistent; no more redundant deassertions of various IRQ lines. * Fixed TMB1 and TMB2 not activating if initialized to the lowest rate. * Improved logging.
This commit is contained in:
parent
88baed6b7d
commit
53bf06db84
@ -171,7 +171,6 @@ image_init_result vsmile_cart_slot_device::call_load()
|
||||
|
||||
if (m_cart->get_nvram_size())
|
||||
{
|
||||
printf("nvram_size 1\n");
|
||||
battery_load(m_cart->get_nvram_base(), m_cart->get_nvram_size(), 0x00);
|
||||
}
|
||||
|
||||
@ -188,8 +187,6 @@ image_init_result vsmile_cart_slot_device::call_load()
|
||||
|
||||
void vsmile_cart_slot_device::call_unload()
|
||||
{
|
||||
if (m_cart)
|
||||
printf("nvram_size: %d\n", m_cart->get_nvram_size());
|
||||
if (m_cart && m_cart->get_nvram_size())
|
||||
{
|
||||
battery_save(m_cart->get_nvram_base(), m_cart->get_nvram_size());
|
||||
|
@ -150,11 +150,8 @@ void spg2xx_device::device_start()
|
||||
m_4khz_timer = timer_alloc(TIMER_4KHZ);
|
||||
m_4khz_timer->adjust(attotime::never);
|
||||
|
||||
m_timer_src_a = timer_alloc(TIMER_SRC_A);
|
||||
m_timer_src_a->adjust(attotime::never);
|
||||
|
||||
m_timer_src_b = timer_alloc(TIMER_SRC_B);
|
||||
m_timer_src_b->adjust(attotime::never);
|
||||
m_timer_src_ab = timer_alloc(TIMER_SRC_AB);
|
||||
m_timer_src_ab->adjust(attotime::never);
|
||||
|
||||
m_timer_src_c = timer_alloc(TIMER_SRC_C);
|
||||
m_timer_src_c->adjust(attotime::never);
|
||||
@ -165,10 +162,8 @@ void spg2xx_device::device_start()
|
||||
|
||||
save_item(NAME(m_timer_a_preload));
|
||||
save_item(NAME(m_timer_b_preload));
|
||||
|
||||
save_item(NAME(m_timer_a_state));
|
||||
save_item(NAME(m_timer_b_state));
|
||||
save_item(NAME(m_timer_c_state));
|
||||
save_item(NAME(m_timer_b_divisor));
|
||||
save_item(NAME(m_timer_b_tick_rate));
|
||||
|
||||
save_item(NAME(m_hide_page0));
|
||||
save_item(NAME(m_hide_page1));
|
||||
@ -236,10 +231,8 @@ void spg2xx_device::device_reset()
|
||||
|
||||
m_timer_a_preload = 0;
|
||||
m_timer_b_preload = 0;
|
||||
|
||||
m_timer_a_state = 0;
|
||||
m_timer_b_state = 0;
|
||||
m_timer_c_state = 0;
|
||||
m_timer_b_divisor = 0;
|
||||
m_timer_b_tick_rate = 0;
|
||||
|
||||
m_io_regs[0x23] = 0x0028;
|
||||
m_uart_rx_available = false;
|
||||
@ -262,7 +255,7 @@ void spg2xx_device::device_reset()
|
||||
m_hide_sprites = false;
|
||||
m_debug_sprites = false;
|
||||
m_debug_blit = false;
|
||||
m_sprite_index_to_debug = 0;
|
||||
m_sprite_index_to_debug = 44;
|
||||
|
||||
m_debug_samples = false;
|
||||
m_debug_rates = false;
|
||||
@ -705,11 +698,11 @@ void spg2xx_device::do_sprite_dma(uint32_t len)
|
||||
address_space &mem = m_cpu->space(AS_PROGRAM);
|
||||
|
||||
uint32_t src = m_video_regs[0x70] & 0x3fff;
|
||||
uint32_t dst = (m_video_regs[0x71] & 0x3ff) + 0x2c00;
|
||||
uint32_t dst = m_video_regs[0x71];
|
||||
|
||||
for (uint32_t j = 0; j < len; j++)
|
||||
{
|
||||
mem.write_word(dst + j, mem.read_word(src + j));
|
||||
m_spriteram[(dst + j) & 0x3ff] = mem.read_word(src + j);
|
||||
}
|
||||
|
||||
m_video_regs[0x72] = 0;
|
||||
@ -931,7 +924,12 @@ WRITE16_MEMBER(spg2xx_device::video_w)
|
||||
WRITE_LINE_MEMBER(spg2xx_device::vblank)
|
||||
{
|
||||
if (!state)
|
||||
{
|
||||
VIDEO_IRQ_STATUS &= ~1;
|
||||
LOGMASKED(LOG_IRQS, "Setting video IRQ status to %04x\n", VIDEO_IRQ_STATUS);
|
||||
check_video_irq();
|
||||
return;
|
||||
}
|
||||
|
||||
#if SPG_DEBUG_VIDEO
|
||||
if (machine().input().code_pressed_once(KEYCODE_5))
|
||||
@ -977,6 +975,7 @@ WRITE_LINE_MEMBER(spg2xx_device::vblank)
|
||||
|
||||
void spg2xx_device::check_video_irq()
|
||||
{
|
||||
LOGMASKED(LOG_IRQS, "%ssserting IRQ0 (%04x, %04x)\n", (VIDEO_IRQ_STATUS & VIDEO_IRQ_ENABLE) ? "A" : "Dea", VIDEO_IRQ_STATUS, VIDEO_IRQ_ENABLE);
|
||||
m_cpu->set_state_unsynced(UNSP_IRQ0_LINE, (VIDEO_IRQ_STATUS & VIDEO_IRQ_ENABLE) ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
@ -1053,11 +1052,16 @@ READ16_MEMBER(spg2xx_device::io_r)
|
||||
break;
|
||||
|
||||
case 0x27: // ADC Data
|
||||
{
|
||||
m_io_regs[0x27] = 0;
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS &= ~0x2000;
|
||||
check_irqs(0x2000);
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
check_irqs(changed);
|
||||
LOGMASKED(LOG_IO_READS, "%s: io_r: ADC Data = %04x\n", machine().describe_context(), val);
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x29: // Wakeup Source
|
||||
LOGMASKED(LOG_IO_READS, "io_r: Wakeup Source = %04x\n", val);
|
||||
@ -1220,10 +1224,10 @@ void spg2xx_device::update_timer_b_rate()
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
m_timer_src_c->adjust(attotime::never);
|
||||
m_timer_c_state = 0;
|
||||
break;
|
||||
case 2:
|
||||
m_timer_src_c->adjust(attotime::from_hz(32768), 0, attotime::from_hz(32768));
|
||||
@ -1234,27 +1238,18 @@ void spg2xx_device::update_timer_b_rate()
|
||||
case 4:
|
||||
m_timer_src_c->adjust(attotime::from_hz(4096), 0, attotime::from_hz(4096));
|
||||
break;
|
||||
case 5:
|
||||
m_timer_src_c->adjust(attotime::never);
|
||||
m_timer_c_state = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void spg2xx_device::update_timer_a_src()
|
||||
void spg2xx_device::update_timer_ab_src()
|
||||
{
|
||||
m_timer_a_state ^= 1;
|
||||
if (m_timer_a_state && m_timer_b_state)
|
||||
{
|
||||
increment_timer_a();
|
||||
}
|
||||
}
|
||||
if (m_timer_b_tick_rate == 0)
|
||||
return;
|
||||
|
||||
void spg2xx_device::update_timer_b_src()
|
||||
{
|
||||
m_timer_b_state ^= 1;
|
||||
if (m_timer_a_state && m_timer_b_state)
|
||||
m_timer_b_divisor++;
|
||||
if (m_timer_b_divisor >= m_timer_b_tick_rate)
|
||||
{
|
||||
m_timer_b_divisor = 0;
|
||||
increment_timer_a();
|
||||
}
|
||||
}
|
||||
@ -1267,24 +1262,28 @@ void spg2xx_device::increment_timer_a()
|
||||
m_io_regs[0x12] = m_timer_a_preload;
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS |= 0x0800;
|
||||
if (IO_IRQ_STATUS != old)
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
{
|
||||
//printf("Timer A overflow\n");
|
||||
check_irqs(0x0800);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void spg2xx_device::update_timer_c_src()
|
||||
{
|
||||
m_timer_c_state ^= 1;
|
||||
if (m_timer_c_state)
|
||||
m_io_regs[0x16]++;
|
||||
if (m_io_regs[0x16] == 0)
|
||||
{
|
||||
m_io_regs[0x16]++;
|
||||
if (m_io_regs[0x16] == 0)
|
||||
m_io_regs[0x16] = m_timer_b_preload;
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS |= 0x0400;
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
{
|
||||
m_io_regs[0x16] = m_timer_b_preload;
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS |= 0x0400;
|
||||
if (IO_IRQ_STATUS != old)
|
||||
check_irqs(0x0400);
|
||||
printf("Timer B overflow\n");
|
||||
check_irqs(0x0400);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1387,23 +1386,12 @@ WRITE16_MEMBER(spg2xx_device::io_w)
|
||||
};
|
||||
LOGMASKED(LOG_TIMERS, "io_w: Timebase Control = %04x (Source:%s, TMB2:%s, TMB1:%s)\n", data,
|
||||
BIT(data, 4) ? "27MHz" : "32768Hz", s_tmb2_sel[BIT(data, 4)][(data >> 2) & 3], s_tmb1_sel[BIT(data, 4)][data & 3]);
|
||||
const uint16_t old = m_io_regs[offset];
|
||||
m_io_regs[offset] = data;
|
||||
const uint16_t changed = old ^ m_io_regs[offset];
|
||||
if (changed & 0x001f)
|
||||
{
|
||||
const uint8_t hifreq = BIT(data, 4);
|
||||
if (changed & 0x0013)
|
||||
{
|
||||
const uint32_t freq = s_tmb1_freq[hifreq][data & 3];
|
||||
m_tmb1->adjust(attotime::from_hz(freq), 0, attotime::from_hz(freq));
|
||||
}
|
||||
if (changed & 0x001c)
|
||||
{
|
||||
const uint32_t freq = s_tmb2_freq[hifreq][(data >> 2) & 3];
|
||||
m_tmb2->adjust(attotime::from_hz(freq), 0, attotime::from_hz(freq));
|
||||
}
|
||||
}
|
||||
const uint8_t hifreq = BIT(data, 4);
|
||||
const uint32_t tmb1freq = s_tmb1_freq[hifreq][data & 3];
|
||||
m_tmb1->adjust(attotime::from_hz(tmb1freq), 0, attotime::from_hz(tmb1freq));
|
||||
const uint32_t tmb2freq = s_tmb2_freq[hifreq][(data >> 2) & 3];
|
||||
m_tmb2->adjust(attotime::from_hz(tmb2freq), 0, attotime::from_hz(tmb2freq));
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1424,55 +1412,54 @@ WRITE16_MEMBER(spg2xx_device::io_w)
|
||||
LOGMASKED(LOG_TIMERS, "io_w: Timer A Control = %04x (Source A:%s, Source B:%s)\n", data,
|
||||
s_source_a[data & 7], s_source_b[(data >> 3) & 7]);
|
||||
m_io_regs[offset] = data;
|
||||
int timer_a_rate = 0;
|
||||
switch (data & 7)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
m_timer_src_a->adjust(attotime::never);
|
||||
m_timer_a_state = 0;
|
||||
m_timer_src_ab->adjust(attotime::never);
|
||||
break;
|
||||
case 2:
|
||||
m_timer_src_a->adjust(attotime::from_hz(32768), 0, attotime::from_hz(32768));
|
||||
m_timer_src_ab->adjust(attotime::from_hz(32768), 0, attotime::from_hz(32768));
|
||||
timer_a_rate = 32768;
|
||||
break;
|
||||
case 3:
|
||||
m_timer_src_a->adjust(attotime::from_hz(8192), 0, attotime::from_hz(8192));
|
||||
m_timer_src_ab->adjust(attotime::from_hz(8192), 0, attotime::from_hz(8192));
|
||||
timer_a_rate = 8192;
|
||||
break;
|
||||
case 4:
|
||||
m_timer_src_a->adjust(attotime::from_hz(4096), 0, attotime::from_hz(4096));
|
||||
break;
|
||||
case 5:
|
||||
m_timer_src_a->adjust(attotime::never);
|
||||
m_timer_a_state = 1;
|
||||
m_timer_src_ab->adjust(attotime::from_hz(4096), 0, attotime::from_hz(4096));
|
||||
timer_a_rate = 4096;
|
||||
break;
|
||||
}
|
||||
switch ((data >> 3) & 7)
|
||||
{
|
||||
case 0:
|
||||
m_timer_src_b->adjust(attotime::from_hz(2048), 0, attotime::from_hz(2048));
|
||||
m_timer_b_tick_rate = timer_a_rate / 2048;
|
||||
break;
|
||||
case 1:
|
||||
m_timer_src_b->adjust(attotime::from_hz(1024), 0, attotime::from_hz(1024));
|
||||
m_timer_b_tick_rate = timer_a_rate / 1024;
|
||||
break;
|
||||
case 2:
|
||||
m_timer_src_b->adjust(attotime::from_hz(256), 0, attotime::from_hz(256));
|
||||
m_timer_b_tick_rate = timer_a_rate / 256;
|
||||
break;
|
||||
case 3:
|
||||
m_timer_src_b->adjust(attotime::never);
|
||||
m_timer_b_tick_rate = 0;
|
||||
break;
|
||||
case 4:
|
||||
m_timer_src_b->adjust(attotime::from_hz(4), 0, attotime::from_hz(4));
|
||||
m_timer_b_tick_rate = timer_a_rate / 4;
|
||||
break;
|
||||
case 5:
|
||||
m_timer_src_b->adjust(attotime::from_hz(2), 0, attotime::from_hz(2));
|
||||
m_timer_b_tick_rate = timer_a_rate / 2;
|
||||
break;
|
||||
case 6:
|
||||
m_timer_src_b->adjust(attotime::never);
|
||||
m_timer_b_state = 1;
|
||||
m_timer_b_tick_rate = 1;
|
||||
break;
|
||||
case 7:
|
||||
m_timer_src_b->adjust(attotime::never);
|
||||
m_timer_b_tick_rate = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@ -1483,7 +1470,8 @@ WRITE16_MEMBER(spg2xx_device::io_w)
|
||||
LOGMASKED(LOG_TIMERS, "io_w: Timer A IRQ Clear\n");
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS &= ~0x0800;
|
||||
if (IO_IRQ_STATUS != old)
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
check_irqs(0x0800);
|
||||
break;
|
||||
}
|
||||
@ -1526,7 +1514,8 @@ WRITE16_MEMBER(spg2xx_device::io_w)
|
||||
LOGMASKED(LOG_TIMERS, "io_w: Timer B IRQ Clear\n");
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS &= ~0x0400;
|
||||
if (IO_IRQ_STATUS != old)
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
check_irqs(0x0400);
|
||||
break;
|
||||
}
|
||||
@ -1546,10 +1535,10 @@ WRITE16_MEMBER(spg2xx_device::io_w)
|
||||
|
||||
case 0x21: // IRQ Enable
|
||||
{
|
||||
LOGMASKED(LOG_UART, "io_w: IRQ Enable = %04x\n", data);
|
||||
const uint16_t old = IO_IRQ_ENABLE & IO_IRQ_STATUS;
|
||||
LOGMASKED(LOG_IRQS, "io_w: IRQ Enable = %04x\n", data);
|
||||
const uint16_t old = IO_IRQ_ENABLE;
|
||||
m_io_regs[offset] = data;
|
||||
const uint16_t changed = old ^ (IO_IRQ_ENABLE & IO_IRQ_STATUS);
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
check_irqs(changed);
|
||||
break;
|
||||
@ -1560,7 +1549,7 @@ WRITE16_MEMBER(spg2xx_device::io_w)
|
||||
LOGMASKED(LOG_IRQS, "io_w: IRQ Acknowledge = %04x\n", data);
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS &= ~data;
|
||||
const uint16_t changed = old ^ (IO_IRQ_ENABLE & IO_IRQ_STATUS);
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
check_irqs(changed);
|
||||
break;
|
||||
@ -1613,7 +1602,7 @@ WRITE16_MEMBER(spg2xx_device::io_w)
|
||||
m_io_regs[0x27] = 0x8000 | (m_adc_in() & 0x7fff);
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS |= 0x2000;
|
||||
const uint16_t changed = IO_IRQ_STATUS ^ old;
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
{
|
||||
check_irqs(changed);
|
||||
@ -1712,7 +1701,8 @@ WRITE16_MEMBER(spg2xx_device::io_w)
|
||||
{
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS &= ~0x0100;
|
||||
if (IO_IRQ_STATUS != old)
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
check_irqs(0x0100);
|
||||
}
|
||||
break;
|
||||
@ -1862,7 +1852,8 @@ void spg2xx_device::device_timer(emu_timer &timer, device_timer_id id, int param
|
||||
LOGMASKED(LOG_TIMERS, "TMB1 elapsed, setting IRQ Status bit 0 (old:%04x, new:%04x, enable:%04x)\n", IO_IRQ_STATUS, IO_IRQ_STATUS | 1, IO_IRQ_ENABLE);
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS |= 1;
|
||||
if (old ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE))
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
check_irqs(0x0001);
|
||||
break;
|
||||
}
|
||||
@ -1872,7 +1863,8 @@ void spg2xx_device::device_timer(emu_timer &timer, device_timer_id id, int param
|
||||
LOGMASKED(LOG_TIMERS, "TMB2 elapsed, setting IRQ Status bit 1 (old:%04x, new:%04x, enable:%04x)\n", IO_IRQ_STATUS, IO_IRQ_STATUS | 2, IO_IRQ_ENABLE);
|
||||
const uint16_t old = IO_IRQ_STATUS;
|
||||
IO_IRQ_STATUS |= 2;
|
||||
if (old ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE))
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
check_irqs(0x0002);
|
||||
break;
|
||||
}
|
||||
@ -1904,12 +1896,8 @@ void spg2xx_device::device_timer(emu_timer &timer, device_timer_id id, int param
|
||||
system_timer_tick();
|
||||
break;
|
||||
|
||||
case TIMER_SRC_A:
|
||||
update_timer_a_src();
|
||||
break;
|
||||
|
||||
case TIMER_SRC_B:
|
||||
update_timer_b_src();
|
||||
case TIMER_SRC_AB:
|
||||
update_timer_ab_src();
|
||||
break;
|
||||
|
||||
case TIMER_SRC_C:
|
||||
@ -1948,7 +1936,8 @@ void spg2xx_device::system_timer_tick()
|
||||
}
|
||||
}
|
||||
|
||||
if (old ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE))
|
||||
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
|
||||
if (changed)
|
||||
check_irqs(check_mask);
|
||||
}
|
||||
|
||||
@ -2017,13 +2006,13 @@ void spg2xx_device::check_irqs(const uint16_t changed)
|
||||
|
||||
if (changed & 0x0c00) // Timer A, Timer B IRQ
|
||||
{
|
||||
LOGMASKED(LOG_TIMERS, "%ssserting IRQ2 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00));
|
||||
LOGMASKED(LOG_TIMERS, "%ssserting IRQ2 (%04x, %04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00), changed);
|
||||
m_cpu->set_state_unsynced(UNSP_IRQ2_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00) ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
if (changed & 0x2100) // UART, ADC IRQ
|
||||
{
|
||||
LOGMASKED(LOG_UART, "%ssserting IRQ3 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x2100) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x2100));
|
||||
LOGMASKED(LOG_UART, "%ssserting IRQ3 (%04x, %04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x2100) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x2100), changed);
|
||||
m_cpu->set_state_unsynced(UNSP_IRQ3_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x2100) ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
@ -2043,19 +2032,19 @@ void spg2xx_device::check_irqs(const uint16_t changed)
|
||||
|
||||
if (changed & 0x1200) // External IRQ
|
||||
{
|
||||
LOGMASKED(LOG_UART, "%ssserting IRQ5 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x1200) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x1200));
|
||||
LOGMASKED(LOG_UART, "%ssserting IRQ5 (%04x, %04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x1200) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x1200), changed);
|
||||
m_cpu->set_state_unsynced(UNSP_IRQ5_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x1200) ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
if (changed & 0x0070) // 1024Hz, 2048Hz, 4096Hz IRQ
|
||||
{
|
||||
LOGMASKED(LOG_TIMERS, "%ssserting IRQ6 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070));
|
||||
LOGMASKED(LOG_TIMERS, "%ssserting IRQ6 (%04x, %04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070), changed);
|
||||
m_cpu->set_state_unsynced(UNSP_IRQ6_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070) ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
if (changed & 0x008b) // TMB1, TMB2, 4Hz, key change IRQ
|
||||
{
|
||||
LOGMASKED(LOG_IRQS, "%ssserting IRQ7 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b));
|
||||
LOGMASKED(LOG_IRQS, "%ssserting IRQ7 (%04x, %04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b), changed);
|
||||
m_cpu->set_state_unsynced(UNSP_IRQ7_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
}
|
||||
|
@ -396,9 +396,8 @@ protected:
|
||||
static const device_timer_id TIMER_UART_TX = 4;
|
||||
static const device_timer_id TIMER_UART_RX = 5;
|
||||
static const device_timer_id TIMER_4KHZ = 6;
|
||||
static const device_timer_id TIMER_SRC_A = 7;
|
||||
static const device_timer_id TIMER_SRC_B = 8;
|
||||
static const device_timer_id TIMER_SRC_C = 9;
|
||||
static const device_timer_id TIMER_SRC_AB = 7;
|
||||
static const device_timer_id TIMER_SRC_C = 8;
|
||||
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
@ -410,8 +409,7 @@ protected:
|
||||
uint16_t do_special_gpio(uint32_t index, uint16_t mask);
|
||||
|
||||
void update_timer_b_rate();
|
||||
void update_timer_a_src();
|
||||
void update_timer_b_src();
|
||||
void update_timer_ab_src();
|
||||
void update_timer_c_src();
|
||||
void increment_timer_a();
|
||||
|
||||
@ -518,15 +516,12 @@ protected:
|
||||
|
||||
uint16_t m_timer_a_preload;
|
||||
uint16_t m_timer_b_preload;
|
||||
|
||||
int m_timer_a_state;
|
||||
int m_timer_b_state;
|
||||
int m_timer_c_state;
|
||||
uint16_t m_timer_b_divisor;
|
||||
uint16_t m_timer_b_tick_rate;
|
||||
|
||||
emu_timer *m_tmb1;
|
||||
emu_timer *m_tmb2;
|
||||
emu_timer *m_timer_src_a;
|
||||
emu_timer *m_timer_src_b;
|
||||
emu_timer *m_timer_src_ab;
|
||||
emu_timer *m_timer_src_c;
|
||||
emu_timer *m_screenpos_timer;
|
||||
emu_timer *m_audio_beat;
|
||||
|
@ -315,7 +315,7 @@ READ16_MEMBER(vsmile_state::portc_r)
|
||||
uint16_t data = m_dsw_region->read();
|
||||
data |= m_ctrl_rts[0] ? 0 : 0x0400;
|
||||
data |= m_ctrl_rts[1] ? 0 : 0x1000;
|
||||
data |= 0x2000;
|
||||
data |= 0x2020;
|
||||
//data = machine().rand() & 0xffff;
|
||||
return data;
|
||||
}
|
||||
@ -665,7 +665,7 @@ ROM_START( vsmileb )
|
||||
ROM_END
|
||||
|
||||
// year, name, parent, compat, machine, input, class, init, company, fullname, flags
|
||||
CONS( 2005, vsmile, 0, 0, vsmile, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (US)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||
CONS( 2005, vsmileg, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (Germany)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||
CONS( 2005, vsmilef, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (France)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||
CONS( 2005, vsmile, 0, 0, vsmile, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||
CONS( 2005, vsmileg, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (Germany)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||
CONS( 2005, vsmilef, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||
CONS( 2005, vsmileb, 0, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (US)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||
|
Loading…
Reference in New Issue
Block a user