1 // license:BSD-3-Clause
2 // copyright-holders:Barry Rodewald
3 /*
4
5 Brunword MK4 - Word processor ROM / expansion
6
7 Software is provided as an expansion device, which uses it own ROM mapping
8
9 The ROM select port will be handled by this device, calling back to the standard driver when necessary.
10 Not enabled for the CPC Plus, as ROM selection wraps after 63, making it impossible to see cartridge
11 banks in the upper ROM area (0x80-0xff)
12 */
13
14 #include "emu.h"
15 #include "brunword4.h"
16
17 DEFINE_DEVICE_TYPE(CPC_BRUNWORD_MK4, cpc_brunword4_device, "cpc_brunword4", "Brunword Elite MK4")
18
19
ROM_START(cpc_brunword4)20 ROM_START( cpc_brunword4 )
21 ROM_REGION( 0xc000, "exp_rom", 0 )
22 ROM_LOAD( "brunw-c1.rom", 0x0000, 0x4000, CRC(3200299b) SHA1(d7d5fcacf3c6707a6629b0c65564ac44267d2b49) )
23 ROM_LOAD( "brunw-c2.rom", 0x4000, 0x4000, CRC(aa19aff1) SHA1(5aa4e87ae6ad2063540e3f5179298657bbd82bfb) )
24 ROM_LOAD( "brunw-c3.rom", 0x8000, 0x4000, CRC(eabe60fe) SHA1(41f605f1e1b5e2bc7dcbd702f2d202ab4d2f44ec) )
25
26 ROM_REGION( 0x80000, "mk4_roms", 0 )
27 ROM_LOAD( "brunw-c0.rom", 0x0000, 0x4000, CRC(45493337) SHA1(a971e2e63adb004c605cf642edde828e8b3ab897) )
28 ROM_LOAD( "brunw-c1.rom", 0x4000, 0x4000, CRC(3200299b) SHA1(d7d5fcacf3c6707a6629b0c65564ac44267d2b49) )
29 ROM_LOAD( "brunw-c2.rom", 0x8000, 0x4000, CRC(aa19aff1) SHA1(5aa4e87ae6ad2063540e3f5179298657bbd82bfb) )
30 ROM_LOAD( "brunw-c3.rom", 0xc000, 0x4000, CRC(eabe60fe) SHA1(41f605f1e1b5e2bc7dcbd702f2d202ab4d2f44ec) )
31 ROM_LOAD( "brunw-c8.rom", 0x10000, 0x4000, CRC(5522b3ee) SHA1(0b7a97134b9d093f668350206e181f1dfc919540) )
32 ROM_LOAD( "brunw-c9.rom", 0x14000, 0x4000, CRC(8ba85101) SHA1(85dec683b5e55f1bba0e5f5ab87380b22743909c) )
33 ROM_LOAD( "brunw-ca.rom", 0x18000, 0x4000, CRC(2c81fe99) SHA1(221370c021dad839884c2fc4f5fbdbc964db99d5) )
34 ROM_LOAD( "brunw-cb.rom", 0x1c000, 0x4000, CRC(e011d6c4) SHA1(bdfb7ee08291bebd30443d4f6bb5b52a4d6468e7) )
35 ROM_LOAD( "brunw-d0.rom", 0x20000, 0x4000, CRC(e2aacb30) SHA1(e75e53991c88e9e586e97be2e6aba8b58c79b7e7) )
36 ROM_LOAD( "brunw-d1.rom", 0x24000, 0x4000, CRC(b166a6bd) SHA1(f070ca29b2046f3b87c3eafdc59ac1e0c6f39755) )
37 ROM_LOAD( "brunw-d2.rom", 0x28000, 0x4000, CRC(5919f1c3) SHA1(227e74fecab244aa2a8baa483679719fa4939cc0) )
38 ROM_LOAD( "brunw-d3.rom", 0x2c000, 0x4000, CRC(d29b6a50) SHA1(de83771d6641c16199412efef4aa706f3da5a1e5) )
39 ROM_LOAD( "brunw-d8.rom", 0x30000, 0x4000, CRC(28cb6163) SHA1(0d9a05d1c7eeaaf8b94ba551df3b2a6fbabcdcc9) )
40 ROM_LOAD( "brunw-d9.rom", 0x34000, 0x4000, CRC(6d528a78) SHA1(fa8659f07ea4b69c0c699fe03c5068a490326ed8) )
41 ROM_LOAD( "brunw-da.rom", 0x38000, 0x4000, CRC(c47589c4) SHA1(6b66d1a24388d95310f536710c5d718472800af0) )
42 ROM_LOAD( "brunw-db.rom", 0x3c000, 0x4000, CRC(af69c4b9) SHA1(a6849e774de05acb5ba3cf76ded132ef4ea7c271) )
43 ROM_LOAD( "brunw-e0.rom", 0x40000, 0x4000, CRC(aef8fdbb) SHA1(425b863df65f106753ce258ed445b8edb3428ad7) )
44 ROM_LOAD( "brunw-e1.rom", 0x44000, 0x4000, CRC(7508b568) SHA1(1d7581fafd0f1119a60b9fc108e60a4274d182ab) )
45 ROM_LOAD( "brunw-e2.rom", 0x48000, 0x4000, CRC(c7f9a0f6) SHA1(2f89841ab4431a400491c49b20a484375ddebda9) )
46 ROM_LOAD( "brunw-e3.rom", 0x4c000, 0x4000, CRC(1adab4cd) SHA1(82e0a30f16b7b6ca5f65da691c5a84ff0aff9dcf) )
47 ROM_LOAD( "brunw-e8.rom", 0x50000, 0x4000, CRC(2450e2b3) SHA1(a85f67ef5f683634ef82f4eee6306be44b6d5f9b) )
48 ROM_LOAD( "brunw-e9.rom", 0x54000, 0x4000, CRC(f2d6084c) SHA1(8f9b24478dfb4df691d8f7a13bb7e676766f9154) )
49 ROM_LOAD( "brunw-ea.rom", 0x58000, 0x4000, CRC(213176b8) SHA1(61d60a10f12d09045801de013346c889ae194985) )
50 ROM_LOAD( "brunw-eb.rom", 0x5c000, 0x4000, CRC(ae811538) SHA1(c92169b385599e0c2ceead17d81689adea9dd164) )
51 ROM_LOAD( "brunw-f0.rom", 0x60000, 0x4000, CRC(b3ebc6d3) SHA1(b01e6d23eca4cafca7a7102669fd77a158796159) )
52 ROM_LOAD( "brunw-f1.rom", 0x64000, 0x4000, CRC(8faae309) SHA1(1caa585a2c4e1f0ffe6923aa9aaf66e4b0275e17) )
53 ROM_LOAD( "brunw-f2.rom", 0x68000, 0x4000, CRC(e6afde30) SHA1(3f1e06ebd8319822de25ed731d9e95ec22568c3d) )
54 ROM_LOAD( "brunw-f3.rom", 0x6c000, 0x4000, CRC(637d4c20) SHA1(233ae9507bfbea0ae1e8a3b068e1b19df0151a72) )
55 ROM_LOAD( "brunw-f8.rom", 0x70000, 0x4000, CRC(2be3aa82) SHA1(b1896b4f78869632fa5a08a82e126a7ba041e00f) )
56 ROM_LOAD( "brunw-f9.rom", 0x74000, 0x4000, CRC(0645f1d0) SHA1(83634937142def1e96306d4be53b491da9f5a25d) )
57 ROM_LOAD( "brunw-fa.rom", 0x78000, 0x4000, CRC(f99b181e) SHA1(0533e96a71d2a694efcc7677a446af7fee1eb463) )
58 ROM_LOAD( "brunw-fb.rom", 0x7c000, 0x4000, CRC(88383953) SHA1(50c6417b26134b68a80912bdb91c8578eb00c8a2) )
59 ROM_END
60
61 const tiny_rom_entry *cpc_brunword4_device::device_rom_region() const
62 {
63 return ROM_NAME( cpc_brunword4 );
64 }
65
cpc_brunword4_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)66 cpc_brunword4_device::cpc_brunword4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
67 device_t(mconfig, CPC_BRUNWORD_MK4, tag, owner, clock),
68 device_cpc_expansion_card_interface(mconfig, *this),
69 m_slot(nullptr), m_rombank_active(false), m_bank_sel(0)
70 {
71 }
72
device_start()73 void cpc_brunword4_device::device_start()
74 {
75 m_slot = dynamic_cast<cpc_expansion_slot_device *>(owner());
76 address_space &space = m_slot->cpu().space(AS_IO);
77 space.install_write_handler(0xdf00,0xdfff, write8smo_delegate(*this, FUNC(cpc_brunword4_device::rombank_w)));
78 }
79
device_reset()80 void cpc_brunword4_device::device_reset()
81 {
82 m_rombank_active = false;
83 }
84
rombank_w(uint8_t data)85 void cpc_brunword4_device::rombank_w(uint8_t data)
86 {
87 if((data & 0xc0) == 0xc0 && (data & 0x04) == 0)
88 {
89 m_bank_sel = data;
90 m_rombank_active = true;
91 return;
92 }
93 if((data & 0xc0) == 0x40) // disable ROM?
94 {
95 m_rombank_active = false;
96 return;
97 }
98 m_slot->rom_select(data & 0x3f); // repeats every 64 ROMs, this breaks upper cart ROM selection on the Plus
99 }
100
set_mapping(uint8_t type)101 void cpc_brunword4_device::set_mapping(uint8_t type)
102 {
103 if(type != MAP_OTHER)
104 return;
105 if(m_rombank_active)
106 {
107 uint8_t* ROM = memregion("mk4_roms")->base();
108 uint8_t bank = ((m_bank_sel & 0x38) >> 1) | (m_bank_sel & 0x03);
109 membank(":bank3")->set_base(ROM+(bank*0x4000));
110 membank(":bank4")->set_base(ROM+((bank*0x4000) + 0x2000));
111 }
112 }
113