Skip to content

Commit 6e2bb0c

Browse files
author
Adam
committed
- wip but with fixes from @shattered, now boots and gets to login prompt
1 parent a722e6a commit 6e2bb0c

File tree

1 file changed

+27
-26
lines changed

1 file changed

+27
-26
lines changed

src/mame/tektronix/tek440x.cpp

+27-26
Original file line numberDiff line numberDiff line change
@@ -460,8 +460,11 @@ class m68010_tekmmu_device : public m68010_device
460460
//we need to override init_cpu_m68010 so replacing call to m68010_device::device_start();
461461
m68000_musashi_device::device_start();
462462
init_cpu_m68010();
463-
464-
LOG("m68010_tekmmu_device::device_start: setting emmu\n");
463+
}
464+
void device_reset() override
465+
{
466+
m68000_musashi_device::device_reset();
467+
LOG("m68010_tekmmu_device::device_reset: setting emmu\n");
465468
set_emmu_enable(true); // sets m_instruction_restart=true
466469
}
467470

@@ -771,10 +774,10 @@ u16 tek440x_state::memory_r(offs_t offset, u16 mem_mask)
771774

772775
inbuserr = 1;
773776

774-
LOG("memory_r: bus error: PID(%d) != %d %08x fc(%d) pc(%08x)\n", BIT(m_map[offset >> 11], 11, 3), (m_map_control & 7), OFF16_TO_OFF8(offset), m_maincpu->get_fc(), m_maincpu->pc());
775-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
776-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
777-
m_maincpu->set_buserror_details(OFF16_TO_OFF8(offset0), 0, m_maincpu->get_fc());
777+
LOG("memory_r: %06x: bus error: PTE PID %d != current PID %d fc(%d) pc(%08x) berr(%d)\n", offset<<1,
778+
BIT(m_map[offset >> 11], 11, 3), (m_map_control & 7), m_maincpu->get_fc(), m_maincpu->pc(),
779+
inbuserr);
780+
m_maincpu->set_buserror_details(OFF16_TO_OFF8(offset0), 1, m_maincpu->get_fc(), true);
778781

779782
mem_mask = 0;
780783
return 0xffff;
@@ -795,13 +798,15 @@ u16 tek440x_state::memory_r(offs_t offset, u16 mem_mask)
795798
if (offset >= OFF8_TO_OFF16(MAXRAM) && offset < OFF8_TO_OFF16(0x600000))
796799
{
797800
LOG("memory_r: bus error: NOMEM %08x fc(%d) pc(%08x)\n", OFF16_TO_OFF8(offset), m_maincpu->get_fc(), m_maincpu->pc());
798-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
799-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
800-
m_maincpu->set_buserror_details(OFF16_TO_OFF8(offset0), 1, m_maincpu->get_fc());
801+
m_maincpu->set_buserror_details(OFF16_TO_OFF8(offset0), 1, m_maincpu->get_fc(), true);
801802
}
802803
}
803-
804+
805+
if (inbuserr && (m_maincpu->get_fc() & 4))
806+
{
807+
LOG("berr reset(r) %06x\n", offset<<1);
804808
inbuserr = 0;
809+
}
805810

806811
return (m_boot) ? m_prom[offset & 0x3fff] : m_vm->read16(offset, mem_mask);
807812
}
@@ -837,16 +842,15 @@ void tek440x_state::memory_w(offs_t offset, u16 data, u16 mem_mask)
837842
inbuserr = 1;
838843

839844
LOG("memory_w: bus error: PID(%d) != %d %08x fc(%d)\n", BIT(m_map[offset >> 11], 11, 3), (m_map_control & 7), OFF16_TO_OFF8(offset), m_maincpu->get_fc());
840-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
841-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
842-
m_maincpu->set_buserror_details(OFF16_TO_OFF8(offset0), 0, m_maincpu->get_fc());
845+
m_maincpu->set_buserror_details(OFF16_TO_OFF8(offset0), 0, m_maincpu->get_fc(), true);
843846

844847
mem_mask = 0; // disable write
845848
}
846-
else
849+
else if (!inbuserr)
847850
{
848851
m_map_control |= (1 << MAP_BLOCK_ACCESS);
849852
}
853+
else mem_mask = 0;
850854

851855
// write-enabled page?
852856
if (BIT(m_map[offset >> 11], 14) == 0)
@@ -856,9 +860,7 @@ void tek440x_state::memory_w(offs_t offset, u16 data, u16 mem_mask)
856860
inbuserr = 1;
857861

858862
LOG("memory_w: bus error: READONLY %08x fc(%d) pc(%08x)\n", OFF16_TO_OFF8(offset), m_maincpu->get_fc(), m_maincpu->pc());
859-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
860-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
861-
m_maincpu->set_buserror_details(OFF16_TO_OFF8(offset0), 0, m_maincpu->get_fc());
863+
m_maincpu->set_buserror_details(OFF16_TO_OFF8(offset0), 0, m_maincpu->get_fc(), true);
862864

863865
mem_mask = 0; // disable write
864866
return;
@@ -868,7 +870,7 @@ void tek440x_state::memory_w(offs_t offset, u16 data, u16 mem_mask)
868870
if (mem_mask)
869871
{
870872
m_map[offset >> 11] |= 0x8000;
871-
LOG("memory_w: DIRTY m_map(0x%04x) m_map_control(%02x)\n", m_map[offset >> 11], m_map_control);
873+
LOG("memory_w: DIRTY m_map(0x%04x) m_map_control(%02x) berr(%d)\n", m_map[offset >> 11], m_map_control, inbuserr);
872874
}
873875

874876
offset = BIT(offset, 0, 11) | (BIT(m_map[offset >> 11], 0, 11) << 11);
@@ -879,13 +881,14 @@ void tek440x_state::memory_w(offs_t offset, u16 data, u16 mem_mask)
879881
if (offset >= OFF8_TO_OFF16(MAXRAM) && offset < OFF8_TO_OFF16(0x600000) && !machine().side_effects_disabled())
880882
{
881883
LOG("memory_w: bus error: NOMEM %08x fc(%d)\n", OFF16_TO_OFF8(offset), m_maincpu->get_fc());
882-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
883-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
884-
m_maincpu->set_buserror_details(OFF16_TO_OFF8(offset0), 0, m_maincpu->get_fc());
884+
m_maincpu->set_buserror_details(OFF16_TO_OFF8(offset0), 0, m_maincpu->get_fc(), true);
885885
}
886886

887-
//LOG("memory_w: %08x <= %04x\n", OFF16_TO_OFF8(offset), data);
888-
inbuserr = 0;
887+
if (inbuserr && (m_maincpu->get_fc() & 4))
888+
{
889+
LOG("berr reset(w) %06x\n", offset<<1);
890+
inbuserr = 0;
891+
}
889892

890893
m_vm->write16(offset, data, mem_mask);
891894
}
@@ -901,9 +904,7 @@ u16 tek440x_state::map_r(offs_t offset)
901904
if (!BIT(m_map_control, MAP_SYS_WR_ENABLE))
902905
{
903906
LOG("map_r: bus error: PID(%d) %08x fc(%d) pc(%08x)\n", BIT(m_map[(offset >> 11) & 0x7ff], 11, 3), OFF16_TO_OFF8(offset), m_maincpu->get_fc(), m_maincpu->pc());
904-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
905-
m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
906-
m_maincpu->set_buserror_details(offset, 0, m_maincpu->get_fc());
907+
m_maincpu->set_buserror_details(offset, 1, m_maincpu->get_fc(), true);
907908
return 0;
908909
}
909910
}

0 commit comments

Comments
 (0)