mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
(nw) sorcerer: added tap; cleanup
This commit is contained in:
parent
931b1c09d1
commit
1dc7f42006
@ -169,22 +169,16 @@ Exidy Sorcerer Video/Disk Unit:
|
||||
#include "softlist.h"
|
||||
#include "speaker.h"
|
||||
|
||||
#define FLOPPY_0 "floppy0"
|
||||
#define FLOPPY_1 "floppy1"
|
||||
#define FLOPPY_2 "floppy2"
|
||||
#define FLOPPY_3 "floppy3"
|
||||
|
||||
|
||||
void sorcerer_state::sorcerer_mem(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
map(0x0000, 0x07ff).bankrw("boot");
|
||||
map(0x0800, 0xbfff).ram();
|
||||
map(0x0000, 0xbfff).ram();
|
||||
//map(0xc000, 0xdfff).rom(); // mapped by the cartslot
|
||||
map(0xe000, 0xefff).rom(); /* rom pac and bios */
|
||||
map(0xf000, 0xf7ff).ram().region("maincpu", 0xf000); /* screen ram */
|
||||
map(0xf800, 0xfbff).rom(); /* char rom */
|
||||
map(0xfc00, 0xffff).ram().region("maincpu", 0xfc00); /* programmable chars */
|
||||
map(0xe000, 0xefff).rom().region("maincpu", 0).nopw(); // bios
|
||||
map(0xf000, 0xf7ff).ram(); // screen ram
|
||||
map(0xf800, 0xfbff).rom().region("chargen", 0).nopw(); // inbuilt characters
|
||||
map(0xfc00, 0xffff).ram(); // PCG
|
||||
}
|
||||
|
||||
void sorcerer_state::sorcererb_mem(address_map &map)
|
||||
@ -194,13 +188,12 @@ void sorcerer_state::sorcererb_mem(address_map &map)
|
||||
map(0xc000, 0xdfff).ram();
|
||||
}
|
||||
|
||||
void sorcerer_state::sorcererd_mem(address_map &map)
|
||||
void sorcererd_state::sorcererd_mem(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
sorcerer_mem(map);
|
||||
map(0xbc00, 0xbcff).rom();
|
||||
map(0xbc00, 0xbfff).rom().region("diskboot", 0).nopw();
|
||||
map(0xbe00, 0xbe03).rw(m_fdc, FUNC(micropolis_device::read), FUNC(micropolis_device::write));
|
||||
map(0xbf00, 0xbfff).rom();
|
||||
}
|
||||
|
||||
void sorcerer_state::sorcerer_io(address_map &map)
|
||||
@ -208,10 +201,10 @@ void sorcerer_state::sorcerer_io(address_map &map)
|
||||
map.global_mask(0xff);
|
||||
map.unmap_value_high();
|
||||
map(0xfc, 0xfc).rw(m_uart, FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit));
|
||||
map(0xfd, 0xfd).rw(FUNC(sorcerer_state::port_fd_r), FUNC(sorcerer_state::port_fd_w));
|
||||
map(0xfe, 0xfe).rw(FUNC(sorcerer_state::port_fe_r), FUNC(sorcerer_state::port_fe_w));
|
||||
map(0xfd, 0xfd).rw(FUNC(sorcerer_state::portfd_r), FUNC(sorcerer_state::portfd_w));
|
||||
map(0xfe, 0xfe).rw(FUNC(sorcerer_state::portfe_r), FUNC(sorcerer_state::portfe_w));
|
||||
map(0xff, 0xff).r("cent_status_in", FUNC(input_buffer_device::read));
|
||||
map(0xff, 0xff).w(FUNC(sorcerer_state::port_ff_w));
|
||||
map(0xff, 0xff).w(FUNC(sorcerer_state::portff_w));
|
||||
}
|
||||
|
||||
void sorcerer_state::sorcerera_io(address_map &map)
|
||||
@ -233,13 +226,13 @@ void sorcerer_state::sorcererb_io(address_map &map)
|
||||
map(0x38, 0x3b).rw(m_dma, FUNC(z80dma_device::read), FUNC(z80dma_device::write));
|
||||
}
|
||||
|
||||
void sorcerer_state::sorcererd_io(address_map &map)
|
||||
void sorcererd_state::sorcererd_io(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
map.unmap_value_high();
|
||||
sorcerer_io(map);
|
||||
map(0x28, 0x2b).rw(m_fdc2, FUNC(fd1793_device::read), FUNC(fd1793_device::write));
|
||||
map(0x2c, 0x2f).w(FUNC(sorcerer_state::port2c_w));
|
||||
map(0x2c, 0x2f).w(FUNC(sorcererd_state::port2c_w));
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START(sorcerer)
|
||||
@ -379,7 +372,7 @@ INPUT_PORTS_END
|
||||
static const gfx_layout sorcerer_charlayout =
|
||||
{
|
||||
8, 8, /* 8 x 8 characters */
|
||||
256, /* 256 characters */
|
||||
128, /* 256 characters */
|
||||
1, /* 1 bits per pixel */
|
||||
{ 0 }, /* no bitplanes */
|
||||
/* x offsets */
|
||||
@ -391,18 +384,14 @@ static const gfx_layout sorcerer_charlayout =
|
||||
|
||||
/* This will show the 128 characters in the ROM + whatever happens to be in the PCG */
|
||||
static GFXDECODE_START( gfx_sorcerer )
|
||||
GFXDECODE_ENTRY( "maincpu", 0xf800, sorcerer_charlayout, 0, 1 )
|
||||
GFXDECODE_ENTRY( "chargen", 0x0000, sorcerer_charlayout, 0, 1 )
|
||||
GFXDECODE_END
|
||||
|
||||
void sorcerer_state::video_start()
|
||||
{
|
||||
m_p_videoram = memregion("maincpu")->base()+0xf000;
|
||||
}
|
||||
|
||||
uint32_t sorcerer_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
address_space& program = m_maincpu->space(AS_PROGRAM);
|
||||
uint8_t y,ra,chr,gfx;
|
||||
uint16_t sy=0,ma=0x80,x;
|
||||
uint16_t sy=0,ma=0xf080,x;
|
||||
uint16_t *p;
|
||||
|
||||
for (y = 0; y < 30; y++)
|
||||
@ -413,10 +402,10 @@ uint32_t sorcerer_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
|
||||
|
||||
for (x = ma; x < ma+64; x++)
|
||||
{
|
||||
chr = m_p_videoram[x];
|
||||
chr = program.read_byte(x);
|
||||
|
||||
/* get pattern of pixels for that character scanline */
|
||||
gfx = m_p_videoram[0x800 | (chr<<3) | ra];
|
||||
gfx = program.read_byte(0xf800 | (chr<<3) | ra);
|
||||
|
||||
/* Display a scanline of a character */
|
||||
*p++ = BIT(gfx, 7);
|
||||
@ -524,13 +513,16 @@ static void floppies(device_slot_interface &device)
|
||||
device.option_add("525qd", FLOPPY_525_QD);
|
||||
}
|
||||
|
||||
void sorcerer_state::sorcererd(machine_config &config)
|
||||
#define FLOPPY_0 "floppy0"
|
||||
#define FLOPPY_1 "floppy1"
|
||||
#define FLOPPY_2 "floppy2"
|
||||
#define FLOPPY_3 "floppy3"
|
||||
|
||||
void sorcererd_state::sorcererd(machine_config &config)
|
||||
{
|
||||
sorcerer(config);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sorcerer_state::sorcererd_mem);
|
||||
m_maincpu->set_addrmap(AS_IO, &sorcerer_state::sorcererd_io);
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(sorcerer_state, sorcererd )
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sorcererd_state::sorcererd_mem);
|
||||
m_maincpu->set_addrmap(AS_IO, &sorcererd_state::sorcererd_io);
|
||||
|
||||
MICROPOLIS(config, m_fdc, 0);
|
||||
m_fdc->set_drive_tags(FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3);
|
||||
@ -541,9 +533,9 @@ void sorcerer_state::sorcererd(machine_config &config)
|
||||
LEGACY_FLOPPY(config, FLOPPY_3, 0, &sorcerer_floppy_interface);
|
||||
|
||||
FD1793(config, m_fdc2, 8_MHz_XTAL / 8); // confirmed clock
|
||||
m_fdc2->set_force_ready(true); // should be able to get rid of this when fdc issue is fixed
|
||||
m_fdc2->intrq_wr_callback().set(FUNC(sorcerer_state::intrq2_w));
|
||||
m_fdc2->drq_wr_callback().set(FUNC(sorcerer_state::drq2_w));
|
||||
m_fdc2->set_force_ready(true);
|
||||
m_fdc2->intrq_wr_callback().set([this] (bool state) { sorcererd_state::intrq2_w(state); });
|
||||
m_fdc2->drq_wr_callback().set([this] (bool state) { sorcererd_state::drq2_w(state); });
|
||||
FLOPPY_CONNECTOR(config, "fdc2:0", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, "fdc2:1", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
|
||||
SOFTWARE_LIST(config, "flop_list").set_original("sorcerer_flop");
|
||||
@ -555,11 +547,9 @@ void sorcerer_state::sorcerera(machine_config &config)
|
||||
m_maincpu->set_addrmap(AS_IO, &sorcerer_state::sorcerera_io);
|
||||
m_maincpu->halt_cb().set([this] (bool state) { m_halt = state; }); // 1 = halted
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(sorcerer_state, sorcererd )
|
||||
|
||||
WD2793(config, m_fdc4, 4_MHz_XTAL / 2);
|
||||
m_fdc4->intrq_wr_callback().set(FUNC(sorcerer_state::intrq4_w));
|
||||
m_fdc4->drq_wr_callback().set(FUNC(sorcerer_state::intrq4_w));
|
||||
m_fdc4->intrq_wr_callback().set([this] (bool state) { sorcerer_state::intrq4_w(state); });
|
||||
m_fdc4->drq_wr_callback().set([this] (bool state) { sorcerer_state::intrq4_w(state); });
|
||||
FLOPPY_CONNECTOR(config, "fdc4:0", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, "fdc4:1", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, "fdc4:2", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
|
||||
@ -577,10 +567,8 @@ void sorcerer_state::sorcererb(machine_config &config)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sorcerer_state::sorcererb_mem);
|
||||
m_maincpu->set_addrmap(AS_IO, &sorcerer_state::sorcererb_io);
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(sorcerer_state, sorcererd )
|
||||
|
||||
Z80DMA(config, m_dma, ES_CPU_CLOCK);
|
||||
m_dma->out_busreq_callback().set(FUNC(sorcerer_state::busreq_w));
|
||||
m_dma->out_busreq_callback().set([this] (bool state) {sorcerer_state::busreq_w(state); });
|
||||
m_dma->in_mreq_callback().set(FUNC(sorcerer_state::memory_read_byte));
|
||||
m_dma->out_mreq_callback().set(FUNC(sorcerer_state::memory_write_byte));
|
||||
m_dma->in_iorq_callback().set(FUNC(sorcerer_state::io_read_byte));
|
||||
@ -595,6 +583,7 @@ void sorcerer_state::sorcererb(machine_config &config)
|
||||
FLOPPY_CONNECTOR(config, "fdc3:3", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
|
||||
//SOFTWARE_LIST(config, "flop_list").set_original("sorcerer_flop"); // no suitable software yet
|
||||
|
||||
config.device_remove("cart_list");
|
||||
config.device_remove("cartslot");
|
||||
|
||||
// internal ram
|
||||
@ -602,11 +591,6 @@ void sorcerer_state::sorcererb(machine_config &config)
|
||||
RAM(config, RAM_TAG).set_default_size("56K"); // must have 56k to be able to boot CP/M floppy
|
||||
}
|
||||
|
||||
void sorcerer_state::init_sorcerer()
|
||||
{
|
||||
uint8_t *RAM = memregion("maincpu")->base();
|
||||
membank("boot")->configure_entries(0, 2, &RAM[0x0000], 0xe000);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
@ -614,90 +598,114 @@ void sorcerer_state::init_sorcerer()
|
||||
|
||||
***************************************************************************/
|
||||
ROM_START(sorcerer)
|
||||
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
|
||||
ROM_LOAD("exmo1-1.1e", 0xe000, 0x0800, CRC(ac924f67) SHA1(72fcad6dd1ed5ec0527f967604401284d0e4b6a1) ) /* monitor roms */
|
||||
ROM_LOAD("exmo1-2.2e", 0xe800, 0x0800, CRC(ead1d0f6) SHA1(c68bed7344091bca135e427b4793cc7d49ca01be) )
|
||||
ROM_LOAD("exchr-1.20d", 0xf800, 0x0400, CRC(4a7e1cdd) SHA1(2bf07a59c506b6e0c01ec721fb7b747b20f5dced) ) /* char rom */
|
||||
ROM_REGION( 0x1000, "maincpu", 0 )
|
||||
ROM_LOAD("exmo1-1.1e", 0x0000, 0x0800, CRC(ac924f67) SHA1(72fcad6dd1ed5ec0527f967604401284d0e4b6a1) )
|
||||
ROM_LOAD("exmo1-2.2e", 0x0800, 0x0800, CRC(ead1d0f6) SHA1(c68bed7344091bca135e427b4793cc7d49ca01be) )
|
||||
|
||||
ROM_REGION( 0x0400, "chargen", 0)
|
||||
ROM_LOAD("exchr-1.20d", 0x0000, 0x0400, CRC(4a7e1cdd) SHA1(2bf07a59c506b6e0c01ec721fb7b747b20f5dced) )
|
||||
|
||||
ROM_REGION( 0x0400, "proms", 0 ) // unused
|
||||
ROM_LOAD_OPTIONAL("bruce.15b", 0x0000, 0x0020, CRC(fae922cb) SHA1(470a86844cfeab0d9282242e03ff1d8a1b2238d1) ) // video prom type 6331
|
||||
ROM_END
|
||||
|
||||
ROM_START(sorcererd)
|
||||
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
|
||||
ROM_LOAD("diskboot.dat", 0xbc00, 0x0100, CRC(d82a40d6) SHA1(cd1ef5fb0312cd1640e0853d2442d7d858bc3e3b) ) // micropolis floppy boot
|
||||
ROM_LOAD("boot.bin", 0xbf00, 0x0100, CRC(352e36bc) SHA1(99678e3cc4f315a0cf7d52aae511e405dc314190) ) // video/disk unit floppy boot
|
||||
ROM_LOAD("exchr-1.20d", 0xf800, 0x0400, CRC(4a7e1cdd) SHA1(2bf07a59c506b6e0c01ec721fb7b747b20f5dced) ) /* char rom */
|
||||
ROM_REGION( 0x1000, "maincpu", 0 )
|
||||
ROM_SYSTEM_BIOS(0, "standard", "Standard") // To boot floppy in flop1, GO BC00
|
||||
ROMX_LOAD("exmo1-1.1e", 0xe000, 0x0800, CRC(ac924f67) SHA1(72fcad6dd1ed5ec0527f967604401284d0e4b6a1), ROM_BIOS(0) ) /* monitor roms */
|
||||
ROMX_LOAD("exmo1-2.2e", 0xe800, 0x0800, CRC(ead1d0f6) SHA1(c68bed7344091bca135e427b4793cc7d49ca01be), ROM_BIOS(0) )
|
||||
ROMX_LOAD("exmo1-1.1e", 0x0000, 0x0800, CRC(ac924f67) SHA1(72fcad6dd1ed5ec0527f967604401284d0e4b6a1), ROM_BIOS(0) )
|
||||
ROMX_LOAD("exmo1-2.2e", 0x0800, 0x0800, CRC(ead1d0f6) SHA1(c68bed7344091bca135e427b4793cc7d49ca01be), ROM_BIOS(0) )
|
||||
ROM_SYSTEM_BIOS(1, "sm705", "ESAG 1.3/B") // To boot floppy in flop5, press Ctrl-X
|
||||
ROMX_LOAD("right.1e", 0xe000, 0x0800, CRC(95586fea) SHA1(9263b0c5f059b70799e0704aa18437b04487e1b0), ROM_BIOS(1) )
|
||||
ROMX_LOAD("right.1e", 0x0000, 0x0800, CRC(95586fea) SHA1(9263b0c5f059b70799e0704aa18437b04487e1b0), ROM_BIOS(1) )
|
||||
ROM_IGNORE(0x800)
|
||||
ROMX_LOAD("left.2e", 0xe800, 0x0800, CRC(153d1628) SHA1(e9421e8eeaa5945d0e1e5135058bfe9796db8458), ROM_BIOS(1) )
|
||||
ROMX_LOAD("left.2e", 0x0800, 0x0800, CRC(153d1628) SHA1(e9421e8eeaa5945d0e1e5135058bfe9796db8458), ROM_BIOS(1) )
|
||||
ROM_IGNORE(0x800)
|
||||
ROM_SYSTEM_BIOS(2, "sm658", "Standard Monitor 658 ver 1.3/C") // To boot floppy in flop5, press Ctrl-X
|
||||
ROMX_LOAD("13c.1e", 0xe000, 0x0800, CRC(c3c56505) SHA1(6b88f9911b897825b10f8184ddf27af5d8cbdc4d), ROM_BIOS(2) )
|
||||
ROMX_LOAD("13c.2e", 0xe800, 0x0800, CRC(e1ac92a8) SHA1(302096c500cc87f0441f000a01b5ddfa3c102662), ROM_BIOS(2) )
|
||||
ROMX_LOAD("13c.1e", 0x0000, 0x0800, CRC(c3c56505) SHA1(6b88f9911b897825b10f8184ddf27af5d8cbdc4d), ROM_BIOS(2) )
|
||||
ROMX_LOAD("13c.2e", 0x0800, 0x0800, CRC(e1ac92a8) SHA1(302096c500cc87f0441f000a01b5ddfa3c102662), ROM_BIOS(2) )
|
||||
|
||||
ROM_REGION( 0x0400, "proms", 0 )
|
||||
ROM_LOAD_OPTIONAL("bruce.15b", 0x0000, 0x0020, CRC(fae922cb) SHA1(470a86844cfeab0d9282242e03ff1d8a1b2238d1) ) /* video prom type 6331 */
|
||||
ROM_REGION( 0x0400, "chargen", 0)
|
||||
ROM_LOAD("exchr-1.20d", 0x0000, 0x0400, CRC(4a7e1cdd) SHA1(2bf07a59c506b6e0c01ec721fb7b747b20f5dced) )
|
||||
|
||||
ROM_REGION( 0x0400, "diskboot", 0)
|
||||
ROM_LOAD("diskboot.dat", 0x0000, 0x0100, CRC(d82a40d6) SHA1(cd1ef5fb0312cd1640e0853d2442d7d858bc3e3b) ) // micropolis floppy boot
|
||||
ROM_LOAD("boot.bin", 0x0300, 0x0100, CRC(352e36bc) SHA1(99678e3cc4f315a0cf7d52aae511e405dc314190) ) // video/disk unit floppy boot
|
||||
|
||||
ROM_REGION( 0x0400, "proms", 0 ) // unused
|
||||
ROM_LOAD_OPTIONAL("bruce.15b", 0x0000, 0x0020, CRC(fae922cb) SHA1(470a86844cfeab0d9282242e03ff1d8a1b2238d1) ) // video prom type 6331
|
||||
// from video/disk unit
|
||||
ROM_LOAD_OPTIONAL("sad4e.4e", 0x0100, 0x0100, CRC(b468a3f9) SHA1(8546f834901349baf59fc436c1a7cc57d541cddd) )
|
||||
ROM_LOAD_OPTIONAL("l.2e", 0x0200, 0x0100, CRC(9cb2500e) SHA1(d473c8dc042a4ace75174a93069fc0e9451763bd) )
|
||||
ROM_LOAD_OPTIONAL("h.3e", 0x0300, 0x0100, CRC(3c6163fb) SHA1(60ecefe461357eacfca64427931db6472283d0e3) )
|
||||
ROM_LOAD_OPTIONAL("sad4e.4e", 0x0100, 0x0100, CRC(b468a3f9) SHA1(8546f834901349baf59fc436c1a7cc57d541cddd) )
|
||||
ROM_LOAD_OPTIONAL("l.2e", 0x0200, 0x0100, CRC(9cb2500e) SHA1(d473c8dc042a4ace75174a93069fc0e9451763bd) )
|
||||
ROM_LOAD_OPTIONAL("h.3e", 0x0300, 0x0100, CRC(3c6163fb) SHA1(60ecefe461357eacfca64427931db6472283d0e3) )
|
||||
ROM_END
|
||||
|
||||
ROM_START(sorcerer2)
|
||||
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
|
||||
ROM_LOAD("exchr-1.20d", 0xf800, 0x0400, CRC(4a7e1cdd) SHA1(2bf07a59c506b6e0c01ec721fb7b747b20f5dced) ) /* char rom */
|
||||
ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASEFF )
|
||||
ROM_SYSTEM_BIOS(0, "standard", "Standard")
|
||||
ROMX_LOAD("exm011-1.1e", 0xe000, 0x0800, CRC(af9394dc) SHA1(d7e0ada64d72d33e0790690be86a36020b41fd0d), ROM_BIOS(0) )
|
||||
ROMX_LOAD("exm011-2.2e", 0xe800, 0x0800, CRC(49978d6c) SHA1(b94127bfe99e5dc1cf5dbbb7d1b099b0ca036cd0), ROM_BIOS(0) )
|
||||
ROMX_LOAD("exm011-1.1e", 0x0000, 0x0800, CRC(af9394dc) SHA1(d7e0ada64d72d33e0790690be86a36020b41fd0d), ROM_BIOS(0) )
|
||||
ROMX_LOAD("exm011-2.2e", 0x0800, 0x0800, CRC(49978d6c) SHA1(b94127bfe99e5dc1cf5dbbb7d1b099b0ca036cd0), ROM_BIOS(0) )
|
||||
ROM_SYSTEM_BIOS(1, "dwmon22a", "DWMON 2.2A")
|
||||
ROMX_LOAD("dwmon22a.1e", 0xe000, 0x0800, CRC(82f78769) SHA1(6b999738c160557452fc25cbbe9339cfe651768b), ROM_BIOS(1) )
|
||||
ROMX_LOAD("dwmon22a.2e", 0xe800, 0x0800, CRC(6239871b) SHA1(e687bc9669c310a3d2debb87f79d168017f35f34), ROM_BIOS(1) )
|
||||
ROMX_LOAD("dwmon22a.1e", 0x0000, 0x0800, CRC(82f78769) SHA1(6b999738c160557452fc25cbbe9339cfe651768b), ROM_BIOS(1) )
|
||||
ROMX_LOAD("dwmon22a.2e", 0x0800, 0x0800, CRC(6239871b) SHA1(e687bc9669c310a3d2debb87f79d168017f35f34), ROM_BIOS(1) )
|
||||
ROM_SYSTEM_BIOS(2, "dwmon22c", "DWMON 2.2C")
|
||||
ROMX_LOAD("dwmon22c.1e", 0xe000, 0x0800, CRC(a22db498) SHA1(ebedbce7454007f5a02fafe449fd09169173d7b3), ROM_BIOS(2) )
|
||||
ROMX_LOAD("dwmon22c.2e", 0xe800, 0x0800, CRC(7b22b65a) SHA1(7f23dd308f34b6d795d6df06f2387dfd17f69edd), ROM_BIOS(2) )
|
||||
ROMX_LOAD("dwmon22c.1e", 0x0000, 0x0800, CRC(a22db498) SHA1(ebedbce7454007f5a02fafe449fd09169173d7b3), ROM_BIOS(2) )
|
||||
ROMX_LOAD("dwmon22c.2e", 0x0800, 0x0800, CRC(7b22b65a) SHA1(7f23dd308f34b6d795d6df06f2387dfd17f69edd), ROM_BIOS(2) )
|
||||
ROM_SYSTEM_BIOS(3, "ddmon", "DDMON 1.3")
|
||||
ROMX_LOAD("ddmon.1e", 0xe000, 0x0800, CRC(6ce481da) SHA1(c927762b29a281b7c13d59bb17ea56494c64569b), ROM_BIOS(3) )
|
||||
ROMX_LOAD("ddmon.2e", 0xe800, 0x0800, CRC(50069b13) SHA1(0808018830fac15cceaed8ff2b19900f77447470), ROM_BIOS(3) )
|
||||
ROMX_LOAD("ddmon.1e", 0x0000, 0x0800, CRC(6ce481da) SHA1(c927762b29a281b7c13d59bb17ea56494c64569b), ROM_BIOS(3) )
|
||||
ROMX_LOAD("ddmon.2e", 0x0800, 0x0800, CRC(50069b13) SHA1(0808018830fac15cceaed8ff2b19900f77447470), ROM_BIOS(3) )
|
||||
ROM_SYSTEM_BIOS(4, "adsmon", "ADSMON") // This requires an unemulated 80-column card. You can type 64 to get 64-columns, but it's mostly off the side.
|
||||
ROMX_LOAD("adsmon.1e", 0xe000, 0x0800, CRC(460f981a) SHA1(bdae1d87b9e8ae2cae11663acd349b9ed2387094), ROM_BIOS(4) )
|
||||
ROMX_LOAD("adsmon.2e", 0xe800, 0x0800, CRC(cb3f1dda) SHA1(3fc14306e83d73b9b9afd9b543566e52ba3e008f), ROM_BIOS(4) )
|
||||
ROMX_LOAD("adsmon.1e", 0x0000, 0x0800, CRC(460f981a) SHA1(bdae1d87b9e8ae2cae11663acd349b9ed2387094), ROM_BIOS(4) )
|
||||
ROMX_LOAD("adsmon.2e", 0x0800, 0x0800, CRC(cb3f1dda) SHA1(3fc14306e83d73b9b9afd9b543566e52ba3e008f), ROM_BIOS(4) )
|
||||
ROM_SYSTEM_BIOS(5, "tvc", "TVI-MON-C-V1.5") // unknown disk support (BO is the floppy boot command)
|
||||
ROMX_LOAD("tvc-1.1e", 0xe000, 0x0800, CRC(efc15a18) SHA1(3dee821270a0d83453b18baed88a024dfd0d7a6c), ROM_BIOS(5) )
|
||||
ROMX_LOAD("tvc-2.2e", 0xe800, 0x0800, CRC(bc194487) SHA1(dcfd916558e3e3be22091c5558ea633c332cf6c7), ROM_BIOS(5) )
|
||||
ROMX_LOAD("tvc-1.1e", 0x0000, 0x0800, CRC(efc15a18) SHA1(3dee821270a0d83453b18baed88a024dfd0d7a6c), ROM_BIOS(5) )
|
||||
ROMX_LOAD("tvc-2.2e", 0x0800, 0x0800, CRC(bc194487) SHA1(dcfd916558e3e3be22091c5558ea633c332cf6c7), ROM_BIOS(5) )
|
||||
|
||||
ROM_REGION( 0x0400, "chargen", 0)
|
||||
ROM_LOAD("exchr-1.20d", 0x0000, 0x0400, CRC(4a7e1cdd) SHA1(2bf07a59c506b6e0c01ec721fb7b747b20f5dced) )
|
||||
|
||||
ROM_REGION( 0x0400, "proms", 0 ) // unused
|
||||
ROM_LOAD_OPTIONAL("bruce.15b", 0x0000, 0x0020, CRC(fae922cb) SHA1(470a86844cfeab0d9282242e03ff1d8a1b2238d1) ) // video prom type 6331
|
||||
ROM_END
|
||||
|
||||
ROM_START(sorcerera)
|
||||
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
|
||||
ROM_LOAD("exchr-1.20d", 0xf800, 0x0400, CRC(4a7e1cdd) SHA1(2bf07a59c506b6e0c01ec721fb7b747b20f5dced) ) /* char rom */
|
||||
ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASEFF )
|
||||
ROM_SYSTEM_BIOS(0, "scuamon6434", "SCUAMON64 3.4")
|
||||
ROMX_LOAD("scua34.1e", 0xe000, 0x1000, CRC(7ff21d97) SHA1(b936cda0f2acb655fb4c1a4e7976274558543c7e), ROM_BIOS(0) )
|
||||
ROMX_LOAD("scua34.1e", 0x0000, 0x1000, CRC(7ff21d97) SHA1(b936cda0f2acb655fb4c1a4e7976274558543c7e), ROM_BIOS(0) )
|
||||
|
||||
ROM_REGION( 0x0400, "chargen", 0)
|
||||
ROM_LOAD("exchr-1.20d", 0x0000, 0x0400, CRC(4a7e1cdd) SHA1(2bf07a59c506b6e0c01ec721fb7b747b20f5dced) )
|
||||
|
||||
ROM_REGION( 0x0400, "proms", 0 ) // unused
|
||||
ROM_LOAD_OPTIONAL("bruce.15b", 0x0000, 0x0020, CRC(fae922cb) SHA1(470a86844cfeab0d9282242e03ff1d8a1b2238d1) ) // video prom type 6331
|
||||
ROM_END
|
||||
|
||||
ROM_START(sorcererb)
|
||||
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
|
||||
ROM_LOAD("exchr-1.20d", 0xf800, 0x0400, CRC(4a7e1cdd) SHA1(2bf07a59c506b6e0c01ec721fb7b747b20f5dced) ) /* char rom */
|
||||
ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASEFF )
|
||||
ROM_SYSTEM_BIOS(0, "scuamon64", "SCUAMON64") // DI to boot floppy
|
||||
ROMX_LOAD("scua1.1e", 0xe000, 0x0800, CRC(0fcf1de9) SHA1(db8371eabf50a9da43ec7f717279a31754351359), ROM_BIOS(0) )
|
||||
ROM_CONTINUE(0xe000, 0x800)
|
||||
ROMX_LOAD("scua1.2e", 0xe800, 0x0800, CRC(aa9a6ca6) SHA1(bcaa7457a1b892ed82c1a04ee21a619faa7c1a16), ROM_BIOS(0) )
|
||||
ROM_CONTINUE(0xe800, 0x800)
|
||||
ROMX_LOAD("scua1.1e", 0x0000, 0x0800, CRC(0fcf1de9) SHA1(db8371eabf50a9da43ec7f717279a31754351359), ROM_BIOS(0) )
|
||||
ROM_CONTINUE(0x0000, 0x800)
|
||||
ROMX_LOAD("scua1.2e", 0x0800, 0x0800, CRC(aa9a6ca6) SHA1(bcaa7457a1b892ed82c1a04ee21a619faa7c1a16), ROM_BIOS(0) )
|
||||
ROM_CONTINUE(0x0800, 0x800)
|
||||
ROM_SYSTEM_BIOS(1, "scuamon80", "SCUAMON80 1.0") // This works with disks, but requires an unemulated 80-column card.
|
||||
ROMX_LOAD("scua1.1e", 0xe000, 0x0800, CRC(0fcf1de9) SHA1(db8371eabf50a9da43ec7f717279a31754351359), ROM_BIOS(1) )
|
||||
ROMX_LOAD("scua1.1e", 0x0000, 0x0800, CRC(0fcf1de9) SHA1(db8371eabf50a9da43ec7f717279a31754351359), ROM_BIOS(1) )
|
||||
ROM_IGNORE(0x800)
|
||||
ROMX_LOAD("scua1.2e", 0xe800, 0x0800, CRC(aa9a6ca6) SHA1(bcaa7457a1b892ed82c1a04ee21a619faa7c1a16), ROM_BIOS(1) )
|
||||
ROMX_LOAD("scua1.2e", 0x0800, 0x0800, CRC(aa9a6ca6) SHA1(bcaa7457a1b892ed82c1a04ee21a619faa7c1a16), ROM_BIOS(1) )
|
||||
ROM_IGNORE(0x800)
|
||||
ROM_SYSTEM_BIOS(2, "scuamon64dd", "SCUAMON64DD") // DI to boot floppy
|
||||
ROMX_LOAD("devinb.1e", 0xe000, 0x0800, CRC(a2ea2f93) SHA1(8f9298f1641806dfba819ead318a4838385223fe), ROM_BIOS(2) )
|
||||
ROM_CONTINUE(0xe000, 0x800)
|
||||
ROMX_LOAD("devinb.2e", 0xe800, 0x0800, CRC(4d9ea9a5) SHA1(1a3c8cf98d4caed6044b1b01cd79dcd9c61dc1e1), ROM_BIOS(2) )
|
||||
ROM_CONTINUE(0xe800, 0x800)
|
||||
ROMX_LOAD("devinb.1e", 0x0000, 0x0800, CRC(a2ea2f93) SHA1(8f9298f1641806dfba819ead318a4838385223fe), ROM_BIOS(2) )
|
||||
ROM_CONTINUE(0x0000, 0x800)
|
||||
ROMX_LOAD("devinb.2e", 0x0800, 0x0800, CRC(4d9ea9a5) SHA1(1a3c8cf98d4caed6044b1b01cd79dcd9c61dc1e1), ROM_BIOS(2) )
|
||||
ROM_CONTINUE(0x0800, 0x800)
|
||||
|
||||
ROM_REGION( 0x0400, "chargen", 0)
|
||||
ROM_LOAD("exchr-1.20d", 0x0000, 0x0400, CRC(4a7e1cdd) SHA1(2bf07a59c506b6e0c01ec721fb7b747b20f5dced) )
|
||||
|
||||
ROM_REGION( 0x0400, "proms", 0 ) // unused
|
||||
ROM_LOAD_OPTIONAL("bruce.15b", 0x0000, 0x0020, CRC(fae922cb) SHA1(470a86844cfeab0d9282242e03ff1d8a1b2238d1) ) // video prom type 6331
|
||||
ROM_END
|
||||
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME */
|
||||
COMP( 1979, sorcerer, 0, 0, sorcerer, sorcerer, sorcerer_state, init_sorcerer, "Exidy Inc", "Sorcerer", 0 )
|
||||
COMP( 1979, sorcerer2, sorcerer, 0, sorcerer, sorcerer, sorcerer_state, init_sorcerer, "Exidy Inc", "Sorcerer 2", 0 )
|
||||
COMP( 1979, sorcererd, sorcerer, 0, sorcererd, sorcerer, sorcerer_state, init_sorcerer, "Exidy Inc", "Sorcerer (with Micropolis fdc)", 0 )
|
||||
COMP( 1979, sorcerera, sorcerer, 0, sorcerera, sorcerer, sorcerer_state, init_sorcerer, "Exidy Inc", "Sorcerer (with Dreamdisk fdc)", 0 )
|
||||
COMP( 1979, sorcererb, sorcerer, 0, sorcererb, sorcerer, sorcerer_state, init_sorcerer, "Exidy Inc", "Sorcerer (with Digitrio fdc)", 0 )
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME */
|
||||
COMP( 1979, sorcerer, 0, 0, sorcerer, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer", 0 )
|
||||
COMP( 1979, sorcerer2, sorcerer, 0, sorcerer, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer 2", 0 )
|
||||
COMP( 1979, sorcererd, sorcerer, 0, sorcererd, sorcerer, sorcererd_state, empty_init, "Exidy Inc", "Sorcerer (with Micropolis fdc)", 0 )
|
||||
COMP( 1979, sorcerera, sorcerer, 0, sorcerera, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer (with Dreamdisk fdc)", 0 )
|
||||
COMP( 1979, sorcererb, sorcerer, 0, sorcererb, sorcerer, sorcerer_state, empty_init, "Exidy Inc", "Sorcerer (with Digitrio fdc)", 0 )
|
||||
|
@ -50,6 +50,7 @@ public:
|
||||
sorcerer_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_rom(*this, "maincpu")
|
||||
, m_cassette1(*this, "cassette1")
|
||||
, m_cassette2(*this, "cassette2")
|
||||
, m_uart(*this, "uart")
|
||||
@ -59,8 +60,6 @@ public:
|
||||
, m_cart(*this, "cartslot")
|
||||
, m_ram(*this, RAM_TAG)
|
||||
, m_dma(*this, "dma")
|
||||
, m_fdc(*this, "fdc")
|
||||
, m_fdc2(*this, "fdc2")
|
||||
, m_fdc3(*this, "fdc3")
|
||||
, m_fdc4(*this, "fdc4")
|
||||
, m_floppy20(*this, "fdc2:0")
|
||||
@ -81,71 +80,41 @@ public:
|
||||
void sorcerer(machine_config &config);
|
||||
void sorcerera(machine_config &config);
|
||||
void sorcererb(machine_config &config);
|
||||
void sorcererd(machine_config &config);
|
||||
|
||||
void init_sorcerer();
|
||||
|
||||
private:
|
||||
protected:
|
||||
enum
|
||||
{
|
||||
TIMER_SERIAL,
|
||||
TIMER_CASSETTE,
|
||||
TIMER_RESET
|
||||
};
|
||||
|
||||
DECLARE_READ8_MEMBER(port_fd_r);
|
||||
DECLARE_READ8_MEMBER(port_fe_r);
|
||||
DECLARE_WRITE8_MEMBER(port2c_w);
|
||||
DECLARE_READ8_MEMBER(port34_r);
|
||||
DECLARE_WRITE8_MEMBER(port34_w);
|
||||
DECLARE_READ8_MEMBER(port48_r);
|
||||
DECLARE_WRITE8_MEMBER(port48_w);
|
||||
DECLARE_WRITE8_MEMBER(port_fd_w);
|
||||
DECLARE_WRITE8_MEMBER(port_fe_w);
|
||||
DECLARE_WRITE8_MEMBER(port_ff_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(intrq2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(drq2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(intrq4_w);
|
||||
DECLARE_MACHINE_START(sorcererd);
|
||||
u8 portfd_r();
|
||||
u8 portfe_r();
|
||||
void portfd_w(u8 data);
|
||||
void portfe_w(u8 data);
|
||||
void portff_w(u8 data);
|
||||
TIMER_CALLBACK_MEMBER(cassette_tc);
|
||||
TIMER_CALLBACK_MEMBER(serial_tc);
|
||||
TIMER_CALLBACK_MEMBER(sorcerer_reset);
|
||||
DECLARE_SNAPSHOT_LOAD_MEMBER(snapshot_cb);
|
||||
DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
|
||||
DECLARE_WRITE_LINE_MEMBER(busreq_w);
|
||||
uint8_t memory_read_byte(offs_t offset);
|
||||
void memory_write_byte(offs_t offset, uint8_t data);
|
||||
uint8_t io_read_byte(offs_t offset);
|
||||
void io_write_byte(offs_t offset, uint8_t data);
|
||||
void machine_start_common(u16 endmem);
|
||||
void machine_start_common(offs_t endmem);
|
||||
void machine_reset_common();
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
void sorcerer_mem(address_map &map);
|
||||
void sorcererb_mem(address_map &map);
|
||||
void sorcererd_mem(address_map &map);
|
||||
void sorcerer_io(address_map &map);
|
||||
void sorcerera_io(address_map &map);
|
||||
void sorcererb_io(address_map &map);
|
||||
void sorcererd_io(address_map &map);
|
||||
|
||||
bool m_wait;
|
||||
bool m_drq_off;
|
||||
bool m_intrq_off;
|
||||
bool m_halt;
|
||||
uint8_t m_2c;
|
||||
uint8_t m_fe;
|
||||
uint8_t m_keyboard_line;
|
||||
u8 m_port48;
|
||||
u8 m_port34;
|
||||
const uint8_t *m_p_videoram;
|
||||
u8 m_fe;
|
||||
u8 m_keyboard_line;
|
||||
emu_timer *m_serial_timer;
|
||||
emu_timer *m_cassette_timer;
|
||||
cass_data_t m_cass_data;
|
||||
virtual void video_start() override;
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
||||
required_device<z80_device> m_maincpu;
|
||||
required_region_ptr<u8> m_rom;
|
||||
required_device<cassette_image_device> m_cassette1;
|
||||
required_device<cassette_image_device> m_cassette2;
|
||||
required_device<ay31015_device> m_uart;
|
||||
@ -155,8 +124,6 @@ private:
|
||||
optional_device<generic_slot_device> m_cart;
|
||||
required_device<ram_device> m_ram;
|
||||
optional_device<z80dma_device> m_dma;
|
||||
optional_device<micropolis_device> m_fdc;
|
||||
optional_device<fd1793_device> m_fdc2;
|
||||
optional_device<fd1793_device> m_fdc3;
|
||||
optional_device<wd2793_device> m_fdc4;
|
||||
optional_device<floppy_connector> m_floppy20;
|
||||
@ -172,6 +139,52 @@ private:
|
||||
required_ioport m_iop_config;
|
||||
required_ioport m_iop_vs;
|
||||
required_ioport_array<16> m_iop_x;
|
||||
memory_passthrough_handler *m_rom_shadow_tap;
|
||||
|
||||
private:
|
||||
u8 m_port48;
|
||||
u8 m_port34;
|
||||
u8 port34_r();
|
||||
u8 port48_r();
|
||||
void port34_w(u8 data);
|
||||
void port48_w(u8 data);
|
||||
void intrq4_w(bool state);
|
||||
bool m_halt;
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
void busreq_w(bool state);
|
||||
u8 memory_read_byte(offs_t offset);
|
||||
void memory_write_byte(offs_t offset, u8 data);
|
||||
u8 io_read_byte(offs_t offset);
|
||||
void io_write_byte(offs_t offset, u8 data);
|
||||
};
|
||||
|
||||
class sorcererd_state : public sorcerer_state
|
||||
{
|
||||
public:
|
||||
sorcererd_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: sorcerer_state(mconfig, type, tag)
|
||||
, m_fdc(*this, "fdc")
|
||||
, m_fdc2(*this, "fdc2")
|
||||
{ }
|
||||
|
||||
void sorcererd(machine_config &config);
|
||||
|
||||
private:
|
||||
void sorcererd_mem(address_map &map);
|
||||
void sorcererd_io(address_map &map);
|
||||
void port2c_w(u8 data);
|
||||
void intrq2_w(bool state);
|
||||
void drq2_w(bool state);
|
||||
u8 m_2c;
|
||||
bool m_wait;
|
||||
bool m_drq_off;
|
||||
bool m_intrq_off;
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
optional_device<micropolis_device> m_fdc;
|
||||
optional_device<fd1793_device> m_fdc2;
|
||||
};
|
||||
|
||||
|
||||
#endif // MAME_INCLUDES_SORCERER_H
|
||||
|
@ -38,9 +38,6 @@ void sorcerer_state::device_timer(emu_timer &timer, device_timer_id id, int para
|
||||
case TIMER_CASSETTE:
|
||||
cassette_tc(ptr, param);
|
||||
break;
|
||||
case TIMER_RESET:
|
||||
sorcerer_reset(ptr, param);
|
||||
break;
|
||||
default:
|
||||
throw emu_fatalerror("Unknown id in sorcerer_state::device_timer");
|
||||
}
|
||||
@ -51,7 +48,7 @@ void sorcerer_state::device_timer(emu_timer &timer, device_timer_id id, int para
|
||||
|
||||
TIMER_CALLBACK_MEMBER(sorcerer_state::cassette_tc)
|
||||
{
|
||||
uint8_t cass_ws = 0;
|
||||
u8 cass_ws = 0;
|
||||
switch (m_fe & 0xc0) /*/ bit 7 low indicates cassette */
|
||||
{
|
||||
case 0x00: /* Cassette 300 baud */
|
||||
@ -138,15 +135,9 @@ TIMER_CALLBACK_MEMBER(sorcerer_state::cassette_tc)
|
||||
}
|
||||
|
||||
|
||||
/* after the first 4 bytes have been read from ROM, switch the ram back in */
|
||||
TIMER_CALLBACK_MEMBER(sorcerer_state::sorcerer_reset)
|
||||
{
|
||||
membank("boot")->set_entry(0);
|
||||
}
|
||||
|
||||
// ************ EXIDY VIDEO UNIT FDC **************
|
||||
// The floppy sector has been read. Enable CPU.
|
||||
WRITE_LINE_MEMBER(sorcerer_state::intrq2_w)
|
||||
void sorcererd_state::intrq2_w(bool state)
|
||||
{
|
||||
m_intrq_off = state ? false : true;
|
||||
if (state)
|
||||
@ -163,7 +154,7 @@ WRITE_LINE_MEMBER(sorcerer_state::intrq2_w)
|
||||
}
|
||||
|
||||
// The next byte from floppy is available. Enable CPU so it can get the byte.
|
||||
WRITE_LINE_MEMBER(sorcerer_state::drq2_w)
|
||||
void sorcererd_state::drq2_w(bool state)
|
||||
{
|
||||
m_drq_off = state ? false : true;
|
||||
if (state)
|
||||
@ -183,7 +174,7 @@ WRITE_LINE_MEMBER(sorcerer_state::drq2_w)
|
||||
// Signals are unknown so guess
|
||||
// It outputs 24 or 25 when booting, so suppose that
|
||||
// bit 0 = enable wait generator, bit 2 = drive 0 select, bit 5 = ??
|
||||
WRITE8_MEMBER(sorcerer_state::port2c_w)
|
||||
void sorcererd_state::port2c_w(u8 data)
|
||||
{
|
||||
m_2c = data;
|
||||
|
||||
@ -214,7 +205,7 @@ WRITE8_MEMBER(sorcerer_state::port2c_w)
|
||||
|
||||
// ************ DREAMDISK FDC **************
|
||||
// Dreamdisk interrupts
|
||||
WRITE_LINE_MEMBER(sorcerer_state::intrq4_w)
|
||||
void sorcerer_state::intrq4_w(bool state)
|
||||
{
|
||||
if (state && m_halt)
|
||||
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
|
||||
@ -222,12 +213,12 @@ WRITE_LINE_MEMBER(sorcerer_state::intrq4_w)
|
||||
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
}
|
||||
|
||||
READ8_MEMBER(sorcerer_state::port48_r)
|
||||
u8 sorcerer_state::port48_r()
|
||||
{
|
||||
return m_port48;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(sorcerer_state::port48_w)
|
||||
void sorcerer_state::port48_w(u8 data)
|
||||
{
|
||||
m_port48 = data;
|
||||
data ^= 0x1f;
|
||||
@ -251,7 +242,7 @@ WRITE8_MEMBER(sorcerer_state::port48_w)
|
||||
}
|
||||
|
||||
// ************ DIGITRIO FDC **************
|
||||
READ8_MEMBER(sorcerer_state::port34_r)
|
||||
u8 sorcerer_state::port34_r()
|
||||
{
|
||||
u8 data = m_port34;
|
||||
data |= m_fdc3->intrq_r() ? 0x80 : 0;
|
||||
@ -259,7 +250,7 @@ READ8_MEMBER(sorcerer_state::port34_r)
|
||||
return data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(sorcerer_state::port34_w)
|
||||
void sorcerer_state::port34_w(u8 data)
|
||||
{
|
||||
m_port34 = data & 0x5f;
|
||||
floppy_image_device *floppy = nullptr;
|
||||
@ -282,40 +273,40 @@ WRITE8_MEMBER(sorcerer_state::port34_w)
|
||||
}
|
||||
|
||||
// ************ DIGITRIO DMA **************
|
||||
WRITE_LINE_MEMBER( sorcerer_state::busreq_w )
|
||||
void sorcerer_state::busreq_w(bool state)
|
||||
{
|
||||
// since our Z80 has no support for BUSACK, we assume it is granted immediately
|
||||
m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, state);
|
||||
m_maincpu->set_input_line(INPUT_LINE_HALT, state); // do we need this? - yes
|
||||
m_maincpu->set_input_line(INPUT_LINE_HALT, state);
|
||||
m_dma->bai_w(state); // tell dma that bus has been granted
|
||||
}
|
||||
|
||||
uint8_t sorcerer_state::memory_read_byte(offs_t offset)
|
||||
u8 sorcerer_state::memory_read_byte(offs_t offset)
|
||||
{
|
||||
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
|
||||
return prog_space.read_byte(offset);
|
||||
}
|
||||
|
||||
void sorcerer_state::memory_write_byte(offs_t offset, uint8_t data)
|
||||
void sorcerer_state::memory_write_byte(offs_t offset, u8 data)
|
||||
{
|
||||
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
|
||||
prog_space.write_byte(offset, data);
|
||||
}
|
||||
|
||||
uint8_t sorcerer_state::io_read_byte(offs_t offset)
|
||||
u8 sorcerer_state::io_read_byte(offs_t offset)
|
||||
{
|
||||
address_space& prog_space = m_maincpu->space(AS_IO);
|
||||
return prog_space.read_byte(offset);
|
||||
}
|
||||
|
||||
void sorcerer_state::io_write_byte(offs_t offset, uint8_t data)
|
||||
void sorcerer_state::io_write_byte(offs_t offset, u8 data)
|
||||
{
|
||||
address_space& prog_space = m_maincpu->space(AS_IO);
|
||||
prog_space.write_byte(offset, data);
|
||||
}
|
||||
|
||||
// ************ INBUILT PORTS **************
|
||||
WRITE8_MEMBER(sorcerer_state::port_fd_w)
|
||||
void sorcerer_state::portfd_w(u8 data)
|
||||
{
|
||||
/* Translate data to control signals */
|
||||
|
||||
@ -328,9 +319,9 @@ WRITE8_MEMBER(sorcerer_state::port_fd_w)
|
||||
m_uart->write_cs(1);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(sorcerer_state::port_fe_w)
|
||||
void sorcerer_state::portfe_w(u8 data)
|
||||
{
|
||||
uint8_t changed_bits = (m_fe ^ data) & 0xf0;
|
||||
u8 changed_bits = (m_fe ^ data) & 0xf0;
|
||||
m_fe = data;
|
||||
|
||||
/* bits 0..3 */
|
||||
@ -379,7 +370,7 @@ WRITE8_MEMBER(sorcerer_state::port_fe_w)
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(sorcerer_state::port_ff_w)
|
||||
void sorcerer_state::portff_w(u8 data)
|
||||
{
|
||||
/// TODO: create a sorcerer parallel slot with a 7 bit and 8 bit centronics adapter as two of the options
|
||||
/// TODO: figure out what role FE plays http://www.trailingedge.com/exidy/exidych7.html
|
||||
@ -409,10 +400,10 @@ WRITE8_MEMBER(sorcerer_state::port_ff_w)
|
||||
}
|
||||
}
|
||||
|
||||
READ8_MEMBER(sorcerer_state::port_fd_r)
|
||||
u8 sorcerer_state::portfd_r()
|
||||
{
|
||||
/* set unused bits high */
|
||||
uint8_t data = 0xe0;
|
||||
u8 data = 0xe0;
|
||||
|
||||
m_uart->write_swe(0);
|
||||
data |= m_uart->tbmt_r() ? 0x01 : 0;
|
||||
@ -425,14 +416,14 @@ READ8_MEMBER(sorcerer_state::port_fd_r)
|
||||
return data;
|
||||
}
|
||||
|
||||
READ8_MEMBER(sorcerer_state::port_fe_r)
|
||||
u8 sorcerer_state::portfe_r()
|
||||
{
|
||||
/* bits 6..7
|
||||
- hardware handshakes from user port
|
||||
- not emulated
|
||||
- tied high, allowing PARIN and PAROUT bios routines to run */
|
||||
|
||||
uint8_t data = 0xc0;
|
||||
u8 data = 0xc0;
|
||||
|
||||
/* bit 5 - vsync */
|
||||
data |= m_iop_vs->read();
|
||||
@ -444,7 +435,7 @@ READ8_MEMBER(sorcerer_state::port_fe_r)
|
||||
}
|
||||
|
||||
// ************ MACHINE **************
|
||||
void sorcerer_state::machine_start_common(u16 endmem)
|
||||
void sorcerer_state::machine_start_common(offs_t endmem)
|
||||
{
|
||||
m_cassette_timer = timer_alloc(TIMER_CASSETTE);
|
||||
m_serial_timer = timer_alloc(TIMER_SERIAL);
|
||||
@ -475,12 +466,12 @@ void sorcerer_state::machine_start()
|
||||
machine_start_common(0xbfff);
|
||||
}
|
||||
|
||||
MACHINE_START_MEMBER(sorcerer_state,sorcererd)
|
||||
void sorcererd_state::machine_start()
|
||||
{
|
||||
machine_start_common(0xbbff);
|
||||
}
|
||||
|
||||
void sorcerer_state::machine_reset()
|
||||
void sorcerer_state::machine_reset_common()
|
||||
{
|
||||
address_space &space = m_maincpu->space(AS_PROGRAM);
|
||||
|
||||
@ -490,26 +481,50 @@ void sorcerer_state::machine_reset()
|
||||
m_cass_data.input.length = 0;
|
||||
m_cass_data.input.bit = 1;
|
||||
|
||||
m_fe = 0xff;
|
||||
portfe_w(0);
|
||||
|
||||
space.install_rom(0x0000, 0x0fff, m_rom); // do it here for F3
|
||||
m_rom_shadow_tap = space.install_read_tap(0xe000, 0xefff, "rom_shadow_r",[this](offs_t offset, u8 &data, u8 mem_mask)
|
||||
{
|
||||
if (!machine().side_effects_disabled())
|
||||
{
|
||||
// delete this tap
|
||||
m_rom_shadow_tap->remove();
|
||||
|
||||
// reinstall ram over the rom shadow
|
||||
m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x0fff, m_ram->pointer());
|
||||
}
|
||||
|
||||
// return the original data
|
||||
return data;
|
||||
});
|
||||
}
|
||||
|
||||
void sorcerer_state::machine_reset()
|
||||
{
|
||||
machine_reset_common();
|
||||
}
|
||||
|
||||
void sorcererd_state::machine_reset()
|
||||
{
|
||||
m_drq_off = true;
|
||||
m_intrq_off = true;
|
||||
m_wait = false;
|
||||
m_fe = 0xff;
|
||||
m_2c = 0;
|
||||
port_fe_w(space, 0, 0, 0);
|
||||
|
||||
membank("boot")->set_entry(1);
|
||||
timer_set(attotime::from_usec(10), TIMER_RESET);
|
||||
machine_reset_common();
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Snapshot Handling
|
||||
******************************************************************************/
|
||||
|
||||
SNAPSHOT_LOAD_MEMBER(sorcerer_state::snapshot_cb)
|
||||
{
|
||||
uint8_t *RAM = memregion(m_maincpu->tag())->base();
|
||||
u8 *RAM = memregion(m_maincpu->tag())->base();
|
||||
address_space &space = m_maincpu->space(AS_PROGRAM);
|
||||
uint8_t header[28];
|
||||
u8 header[28];
|
||||
unsigned char s_byte;
|
||||
|
||||
/* check size */
|
||||
@ -587,8 +602,8 @@ QUICKLOAD_LOAD_MEMBER(sorcerer_state::quickload_cb)
|
||||
|
||||
if (((start_address == 0x1d5) || (execute_address == 0xc858)) && (space.read_byte(0xdffa) == 0xc3))
|
||||
{
|
||||
uint8_t i;
|
||||
static const uint8_t data[]={
|
||||
u8 i;
|
||||
static const u8 data[]={
|
||||
0xcd, 0x26, 0xc4, // CALL C426 ;set up other pointers
|
||||
0x21, 0xd4, 1, // LD HL,01D4 ;start of program address (used by C689)
|
||||
0x36, 0, // LD (HL),00 ;make sure dummy end-of-line is there
|
||||
|
Loading…
Reference in New Issue
Block a user