@@ -460,8 +460,11 @@ class m68010_tekmmu_device : public m68010_device
460
460
// we need to override init_cpu_m68010 so replacing call to m68010_device::device_start();
461
461
m68000_musashi_device::device_start ();
462
462
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 " );
465
468
set_emmu_enable (true ); // sets m_instruction_restart=true
466
469
}
467
470
@@ -771,10 +774,10 @@ u16 tek440x_state::memory_r(offs_t offset, u16 mem_mask)
771
774
772
775
inbuserr = 1 ;
773
776
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 );
778
781
779
782
mem_mask = 0 ;
780
783
return 0xffff ;
@@ -795,13 +798,15 @@ u16 tek440x_state::memory_r(offs_t offset, u16 mem_mask)
795
798
if (offset >= OFF8_TO_OFF16 (MAXRAM) && offset < OFF8_TO_OFF16 (0x600000 ))
796
799
{
797
800
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 );
801
802
}
802
803
}
803
-
804
+
805
+ if (inbuserr && (m_maincpu->get_fc () & 4 ))
806
+ {
807
+ LOG (" berr reset(r) %06x\n " , offset<<1 );
804
808
inbuserr = 0 ;
809
+ }
805
810
806
811
return (m_boot) ? m_prom[offset & 0x3fff ] : m_vm->read16 (offset, mem_mask);
807
812
}
@@ -837,16 +842,15 @@ void tek440x_state::memory_w(offs_t offset, u16 data, u16 mem_mask)
837
842
inbuserr = 1 ;
838
843
839
844
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 );
843
846
844
847
mem_mask = 0 ; // disable write
845
848
}
846
- else
849
+ else if (!inbuserr)
847
850
{
848
851
m_map_control |= (1 << MAP_BLOCK_ACCESS);
849
852
}
853
+ else mem_mask = 0 ;
850
854
851
855
// write-enabled page?
852
856
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)
856
860
inbuserr = 1 ;
857
861
858
862
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 );
862
864
863
865
mem_mask = 0 ; // disable write
864
866
return ;
@@ -868,7 +870,7 @@ void tek440x_state::memory_w(offs_t offset, u16 data, u16 mem_mask)
868
870
if (mem_mask)
869
871
{
870
872
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 );
872
874
}
873
875
874
876
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)
879
881
if (offset >= OFF8_TO_OFF16 (MAXRAM) && offset < OFF8_TO_OFF16 (0x600000 ) && !machine ().side_effects_disabled ())
880
882
{
881
883
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 );
885
885
}
886
886
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
+ }
889
892
890
893
m_vm->write16 (offset, data, mem_mask);
891
894
}
@@ -901,9 +904,7 @@ u16 tek440x_state::map_r(offs_t offset)
901
904
if (!BIT (m_map_control, MAP_SYS_WR_ENABLE))
902
905
{
903
906
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 );
907
908
return 0 ;
908
909
}
909
910
}
0 commit comments