@@ -123,6 +123,7 @@ class specnext_state : public spectrum_128_state
123
123
void mmu_x2_w (offs_t bank, u8 data);
124
124
u8 dma_r (bool dma_mode);
125
125
void dma_w (bool dma_mode, u8 data);
126
+ u8 dma_mreq_r (offs_t offset);
126
127
u8 spi_data_r ();
127
128
void spi_data_w (u8 data);
128
129
void spi_miso_w (u8 data);
@@ -1155,6 +1156,15 @@ void specnext_state::dma_w(bool dma_mode, u8 data)
1155
1156
m_dma->write (data);
1156
1157
}
1157
1158
1159
+ u8 specnext_state::dma_mreq_r (offs_t offset)
1160
+ {
1161
+ if (m_nr_07_cpu_speed == 0b11 )
1162
+ {
1163
+ m_dma->adjust_wait (1 );
1164
+ }
1165
+ return m_program.read_byte (offset);
1166
+ }
1167
+
1158
1168
u8 specnext_state::reg_r (offs_t nr_register)
1159
1169
{
1160
1170
u8 port_253b_dat;
@@ -2405,6 +2415,12 @@ void specnext_state::map_fetch(address_map &map)
2405
2415
approach gives better experience in debugger UI. */
2406
2416
do_m1 (offset);
2407
2417
m_divmmc_delayed_check = 0 ;
2418
+
2419
+ // do_m1 performs read from m_program with waits, we need to take it back
2420
+ if (!machine ().side_effects_disabled () && (m_nr_07_cpu_speed == 0b11 ))
2421
+ {
2422
+ m_maincpu->adjust_icount (1 );
2423
+ }
2408
2424
}
2409
2425
2410
2426
return m_program.read_byte (offset);
@@ -3428,6 +3444,14 @@ void specnext_state::video_start()
3428
3444
to[offset & 0x1fff ] = data;
3429
3445
}
3430
3446
});
3447
+ prg.install_read_tap (0x0000 , 0xffff , " mem_wait_r" , [this ](offs_t offset, u8 &data, u8 mem_mask)
3448
+ {
3449
+ // The 28MHz with core 3.0.5 is adding extra wait state to every instruction opcode fetch and memory read
3450
+ if (!machine ().side_effects_disabled () && (m_nr_07_cpu_speed == 0b11 ))
3451
+ {
3452
+ m_maincpu->adjust_icount (-1 );
3453
+ }
3454
+ });
3431
3455
}
3432
3456
3433
3457
void specnext_state::tbblue (machine_config &config)
@@ -3456,7 +3480,7 @@ void specnext_state::tbblue(machine_config &config)
3456
3480
SPECNEXT_DMA (config, m_dma, 28_MHz_XTAL / 8 );
3457
3481
m_dma->out_busreq_callback ().set_inputline (m_maincpu, Z80_INPUT_LINE_BUSRQ);
3458
3482
m_dma->out_int_callback ().set_inputline (m_maincpu, INPUT_LINE_IRQ0);
3459
- m_dma->in_mreq_callback ().set ([ this ]( offs_t offset) { return m_program. read_byte (offset); } );
3483
+ m_dma->in_mreq_callback ().set (FUNC (specnext_state::dma_mreq_r) );
3460
3484
m_dma->out_mreq_callback ().set ([this ](offs_t offset, u8 data) { m_program.write_byte (offset, data); });
3461
3485
m_dma->in_iorq_callback ().set ([this ](offs_t offset) { return m_io.read_byte (offset); });
3462
3486
m_dma->out_iorq_callback ().set ([this ](offs_t offset, u8 data) { m_io.write_byte (offset, data); });
0 commit comments