summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/sorcerer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/sorcerer.cpp')
-rw-r--r--src/mame/drivers/sorcerer.cpp157
1 files changed, 137 insertions, 20 deletions
diff --git a/src/mame/drivers/sorcerer.cpp b/src/mame/drivers/sorcerer.cpp
index 1ed21008c82..eced9482142 100644
--- a/src/mame/drivers/sorcerer.cpp
+++ b/src/mame/drivers/sorcerer.cpp
@@ -125,14 +125,29 @@ of the tape during playback.
********************************************************************************
+Progress with floppy-disk systems:
+
+It appears that a number of companies made floppy-disk controllers for the Sorcerer.
+We will attempt to emulate whatever we have disk images for.
+
Disk system on sorcererd:
-- Uses a Micropolis controller, disks holding 143KB. Top of RAM is BBFF.
-- To boot CP/M, insert the disk, then type GO BC00 at the monitor prompt.
+- Uses a Micropolis controller. Top of RAM is BBFF.
+- To boot CP/M, insert the 325k disk, then type GO BC00 at the monitor prompt.
+- To try the video/disk unit, insert the 78k disk, then type GO BF00 at the monitor prompt.
+ (see notes below)
-Other rumoured disk possibilities (not emulated):
-- Soft-sectored, top of RAM is BDFF
-- Having the option of a S100 box, any random system could be used in theory.
+Disk system on sorcerera:
+- Uses an almost-Microbee clone board called the Dreamdisk.
+- To boot, just insert the proper 841k disk. The bios will wait for it.
+Disk system on sorcererb:
+- SCUAMON will try using ports 30,32,34 and 38. Uses digitrio hardware (also a 841k disk).
+ scuamon64 requires you to enter DI to boot, and it doesn't work, confirmed buggy.
+ scuamon80 will successfully boot by itself, but the 80 column display is of course scrambled.
+
+Other disk-enabled bioses:
+- TVIMON uses ports 04,30-34. Type in BO to attempt to boot. Unknown hardware.
+- There's a bunch of 251k disks, also requiring unknown hardware.
Exidy Sorcerer Video/Disk Unit:
@@ -142,7 +157,8 @@ Exidy Sorcerer Video/Disk Unit:
FD1793-B01 fdc. Going by the code, it would appear to place the Z-80 into
WAIT while reading a sector. To try it out: GO BF00 at the monitor prompt.
Currently the CP/M sign-on message appears, followed by lockup due to a
- fdc problem.
+ fdc problem. Uses ports 28-2C. Run it under debug, when it gets stuck you'll
+ see the A register has 21. Change it to 24 and it will boot up and work.
********************************************************************************/
@@ -159,13 +175,20 @@ void sorcerer_state::sorcerer_mem(address_map &map)
map.unmap_value_high();
map(0x0000, 0x07ff).bankrw("boot");
map(0x0800, 0xbfff).ram();
- //AM_RANGE(0xc000, 0xdfff) // mapped by the cartslot
+ //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 */
}
+void sorcerer_state::sorcererb_mem(address_map &map)
+{
+ map.unmap_value_high();
+ sorcerer_mem(map);
+ map(0xc000, 0xdfff).ram();
+}
+
void sorcerer_state::sorcererd_mem(address_map &map)
{
map.unmap_value_high();
@@ -186,13 +209,32 @@ void sorcerer_state::sorcerer_io(address_map &map)
map(0xff, 0xff).w(FUNC(sorcerer_state::port_ff_w));
}
+void sorcerer_state::sorcerera_io(address_map &map)
+{
+ map.global_mask(0xff);
+ map.unmap_value_high();
+ sorcerer_io(map);
+ map(0x44, 0x47).rw(m_fdc4, FUNC(wd2793_device::read), FUNC(wd2793_device::write));
+ map(0x48, 0x4b).rw(FUNC(sorcerer_state::port48_r), FUNC(sorcerer_state::port48_w));
+}
+
+void sorcerer_state::sorcererb_io(address_map &map)
+{
+ map.global_mask(0xff);
+ map.unmap_value_high();
+ sorcerer_io(map);
+ map(0x30, 0x33).rw(m_fdc3, FUNC(fd1793_device::read), FUNC(fd1793_device::write));
+ map(0x34, 0x37).rw(FUNC(sorcerer_state::port34_r), FUNC(sorcerer_state::port34_w));
+ map(0x38, 0x3b).rw(m_dma, FUNC(z80dma_device::bus_r), FUNC(z80dma_device::bus_w));
+}
+
void sorcerer_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, 0x2c).w(FUNC(sorcerer_state::port_2c_w));
+ map(0x2c, 0x2f).w(FUNC(sorcerer_state::port2c_w));
}
static INPUT_PORTS_START(sorcerer)
@@ -491,14 +533,61 @@ void sorcerer_state::sorcererd(machine_config &config)
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::intrq_w));
- m_fdc2->drq_wr_callback().set(FUNC(sorcerer_state::drq_w));
+ m_fdc2->intrq_wr_callback().set(FUNC(sorcerer_state::intrq2_w));
+ m_fdc2->drq_wr_callback().set(FUNC(sorcerer_state::drq2_w));
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");
}
+void sorcerer_state::sorcerera(machine_config &config)
+{
+ sorcerer(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));
+ 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);
+ //SOFTWARE_LIST(config, "flop_list").set_original("sorcerer_flop"); // no suitable software yet
+
+ // internal ram
+ config.device_remove(RAM_TAG);
+ RAM(config, RAM_TAG).set_default_size("48K"); // must have 48k to be able to boot floppy
+}
+
+void sorcerer_state::sorcererb(machine_config &config)
+{
+ sorcerer(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->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));
+ m_dma->out_iorq_callback().set(FUNC(sorcerer_state::io_write_byte));
+
+ FD1793(config, m_fdc3, 4_MHz_XTAL / 2);
+ m_fdc3->set_force_ready(true);
+ m_fdc3->drq_wr_callback().set(m_dma, FUNC(z80dma_device::rdy_w));
+ FLOPPY_CONNECTOR(config, "fdc3:0", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc3:1", 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("cartslot");
+
+ // internal ram
+ config.device_remove(RAM_TAG);
+ RAM(config, RAM_TAG).set_default_size("56K"); // must have 56k to be able to boot CP/M floppy
+}
void sorcerer_state::init_sorcerer()
{
@@ -522,9 +611,10 @@ 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("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_SYSTEM_BIOS(0, "standard", "Standard")
+ 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) )
ROM_REGION( 0x0400, "proms", 0 )
ROM_LOAD_OPTIONAL("bruce.15b", 0x0000, 0x0020, CRC(fae922cb) SHA1(470a86844cfeab0d9282242e03ff1d8a1b2238d1) ) /* video prom type 6331 */
@@ -540,21 +630,48 @@ ROM_START(sorcerer2)
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) )
- ROM_SYSTEM_BIOS(1, "tvc", "TVI-MON-C-V1.5")
- ROMX_LOAD("tvc-1.1e", 0xe000, 0x0800, CRC(efc15a18) SHA1(3dee821270a0d83453b18baed88a024dfd0d7a6c), ROM_BIOS(1) )
- ROMX_LOAD("tvc-2.2e", 0xe800, 0x0800, CRC(bc194487) SHA1(dcfd916558e3e3be22091c5558ea633c332cf6c7), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS(2, "dwmon", "DWMON 2.2C")
- ROMX_LOAD("dwmon.1e", 0xe000, 0x0800, CRC(a22db498) SHA1(ebedbce7454007f5a02fafe449fd09169173d7b3), ROM_BIOS(2) )
- ROMX_LOAD("dwmon.2e", 0xe800, 0x0800, CRC(7b22b65a) SHA1(7f23dd308f34b6d795d6df06f2387dfd17f69edd), ROM_BIOS(2) )
+ 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) )
+ 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) )
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) )
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) )
+ ROM_SYSTEM_BIOS(5, "tvc", "TVI-MON-C-V1.5") // unknown disk support
+ 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) )
+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_SYSTEM_BIOS(0, "scuamon6434", "SCUAMON64 3.4")
+ ROMX_LOAD("scua34.1e", 0xe000, 0x1000, CRC(7ff21d97) SHA1(b936cda0f2acb655fb4c1a4e7976274558543c7e), ROM_BIOS(0) )
+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_SYSTEM_BIOS(0, "scuamon64", "SCUAMON64") // this bios confirmed buggy with disks
+ 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)
+ 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) )
+ ROM_IGNORE(0x800)
+ ROMX_LOAD("scua1.2e", 0xe800, 0x0800, CRC(aa9a6ca6) SHA1(bcaa7457a1b892ed82c1a04ee21a619faa7c1a16), ROM_BIOS(1) )
+ ROM_IGNORE(0x800)
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 floppy disks)", 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 )