model2: wait state when writing to copro TGP input FIFO; also adjust TGP frequencies on Model 1/2 (#13543)

* model2: wait state when writing to copro TGP FIFO

The Manx TT course select rotation bug was caused by the i960 running too far ahead of the TGP and overwriting 0x918000 before the TGP got a chance to read it; adding a wait state when writing to the input FIFO prevents this

Also increase clock speed of TGP to 16.666 MHz (50 MHz / 3)

* model1: change TGP frequency to 13.333 MHz (40 MHz / 3)

* model2: remove issue that no longer occurs since TGP rewrite
This commit is contained in:
Matthew Daniels 2025-04-01 10:30:40 +01:00 committed by GitHub
parent 7efe37938f
commit 0197c170bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 11 deletions

View File

@ -1711,7 +1711,7 @@ ROM_END
void model1_state::model1(machine_config &config)
{
V60(config, m_maincpu, 16000000);
V60(config, m_maincpu, 32_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &model1_state::model1_mem);
m_maincpu->set_addrmap(AS_IO, &model1_state::model1_io);
m_maincpu->set_irq_acknowledge_callback(FUNC(model1_state::irq_callback));
@ -1723,7 +1723,7 @@ void model1_state::model1(machine_config &config)
TIMER(config, "scantimer").configure_scanline(FUNC(model1_state::model1_interrupt), "screen", 0, 1);
MB86233(config, m_tgp_copro, 16000000);
MB86233(config, m_tgp_copro, 40_MHz_XTAL / 3);
m_tgp_copro->set_addrmap(AS_PROGRAM, &model1_state::copro_prog_map);
m_tgp_copro->set_addrmap(AS_DATA, &model1_state::copro_data_map);
m_tgp_copro->set_addrmap(AS_IO, &model1_state::copro_io_map);

View File

@ -30,9 +30,6 @@
(compute_fmul_avg, shift operation 0x11, ALU operation 0x89 (compute_favg));
- manxtt: no escape from "active motion slider" tutorial (needs analog inputs),
bypass it by entering then exiting service mode;
- manxtt: no bikes are visible (not a z-sort issue!);
- manxtt: course select island map doesn't rotate properly:
timing issue, i960 sends read/write geo addresses to bufferram 0x918000/4 which TGP never reads in time.
- sgt24h: first turn in easy reverse course has ugly rendered mountain in background;
- skytargt: really slow during gameplay (fixed?);
- skytargt: short draw distance (might be down to z-sort);
@ -610,6 +607,9 @@ void model2_tgp_state::copro_fifo_w(u32 data)
}
else
m_copro_fifo_in->push(u32(data));
// 1 wait state for i960; prevents Manx TT course select rotation bug
m_maincpu->spin_until_time(attotime::from_nsec(40));
}
@ -2509,12 +2509,12 @@ void model2_state::model2_scsp(machine_config &config)
/* original Model 2 */
void model2o_state::model2o(machine_config &config)
{
I960(config, m_maincpu, 25000000);
I960(config, m_maincpu, 50_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &model2o_state::model2o_mem);
TIMER(config, "scantimer").configure_scanline(FUNC(model2_state::model2_interrupt), "screen", 0, 1);
MB86234(config, m_copro_tgp, 16000000);
MB86234(config, m_copro_tgp, 50_MHz_XTAL / 3);
m_copro_tgp->set_addrmap(AS_PROGRAM, &model2o_state::copro_tgp_prog_map);
m_copro_tgp->set_addrmap(AS_DATA, &model2o_state::copro_tgp_data_map);
m_copro_tgp->set_addrmap(AS_IO, &model2o_state::copro_tgp_io_map);
@ -2660,11 +2660,11 @@ void model2o_state::vcop(machine_config &config)
/* 2A-CRX */
void model2a_state::model2a(machine_config &config)
{
I960(config, m_maincpu, 25000000);
I960(config, m_maincpu, 50_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &model2a_state::model2a_crx_mem);
TIMER(config, "scantimer").configure_scanline(FUNC(model2_state::model2_interrupt), "screen", 0, 1);
MB86234(config, m_copro_tgp, 16000000);
MB86234(config, m_copro_tgp, 50_MHz_XTAL / 3);
m_copro_tgp->set_addrmap(AS_PROGRAM, &model2a_state::copro_tgp_prog_map);
m_copro_tgp->set_addrmap(AS_DATA, &model2a_state::copro_tgp_data_map);
m_copro_tgp->set_addrmap(AS_IO, &model2a_state::copro_tgp_io_map);
@ -2780,7 +2780,7 @@ void model2a_state::zeroguna(machine_config &config)
/* 2B-CRX */
void model2b_state::model2b(machine_config &config)
{
I960(config, m_maincpu, 25000000);
I960(config, m_maincpu, 50_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &model2b_state::model2b_crx_mem);
TIMER(config, "scantimer", 0).configure_scanline(FUNC(model2_state::model2_interrupt), "screen", 0, 1);
@ -2935,7 +2935,7 @@ void model2b_state::zerogun(machine_config &config)
/* 2C-CRX */
void model2c_state::model2c(machine_config &config)
{
I960(config, m_maincpu, 25000000);
I960(config, m_maincpu, 50_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &model2c_state::model2c_crx_mem);
TIMER(config, "scantimer").configure_scanline(FUNC(model2c_state::model2c_interrupt), "screen", 0, 1);