(nw) mbee: checkpoint 2

This commit is contained in:
Robbbert 2020-06-18 14:49:39 +10:00
parent 3ad3a40eb4
commit 1fce454a0b
4 changed files with 206 additions and 264 deletions

View File

@ -138,7 +138,9 @@ void mbee_state::mbee_mem(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x7fff).ram();
map(0x8000, 0xefff).rom().region("maincpu",0);
map(0x8000, 0xbfff).rom().region("maincpu",0);
map(0xc000, 0xdfff).rom().region("pakrom",0);
map(0xe000, 0xefff).rom().region("telcomrom",0);
map(0xf000, 0xf7ff).rw(FUNC(mbee_state::video_low_r), FUNC(mbee_state::video_low_w));
map(0xf800, 0xffff).rw(FUNC(mbee_state::video_high_r), FUNC(mbee_state::video_high_w));
}
@ -148,7 +150,7 @@ void mbee_state::mbeeic_mem(address_map &map)
map(0x0000, 0x7fff).ram();
map(0x8000, 0xbfff).rom().region("maincpu",0);
map(0xc000, 0xdfff).bankr("pak");
map(0xe000, 0xefff).rom().region("maincpu",0x4000);
map(0xe000, 0xefff).rom().region("telcomrom",0);
map(0xf000, 0xf7ff).rw(FUNC(mbee_state::video_low_r), FUNC(mbee_state::video_low_w));
map(0xf800, 0xffff).rw(FUNC(mbee_state::video_high_r), FUNC(mbee_state::video_high_w));
}
@ -651,8 +653,6 @@ void mbee_state::mbee(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &mbee_state::mbee_io);
m_maincpu->set_daisy_config(mbee_daisy_chain);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee)
Z80PIO(config, m_pio, 12_MHz_XTAL / 6);
m_pio->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_pio->out_pa_callback().set("cent_data_out", FUNC(output_latch_device::write));
@ -671,8 +671,6 @@ void mbee_state::mbee(machine_config &config)
PALETTE(config, m_palette, FUNC(mbee_state::standard_palette), 100);
MCFG_VIDEO_START_OVERRIDE(mbee_state, mono)
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
@ -710,8 +708,6 @@ void mbee_state::mbeeic(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &mbee_state::mbeeic_io);
m_maincpu->set_daisy_config(mbee_daisy_chain);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee)
Z80PIO(config, m_pio, 13.5_MHz_XTAL / 4);
m_pio->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_pio->out_pa_callback().set("cent_data_out", FUNC(output_latch_device::write));
@ -730,8 +726,6 @@ void mbee_state::mbeeic(machine_config &config)
PALETTE(config, m_palette, FUNC(mbee_state::standard_palette), 100);
MCFG_VIDEO_START_OVERRIDE(mbee_state, standard)
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
@ -773,7 +767,6 @@ void mbee_state::mbeeppc(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbeeppc_mem);
m_maincpu->set_addrmap(AS_IO, &mbee_state::mbeeppc_io);
MCFG_VIDEO_START_OVERRIDE(mbee_state, premium)
subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_premium);
m_palette->set_init(FUNC(mbee_state::premium_palette));
@ -786,7 +779,6 @@ void mbee_state::mbee56(machine_config &config)
mbeeic(config);
m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbee56_mem);
m_maincpu->set_addrmap(AS_IO, &mbee_state::mbee56_io);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee56)
WD2793(config, m_fdc, 4_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(mbee_state::fdc_intrq_w));
@ -801,7 +793,6 @@ void mbee_state::mbee128(machine_config &config)
mbee56(config);
m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbee256_mem);
m_maincpu->set_addrmap(AS_IO, &mbee_state::mbee128_io);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee128)
MC146818(config, m_rtc, 32.768_kHz_XTAL);
m_rtc->irq().set(FUNC(mbee_state::rtc_irq_w));
@ -812,7 +803,6 @@ void mbee_state::mbee128p(machine_config &config)
mbeeppc(config);
m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbee256_mem);
m_maincpu->set_addrmap(AS_IO, &mbee_state::mbee128_io);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee128)
WD2793(config, m_fdc, 4_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(mbee_state::fdc_intrq_w));
@ -827,7 +817,6 @@ void mbee_state::mbee256(machine_config &config)
mbee128p(config);
m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbee256_mem);
m_maincpu->set_addrmap(AS_IO, &mbee_state::mbee256_io);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee256)
config.device_remove("fdc:0");
config.device_remove("fdc:1");
@ -840,7 +829,6 @@ void mbee_state::mbeett(machine_config &config)
mbeeppc(config);
m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbeett_mem);
m_maincpu->set_addrmap(AS_IO, &mbee_state::mbeett_io);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbeett)
config.device_remove("quickload");
config.device_remove("quickload2");
SCC8530(config, "scc", 4000000); // clock unknown
@ -860,14 +848,19 @@ void mbee_state::mbeett(machine_config &config)
ROM_START( mbee )
ROM_REGION( 0x7000, "maincpu", 0 )
ROM_REGION( 0x6000, "maincpu", 0 )
ROM_LOAD("bas510a.ic25", 0x0000, 0x1000, CRC(2ca47c36) SHA1(f36fd0afb3f1df26edc67919e78000b762b6cbcb) )
ROM_LOAD("bas510b.ic27", 0x1000, 0x1000, CRC(a07a0c51) SHA1(dcbdd9df78b4b6b2972de2e4050dabb8ae9c3f5a) )
ROM_LOAD("bas510c.ic28", 0x2000, 0x1000, CRC(906ac00f) SHA1(9b46458e5755e2c16cdb191a6a70df6de9fe0271) )
ROM_LOAD("bas510d.ic30", 0x3000, 0x1000, CRC(61727323) SHA1(c0fea9fd0e25beb9faa7424db8efd07cf8d26c1b) )
ROM_LOAD_OPTIONAL("edasma.ic31", 0x4000, 0x1000, CRC(120c3dea) SHA1(32c9bb6e54dd50d5218bb43cc921885a0307161d) )
ROM_LOAD_OPTIONAL("edasmb.ic33", 0x5000, 0x1000, CRC(a23bf3c8) SHA1(73a57c2800a1c744b527d0440b170b8b03351753) )
ROM_LOAD_OPTIONAL("telcom10.rom", 0x6000, 0x1000, CRC(cc9ac94d) SHA1(6804b5ff54d16f8e06180751d8681c44f351e0bb) )
ROM_REGION( 0x1000, "telcomrom", 0 )
ROM_LOAD_OPTIONAL("telcom10.rom", 0x0000, 0x1000, CRC(cc9ac94d) SHA1(6804b5ff54d16f8e06180751d8681c44f351e0bb) )
// there's no actual PAK board or command in this machine
ROM_REGION( 0x20000, "pakrom", ROMREGION_ERASEFF )
ROM_LOAD_OPTIONAL("edasma.ic31", 0x0000, 0x1000, CRC(120c3dea) SHA1(32c9bb6e54dd50d5218bb43cc921885a0307161d) )
ROM_LOAD_OPTIONAL("edasmb.ic33", 0x1000, 0x1000, CRC(a23bf3c8) SHA1(73a57c2800a1c744b527d0440b170b8b03351753) )
// first 0x800 for normal chars, 2nd 0x800 for small chars. Some roms don't have small chars so normal ones loaded twice.
ROM_REGION( 0x1000, "chargen", 0 )
@ -879,10 +872,12 @@ ROM_START( mbee )
ROM_END
ROM_START( mbeeic )
ROM_REGION( 0x5000, "maincpu", 0 )
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD("bas522a.rom", 0x0000, 0x2000, CRC(7896a696) SHA1(a158f7803296766160e1f258dfc46134735a9477) )
ROM_LOAD("bas522b.rom", 0x2000, 0x2000, CRC(b21d9679) SHA1(332844433763331e9483409cd7da3f90ac58259d) )
ROM_LOAD_OPTIONAL("telcom12.rom", 0x4000, 0x1000, CRC(0231bda3) SHA1(be7b32499034f985cc8f7865f2bc2b78c485585c) )
ROM_REGION( 0x1000, "telcomrom", 0 )
ROM_LOAD_OPTIONAL("telcom12.rom", 0x0000, 0x1000, CRC(0231bda3) SHA1(be7b32499034f985cc8f7865f2bc2b78c485585c) )
/* PAK option roms */
ROM_REGION( 0x20000, "pakrom", ROMREGION_ERASEFF )
@ -1125,16 +1120,16 @@ ROM_END
***************************************************************************/
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME
COMP( 1982, mbee, 0, 0, mbee, mbee, mbee_state, init_mbee, "Applied Technology", "Microbee 16 Standard", 0 )
COMP( 1982, mbeeic, mbee, 0, mbeeic, mbee, mbee_state, init_mbeeic, "Applied Technology", "Microbee 32 IC", 0 )
COMP( 1982, mbeepc, mbee, 0, mbeepc, mbee, mbee_state, init_mbeepc, "Applied Technology", "Microbee Personal Communicator", 0 )
COMP( 1985, mbeepc85, mbee, 0, mbeepc, mbee, mbee_state, init_mbeepc85, "Applied Technology", "Microbee PC85", 0 )
COMP( 1985, mbeepc85b, mbee, 0, mbeepc, mbee, mbee_state, init_mbeepc85, "Applied Technology", "Microbee PC85 (New version)", 0 )
COMP( 1985, mbeepc85s, mbee, 0, mbeepc, mbee, mbee_state, init_mbeepc85, "Applied Technology", "Microbee PC85 (Swedish)", 0 )
COMP( 1986, mbeeppc, mbee, 0, mbeeppc, mbee, mbee_state, init_mbeeppc, "Applied Technology", "Microbee Premium PC85", 0 )
COMP( 1986, mbeett, mbee, 0, mbeett, mbee256, mbee_state, init_mbeett, "Applied Technology", "Microbee Teleterm", MACHINE_NOT_WORKING )
COMP( 1986, mbee56, mbee, 0, mbee56, mbee, mbee_state, init_mbee56, "Applied Technology", "Microbee 56k", MACHINE_NOT_WORKING )
COMP( 1986, mbee128, mbee, 0, mbee128, mbee128, mbee_state, init_mbee128, "Applied Technology", "Microbee 128k Standard", MACHINE_NOT_WORKING )
COMP( 1986, mbee128p, mbee, 0, mbee128p, mbee128, mbee_state, init_mbee128, "Applied Technology", "Microbee 128k Premium", MACHINE_NOT_WORKING )
COMP( 1987, mbee256, mbee, 0, mbee256, mbee256, mbee_state, init_mbee256, "Applied Technology", "Microbee 256TC", MACHINE_NOT_WORKING )
COMP( 2012, mbeepp, mbee, 0, mbee256, mbee128, mbee_state, init_mbee128, "Microbee Systems", "Microbee Premium Plus", MACHINE_NOT_WORKING )
COMP( 1982, mbee, 0, 0, mbee, mbee, mbee_state, init_mbee, "Applied Technology", "Microbee 16 Standard", MACHINE_SUPPORTS_SAVE )
COMP( 1982, mbeeic, mbee, 0, mbeeic, mbee, mbee_state, init_mbeeic, "Applied Technology", "Microbee 32 IC", MACHINE_SUPPORTS_SAVE )
COMP( 1982, mbeepc, mbee, 0, mbeepc, mbee, mbee_state, init_mbeeic, "Applied Technology", "Microbee Personal Communicator", MACHINE_SUPPORTS_SAVE )
COMP( 1985, mbeepc85, mbee, 0, mbeepc, mbee, mbee_state, init_mbeeic, "Applied Technology", "Microbee PC85", MACHINE_SUPPORTS_SAVE )
COMP( 1985, mbeepc85b, mbee, 0, mbeepc, mbee, mbee_state, init_mbeeic, "Applied Technology", "Microbee PC85 (New version)", MACHINE_SUPPORTS_SAVE )
COMP( 1985, mbeepc85s, mbee, 0, mbeepc, mbee, mbee_state, init_mbeeic, "Applied Technology", "Microbee PC85 (Swedish)", MACHINE_SUPPORTS_SAVE )
COMP( 1986, mbeeppc, mbee, 0, mbeeppc, mbee, mbee_state, init_mbeeppc, "Applied Technology", "Microbee Premium PC85", MACHINE_SUPPORTS_SAVE )
COMP( 1986, mbeett, mbee, 0, mbeett, mbee256, mbee_state, init_mbeett, "Applied Technology", "Microbee Teleterm", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1986, mbee56, mbee, 0, mbee56, mbee, mbee_state, init_mbee56, "Applied Technology", "Microbee 56k", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1986, mbee128, mbee, 0, mbee128, mbee128, mbee_state, init_mbee128, "Applied Technology", "Microbee 128k Standard", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1986, mbee128p, mbee, 0, mbee128p, mbee128, mbee_state, init_mbee128p, "Applied Technology", "Microbee 128k Premium", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1987, mbee256, mbee, 0, mbee256, mbee256, mbee_state, init_mbee256, "Applied Technology", "Microbee 256TC", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 2012, mbeepp, mbee, 0, mbee256, mbee128, mbee_state, init_mbeepp, "Microbee Systems", "Microbee Premium Plus", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -72,15 +72,15 @@ public:
void mbeepc(machine_config &config);
void mbee128p(machine_config &config);
void init_mbeepc85();
void init_mbee256();
void init_mbee56();
void init_mbeett();
void init_mbeeppc();
void init_mbee();
void init_mbeepc();
void init_mbeeic();
void init_mbee128();
void init_mbee() { m_features = 0x00; };
void init_mbeett() { m_features = 0x0d; };
void init_mbeeppc() { m_features = 0x09; };
void init_mbeepp() { m_features = 0x29; }; // TODO: give 1MB ram when we find out how it is switched (feature byte = 0x39)
void init_mbeeic() { m_features = 0x01; };
void init_mbee56() { m_features = 0x03; };
void init_mbee128() { m_features = 0x11; };
void init_mbee128p() { m_features = 0x19; };
void init_mbee256() { m_features = 0x2d; };
private:
enum
@ -116,16 +116,8 @@ private:
DECLARE_WRITE_LINE_MEMBER(crtc_vs);
uint8_t fdc_status_r();
void fdc_motor_w(uint8_t data);
DECLARE_MACHINE_RESET(mbee);
DECLARE_VIDEO_START(mono);
DECLARE_VIDEO_START(standard);
DECLARE_VIDEO_START(premium);
void standard_palette(palette_device &palette) const;
void premium_palette(palette_device &palette) const;
DECLARE_MACHINE_RESET(mbee56);
DECLARE_MACHINE_RESET(mbee128);
DECLARE_MACHINE_RESET(mbee256);
DECLARE_MACHINE_RESET(mbeett);
uint32_t screen_update_mbee(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(timer_newkb);
DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_bee);
@ -135,6 +127,8 @@ private:
WRITE_LINE_MEMBER(fdc_drq_w);
MC6845_UPDATE_ROW(crtc_update_row);
MC6845_ON_UPDATE_ADDR_CHANGED(crtc_update_addr);
void machine_start() override;
void machine_reset() override;
required_device<palette_device> m_palette;
void mbee128_io(address_map &map);
@ -153,8 +147,7 @@ private:
void mbeett_io(address_map &map);
void mbeett_mem(address_map &map);
bool m_is_premium;
bool m_has_oldkb;
u8 m_features;
size_t m_size;
bool m_b7_rtc;
bool m_b7_vs;
@ -164,9 +157,9 @@ private:
uint8_t m_0a;
uint8_t m_0b;
uint8_t m_1c;
uint8_t m_mbee256_was_pressed[15];
uint8_t m_mbee256_q[20];
uint8_t m_mbee256_q_pos;
uint8_t m_newkb_was_pressed[15];
uint8_t m_newkb_q[20];
uint8_t m_newkb_q_pos;
uint8_t m_sy6545_reg[32];
uint8_t m_sy6545_ind;
uint8_t m_fdc_rq;
@ -180,7 +173,6 @@ private:
void setup_banks(uint8_t data, bool first_time, uint8_t b_mask);
void oldkb_scan(uint16_t param);
void oldkb_matrix_r(uint16_t offs);
void machine_reset_common();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
required_device<z80_device> m_maincpu;
required_device<z80pio_device> m_pio;

View File

@ -163,25 +163,25 @@ TIMER_CALLBACK_MEMBER( mbee_state::timer_newkb )
for (i = 0; i < 15; i++)
{
pressed = m_io_newkb[i]->read();
if (pressed != m_mbee256_was_pressed[i])
if (pressed != m_newkb_was_pressed[i])
{
// get scankey value
for (j = 0; j < 8; j++)
{
if (BIT(pressed^m_mbee256_was_pressed[i], j))
if (BIT(pressed^m_newkb_was_pressed[i], j))
{
// put it in the queue
uint8_t code = (i << 3) | j | (BIT(pressed, j) ? 0x80 : 0);
m_mbee256_q[m_mbee256_q_pos] = code;
if (m_mbee256_q_pos < 19) m_mbee256_q_pos++;
m_newkb_q[m_newkb_q_pos] = code;
if (m_newkb_q_pos < 19) m_newkb_q_pos++;
}
}
m_mbee256_was_pressed[i] = pressed;
m_newkb_was_pressed[i] = pressed;
}
}
// if anything queued, cause an interrupt
if (m_mbee256_q_pos)
if (m_newkb_q_pos)
m_b2 = 1; // set irq
if (m_b2)
@ -192,12 +192,12 @@ TIMER_CALLBACK_MEMBER( mbee_state::timer_newkb )
uint8_t mbee_state::port18_r()
{
uint8_t i, data = m_mbee256_q[0]; // get oldest key
uint8_t i, data = m_newkb_q[0]; // get oldest key
if (m_mbee256_q_pos)
if (m_newkb_q_pos)
{
m_mbee256_q_pos--;
for (i = 0; i < m_mbee256_q_pos; i++) m_mbee256_q[i] = m_mbee256_q[i+1]; // ripple queue
m_newkb_q_pos--;
for (i = 0; i < m_newkb_q_pos; i++) m_newkb_q[i] = m_newkb_q[i+1]; // ripple queue
}
m_b2 = 0; // clear irq
@ -434,8 +434,119 @@ uint8_t mbee_state::telcom_high_r()
It gets set back to normal on the first attempt to write to memory. (/WR line goes active).
*/
void mbee_state::machine_start()
{
// must init these vars here, or weird random crashes can occur when scroll lock pressed
m_fdc_rq = 0;
m_08 = 0;
m_0a = 0;
m_0b = 0;
m_1c = 0;
void mbee_state::machine_reset_common()
save_item(NAME(m_features));
save_item(NAME(m_size));
save_item(NAME(m_b7_rtc));
save_item(NAME(m_b7_vs));
save_item(NAME(m_b2));
save_item(NAME(m_framecnt)); // not important
save_item(NAME(m_08));
save_item(NAME(m_0a));
save_item(NAME(m_0b));
save_item(NAME(m_1c));
save_item(NAME(m_newkb_was_pressed));
save_item(NAME(m_newkb_q));
save_item(NAME(m_newkb_q_pos));
save_item(NAME(m_sy6545_reg));
save_item(NAME(m_sy6545_ind));
save_item(NAME(m_fdc_rq));
save_item(NAME(m_bank_array));
// banking of the BASIC roms
if (m_basic)
{
u8 *b = memregion("basicrom")->base();
m_basic->configure_entries(0, 2, b, 0x2000);
}
// banking of the TELCOM rom
if (m_telcom)
{
u8 *t = memregion("telcomrom")->base();
m_telcom->configure_entries(0, 2, t, 0x1000);
}
// PAKs fitted
if (m_pak)
{
u8 *p = memregion("pakrom")->base();
m_pak->configure_entries(0, 16, p, 0x2000);
}
// videoram
m_vram = make_unique_clear<u8[]>(0x0800);
save_pointer(NAME(m_vram), 0x0800);
// colour
if (BIT(m_features, 0))
{
m_cram = make_unique_clear<u8[]>(0x0800);
save_pointer(NAME(m_cram), 0x0800);
}
// minimal main ram
if (BIT(m_features, 1))
m_size = 0xE000;
else
m_size = 0x8000;
// new keyboard
if (BIT(m_features, 2))
timer_set(attotime::from_hz(1), TIMER_MBEE_NEWKB); /* kick-start timer for kbd */
// premium
if (BIT(m_features, 3))
{
m_aram = make_unique_clear<u8[]>(0x0800);
save_pointer(NAME(m_aram), 0x0800);
m_pram = make_unique_clear<u8[]>(0x8800);
save_pointer(NAME(m_pram), 0x8800);
}
else
{
m_pram = make_unique_clear<u8[]>(0x0800);
save_pointer(NAME(m_pram), 0x0800);
}
// Banked systems
u8 b = BIT(m_features, 4, 2);
if (b)
{
u32 ramsize = 0x40000; // 128k
if (b == 2)
ramsize = 0x40000; // 256k
else
if (b == 3)
ramsize = 0x100000; // 1MB for PP
m_ram = make_unique_clear<u8[]>(ramsize);
save_pointer(NAME(m_ram), ramsize);
m_dummy = std::make_unique<u8[]>(0x1000); // don't save this
u8 *r = m_ram.get();
u8 *d = m_dummy.get();
u8 *m = memregion("maincpu")->base();
for (u8 b_bank = 0; b_bank < 16; b_bank++)
{
m_bankr[b_bank]->configure_entries(0, 64, r, 0x1000); // RAM banks
m_bankr[b_bank]->configure_entries(64, 4, m, 0x1000); // rom
m_bankw[b_bank]->configure_entries(0, 64, r, 0x1000); // RAM banks
m_bankw[b_bank]->configure_entry(64, d); // dummy rom
}
}
}
void mbee_state::machine_reset()
{
m_fdc_rq = 0;
m_08 = 0;
@ -443,172 +554,43 @@ void mbee_state::machine_reset_common()
m_0b = 0;
m_1c = 0;
// set default chars
memcpy(m_pram.get(), memregion("chargen")->base(), 0x800);
if (m_basic)
m_basic->set_entry(0);
if (m_telcom)
m_telcom->set_entry(0);
if (m_pak)
m_pak->set_entry(5);
m_maincpu->set_pc(m_size);
// init new kbd
if (BIT(m_features, 2))
m_newkb_q_pos = 0;
// set banks to default
if (BIT(m_features, 4, 2) == 1)
setup_banks(0, 1, 3);
else
if (BIT(m_features, 4, 2) == 2)
setup_banks(0, 1, 7);
else
if (BIT(m_features, 4, 2) == 3)
setup_banks(0, 1, 31);
}
MACHINE_RESET_MEMBER( mbee_state, mbee )
{
machine_reset_common();
m_maincpu->set_pc(0x8000);
}
MACHINE_RESET_MEMBER( mbee_state, mbee56 )
{
machine_reset_common();
m_maincpu->set_pc(0xE000);
}
MACHINE_RESET_MEMBER( mbee_state, mbee128 )
{
machine_reset_common();
setup_banks(0, 1, 3); // set banks to default
m_maincpu->set_pc(0x8000);
}
MACHINE_RESET_MEMBER( mbee_state, mbee256 )
{
m_mbee256_q_pos = 0;
machine_reset_common();
setup_banks(0, 1, 7); // set banks to default
m_maincpu->set_pc(0x8000);
}
MACHINE_RESET_MEMBER( mbee_state, mbeett )
{
m_mbee256_q_pos = 0;
machine_reset_common();
m_maincpu->set_pc(0x8000);
}
void mbee_state::init_mbee()
{
m_size = 0x8000;
m_has_oldkb = 1;
}
void mbee_state::init_mbeeic()
{
uint8_t *RAM = memregion("pakrom")->base();
m_pak->configure_entries(0, 16, &RAM[0x0000], 0x2000);
m_pak->set_entry(0);
m_size = 0x8000;
m_has_oldkb = 1;
}
void mbee_state::init_mbeepc()
{
uint8_t *RAM = memregion("telcomrom")->base();
m_telcom->configure_entries(0, 2, &RAM[0x0000], 0x1000);
RAM = memregion("pakrom")->base();
m_pak->configure_entries(0, 16, &RAM[0x0000], 0x2000);
m_pak->set_entry(0);
m_size = 0x8000;
m_has_oldkb = 1;
}
void mbee_state::init_mbeepc85()
{
uint8_t *RAM = memregion("telcomrom")->base();
m_telcom->configure_entries(0, 2, &RAM[0x0000], 0x1000);
RAM = memregion("pakrom")->base();
m_pak->configure_entries(0, 16, &RAM[0x0000], 0x2000);
m_pak->set_entry(5);
m_size = 0x8000;
m_has_oldkb = 1;
}
void mbee_state::init_mbeeppc()
{
uint8_t *RAM = memregion("basicrom")->base();
m_basic->configure_entries(0, 2, &RAM[0x0000], 0x2000);
RAM = memregion("telcomrom")->base();
m_telcom->configure_entries(0, 2, &RAM[0x0000], 0x1000);
RAM = memregion("pakrom")->base();
m_pak->configure_entries(0, 16, &RAM[0x0000], 0x2000);
m_pak->set_entry(5);
m_size = 0x8000;
m_has_oldkb = 1;
}
void mbee_state::init_mbee56()
{
m_size = 0xe000;
m_has_oldkb = 1;
}
// 128k uses 32 RAM banks.
// PP has 1024k which is 256 banks, but having 64 banks stops it crashing during the self-test. Need a schematic before we can fix it.
void mbee_state::init_mbee128()
{
m_ram = make_unique_clear<u8[]>(0x40000);
m_dummy = std::make_unique<u8[]>(0x1000);
u8 *r = m_ram.get();
u8 *d = m_dummy.get();
u8 *m = memregion("maincpu")->base();
for (u8 b_bank = 0; b_bank < 16; b_bank++)
{
m_bankr[b_bank]->configure_entries(0, 64, r, 0x1000); // RAM banks
m_bankr[b_bank]->configure_entries(64, 4, m, 0x1000); // rom
m_bankw[b_bank]->configure_entries(0, 64, r, 0x1000); // RAM banks
m_bankw[b_bank]->configure_entry(64, d); // dummy rom
}
m_size = 0x8000;
m_has_oldkb = 1;
}
void mbee_state::init_mbee256()
{
m_ram = make_unique_clear<u8[]>(0x40000);
m_dummy = std::make_unique<u8[]>(0x1000);
u8 *r = m_ram.get();
u8 *d = m_dummy.get();
u8 *m = memregion("maincpu")->base();
for (u8 b_bank = 0; b_bank < 16; b_bank++)
{
m_bankr[b_bank]->configure_entries(0, 64, r, 0x1000); // RAM banks
m_bankr[b_bank]->configure_entries(64, 4, m, 0x1000); // rom
m_bankw[b_bank]->configure_entries(0, 64, r, 0x1000); // RAM banks
m_bankw[b_bank]->configure_entry(64, d); // dummy rom
}
timer_set(attotime::from_hz(1), TIMER_MBEE_NEWKB); /* kick-start timer for kbd */
m_size = 0x8000;
m_has_oldkb = 0;
}
void mbee_state::init_mbeett()
{
uint8_t *RAM = memregion("telcomrom")->base();
m_telcom->configure_entries(0, 2, &RAM[0x0000], 0x1000);
RAM = memregion("pakrom")->base();
m_pak->configure_entries(0, 16, &RAM[0x0000], 0x2000);
m_pak->set_entry(5);
timer_set(attotime::from_hz(1), TIMER_MBEE_NEWKB); /* kick-start timer for kbd */
m_size = 0x8000;
m_has_oldkb = 0;
}
/* m_features:
bit 0 : (colour fitted) 1 = yes
bit 1 : (initial pc value / size of main ram) 1=0xE000, 0=0x8000
bit 2 : (keyboard type) 1 = new keyboard
bit 3 : (core type) 1 = premium
bit 4,5 : (banking main ram) 0x10 = 128k; 0x20 = 256k
*/
/***********************************************************

View File

@ -63,7 +63,7 @@ WRITE_LINE_MEMBER( mbee_state::crtc_vs )
uint8_t mbee_state::video_low_r(offs_t offset)
{
if (m_is_premium && ((m_1c & 0x9f) == 0x90))
if (BIT(m_features, 3) && ((m_1c & 0x9f) == 0x90))
return m_aram[offset];
else
if (m_0b)
@ -77,7 +77,7 @@ void mbee_state::video_low_w(offs_t offset, uint8_t data)
if (BIT(m_1c, 4))
{
// non-premium attribute writes are discarded
if (m_is_premium && BIT(m_1c, 7))
if (BIT(m_features, 3) && BIT(m_1c, 7))
m_aram[offset] = data;
}
else
@ -127,7 +127,7 @@ void mbee_state::port1c_w(uint8_t data)
d4 select attribute ram
d3..d0 select videoram bank */
if (m_is_premium && BIT(data, 7))
if (BIT(m_features, 3) && BIT(data, 7))
m_1c = data;
else
m_1c = data & 0x30;
@ -146,7 +146,7 @@ void mbee_state::port1c_w(uint8_t data)
void mbee_state::oldkb_matrix_r(uint16_t offs)
{
if (m_has_oldkb)
if (!BIT(m_features, 2))
{
uint8_t port = (offs >> 7) & 7;
uint8_t bit = (offs >> 4) & 7;
@ -157,7 +157,7 @@ void mbee_state::oldkb_matrix_r(uint16_t offs)
// This adds premium-style cursor keys to the old keyboard.
// They are used by the pc85 menu. Premium keyboards already
// have these keys fitted.
if (!keydown && !m_is_premium)
if (!keydown && !BIT(m_features, 3))
{
if ((port == 0) || (port == 2) || (port == 3))
extra = m_io_x7->read();
@ -241,33 +241,6 @@ void mbee_state::m6545_data_w(uint8_t data)
************************************************************/
VIDEO_START_MEMBER( mbee_state, mono )
{
m_vram = make_unique_clear<u8[]>(0x0800);
m_pram = make_unique_clear<u8[]>(0x1000);
memcpy(m_pram.get(), memregion("chargen")->base(), 0x800);
m_is_premium = 0;
}
VIDEO_START_MEMBER( mbee_state, standard )
{
m_vram = make_unique_clear<u8[]>(0x0800);
m_pram = make_unique_clear<u8[]>(0x1000);
m_cram = make_unique_clear<u8[]>(0x0800);
memcpy(m_pram.get(), memregion("chargen")->base(), 0x800);
m_is_premium = 0;
}
VIDEO_START_MEMBER( mbee_state, premium )
{
m_vram = make_unique_clear<u8[]>(0x0800);
m_pram = make_unique_clear<u8[]>(0x8800);
m_cram = make_unique_clear<u8[]>(0x0800);
m_aram = make_unique_clear<u8[]>(0x0800);
memcpy(m_pram.get(), memregion("chargen")->base(), 0x800);
m_is_premium = 1;
}
uint32_t mbee_state::screen_update_mbee(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
m_framecnt++;
@ -290,10 +263,10 @@ MC6845_UPDATE_ROW( mbee_state::crtc_update_row )
const rgb_t *palette = m_palette->palette()->entry_list_raw();
// colours
uint8_t colourm = (m_08 & 0x0e) >> 1;
uint8_t monopal = (m_io_config->read() & 0x30) >> 4;
uint8_t colourm = BIT(m_08, 2, 3);
uint8_t monopal = BIT(m_io_config->read(), 4, 2);
// if colour chosen on mono bee, default to amber
if (!monopal && !m_cram)
if ((monopal==0) && !BIT(m_features, 0))
monopal = 2;
uint32_t *p = &bitmap.pix32(y);
@ -326,11 +299,11 @@ MC6845_UPDATE_ROW( mbee_state::crtc_update_row )
gfx = m_pram[(chr<<4) | ra] ^ inv;
// get colours
if (!monopal)
if (monopal==0)
{
col = m_cram[mem]; // read a byte of colour
if (m_is_premium)
if (BIT(m_features, 3)) // premium
{
fg = col & 15;
bg = col >> 4;