Skip to content

Commit 8fdc840

Browse files
author
tpaxia
committed
olivetti/m20: handle segment trap in driver
1 parent abf8b23 commit 8fdc840

4 files changed

Lines changed: 20 additions & 10 deletions

File tree

src/devices/bus/zbi/s8k_cpu.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,6 @@ void zbi_s8k_cpu10_card_device::centronics_ack_w(uint8_t data)
656656
void zbi_s8k_cpu10_card_device::device_add_mconfig(machine_config &config)
657657
{
658658
Z8001(config, m_maincpu, CLK_CPU);
659-
m_maincpu->set_m20_hack(false);
660659
m_maincpu->set_addrmap(AS_PROGRAM, &zbi_s8k_cpu10_card_device::addrmap_program);
661660
m_maincpu->set_addrmap(AS_DATA, &zbi_s8k_cpu10_card_device::addrmap_data);
662661
m_maincpu->set_addrmap(z8001_device::AS_STACK, &zbi_s8k_cpu10_card_device::addrmap_stack);
@@ -1228,7 +1227,6 @@ void zbi_s8k_hpcpu_card_device::device_resolve_objects()
12281227
void zbi_s8k_hpcpu_card_device::device_add_mconfig(machine_config &config)
12291228
{
12301229
Z8001(config, m_maincpu, CLK_HPCPU);
1231-
m_maincpu->set_m20_hack(false);
12321230
m_maincpu->set_addrmap(AS_PROGRAM, &zbi_s8k_hpcpu_card_device::addrmap_program);
12331231
m_maincpu->set_addrmap(AS_DATA, &zbi_s8k_hpcpu_card_device::addrmap_data);
12341232
m_maincpu->set_addrmap(z8001_device::AS_STACK, &zbi_s8k_hpcpu_card_device::addrmap_stack);

src/devices/cpu/z8000/z8000.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ z8002_device::z8002_device(const machine_config &mconfig, device_type type, cons
4242
, m_ns_out(*this)
4343
, m_busack_out(*this)
4444
, m_ppc(0), m_pc(0), m_psapseg(0), m_psapoff(0), m_fcw(0), m_refresh(0), m_nspseg(0), m_nspoff(0), m_irq_req(0), m_irq_vec(0), m_op_valid(0), m_nmi_state(0), m_busreq_state(0), m_busack_state(0), m_mi(0), m_halt(false), m_icount(0)
45-
, m_vector_mult(vecmult), m_m20_hack(true)
45+
, m_vector_mult(vecmult)
4646
{
4747
}
4848

@@ -202,11 +202,6 @@ uint16_t z8002_device::RDMEM_W(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific
202202
{
203203
addr = adjust_addr_for_nonseg_mode(addr);
204204
addr &= ~1;
205-
/* hack for m20 driver: BIOS accesses 0x7f0000 and expects a segmentation violation */
206-
if (m_m20_hack && (addr >= 0x7f0000)) {
207-
m_irq_req = Z8000_SEGTRAP;
208-
return 0xffff;
209-
}
210205
return space.read_word(addr);
211206
}
212207

src/devices/cpu/z8000/z8000.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ class z8002_device : public cpu_device, public z8000_disassembler::config
112112
auto ns() { return m_ns_out.bind(); }
113113

114114
bool is_ifetch1() const noexcept { return (m_op_valid == 0); }
115-
void set_m20_hack(bool is_hack) { m_m20_hack = is_hack; }
116115

117116
protected:
118117
z8002_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int addrbits, int vecmult);
@@ -187,7 +186,6 @@ class z8002_device : public cpu_device, public z8000_disassembler::config
187186
memory_access<16, 1, 0, ENDIANNESS_BIG>::specific m_sio;
188187
int m_icount;
189188
const int m_vector_mult;
190-
bool m_m20_hack;
191189

192190
void clear_internal_state();
193191
void register_debug_state();

src/mame/olivetti/m20.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ class m20_state : public driver_device
122122
void install_memory();
123123

124124
static void floppy_formats(format_registration &fr);
125+
uint16_t segment_r();
126+
uint16_t segtack_r();
125127
uint16_t viack_r();
126128
uint16_t nviack_r();
127129
};
@@ -330,12 +332,14 @@ void m20_state::m20_program_mem(address_map &map)
330332
{
331333
map.unmap_value_high();
332334
map(0x40000, 0x41fff).rom().region("maincpu", 0x00000);
335+
map(0x7f0000, 0x7fffff).r(FUNC(m20_state::segment_r));
333336
}
334337

335338
void m20_state::m20_data_mem(address_map &map)
336339
{
337340
map.unmap_value_high();
338341
map(0x40000, 0x41fff).rom().region("maincpu", 0x00000);
342+
map(0x7f0000, 0x7fffff).r(FUNC(m20_state::segment_r));
339343
}
340344

341345

@@ -692,6 +696,20 @@ uint16_t m20_state::viack_r()
692696
return m_i8259->acknowledge()<<1;
693697
}
694698

699+
uint16_t m20_state::segment_r()
700+
{
701+
if (!machine().side_effects_disabled())
702+
m_maincpu->set_input_line(z8001_device::SEGT_LINE, ASSERT_LINE);
703+
704+
return 0xffff;
705+
}
706+
707+
uint16_t m20_state::segtack_r()
708+
{
709+
m_maincpu->set_input_line(z8001_device::SEGT_LINE, CLEAR_LINE);
710+
return 0xffff;
711+
}
712+
695713
uint16_t m20_state::nviack_r()
696714
{
697715
m_maincpu->set_input_line(z8001_device::NVI_LINE, CLEAR_LINE);
@@ -770,6 +788,7 @@ void m20_state::m20(machine_config &config)
770788
m_maincpu->set_addrmap(AS_PROGRAM, &m20_state::m20_program_mem);
771789
m_maincpu->set_addrmap(AS_DATA, &m20_state::m20_data_mem);
772790
m_maincpu->set_addrmap(AS_IO, &m20_state::m20_io);
791+
m_maincpu->segtack().set(FUNC(m20_state::segtack_r));
773792
m_maincpu->viack().set(FUNC(m20_state::viack_r));
774793
m_maincpu->nviack().set(FUNC(m20_state::nviack_r));
775794

0 commit comments

Comments
 (0)