summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2021-06-21 13:53:49 -0700
committer Aaron Giles <aaron@aarongiles.com>2021-06-21 13:53:49 -0700
commit32dbba7d2d4513774b2d877b4c88f2d0760bcf54 (patch)
treef9e6426cf8dc28413c456bdbcd450c85cb302422 /src
parent5522729235b3ce81c839f3932c1aadc14de59e2b (diff)
parent2709c0143a8c7009715242c135b28403eeffce8b (diff)
Merge branch 'master' into deprecateddeprecated
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/a2bus/a2bus.h1
-rw-r--r--src/devices/bus/a2bus/a2mockingboard.cpp107
-rw-r--r--src/devices/bus/a2bus/a2mockingboard.h51
-rw-r--r--src/devices/bus/a2bus/titan3plus2.cpp334
-rw-r--r--src/devices/bus/a2bus/titan3plus2.h64
-rw-r--r--src/devices/bus/adam/exp.h8
-rw-r--r--src/devices/bus/bw2/exp.h7
-rw-r--r--src/devices/bus/cbm2/exp.cpp9
-rw-r--r--src/devices/bus/cbm2/exp.h7
-rw-r--r--src/devices/bus/coco/coco_multi.cpp123
-rw-r--r--src/devices/bus/coco/coco_multi.h1
-rw-r--r--src/devices/bus/coco/coco_wpk.cpp201
-rw-r--r--src/devices/bus/coco/coco_wpk.h94
-rw-r--r--src/devices/bus/coco/coco_wpk2p.cpp56
-rw-r--r--src/devices/bus/coco/coco_wpk2p.h41
-rw-r--r--src/devices/bus/coco/cococart.cpp65
-rw-r--r--src/devices/bus/coco/cococart.h3
-rw-r--r--src/devices/bus/coco/dragon_claw.cpp212
-rw-r--r--src/devices/bus/coco/dragon_claw.h59
-rw-r--r--src/devices/bus/coco/dragon_msx2.cpp191
-rw-r--r--src/devices/bus/coco/dragon_msx2.h53
-rw-r--r--src/devices/bus/coco/dragon_serial.cpp154
-rw-r--r--src/devices/bus/coco/dragon_serial.h52
-rw-r--r--src/devices/bus/generic/slot.h2
-rw-r--r--src/devices/bus/isa/isa_cards.cpp2
-rw-r--r--src/devices/bus/isa/lrk330.cpp130
-rw-r--r--src/devices/bus/isa/lrk330.h38
-rw-r--r--src/devices/bus/mc10/mc10_cart.cpp230
-rw-r--r--src/devices/bus/mc10/mc10_cart.h118
-rw-r--r--src/devices/bus/mc10/mcx128.cpp371
-rw-r--r--src/devices/bus/mc10/mcx128.h15
-rw-r--r--src/devices/bus/mc10/pak.cpp69
-rw-r--r--src/devices/bus/mc10/pak.h37
-rw-r--r--src/devices/bus/mc10/ram.cpp78
-rw-r--r--src/devices/bus/mc10/ram.h14
-rw-r--r--src/devices/bus/nes/act53.cpp66
-rw-r--r--src/devices/bus/nes/act53.h11
-rw-r--r--src/devices/bus/nes/nes_slot.h4
-rw-r--r--src/devices/bus/newbrain/eim.cpp2
-rw-r--r--src/devices/bus/newbrain/exp.h7
-rw-r--r--src/devices/bus/newbrain/fdc.cpp14
-rw-r--r--src/devices/bus/newbrain/fdc.h5
-rw-r--r--src/devices/bus/odyssey2/rom.cpp2
-rw-r--r--src/devices/bus/pet/exp.h7
-rw-r--r--src/devices/bus/plus4/c1551.cpp4
-rw-r--r--src/devices/bus/plus4/exp.cpp9
-rw-r--r--src/devices/bus/plus4/exp.h7
-rw-r--r--src/devices/bus/pofo/exp.h7
-rw-r--r--src/devices/bus/pofo/hpc104.cpp4
-rw-r--r--src/devices/bus/saitek_osa/expansion.cpp16
-rw-r--r--src/devices/bus/saitek_osa/expansion.h6
-rw-r--r--src/devices/bus/saitek_osa/modules.cpp22
-rw-r--r--src/devices/bus/saitek_osa/modules.h16
-rw-r--r--src/devices/bus/vic10/exp.cpp9
-rw-r--r--src/devices/bus/vic10/exp.h8
-rw-r--r--src/devices/bus/vic20/exp.h8
-rw-r--r--src/devices/bus/vip/exp.h7
-rw-r--r--src/devices/bus/vme/vme.cpp54
-rw-r--r--src/devices/bus/vme/vme.h30
-rw-r--r--src/devices/bus/vme/vme_fccpu20.cpp2
-rw-r--r--src/devices/bus/vme/vme_fcisio.cpp1
-rw-r--r--src/devices/bus/vme/vme_fcscsi.cpp1
-rw-r--r--src/devices/bus/vme/vme_hcpu30.cpp2
-rw-r--r--src/devices/bus/vme/vme_mvme350.cpp1
-rw-r--r--src/devices/bus/vme/vme_mzr8300.cpp1
-rw-r--r--src/devices/cpu/am29000/am29ops.h2
-rw-r--r--src/devices/cpu/arm7/arm7ops.cpp2
-rw-r--r--src/devices/cpu/drcbec.cpp14
-rw-r--r--src/devices/cpu/dspp/dspp.cpp2
-rw-r--r--src/devices/cpu/h8500/h8500.cpp3
-rw-r--r--src/devices/cpu/h8500/h8500.h10
-rw-r--r--src/devices/cpu/h8500/h8510.cpp2
-rw-r--r--src/devices/cpu/h8500/h8520.cpp11
-rw-r--r--src/devices/cpu/h8500/h8520.h8
-rw-r--r--src/devices/cpu/h8500/h8532.cpp11
-rw-r--r--src/devices/cpu/h8500/h8532.h8
-rw-r--r--src/devices/cpu/h8500/h8534.cpp23
-rw-r--r--src/devices/cpu/h8500/h8534.h19
-rw-r--r--src/devices/cpu/m68000/m68kfpu.cpp131
-rw-r--r--src/devices/cpu/m88000/m88000.cpp4
-rw-r--r--src/devices/cpu/mips/r4000.cpp4
-rw-r--r--src/devices/cpu/pdp8/hd6120.cpp43
-rw-r--r--src/devices/cpu/psx/gte.cpp4
-rw-r--r--src/devices/cpu/romp/romp.cpp2
-rw-r--r--src/devices/cpu/sharc/sharc.cpp53
-rw-r--r--src/devices/cpu/sharc/sharc.h5
-rw-r--r--src/devices/cpu/sharc/sharcdma.hxx140
-rw-r--r--src/devices/cpu/tms32031/32031ops.hxx16
-rw-r--r--src/devices/cpu/tms34010/34010ops.hxx6
-rw-r--r--src/devices/cpu/uml.cpp9
-rw-r--r--src/devices/cpu/unsp/unsp_fxxx.cpp4
-rw-r--r--src/devices/cpu/z80/kp69.cpp6
-rw-r--r--src/devices/machine/atmel_arm_aic.cpp4
-rw-r--r--src/devices/machine/netlist.cpp3
-rw-r--r--src/devices/machine/ns32202.cpp8
-rw-r--r--src/devices/machine/sensorboard.cpp2
-rw-r--r--src/devices/machine/smartmed.cpp93
-rw-r--r--src/devices/machine/z80pio.cpp5
-rw-r--r--src/devices/sound/c140.cpp11
-rw-r--r--src/devices/video/dl1416.cpp36
-rw-r--r--src/devices/video/dl1416.h20
-rw-r--r--src/devices/video/hd61830.cpp6
-rw-r--r--src/devices/video/pc_vga.cpp6
-rw-r--r--src/devices/video/vooddefs.ipp20
-rw-r--r--src/devices/video/voodoo.cpp4
-rw-r--r--src/emu/emumem_hedr.ipp54
-rw-r--r--src/emu/emumem_hedw.ipp48
-rw-r--r--src/emu/emumem_mview.cpp2
-rw-r--r--src/emu/rendlay.cpp4
-rw-r--r--src/emu/validity.cpp8
-rw-r--r--src/frontend/mame/ui/confswitch.cpp2
-rw-r--r--src/lib/formats/ipf_dsk.cpp79
-rw-r--r--src/lib/formats/ipf_dsk.h128
-rw-r--r--src/lib/util/msdib.cpp4
-rw-r--r--src/mame/arcade.flt1
-rw-r--r--src/mame/audio/acan.cpp234
-rw-r--r--src/mame/audio/acan.h12
-rw-r--r--src/mame/audio/gottlieb.cpp27
-rw-r--r--src/mame/audio/gottlieb.h1
-rw-r--r--src/mame/drivers/aci_ggm.cpp11
-rw-r--r--src/mame/drivers/adam.cpp34
-rw-r--r--src/mame/drivers/apple2e.cpp19
-rw-r--r--src/mame/drivers/apple2gs.cpp10
-rw-r--r--src/mame/drivers/apple3.cpp4
-rw-r--r--src/mame/drivers/aristmk5.cpp6
-rw-r--r--src/mame/drivers/astrocde.cpp2
-rw-r--r--src/mame/drivers/at.cpp4
-rw-r--r--src/mame/drivers/ave_arb.cpp7
-rw-r--r--src/mame/drivers/betacam.cpp3
-rw-r--r--src/mame/drivers/bvm.cpp2
-rw-r--r--src/mame/drivers/cbm2.cpp2
-rw-r--r--src/mame/drivers/cclimber.cpp81
-rw-r--r--src/mame/drivers/chexx.cpp3
-rw-r--r--src/mame/drivers/decmate2.cpp23
-rw-r--r--src/mame/drivers/dragon.cpp58
-rw-r--r--src/mame/drivers/dynadice.cpp2
-rw-r--r--src/mame/drivers/exidy.cpp54
-rw-r--r--src/mame/drivers/fidel_cc1.cpp2
-rw-r--r--src/mame/drivers/fmtowns.cpp26
-rw-r--r--src/mame/drivers/galaxian.cpp1193
-rw-r--r--src/mame/drivers/galaxian_rockclim.cpp296
-rw-r--r--src/mame/drivers/galaxold.cpp314
-rw-r--r--src/mame/drivers/gameplan.cpp5
-rw-r--r--src/mame/drivers/goldstar.cpp3
-rw-r--r--src/mame/drivers/gticlub.cpp2
-rw-r--r--src/mame/drivers/hh_cops1.cpp4
-rw-r--r--src/mame/drivers/hh_sm510.cpp69
-rw-r--r--src/mame/drivers/hornet.cpp86
-rw-r--r--src/mame/drivers/hp80.cpp2
-rw-r--r--src/mame/drivers/hp9825.cpp2
-rw-r--r--src/mame/drivers/hp9845.cpp2
-rw-r--r--src/mame/drivers/indigo.cpp7
-rw-r--r--src/mame/drivers/intellect02.cpp2
-rw-r--r--src/mame/drivers/inufuku.cpp415
-rw-r--r--src/mame/drivers/jupace.cpp11
-rw-r--r--src/mame/drivers/ladybug.cpp68
-rw-r--r--src/mame/drivers/legionna.cpp296
-rw-r--r--src/mame/drivers/lk3000.cpp354
-rw-r--r--src/mame/drivers/m79amb.cpp20
-rw-r--r--src/mame/drivers/mbee.cpp75
-rw-r--r--src/mame/drivers/mc10.cpp431
-rw-r--r--src/mame/drivers/mephisto_mm2.cpp8
-rw-r--r--src/mame/drivers/meritum.cpp37
-rw-r--r--src/mame/drivers/mermaid.cpp26
-rw-r--r--src/mame/drivers/mitchell.cpp90
-rw-r--r--src/mame/drivers/mpc60.cpp20
-rw-r--r--src/mame/drivers/namcos2.cpp23
-rw-r--r--src/mame/drivers/namcos22.cpp68
-rw-r--r--src/mame/drivers/naomi.cpp34
-rw-r--r--src/mame/drivers/nwk-tr.cpp47
-rw-r--r--src/mame/drivers/odyssey2.cpp2
-rw-r--r--src/mame/drivers/ojankohs.cpp356
-rw-r--r--src/mame/drivers/olibochu.cpp2
-rw-r--r--src/mame/drivers/pacman.cpp25
-rw-r--r--src/mame/drivers/pasha2.cpp143
-rw-r--r--src/mame/drivers/pcxt.cpp45
-rw-r--r--src/mame/drivers/pet.cpp2
-rw-r--r--src/mame/drivers/phoenix.cpp6
-rw-r--r--src/mame/drivers/plus4.cpp2
-rw-r--r--src/mame/drivers/pofo.cpp262
-rw-r--r--src/mame/drivers/psikyo.cpp42
-rw-r--r--src/mame/drivers/psikyosh.cpp241
-rw-r--r--src/mame/drivers/roland_cm32p.cpp2
-rw-r--r--src/mame/drivers/rx78.cpp154
-rw-r--r--src/mame/drivers/schick.cpp195
-rw-r--r--src/mame/drivers/segahang.cpp2
-rw-r--r--src/mame/drivers/segas16a.cpp16
-rw-r--r--src/mame/drivers/sengokmj.cpp12
-rw-r--r--src/mame/drivers/seta.cpp24
-rw-r--r--src/mame/drivers/sitcom.cpp2
-rw-r--r--src/mame/drivers/sk1.cpp6
-rw-r--r--src/mame/drivers/skylncr.cpp25
-rw-r--r--src/mame/drivers/stv.cpp47
-rw-r--r--src/mame/drivers/subhuntr.cpp2
-rw-r--r--src/mame/drivers/supracan.cpp26
-rw-r--r--src/mame/drivers/suprnova.cpp606
-rw-r--r--src/mame/drivers/taito_b.cpp4
-rw-r--r--src/mame/drivers/taitosj.cpp1
-rw-r--r--src/mame/drivers/tattack.cpp3
-rw-r--r--src/mame/drivers/tecmo.cpp55
-rw-r--r--src/mame/drivers/vectrex.cpp2
-rw-r--r--src/mame/drivers/vegas.cpp7
-rw-r--r--src/mame/drivers/vic10.cpp2
-rw-r--r--src/mame/drivers/vic20.cpp2
-rw-r--r--src/mame/drivers/vis.cpp9
-rw-r--r--src/mame/drivers/yman1x.cpp87
-rw-r--r--src/mame/drivers/ymdx100.cpp144
-rw-r--r--src/mame/drivers/ymsy35.cpp76
-rw-r--r--src/mame/includes/adam.h8
-rw-r--r--src/mame/includes/bw2.h2
-rw-r--r--src/mame/includes/fmtowns.h3
-rw-r--r--src/mame/includes/galaxian.h561
-rw-r--r--src/mame/includes/galaxold.h20
-rw-r--r--src/mame/includes/gameplan.h1
-rw-r--r--src/mame/includes/inufuku.h81
-rw-r--r--src/mame/includes/m79amb.h6
-rw-r--r--src/mame/includes/mbee.h9
-rw-r--r--src/mame/includes/mermaid.h7
-rw-r--r--src/mame/includes/namcos2.h5
-rw-r--r--src/mame/includes/naomi.h2
-rw-r--r--src/mame/includes/newbrain.h2
-rw-r--r--src/mame/includes/ojankohs.h175
-rw-r--r--src/mame/includes/seta.h2
-rw-r--r--src/mame/includes/stv.h13
-rw-r--r--src/mame/includes/taitosj.h1
-rw-r--r--src/mame/includes/vip.h2
-rw-r--r--src/mame/includes/x68k.h1
-rw-r--r--src/mame/layout/critcrsh.lay30
-rw-r--r--src/mame/layout/lk3000.lay32
-rw-r--r--src/mame/machine/apple3.cpp49
-rw-r--r--src/mame/machine/coco.cpp3
-rw-r--r--src/mame/machine/mbee.cpp45
-rw-r--r--src/mame/machine/pofo_kbd.cpp138
-rw-r--r--src/mame/machine/pofo_kbd.h39
-rw-r--r--src/mame/machine/segashiobd.cpp121
-rw-r--r--src/mame/machine/segashiobd.h29
-rw-r--r--src/mame/mame.lst29
-rw-r--r--src/mame/mess.flt4
-rw-r--r--src/mame/video/fmtowns.cpp53
-rw-r--r--src/mame/video/galaxian.cpp113
-rw-r--r--src/mame/video/galaxold.cpp53
-rw-r--r--src/mame/video/gameplan.cpp3
-rw-r--r--src/mame/video/inufuku.cpp173
-rw-r--r--src/mame/video/k037122.cpp155
-rw-r--r--src/mame/video/k037122.h10
-rw-r--r--src/mame/video/mbee.cpp3
-rw-r--r--src/mame/video/mermaid.cpp78
-rw-r--r--src/mame/video/ojankohs.cpp81
-rw-r--r--src/mame/video/taitosj.cpp9
-rw-r--r--src/mame/video/x68k.cpp42
-rw-r--r--src/osd/eigcc.h60
-rw-r--r--src/osd/eigccarm.h62
-rw-r--r--src/osd/eigccppc.h62
-rw-r--r--src/osd/eigccx86.h64
-rw-r--r--src/osd/eivc.h57
-rw-r--r--src/osd/eivcarm.h75
-rw-r--r--src/osd/eminline.h47
-rw-r--r--src/tools/unidasm.cpp4
258 files changed, 9802 insertions, 4518 deletions
diff --git a/src/devices/bus/a2bus/a2bus.h b/src/devices/bus/a2bus/a2bus.h
index 1c7d94bbcdc..5a10f06de39 100644
--- a/src/devices/bus/a2bus/a2bus.h
+++ b/src/devices/bus/a2bus/a2bus.h
@@ -149,6 +149,7 @@ public:
virtual void write_inh_rom(uint16_t offset, uint8_t data) { }
virtual uint16_t inh_start() { return INH_START_INVALID; }
virtual uint16_t inh_end() { return INH_END_INVALID; }
+ virtual bool inh_check(uint16_t offset, bool bIsWrite) { return false; }
virtual int inh_type() { return INH_NONE; }
device_a2bus_card_interface *next() const { return m_next; }
diff --git a/src/devices/bus/a2bus/a2mockingboard.cpp b/src/devices/bus/a2bus/a2mockingboard.cpp
index 6073e843371..380e9988a8b 100644
--- a/src/devices/bus/a2bus/a2mockingboard.cpp
+++ b/src/devices/bus/a2bus/a2mockingboard.cpp
@@ -41,11 +41,13 @@ DEFINE_DEVICE_TYPE(A2BUS_ECHOPLUS, a2bus_echoplus_device, "a2echop", "S
void a2bus_ayboard_device::add_common_devices(machine_config &config)
{
MOS6522(config, m_via1, 1022727);
+ m_via1->readpa_handler().set(FUNC(a2bus_ayboard_device::via1_in_a));
m_via1->writepa_handler().set(FUNC(a2bus_ayboard_device::via1_out_a));
m_via1->writepb_handler().set(FUNC(a2bus_ayboard_device::via1_out_b));
m_via1->irq_handler().set(FUNC(a2bus_ayboard_device::via1_irq_w));
MOS6522(config, m_via2, 1022727);
+ m_via2->readpa_handler().set(FUNC(a2bus_ayboard_device::via2_in_a));
m_via2->writepa_handler().set(FUNC(a2bus_ayboard_device::via2_out_a));
m_via2->writepb_handler().set(FUNC(a2bus_ayboard_device::via2_out_b));
m_via2->irq_handler().set(FUNC(a2bus_ayboard_device::via2_irq_w));
@@ -101,6 +103,9 @@ void a2bus_echoplus_device::device_add_mconfig(machine_config &config)
{
add_common_devices(config);
+ config.device_remove(VIA2_TAG);
+ m_via1->writepb_handler().set(FUNC(a2bus_ayboard_device::via1_out_b));
+
AY8913(config, m_ay2, 1022727);
m_ay2->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
@@ -165,7 +170,7 @@ void a2bus_ayboard_device::device_reset()
read_cnxx - called for reads from this card's cnxx space
-------------------------------------------------*/
-uint8_t a2bus_ayboard_device::read_cnxx(uint8_t offset)
+u8 a2bus_ayboard_device::read_cnxx(u8 offset)
{
if (offset <= 0x7f)
{
@@ -179,9 +184,15 @@ uint8_t a2bus_ayboard_device::read_cnxx(uint8_t offset)
return 0;
}
-uint8_t a2bus_phasor_device::read_cnxx(uint8_t offset)
+u8 a2bus_echoplus_device::read_cnxx(u8 offset)
{
- uint8_t ret = 0;
+ m_last_cnxx_addr = offset;
+ return m_via1->read(offset & 0xf);
+}
+
+u8 a2bus_phasor_device::read_cnxx(u8 offset)
+{
+ u8 ret = 0;
int via_sel;
if (m_native)
@@ -212,7 +223,7 @@ uint8_t a2bus_phasor_device::read_cnxx(uint8_t offset)
write_cnxx - called for writes to this card's c0nx space
-------------------------------------------------*/
-void a2bus_ayboard_device::write_cnxx(uint8_t offset, uint8_t data)
+void a2bus_ayboard_device::write_cnxx(u8 offset, u8 data)
{
// When the SSI-263 is emulated, Cn40 will write to both the VIA and
// the first SSI-263, and Cn20 will write to both the VIA and the
@@ -227,7 +238,13 @@ void a2bus_ayboard_device::write_cnxx(uint8_t offset, uint8_t data)
}
}
-void a2bus_phasor_device::write_cnxx(uint8_t offset, uint8_t data)
+void a2bus_echoplus_device::write_cnxx(u8 offset, u8 data)
+{
+ m_last_cnxx_addr = offset;
+ m_via1->write(offset & 0xf, data);
+}
+
+void a2bus_phasor_device::write_cnxx(u8 offset, u8 data)
{
if ((offset < 0x20) || (offset >= 0x80 && offset < 0xa0))
{
@@ -277,12 +294,12 @@ WRITE_LINE_MEMBER( a2bus_ayboard_device::via2_irq_w )
}
}
-void a2bus_ayboard_device::via1_out_a(uint8_t data)
+void a2bus_ayboard_device::via1_out_a(u8 data)
{
m_porta1 = data;
}
-void a2bus_ayboard_device::via1_out_b(uint8_t data)
+void a2bus_ayboard_device::via1_out_b(u8 data)
{
if (!BIT(data, 2))
{
@@ -310,7 +327,65 @@ void a2bus_ayboard_device::via1_out_b(uint8_t data)
}
}
-void a2bus_phasor_device::via1_out_b(uint8_t data)
+void a2bus_echoplus_device::via1_out_b(u8 data)
+{
+ if (!(m_last_cnxx_addr & 0x80))
+ {
+ if (!BIT(data, 2))
+ {
+ m_ay1->reset_w();
+ }
+ else
+ {
+ switch (data & 3)
+ {
+ case 0: // BDIR=0, BC1=0 (inactive)
+ break;
+
+ case 1: // BDIR=0, BC1=1 (read PSG)
+ m_porta1 = m_ay1->data_r();
+ break;
+
+ case 2: // BDIR=1, BC1=0 (write PSG)
+ m_ay1->data_w(m_porta1);
+ break;
+
+ case 3: // BDIR=1, BC1=1 (latch)
+ m_ay1->address_w(m_porta1);
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (!BIT(data, 2))
+ {
+ m_ay2->reset_w();
+ }
+ else
+ {
+ switch (data & 3)
+ {
+ case 0: // BDIR=0, BC1=0 (inactive)
+ break;
+
+ case 1: // BDIR=0, BC1=1 (read PSG)
+ m_porta1 = m_ay2->data_r();
+ break;
+
+ case 2: // BDIR=1, BC1=0 (write PSG)
+ m_ay2->data_w(m_porta1);
+ break;
+
+ case 3: // BDIR=1, BC1=1 (latch)
+ m_ay2->address_w(m_porta1);
+ break;
+ }
+ }
+ }
+}
+
+void a2bus_phasor_device::via1_out_b(u8 data)
{
if (!(data & 4))
{
@@ -359,12 +434,12 @@ void a2bus_phasor_device::via1_out_b(uint8_t data)
}
}
-void a2bus_ayboard_device::via2_out_a(uint8_t data)
+void a2bus_ayboard_device::via2_out_a(u8 data)
{
m_porta2 = data;
}
-void a2bus_ayboard_device::via2_out_b(uint8_t data)
+void a2bus_ayboard_device::via2_out_b(u8 data)
{
if (!BIT(data, 2))
{
@@ -392,7 +467,7 @@ void a2bus_ayboard_device::via2_out_b(uint8_t data)
}
}
-void a2bus_phasor_device::via2_out_b(uint8_t data)
+void a2bus_phasor_device::via2_out_b(u8 data)
{
if (!BIT(data, 2))
{
@@ -463,20 +538,20 @@ void a2bus_phasor_device::set_clocks()
}
}
-uint8_t a2bus_phasor_device::read_c0nx(uint8_t offset)
+u8 a2bus_phasor_device::read_c0nx(u8 offset)
{
m_native = BIT(offset, 0);
set_clocks();
return 0xff;
}
-void a2bus_phasor_device::write_c0nx(uint8_t offset, uint8_t data)
+void a2bus_phasor_device::write_c0nx(u8 offset, u8 data)
{
m_native = BIT(offset, 0);
set_clocks();
}
-uint8_t a2bus_echoplus_device::read_c0nx(uint8_t offset)
+u8 a2bus_echoplus_device::read_c0nx(u8 offset)
{
switch (offset)
{
@@ -487,7 +562,7 @@ uint8_t a2bus_echoplus_device::read_c0nx(uint8_t offset)
return 0;
}
-void a2bus_echoplus_device::write_c0nx(uint8_t offset, uint8_t data)
+void a2bus_echoplus_device::write_c0nx(u8 offset, u8 data)
{
switch (offset)
{
@@ -513,7 +588,7 @@ WRITE_LINE_MEMBER( a2bus_mockingboard_device::write_via1_cb2 )
m_last_cb2_state = state;
}
-void a2bus_mockingboard_device::via1_out_b(uint8_t data)
+void a2bus_mockingboard_device::via1_out_b(u8 data)
{
m_portb1 = data;
diff --git a/src/devices/bus/a2bus/a2mockingboard.h b/src/devices/bus/a2bus/a2mockingboard.h
index 44acff10006..539363c1f10 100644
--- a/src/devices/bus/a2bus/a2mockingboard.h
+++ b/src/devices/bus/a2bus/a2mockingboard.h
@@ -28,10 +28,12 @@ class a2bus_ayboard_device:
public:
DECLARE_WRITE_LINE_MEMBER( via1_irq_w );
DECLARE_WRITE_LINE_MEMBER( via2_irq_w );
- void via1_out_a(uint8_t data);
- virtual void via1_out_b(uint8_t data);
- void via2_out_a(uint8_t data);
- virtual void via2_out_b(uint8_t data);
+ u8 via1_in_a() { return m_porta1; }
+ u8 via2_in_a() { return m_porta2; }
+ void via1_out_a(u8 data);
+ virtual void via1_out_b(u8 data);
+ void via2_out_a(u8 data);
+ virtual void via2_out_b(u8 data);
protected:
// construction/destruction
@@ -42,20 +44,20 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// overrides of standard a2bus slot functions
- virtual uint8_t read_c0nx(uint8_t offset) override { return 0xff; }
- virtual void write_c0nx(uint8_t offset, uint8_t data) override { }
- virtual uint8_t read_cnxx(uint8_t offset) override;
- virtual void write_cnxx(uint8_t offset, uint8_t data) override;
+ virtual u8 read_c0nx(u8 offset) override { return 0xff; }
+ virtual void write_c0nx(u8 offset, u8 data) override { }
+ virtual u8 read_cnxx(u8 offset) override;
+ virtual void write_cnxx(u8 offset, u8 data) override;
void add_common_devices(machine_config &config);
required_device<via6522_device> m_via1;
- required_device<via6522_device> m_via2;
+ optional_device<via6522_device> m_via2;
required_device<ay8913_device> m_ay1;
required_device<ay8913_device> m_ay2;
- uint8_t m_porta1;
- uint8_t m_porta2;
+ u8 m_porta1;
+ u8 m_porta2;
};
class a2bus_mockingboard_device : public a2bus_ayboard_device
@@ -63,7 +65,7 @@ class a2bus_mockingboard_device : public a2bus_ayboard_device
public:
a2bus_mockingboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual void via1_out_b(uint8_t data) override;
+ virtual void via1_out_b(u8 data) override;
protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_reset() override;
@@ -73,7 +75,7 @@ protected:
private:
DECLARE_WRITE_LINE_MEMBER(write_via1_cb2);
- uint8_t m_portb1;
+ u8 m_portb1;
int m_last_cb2_state;
};
@@ -82,16 +84,16 @@ class a2bus_phasor_device : public a2bus_ayboard_device
public:
a2bus_phasor_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void via1_out_b(uint8_t data) override;
- void via2_out_b(uint8_t data) override;
+ void via1_out_b(u8 data) override;
+ void via2_out_b(u8 data) override;
protected:
virtual void device_add_mconfig(machine_config &config) override;
- virtual uint8_t read_c0nx(uint8_t offset) override;
- virtual void write_c0nx(uint8_t offset, uint8_t data) override;
- virtual uint8_t read_cnxx(uint8_t offset) override;
- virtual void write_cnxx(uint8_t offset, uint8_t data) override;
+ virtual u8 read_c0nx(u8 offset) override;
+ virtual void write_c0nx(u8 offset, u8 data) override;
+ virtual u8 read_cnxx(u8 offset) override;
+ virtual void write_cnxx(u8 offset, u8 data) override;
required_device<ay8913_device> m_ay3;
required_device<ay8913_device> m_ay4;
@@ -110,10 +112,17 @@ public:
protected:
virtual void device_add_mconfig(machine_config &config) override;
- virtual uint8_t read_c0nx(uint8_t offset) override;
- virtual void write_c0nx(uint8_t offset, uint8_t data) override;
+ virtual void via1_out_b(u8 data) override;
+
+ virtual u8 read_c0nx(u8 offset) override;
+ virtual void write_c0nx(u8 offset, u8 data) override;
+ virtual u8 read_cnxx(u8 offset) override;
+ virtual void write_cnxx(u8 offset, u8 data) override;
required_device<tms5220_device> m_tms;
+
+private:
+ u8 m_last_cnxx_addr;
};
// device type definition
diff --git a/src/devices/bus/a2bus/titan3plus2.cpp b/src/devices/bus/a2bus/titan3plus2.cpp
new file mode 100644
index 00000000000..e04dc03448a
--- /dev/null
+++ b/src/devices/bus/a2bus/titan3plus2.cpp
@@ -0,0 +1,334 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/*********************************************************************
+
+ titan3plus3.cpp
+
+ Implemention of the Titan "/// Plus //"" card.
+ By R. Belmont, based on reverse-engineering by Rob Justice.
+
+ This extends the Apple ///'s II emulation to include a 128K
+ extended language card and Apple II compatible game I/O.
+
+ The card enables itself if the /// is at 1 MHz and accesses the
+ card's $CNxx ROM space. If the /// goes back to 2 MHz mode at
+ any time, the card disables itself.
+
+ Address ranges this messes with:
+ $C05X - passed through to ///, but also used for annunciators on A2 gameio
+ $C06X - /// doesn't see when card enabled, A2 paddles
+ $C07X - passed through to ///, but also used for A2 paddle reset
+ $C08X - unused by /// (language card control)
+ $D000-$FFFF: usual (for A2) language card space. Not so usual for ///.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "titan3plus2.h"
+
+/***************************************************************************
+ PARAMETERS
+***************************************************************************/
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(A2BUS_TITAN3PLUS2, a2bus_titan3plus2_device, "titan3p2", "Titan /// Plus //")
+
+/***************************************************************************
+ FUNCTION PROTOTYPES
+***************************************************************************/
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+void a2bus_titan3plus2_device::device_add_mconfig(machine_config &config)
+{
+ APPLE2_GAMEIO(config, m_gameio, apple2_gameio_device::default_options, nullptr);
+}
+
+a2bus_titan3plus2_device::a2bus_titan3plus2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, type, tag, owner, clock), device_a2bus_card_interface(mconfig, *this),
+ m_gameio(*this, "gameio"),
+ m_inh_state(0), m_last_offset(0), m_dxxx_bank(0), m_main_bank(0), m_enabled(false)
+{
+}
+
+a2bus_titan3plus2_device::a2bus_titan3plus2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ a2bus_titan3plus2_device(mconfig, A2BUS_TITAN3PLUS2, tag, owner, clock)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void a2bus_titan3plus2_device::device_start()
+{
+ memset(m_ram, 0, 128*1024);
+
+ save_item(NAME(m_inh_state));
+ save_item(NAME(m_ram));
+ save_item(NAME(m_dxxx_bank));
+ save_item(NAME(m_main_bank));
+ save_item(NAME(m_last_offset));
+ save_item(NAME(m_enabled));
+
+ m_x_calibration = m_y_calibration = attotime::from_nsec(10800).as_double();
+}
+
+void a2bus_titan3plus2_device::device_reset()
+{
+ m_inh_state = INH_NONE;
+ m_dxxx_bank = 0;
+ m_main_bank = 0;
+ m_last_offset = -1;
+}
+
+void a2bus_titan3plus2_device::do_io(int offset)
+{
+ int old_inh_state = m_inh_state;
+
+ switch (offset)
+ {
+ case 0x1: case 0x3: case 0x9: case 0xb:
+ if (offset != m_last_offset)
+ {
+ m_last_offset = offset;
+ return;
+ }
+ break;
+ }
+ m_last_offset = offset;
+
+ if (offset & 4)
+ {
+ switch (offset)
+ {
+ case 0x4: m_main_bank = 0x00000; break;
+ case 0x5: m_main_bank = 0x04000; break;
+ case 0x6: m_main_bank = 0x08000; break;
+ case 0x7: m_main_bank = 0x0c000; break;
+ case 0xc: m_main_bank = 0x10000; break;
+ case 0xd: m_main_bank = 0x14000; break;
+ case 0xe: m_main_bank = 0x18000; break;
+ case 0xf: m_main_bank = 0x1c000; break;
+ }
+ }
+ else
+ {
+ m_inh_state = INH_NONE;
+ m_dxxx_bank = 0;
+
+ if (offset & 0x1)
+ {
+ m_inh_state |= INH_WRITE;
+ }
+
+ switch(offset & 0x03)
+ {
+ case 0x00:
+ case 0x03:
+ m_inh_state |= INH_READ;
+ break;
+ }
+
+ if (!(offset & 8))
+ {
+ m_dxxx_bank = 0x1000;
+ }
+ }
+
+ if (m_inh_state != old_inh_state)
+ {
+ recalc_slot_inh();
+ }
+
+ #if 0
+ printf("LC: (ofs %x) new state %c%c dxxx=%04x main=%05x\n",
+ offset,
+ (m_inh_state & INH_READ) ? 'R' : 'x',
+ (m_inh_state & INH_WRITE) ? 'W' : 'x',
+ m_dxxx_bank, m_main_bank);
+ #endif
+}
+
+
+/*-------------------------------------------------
+ read_c08x - called for reads from the LC switches
+-------------------------------------------------*/
+
+uint8_t a2bus_titan3plus2_device::read_c08x(uint8_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ do_io(offset & 0xf);
+ }
+ return 0xff;
+}
+
+
+/*-------------------------------------------------
+ write_c0nx - called for writes to the LC switches
+-------------------------------------------------*/
+
+void a2bus_titan3plus2_device::write_c08x(uint8_t offset, uint8_t data)
+{
+ do_io(offset & 0xf);
+}
+
+uint8_t a2bus_titan3plus2_device::read_inh_rom(uint16_t offset)
+{
+ if (offset < 0xd000)
+ {
+ if ((offset >= 0xc080) && (offset <= 0xc08f))
+ {
+ return read_c08x(offset & 0xf);
+ }
+
+ if ((offset >= 0xc060) && (offset <= 0xc06f))
+ {
+ switch (offset & 0x7)
+ {
+ case 1: // button 0
+ return (m_gameio->sw0_r() ? 0x80 : 0);
+
+ case 2: // button 1
+ return (m_gameio->sw1_r() ? 0x80 : 0);
+
+ case 3: // button 2
+ return (m_gameio->sw2_r() ? 0x80 : 0);
+
+ case 4: // joy 1 X axis
+ if (!m_gameio->is_device_connected())
+ return 0x80;
+ return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0);
+
+ case 5: // joy 1 Y axis
+ if (!m_gameio->is_device_connected())
+ return 0x80;
+ return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0);
+
+ case 6: // joy 2 X axis
+ if (!m_gameio->is_device_connected())
+ return 0x80;
+ return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0);
+
+ case 7: // joy 2 Y axis
+ if (!m_gameio->is_device_connected())
+ return 0x80;
+ return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0);
+ }
+ }
+ }
+ else
+ {
+ if (offset < 0xe000)
+ {
+ return m_ram[(offset & 0xfff) + m_dxxx_bank + m_main_bank];
+ }
+
+ return m_ram[(offset & 0x1fff) + 0x2000 + m_main_bank];
+ }
+
+ return 0xff;
+}
+
+void a2bus_titan3plus2_device::write_inh_rom(uint16_t offset, uint8_t data)
+{
+ if (offset < 0xd000)
+ {
+ if ((offset >= 0xc080) && (offset <= 0xc08f))
+ {
+ write_c08x(offset & 0xf, data);
+ return;
+ }
+ }
+ else
+ {
+ if (offset < 0xe000)
+ {
+ m_ram[(offset & 0xfff) + m_dxxx_bank + m_main_bank] = data;
+ return;
+ }
+
+ m_ram[(offset & 0x1fff) + 0x2000 + m_main_bank] = data;
+ }
+}
+
+u8 a2bus_titan3plus2_device::read_cnxx(u8 offset)
+{
+ m_enabled = true;
+ return 0xff;
+}
+
+// returns if we want to /INH a read or write to a specific address
+bool a2bus_titan3plus2_device::inh_check(u16 offset, bool bIsWrite)
+{
+ if (!m_enabled)
+ {
+ return false;
+ }
+
+ // handle LC
+ if (offset >= 0xd000)
+ {
+ if ((bIsWrite) && (m_inh_state & INH_WRITE))
+ {
+ return true;
+ }
+
+ if (!(bIsWrite) && (m_inh_state & INH_READ))
+ {
+ return true;
+ }
+ }
+
+ if ((offset >= 0xc080) && (offset <= 0xc08f))
+ {
+ return true;
+ }
+
+ if ((offset >= 0xc070) && (offset <= 0xc07f))
+ {
+ m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl0_r();
+ m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl1_r();
+ m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_gameio->pdl2_r();
+ m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_gameio->pdl3_r();
+
+ return false; // Apple /// should still handle this
+ }
+
+ if ((offset >= 0xc060) && (offset <= 0xc06f))
+ {
+ return true;
+ }
+
+ if ((offset >= 0xc058) && (offset <= 0xc05f))
+ {
+ switch (offset & 0xf)
+ {
+ case 8:
+ case 9:
+ m_gameio->an0_w(offset & 1);
+ break;
+ case 0xa:
+ case 0xb:
+ m_gameio->an1_w(offset & 1);
+ break;
+ case 0xc:
+ case 0xd:
+ m_gameio->an2_w(offset & 1);
+ break;
+ case 0xe:
+ case 0xf:
+ m_gameio->an3_w(offset & 1);
+ break;
+ }
+ return false; // Apple /// should still see this
+ }
+
+ return false;
+}
diff --git a/src/devices/bus/a2bus/titan3plus2.h b/src/devices/bus/a2bus/titan3plus2.h
new file mode 100644
index 00000000000..f162f115d8e
--- /dev/null
+++ b/src/devices/bus/a2bus/titan3plus2.h
@@ -0,0 +1,64 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/*********************************************************************
+
+ titan3plus2.h
+
+ Implemention of the Titan /// Plus II card
+
+*********************************************************************/
+
+#ifndef MAME_BUS_A2BUS_TITAN3PLUS2_H
+#define MAME_BUS_A2BUS_TITAN3PLUS2_H
+
+#pragma once
+
+#include "a2bus.h"
+#include "bus/a2gameio/gameio.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class a2bus_titan3plus2_device:
+ public device_t,
+ public device_a2bus_card_interface
+{
+public:
+ // construction/destruction
+ a2bus_titan3plus2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ a2bus_titan3plus2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ // overrides of standard a2bus slot functions
+ virtual u8 read_inh_rom(u16 offset) override;
+ virtual void write_inh_rom(u16 offset, u8 data) override;
+ virtual bool inh_check(uint16_t offset, bool bIsWrite) override;
+
+private:
+ required_device<apple2_gameio_device> m_gameio;
+
+ u8 read_c08x(u8 offset);
+ void write_c08x(u8 offset, u8 data);
+ u8 read_cnxx(u8 offset) override;
+ void do_io(int offset);
+
+ int m_inh_state;
+ int m_last_offset;
+ int m_dxxx_bank;
+ int m_main_bank;
+ u8 m_ram[128*1024];
+ bool m_enabled;
+
+ double m_joystick_x1_time, m_joystick_y1_time, m_joystick_x2_time, m_joystick_y2_time, m_x_calibration, m_y_calibration;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(A2BUS_TITAN3PLUS2, a2bus_titan3plus2_device)
+
+#endif // MAME_BUS_A2BUS_TITAN3PLUS2_H
diff --git a/src/devices/bus/adam/exp.h b/src/devices/bus/adam/exp.h
index ee74bf0396a..d9e993c3a1f 100644
--- a/src/devices/bus/adam/exp.h
+++ b/src/devices/bus/adam/exp.h
@@ -15,14 +15,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define ADAM_LEFT_EXPANSION_SLOT_TAG "slot1"
-#define ADAM_CENTER_EXPANSION_SLOT_TAG "slot2"
-#define ADAM_RIGHT_EXPANSION_SLOT_TAG "slot3"
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/bw2/exp.h b/src/devices/bus/bw2/exp.h
index dfb5924351b..6c6acf11f9a 100644
--- a/src/devices/bus/bw2/exp.h
+++ b/src/devices/bus/bw2/exp.h
@@ -43,13 +43,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define BW2_EXPANSION_SLOT_TAG "exp"
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/cbm2/exp.cpp b/src/devices/bus/cbm2/exp.cpp
index a824ecd051e..cc0f3516bc5 100644
--- a/src/devices/bus/cbm2/exp.cpp
+++ b/src/devices/bus/cbm2/exp.cpp
@@ -76,15 +76,6 @@ cbm2_expansion_slot_device::cbm2_expansion_slot_device(const machine_config &mco
void cbm2_expansion_slot_device::device_start()
{
m_card = get_card_device();
-
- // inherit bus clock
- // FIXME: this should be unnecessary as slots pass DERIVED_CLOCK(1, 1) through by default
- if (clock() == 0)
- {
- cbm2_expansion_slot_device *root = machine().root_device().subdevice<cbm2_expansion_slot_device>(CBM2_EXPANSION_SLOT_TAG);
- assert(root);
- set_unscaled_clock(root->clock());
- }
}
diff --git a/src/devices/bus/cbm2/exp.h b/src/devices/bus/cbm2/exp.h
index 9781e4ac05a..b9f967137ca 100644
--- a/src/devices/bus/cbm2/exp.h
+++ b/src/devices/bus/cbm2/exp.h
@@ -34,13 +34,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define CBM2_EXPANSION_SLOT_TAG "exp"
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/coco/coco_multi.cpp b/src/devices/bus/coco/coco_multi.cpp
index 7006281286f..2061c905b3f 100644
--- a/src/devices/bus/coco/coco_multi.cpp
+++ b/src/devices/bus/coco/coco_multi.cpp
@@ -101,6 +101,8 @@ namespace
INPUT_CHANGED_MEMBER( switch_changed );
protected:
+ coco_multipak_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
@@ -119,10 +121,12 @@ namespace
virtual address_space &cartridge_space() override;
virtual ioport_constructor device_input_ports() const override;
- private:
// device references
required_device_array<cococart_slot_device, 4> m_slots;
+ void update_line(int slot_number, line ln);
+
+ private:
// internal state
u8 m_select;
u8 m_block;
@@ -138,24 +142,24 @@ namespace
void set_select(u8 new_select);
u8 ff7f_read();
void ff7f_write(u8 data);
- void update_line(int slot_number, line ln);
-
- DECLARE_WRITE_LINE_MEMBER(multi_slot1_cart_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot1_nmi_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot1_halt_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot2_cart_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot2_nmi_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot2_halt_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot3_cart_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot3_nmi_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot3_halt_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot4_cart_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot4_nmi_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot4_halt_w);
};
};
+// ======================> dragon_multipak_device
+
+class dragon_multipak_device : public coco_multipak_device
+{
+public:
+ // construction/destruction
+ dragon_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+};
+
+
/***************************************************************************
IMPLEMENTATION
***************************************************************************/
@@ -175,21 +179,54 @@ static void coco_cart_slot4(device_slot_interface &device)
void coco_multipak_device::device_add_mconfig(machine_config &config)
{
COCOCART_SLOT(config, m_slots[0], DERIVED_CLOCK(1, 1), coco_cart_slot1_3, nullptr);
- m_slots[0]->cart_callback().set(FUNC(coco_multipak_device::multi_slot1_cart_w));
- m_slots[0]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot1_nmi_w));
- m_slots[0]->halt_callback().set(FUNC(coco_multipak_device::multi_slot1_halt_w));
+ m_slots[0]->cart_callback().set([this](int state) { update_line(1, line::CART); });
+ m_slots[0]->nmi_callback().set([this](int state) { update_line(1, line::NMI); });
+ m_slots[0]->halt_callback().set([this](int state) { update_line(1, line::HALT); });
COCOCART_SLOT(config, m_slots[1], DERIVED_CLOCK(1, 1), coco_cart_slot1_3, nullptr);
- m_slots[1]->cart_callback().set(FUNC(coco_multipak_device::multi_slot2_cart_w));
- m_slots[1]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot2_nmi_w));
- m_slots[1]->halt_callback().set(FUNC(coco_multipak_device::multi_slot2_halt_w));
+ m_slots[1]->cart_callback().set([this](int state) { update_line(2, line::CART); });
+ m_slots[1]->nmi_callback().set([this](int state) { update_line(2, line::NMI); });
+ m_slots[1]->halt_callback().set([this](int state) { update_line(2, line::HALT); });
COCOCART_SLOT(config, m_slots[2], DERIVED_CLOCK(1, 1), coco_cart_slot1_3, nullptr);
- m_slots[2]->cart_callback().set(FUNC(coco_multipak_device::multi_slot3_cart_w));
- m_slots[2]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot3_nmi_w));
- m_slots[2]->halt_callback().set(FUNC(coco_multipak_device::multi_slot3_halt_w));
+ m_slots[2]->cart_callback().set([this](int state) { update_line(3, line::CART); });
+ m_slots[2]->nmi_callback().set([this](int state) { update_line(3, line::NMI); });
+ m_slots[2]->halt_callback().set([this](int state) { update_line(3, line::HALT); });
COCOCART_SLOT(config, m_slots[3], DERIVED_CLOCK(1, 1), coco_cart_slot4, "fdcv11");
- m_slots[3]->cart_callback().set(FUNC(coco_multipak_device::multi_slot4_cart_w));
- m_slots[3]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot4_nmi_w));
- m_slots[3]->halt_callback().set(FUNC(coco_multipak_device::multi_slot4_halt_w));
+ m_slots[3]->cart_callback().set([this](int state) { update_line(4, line::CART); });
+ m_slots[3]->nmi_callback().set([this](int state) { update_line(4, line::NMI); });
+ m_slots[3]->halt_callback().set([this](int state) { update_line(4, line::HALT); });
+}
+
+
+static void dragon_cart_slot1_3(device_slot_interface &device)
+{
+ dragon_cart_add_basic_devices(device);
+}
+
+static void dragon_cart_slot4(device_slot_interface &device)
+{
+ dragon_cart_add_basic_devices(device);
+ dragon_cart_add_fdcs(device);
+}
+
+
+void dragon_multipak_device::device_add_mconfig(machine_config &config)
+{
+ COCOCART_SLOT(config, m_slots[0], DERIVED_CLOCK(1, 1), dragon_cart_slot1_3, nullptr);
+ m_slots[0]->cart_callback().set([this](int state) { update_line(1, line::CART); });
+ m_slots[0]->nmi_callback().set([this](int state) { update_line(1, line::NMI); });
+ m_slots[0]->halt_callback().set([this](int state) { update_line(1, line::HALT); });
+ COCOCART_SLOT(config, m_slots[1], DERIVED_CLOCK(1, 1), dragon_cart_slot1_3, nullptr);
+ m_slots[1]->cart_callback().set([this](int state) { update_line(2, line::CART); });
+ m_slots[1]->nmi_callback().set([this](int state) { update_line(2, line::NMI); });
+ m_slots[1]->halt_callback().set([this](int state) { update_line(2, line::HALT); });
+ COCOCART_SLOT(config, m_slots[2], DERIVED_CLOCK(1, 1), dragon_cart_slot1_3, nullptr);
+ m_slots[2]->cart_callback().set([this](int state) { update_line(3, line::CART); });
+ m_slots[2]->nmi_callback().set([this](int state) { update_line(3, line::NMI); });
+ m_slots[2]->halt_callback().set([this](int state) { update_line(3, line::HALT); });
+ COCOCART_SLOT(config, m_slots[3], DERIVED_CLOCK(1, 1), dragon_cart_slot4, "dragon_fdc");
+ m_slots[3]->cart_callback().set([this](int state) { update_line(4, line::CART); });
+ m_slots[3]->nmi_callback().set([this](int state) { update_line(4, line::NMI); });
+ m_slots[3]->halt_callback().set([this](int state) { update_line(4, line::HALT); });
}
INPUT_PORTS_START( coco_multipack )
@@ -206,6 +243,7 @@ INPUT_PORTS_END
//**************************************************************************
DEFINE_DEVICE_TYPE_PRIVATE(COCO_MULTIPAK, device_cococart_interface, coco_multipak_device, "coco_multipack", "CoCo Multi-Pak Interface")
+DEFINE_DEVICE_TYPE_PRIVATE(DRAGON_MULTIPAK, device_cococart_interface, dragon_multipak_device, "dragon_multipack", "Dragon Multi-Pak Interface")
@@ -226,13 +264,22 @@ ioport_constructor coco_multipak_device::device_input_ports() const
// coco_multipak_device - constructor
//-------------------------------------------------
-coco_multipak_device::coco_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : device_t(mconfig, COCO_MULTIPAK, tag, owner, clock)
+coco_multipak_device::coco_multipak_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
, device_cococart_interface(mconfig, *this)
, m_slots(*this, "slot%u", 1), m_select(0), m_block(0)
{
}
+coco_multipak_device::coco_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : coco_multipak_device(mconfig, COCO_MULTIPAK, tag, owner, clock)
+{
+}
+
+dragon_multipak_device::dragon_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : coco_multipak_device(mconfig, DRAGON_MULTIPAK, tag, owner, clock)
+{
+}
//-------------------------------------------------
// device_start - device-specific startup
@@ -486,24 +533,6 @@ void coco_multipak_device::scs_write(offs_t offset, u8 data)
//-------------------------------------------------
-// multiX_slotX_[cart|nmi|halt] trampolines
-//-------------------------------------------------
-
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot1_cart_w) { update_line(1, line::CART); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot1_nmi_w) { update_line(1, line::NMI); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot1_halt_w) { update_line(1, line::HALT); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot2_cart_w) { update_line(2, line::CART); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot2_nmi_w) { update_line(2, line::NMI); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot2_halt_w) { update_line(2, line::HALT); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot3_cart_w) { update_line(3, line::CART); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot3_nmi_w) { update_line(3, line::NMI); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot3_halt_w) { update_line(3, line::HALT); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot4_cart_w) { update_line(4, line::CART); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot4_nmi_w) { update_line(4, line::NMI); }
-WRITE_LINE_MEMBER(coco_multipak_device::multi_slot4_halt_w) { update_line(4, line::HALT); }
-
-
-//-------------------------------------------------
// cartridge_space
//-------------------------------------------------
diff --git a/src/devices/bus/coco/coco_multi.h b/src/devices/bus/coco/coco_multi.h
index eb66aee9660..94e9c6bbc05 100644
--- a/src/devices/bus/coco/coco_multi.h
+++ b/src/devices/bus/coco/coco_multi.h
@@ -9,5 +9,6 @@
// device type definition
DECLARE_DEVICE_TYPE(COCO_MULTIPAK, device_cococart_interface)
+DECLARE_DEVICE_TYPE(DRAGON_MULTIPAK, device_cococart_interface)
#endif // MAME_BUS_COCO_COCO_MULTIPAK_H
diff --git a/src/devices/bus/coco/coco_wpk.cpp b/src/devices/bus/coco/coco_wpk.cpp
new file mode 100644
index 00000000000..8841c2960ea
--- /dev/null
+++ b/src/devices/bus/coco/coco_wpk.cpp
@@ -0,0 +1,201 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ PBJ Word-Pak/Word-Pak II - 80 Column Video Cartridge
+
+ TODO:
+ - the R6545 Transparent Mode used to update video RAM needs some attention.
+ - original PBJ WorkPak (not II or RS) had an optional Basic Driver ROM (undumped).
+ - does WordPak II use different character ROM?
+
+***************************************************************************/
+
+#include "emu.h"
+#include "coco_wpk.h"
+#include "render.h"
+#include "screen.h"
+
+
+//-------------------------------------------------
+// ROM( coco_wpk )
+//-------------------------------------------------
+
+ROM_START(coco_wpk)
+ ROM_REGION(0x0800, "chargen", 0)
+ ROM_LOAD("chr_gen_4.0.rom", 0x0000, 0x0800, CRC(6e9a671a) SHA1(0ff5fae512c7f1abe138504d51492404dd86be03)) // from PBJ WordPak RS
+ROM_END
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(COCO_WPK, coco_wpk_device, "coco_wpk", "CoCo WordPak")
+DEFINE_DEVICE_TYPE(COCO_WPK2, coco_wpk2_device, "coco_wpk2", "CoCo WordPak II")
+DEFINE_DEVICE_TYPE(COCO_WPKRS, coco_wpkrs_device, "coco_wpkrs", "CoCo WordPak RS")
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// coco_wpk_device - constructor
+//-------------------------------------------------
+
+coco_wpk_device::coco_wpk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_cococart_interface(mconfig, *this )
+ , m_crtc(*this, "crtc")
+ , m_palette(*this, "palette")
+ , m_chargen(*this, "chargen")
+ , m_video_addr(0)
+ , m_video_data(0)
+{
+}
+
+coco_wpk_device::coco_wpk_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : coco_wpk_device(mconfig, COCO_WPK, tag, owner, clock)
+{
+}
+
+coco_wpk2_device::coco_wpk2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : coco_wpk_device(mconfig, COCO_WPK2, tag, owner, clock)
+{
+}
+
+coco_wpkrs_device::coco_wpkrs_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : coco_wpk_device(mconfig, COCO_WPKRS, tag, owner, clock)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void coco_wpk_device::device_start()
+{
+ m_video_ram = std::make_unique<u8[]>(0x800);
+
+ save_pointer(NAME(m_video_ram), 0x800);
+ save_item(NAME(m_video_addr));
+}
+
+void coco_wpk2_device::device_start()
+{
+ coco_wpk_device::device_start();
+}
+
+void coco_wpkrs_device::device_start()
+{
+ coco_wpk_device::device_start();
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void coco_wpk_device::device_reset()
+{
+ install_readwrite_handler(0xff98, 0xff98, read8smo_delegate(*m_crtc, FUNC(r6545_1_device::status_r)), write8smo_delegate(*m_crtc, FUNC(r6545_1_device::address_w)));
+ install_readwrite_handler(0xff99, 0xff99, read8smo_delegate(*m_crtc, FUNC(r6545_1_device::register_r)), write8smo_delegate(*m_crtc, FUNC(r6545_1_device::register_w)));
+ install_write_handler(0xff9b, 0xff9b, write8smo_delegate(*this, FUNC(coco_wpkrs_device::crtc_display_w)));
+}
+
+void coco_wpk2_device::device_reset()
+{
+ coco_wpk_device::device_reset();
+
+ install_write_handler(0xff9c, 0xff9c, write8smo_delegate(*this, FUNC(coco_wpk2_device::video_select_w)));
+
+ machine().render().first_target()->set_view(0);
+}
+
+void coco_wpkrs_device::device_reset()
+{
+ install_readwrite_handler(0xff76, 0xff76, read8smo_delegate(*m_crtc, FUNC(r6545_1_device::status_r)), write8smo_delegate(*m_crtc, FUNC(r6545_1_device::address_w)));
+ install_readwrite_handler(0xff77, 0xff77, read8smo_delegate(*m_crtc, FUNC(r6545_1_device::register_r)), write8smo_delegate(*m_crtc, FUNC(r6545_1_device::register_w)));
+ install_write_handler(0xff79, 0xff79, write8smo_delegate(*this, FUNC(coco_wpkrs_device::crtc_display_w)));
+}
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void coco_wpk_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(14.318181_MHz_XTAL, 896, 0, 640, 290, 0, 240);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+
+ PALETTE(config, m_palette, palette_device::MONOCHROME);
+
+ R6545_1(config, m_crtc, 14.318181_MHz_XTAL / 8);
+ m_crtc->set_screen("screen");
+ m_crtc->set_show_border_area(false);
+ m_crtc->set_char_width(8);
+ m_crtc->set_on_update_addr_change_callback(FUNC(coco_wpkrs_device::crtc_addr));
+ m_crtc->set_update_row_callback(FUNC(coco_wpkrs_device::crtc_update_row));
+}
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *coco_wpk_device::device_rom_region() const
+{
+ return ROM_NAME( coco_wpk );
+}
+
+
+void coco_wpk_device::crtc_display_w(u8 data)
+{
+ //logerror("crtc_display_w: %02x\n", data);
+ m_video_ram[m_video_addr] = data;
+
+ m_crtc->register_r();
+}
+
+
+MC6845_ON_UPDATE_ADDR_CHANGED(coco_wpk_device::crtc_addr)
+{
+ //logerror("crtc_addr: %04x %d\n", address, strobe);
+ m_video_addr = address;
+}
+
+
+MC6845_UPDATE_ROW(coco_wpk_device::crtc_update_row)
+{
+ u32 *p = &bitmap.pix(y);
+
+ for (int column = 0; column < x_count; column++)
+ {
+ u8 code = m_video_ram[(ma + column) & 0x7ff];
+ u16 addr = (code << 4) | (ra & 0x0f);
+ u8 data = m_chargen->base()[addr & 0x7ff];
+
+ if (column == cursor_x)
+ {
+ data = 0xff;
+ }
+
+ for (int bit = 0; bit < 8; bit++)
+ {
+ *p++ = m_palette->pen(BIT(data, 0) && de);
+
+ data >>= 1;
+ }
+ }
+}
+
+
+void coco_wpk2_device::video_select_w(u8 data)
+{
+ // software video switch (Word-Pak II only)
+ machine().render().first_target()->set_view(BIT(data, 6));
+}
diff --git a/src/devices/bus/coco/coco_wpk.h b/src/devices/bus/coco/coco_wpk.h
new file mode 100644
index 00000000000..65534dd3709
--- /dev/null
+++ b/src/devices/bus/coco/coco_wpk.h
@@ -0,0 +1,94 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+#ifndef MAME_BUS_COCO_COCO_WPK_H
+#define MAME_BUS_COCO_COCO_WPK_H
+
+#pragma once
+
+#include "cococart.h"
+#include "video/mc6845.h"
+#include "emupal.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> coco_wpk_device
+
+class coco_wpk_device :
+ public device_t,
+ public device_cococart_interface
+{
+public:
+ static constexpr feature_type imperfect_features() { return feature::GRAPHICS; }
+
+ // construction/destruction
+ coco_wpk_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // construction/destruction
+ coco_wpk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ required_device<r6545_1_device> m_crtc;
+ required_device<palette_device> m_palette;
+ required_memory_region m_chargen;
+
+ u16 m_video_addr;
+ u8 m_video_data;
+
+ std::unique_ptr<u8[]> m_video_ram;
+
+ void crtc_display_w(u8 data);
+ MC6845_ON_UPDATE_ADDR_CHANGED(crtc_addr);
+ MC6845_UPDATE_ROW(crtc_update_row);
+};
+
+
+// ======================> coco_wpk2_device
+
+class coco_wpk2_device : public coco_wpk_device
+{
+public:
+ // construction/destruction
+ coco_wpk2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ void video_select_w(u8 data);
+};
+
+
+// ======================> coco_wpkrs_device
+
+class coco_wpkrs_device : public coco_wpk_device
+{
+public:
+ // construction/destruction
+ coco_wpkrs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(COCO_WPK, coco_wpk_device)
+DECLARE_DEVICE_TYPE(COCO_WPK2, coco_wpk2_device)
+DECLARE_DEVICE_TYPE(COCO_WPKRS, coco_wpkrs_device)
+
+#endif // MAME_BUS_COCO_COCO_WPK_H
diff --git a/src/devices/bus/coco/coco_wpk2p.cpp b/src/devices/bus/coco/coco_wpk2p.cpp
new file mode 100644
index 00000000000..62fb2504bf7
--- /dev/null
+++ b/src/devices/bus/coco/coco_wpk2p.cpp
@@ -0,0 +1,56 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ CoCo WordPak 2+
+
+***************************************************************************/
+
+#include "emu.h"
+#include "coco_wpk2p.h"
+#include "screen.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(COCO_WPK2P, coco_wpk2p_device, "coco_wpk2p", "CoCo WordPak 2+")
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// coco_wpk2p_device - constructor
+//-------------------------------------------------
+
+coco_wpk2p_device::coco_wpk2p_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, COCO_WPK2P, tag, owner, clock)
+ , device_cococart_interface(mconfig, *this )
+ , m_v9958(*this, "v9958")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void coco_wpk2p_device::device_start()
+{
+ install_readwrite_handler(0xff78, 0xff7b, read8sm_delegate(*m_v9958, FUNC(v9958_device::read)), write8sm_delegate(*m_v9958, FUNC(v9958_device::write)));
+}
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void coco_wpk2p_device::device_add_mconfig(machine_config &config)
+{
+ /* video hardware */
+ V9958(config, m_v9958, 21.477272_MHz_XTAL);
+ m_v9958->set_screen_ntsc("screen");
+ m_v9958->set_vram_size(0x20000);
+ m_v9958->int_cb().set([this](int state) { set_line_value(line::NMI, state); });
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+}
diff --git a/src/devices/bus/coco/coco_wpk2p.h b/src/devices/bus/coco/coco_wpk2p.h
new file mode 100644
index 00000000000..f6c3debc766
--- /dev/null
+++ b/src/devices/bus/coco/coco_wpk2p.h
@@ -0,0 +1,41 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+#ifndef MAME_BUS_COCO_COCO_WPK2P_H
+#define MAME_BUS_COCO_COCO_WPK2P_H
+
+#pragma once
+
+#include "cococart.h"
+#include "video/v9938.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> coco_wpk2p_device
+
+class coco_wpk2p_device :
+ public device_t,
+ public device_cococart_interface
+{
+public:
+ // construction/destruction
+ coco_wpk2p_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+private:
+ required_device<v9958_device> m_v9958;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(COCO_WPK2P, coco_wpk2p_device)
+
+#endif // MAME_BUS_COCO_COCO_WPK2P_H
diff --git a/src/devices/bus/coco/cococart.cpp b/src/devices/bus/coco/cococart.cpp
index 8f733cd6c6a..28e97457114 100644
--- a/src/devices/bus/coco/cococart.cpp
+++ b/src/devices/bus/coco/cococart.cpp
@@ -54,6 +54,17 @@
#include "coco_ssc.h"
#include "coco_stecomp.h"
#include "coco_sym12.h"
+#include "coco_wpk.h"
+#include "coco_wpk2p.h"
+
+#include "dragon_amtor.h"
+#include "dragon_claw.h"
+#include "dragon_fdc.h"
+#include "dragon_jcbsnd.h"
+#include "dragon_jcbspch.h"
+#include "dragon_msx2.h"
+#include "dragon_serial.h"
+#include "dragon_sprites.h"
/***************************************************************************
@@ -702,12 +713,17 @@ void coco_cart_add_basic_devices(device_slot_interface &device)
device.option_add("gmc", COCO_PAK_GMC);
device.option_add("max", COCO_PAK_MAX);
device.option_add("midi", COCO_MIDI);
+ device.option_add("msx2", DRAGON_MSX2);
device.option_add("orch90", COCO_ORCH90);
device.option_add("ram", COCO_PAK_RAM);
device.option_add("rs232", COCO_RS232);
device.option_add("ssc", COCO_SSC);
device.option_add("stecomp", COCO_STEREO_COMPOSER);
device.option_add("sym12", COCO_SYM12);
+ device.option_add("wpk", COCO_WPK);
+ device.option_add("wpk2", COCO_WPK2);
+ device.option_add("wpkrs", COCO_WPKRS);
+ device.option_add("wpk2p", COCO_WPK2P);
}
@@ -737,3 +753,52 @@ void coco_cart_add_multi_pak(device_slot_interface &device)
// and the Multi-Pak itself is optional because they cannot be daisy chained
device.option_add("multi", COCO_MULTIPAK);
}
+
+
+//-------------------------------------------------
+// dragon_cart_add_basic_devices
+//-------------------------------------------------
+
+void dragon_cart_add_basic_devices(device_slot_interface &device)
+{
+ device.option_add_internal("amtor", DRAGON_AMTOR);
+ device.option_add("ccpsg", COCO_PSG);
+ device.option_add("claw", DRAGON_CLAW);
+ device.option_add("gmc", COCO_PAK_GMC);
+ device.option_add("jcbsnd", DRAGON_JCBSND);
+ device.option_add("jcbspch", DRAGON_JCBSPCH);
+ device.option_add("max", COCO_PAK_MAX);
+ device.option_add("midi", DRAGON_MIDI);
+ device.option_add("msx2", DRAGON_MSX2);
+ device.option_add("orch90", COCO_ORCH90);
+ device.option_add("pak", COCO_PAK);
+ device.option_add("serial", DRAGON_SERIAL);
+ device.option_add("ram", COCO_PAK_RAM);
+ device.option_add("sprites", DRAGON_SPRITES);
+ device.option_add("ssc", COCO_SSC);
+ device.option_add("stecomp", COCO_STEREO_COMPOSER);
+ device.option_add("sym12", COCO_SYM12);
+ device.option_add("wpk2p", COCO_WPK2P);
+}
+
+
+//-------------------------------------------------
+// dragon_cart_add_fdcs
+//-------------------------------------------------
+
+void dragon_cart_add_fdcs(device_slot_interface &device)
+{
+ device.option_add("dragon_fdc", DRAGON_FDC);
+ device.option_add("premier_fdc", PREMIER_FDC);
+ device.option_add("sdtandy_fdc", SDTANDY_FDC);
+}
+
+
+//-------------------------------------------------
+// dragon_cart_add_multi_pak
+//-------------------------------------------------
+
+void dragon_cart_add_multi_pak(device_slot_interface &device)
+{
+ device.option_add("multi", DRAGON_MULTIPAK);
+}
diff --git a/src/devices/bus/coco/cococart.h b/src/devices/bus/coco/cococart.h
index 78176588969..d2e33085956 100644
--- a/src/devices/bus/coco/cococart.h
+++ b/src/devices/bus/coco/cococart.h
@@ -231,5 +231,8 @@ private:
void coco_cart_add_basic_devices(device_slot_interface &device);
void coco_cart_add_fdcs(device_slot_interface &device);
void coco_cart_add_multi_pak(device_slot_interface &device);
+void dragon_cart_add_basic_devices(device_slot_interface &device);
+void dragon_cart_add_fdcs(device_slot_interface &device);
+void dragon_cart_add_multi_pak(device_slot_interface &device);
#endif // MAME_BUS_COCO_COCOCART_H
diff --git a/src/devices/bus/coco/dragon_claw.cpp b/src/devices/bus/coco/dragon_claw.cpp
new file mode 100644
index 00000000000..a4c00b0f71a
--- /dev/null
+++ b/src/devices/bus/coco/dragon_claw.cpp
@@ -0,0 +1,212 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ The Dragon's Claw from Lucidata
+
+ http://archive.worldofdragon.org/index.php?title=The_Dragon%27s_Claw
+
+ The Dragon's Claw is an extension cartridge for the Dragon by Lucidata.
+ It features two parallel I/O ports. One with the BBC User Port pinout,
+ and the second with a Centronics Printer Port pinout.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "dragon_claw.h"
+#include "bus/bbc/userport/userport.h"
+#include "bus/centronics/ctronics.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE_PRIVATE(DRAGON_CLAW, device_cococart_interface, dragon_claw_device, "dragon_claw", "The Dragon's Claw")
+
+//-------------------------------------------------
+// INPUT_PORTS( claw )
+//-------------------------------------------------
+
+INPUT_PORTS_START(claw)
+ PORT_START("LINKS")
+ PORT_CONFNAME(0x03, 0x00, "L1 Address Selection")
+ PORT_CONFSETTING(0x00, "$FF80")
+ PORT_CONFSETTING(0x01, "$FF90")
+ PORT_CONFSETTING(0x02, "$FFA0")
+ PORT_CONFSETTING(0x03, "$FFB0")
+ PORT_CONFNAME(0x04, 0x00, "L2 Interrupt Line")
+ PORT_CONFSETTING(0x00, "NMI")
+ PORT_CONFSETTING(0x04, "CART")
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor dragon_claw_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(claw);
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// dragon_claw_device - constructor
+//-------------------------------------------------
+
+dragon_claw_device::dragon_claw_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, DRAGON_CLAW, tag, owner, clock)
+ , device_cococart_interface(mconfig, *this )
+ , m_via(*this, "via")
+ , m_slot(*this, "slot")
+ , m_links(*this, "LINKS")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void dragon_claw_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void dragon_claw_device::device_reset()
+{
+ uint8_t addr = (m_links->read() & 0x03) << 8;
+
+ install_readwrite_handler(0xff80 | addr, 0xff8f | addr, read8sm_delegate(*m_via, FUNC(via6522_device::read)), write8sm_delegate(*m_via, FUNC(via6522_device::write)));
+}
+
+static void dragon_cart(device_slot_interface &device)
+{
+ dragon_cart_add_basic_devices(device);
+ dragon_cart_add_fdcs(device);
+}
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void dragon_claw_device::device_add_mconfig(machine_config &config)
+{
+ MOS6522(config, m_via, DERIVED_CLOCK(1, 1));
+ m_via->writepa_handler().set("cent_data_out", FUNC(output_latch_device::write));
+ m_via->readpb_handler().set("userport", FUNC(bbc_userport_slot_device::pb_r));
+ m_via->writepb_handler().set("userport", FUNC(bbc_userport_slot_device::pb_w));
+ m_via->ca2_handler().set("centronics", FUNC(centronics_device::write_strobe));
+ m_via->cb1_handler().set("userport", FUNC(bbc_userport_slot_device::write_cb1));
+ m_via->cb2_handler().set("userport", FUNC(bbc_userport_slot_device::write_cb2));
+ m_via->irq_handler().set(FUNC(dragon_claw_device::irq_w)); // link L2 selects either NMI or CART line
+
+ bbc_userport_slot_device &userport(BBC_USERPORT_SLOT(config, "userport", bbc_userport_devices, nullptr));
+ userport.cb1_handler().set(m_via, FUNC(via6522_device::write_cb1));
+ userport.cb2_handler().set(m_via, FUNC(via6522_device::write_cb2));
+
+ centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, nullptr));
+ centronics.ack_handler().set(m_via, FUNC(via6522_device::write_ca1));
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(latch);
+
+ COCOCART_SLOT(config, m_slot, DERIVED_CLOCK(1, 1), dragon_cart, nullptr);
+ m_slot->cart_callback().set([this](int state) { set_line_value(line::CART, state); });
+ m_slot->nmi_callback().set([this](int state) { set_line_value(line::NMI, state); });
+ m_slot->halt_callback().set([this](int state) { set_line_value(line::HALT, state); });
+}
+
+WRITE_LINE_MEMBER(dragon_claw_device::irq_w)
+{
+ if (m_links->read() & 0x04)
+ set_line_value(line::CART, state);
+ else
+ set_line_value(line::NMI, state);
+}
+
+
+//-------------------------------------------------
+// set_sound_enable
+//-------------------------------------------------
+
+void dragon_claw_device::set_sound_enable(bool sound_enable)
+{
+ m_slot->set_line_value(line::SOUND_ENABLE, sound_enable ? line_value::ASSERT : line_value::CLEAR);
+}
+
+
+//-------------------------------------------------
+// get_cart_base
+//-------------------------------------------------
+
+u8 *dragon_claw_device::get_cart_base()
+{
+ return m_slot->get_cart_base();
+}
+
+
+//-------------------------------------------------
+// get_cart_size
+//-------------------------------------------------
+
+u32 dragon_claw_device::get_cart_size()
+{
+ return m_slot->get_cart_size();
+}
+
+
+//-------------------------------------------------
+// cts_read
+//-------------------------------------------------
+
+u8 dragon_claw_device::cts_read(offs_t offset)
+{
+ return m_slot->cts_read(offset);
+}
+
+
+//-------------------------------------------------
+// cts_write
+//-------------------------------------------------
+
+void dragon_claw_device::cts_write(offs_t offset, u8 data)
+{
+ m_slot->cts_write(offset, data);
+}
+
+
+//-------------------------------------------------
+// scs_read
+//-------------------------------------------------
+
+u8 dragon_claw_device::scs_read(offs_t offset)
+{
+ return m_slot->scs_read(offset);
+}
+
+
+//-------------------------------------------------
+// scs_write
+//-------------------------------------------------
+
+void dragon_claw_device::scs_write(offs_t offset, u8 data)
+{
+ m_slot->scs_write(offset, data);
+}
+
+
+//-------------------------------------------------
+// cartridge_space
+//-------------------------------------------------
+
+address_space &dragon_claw_device::cartridge_space()
+{
+ return device_cococart_interface::cartridge_space();
+}
diff --git a/src/devices/bus/coco/dragon_claw.h b/src/devices/bus/coco/dragon_claw.h
new file mode 100644
index 00000000000..9743b5b0b3c
--- /dev/null
+++ b/src/devices/bus/coco/dragon_claw.h
@@ -0,0 +1,59 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+#ifndef MAME_BUS_COCO_DRAGON_CLAW_H
+#define MAME_BUS_COCO_DRAGON_CLAW_H
+
+#pragma once
+
+#include "cococart.h"
+#include "machine/6522via.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> dragon_claw_device
+
+class dragon_claw_device :
+ public device_t,
+ public device_cococart_interface,
+ public device_cococart_host_interface
+{
+public:
+ // construction/destruction
+ dragon_claw_device(const machine_config& mconfig, const char* tag, device_t* owner, u32 clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config& config) override;
+ virtual ioport_constructor device_input_ports() const override;
+
+ virtual u8 cts_read(offs_t offset) override;
+ virtual void cts_write(offs_t offset, u8 data) override;
+ virtual u8 scs_read(offs_t offset) override;
+ virtual void scs_write(offs_t offset, u8 data) override;
+ virtual void set_sound_enable(bool sound_enable) override;
+
+ virtual u8 *get_cart_base() override;
+ virtual u32 get_cart_size() override;
+
+ virtual address_space &cartridge_space() override;
+
+private:
+ DECLARE_WRITE_LINE_MEMBER(irq_w);
+
+ required_device<via6522_device> m_via;
+ required_device<cococart_slot_device> m_slot;
+ required_ioport m_links;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(DRAGON_CLAW, device_cococart_interface)
+
+#endif // MAME_BUS_COCO_DRAGON_CLAW_H
diff --git a/src/devices/bus/coco/dragon_msx2.cpp b/src/devices/bus/coco/dragon_msx2.cpp
new file mode 100644
index 00000000000..9460b6955f3
--- /dev/null
+++ b/src/devices/bus/coco/dragon_msx2.cpp
@@ -0,0 +1,191 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+// thanks-to:John Whitworth
+/***************************************************************************
+
+ Dragon MSX 2+ by DragonPlus Electronics
+
+***************************************************************************/
+
+#include "emu.h"
+#include "dragon_msx2.h"
+#include "render.h"
+#include "screen.h"
+#include "speaker.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(DRAGON_MSX2, dragon_msx2_device, "dragon_msx2", "Dragon MSX 2+")
+
+
+//-------------------------------------------------
+// INPUT_PORTS( dragon_msx2 )
+//-------------------------------------------------
+
+INPUT_PORTS_START( dragon_msx2 )
+ PORT_START("CONFIG")
+ PORT_CONFNAME(0x01, 0x00, "J1 PWR")
+ PORT_CONFSETTING(0x00, "Cart Port")
+ PORT_CONFSETTING(0x01, "External")
+ PORT_CONFNAME(0x02, 0x00, "J2 CART")
+ PORT_CONFSETTING(0x00, "N/C")
+ PORT_CONFSETTING(0x02, "HSYNC")
+ PORT_CONFNAME(0x04, 0x00, "J3 Port Select")
+ PORT_CONFSETTING(0x00, "FF7* (Native)")
+ PORT_CONFSETTING(0x04, "FF5* (MPI)")
+ PORT_CONFNAME(0x08, 0x08, "J4 Default Video")
+ PORT_CONFSETTING(0x00, "V9958")
+ PORT_CONFSETTING(0x08, "MC6847")
+ PORT_CONFNAME(0x10, 0x10, "J5 Video Lock")
+ PORT_CONFSETTING(0x00, "Locked")
+ PORT_CONFSETTING(0x10, "Unlocked")
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor dragon_msx2_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( dragon_msx2 );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// dragon_msx2_device - constructor
+//-------------------------------------------------
+
+dragon_msx2_device::dragon_msx2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, DRAGON_MSX2, tag, owner, clock)
+ , device_cococart_interface(mconfig, *this )
+ , m_ym2413(*this, "ym2413")
+ , m_v9958(*this, "v9958")
+ , m_ym2149(*this, "ym2149")
+ , m_config(*this, "CONFIG")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void dragon_msx2_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void dragon_msx2_device::device_reset()
+{
+ // pin 26 is tied to GND
+ m_ym2149->set_pin26_low_w();
+
+ // Native mode
+ if (!BIT(m_config->read(), 2))
+ {
+ install_readwrite_handler(0xff76, 0xff77, read8sm_delegate(*m_ym2413, FUNC(ym2413_device::read)), write8sm_delegate(*m_ym2413, FUNC(ym2413_device::write)));
+ install_readwrite_handler(0xff78, 0xff7b, read8sm_delegate(*m_v9958, FUNC(v9958_device::read)), write8sm_delegate(*m_v9958, FUNC(v9958_device::write)));
+ install_write_handler(0xff7c, 0xff7c, write8smo_delegate(*m_ym2149, FUNC(ym2149_device::address_w)));
+ install_readwrite_handler(0xff7d, 0xff7d, read8smo_delegate(*m_ym2149, FUNC(ym2149_device::data_r)), write8smo_delegate(*m_ym2149, FUNC(ym2149_device::data_w)));
+ install_write_handler(0xff7e, 0xff7e, write8smo_delegate(*this, FUNC(dragon_msx2_device::video_select_w)));
+ }
+
+ // Default Video
+ machine().render().first_target()->set_view(!BIT(m_config->read(), 3));
+}
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void dragon_msx2_device::device_add_mconfig(machine_config &config)
+{
+ V9958(config, m_v9958, 21.477272_MHz_XTAL);
+ m_v9958->set_screen_pal("screen");
+ m_v9958->set_vram_size(0x20000);
+ m_v9958->int_cb().set([this](int state) { set_line_value(line::NMI, state); });
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+
+ SPEAKER(config, "speaker").front_center();
+ YM2413(config, m_ym2413, 21.477272_MHz_XTAL / 6).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ YM2149(config, m_ym2149, 21.477272_MHz_XTAL / 6).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
+
+
+//-------------------------------------------------
+// scs_read
+//-------------------------------------------------
+
+u8 dragon_msx2_device::scs_read(offs_t offset)
+{
+ u8 data = 0x00;
+
+ if (BIT(m_config->read(), 2)) // MPI mode
+ {
+ switch (offset)
+ {
+ case 0x16: case 0x17:
+ data = m_ym2413->read(offset & 1);
+ break;
+
+ case 0x18: case 0x19: case 0x1a: case 0x1b:
+ data = m_v9958->read(offset & 3);
+ break;
+
+ case 0x1d:
+ data = m_ym2149->data_r();
+ break;
+ }
+ }
+
+ return data;
+}
+
+//-------------------------------------------------
+// scs_write
+//-------------------------------------------------
+
+void dragon_msx2_device::scs_write(offs_t offset, u8 data)
+{
+ if (BIT(m_config->read(), 2)) // MPI mode
+ {
+ switch (offset)
+ {
+ case 0x16: case 0x17:
+ m_ym2413->write(offset & 1, data);
+ break;
+
+ case 0x18: case 0x19: case 0x1a: case 0x1b:
+ m_v9958->write(offset & 3, data);
+ break;
+
+ case 0x1c:
+ m_ym2149->address_w(data);
+ break;
+
+ case 0x1d:
+ m_ym2149->data_w(data);
+ break;
+
+ case 0x1e:
+ video_select_w(data);
+ break;
+ }
+ }
+}
+
+void dragon_msx2_device::video_select_w(u8 data)
+{
+ if (BIT(m_config->read(), 4)) // Unlocked
+ machine().render().first_target()->set_view(!BIT(data, 0));
+}
diff --git a/src/devices/bus/coco/dragon_msx2.h b/src/devices/bus/coco/dragon_msx2.h
new file mode 100644
index 00000000000..3eb1fcaa64b
--- /dev/null
+++ b/src/devices/bus/coco/dragon_msx2.h
@@ -0,0 +1,53 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+#ifndef MAME_BUS_COCO_DRAGON_MSX2_H
+#define MAME_BUS_COCO_DRAGON_MSX2_H
+
+#pragma once
+
+#include "cococart.h"
+#include "sound/ay8910.h"
+#include "sound/ymopl.h"
+#include "video/v9938.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> dragon_msx2_device
+
+class dragon_msx2_device :
+ public device_t,
+ public device_cococart_interface
+{
+public:
+ // construction/destruction
+ dragon_msx2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual ioport_constructor device_input_ports() const override;
+
+ virtual u8 scs_read(offs_t offset) override;
+ virtual void scs_write(offs_t offset, u8 data) override;
+
+private:
+ required_device<ym2413_device> m_ym2413;
+ required_device<v9958_device> m_v9958;
+ required_device<ym2149_device> m_ym2149;
+ required_ioport m_config;
+
+ void video_select_w(u8 data);
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(DRAGON_MSX2, dragon_msx2_device)
+
+#endif // MAME_BUS_COCO_DRAGON_MSX2_H
diff --git a/src/devices/bus/coco/dragon_serial.cpp b/src/devices/bus/coco/dragon_serial.cpp
new file mode 100644
index 00000000000..8967bed816c
--- /dev/null
+++ b/src/devices/bus/coco/dragon_serial.cpp
@@ -0,0 +1,154 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Peaksoft Prestel Module
+
+ Also known as the New Era Interface from Peaksoft/Harry Whitehouse, which
+ includes a through port for DOS cartridges.
+
+ TODO:
+ - RX/TX rate set by dipswitches (default 100001/001001?), for use with a 1200/75 modem.
+ - add throughport, not known how CTS/SCS lines are switched between slots.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "dragon_serial.h"
+#include "machine/clock.h"
+#include "bus/rs232/rs232.h"
+
+
+//-------------------------------------------------
+// ROM( dragon_serial )
+//-------------------------------------------------
+
+ROM_START(dragon_serial)
+ ROM_REGION(0x2000, "eprom", 0)
+ ROM_LOAD("comron_peaksoft.rom", 0x0000, 0x2000, CRC(9d18cf46) SHA1(14124dfb4bd78d1907e80d779cd7f3bae30564c9))
+ROM_END
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(DRAGON_SERIAL, dragon_serial_device, "dragon_serial", "Dragon Peaksoft Prestel Module")
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// dragon_serial_device - constructor
+//-------------------------------------------------
+
+dragon_serial_device::dragon_serial_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, DRAGON_SERIAL, tag, owner, clock)
+ , device_cococart_interface(mconfig, *this )
+ , m_eprom(*this, "eprom")
+ , m_acia(*this, "acia")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void dragon_serial_device::device_start()
+{
+ set_line_value(line::CART, line_value::Q);
+}
+
+//-------------------------------------------------
+// dragon_serial_device::get_cart_base
+//-------------------------------------------------
+
+u8 *dragon_serial_device::get_cart_base()
+{
+ return m_eprom->base();
+}
+
+//-------------------------------------------------
+// dragon_serial_device::get_cart_memregion
+//-------------------------------------------------
+
+memory_region *dragon_serial_device::get_cart_memregion()
+{
+ return m_eprom;
+}
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void dragon_serial_device::device_add_mconfig(machine_config &config)
+{
+ ACIA6850(config, m_acia, 0);
+ m_acia->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
+ m_acia->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts));
+ m_acia->irq_handler().set([this](int state) { set_line_value(line::NMI, state); });
+
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 2.4576_MHz_XTAL));
+ acia_clock.signal_handler().set(FUNC(dragon_serial_device::write_acia_clock));
+
+ rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "null_modem"));
+ rs232.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
+ rs232.cts_handler().set(m_acia, FUNC(acia6850_device::write_cts));
+ rs232.dcd_handler().set(m_acia, FUNC(acia6850_device::write_dcd));
+}
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *dragon_serial_device::device_rom_region() const
+{
+ return ROM_NAME( dragon_serial );
+}
+
+//-------------------------------------------------
+// cts_read
+//-------------------------------------------------
+
+u8 dragon_serial_device::cts_read(offs_t offset)
+{
+ return m_eprom->base()[offset & 0x1fff];
+}
+
+//-------------------------------------------------
+// scs_read
+//-------------------------------------------------
+
+u8 dragon_serial_device::scs_read(offs_t offset)
+{
+ uint8_t result = 0x00;
+
+ switch (offset)
+ {
+ case 0x14: case 0x15:
+ result = m_acia->read(offset & 1);
+ break;
+ }
+ return result;
+}
+
+//-------------------------------------------------
+// scs_write
+//-------------------------------------------------
+
+void dragon_serial_device::scs_write(offs_t offset, u8 data)
+{
+ switch (offset)
+ {
+ case 0x14: case 0x15:
+ m_acia->write(offset & 1, data);
+ break;
+ }
+}
+
+WRITE_LINE_MEMBER(dragon_serial_device::write_acia_clock)
+{
+ m_acia->write_txc(state);
+ m_acia->write_rxc(state);
+}
diff --git a/src/devices/bus/coco/dragon_serial.h b/src/devices/bus/coco/dragon_serial.h
new file mode 100644
index 00000000000..7f33a61de67
--- /dev/null
+++ b/src/devices/bus/coco/dragon_serial.h
@@ -0,0 +1,52 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+#ifndef MAME_BUS_COCO_DRAGON_SERIAL_H
+#define MAME_BUS_COCO_DRAGON_SERIAL_H
+
+#pragma once
+
+#include "cococart.h"
+#include "machine/6850acia.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> dragon_serial_device
+
+class dragon_serial_device :
+ public device_t,
+ public device_cococart_interface
+{
+public:
+ // construction/destruction
+ dragon_serial_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type imperfect_features() { return feature::COMMS; }
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual u8 *get_cart_base() override;
+ virtual memory_region *get_cart_memregion() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual u8 cts_read(offs_t offset) override;
+ virtual u8 scs_read(offs_t offset) override;
+ virtual void scs_write(offs_t offset, u8 data) override;
+
+private:
+ DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
+
+ required_memory_region m_eprom;
+ required_device<acia6850_device> m_acia;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(DRAGON_SERIAL, dragon_serial_device)
+
+#endif // MAME_BUS_COCO_DRAGON_SERIAL_H
diff --git a/src/devices/bus/generic/slot.h b/src/devices/bus/generic/slot.h
index 883e521c908..ee96382f435 100644
--- a/src/devices/bus/generic/slot.h
+++ b/src/devices/bus/generic/slot.h
@@ -30,7 +30,7 @@ public:
assert(!(decode_limit & base));
for (offs_t remain = length, start = 0U; remain && (decode_limit >= start); )
{
- unsigned const msb(31 - count_leading_zeros(u32(remain)));
+ unsigned const msb(31 - count_leading_zeros_32(u32(remain)));
offs_t const chunk(offs_t(1) << msb);
offs_t range((chunk - 1) & decode_limit);
offs_t mirror(decode_limit & ~decode_mask & ~range);
diff --git a/src/devices/bus/isa/isa_cards.cpp b/src/devices/bus/isa/isa_cards.cpp
index ce23388ea1d..cc00f2233e0 100644
--- a/src/devices/bus/isa/isa_cards.cpp
+++ b/src/devices/bus/isa/isa_cards.cpp
@@ -50,6 +50,7 @@
#include "tekram_dc820.h"
#include "asc88.h"
#include "omti8621.h"
+#include "lrk330.h"
// sound
#include "adlib.h"
@@ -230,4 +231,5 @@ void pc_isa16_cards(device_slot_interface &device)
device.option_add("dc820", TEKRAM_DC820); // actually an EISA card
device.option_add("dc820b", TEKRAM_DC820B); // actually an EISA card
device.option_add("omti8621", ISA16_OMTI8621);
+ device.option_add("lrk331", LRK331);
}
diff --git a/src/devices/bus/isa/lrk330.cpp b/src/devices/bus/isa/lrk330.cpp
new file mode 100644
index 00000000000..18cd1bfe29e
--- /dev/null
+++ b/src/devices/bus/isa/lrk330.cpp
@@ -0,0 +1,130 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Skeleton driver for ESDI controllers by Lark Associates Inc.
+
+ Major ICs excluding EPROMs, in order of decreasing pin count:
+ * Silicon Logic LD1111 HDC (QFP128, U1)
+ * Xilinx XC2018-70PC68C Logic Cell Array (PLCC84, U11)
+ * National DP8473V Floppy Disk Controller PLUS-2 (PLCC52, U4)
+ * Signetics SCN8032HCCA44 8-Bit Microcontroller (PLCC44, U20)
+ * Sharp LH52258D-45 32Kx8 CMOS Static RAM (SDIP28, U2 & U3)
+ * Vitelic V61C16F70L 2Kx8 CMOS Static RAM (SSOP24, U19)
+
+ The purpose of the small SRAM is not clear. Perhaps it can be banked
+ into the lower part of the 8032 program space after loading patches
+ for the EPROM microcode, since that uses the upper mirror addresses
+ almost exclusively.
+
+ A transfer rate of up to 24 megabits per second was advertised.
+
+ LRK-330 is presumably identical to LRK-331, only without the FDC or
+ 34-pin floppy drive cable connector installed.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "lrk330.h"
+
+#include "imagedev/floppy.h"
+#include "machine/upd765.h"
+
+// device type definition
+DEFINE_DEVICE_TYPE(LRK331, lrk331_device, "lrk331", "Lark Associates LRK-331 ESDI Controller")
+
+
+lrk331_device::lrk331_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, LRK331, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_mcu(*this, "mcu")
+ , m_bios(*this, "bios")
+ , m_config(*this, "CONFIG")
+{
+}
+
+void lrk331_device::device_start()
+{
+}
+
+void lrk331_device::device_reset()
+{
+}
+
+void lrk331_device::ucode_map(address_map &map)
+{
+ map(0x0000, 0x3fff).mirror(0x4000).rom().region("ucode", 0);
+}
+
+void lrk331_device::ext_map(address_map &map)
+{
+ map.global_mask(0xff);
+ map(0x0b, 0x0b).nopw();
+}
+
+static INPUT_PORTS_START(lrk331)
+ PORT_START("CONFIG")
+ PORT_DIPNAME(0x001, 0x001, "Drive Addresses") PORT_DIPLOCATION("W1:1")
+ PORT_DIPSETTING(0x001, "Primary (1F0h-1F7h, 3F0h-3F7h)")
+ PORT_DIPSETTING(0x000, "Secondary (170h-177h, 370h-377h)")
+ PORT_DIPNAME(0x002, 0x002, "Floppy Drive Speed") PORT_DIPLOCATION("W2:2")
+ PORT_DIPSETTING(0x002, "Single")
+ PORT_DIPSETTING(0x000, "Dual")
+ PORT_DIPNAME(0x004, 0x004, "Interrupt Delay") PORT_DIPLOCATION("W3:1")
+ PORT_DIPSETTING(0x004, "Disabled")
+ PORT_DIPSETTING(0x000, "Enabled")
+ PORT_DIPNAME(0x008, 0x008, "Factory Configured - Do Not Alter") PORT_DIPLOCATION("W4:1")
+ PORT_DIPSETTING(0x008, DEF_STR(Off))
+ PORT_DIPSETTING(0x000, DEF_STR(On))
+ PORT_DIPNAME(0x0f0, 0x0e0, "BIOS Address") PORT_DIPLOCATION("W5-W8:1,2,3,4")
+ PORT_DIPSETTING(0x0f0, "Disabled")
+ PORT_DIPSETTING(0x0e0, "C800h")
+ PORT_DIPSETTING(0x0d0, "CC00h")
+ PORT_DIPSETTING(0x0b0, "D000h")
+ PORT_DIPSETTING(0x070, "D400h")
+ PORT_DIPNAME(0x300, 0x200, "IRQ Select") PORT_DIPLOCATION("W9-W10:1,2")
+ PORT_DIPSETTING(0x200, "IRQ 14")
+ PORT_DIPSETTING(0x100, "IRQ 15")
+ PORT_DIPNAME(0x400, 0x000, "Floppy Drive Interface") PORT_DIPLOCATION("W11:1")
+ PORT_DIPSETTING(0x400, "Disabled")
+ PORT_DIPSETTING(0x000, "Enabled")
+INPUT_PORTS_END
+
+ioport_constructor lrk331_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(lrk331);
+}
+
+static void pc_hd_floppies(device_slot_interface &device)
+{
+ device.option_add("525hd", FLOPPY_525_HD);
+ device.option_add("35hd", FLOPPY_35_HD);
+ device.option_add("525dd", FLOPPY_525_DD);
+ device.option_add("35dd", FLOPPY_35_DD);
+}
+
+void lrk331_device::device_add_mconfig(machine_config &config)
+{
+ I8032(config, m_mcu, 24_MHz_XTAL / 2);
+ m_mcu->set_addrmap(AS_PROGRAM, &lrk331_device::ucode_map);
+ m_mcu->set_addrmap(AS_IO, &lrk331_device::ext_map);
+
+ //LD1111(config, m_hdc, 24_MHz_XTAL);
+
+ DP8473(config, "fdc", 24_MHz_XTAL);
+ FLOPPY_CONNECTOR(config, "fdc:0", pc_hd_floppies, "525hd", floppy_image_device::default_pc_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", pc_hd_floppies, nullptr, floppy_image_device::default_pc_floppy_formats);
+}
+
+ROM_START(lrk331)
+ ROM_REGION(0x2000, "bios", 0)
+ ROM_LOAD("63308-10.bin", 0x0000, 0x2000, CRC(f16d4f25) SHA1(437664ff9723c8036a40f1e504899b7cacd21ad0))
+
+ ROM_REGION(0x4000, "ucode", 0)
+ ROM_LOAD("63307-08.bin", 0x0000, 0x4000, CRC(6d2e8b26) SHA1(1a33462a29b306b01960cf2ac0b209b2adf58dbe))
+ROM_END
+
+const tiny_rom_entry *lrk331_device::device_rom_region() const
+{
+ return ROM_NAME(lrk331);
+}
diff --git a/src/devices/bus/isa/lrk330.h b/src/devices/bus/isa/lrk330.h
new file mode 100644
index 00000000000..b75a50fa7a3
--- /dev/null
+++ b/src/devices/bus/isa/lrk330.h
@@ -0,0 +1,38 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+#ifndef MAME_BUS_ISA_LRK330_H
+#define MAME_BUS_ISA_LRK330_H
+
+#pragma once
+
+#include "isa.h"
+#include "cpu/mcs51/mcs51.h"
+
+class lrk331_device : public device_t, public device_isa16_card_interface
+{
+public:
+ lrk331_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ virtual ioport_constructor device_input_ports() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual void device_add_mconfig(machine_config &config) override;
+
+private:
+ void ucode_map(address_map &map);
+ void ext_map(address_map &map);
+
+ required_device<mcs51_cpu_device> m_mcu;
+ required_region_ptr<u8> m_bios;
+ required_ioport m_config;
+};
+
+DECLARE_DEVICE_TYPE(LRK331, lrk331_device)
+
+#endif // MAME_BUS_ISA_LRK330_H
diff --git a/src/devices/bus/mc10/mc10_cart.cpp b/src/devices/bus/mc10/mc10_cart.cpp
new file mode 100644
index 00000000000..f7858a087bc
--- /dev/null
+++ b/src/devices/bus/mc10/mc10_cart.cpp
@@ -0,0 +1,230 @@
+// license:BSD-3-Clause
+// copyright-holders:tim lindner
+/*********************************************************************
+
+ mc10cart.cpp
+
+ MC-10 / Alice expansion slot - typically used for the 16K external
+ RAM expansion.
+
+ MC-10 and Alice pinout listing
+ --- ------- --- -------
+ 1 GND 18 A6
+ 2 GND 19 A7
+ 3 D0 20 A8
+ 4 D1 21 A9
+ 5 D2 22 A10
+ 6 D3 23 A11
+ 7 D4 24 A12
+ 8 D5 25 A13
+ 9 D6 26 A14
+ 10 D7 27 A15
+ 11 R/!W 28 E
+ 12 A0 29 SEL
+ 13 A1 30 RESET
+ 14 A2 31 !NMI
+ 15 A3 32 +5V
+ 16 A3 33 GND
+ 17 A5 34 GND
+
+ SEL is an input to the MC-10 that allows the cartridge to remove
+ the internal chips from the bus.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "mc10_cart.h"
+
+#include "mcx128.h"
+#include "pak.h"
+#include "ram.h"
+
+//#define VERBOSE 1
+#include "logmacro.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(MC10CART_SLOT, mc10cart_slot_device, "mc10cart_slot", "MC-10 Cartridge Slot")
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// mc10cart_slot_device - constructor
+//-------------------------------------------------
+mc10cart_slot_device::mc10cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ device_t(mconfig, MC10CART_SLOT, tag, owner, clock),
+ device_single_card_slot_interface<device_mc10cart_interface>(mconfig, *this),
+ device_image_interface(mconfig, *this),
+ m_nmi_callback(*this),
+ m_cart(nullptr),
+ m_memspace(*this, finder_base::DUMMY_TAG, -1)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mc10cart_slot_device::device_start()
+{
+ m_nmi_callback.resolve_safe();
+ m_cart = get_card_device();
+}
+
+//-------------------------------------------------
+// set_nmi_line
+//-------------------------------------------------
+
+void mc10cart_slot_device::set_nmi_line(int state)
+{
+ m_nmi_callback(state);
+}
+
+//-------------------------------------------------
+// call_load
+//-------------------------------------------------
+
+image_init_result mc10cart_slot_device::call_load()
+{
+ if (!m_cart)
+ return image_init_result::PASS;
+
+ memory_region *romregion(loaded_through_softlist() ? memregion("rom") : nullptr);
+ if (loaded_through_softlist() && !romregion)
+ {
+ seterror(IMAGE_ERROR_INVALIDIMAGE, "Software list item has no 'rom' data area");
+ return image_init_result::FAIL;
+ }
+
+ u32 const len(loaded_through_softlist() ? romregion->bytes() : length());
+ if (len > m_cart->max_rom_length())
+ {
+ seterror(IMAGE_ERROR_UNSUPPORTED, "Unsupported cartridge size");
+ return image_init_result::FAIL;
+ }
+
+ if (!loaded_through_softlist())
+ {
+ LOG("Allocating %u byte cartridge ROM region\n", len);
+ romregion = machine().memory().region_alloc(subtag("rom").c_str(), len, 1, ENDIANNESS_BIG);
+ u32 const cnt(fread(romregion->base(), len));
+ if (cnt != len)
+ {
+ seterror(IMAGE_ERROR_UNSPECIFIED, "Error reading cartridge file");
+ return image_init_result::FAIL;
+ }
+ }
+
+ return m_cart->load();
+}
+
+//-------------------------------------------------
+// get_default_card_software
+//-------------------------------------------------
+
+std::string mc10cart_slot_device::get_default_card_software(get_default_card_software_hook &hook) const
+{
+ return software_get_default_slot("pak");
+}
+
+//**************************************************************************
+// DEVICE MC-10 CART INTERFACE - Implemented by devices that plug into
+// MC-10 cartridge slots
+//**************************************************************************
+
+template class device_finder<device_mc10cart_interface, false>;
+template class device_finder<device_mc10cart_interface, true>;
+
+//-------------------------------------------------
+// device_mc10cart_interface - constructor
+//-------------------------------------------------
+
+device_mc10cart_interface::device_mc10cart_interface(const machine_config &mconfig, device_t &device)
+ : device_interface(device, "mc10cart")
+ , m_owning_slot(nullptr)
+{
+}
+
+//-------------------------------------------------
+// ~device_mc10cart_interface - destructor
+//-------------------------------------------------
+
+device_mc10cart_interface::~device_mc10cart_interface()
+{
+}
+
+//-------------------------------------------------
+// interface_config_complete
+//-------------------------------------------------
+
+void device_mc10cart_interface::interface_config_complete()
+{
+ m_owning_slot = dynamic_cast<mc10cart_slot_device *>(device().owner());
+}
+
+//-------------------------------------------------
+// interface_pre_start
+//-------------------------------------------------
+
+void device_mc10cart_interface::interface_pre_start()
+{
+ if (!m_owning_slot)
+ throw emu_fatalerror("Expected device().owner() to be of type mc10cart_slot_device");
+}
+
+/*-------------------------------------------------
+ max_rom_length
+-------------------------------------------------*/
+
+int device_mc10cart_interface::max_rom_length() const
+{
+ return 0;
+}
+
+/*-------------------------------------------------
+ load
+-------------------------------------------------*/
+
+image_init_result device_mc10cart_interface::load()
+{
+ return image_init_result::FAIL;
+}
+
+//-------------------------------------------------
+// mc10_cart_add_basic_devices
+//-------------------------------------------------
+
+void mc10_cart_add_basic_devices(device_slot_interface &device)
+{
+ // basic devices
+ device.option_add("mcx128", MC10_PAK_MCX128);
+ device.option_add("pak", MC10_PAK);
+ device.option_add("ram", MC10_PAK_RAM);
+}
+
+//-------------------------------------------------
+// alice_cart_add_basic_devices
+//-------------------------------------------------
+
+void alice_cart_add_basic_devices(device_slot_interface &device)
+{
+ // basic devices
+ device.option_add("alice128", ALICE_PAK_MCX128);
+ device.option_add("pak", MC10_PAK);
+ device.option_add("ram", MC10_PAK_RAM);
+}
+
+//-------------------------------------------------
+// alice32_cart_add_basic_devices
+//-------------------------------------------------
+
+void alice32_cart_add_basic_devices(device_slot_interface &device)
+{
+ // basic devices
+ device.option_add("pak", MC10_PAK);
+ device.option_add("ram", MC10_PAK_RAM);
+}
diff --git a/src/devices/bus/mc10/mc10_cart.h b/src/devices/bus/mc10/mc10_cart.h
new file mode 100644
index 00000000000..eba93284325
--- /dev/null
+++ b/src/devices/bus/mc10/mc10_cart.h
@@ -0,0 +1,118 @@
+// license:BSD-3-Clause
+// copyright-holders:tim lindner
+/*********************************************************************
+
+ mc10_cart.h
+
+ MC-10 / Alice cartridge management
+
+*********************************************************************/
+
+#ifndef MAME_BUS_MC10_MC10CART_H
+#define MAME_BUS_MC10_MC10CART_H
+
+#pragma once
+
+#include "softlist_dev.h"
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+
+// ======================> mc10cart_slot_device
+class device_mc10cart_interface;
+
+class mc10cart_slot_device final : public device_t,
+ public device_single_card_slot_interface<device_mc10cart_interface>,
+ public device_image_interface
+{
+public:
+
+ // construction/destruction
+ template <typename T>
+ mc10cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, T &&opts, const char *dflt)
+ : mc10cart_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ mc10cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ // inline configuration
+ template <typename T> void set_memspace(T &&tag, int spacenum) { m_memspace.set_tag(std::forward<T>(tag), spacenum); }
+ auto nmi_callback() { return m_nmi_callback.bind(); }
+
+ // address map manipulations
+ address_space &memspace() const { return *m_memspace; };
+
+ // device-level overrides
+ virtual void device_start() override;
+
+ // image-level overrides
+ virtual image_init_result call_load() override;
+ virtual const software_list_loader &get_software_list_loader() const override { return rom_software_list_loader::instance(); }
+
+ virtual iodevice_t image_type() const noexcept override { return IO_CARTSLOT; }
+
+ virtual bool is_readable() const noexcept override { return true; }
+ virtual bool is_writeable() const noexcept override { return false; }
+ virtual bool is_creatable() const noexcept override { return false; }
+ virtual bool must_be_loaded() const noexcept override { return false; }
+ virtual bool is_reset_on_load() const noexcept override { return true; }
+ virtual const char *image_interface() const noexcept override { return "mc10_cart"; }
+ virtual const char *file_extensions() const noexcept override { return "mcc,rom"; }
+
+ // manipulation of nmi line
+ void set_nmi_line(int state);
+ devcb_write_line m_nmi_callback;
+
+ // slot interface overrides
+ virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
+
+private:
+
+ // cartridge
+ device_mc10cart_interface *m_cart;
+
+protected:
+ required_address_space m_memspace;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(MC10CART_SLOT, mc10cart_slot_device)
+
+class device_mc10cart_interface : public device_interface
+{
+public:
+ // construction/destruction
+ virtual ~device_mc10cart_interface();
+
+ virtual int max_rom_length() const;
+ virtual image_init_result load();
+
+protected:
+ void raise_cart_nmi() { m_owning_slot->set_nmi_line(ASSERT_LINE); }
+ void lower_cart_nmi() { m_owning_slot->set_nmi_line(CLEAR_LINE); }
+
+ virtual void interface_config_complete() override;
+ virtual void interface_pre_start() override;
+
+ device_mc10cart_interface(const machine_config &mconfig, device_t &device);
+
+ // accessors for containers
+ mc10cart_slot_device &owning_slot() const { assert(m_owning_slot); return *m_owning_slot; }
+
+private:
+ mc10cart_slot_device * m_owning_slot;
+};
+
+// methods for configuring MC-10 slot devices
+void mc10_cart_add_basic_devices(device_slot_interface &device);
+void alice_cart_add_basic_devices(device_slot_interface &device);
+void alice32_cart_add_basic_devices(device_slot_interface &device);
+
+#endif // MAME_BUS_MC10_MC10CART_H
diff --git a/src/devices/bus/mc10/mcx128.cpp b/src/devices/bus/mc10/mcx128.cpp
new file mode 100644
index 00000000000..32c9239afb5
--- /dev/null
+++ b/src/devices/bus/mc10/mcx128.cpp
@@ -0,0 +1,371 @@
+// license:BSD-3-Clause
+// copyright-holders:tim lindner
+/***************************************************************************
+
+ mcx128.cpp
+
+ Code for emulating Darren Atkinson's MCX-128 cartridge
+
+ Features:
+ 128K of RAM expansion
+ 16K of ROM expansion
+
+ New MC-10 memory map defined by this cartridge:
+
+ 0000 - 0003 6803 Ports
+ 0004 - 0007 Expansion RAM
+ 0008 - 000E 6803 Status / Control
+ 000F Expansion RAM
+ 0010 - 0013 6803 UART
+ 0014 6803 RAM Control Reg
+ 0015 - 001F Unused
+ 0020 - 007F Expansion RAM
+ 0080 - 00FF On-chip CPU RAM / Expansion RAM
+ 0100 - 3FFF Expansion RAM
+ 4000 - 5FFF Built-In RAM / Expansion RAM
+ 6000 - BEFF Expansion RAM
+ BF00 RAM Bank Control Reg
+ BF01 ROM Map Control Reg
+ BF80 - BFFF Keyboard / VDG / Sound
+ C000 - DFFF EPROM or Expansion RAM
+ E000 - FFFF Built-in ROM, EPROM or Expansion RAM
+
+ Deficiency:
+
+ * Writing to 6803 chip RAM at $80 to $ff should be mirrored
+ to external RAM.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "mcx128.h"
+
+//#define VERBOSE (LOG_GENERAL)
+#include "logmacro.h"
+
+
+ROM_START(mc10_mcx128)
+ ROM_REGION(0x4000, "eprom", ROMREGION_ERASE00)
+ ROM_LOAD("mcx128bas.rom", 0x0000, 0x4000, CRC(11202e4b) SHA1(36c30d0f198a1bffee88ef29d92f2401447a91f4))
+ROM_END
+
+ROM_START(alice_mcx128)
+ ROM_REGION(0x4000, "eprom", ROMREGION_ERASE00)
+ ROM_LOAD("alice128bas.rom", 0x0000, 0x4000, CRC(a737544a) SHA1(c8fd92705fc42deb6a0ffac6274e27fd61ecd4cc))
+ROM_END
+
+//**************************************************************************
+// TYPE DECLARATIONS
+//**************************************************************************
+
+// ======================> mc10_pak_device
+
+class mc10_pak_mcx128_device :
+ public device_t,
+ public device_mc10cart_interface
+{
+public:
+ // construction/destruction
+ mc10_pak_mcx128_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // construction/destruction
+ mc10_pak_mcx128_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_post_load() override;
+
+ virtual const tiny_rom_entry *device_rom_region() const override
+ {
+ return ROM_NAME(mc10_mcx128);
+ }
+
+ u8 control_register_read(offs_t offset);
+ void control_register_write(offs_t offset, u8 data);
+
+ void write_ram_mirror(address_space &space, offs_t offset, u8 data);
+
+ void view_map0(address_map &map);
+ void view_map1(address_map &map);
+ void view_map2(address_map &map);
+ void view_map3(address_map &map);
+ void view_map4(address_map &map);
+ void view_map5(address_map &map);
+ void view_map6(address_map &map);
+ void view_map7(address_map &map);
+
+
+private:
+ memory_share_creator<u8> m_share;
+ memory_view m_view;
+ memory_bank_array_creator<8> m_bank;
+ uint8_t ram_bank_cr;
+ uint8_t rom_map_cr;
+
+ void update_banks();
+
+};
+
+DEFINE_DEVICE_TYPE_PRIVATE(MC10_PAK_MCX128, device_mc10cart_interface, mc10_pak_mcx128_device, "mc10_mcx128", "Darren Atkinson's MCX-128 cartridge")
+
+//-------------------------------------------------
+// mc10_pak_device - constructor
+//-------------------------------------------------
+
+mc10_pak_mcx128_device::mc10_pak_mcx128_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ :mc10_pak_mcx128_device(mconfig, MC10_PAK_MCX128, tag, owner, clock)
+{
+}
+
+mc10_pak_mcx128_device::mc10_pak_mcx128_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_mc10cart_interface(mconfig, *this)
+ , m_share(*this, "ext_ram", 1024*128, ENDIANNESS_BIG)
+ , m_view(*this, "mcx_view")
+ , m_bank(*this, "bank%u", 0U)
+{
+}
+
+void mc10_pak_mcx128_device::view_map0(address_map &map)
+{
+ map(0x0004, 0x0007).bankrw("bank0");
+ map(0x000f, 0x000f).bankrw("bank1");
+ map(0x0020, 0x3fff).bankrw("bank2");
+ map(0x4000, 0x5fff).bankr("bank3").w(FUNC(mc10_pak_mcx128_device::write_ram_mirror));
+ map(0x6000, 0xbeff).bankrw("bank4");
+ map(0xbf00, 0xbf01).rw(FUNC(mc10_pak_mcx128_device::control_register_read), FUNC(mc10_pak_mcx128_device::control_register_write));
+ map(0xc000, 0xfeff).rom().region("eprom",0x0000).bankw("bank5");
+ map(0xff00, 0xffff).rom().region("eprom",0x3f00).bankw("bank7");
+}
+
+void mc10_pak_mcx128_device::view_map1(address_map &map)
+{
+ map(0x0004, 0x0007).bankrw("bank0");
+ map(0x000f, 0x000f).bankrw("bank1");
+ map(0x0020, 0x3fff).bankrw("bank2");
+ map(0x4000, 0x5fff).bankr("bank3").w(FUNC(mc10_pak_mcx128_device::write_ram_mirror));
+ map(0x6000, 0xbeff).bankrw("bank4");
+ map(0xbf00, 0xbf01).rw(FUNC(mc10_pak_mcx128_device::control_register_read), FUNC(mc10_pak_mcx128_device::control_register_write));
+ map(0xc000, 0xdfff).bankrw("bank5");
+ map(0xe000, 0xfeff).rom().region("eprom",0x2000).bankw("bank6");
+ map(0xff00, 0xffff).rom().region("eprom",0x3f00).bankw("bank7");
+}
+
+void mc10_pak_mcx128_device::view_map2(address_map &map)
+{
+ map(0x0004, 0x0007).bankrw("bank0");
+ map(0x000f, 0x000f).bankrw("bank1");
+ map(0x0020, 0x3fff).bankrw("bank2");
+ map(0x4000, 0x5fff).bankr("bank3").w(FUNC(mc10_pak_mcx128_device::write_ram_mirror));
+ map(0x6000, 0xbeff).bankrw("bank4");
+ map(0xbf00, 0xbf01).rw(FUNC(mc10_pak_mcx128_device::control_register_read), FUNC(mc10_pak_mcx128_device::control_register_write));
+ map(0xc000, 0xdfff).bankrw("bank5");
+ map(0xe000, 0xfeff).bankw("bank6");
+ map(0xff00, 0xffff).bankw("bank7");
+// 0xe000, 0xffff: read internal ROM
+}
+
+void mc10_pak_mcx128_device::view_map3(address_map &map)
+{
+ map(0x0004, 0x0007).bankrw("bank0");
+ map(0x000f, 0x000f).bankrw("bank1");
+ map(0x0020, 0x3fff).bankrw("bank2");
+ map(0x4000, 0x5fff).bankr("bank3").w(FUNC(mc10_pak_mcx128_device::write_ram_mirror));
+ map(0x6000, 0xbeff).bankrw("bank4");
+ map(0xbf00, 0xbf01).rw(FUNC(mc10_pak_mcx128_device::control_register_read), FUNC(mc10_pak_mcx128_device::control_register_write));
+ map(0xc000, 0xfeff).bankrw("bank5");
+ map(0xff00, 0xffff).bankrw("bank7");
+}
+
+void mc10_pak_mcx128_device::view_map4(address_map &map)
+{
+ map(0x0004, 0x0007).bankrw("bank0");
+ map(0x000f, 0x000f).bankrw("bank1");
+ map(0x0020, 0x3fff).bankrw("bank2");
+ map(0x4000, 0xbeff).bankrw("bank3");
+ map(0xbf00, 0xbf01).rw(FUNC(mc10_pak_mcx128_device::control_register_read), FUNC(mc10_pak_mcx128_device::control_register_write));
+ map(0xc000, 0xfeff).rom().region("eprom",0x0000).bankw("bank5");
+ map(0xff00, 0xffff).rom().region("eprom",0x3f00).bankw("bank7");
+}
+
+void mc10_pak_mcx128_device::view_map5(address_map &map)
+{
+ map(0x0004, 0x0007).bankrw("bank0");
+ map(0x000f, 0x000f).bankrw("bank1");
+ map(0x0020, 0x3fff).bankrw("bank2");
+ map(0x4000, 0xbeff).bankrw("bank3");
+ map(0xbf00, 0xbf01).rw(FUNC(mc10_pak_mcx128_device::control_register_read), FUNC(mc10_pak_mcx128_device::control_register_write));
+ map(0xc000, 0xdfff).bankrw("bank5");
+ map(0xe000, 0xfeff).rom().region("eprom",0x2000).bankw("bank6");
+ map(0xff00, 0xffff).rom().region("eprom",0x3f00).bankw("bank7");
+}
+
+void mc10_pak_mcx128_device::view_map6(address_map &map)
+{
+ map(0x0004, 0x0007).bankrw("bank0");
+ map(0x000f, 0x000f).bankrw("bank1");
+ map(0x0020, 0x3fff).bankrw("bank2");
+ map(0x4000, 0xbeff).bankrw("bank3");
+ map(0xbf00, 0xbf01).rw(FUNC(mc10_pak_mcx128_device::control_register_read), FUNC(mc10_pak_mcx128_device::control_register_write));
+ map(0xc000, 0xdfff).bankrw("bank5");
+ map(0xe000, 0xfeff).bankw("bank6");
+ map(0xff00, 0xffff).bankw("bank7");
+// 0xe000, 0xffff: read internal ROM
+}
+
+void mc10_pak_mcx128_device::view_map7(address_map &map)
+{
+ map(0x0004, 0x0007).bankrw("bank0");
+ map(0x000f, 0x000f).bankrw("bank1");
+ map(0x0020, 0x3fff).bankrw("bank2");
+ map(0x4000, 0xbeff).bankrw("bank3");
+ map(0xbf00, 0xbf01).rw(FUNC(mc10_pak_mcx128_device::control_register_read), FUNC(mc10_pak_mcx128_device::control_register_write));
+ map(0xc000, 0xfeff).bankrw("bank5");
+ map(0xff00, 0xffff).bankrw("bank7");
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mc10_pak_mcx128_device::device_start()
+{
+ save_item(NAME(ram_bank_cr));
+ save_item(NAME(rom_map_cr));
+
+ // 0x0004 - 0x0007
+ m_bank[0]->configure_entry(0, &m_share[0x00004]);
+ m_bank[0]->configure_entry(1, &m_share[0x10004]);
+
+ // 0x000f - 0x000f
+ m_bank[1]->configure_entry(0, &m_share[0x0000f]);
+ m_bank[1]->configure_entry(1, &m_share[0x1000f]);
+
+ // 0x0000 - 0x3fff
+ m_bank[2]->configure_entry(0, &m_share[0x00020]);
+ m_bank[2]->configure_entry(1, &m_share[0x10020]);
+
+ // 0x4000 - 0x5fff
+ m_bank[3]->configure_entry(0, &m_share[0x08000]);
+ m_bank[3]->configure_entry(1, &m_share[0x18000]);
+
+ // 0x6000 - 0xbeff
+ m_bank[4]->configure_entry(0, &m_share[0x0a000]);
+ m_bank[4]->configure_entry(1, &m_share[0x1a000]);
+
+ // 0xc000 - 0xdfff
+ m_bank[5]->configure_entry(0, &m_share[0x04000]);
+ m_bank[5]->configure_entry(1, &m_share[0x14000]);
+
+ // 0xe000 - 0xffff
+ m_bank[6]->configure_entry(0, &m_share[0x06000]);
+ m_bank[6]->configure_entry(1, &m_share[0x16000]);
+
+ // 0xff00 - 0xffff
+ m_bank[7]->configure_entry(0, &m_share[0x07f00]);
+ m_bank[7]->configure_entry(1, &m_share[0x07f00]);
+
+ owning_slot().memspace().install_view(0x0000, 0xffff, m_view);
+
+ m_view[0].install_device(0x0000, 0xffff, *this, &mc10_pak_mcx128_device::view_map0);
+ m_view[1].install_device(0x0000, 0xffff, *this, &mc10_pak_mcx128_device::view_map1);
+ m_view[2].install_device(0x0000, 0xffff, *this, &mc10_pak_mcx128_device::view_map2);
+ m_view[3].install_device(0x0000, 0xffff, *this, &mc10_pak_mcx128_device::view_map3);
+ m_view[4].install_device(0x0000, 0xffff, *this, &mc10_pak_mcx128_device::view_map4);
+ m_view[5].install_device(0x0000, 0xffff, *this, &mc10_pak_mcx128_device::view_map5);
+ m_view[6].install_device(0x0000, 0xffff, *this, &mc10_pak_mcx128_device::view_map6);
+ m_view[7].install_device(0x0000, 0xffff, *this, &mc10_pak_mcx128_device::view_map7);
+}
+
+//-------------------------------------------------
+// device_reset - device-specific startup
+//-------------------------------------------------
+
+void mc10_pak_mcx128_device::device_reset()
+{
+ ram_bank_cr = 0;
+ rom_map_cr = 0;
+ update_banks();
+}
+
+void mc10_pak_mcx128_device::device_post_load()
+{
+ update_banks();
+}
+
+void mc10_pak_mcx128_device::write_ram_mirror(address_space &space, offs_t offset, u8 data)
+{
+ std::optional<int> cur_slot = m_view.entry();
+ m_share[0x08000+offset] = data;
+
+ if (cur_slot.has_value())
+ {
+ int cur_slot_int = *cur_slot;
+ m_view.disable();
+ space.write_byte(0x4000+offset, data);
+ m_view.select(cur_slot_int);
+ }
+}
+
+u8 mc10_pak_mcx128_device::control_register_read(offs_t offset)
+{
+ if (offset==0)
+ return ram_bank_cr & 0x03;
+
+ return rom_map_cr & 0x03;
+}
+
+void mc10_pak_mcx128_device::control_register_write(offs_t offset, u8 data)
+{
+ if (offset==0)
+ ram_bank_cr = data;
+ else
+ rom_map_cr = data;
+
+ update_banks();
+}
+
+void mc10_pak_mcx128_device::update_banks()
+{
+ int bank0 = ram_bank_cr & 0x01;
+ int bank1 = (ram_bank_cr & 0x02) >> 1;
+
+ m_bank[0]->set_entry(bank0);
+ m_bank[1]->set_entry(bank0);
+ m_bank[2]->set_entry(bank0);
+ m_bank[3]->set_entry(bank1);
+ m_bank[4]->set_entry(bank1);
+ m_bank[5]->set_entry(bank0);
+ m_bank[6]->set_entry(bank0);
+ m_bank[7]->set_entry(bank0);
+
+ m_view.select((bank1 << 2) | (rom_map_cr & 0x03));
+ LOG("view select: %d, bank cr: %d\n", (bank1 << 2) | (rom_map_cr & 0x03), ram_bank_cr & 0x03 );
+}
+
+class alice_pak_mcx128_device : public mc10_pak_mcx128_device
+{
+public:
+ // construction/destruction
+ alice_pak_mcx128_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device-level overrides
+ virtual const tiny_rom_entry *device_rom_region() const override
+ {
+ return ROM_NAME(alice_mcx128);
+ }
+};
+
+//-------------------------------------------------
+// mc10_pak_device - constructor
+//-------------------------------------------------
+
+alice_pak_mcx128_device::alice_pak_mcx128_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : mc10_pak_mcx128_device(mconfig, ALICE_PAK_MCX128, tag, owner, clock)
+{
+}
+
+DEFINE_DEVICE_TYPE_PRIVATE(ALICE_PAK_MCX128, device_mc10cart_interface, alice_pak_mcx128_device, "alice_mcx128", "Darren Atkinson's MCX-128 cartridge (Alice ROM)")
diff --git a/src/devices/bus/mc10/mcx128.h b/src/devices/bus/mc10/mcx128.h
new file mode 100644
index 00000000000..29ae63b64e2
--- /dev/null
+++ b/src/devices/bus/mc10/mcx128.h
@@ -0,0 +1,15 @@
+// license:BSD-3-Clause
+// copyright-holders:tim lindner
+#ifndef MAME_BUS_MC10_MC10_MCX128_H
+#define MAME_BUS_MC10_MC10_MCX128_H
+
+#pragma once
+
+#include "mc10_cart.h"
+
+// device type definition
+DECLARE_DEVICE_TYPE(MC10_PAK_MCX128, device_mc10cart_interface)
+DECLARE_DEVICE_TYPE(ALICE_PAK_MCX128, device_mc10cart_interface)
+
+#endif // MAME_BUS_MC10_MC10_MCX128_H
+
diff --git a/src/devices/bus/mc10/pak.cpp b/src/devices/bus/mc10/pak.cpp
new file mode 100644
index 00000000000..8e27d58ab8b
--- /dev/null
+++ b/src/devices/bus/mc10/pak.cpp
@@ -0,0 +1,69 @@
+// license:BSD-3-Clause
+// copyright-holders:tim lindner
+/***************************************************************************
+
+ pak.cpp
+
+ Code for emulating standard MC-10 cartridges with only ROM
+
+***************************************************************************/
+
+#include "emu.h"
+#include "pak.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(MC10_PAK, mc10_pak_device, "mc10pak", "MC-10 Program PAK")
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// mc10_pak_device - constructor
+//-------------------------------------------------
+mc10_pak_device::mc10_pak_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_mc10cart_interface(mconfig, *this)
+{
+}
+
+mc10_pak_device::mc10_pak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : mc10_pak_device(mconfig, MC10_PAK, tag, owner, clock)
+{
+}
+
+//-------------------------------------------------
+// max_rom_length - device-specific startup
+//-------------------------------------------------
+
+int mc10_pak_device::max_rom_length() const
+{
+ return 1024 * 16;
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mc10_pak_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// load - install rom region
+//-------------------------------------------------
+
+image_init_result mc10_pak_device::load()
+{
+ // if the host has supplied a ROM space, install it
+ memory_region *const romregion(memregion("^rom"));
+ if (romregion)
+ owning_slot().memspace().install_rom(0x5000, 0x5000 + romregion->bytes(), romregion->base());
+ else
+ return image_init_result::FAIL;
+
+ return image_init_result::PASS;
+}
diff --git a/src/devices/bus/mc10/pak.h b/src/devices/bus/mc10/pak.h
new file mode 100644
index 00000000000..797cea2f691
--- /dev/null
+++ b/src/devices/bus/mc10/pak.h
@@ -0,0 +1,37 @@
+// license:BSD-3-Clause
+// copyright-holders:tim lindner
+#ifndef MAME_BUS_MC10_MC10_PAK_H
+#define MAME_BUS_MC10_MC10_PAK_H
+
+#pragma once
+
+#include "mc10_cart.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> mc10_pak_device
+
+class mc10_pak_device :
+ public device_t,
+ public device_mc10cart_interface
+{
+public:
+ // construction/destruction
+ mc10_pak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual int max_rom_length() const override;
+ virtual image_init_result load() override;
+
+protected:
+ mc10_pak_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+};
+
+// device type definitions
+DECLARE_DEVICE_TYPE(MC10_PAK, mc10_pak_device)
+
+#endif // MAME_BUS_MC10_MC10_PAK_H
diff --git a/src/devices/bus/mc10/ram.cpp b/src/devices/bus/mc10/ram.cpp
new file mode 100644
index 00000000000..f6a6f488955
--- /dev/null
+++ b/src/devices/bus/mc10/ram.cpp
@@ -0,0 +1,78 @@
+// license:BSD-3-Clause
+// copyright-holders:tim lindner
+/***************************************************************************
+
+ ram.cpp
+
+ Code for emulating the Radio Shack 16K RAM Cartridge
+
+***************************************************************************/
+
+#include "emu.h"
+#include "ram.h"
+
+// #include "machine/ram.h"
+
+// #define VERBOSE (LOG_GENERAL )
+#include "logmacro.h"
+
+
+//**************************************************************************
+// TYPE DECLARATIONS
+//**************************************************************************
+
+namespace
+{
+ // ======================> mc10_pak_device
+
+ class mc10_pak_ram_device :
+ public device_t,
+ public device_mc10cart_interface
+ {
+ public:
+ // construction/destruction
+ mc10_pak_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ protected:
+ // device-level overrides
+ virtual void device_start() override;
+ private:
+ memory_share_creator<u8> m_share;
+ };
+};
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE_PRIVATE(MC10_PAK_RAM, device_mc10cart_interface, mc10_pak_ram_device, "mc10pakram", "Radio Shack 16K RAM Cartridge")
+
+
+
+//-------------------------------------------------
+// mc10_pak_device - constructor
+//-------------------------------------------------
+
+mc10_pak_ram_device::mc10_pak_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, MC10_PAK_RAM, tag, owner, clock)
+ , device_mc10cart_interface(mconfig, *this)
+ , m_share(*this, "ext_ram", 1024*16, ENDIANNESS_BIG)
+{
+}
+
+
+
+//**************************************************************************
+// MACHINE FRAGMENTS AND ADDRESS MAPS
+//**************************************************************************
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mc10_pak_ram_device::device_start()
+{
+ owning_slot().memspace().install_ram(0x5000, 0x8fff, &m_share[0]);
+}
diff --git a/src/devices/bus/mc10/ram.h b/src/devices/bus/mc10/ram.h
new file mode 100644
index 00000000000..e32530f81e6
--- /dev/null
+++ b/src/devices/bus/mc10/ram.h
@@ -0,0 +1,14 @@
+// license:BSD-3-Clause
+// copyright-holders:tim lindner
+#ifndef MAME_BUS_MC10_MC10_RAM_H
+#define MAME_BUS_MC10_MC10_RAM_H
+
+#pragma once
+
+#include "mc10_cart.h"
+
+// device type definition
+DECLARE_DEVICE_TYPE(MC10_PAK_RAM, device_mc10cart_interface)
+
+#endif // MAME_BUS_MC10_MC10_RAM_H
+
diff --git a/src/devices/bus/nes/act53.cpp b/src/devices/bus/nes/act53.cpp
index 2a441c36153..0576f36a06c 100644
--- a/src/devices/bus/nes/act53.cpp
+++ b/src/devices/bus/nes/act53.cpp
@@ -32,7 +32,7 @@
DEFINE_DEVICE_TYPE(NES_ACTION53, nes_action53_device, "nes_action53", "NES Cart Action 53 PCB")
-nes_action53_device::nes_action53_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_action53_device::nes_action53_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_ACTION53, tag, owner, clock)
, m_sel(0)
{
@@ -45,17 +45,21 @@ void nes_action53_device::device_start()
common_start();
save_item(NAME(m_sel));
save_item(NAME(m_reg));
- m_reg[0] = 0x00;
- m_reg[1] = 0x0f;
- m_reg[2] = 0x00;
- m_reg[3] = 0x3f;
+}
+
+void nes_action53_device::pcb_start(running_machine &machine, u8 *ciram_ptr, bool cart_mounted)
+{
+ device_nes_cart_interface::pcb_start(machine, ciram_ptr, cart_mounted);
+ // at power on last 16K of ROM is mapped to $C000-$FFFF
+ m_reg[0] = m_reg[1] = m_reg[2] = 0;
+ m_reg[3] = (m_prg_chunks - 1) >> 1;
+ update_prg();
}
void nes_action53_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
// register content is not touched by reset
- update_prg();
}
@@ -79,7 +83,7 @@ void nes_action53_device::pcb_reset()
R:$80 is clear
R:$01: [...M PPPP]
- P = PRG Reg
+ P = Inner PRG Reg
M = Mirroring
This bit overwrites bit 0 of R:$80, but only if bit 1 of
R:$80 is clear
@@ -97,7 +101,7 @@ void nes_action53_device::pcb_reset()
%10 = Vert
%11 = Horz
- R:$81: [..BB BBBB]
+ R:$81: [BBBB BBBB]
Outer PRG Reg
@@ -105,34 +109,20 @@ void nes_action53_device::pcb_reset()
void nes_action53_device::update_prg()
{
- uint8_t prg_lo, prg_hi, helper;
- uint8_t out = (m_reg[3] & 0x3f) << 1; // Outer PRG reg
- uint8_t size = (m_reg[2] & 0x30) >> 4; // Game size
- uint8_t mask = (1 << (size + 1)) - 1; // Bits to be taken from PRG reg
-
- if (!BIT(m_reg[2], 3))
- {
- helper = (out & ~mask) | ((m_reg[1] << 1) & mask);
- //32K mode
- prg_lo = (helper & 0xfe);
- prg_hi = (helper | 0x01);
- }
- else
- {
- helper = (out & ~mask) | (m_reg[1] & mask);
- if (BIT(m_reg[2], 2))
- {
- //16K mode with fixed HI
- prg_lo = helper;
- prg_hi = (out | 0x01);
- }
- else
- {
- //16K mode with fixed LO
- prg_lo = (out & 0xfe);
- prg_hi = helper;
- }
- }
+ u16 prg_lo, prg_hi;
+ u8 size = (m_reg[2] & 0x30) >> 4; // Game size
+ u16 mask = ~0 << (size + 1); // Bits to be taken from PRG regs
+ u8 b32k = !BIT(m_reg[2], 3); // 32K mode bit
+ u16 outer = m_reg[3] << 1; // Outer PRG reg bits
+ u8 inner = (m_reg[1] << b32k) & ~mask; // Inner PRG reg bits
+
+ prg_hi = prg_lo = (outer & mask) | inner;
+ if (b32k) // 32K mode
+ prg_hi++;
+ else if (BIT(m_reg[2], 2)) // 16K mode with fixed HI
+ prg_hi = ++outer;
+ else // 16K mode with fixed LO
+ prg_lo = outer;
// printf("banks : 0x%2X - 0x%2X\n", prg_lo, prg_hi);
prg16_89ab(prg_lo);
@@ -158,7 +148,7 @@ void nes_action53_device::update_mirr()
}
}
-void nes_action53_device::write_l(offs_t offset, uint8_t data)
+void nes_action53_device::write_l(offs_t offset, u8 data)
{
LOG_MMC(("action 53 write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -167,7 +157,7 @@ void nes_action53_device::write_l(offs_t offset, uint8_t data)
}
-void nes_action53_device::write_h(offs_t offset, uint8_t data)
+void nes_action53_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("action 53 write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/act53.h b/src/devices/bus/nes/act53.h
index 8e4b1c3b073..ead18a54ad6 100644
--- a/src/devices/bus/nes/act53.h
+++ b/src/devices/bus/nes/act53.h
@@ -12,12 +12,13 @@ class nes_action53_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_action53_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_action53_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual void write_l(offs_t offset, uint8_t data) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual void write_l(offs_t offset, u8 data) override;
+ virtual void write_h(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
+ virtual void pcb_start(running_machine &machine, u8 *ciram_ptr, bool cart_mounted) override;
protected:
// device-level overrides
@@ -26,8 +27,8 @@ protected:
private:
void update_prg();
void update_mirr();
- uint8_t m_sel;
- uint8_t m_reg[4];
+ u8 m_sel;
+ u8 m_reg[4];
};
// device type definition
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index acdfed33164..a207a26e869 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -237,9 +237,9 @@ protected:
device_nes_cart_interface(const machine_config &mconfig, device_t &device);
DECLARE_WRITE_LINE_MEMBER(set_irq_line);
- void hold_irq_line();
+ [[deprecated("IRQs should be cleared explicitly")]] void hold_irq_line();
void reset_cpu();
- void poke(offs_t offset, uint8_t data);
+ [[deprecated("devices should stop poking into memory spaces where they don't belong")]] void poke(offs_t offset, uint8_t data);
// internal state
uint8_t *m_prg;
diff --git a/src/devices/bus/newbrain/eim.cpp b/src/devices/bus/newbrain/eim.cpp
index be3cae2e615..7b3685eeea7 100644
--- a/src/devices/bus/newbrain/eim.cpp
+++ b/src/devices/bus/newbrain/eim.cpp
@@ -113,7 +113,7 @@ newbrain_eim_device::newbrain_eim_device(const machine_config &mconfig, const ch
device_newbrain_expansion_slot_interface(mconfig, *this),
m_ctc(*this, Z80CTC_TAG),
m_acia(*this, MC6850_TAG),
- m_exp(*this, NEWBRAIN_EXPANSION_SLOT_TAG),
+ m_exp(*this, "exp"),
m_rom(*this, "eim"),
m_ram(*this, RAM_TAG)
{
diff --git a/src/devices/bus/newbrain/exp.h b/src/devices/bus/newbrain/exp.h
index e8293a9c540..922ef17213a 100644
--- a/src/devices/bus/newbrain/exp.h
+++ b/src/devices/bus/newbrain/exp.h
@@ -43,13 +43,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define NEWBRAIN_EXPANSION_SLOT_TAG "exp"
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/newbrain/fdc.cpp b/src/devices/bus/newbrain/fdc.cpp
index a356d034a39..fa046e0d5a9 100644
--- a/src/devices/bus/newbrain/fdc.cpp
+++ b/src/devices/bus/newbrain/fdc.cpp
@@ -135,11 +135,8 @@ newbrain_fdc_device::newbrain_fdc_device(const machine_config &mconfig, const ch
device_newbrain_expansion_slot_interface(mconfig, *this),
m_maincpu(*this, Z80_TAG),
m_fdc(*this, UPD765_TAG),
- m_floppy0(*this, UPD765_TAG ":0"),
- m_floppy1(*this, UPD765_TAG ":1"),
- m_floppy2(*this, UPD765_TAG ":2"),
- m_floppy3(*this, UPD765_TAG ":3"),
- m_exp(*this, NEWBRAIN_EXPANSION_SLOT_TAG)
+ m_floppy(*this, UPD765_TAG ":%u", 0U),
+ m_exp(*this, "exp")
{
}
@@ -224,10 +221,9 @@ void newbrain_fdc_device::iorq_w(offs_t offset, uint8_t data, bool &prtov)
void newbrain_fdc_device::moton(int state)
{
- if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
- if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
- if (m_floppy2->get_device()) m_floppy2->get_device()->mon_w(!state);
- if (m_floppy3->get_device()) m_floppy3->get_device()->mon_w(!state);
+ for (auto &floppy : m_floppy)
+ if (floppy->get_device())
+ floppy->get_device()->mon_w(!state);
}
diff --git a/src/devices/bus/newbrain/fdc.h b/src/devices/bus/newbrain/fdc.h
index e5d6665a078..3ac24faffa6 100644
--- a/src/devices/bus/newbrain/fdc.h
+++ b/src/devices/bus/newbrain/fdc.h
@@ -57,10 +57,7 @@ private:
required_device<z80_device> m_maincpu;
required_device<upd765a_device> m_fdc;
- required_device<floppy_connector> m_floppy0;
- required_device<floppy_connector> m_floppy1;
- required_device<floppy_connector> m_floppy2;
- required_device<floppy_connector> m_floppy3;
+ required_device_array<floppy_connector, 4> m_floppy;
required_device<newbrain_expansion_slot_device> m_exp;
void moton(int state);
diff --git a/src/devices/bus/odyssey2/rom.cpp b/src/devices/bus/odyssey2/rom.cpp
index 20b04256d00..b964d99b584 100644
--- a/src/devices/bus/odyssey2/rom.cpp
+++ b/src/devices/bus/odyssey2/rom.cpp
@@ -28,7 +28,7 @@ void o2_rom_device::device_start()
void o2_rom_device::cart_init()
{
- m_cart_mask = (1 << (31 - count_leading_zeros(m_rom_size))) - 1;
+ m_cart_mask = (1 << (31 - count_leading_zeros_32(m_rom_size))) - 1;
}
diff --git a/src/devices/bus/pet/exp.h b/src/devices/bus/pet/exp.h
index d3adf1e9262..14fe9296a8d 100644
--- a/src/devices/bus/pet/exp.h
+++ b/src/devices/bus/pet/exp.h
@@ -17,13 +17,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define PET_EXPANSION_SLOT_TAG "exp"
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/plus4/c1551.cpp b/src/devices/bus/plus4/c1551.cpp
index 5811f7b42f7..b8ecd0b7642 100644
--- a/src/devices/bus/plus4/c1551.cpp
+++ b/src/devices/bus/plus4/c1551.cpp
@@ -368,7 +368,7 @@ void c1551_device::device_add_mconfig(machine_config &config)
connector.set_fixed(true);
connector.set_formats(c1551_device::floppy_formats);
- PLUS4_EXPANSION_SLOT(config, m_exp, 0);
+ PLUS4_EXPANSION_SLOT(config, m_exp, DERIVED_CLOCK(1, 1));
m_exp->irq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(plus4_expansion_slot_device::irq_w));
m_exp->cd_rd_callback().set(DEVICE_SELF_OWNER, FUNC(plus4_expansion_slot_device::dma_cd_r));
m_exp->cd_wr_callback().set(DEVICE_SELF_OWNER, FUNC(plus4_expansion_slot_device::dma_cd_w));
@@ -417,7 +417,7 @@ c1551_device::c1551_device(const machine_config &mconfig, const char *tag, devic
, m_ga(*this, C64H156_TAG)
, m_pla(*this, PLA_TAG)
, m_floppy(*this, C64H156_TAG":0:525ssqd")
- , m_exp(*this, PLUS4_EXPANSION_SLOT_TAG)
+ , m_exp(*this, "exp")
, m_jp1(*this, "JP1")
, m_leds(*this, "led%u", 0U)
, m_tcbm_data(0xff)
diff --git a/src/devices/bus/plus4/exp.cpp b/src/devices/bus/plus4/exp.cpp
index 4099b38d5bd..fb0387908ef 100644
--- a/src/devices/bus/plus4/exp.cpp
+++ b/src/devices/bus/plus4/exp.cpp
@@ -90,15 +90,6 @@ void plus4_expansion_slot_device::device_start()
m_read_dma_cd.resolve_safe(0xff);
m_write_dma_cd.resolve_safe();
m_write_aec.resolve_safe();
-
- // inherit bus clock
- // FIXME: this should be unnecessary as slots pass DERIVED_CLOCK(1, 1) through by default
- if (clock() == 0)
- {
- plus4_expansion_slot_device *root = machine().root_device().subdevice<plus4_expansion_slot_device>(PLUS4_EXPANSION_SLOT_TAG);
- assert(root);
- set_unscaled_clock(root->clock());
- }
}
diff --git a/src/devices/bus/plus4/exp.h b/src/devices/bus/plus4/exp.h
index fb03fb7fd4b..785207dd4f1 100644
--- a/src/devices/bus/plus4/exp.h
+++ b/src/devices/bus/plus4/exp.h
@@ -43,13 +43,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define PLUS4_EXPANSION_SLOT_TAG "exp"
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/pofo/exp.h b/src/devices/bus/pofo/exp.h
index f760ce694c3..4078535e2c7 100644
--- a/src/devices/bus/pofo/exp.h
+++ b/src/devices/bus/pofo/exp.h
@@ -48,13 +48,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define PORTFOLIO_EXPANSION_SLOT_TAG "exp"
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/pofo/hpc104.cpp b/src/devices/bus/pofo/hpc104.cpp
index 11744206c7e..0d8953b20c6 100644
--- a/src/devices/bus/pofo/hpc104.cpp
+++ b/src/devices/bus/pofo/hpc104.cpp
@@ -100,7 +100,7 @@ pofo_hpc104_device::pofo_hpc104_device(const machine_config &mconfig, device_typ
device_portfolio_expansion_slot_interface(mconfig, *this),
device_nvram_interface(mconfig, *this),
m_ccm(*this, PORTFOLIO_MEMORY_CARD_SLOT_B_TAG),
- m_exp(*this, PORTFOLIO_EXPANSION_SLOT_TAG),
+ m_exp(*this, "exp"),
m_nvram(*this, "nvram", 0x40000, ENDIANNESS_LITTLE),
m_io_sw1(*this, "SW1")
{
@@ -169,7 +169,7 @@ uint8_t pofo_hpc104_device::nrdi_r(offs_t offset, uint8_t data, bool iom, bool b
{
if (offset >= 0x1f000 && offset < 0x5f000)
{
- data = m_nvram[offset - 0x1f000] = data;
+ data = m_nvram[offset - 0x1f000];
}
}
}
diff --git a/src/devices/bus/saitek_osa/expansion.cpp b/src/devices/bus/saitek_osa/expansion.cpp
index bae1dfe0eb5..0c7e6be78bc 100644
--- a/src/devices/bus/saitek_osa/expansion.cpp
+++ b/src/devices/bus/saitek_osa/expansion.cpp
@@ -11,6 +11,10 @@ Used by Saitek(SciSys) chess computers Leonardo, Galileo, Renaissance.
#include "emu.h"
#include "expansion.h"
+#include "maestro.h"
+#include "maestroa.h"
+#include "sparc.h"
+
//**************************************************************************
// DEVICE DEFINITIONS
@@ -153,3 +157,15 @@ device_saitekosa_expansion_interface::device_saitekosa_expansion_interface(const
device_saitekosa_expansion_interface::~device_saitekosa_expansion_interface()
{
}
+
+//-------------------------------------------------
+// module list
+//-------------------------------------------------
+
+void saitekosa_expansion_modules(device_slot_interface &device)
+{
+ device.option_add("analyst", OSA_ANALYST);
+ device.option_add("maestro", OSA_MAESTRO);
+ device.option_add("maestroa", OSA_MAESTROA);
+ device.option_add("sparc", OSA_SPARC);
+}
diff --git a/src/devices/bus/saitek_osa/expansion.h b/src/devices/bus/saitek_osa/expansion.h
index 2c245ada301..cb513bf2f4e 100644
--- a/src/devices/bus/saitek_osa/expansion.h
+++ b/src/devices/bus/saitek_osa/expansion.h
@@ -119,10 +119,10 @@ protected:
saitekosa_expansion_device *m_expansion;
};
+void saitekosa_expansion_modules(device_slot_interface &device);
+
+
// device type definition
DECLARE_DEVICE_TYPE(SAITEKOSA_EXPANSION, saitekosa_expansion_device)
-// include here so drivers don't need to
-#include "modules.h"
-
#endif // MAME_BUS_SAITEKOSA_EXPANSION_H
diff --git a/src/devices/bus/saitek_osa/modules.cpp b/src/devices/bus/saitek_osa/modules.cpp
deleted file mode 100644
index 19b7af1ff13..00000000000
--- a/src/devices/bus/saitek_osa/modules.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-/***************************************************************************
-
- Saitek OSA Expansion Slot modules
-
-***************************************************************************/
-
-#include "emu.h"
-#include "modules.h"
-
-#include "maestro.h"
-#include "maestroa.h"
-#include "sparc.h"
-
-void saitekosa_expansion_modules(device_slot_interface &device)
-{
- device.option_add("analyst", OSA_ANALYST);
- device.option_add("maestro", OSA_MAESTRO);
- device.option_add("maestroa", OSA_MAESTROA);
- device.option_add("sparc", OSA_SPARC);
-}
diff --git a/src/devices/bus/saitek_osa/modules.h b/src/devices/bus/saitek_osa/modules.h
deleted file mode 100644
index 009daf69cec..00000000000
--- a/src/devices/bus/saitek_osa/modules.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-/***************************************************************************
-
- Saitek OSA Expansion Slot modules
-
-***************************************************************************/
-
-#ifndef MAME_BUS_SAITEKOSA_MODULES_H
-#define MAME_BUS_SAITEKOSA_MODULES_H
-
-#pragma once
-
-void saitekosa_expansion_modules(device_slot_interface &device);
-
-#endif // MAME_BUS_SAITEKOSA_MODULES_H
diff --git a/src/devices/bus/vic10/exp.cpp b/src/devices/bus/vic10/exp.cpp
index a678a2624c3..48f42ad73c1 100644
--- a/src/devices/bus/vic10/exp.cpp
+++ b/src/devices/bus/vic10/exp.cpp
@@ -79,15 +79,6 @@ void vic10_expansion_slot_device::device_start()
m_write_res.resolve_safe();
m_write_cnt.resolve_safe();
m_write_sp.resolve_safe();
-
- // inherit bus clock
- // FIXME: this should be unnecessary as slots pass DERIVED_CLOCK(1, 1) through by default
- if (clock() == 0)
- {
- vic10_expansion_slot_device *root = machine().root_device().subdevice<vic10_expansion_slot_device>(VIC10_EXPANSION_SLOT_TAG);
- assert(root);
- set_unscaled_clock(root->clock());
- }
}
diff --git a/src/devices/bus/vic10/exp.h b/src/devices/bus/vic10/exp.h
index 20d21f99e1c..c2b1f52ec70 100644
--- a/src/devices/bus/vic10/exp.h
+++ b/src/devices/bus/vic10/exp.h
@@ -41,14 +41,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define VIC10_EXPANSION_SLOT_TAG "exp"
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/vic20/exp.h b/src/devices/bus/vic20/exp.h
index 96583a29577..dab459cf7bf 100644
--- a/src/devices/bus/vic20/exp.h
+++ b/src/devices/bus/vic20/exp.h
@@ -40,14 +40,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define VIC20_EXPANSION_SLOT_TAG "exp"
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/vip/exp.h b/src/devices/bus/vip/exp.h
index bb9cd203690..aa50074e9ca 100644
--- a/src/devices/bus/vip/exp.h
+++ b/src/devices/bus/vip/exp.h
@@ -40,13 +40,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define VIP_EXPANSION_SLOT_TAG "exp"
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/vme/vme.cpp b/src/devices/bus/vme/vme.cpp
index a6edb30b693..57f0c6170d2 100644
--- a/src/devices/bus/vme/vme.cpp
+++ b/src/devices/bus/vme/vme.cpp
@@ -109,54 +109,34 @@ vme_slot_device::vme_slot_device(const machine_config &mconfig, const char *tag,
vme_slot_device::vme_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
, device_slot_interface(mconfig, *this)
- , m_vme_tag(nullptr)
- , m_vme_slottag(nullptr)
+ , m_vme(*this, finder_base::DUMMY_TAG)
+ , m_slot_nbr(0)
, m_vme_j1_callback(*this)
{
LOG("%s %s\n", tag, FUNCNAME);
}
//-------------------------------------------------
-// update_vme_chains
-//-------------------------------------------------
-void vme_slot_device::update_vme_chains(uint32_t slot_nbr)
-{
- LOG("%s %s - %d\n", FUNCNAME, tag(), slot_nbr);
-}
-
-//-------------------------------------------------
-// set_vme_slot
+// device_start - device-specific startup
//-------------------------------------------------
-void vme_slot_device::set_vme_slot(const char *tag, const char *slottag)
+void vme_slot_device::device_start()
{
- LOG("%s %s - %s\n", FUNCNAME, tag, slottag);
- m_vme_tag = tag;
- m_vme_slottag = slottag;
+ // m_card = dynamic_cast<device_vme_card_interface *>(get_card_device());
}
//-------------------------------------------------
-// device_start - device-specific startup
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
//-------------------------------------------------
-void vme_slot_device::device_start()
+void vme_slot_device::device_resolve_objects()
{
device_vme_card_interface *dev = dynamic_cast<device_vme_card_interface *>(get_card_device());
- LOG("%s %s - %s:%s\n", tag(), FUNCNAME, m_vme_tag, m_vme_slottag);
+ LOG("%s %s - %s\n", tag(), FUNCNAME, m_vme.finder_tag());
if (dev)
{
- dev->set_vme_tag(m_vme_tag, m_vme_slottag);
+ dev->set_vme_bus(*m_vme, m_slot_nbr);
}
-
- // m_card = dynamic_cast<device_vme_card_interface *>(get_card_device());
-}
-
-//-------------------------------------------------
-// device_config_complete - perform any
-// operations now that the configuration is
-// complete
-//-------------------------------------------------
-void vme_slot_device::device_config_complete()
-{
- LOG("%s %s\n", tag(), FUNCNAME);
}
//-------------------------------------------------
@@ -457,8 +437,6 @@ void vme_device::install_device(vme_amod_t amod, offs_t start, offs_t end, read3
device_vme_card_interface::device_vme_card_interface(const machine_config &mconfig, device_t &device)
: device_interface(device, "vme")
, m_vme(nullptr)
- , m_vme_tag(nullptr)
- , m_vme_slottag(nullptr)
, m_slot(0)
, m_next(nullptr)
{
@@ -471,17 +449,9 @@ device_vme_card_interface::~device_vme_card_interface()
LOG("%s %s\n", m_device->tag(), FUNCNAME);
}
-void device_vme_card_interface::set_vme_tag(const char *tag, const char *slottag)
-{
- LOG("%s %s\n", tag, FUNCNAME);
- m_vme_tag = tag;
- m_vme_slottag = slottag;
-}
-
-void device_vme_card_interface::set_vme_device()
+void device_vme_card_interface::interface_post_start()
{
LOG("%s %s\n", m_device->tag(), FUNCNAME);
- m_vme = device().machine().root_device().subdevice<vme_device>(m_vme_tag);
// printf("*** %s %sfound\n", m_vme_tag, m_vme ? "" : "not ");
if (m_vme) m_vme->add_vme_card(this);
}
diff --git a/src/devices/bus/vme/vme.h b/src/devices/bus/vme/vme.h
index 93947e40e91..e49b23cbbbe 100644
--- a/src/devices/bus/vme/vme.h
+++ b/src/devices/bus/vme/vme.h
@@ -55,12 +55,11 @@
// CONSTANTS
//**************************************************************************
-#define VME_BUS_TAG "vme"
-
//void vme_slot1(device_slot_interface &device); // Disabled until we know how to combine a board driver and a slot device.
void vme_slots(device_slot_interface &device);
class device_vme_card_interface; // This interface is standardized
+class vme_device;
class vme_slot_device : public device_t,
public device_slot_interface
@@ -85,16 +84,15 @@ public:
};
// construction/destruction
- template <typename T>
- vme_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt, uint32_t slot_nbr, char const *bus_tag)
+ template <typename T, typename U>
+ vme_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt, uint32_t slot_nbr, U &&bus_tag)
: vme_slot_device(mconfig, tag, owner, 0)
{
option_reset();
opts(*this);
set_default_option(dflt);
set_fixed(false);
- set_vme_slot(bus_tag, tag);
- update_vme_chains(slot_nbr);
+ set_vme_slot(std::forward<U>(bus_tag), slot_nbr);
}
vme_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
@@ -102,8 +100,7 @@ public:
// Callbacks to the board from the VME bus comes through here
auto vme_j1_callback() { return m_vme_j1_callback.bind(); }
- void set_vme_slot(const char *tag, const char *slottag);
- void update_vme_chains(uint32_t slot_nbr);
+ template <typename T> void set_vme_slot(T &&tag, uint32_t slot_nbr) { m_vme.set_tag(std::forward<T>(tag)); m_slot_nbr = slot_nbr; }
virtual uint8_t read8(offs_t offset);
virtual void write8(offs_t offset, uint8_t data);
@@ -113,10 +110,11 @@ protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_config_complete() override;
+ virtual void device_resolve_objects() override;
// configuration
- const char *m_vme_tag, *m_vme_slottag;
+ required_device<vme_device> m_vme;
+ uint32_t m_slot_nbr;
// callbacks
devcb_write_line m_vme_j1_callback;
@@ -139,8 +137,6 @@ public:
void set_cputag(const char *tag) { m_cputag = tag; }
void use_owner_spaces();
- virtual space_config_vector memory_space_config() const override;
-
const address_space_config m_a32_config;
void add_vme_card(device_vme_card_interface *card);
@@ -196,6 +192,8 @@ protected:
virtual void device_reset() override;
simple_list<device_vme_card_interface> m_device_list;
+ virtual space_config_vector memory_space_config() const override;
+
// internal state
cpu_device *m_maincpu;
@@ -218,22 +216,22 @@ class device_vme_card_interface : public device_interface
template <class ElementType> friend class simple_list;
public:
// inline configuration
- void set_vme_tag(const char *tag, const char *slottag);
+ void set_vme_bus(vme_device &vme, int slot) { m_vme = &vme; m_slot = slot; }
// construction/destruction
virtual ~device_vme_card_interface();
- void set_vme_device();
virtual uint8_t read8(offs_t offset);
virtual void write8(offs_t offset, uint8_t data);
+protected:
device_vme_card_interface(const machine_config &mconfig, device_t &device);
-protected:
+ virtual void interface_post_start() override;
+
device_t *m_device;
vme_device *m_vme;
- const char *m_vme_tag, *m_vme_slottag;
int m_slot;
private:
diff --git a/src/devices/bus/vme/vme_fccpu20.cpp b/src/devices/bus/vme/vme_fccpu20.cpp
index 8759c47d143..ee07b86e1be 100644
--- a/src/devices/bus/vme/vme_fccpu20.cpp
+++ b/src/devices/bus/vme/vme_fccpu20.cpp
@@ -443,8 +443,6 @@ void vme_fccpu20_device::device_start()
{
LOG("%s\n", FUNCNAME);
- set_vme_device();
-
save_pointer (NAME (m_sysrom), sizeof(m_sysrom));
save_pointer (NAME (m_sysram), sizeof(m_sysram));
// save_item(NAME(m_board_id)); // TODO: Save this "non base type" item
diff --git a/src/devices/bus/vme/vme_fcisio.cpp b/src/devices/bus/vme/vme_fcisio.cpp
index d9e35370812..de4c03dfab8 100644
--- a/src/devices/bus/vme/vme_fcisio.cpp
+++ b/src/devices/bus/vme/vme_fcisio.cpp
@@ -405,7 +405,6 @@ vme_fcisio1_card_device::vme_fcisio1_card_device(const machine_config &mconfig,
void vme_fcisio1_card_device::device_start()
{
LOG("%s\n", FUNCNAME);
- set_vme_device();
/* Setup pointer to bootvector in ROM for bootvector handler bootvect_r */
m_sysrom = (uint16_t*)(memregion ("maincpu")->base () + 0xf00000);
diff --git a/src/devices/bus/vme/vme_fcscsi.cpp b/src/devices/bus/vme/vme_fcscsi.cpp
index 508ae910e9c..7324dd907b6 100644
--- a/src/devices/bus/vme/vme_fcscsi.cpp
+++ b/src/devices/bus/vme/vme_fcscsi.cpp
@@ -329,7 +329,6 @@ vme_fcscsi1_card_device::vme_fcscsi1_card_device(const machine_config &mconfig,
void vme_fcscsi1_card_device::device_start()
{
LOG("%s\n", FUNCNAME);
- set_vme_device();
/* Setup pointer to bootvector in ROM for bootvector handler bootvect_r */
m_sysrom = (uint16_t*)(memregion ("maincpu")->base () + 0xe00000);
diff --git a/src/devices/bus/vme/vme_hcpu30.cpp b/src/devices/bus/vme/vme_hcpu30.cpp
index 0c072c20191..2d70c85dd94 100644
--- a/src/devices/bus/vme/vme_hcpu30.cpp
+++ b/src/devices/bus/vme/vme_hcpu30.cpp
@@ -180,8 +180,6 @@ void vme_hcpu30_card_device::device_start()
{
LOG("%s %s\n", tag(), FUNCNAME);
- set_vme_device();
-
save_pointer (NAME (m_sysrom), sizeof(m_sysrom));
save_pointer (NAME (m_sysram), sizeof(m_sysram));
diff --git a/src/devices/bus/vme/vme_mvme350.cpp b/src/devices/bus/vme/vme_mvme350.cpp
index 1b8f2f7a564..a0dca46b996 100644
--- a/src/devices/bus/vme/vme_mvme350.cpp
+++ b/src/devices/bus/vme/vme_mvme350.cpp
@@ -224,7 +224,6 @@ vme_mvme350_card_device::vme_mvme350_card_device(const machine_config &mconfig,
void vme_mvme350_card_device::device_start()
{
LOG("%s %s\n", tag(), FUNCNAME);
- set_vme_device();
/* Setup r/w handlers for shared memory area */
#if 0
diff --git a/src/devices/bus/vme/vme_mzr8300.cpp b/src/devices/bus/vme/vme_mzr8300.cpp
index cdcd3bd267e..99e2e8c0889 100644
--- a/src/devices/bus/vme/vme_mzr8300.cpp
+++ b/src/devices/bus/vme/vme_mzr8300.cpp
@@ -168,7 +168,6 @@ vme_mzr8300_card_device::vme_mzr8300_card_device(const machine_config &mconfig,
void vme_mzr8300_card_device::device_start()
{
LOG("%s %s\n", tag(), FUNCNAME);
- set_vme_device();
/* Setup r/w handlers for first SIO in A16 */
uint32_t base = 0xFF0000;
diff --git a/src/devices/cpu/am29000/am29ops.h b/src/devices/cpu/am29000/am29ops.h
index 74f6eef48f9..e111af99cd1 100644
--- a/src/devices/cpu/am29000/am29ops.h
+++ b/src/devices/cpu/am29000/am29ops.h
@@ -1396,7 +1396,7 @@ void am29000_cpu_device::CLZ()
{
uint32_t b = INST_M_BIT ? I8: GET_RB_VAL;
- m_r[RC] = count_leading_zeros(b);
+ m_r[RC] = count_leading_zeros_32(b);
}
void am29000_cpu_device::SETIP()
diff --git a/src/devices/cpu/arm7/arm7ops.cpp b/src/devices/cpu/arm7/arm7ops.cpp
index cb08ff8fed4..f5a8f435762 100644
--- a/src/devices/cpu/arm7/arm7ops.cpp
+++ b/src/devices/cpu/arm7/arm7ops.cpp
@@ -1697,7 +1697,7 @@ void arm7_cpu_device::arm7ops_0123(uint32_t insn)
uint32_t rm = insn&0xf;
uint32_t rd = (insn>>12)&0xf;
- SetRegister(rd, count_leading_zeros(GetRegister(rm)));
+ SetRegister(rd, count_leading_zeros_32(GetRegister(rm)));
R15 += 4;
}
diff --git a/src/devices/cpu/drcbec.cpp b/src/devices/cpu/drcbec.cpp
index d8b30535d6e..f54e6416696 100644
--- a/src/devices/cpu/drcbec.cpp
+++ b/src/devices/cpu/drcbec.cpp
@@ -1062,11 +1062,11 @@ int drcbe_c::execute(code_handle &entry)
break;
case MAKE_OPCODE_SHORT(OP_LZCNT, 4, 0): // LZCNT dst,src
- PARAM0 = count_leading_zeros(PARAM1);
+ PARAM0 = count_leading_zeros_32(PARAM1);
break;
case MAKE_OPCODE_SHORT(OP_LZCNT, 4, 1):
- temp32 = count_leading_zeros(PARAM1);
+ temp32 = count_leading_zeros_32(PARAM1);
flags = FLAGS32_NZ(temp32);
PARAM0 = temp32;
break;
@@ -1675,17 +1675,11 @@ int drcbe_c::execute(code_handle &entry)
break;
case MAKE_OPCODE_SHORT(OP_LZCNT, 8, 0): // DLZCNT dst,src
- if ((uint32_t)(DPARAM1 >> 32) != 0)
- DPARAM0 = count_leading_zeros(DPARAM1 >> 32);
- else
- DPARAM0 = 32 + count_leading_zeros(DPARAM1);
+ DPARAM0 = count_leading_zeros_64(DPARAM1);
break;
case MAKE_OPCODE_SHORT(OP_LZCNT, 8, 1):
- if ((uint32_t)(DPARAM1 >> 32) != 0)
- temp64 = count_leading_zeros(DPARAM1 >> 32);
- else
- temp64 = 32 + count_leading_zeros(DPARAM1);
+ temp64 = count_leading_zeros_64(DPARAM1);
flags = FLAGS64_NZ(temp64);
DPARAM0 = temp64;
break;
diff --git a/src/devices/cpu/dspp/dspp.cpp b/src/devices/cpu/dspp/dspp.cpp
index ac7ece3cfb5..3479e461af5 100644
--- a/src/devices/cpu/dspp/dspp.cpp
+++ b/src/devices/cpu/dspp/dspp.cpp
@@ -1588,7 +1588,7 @@ void dspp_device::update_fifo_dma()
while (mask != 0)
{
- uint32_t channel = 31 - count_leading_zeros(mask);
+ uint32_t channel = 31 - count_leading_zeros_32(mask);
const fifo_dma & dma = m_fifo_dma[channel];
diff --git a/src/devices/cpu/h8500/h8500.cpp b/src/devices/cpu/h8500/h8500.cpp
index c96fed16f7f..765988ceeaa 100644
--- a/src/devices/cpu/h8500/h8500.cpp
+++ b/src/devices/cpu/h8500/h8500.cpp
@@ -12,10 +12,11 @@
#include "h8500.h"
#include "h8500dasm.h"
-h8500_device::h8500_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int addrbits, int buswidth, int ramsize, address_map_constructor map)
+h8500_device::h8500_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int addrbits, int buswidth, int ramsize, int defmode, address_map_constructor map)
: cpu_device(mconfig, type, tag, owner, clock)
, m_program_config("program", ENDIANNESS_BIG, buswidth, addrbits, 0, map)
, m_ram_config("internal RAM", ENDIANNESS_BIG, 16, ramsize, 0, address_map_constructor(FUNC(h8500_device::ram_map), this))
+ , m_mode_control(defmode)
, m_pc(0)
, m_ppc(0)
, m_sr(0)
diff --git a/src/devices/cpu/h8500/h8500.h b/src/devices/cpu/h8500/h8500.h
index ede393687a9..3755ab7a4ab 100644
--- a/src/devices/cpu/h8500/h8500.h
+++ b/src/devices/cpu/h8500/h8500.h
@@ -18,8 +18,10 @@ public:
H8500_R4, H8500_R5, H8500_FP, H8500_SP
};
+ void set_mode(u8 mode) { assert(!configured()); m_mode_control = mode; }
+
protected:
- h8500_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int addrbits, int buswidth, int ramsize, address_map_constructor map);
+ h8500_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int addrbits, int buswidth, int ramsize, int defmode, address_map_constructor map);
// device-level overrides
virtual void device_config_complete() override;
@@ -40,7 +42,8 @@ protected:
// device_state_interface overrides
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
- virtual bool h8_maximum_mode() const noexcept { return true; }
+ u8 mode_control() const { return m_mode_control; }
+ virtual bool h8_maximum_mode() const noexcept { return m_mode_control == 3 || m_mode_control == 4; } // all except H8/570
private:
void ram_map(address_map &map);
@@ -52,6 +55,9 @@ private:
address_space *m_program;
memory_access<11, 1, 0, ENDIANNESS_BIG>::cache m_ram_cache;
+ // misc. configuration
+ u8 m_mode_control;
+
// internal registers
u16 m_pc;
u16 m_ppc;
diff --git a/src/devices/cpu/h8500/h8510.cpp b/src/devices/cpu/h8500/h8510.cpp
index 413f99cc248..b4ade58d8d5 100644
--- a/src/devices/cpu/h8500/h8510.cpp
+++ b/src/devices/cpu/h8500/h8510.cpp
@@ -12,7 +12,7 @@
DEFINE_DEVICE_TYPE(HD6415108, hd6415108_device, "hd6415108", "Hitachi HD6415108 (H8/510)")
h8510_device::h8510_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
- : h8500_device(mconfig, type, tag, owner, clock, 24, 16, 0, address_map_constructor(FUNC(h8510_device::internal_map), this))
+ : h8500_device(mconfig, type, tag, owner, clock, 24, 16, 0, 4, address_map_constructor(FUNC(h8510_device::internal_map), this))
{
}
diff --git a/src/devices/cpu/h8500/h8520.cpp b/src/devices/cpu/h8500/h8520.cpp
index 9a3a076d5e4..459a979da98 100644
--- a/src/devices/cpu/h8500/h8520.cpp
+++ b/src/devices/cpu/h8500/h8520.cpp
@@ -10,9 +10,10 @@
#include "h8520.h"
DEFINE_DEVICE_TYPE(HD6435208, hd6435208_device, "hd6435208", "Hitachi HD6435208 (H8/520)")
+DEFINE_DEVICE_TYPE(HD6475208, hd6475208_device, "hd6475208", "Hitachi HD6475208 (H8/520)")
h8520_device::h8520_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
- : h8500_device(mconfig, type, tag, owner, clock, 20, 8, 9, address_map_constructor(FUNC(h8520_device::internal_map), this))
+ : h8500_device(mconfig, type, tag, owner, clock, 20, 8, 9, 4, address_map_constructor(FUNC(h8520_device::internal_map), this))
{
}
@@ -21,9 +22,15 @@ hd6435208_device::hd6435208_device(const machine_config &mconfig, const char *ta
{
}
+hd6475208_device::hd6475208_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : h8520_device(mconfig, HD6475208, tag, owner, clock)
+{
+}
+
void h8520_device::internal_map(address_map &map)
{
- map(0x0000, 0x3fff).rom().region(DEVICE_SELF, 0); // modes 2, 4, 7
+ if (mode_control() == 2 || mode_control() == 4 || mode_control() == 7)
+ map(0x0000, 0x3fff).rom().region(DEVICE_SELF, 0);
#if 0
map(0xff80, 0xff80).w(FUNC(h8520_device::p1ddr_w));
map(0xff81, 0xff81).w(FUNC(h8520_device::p2ddr_w));
diff --git a/src/devices/cpu/h8500/h8520.h b/src/devices/cpu/h8500/h8520.h
index fc8795e7425..7f66327c796 100644
--- a/src/devices/cpu/h8500/h8520.h
+++ b/src/devices/cpu/h8500/h8520.h
@@ -24,6 +24,14 @@ public:
hd6435208_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
+class hd6475208_device : public h8520_device
+{
+public:
+ // device type constructor
+ hd6475208_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
DECLARE_DEVICE_TYPE(HD6435208, hd6435208_device)
+DECLARE_DEVICE_TYPE(HD6475208, hd6475208_device)
#endif // MAME_CPU_H8500_H8520_H
diff --git a/src/devices/cpu/h8500/h8532.cpp b/src/devices/cpu/h8500/h8532.cpp
index 9d0be448e3f..20c9869c4ee 100644
--- a/src/devices/cpu/h8500/h8532.cpp
+++ b/src/devices/cpu/h8500/h8532.cpp
@@ -10,9 +10,10 @@
#include "h8532.h"
DEFINE_DEVICE_TYPE(HD6435328, hd6435328_device, "hd6435328", "Hitachi HD6435328 (H8/532)")
+DEFINE_DEVICE_TYPE(HD6475328, hd6475328_device, "hd6475328", "Hitachi HD6475328 (H8/532)")
h8532_device::h8532_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
- : h8500_device(mconfig, type, tag, owner, clock, 20, 8, 10, address_map_constructor(FUNC(h8532_device::internal_map), this))
+ : h8500_device(mconfig, type, tag, owner, clock, 20, 8, 10, 4, address_map_constructor(FUNC(h8532_device::internal_map), this))
{
}
@@ -21,9 +22,15 @@ hd6435328_device::hd6435328_device(const machine_config &mconfig, const char *ta
{
}
+hd6475328_device::hd6475328_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : h8532_device(mconfig, HD6475328, tag, owner, clock)
+{
+}
+
void h8532_device::internal_map(address_map &map)
{
- map(0x0000, 0x7fff).rom().region(DEVICE_SELF, 0); // modes 2, 4, 7
+ if (mode_control() == 2 || mode_control() == 4 || mode_control() == 7)
+ map(0x0000, 0x7fff).rom().region(DEVICE_SELF, 0);
#if 0
map(0xff80, 0xff80).w(FUNC(h8532_device::p1ddr_w));
map(0xff81, 0xff81).w(FUNC(h8532_device::p2ddr_w));
diff --git a/src/devices/cpu/h8500/h8532.h b/src/devices/cpu/h8500/h8532.h
index c9b08ee1d00..71ec652a465 100644
--- a/src/devices/cpu/h8500/h8532.h
+++ b/src/devices/cpu/h8500/h8532.h
@@ -24,6 +24,14 @@ public:
hd6435328_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
+class hd6475328_device : public h8532_device
+{
+public:
+ // device type constructor
+ hd6475328_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
DECLARE_DEVICE_TYPE(HD6435328, hd6435328_device)
+DECLARE_DEVICE_TYPE(HD6475328, hd6475328_device)
#endif // MAME_CPU_H8500_H8532_H
diff --git a/src/devices/cpu/h8500/h8534.cpp b/src/devices/cpu/h8500/h8534.cpp
index dd33af71128..06c9b0dc24f 100644
--- a/src/devices/cpu/h8500/h8534.cpp
+++ b/src/devices/cpu/h8500/h8534.cpp
@@ -9,11 +9,13 @@
#include "emu.h"
#include "h8534.h"
+DEFINE_DEVICE_TYPE(HD6435348, hd6435348_device, "hd6435348", "Hitachi HD6435348 (H8/534)")
DEFINE_DEVICE_TYPE(HD6475348, hd6475348_device, "hd6475348", "Hitachi HD6475348 (H8/534)")
DEFINE_DEVICE_TYPE(HD6435368, hd6435368_device, "hd6435368", "Hitachi HD6435368 (H8/536)")
+DEFINE_DEVICE_TYPE(HD6475368, hd6475368_device, "hd6475368", "Hitachi HD6475368 (H8/536)")
h8534_device::h8534_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor map)
- : h8500_device(mconfig, type, tag, owner, clock, 20, 8, 11, map)
+ : h8500_device(mconfig, type, tag, owner, clock, 20, 8, 11, 4, map)
{
}
@@ -22,6 +24,11 @@ h8534_device::h8534_device(const machine_config &mconfig, device_type type, cons
{
}
+hd6435348_device::hd6435348_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : h8534_device(mconfig, HD6435348, tag, owner, clock)
+{
+}
+
hd6475348_device::hd6475348_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: h8534_device(mconfig, HD6475348, tag, owner, clock)
{
@@ -37,16 +44,24 @@ hd6435368_device::hd6435368_device(const machine_config &mconfig, const char *ta
{
}
+hd6475368_device::hd6475368_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : h8536_device(mconfig, HD6475368, tag, owner, clock)
+{
+}
+
void h8534_device::internal_map(address_map &map)
{
- map(0x0000, 0x7fff).rom().region(DEVICE_SELF, 0); // modes 2, 4, 7
+ if (mode_control() == 2 || mode_control() == 4 || mode_control() == 7)
+ map(0x0000, 0x7fff).rom().region(DEVICE_SELF, 0);
register_field_map(map);
}
void h8536_device::internal_map(address_map &map)
{
- //map(0x0000, 0xee7f).rom().region(DEVICE_SELF, 0); // mode 2?
- //map(0x0000, 0xf67f).rom().region(DEVICE_SELF, 0); // modes 4, 7
+ if (mode_control() == 2)
+ map(0x0000, 0xee7f).rom().region(DEVICE_SELF, 0);
+ else if (mode_control() == 4 || mode_control() == 7)
+ map(0x0000, 0xf67f).rom().region(DEVICE_SELF, 0);
register_field_map(map);
}
diff --git a/src/devices/cpu/h8500/h8534.h b/src/devices/cpu/h8500/h8534.h
index 8e5c357ff1b..2fad7985a70 100644
--- a/src/devices/cpu/h8500/h8534.h
+++ b/src/devices/cpu/h8500/h8534.h
@@ -11,9 +11,8 @@
class h8534_device : public h8500_device
{
protected:
- // delegating constructor
+ // delegating constructors
h8534_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
-
h8534_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor map);
void register_field_map(address_map &map);
@@ -22,6 +21,13 @@ private:
void internal_map(address_map &map);
};
+class hd6435348_device : public h8534_device
+{
+public:
+ // device type constructor
+ hd6435348_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
class hd6475348_device : public h8534_device
{
public:
@@ -45,7 +51,16 @@ public:
hd6435368_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
+class hd6475368_device : public h8536_device
+{
+public:
+ // device type constructor
+ hd6475368_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+DECLARE_DEVICE_TYPE(HD6435348, hd6435348_device)
DECLARE_DEVICE_TYPE(HD6475348, hd6475348_device)
DECLARE_DEVICE_TYPE(HD6435368, hd6435368_device)
+DECLARE_DEVICE_TYPE(HD6475368, hd6475368_device)
#endif // MAME_CPU_H8500_H8534_H
diff --git a/src/devices/cpu/m68000/m68kfpu.cpp b/src/devices/cpu/m68000/m68kfpu.cpp
index ed439f2fe5f..7cd10e84b84 100644
--- a/src/devices/cpu/m68000/m68kfpu.cpp
+++ b/src/devices/cpu/m68000/m68kfpu.cpp
@@ -241,6 +241,53 @@ inline void m68000_base_device::store_pack_float80(u32 ea, int k, floatx80 fpr)
m68ki_write_32(ea+8, dw3);
}
+inline floatx80 propagateFloatx80NaNOneArg(floatx80 a)
+{
+ if (floatx80_is_signaling_nan(a))
+ float_raise(float_flag_invalid);
+
+ a.low |= 0xC000000000000000U;
+
+ return a;
+}
+
+static void normalizeFloatx80Subnormal(uint64_t aSig, int32_t *zExpPtr, uint64_t *zSigPtr)
+{
+ int shiftCount = countLeadingZeros64(aSig);
+ *zSigPtr = aSig << shiftCount;
+ *zExpPtr = 1 - shiftCount;
+}
+
+inline floatx80 getman(floatx80 src)
+{
+ const flag sign = (src.high >> 15);
+ int32_t exp = (src.high & 0x7fff);
+ uint64_t signific = src.low;
+
+ if (exp == 0x7fff)
+ {
+ if ((uint64_t)(signific << 1))
+ {
+ return propagateFloatx80NaNOneArg(src);
+ }
+ else
+ {
+ return packFloatx80(0, 0xffff, 0xffffffffffffffffU);
+ }
+ }
+
+ if (exp == 0)
+ {
+ if (signific == 0)
+ {
+ return packFloatx80(sign, 0, 0);
+ }
+ normalizeFloatx80Subnormal(signific, &exp, &signific);
+ }
+
+ return packFloatx80(sign, 0x3fff, signific);
+}
+
inline void m68000_base_device::SET_CONDITION_CODES(floatx80 reg)
{
// u64 *regi;
@@ -347,6 +394,10 @@ u8 m68000_base_device::READ_EA_8(int ea)
{
return REG_D()[reg];
}
+ case 1: // An
+ {
+ return REG_A()[reg];
+ }
case 2: // (An)
{
u32 ea = REG_A()[reg];
@@ -423,6 +474,10 @@ u16 m68000_base_device::READ_EA_16(int ea)
{
return (u16)(REG_D()[reg]);
}
+ case 1: // An
+ {
+ return (u16)REG_A()[reg];
+ }
case 2: // (An)
{
u32 ea = REG_A()[reg];
@@ -500,6 +555,10 @@ u32 m68000_base_device::READ_EA_32(int ea)
{
return REG_D()[reg];
}
+ case 1: // An
+ {
+ return REG_A()[reg];
+ }
case 2: // (An)
{
u32 ea = REG_A()[reg];
@@ -1106,6 +1165,13 @@ void m68000_base_device::WRITE_EA_FPE(int mode, int reg, floatx80 fpr, uint32 di
break;
}
+ case 6: // (An) + (Xn) + d8
+ {
+ u32 ea = EA_AY_IX_32();
+ store_extended_float80(ea, fpr);
+ break;
+ }
+
case 7:
{
switch (reg)
@@ -1163,11 +1229,11 @@ void m68000_base_device::WRITE_EA_PACK(int ea, int k, floatx80 fpr)
void m68000_base_device::fpgen_rm_reg(u16 w2)
{
- int ea = m_ir & 0x3f;
- int rm = (w2 >> 14) & 0x1;
- int src = (w2 >> 10) & 0x7;
- int dst = (w2 >> 7) & 0x7;
- int opmode = w2 & 0x7f;
+ const int ea = m_ir & 0x3f;
+ const int rm = (w2 >> 14) & 0x1;
+ const int src = (w2 >> 10) & 0x7;
+ const int dst = (w2 >> 7) & 0x7;
+ const int opmode = w2 & 0x7f;
floatx80 source;
// fmovecr #$f, fp0 f200 5c0f
@@ -1383,7 +1449,7 @@ void m68000_base_device::fpgen_rm_reg(u16 w2)
}
case 0x06: // FLOGNP1
{
- m_fpr[dst] = floatx80_flognp1 (source);
+ m_fpr[dst] = floatx80_flognp1(source);
SET_CONDITION_CODES(m_fpr[dst]);
m_icount -= 594; // for MC68881
break;
@@ -1460,6 +1526,13 @@ void m68000_base_device::fpgen_rm_reg(u16 w2)
m_icount -= 6;
break;
}
+ case 0x1f: // FGETMAN
+ {
+ m_fpr[dst] = getman(source);
+ SET_CONDITION_CODES(m_fpr[dst]);
+ m_icount -= 31;
+ break;
+ }
case 0x60: // FSDIVS
case 0x20: // FDIV
{
@@ -1534,6 +1607,24 @@ void m68000_base_device::fpgen_rm_reg(u16 w2)
m_icount -= 9;
break;
}
+ case 0x30: // FSINCOS
+ case 0x31:
+ case 0x32:
+ case 0x33:
+ case 0x34:
+ case 0x35:
+ case 0x36:
+ case 0x37:
+ {
+ m_fpr[dst] = source;
+ floatx80_fsin(m_fpr[dst]);
+ SET_CONDITION_CODES(m_fpr[dst]); // condition codes are set for the sine result
+
+ m_fpr[(w2 & 0x7)] = source;
+ floatx80_fcos(m_fpr[(w2 & 0x7)]);
+ m_icount -= 451;
+ break;
+ }
case 0x38: // FCMP
{
floatx80 res;
@@ -1743,17 +1834,6 @@ void m68000_base_device::fmovem(u16 w2)
int mode = (w2 >> 11) & 0x3;
int reglist = w2 & 0xff;
- u32 mem_addr = 0;
- switch (ea >> 3)
- {
- case 5: // (d16, An)
- mem_addr= EA_AY_DI_32();
- break;
- case 6: // (An) + (Xn) + d8
- mem_addr= EA_AY_IX_32();
- break;
- }
-
if (dir) // From FP regs to mem
{
switch (mode)
@@ -1797,8 +1877,7 @@ void m68000_base_device::fmovem(u16 w2)
{
int imode = (ea >> 3) & 0x7;
int reg = (ea & 0x7);
- int di_mode = imode == 5;
-
+ int di_mode = (imode == 5);
uint32 di_mode_ea = di_mode ? (REG_A()[reg] + MAKE_INT_16(m68ki_read_imm_16())) : 0;
for (i=0; i < 8; i++)
@@ -1832,23 +1911,17 @@ void m68000_base_device::fmovem(u16 w2)
{
int imode = (ea >> 3) & 0x7;
int reg = (ea & 0x7);
- int di_mode = imode == 5;
+ int di_mode = (imode == 5);
uint32 di_mode_ea = di_mode ? (REG_A()[reg] + MAKE_INT_16(m68ki_read_imm_16())) : 0;
for (i=0; i < 8; i++)
{
if (reglist & (1 << i))
{
- switch (ea >> 3)
+ m_fpr[7 - i] = READ_EA_FPE(imode, reg, di_mode_ea);
+ if (di_mode)
{
- case 5: // (d16, An)
- case 6: // (An) + (Xn) + d8
- m_fpr[7-i] = load_extended_float80(mem_addr);
- mem_addr += 12;
- break;
- default:
- m_fpr[7 - i] = READ_EA_FPE(imode, reg, di_mode_ea);
- break;
+ di_mode_ea += 12;
}
m_icount -= 2;
}
diff --git a/src/devices/cpu/m88000/m88000.cpp b/src/devices/cpu/m88000/m88000.cpp
index 130888d8cc3..b45a74b830e 100644
--- a/src/devices/cpu/m88000/m88000.cpp
+++ b/src/devices/cpu/m88000/m88000.cpp
@@ -996,14 +996,14 @@ void mc88100_device::execute(u32 const inst)
break;
case 0x740: // ff1: find first bit set
{
- unsigned const count = count_leading_zeros(m_r[S2]);
+ unsigned const count = count_leading_zeros_32(m_r[S2]);
m_r[D] = (count == 32) ? count : 31 - count;
}
break;
case 0x760: // ff0: find first bit clear
{
- unsigned const count = count_leading_ones(m_r[S2]);
+ unsigned const count = count_leading_ones_32(m_r[S2]);
m_r[D] = (count == 32) ? count : 31 - count;
}
diff --git a/src/devices/cpu/mips/r4000.cpp b/src/devices/cpu/mips/r4000.cpp
index eb2cff471d2..2b12a2089f5 100644
--- a/src/devices/cpu/mips/r4000.cpp
+++ b/src/devices/cpu/mips/r4000.cpp
@@ -1175,7 +1175,7 @@ void r4000_base_device::cpu_exception(u32 exception, u16 const vector)
u32 const iphw = CAUSE & SR & CAUSE_IPHW;
if (iphw)
- debug()->interrupt_hook(22 - count_leading_zeros((iphw - 1) & ~iphw));
+ debug()->interrupt_hook(22 - count_leading_zeros_32((iphw - 1) & ~iphw));
}
}
else
@@ -1530,7 +1530,7 @@ void r4000_base_device::cp0_tlbwi(u8 const index)
entry.pfn[0] = m_cp0[CP0_EntryLo0] & EL_WM;
entry.pfn[1] = m_cp0[CP0_EntryLo1] & EL_WM;
- entry.low_bit = 32 - count_leading_zeros((entry.mask >> 1) | 0xfff);
+ entry.low_bit = 32 - count_leading_zeros_32((entry.mask >> 1) | 0xfff);
LOGMASKED(LOG_TLB, "tlb write index %02d mask 0x%016x vpn2 0x%016x %c asid 0x%02x pfn0 0x%016x %c%c pfn1 0x%016x %c%c (%s)\n",
index, entry.mask,
diff --git a/src/devices/cpu/pdp8/hd6120.cpp b/src/devices/cpu/pdp8/hd6120.cpp
index ec72498d272..947225ae603 100644
--- a/src/devices/cpu/pdp8/hd6120.cpp
+++ b/src/devices/cpu/pdp8/hd6120.cpp
@@ -86,20 +86,34 @@
Register”), PC and the two stack pointers, include several which are
only implicitly used in execution: a TEMP register that latches ALU
outputs, the instruction register IR, and the output latch register OL
- that holds all addresses and data to be output on the DX bus. HD-6120
- also internally maintains a group of 3-bit registers whose path
- connects to TEMP, each of which contains the current memory extension
- fields, their mirrors or various flags. (This emulation extends the
- field registers to 4 bits to include the CTRLFF, PDF and PEX flags,
- which are neither readable nor output directly at any time.)
- Particular flag registers are enabled on the C0, C1 and EMA2 lines
- during the final writes of ISZ, DCA and JMS. The most important of
- these flag registers includes LINK, the interrupt enable flip-flop and
- the GT flag hitherto provided only on arithmetic extensions of some
- previous PDP-8 CPUs, though like MQ it conveys no specific purpose
- here. Another flag register contains the inverse of the active-low
- INTREQ input, the PWRON flag (set if STRTUP = VSS at RESET time,
- causing entry into panel mode) and 0 in its LSB.
+ that holds all addresses and data to be output on the DX bus.
+
+ HD-6120 also maintains a group of 3-bit internal registers whose data
+ path connects to TEMP. These are used to hold the current memory
+ extension fields, their mirrors and various flags. (This emulation
+ extends the field registers to 4 bits to include the CTRLFF, PDF and
+ PEX flags, which are neither readable nor output directly at any
+ time.) These 3-bit registers may be enabled on the C0, C1 and EMA2
+ lines at particular times, and the GTF, GCF, PRS, RDF, RIF and RIB
+ internal IOTs read various combinations of them into AC. They include:
+
+ MSB LSB Output conditions
+ -----------------------------------------
+ IF0 IF1 IF2 IFETCH, direct operands (except if FZ)
+ IB0 IB1 IB2 None (until transferred to IF)
+ ISF0 ISF1 ISF2 None
+ DF0 DF1 DF2 Indirect operand addressing, IOTs, etc.
+ DSF0 DSF1 DSF2 None
+ LINK GT IEFF DCA AC writes
+ INTREQ* PWRON 0 ISZ result writes
+ BTSTRAP PNLTRP HLTFLG JMS PC writes
+
+ The GT flag, like MQ, is not used for any specific purpose on the
+ HD-6120, unlike the arithmetic extensions of previous PDP-8 CPUs which
+ originally implemented them. The INTREQ flag is 1 when the input pin
+ is sampled active low and 0 when it is inactive. The PWRON flag is set
+ if STRTUP is sampled as VSS at RESET time; it causes the CPU to trap
+ into panel mode before executing its first instruction.
Undefined Group 3 OPRs and internal IOTs have no effect on the
HD-6120 except that both interrupts and panel requests are blocked
@@ -1001,6 +1015,7 @@ void hd6120_device::execute_run()
break;
case minor_state::PEX_1:
+ m_temp = m_ac;
m_state = minor_state::PEX_2;
break;
diff --git a/src/devices/cpu/psx/gte.cpp b/src/devices/cpu/psx/gte.cpp
index d48b206e84f..6305b4d7412 100644
--- a/src/devices/cpu/psx/gte.cpp
+++ b/src/devices/cpu/psx/gte.cpp
@@ -215,7 +215,7 @@ void gte::setcp2dr( uint32_t pc, int reg, uint32_t value )
break;
case 30:
- LZCR = (value & 0x80000000) == 0 ? count_leading_zeros(value) : count_leading_ones(value);
+ LZCR = (value & 0x80000000) == 0 ? count_leading_zeros_32(value) : count_leading_ones_32(value);
break;
case 31:
@@ -314,7 +314,7 @@ static inline uint32_t gte_divide( uint16_t numerator, uint16_t denominator )
0x00
};
- int shift = count_leading_zeros( denominator ) - 16;
+ int shift = count_leading_zeros_32( denominator ) - 16;
int r1 = ( denominator << shift ) & 0x7fff;
int r2 = table[ ( ( r1 + 0x40 ) >> 7 ) ] + 0x101;
diff --git a/src/devices/cpu/romp/romp.cpp b/src/devices/cpu/romp/romp.cpp
index d68988cb876..94e3da8591c 100644
--- a/src/devices/cpu/romp/romp.cpp
+++ b/src/devices/cpu/romp/romp.cpp
@@ -887,7 +887,7 @@ void romp_device::execute_run()
flags_log(m_gpr[R2]);
break;
case 0xf5: // clz: count leading zeros
- m_gpr[R2] = count_leading_zeros(u16(m_gpr[R3])) - 16;
+ m_gpr[R2] = count_leading_zeros_32(u16(m_gpr[R3])) - 16;
break;
case 0xf9: // mc03: move character zero from three
diff --git a/src/devices/cpu/sharc/sharc.cpp b/src/devices/cpu/sharc/sharc.cpp
index ded941af415..134611079a8 100644
--- a/src/devices/cpu/sharc/sharc.cpp
+++ b/src/devices/cpu/sharc/sharc.cpp
@@ -343,7 +343,10 @@ void adsp21062_device::iop_w(offs_t offset, uint32_t data)
case 0x1c:
{
m_core->dma[6].control = data;
- sharc_iop_delayed_w(0x1c, data, 1);
+ if (data & 0x1)
+ {
+ sharc_iop_delayed_w(0x1c, data, 1);
+ }
break;
}
@@ -360,9 +363,12 @@ void adsp21062_device::iop_w(offs_t offset, uint32_t data)
// DMA 7
case 0x1d:
- {
+ {
m_core->dma[7].control = data;
- sharc_iop_delayed_w(0x1d, data, 30);
+ if (data & 0x1)
+ {
+ sharc_iop_delayed_w(0x1d, data, 30);
+ }
break;
}
@@ -442,7 +448,7 @@ void adsp21062_device::external_dma_write(uint32_t address, uint64_t data)
All addresses in the 17-bit index registers are offset by 0x0002 0000, the
first internal RAM location, before they are used by the DMA controller.
*/
-
+
switch ((m_core->dma[6].control >> 6) & 0x3)
{
case 2: // 16/48 packing
@@ -972,6 +978,19 @@ void adsp21062_device::set_flag_input(int flag_num, int state)
}
}
+WRITE_LINE_MEMBER(adsp21062_device::write_stall)
+{
+ m_core->write_stalled = (state == 0) ? false : true;
+
+ if (m_enable_drc)
+ {
+ if (m_core->write_stalled)
+ spin_until_trigger(45757);
+ else
+ machine().scheduler().trigger(45757);
+ }
+}
+
void adsp21062_device::check_interrupts()
{
int i;
@@ -1028,8 +1047,24 @@ void adsp21062_device::execute_run()
}
else
{
+ if (m_core->write_stalled)
+ eat_cycles(m_core->icount);
+
if (m_core->idle && m_core->irq_pending == 0)
{
+ int dma_count = m_core->icount;
+
+ // run active DMAs even while idling
+ while (dma_count > 0 && m_core->dma_status & ((1 << 6) | (1 << 7)))
+ {
+ if (!m_core->write_stalled)
+ {
+ dma_run_cycle(6);
+ dma_run_cycle(7);
+ }
+ dma_count--;
+ }
+
m_core->icount = 0;
debugger_instruction_hook(m_core->daddr);
}
@@ -1037,9 +1072,9 @@ void adsp21062_device::execute_run()
{
check_interrupts();
m_core->idle = 0;
- }
+ }
- while (m_core->icount > 0 && !m_core->idle)
+ while (m_core->icount > 0 && !m_core->idle && !m_core->write_stalled)
{
m_core->pc = m_core->daddr;
m_core->daddr = m_core->faddr;
@@ -1126,6 +1161,12 @@ void adsp21062_device::execute_run()
}
}
+ if (!m_core->write_stalled)
+ {
+ dma_run_cycle(6);
+ dma_run_cycle(7);
+ }
+
--m_core->icount;
};
}
diff --git a/src/devices/cpu/sharc/sharc.h b/src/devices/cpu/sharc/sharc.h
index 6c9292c5193..f7d2d8701cd 100644
--- a/src/devices/cpu/sharc/sharc.h
+++ b/src/devices/cpu/sharc/sharc.h
@@ -103,6 +103,8 @@ public:
TIMER_CALLBACK_MEMBER(sharc_iop_delayed_write_callback);
TIMER_CALLBACK_MEMBER(sharc_dma_callback);
+ WRITE_LINE_MEMBER(write_stall);
+
void sharc_cfunc_unimplemented();
void sharc_cfunc_read_iop();
void sharc_cfunc_write_iop();
@@ -270,6 +272,7 @@ private:
int32_t chained_direction;
emu_timer *timer;
bool active;
+ bool chained;
};
@@ -379,6 +382,7 @@ private:
SHARC_DMA_OP dma_op[12];
uint32_t dma_status;
+ bool write_stalled;
int32_t interrupt_active;
@@ -475,6 +479,7 @@ private:
void schedule_dma_op(int channel, uint32_t src, uint32_t dst, int src_modifier, int dst_modifier, int src_count, int dst_count, int pmode);
void dma_op(int channel);
void sharc_dma_exec(int channel);
+ void dma_run_cycle(int channel);
void add_systemreg_write_latency_effect(int sysreg, uint32_t data, uint32_t prev_data);
inline void swap_register(uint32_t *a, uint32_t *b);
void systemreg_write_latency_effect();
diff --git a/src/devices/cpu/sharc/sharcdma.hxx b/src/devices/cpu/sharc/sharcdma.hxx
index fdbf7a0f635..e0df2cb5e54 100644
--- a/src/devices/cpu/sharc/sharcdma.hxx
+++ b/src/devices/cpu/sharc/sharcdma.hxx
@@ -10,7 +10,7 @@
void adsp21062_device::schedule_chained_dma_op(int channel, uint32_t dma_chain_ptr, int chained_direction)
{
- uint32_t op_ptr = 0x20000 + dma_chain_ptr;
+ uint32_t op_ptr = 0x20000 + (dma_chain_ptr & 0x1ffff);
uint32_t int_index = dm_read32(op_ptr - 0);
uint32_t int_modifier = dm_read32(op_ptr - 1);
@@ -49,10 +49,14 @@ void adsp21062_device::schedule_chained_dma_op(int channel, uint32_t dma_chain_p
m_core->dma_op[channel].chain_ptr = chain_ptr;
m_core->dma_op[channel].chained_direction = chained_direction;
+ m_core->dma_op[channel].chained = true;
m_core->dma_op[channel].active = true;
- int cycles = m_core->dma_op[channel].src_count / 4;
- m_core->dma_op[channel].timer->adjust(cycles_to_attotime(cycles), channel);
+ if (m_enable_drc)
+ {
+ int cycles = m_core->dma_op[channel].src_count / 4;
+ m_core->dma_op[channel].timer->adjust(cycles_to_attotime(cycles), channel);
+ }
// enable busy flag
m_core->dma_status |= (1 << channel);
@@ -74,15 +78,107 @@ void adsp21062_device::schedule_dma_op(int channel, uint32_t src, uint32_t dst,
m_core->dma_op[channel].pmode = pmode;
m_core->dma_op[channel].chain_ptr = 0;
+ m_core->dma_op[channel].chained = false;
m_core->dma_op[channel].active = true;
- int cycles = src_count / 4;
- m_core->dma_op[channel].timer->adjust(cycles_to_attotime(cycles), channel);
+ if (m_enable_drc)
+ {
+ int cycles = src_count / 4;
+ m_core->dma_op[channel].timer->adjust(cycles_to_attotime(cycles), channel);
+ }
// enable busy flag
m_core->dma_status |= (1 << channel);
}
+void adsp21062_device::dma_run_cycle(int channel)
+{
+ if (m_core->dma_status & (1 << channel))
+ {
+ uint32_t src = m_core->dma_op[channel].src;
+ uint32_t dst = m_core->dma_op[channel].dst;
+ int src_modifier = m_core->dma_op[channel].src_modifier;
+ int dst_modifier = m_core->dma_op[channel].dst_modifier;
+ int src_count = m_core->dma_op[channel].src_count;
+ //int dst_count = m_core->dma_op[channel].dst_count;
+ int pmode = m_core->dma_op[channel].pmode;
+
+ switch (pmode)
+ {
+ case DMA_PMODE_NO_PACKING:
+ {
+ uint32_t data = dm_read32(src);
+ dm_write32(dst, data);
+ src += src_modifier;
+ dst += dst_modifier;
+ src_count--;
+ break;
+ }
+ case DMA_PMODE_16_32:
+ {
+ uint32_t data = ((dm_read32(src + 0) & 0xffff) << 16) | (dm_read32(src + 1) & 0xffff);
+
+ dm_write32(dst, data);
+ src += src_modifier * 2;
+ dst += dst_modifier;
+ src_count -= 2;
+ break;
+ }
+ case DMA_PMODE_8_48:
+ {
+ uint64_t data = ((uint64_t)(dm_read32(src + 0) & 0xff) << 0) |
+ ((uint64_t)(dm_read32(src + 1) & 0xff) << 8) |
+ ((uint64_t)(dm_read32(src + 2) & 0xff) << 16) |
+ ((uint64_t)(dm_read32(src + 3) & 0xff) << 24) |
+ ((uint64_t)(dm_read32(src + 4) & 0xff) << 32) |
+ ((uint64_t)(dm_read32(src + 5) & 0xff) << 40);
+
+ pm_write48(dst, data);
+ src += src_modifier * 6;
+ dst += dst_modifier;
+ src_count -= 6;
+ break;
+ }
+ default:
+ {
+ fatalerror("SHARC: dma_op: unimplemented packing mode %d\n", pmode);
+ }
+ }
+
+ m_core->dma_op[channel].src_count = src_count;
+ m_core->dma_op[channel].src = src;
+ m_core->dma_op[channel].dst = dst;
+
+ if (src_count <= 0)
+ {
+ // clear busy flag
+ m_core->dma_status &= ~(1 << channel);
+
+ m_core->dma_op[channel].active = false;
+
+ // raise interrupt if
+ // * non-chained DMA
+ // * chained-DMA with PCI set in the next chain pointer
+ if (!m_core->dma_op[channel].chained || (m_core->dma_op[channel].chained && (m_core->dma_op[channel].chain_ptr & 0x20000)))
+ {
+ m_core->irptl |= (1 << (channel + 10));
+
+ // DMA interrupt
+ if (m_core->imask & (1 << (channel + 10)))
+ {
+ m_core->irq_pending |= 1 << (channel + 10);
+ }
+ }
+
+ // schedule chained op if chaining
+ if ((m_core->dma_op[channel].chain_ptr & 0x1ffff) != 0)
+ {
+ schedule_chained_dma_op(channel, m_core->dma_op[channel].chain_ptr, m_core->dma_op[channel].chained_direction);
+ }
+ }
+ }
+}
+
void adsp21062_device::dma_op(int channel)
{
int i;
@@ -94,7 +190,7 @@ void adsp21062_device::dma_op(int channel)
//int dst_count = m_core->dma_op[channel].dst_count;
int pmode = m_core->dma_op[channel].pmode;
- //printf("dma_op: %08X, %08X, %08X, %08X, %08X, %d\n", src, dst, src_modifier, dst_modifier, src_count, pmode);
+ //printf("dma_op: ch %d: %08X, %08X, %08X, %08X, %08X, %d at %08X\n", channel, src, dst, src_modifier, dst_modifier, src_count, pmode, m_core->pc);
switch (pmode)
{
@@ -191,36 +287,36 @@ void adsp21062_device::sharc_dma_exec(int channel)
{
uint32_t dma_chain_ptr = m_core->dma[channel].chain_ptr & 0x1ffff;
- schedule_chained_dma_op(channel, dma_chain_ptr, tran);
+ schedule_chained_dma_op(channel, dma_chain_ptr, tran);
}
else
{
if (tran) // Transmit to external
{
- dst = m_core->dma[channel].ext_index;
- dst_modifier = m_core->dma[channel].ext_modifier;
- dst_count = m_core->dma[channel].ext_count;
- src = (m_core->dma[channel].int_index & 0x1ffff) | 0x20000;
- src_modifier = m_core->dma[channel].int_modifier;
- src_count = m_core->dma[channel].int_count;
+ dst = m_core->dma[channel].ext_index;
+ dst_modifier = m_core->dma[channel].ext_modifier;
+ dst_count = m_core->dma[channel].ext_count;
+ src = (m_core->dma[channel].int_index & 0x1ffff) | 0x20000;
+ src_modifier = m_core->dma[channel].int_modifier;
+ src_count = m_core->dma[channel].int_count;
}
else // Receive from external
{
- src = m_core->dma[channel].ext_index;
- src_modifier = m_core->dma[channel].ext_modifier;
- src_count = m_core->dma[channel].ext_count;
- dst = (m_core->dma[channel].int_index & 0x1ffff) | 0x20000;
- dst_modifier = m_core->dma[channel].int_modifier;
- dst_count = m_core->dma[channel].int_count;
+ src = m_core->dma[channel].ext_index;
+ src_modifier = m_core->dma[channel].ext_modifier;
+ src_count = m_core->dma[channel].ext_count;
+ dst = (m_core->dma[channel].int_index & 0x1ffff) | 0x20000;
+ dst_modifier = m_core->dma[channel].int_modifier;
+ dst_count = m_core->dma[channel].int_count;
}
if (dtype)
- //if (src_count != dst_count)
+ //if (src_count != dst_count)
{
pmode = DMA_PMODE_8_48;
}
- schedule_dma_op(channel, src, dst, src_modifier, dst_modifier, src_count, dst_count, pmode);
+ schedule_dma_op(channel, src, dst, src_modifier, dst_modifier, src_count, dst_count, pmode);
}
}
@@ -239,7 +335,7 @@ TIMER_CALLBACK_MEMBER(adsp21062_device::sharc_dma_callback)
}
dma_op(channel);
- if (m_core->dma_op[channel].chain_ptr != 0)
+ if ((m_core->dma_op[channel].chain_ptr & 0x1ffff) != 0)
{
schedule_chained_dma_op(channel, m_core->dma_op[channel].chain_ptr, m_core->dma_op[channel].chained_direction);
}
diff --git a/src/devices/cpu/tms32031/32031ops.hxx b/src/devices/cpu/tms32031/32031ops.hxx
index da59340b7d9..06533f09abb 100644
--- a/src/devices/cpu/tms32031/32031ops.hxx
+++ b/src/devices/cpu/tms32031/32031ops.hxx
@@ -393,7 +393,7 @@ void tms3203x_device::int2float(tmsreg &srcdst)
// positive values; count leading zeros and shift
else if ((int32_t)man > 0)
{
- cnt = count_leading_zeros(man);
+ cnt = count_leading_zeros_32(man);
man <<= cnt;
exp = 31 - cnt;
}
@@ -401,7 +401,7 @@ void tms3203x_device::int2float(tmsreg &srcdst)
// negative values; count leading ones and shift
else
{
- cnt = count_leading_ones(man);
+ cnt = count_leading_ones_32(man);
man <<= cnt;
exp = 31 - cnt;
}
@@ -585,13 +585,13 @@ void tms3203x_device::addf(tmsreg &dst, tmsreg &src1, tmsreg &src2)
{
if (man > 0)
{
- cnt = count_leading_zeros((uint32_t)man);
+ cnt = count_leading_zeros_32((uint32_t)man);
man <<= cnt;
exp -= cnt;
}
else
{
- cnt = count_leading_ones((uint32_t)man);
+ cnt = count_leading_ones_32((uint32_t)man);
man <<= cnt;
exp -= cnt;
}
@@ -698,13 +698,13 @@ void tms3203x_device::subf(tmsreg &dst, tmsreg &src1, tmsreg &src2)
{
if (man > 0)
{
- cnt = count_leading_zeros((uint32_t)man);
+ cnt = count_leading_zeros_32((uint32_t)man);
man <<= cnt;
exp -= cnt;
}
else
{
- cnt = count_leading_ones((uint32_t)man);
+ cnt = count_leading_ones_32((uint32_t)man);
man <<= cnt;
exp -= cnt;
}
@@ -847,13 +847,13 @@ void tms3203x_device::norm(tmsreg &dst, tmsreg &src)
int cnt;
if (man > 0)
{
- cnt = count_leading_zeros((uint32_t)man);
+ cnt = count_leading_zeros_32((uint32_t)man);
man <<= cnt;
exp -= cnt;
}
else
{
- cnt = count_leading_ones((uint32_t)man);
+ cnt = count_leading_ones_32((uint32_t)man);
man <<= cnt;
exp -= cnt;
}
diff --git a/src/devices/cpu/tms34010/34010ops.hxx b/src/devices/cpu/tms34010/34010ops.hxx
index 1c71439107e..aa398e3c776 100644
--- a/src/devices/cpu/tms34010/34010ops.hxx
+++ b/src/devices/cpu/tms34010/34010ops.hxx
@@ -2458,16 +2458,16 @@ void tms340x0_device::setcdp(uint16_t op)
// .. only single bit set, pitch is power of two!
case 1:
{
- m_convdp = 32 - count_leading_zeros(dptch);
+ m_convdp = 32 - count_leading_zeros_32(dptch);
COUNT_CYCLES(4);
return;
}
// .. two bits, we can decompose it to sum of two power of two numbers
case 2:
{
- uint8_t first_one = count_leading_zeros(dptch);
+ uint8_t first_one = count_leading_zeros_32(dptch);
uint8_t v1 = 32 - first_one;
- uint8_t v2 = 32 - count_leading_zeros(dptch & ~(1 << (first_one - 1)));
+ uint8_t v2 = 32 - count_leading_zeros_32(dptch & ~(1 << (first_one - 1)));
m_convdp = v2 | (v1 << 8);
COUNT_CYCLES(6);
diff --git a/src/devices/cpu/uml.cpp b/src/devices/cpu/uml.cpp
index 8b0c7023f58..6a81d63400e 100644
--- a/src/devices/cpu/uml.cpp
+++ b/src/devices/cpu/uml.cpp
@@ -631,14 +631,9 @@ void uml::instruction::simplify()
if (m_param[1].is_immediate())
{
if (m_size == 4)
- convert_to_mov_immediate(count_leading_zeros(m_param[1].immediate()));
+ convert_to_mov_immediate(count_leading_zeros_32(m_param[1].immediate()));
else if (m_size == 8)
- {
- if ((m_param[1].immediate() >> 32) == 0)
- convert_to_mov_immediate(32 + count_leading_zeros(m_param[1].immediate()));
- else
- convert_to_mov_immediate(count_leading_zeros(m_param[1].immediate() >> 32));
- }
+ convert_to_mov_immediate(count_leading_zeros_64(m_param[1].immediate()));
}
break;
diff --git a/src/devices/cpu/unsp/unsp_fxxx.cpp b/src/devices/cpu/unsp/unsp_fxxx.cpp
index 4c1f41245ad..13b7bd27995 100644
--- a/src/devices/cpu/unsp/unsp_fxxx.cpp
+++ b/src/devices/cpu/unsp/unsp_fxxx.cpp
@@ -396,11 +396,11 @@ void unsp_12_device::execute_fxxx_101_group(uint16_t op)
if (r4 & 0x8000)
{
- m_core->m_r[REG_R2] = count_leading_ones(0xffff0000 | r4) - 17;
+ m_core->m_r[REG_R2] = count_leading_ones_32(0xffff0000 | r4) - 17;
}
else
{
- m_core->m_r[REG_R2] = count_leading_zeros(r4) - 17; // -17 because count_leading_zeros works with 32-bit values
+ m_core->m_r[REG_R2] = count_leading_zeros_32(r4) - 17; // -17 because count_leading_zeros_32 works with 32-bit values
}
return;
diff --git a/src/devices/cpu/z80/kp69.cpp b/src/devices/cpu/z80/kp69.cpp
index 84be060c4c7..0e194138b2c 100644
--- a/src/devices/cpu/z80/kp69.cpp
+++ b/src/devices/cpu/z80/kp69.cpp
@@ -409,14 +409,14 @@ int kp69_base_device::z80daisy_irq_ack()
// Restrict to high-priority interrupts if any of those are pending
if ((m_irr & m_pgr) != 0)
{
- level = 31 - count_leading_zeros(u32(m_irr & m_pgr));
+ level = 31 - count_leading_zeros_32(u32(m_irr & m_pgr));
assert(level >= 0 && level < 16);
if ((1 << level) < (m_isr & m_pgr))
level = -1;
}
else if (m_irr != 0 && (m_isr & m_pgr) == 0)
{
- level = 31 - count_leading_zeros(u32(m_irr));
+ level = 31 - count_leading_zeros_32(u32(m_irr));
assert(level >= 0 && level < 16);
if ((1 << level) < m_isr)
level = -1;
@@ -461,7 +461,7 @@ void kp69_base_device::z80daisy_irq_reti()
}
else if (m_isr != 0)
{
- int level = 31 - count_leading_zeros(u32((m_isr & m_pgr) != 0 ? (m_isr & m_pgr) : m_isr));
+ int level = 31 - count_leading_zeros_32(u32((m_isr & m_pgr) != 0 ? (m_isr & m_pgr) : m_isr));
assert(level >= 0 && level < 16);
m_isr &= ~(1 << level);
diff --git a/src/devices/machine/atmel_arm_aic.cpp b/src/devices/machine/atmel_arm_aic.cpp
index 258bb3ae438..5e80a471477 100644
--- a/src/devices/machine/atmel_arm_aic.cpp
+++ b/src/devices/machine/atmel_arm_aic.cpp
@@ -53,7 +53,7 @@ uint32_t arm_aic_device::irq_vector_r()
int midx = -1;
do
{
- uint8_t idx = 31 - count_leading_zeros(mask);
+ uint8_t idx = 31 - count_leading_zeros_32(mask);
if ((int)(m_aic_smr[idx] & 7) >= pri)
{
midx = idx;
@@ -146,7 +146,7 @@ void arm_aic_device::check_irqs()
int pri = get_level();
do
{
- uint8_t idx = 31 - count_leading_zeros(mask);
+ uint8_t idx = 31 - count_leading_zeros_32(mask);
if ((int)(m_aic_smr[idx] & 7) > pri)
{
m_core_status |= 2;
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index 7c43c35838d..cc1f92c5755 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.cpp
@@ -828,7 +828,8 @@ void netlist_mame_stream_output_device::sound_update_fill(write_stream_view &tar
int sampindex;
for (sampindex = 0; sampindex < m_buffer.size(); sampindex++)
target.put(sampindex, m_buffer[sampindex]);
- target.fill(m_cur, sampindex);
+ if (sampindex < target.samples())
+ target.fill(m_cur, sampindex);
}
diff --git a/src/devices/machine/ns32202.cpp b/src/devices/machine/ns32202.cpp
index 1a84ad180e9..4eb6f67f487 100644
--- a/src/devices/machine/ns32202.cpp
+++ b/src/devices/machine/ns32202.cpp
@@ -275,7 +275,7 @@ void ns32202_device::interrupt(void *ptr, s32 param)
// check equal priority unmasked pending cascade interrupt
if ((m_csrc & mask) && (m_ipnd & mask) && !(m_imsk & mask))
{
- LOGMASKED(LOG_STATE, "unmasked pending cascade in-service interrupt %d\n", 31 - count_leading_zeros(mask));
+ LOGMASKED(LOG_STATE, "unmasked pending cascade in-service interrupt %d\n", 31 - count_leading_zeros_32(mask));
accept = true;
}
@@ -285,7 +285,7 @@ void ns32202_device::interrupt(void *ptr, s32 param)
// check unmasked pending interrupt
if ((m_ipnd & mask) && !(m_imsk & mask))
{
- LOGMASKED(LOG_STATE, "unmasked pending interrupt %d\n", 31 - count_leading_zeros(mask));
+ LOGMASKED(LOG_STATE, "unmasked pending interrupt %d\n", 31 - count_leading_zeros_32(mask));
accept = true;
break;
}
@@ -324,7 +324,7 @@ u8 ns32202_device::interrupt_acknowledge(bool side_effects)
mask = (mask << 1) | (mask >> 15);
}
- unsigned const number = 31 - count_leading_zeros(mask);
+ unsigned const number = 31 - count_leading_zeros_32(mask);
if (side_effects)
{
LOGMASKED(LOG_STATE, "acknowledge highest priority unmasked interrupt %d\n", number);
@@ -400,7 +400,7 @@ u8 ns32202_device::interrupt_return(bool side_effects)
// rotate priority mask
mask = (mask << 1) | (mask >> 15);
}
- unsigned const number = 31 - count_leading_zeros(mask);
+ unsigned const number = 31 - count_leading_zeros_32(mask);
if (side_effects)
{
diff --git a/src/devices/machine/sensorboard.cpp b/src/devices/machine/sensorboard.cpp
index 8970726cf50..3d4188396dd 100644
--- a/src/devices/machine/sensorboard.cpp
+++ b/src/devices/machine/sensorboard.cpp
@@ -497,7 +497,7 @@ INPUT_CHANGED_MEMBER(sensorboard_device::sensor)
INPUT_CHANGED_MEMBER(sensorboard_device::ui_spawn)
{
- u8 pos = (newval) ? (u8)param : 32 - count_leading_zeros(m_inp_spawn->read());
+ u8 pos = (newval) ? (u8)param : 32 - count_leading_zeros_32(m_inp_spawn->read());
if (pos == 0 || pos > m_maxspawn)
return;
diff --git a/src/devices/machine/smartmed.cpp b/src/devices/machine/smartmed.cpp
index 0d0643c1965..0a7c8911571 100644
--- a/src/devices/machine/smartmed.cpp
+++ b/src/devices/machine/smartmed.cpp
@@ -124,9 +124,8 @@ void nand_device::device_start()
image_init_result smartmedia_image_device::smartmedia_format_1()
{
SM_disk_image_header custom_header;
- int bytes_read;
- bytes_read = fread(&custom_header, sizeof(custom_header));
+ const int bytes_read = fread(&custom_header, sizeof(custom_header));
if (bytes_read != sizeof(custom_header))
{
return image_init_result::FAIL;
@@ -207,6 +206,7 @@ int smartmedia_image_device::detect_geometry( uint8_t id1, uint8_t id2)
{
switch (id2)
{
+ case 0x73 : m_page_data_size = 0x0200; m_num_pages = 0x08000; m_page_total_size = 0x0210; m_log2_pages_per_block = 5; result = true; break;
case 0x75 : m_page_data_size = 0x0200; m_num_pages = 0x10000; m_page_total_size = 0x0210; m_log2_pages_per_block = 5; result = true; break;
}
}
@@ -219,9 +219,8 @@ int smartmedia_image_device::detect_geometry( uint8_t id1, uint8_t id2)
image_init_result smartmedia_image_device::smartmedia_format_2()
{
disk_image_format_2_header custom_header;
- int bytes_read, i, j;
- bytes_read = fread(&custom_header, sizeof(custom_header));
+ const int bytes_read = fread(&custom_header, sizeof(custom_header));
if (bytes_read != sizeof(custom_header))
{
return image_init_result::FAIL;
@@ -250,18 +249,19 @@ image_init_result smartmedia_image_device::smartmedia_format_2()
m_accumulated_status = 0;
m_pagereg = std::make_unique<uint8_t[]>(m_page_total_size);
m_id_len = 3;
- memcpy( m_id, custom_header.data1, m_id_len);
+ memcpy(m_id, custom_header.data1, m_id_len);
m_mp_opcode = 0;
m_col_address_cycles = 1;
m_row_address_cycles = (m_num_pages > 0x10000) ? 3 : 2;
m_sequential_row_read = 1;
- for (i=0;i<8;i++)
+ for (int i = 0; i < 8; i++)
{
- memcpy( m_data_uid_ptr.get() + i * 32, custom_header.data2, 16);
- for (j=0;j<16;j++) m_data_uid_ptr[i*32+16+j] = custom_header.data2[j] ^ 0xFF;
+ memcpy(m_data_uid_ptr.get() + i * 32, custom_header.data2, 16);
+ for (int j = 0; j < 16; j++)
+ m_data_uid_ptr[i * 32 + 16 + j] = custom_header.data2[j] ^ 0xFF;
}
- memcpy( m_data_uid_ptr.get() + 256, custom_header.data3, 16);
+ memcpy(m_data_uid_ptr.get() + 256, custom_header.data3, 16);
fread(m_feeprom_data, m_page_total_size*m_num_pages);
@@ -281,9 +281,9 @@ image_init_result smartmedia_image_device::call_load()
result = smartmedia_format_1();
if (result != image_init_result::PASS)
{
- // try format 2
- fseek( position, SEEK_SET);
- result = smartmedia_format_2();
+ // try format 2
+ fseek(position, SEEK_SET);
+ result = smartmedia_format_2();
}
return result;
}
@@ -299,10 +299,9 @@ void smartmedia_image_device::call_unload()
if (m_image_format == 1)
{
SM_disk_image_header custom_header;
- int bytes_read;
- fseek( 0, SEEK_SET);
- bytes_read = fread( &custom_header, sizeof( custom_header));
- if (bytes_read == sizeof( custom_header))
+ fseek(0, SEEK_SET);
+ const int bytes_read = fread(&custom_header, sizeof(custom_header));
+ if (bytes_read == sizeof(custom_header))
{
if (custom_header.version == 0)
{
@@ -337,7 +336,7 @@ void smartmedia_image_device::call_unload()
m_status = 0xC0;
m_accumulated_status = 0;
m_pagereg = std::make_unique<uint8_t[]>(m_page_total_size);
- memset( m_id, 0, sizeof( m_id));
+ memset(m_id, 0, sizeof(m_id));
m_id_len = 0;
m_mp_opcode = 0;
m_mode_3065 = 0;
@@ -390,8 +389,8 @@ void nand_device::command_w(uint8_t data)
m_mode_3065 = 0;
if (!m_write_rnb.isnull())
{
- m_write_rnb( 0);
- m_write_rnb( 1);
+ m_write_rnb(0);
+ m_write_rnb(1);
}
break;
case 0x00: // Read (1st cycle)
@@ -422,10 +421,10 @@ void nand_device::command_w(uint8_t data)
}
else
{
- m_mode = SM_M_READ;
- m_pointer_mode = SM_PM_C;
- m_page_addr = 0;
- m_addr_load_ptr = 0;
+ m_mode = SM_M_READ;
+ m_pointer_mode = SM_PM_C;
+ m_page_addr = 0;
+ m_addr_load_ptr = 0;
}
break;
case 0x80: // Page Program (1st cycle)
@@ -444,11 +443,10 @@ void nand_device::command_w(uint8_t data)
}
else
{
- int i;
m_status = (m_status & 0x80) | m_accumulated_status;
//logerror( "smartmedia: program, page_addr %08X\n", m_page_addr);
- for (i=0; i<m_page_total_size; i++)
- m_feeprom_data[m_page_addr*m_page_total_size + i] &= m_pagereg[i];
+ for (int i = 0; i < m_page_total_size; i++)
+ m_feeprom_data[m_page_addr * m_page_total_size + i] &= m_pagereg[i];
m_status |= 0x40;
if (data == 0x15)
m_accumulated_status = m_status & 0x1f;
@@ -457,13 +455,13 @@ void nand_device::command_w(uint8_t data)
m_mode = SM_M_INIT;
if (!m_write_rnb.isnull())
{
- m_write_rnb( 0);
- m_write_rnb( 1);
+ m_write_rnb(0);
+ m_write_rnb(1);
}
}
break;
- /*case 0x11:
- break;*/
+ //case 0x11:
+ // break;
case 0x60: // Block Erase (1st cycle)
m_mode = SM_M_ERASE;
m_page_addr = 0;
@@ -486,22 +484,22 @@ void nand_device::command_w(uint8_t data)
m_pointer_mode = SM_PM_A;
if (!m_write_rnb.isnull())
{
- m_write_rnb( 0);
- m_write_rnb( 1);
+ m_write_rnb(0);
+ m_write_rnb(1);
}
}
break;
case 0x70: // Read Status
m_mode = SM_M_READSTATUS;
break;
- /*case 0x71:
- break;*/
+ //case 0x71:
+ // break;
case 0x90: // Read ID
m_mode = SM_M_READID;
m_addr_load_ptr = 0;
break;
- /*case 0x91:
- break;*/
+ //case 0x91:
+ // break;
case 0x30: // Read (2nd cycle)
if (m_col_address_cycles == 1)
{
@@ -523,8 +521,8 @@ void nand_device::command_w(uint8_t data)
{
if (!m_write_rnb.isnull())
{
- m_write_rnb( 0);
- m_write_rnb( 1);
+ m_write_rnb(0);
+ m_write_rnb(1);
}
}
}
@@ -622,12 +620,12 @@ void nand_device::address_w(uint8_t data)
if (m_addr_load_ptr < m_col_address_cycles)
{
m_byte_addr &= ~(0xFF << (m_addr_load_ptr * 8));
- m_byte_addr |= (data << (m_addr_load_ptr * 8));
+ m_byte_addr |= (data << (m_addr_load_ptr * 8));
}
else if (m_addr_load_ptr < m_col_address_cycles + m_row_address_cycles)
{
m_page_addr &= ~(0xFF << ((m_addr_load_ptr - m_col_address_cycles) * 8));
- m_page_addr |= (data << ((m_addr_load_ptr - m_col_address_cycles) * 8));
+ m_page_addr |= (data << ((m_addr_load_ptr - m_col_address_cycles) * 8));
}
}
m_addr_load_ptr++;
@@ -636,7 +634,7 @@ void nand_device::address_w(uint8_t data)
if (m_addr_load_ptr < m_row_address_cycles)
{
m_page_addr &= ~(0xFF << (m_addr_load_ptr * 8));
- m_page_addr |= (data << (m_addr_load_ptr * 8));
+ m_page_addr |= (data << (m_addr_load_ptr * 8));
}
m_addr_load_ptr++;
break;
@@ -645,7 +643,7 @@ void nand_device::address_w(uint8_t data)
if (m_addr_load_ptr < m_col_address_cycles)
{
m_byte_addr &= ~(0xFF << (m_addr_load_ptr * 8));
- m_byte_addr |= (data << (m_addr_load_ptr * 8));
+ m_byte_addr |= (data << (m_addr_load_ptr * 8));
}
m_addr_load_ptr++;
break;
@@ -682,7 +680,10 @@ uint8_t nand_device::data_r()
{
if (m_byte_addr < m_page_total_size)
{
- reply = m_feeprom_data[m_page_addr*m_page_total_size + m_byte_addr];
+ if (m_page_addr < m_num_pages)
+ reply = m_feeprom_data[m_page_addr * m_page_total_size + m_byte_addr];
+ else
+ reply = 0xff;
}
else
{
@@ -691,7 +692,11 @@ uint8_t nand_device::data_r()
}
else
{
- reply = m_data_uid_ptr[m_page_addr*m_page_total_size + m_byte_addr];
+ // FIXME: this appears to be incorrect, m_data_uid_ptr is a smaller structure of 256*16
+ // this code would always result in reading past the buffer
+ uint32_t addr = m_page_addr * m_page_total_size + m_byte_addr;
+ if (addr < 256 + 16)
+ reply = m_data_uid_ptr[addr];
}
m_byte_addr++;
if ((m_byte_addr == m_page_total_size) && (m_sequential_row_read != 0))
diff --git a/src/devices/machine/z80pio.cpp b/src/devices/machine/z80pio.cpp
index d269891e333..e1664055f21 100644
--- a/src/devices/machine/z80pio.cpp
+++ b/src/devices/machine/z80pio.cpp
@@ -601,11 +601,6 @@ void z80pio_device::pio_port::control_write(uint8_t data)
// load interrupt vector
m_vector = data;
if (LOG) m_device->logerror("Z80PIO Port %c Interrupt Vector: %02x\n", 'A' + m_index, data);
-
- // set interrupt enable
- m_icw |= ICW_ENABLE_INT;
- m_ie = true;
- check_interrupts();
}
else
{
diff --git a/src/devices/sound/c140.cpp b/src/devices/sound/c140.cpp
index c6e5a05271e..b04a35a0f31 100644
--- a/src/devices/sound/c140.cpp
+++ b/src/devices/sound/c140.cpp
@@ -478,8 +478,10 @@ inline u8 c140_device::keyon_status_read(u16 offset)
u8 c140_device::c140_r(offs_t offset)
{
offset &= 0x1ff;
- if ((offset & 0xf) == 0x5)
+
+ if ((offset & 0xf) == 0x5 && offset < 0x180)
return keyon_status_read(offset);
+
return m_REG[offset];
}
@@ -552,9 +554,14 @@ void c140_device::c140_w(offs_t offset, u8 data)
u8 c219_device::c219_r(offs_t offset)
{
+ offset &= 0x1ff;
+
// assume same as c140
// TODO: what happens here on reading unmapped voice regs?
- return c140_r(offset);
+ if ((offset & 0xf) == 0x5 && offset < 0x100)
+ return keyon_status_read(offset);
+
+ return m_REG[offset];
}
diff --git a/src/devices/video/dl1416.cpp b/src/devices/video/dl1416.cpp
index 2508bb179fb..4321192e981 100644
--- a/src/devices/video/dl1416.cpp
+++ b/src/devices/video/dl1416.cpp
@@ -185,15 +185,12 @@ dl1414_device::dl1414_device(
device_t *owner,
u32 clock)
: device_t(mconfig, type, tag, owner, clock)
- , m_update_cb(*this)
- , m_digit_ram{ 0x00, 0x00, 0x00, 0x00 }
- , m_cursor_state{ false, false, false, false }
, m_wr_in(true)
- , m_ce_in(true)
- , m_ce_latch(true)
, m_addr_in(0x00)
- , m_addr_latch(0x00)
, m_data_in(0x00)
+ , m_update_cb(*this)
+ , m_digit_ram{ 0x00, 0x00, 0x00, 0x00 }
+ , m_cursor_state{ false, false, false, false }
{
}
@@ -204,7 +201,10 @@ dl1416_device::dl1416_device(
device_t *owner,
u32 clock)
: dl1414_device(mconfig, type, tag, owner, clock)
+ , m_ce_in(true)
+ , m_ce_latch(true)
, m_cu_in(true)
+ , m_addr_latch(0x00)
{
}
@@ -220,18 +220,12 @@ void dl1414_device::device_start()
save_item(NAME(m_digit_ram));
save_item(NAME(m_cursor_state));
save_item(NAME(m_wr_in));
- save_item(NAME(m_ce_in));
- save_item(NAME(m_ce_latch));
save_item(NAME(m_addr_in));
- save_item(NAME(m_addr_latch));
save_item(NAME(m_data_in));
// set initial state for input lines
m_wr_in = true;
- m_ce_in = true;
- m_ce_latch = true;
m_addr_in = 0x00;
- m_addr_latch = 0x00;
m_data_in = 0x00;
// randomise internal RAM
@@ -249,10 +243,16 @@ void dl1416_device::device_start()
dl1414_device::device_start();
// register for state saving
+ save_item(NAME(m_ce_in));
+ save_item(NAME(m_ce_latch));
save_item(NAME(m_cu_in));
+ save_item(NAME(m_addr_latch));
// set initial state for input lines
+ m_ce_in = true;
+ m_ce_latch = true;
m_cu_in = true;
+ m_addr_latch = 0x00;
}
//-------------------------------------------------
@@ -277,6 +277,16 @@ WRITE_LINE_MEMBER( dl1414_device::wr_w )
{
m_wr_in = bool(state);
if (m_wr_in)
+ bus_w(m_addr_in, m_data_in);
+ }
+}
+
+WRITE_LINE_MEMBER( dl1416_device::wr_w )
+{
+ if (bool(state) != m_wr_in)
+ {
+ m_wr_in = bool(state);
+ if (m_wr_in)
{
if (!m_ce_latch)
bus_w(m_addr_latch, m_data_in);
@@ -289,7 +299,7 @@ WRITE_LINE_MEMBER( dl1414_device::wr_w )
}
}
-WRITE_LINE_MEMBER( dl1414_device::ce_w )
+WRITE_LINE_MEMBER( dl1416_device::ce_w )
{
m_ce_in = bool(state);
}
diff --git a/src/devices/video/dl1416.h b/src/devices/video/dl1416.h
index 9c4b6228ee3..ce1d61071f4 100644
--- a/src/devices/video/dl1416.h
+++ b/src/devices/video/dl1416.h
@@ -7,7 +7,7 @@
* 4-Digit 16-Segment Alphanumeric Intelligent Display
* with Memory/Decoder/Driver
*
- * See video/dl1416.c for more info
+ * See video/dl1416.cpp for more info
*
****************************************************************************/
@@ -36,8 +36,7 @@ public:
auto update() { return m_update_cb.bind(); }
// signal-level interface
- DECLARE_WRITE_LINE_MEMBER(wr_w); // write strobe (rising edge)
- DECLARE_WRITE_LINE_MEMBER(ce_w); // chip enable (active low)
+ virtual DECLARE_WRITE_LINE_MEMBER(wr_w); // write strobe (rising edge)
void addr_w(u8 state);
void data_w(u8 state);
@@ -59,23 +58,24 @@ protected:
void set_cursor_state(offs_t offset, bool state);
virtual u16 translate(u8 digit, bool cursor) const = 0;
+ // input line state
+ bool m_wr_in;
+ u8 m_addr_in;
+ u8 m_data_in;
+
private:
devcb_write16 m_update_cb;
// internal state
u8 m_digit_ram[4]; // holds the digit code for each position
bool m_cursor_state[4]; // holds the cursor state for each position
-
- // input line state
- bool m_wr_in;
- bool m_ce_in, m_ce_latch;
- u8 m_addr_in, m_addr_latch;
- u8 m_data_in;
};
class dl1416_device : public dl1414_device
{
public:
+ virtual DECLARE_WRITE_LINE_MEMBER(wr_w) override;
+ DECLARE_WRITE_LINE_MEMBER(ce_w); // chip enable (active low)
DECLARE_WRITE_LINE_MEMBER(cu_w); // cursor enable (active low)
protected:
@@ -93,7 +93,9 @@ protected:
private:
// input line state
+ bool m_ce_in, m_ce_latch;
bool m_cu_in;
+ u8 m_addr_latch;
};
#endif // MAME_VIDEO_DL1416_H
diff --git a/src/devices/video/hd61830.cpp b/src/devices/video/hd61830.cpp
index 55bf2bbd588..235d250b405 100644
--- a/src/devices/video/hd61830.cpp
+++ b/src/devices/video/hd61830.cpp
@@ -440,7 +440,7 @@ void hd61830_device::draw_char(bitmap_ind16 &bitmap, const rectangle &cliprect,
{
// cursor off, character blink
if (!cursor)
- pixel = m_cursor ? pixel : 0;
+ pixel = m_cursor ? 1 : pixel;
// cursor blink
if (cursor && (cl == m_cp))
@@ -483,8 +483,8 @@ void hd61830_device::update_text(bitmap_ind16 &bitmap, const rectangle &cliprect
md1 = readbyte(rac2);
md2 = readbyte(rac2+1);
- draw_char(bitmap, cliprect, ma, x, y + rows, md1);
- draw_char(bitmap, cliprect, ma+1, x+1, y + rows, md2);
+ draw_char(bitmap, cliprect, ma + (rows * m_hn), x, y + rows, md1);
+ draw_char(bitmap, cliprect, ma+1 + (rows * m_hn), x+1, y + rows, md2);
ma+=2;
rac1+=2;
diff --git a/src/devices/video/pc_vga.cpp b/src/devices/video/pc_vga.cpp
index d72899d2de2..2edaaca392a 100644
--- a/src/devices/video/pc_vga.cpp
+++ b/src/devices/video/pc_vga.cpp
@@ -36,11 +36,11 @@
ROM declarations:
(oti 037 chip)
- ROM_LOAD("oakvga.bin", 0xc0000, 0x8000, 0x318c5f43)
+ ROM_LOAD("oakvga.bin", 0xc0000, 0x8000, CRC(318c5f43) SHA1(2aeb6cf737fd87dfd08c9f5b5bc421fcdbab4ce9) )
(tseng labs famous et4000 isa vga card (oem))
- ROM_LOAD("et4000b.bin", 0xc0000, 0x8000, 0xa903540d)
+ ROM_LOAD("et4000b.bin", 0xc0000, 0x8000, CRC(a903540d) SHA1(unknown) )
(tseng labs famous et4000 isa vga card)
- ROM_LOAD("et4000.bin", 0xc0000, 0x8000, 0xf01e4be0)
+ ROM_LOAD("et4000.bin", 0xc0000, 0x8000, CRC(f01e4be0) SHA1(95d75ff41bcb765e50bd87a8da01835fd0aa01d5) )
***************************************************************************/
diff --git a/src/devices/video/vooddefs.ipp b/src/devices/video/vooddefs.ipp
index 6a169640947..d9726edf960 100644
--- a/src/devices/video/vooddefs.ipp
+++ b/src/devices/video/vooddefs.ipp
@@ -135,7 +135,7 @@ static inline int32_t fast_reciplog(int64_t value, int32_t *log2)
}
/* determine how many leading zeros in the value and shift it up high */
- lz = count_leading_zeros(temp);
+ lz = count_leading_zeros_32(temp);
temp <<= lz;
exp += lz;
@@ -1852,15 +1852,15 @@ do
wfloat = 0xffff; \
else \
{ \
- int exp = count_leading_zeros(temp); \
+ int exp = count_leading_zeros_32(temp); \
wfloat = ((exp << 12) | ((~temp >> (19 - exp)) & 0xfff)) + 1; \
} \
} \
\
/* compute depth value (W or Z) for this pixel */ \
- if (FBZMODE_WBUFFER_SELECT(FBZMODE)) \
+ if (FBZMODE_WBUFFER_SELECT(FBZMODE)) \
{ \
- if (!FBZMODE_DEPTH_FLOAT_SELECT(FBZMODE)) \
+ if (!FBZMODE_DEPTH_FLOAT_SELECT(FBZMODE)) \
depthval = wfloat; \
else \
{ \
@@ -1873,7 +1873,7 @@ do
depthval = 0xffff; \
else \
{ \
- int exp = count_leading_zeros(temp); \
+ int exp = count_leading_zeros_32(temp); \
depthval = ((exp << 12) | ((~temp >> (19 - exp)) & 0xfff)) + 1; \
} \
} \
@@ -1884,11 +1884,11 @@ do
CLAMPED_Z(ITERZ, FBZCOLORPATH, depthval); \
} \
/* add the bias */ \
- biasdepth = depthval; \
+ biasdepth = depthval; \
if (FBZMODE_ENABLE_DEPTH_BIAS(FBZMODE)) \
{ \
- biasdepth += (int16_t)vd->reg[zaColor].u; \
- CLAMP(biasdepth, 0, 0xffff); \
+ biasdepth += (int16_t)vd->reg[zaColor].u; \
+ CLAMP(biasdepth, 0, 0xffff); \
}
@@ -1898,12 +1898,12 @@ do
/* handle depth buffer testing */ \
if (FBZMODE_ENABLE_DEPTHBUF(FBZMODE)) \
{ \
- int32_t depthsource; \
+ int32_t depthsource; \
\
/* the source depth is either the iterated W/Z+bias or a */ \
/* constant value */ \
if (FBZMODE_DEPTH_SOURCE_COMPARE(FBZMODE) == 0) \
- depthsource = biasdepth; \
+ depthsource = biasdepth; \
else \
depthsource = (uint16_t)vd->reg[zaColor].u; \
\
diff --git a/src/devices/video/voodoo.cpp b/src/devices/video/voodoo.cpp
index 180a8d454c3..2b57e67e3de 100644
--- a/src/devices/video/voodoo.cpp
+++ b/src/devices/video/voodoo.cpp
@@ -3129,7 +3129,7 @@ int32_t voodoo_device::register_w(voodoo_device *vd, offs_t offset, uint32_t dat
attoseconds_t refresh = vd->m_screen->frame_period().attoseconds();
attoseconds_t stdperiod, medperiod, vgaperiod;
attoseconds_t stddiff, meddiff, vgadiff;
- rectangle visarea;
+ rectangle visarea;
if (vd->vd_type == TYPE_VOODOO_2)
{
@@ -3151,7 +3151,7 @@ int32_t voodoo_device::register_w(voodoo_device *vd, offs_t offset, uint32_t dat
}
/* create a new visarea */
- visarea.set(hbp, hbp + hvis - 1, vbp, vbp + vvis - 1);
+ visarea.set(hbp, hbp + std::max(hvis - 1, 0), vbp, vbp + std::max(vvis - 1, 0));
/* keep within bounds */
visarea.max_x = (std::min)(visarea.max_x, htotal - 1);
diff --git a/src/emu/emumem_hedr.ipp b/src/emu/emumem_hedr.ipp
index 5af8664932b..460735a2f63 100644
--- a/src/emu/emumem_hedr.ipp
+++ b/src/emu/emumem_hedr.ipp
@@ -183,7 +183,7 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
range_cut_before(ostart-1, start_entry);
range_cut_after(oend+1, end_entry);
- if(LowBits <= Width + AddrShift) {
+ if constexpr(LowBits <= Width + AddrShift) {
if(handler->is_view())
handler->init_handlers(start_entry, end_entry, LowBits, m_u_dispatch, m_u_ranges);
handler->ref(end_entry - start_entry);
@@ -317,7 +317,7 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
range_cut_before(ostart-1, start_entry);
range_cut_after(oend+1, end_entry);
- if(LowBits <= Width + AddrShift) {
+ if constexpr(LowBits <= Width + AddrShift) {
for(offs_t ent = start_entry; ent <= end_entry; ent++) {
u8 rkey1 = rkey;
if(ent != start_entry)
@@ -331,7 +331,7 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
} else if(start_entry == end_entry) {
if(!(start & LOWMASK) && (end & LOWMASK) == LOWMASK) {
if(m_u_dispatch[start_entry]->is_dispatch())
- m_u_dispatch[start_entry]->populate_mismatched_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, descriptor, rkey, mappings);
+ m_u_dispatch[start_entry]->populate_mismatched_nomirror(0, LOWMASK, ostart, oend, descriptor, rkey, mappings);
else {
mismatched_patch(descriptor, rkey, mappings, m_u_dispatch[start_entry]);
m_u_ranges[start_entry].set(ostart, oend);
@@ -351,19 +351,17 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
rkey &= ~handler_entry::END;
}
- if(start_entry <= end_entry) {
- for(offs_t ent = start_entry; ent <= end_entry; ent++) {
- u8 rkey1 = rkey;
- if(ent != start_entry)
- rkey1 &= ~handler_entry::START;
- if(ent != end_entry)
- rkey1 &= ~handler_entry::END;
- if(m_u_dispatch[ent]->is_dispatch())
- m_u_dispatch[ent]->populate_mismatched_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, descriptor, rkey1, mappings);
- else {
- mismatched_patch(descriptor, rkey1, mappings, m_u_dispatch[ent]);
- m_u_ranges[ent].set(ostart, oend);
- }
+ for(offs_t ent = start_entry; ent <= end_entry; ent++) {
+ u8 rkey1 = rkey;
+ if(ent != start_entry)
+ rkey1 &= ~handler_entry::START;
+ if(ent != end_entry)
+ rkey1 &= ~handler_entry::END;
+ if(m_u_dispatch[ent]->is_dispatch())
+ m_u_dispatch[ent]->populate_mismatched_nomirror(0, LOWMASK, ostart, oend, descriptor, rkey1, mappings);
+ else {
+ mismatched_patch(descriptor, rkey1, mappings, m_u_dispatch[ent]);
+ m_u_ranges[ent].set(ostart, oend);
}
}
}
@@ -448,7 +446,7 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
range_cut_before(ostart-1, start_entry);
range_cut_after(oend+1, end_entry);
- if(LowBits <= Width + AddrShift) {
+ if constexpr(LowBits <= Width + AddrShift) {
for(offs_t ent = start_entry; ent <= end_entry; ent++) {
passthrough_patch(handler, mappings, m_u_dispatch[ent]);
m_u_ranges[ent].intersect(ostart, oend);
@@ -456,8 +454,12 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
} else if(start_entry == end_entry) {
if(!(start & LOWMASK) && (end & LOWMASK) == LOWMASK) {
- passthrough_patch(handler, mappings, m_u_dispatch[start_entry]);
- m_u_ranges[start_entry].intersect(ostart, oend);
+ if(m_u_dispatch[start_entry]->is_dispatch())
+ m_u_dispatch[start_entry]->populate_passthrough_nomirror(0, LOWMASK, ostart, oend, handler, mappings);
+ else {
+ passthrough_patch(handler, mappings, m_u_dispatch[start_entry]);
+ m_u_ranges[start_entry].intersect(ostart, oend);
+ }
} else
populate_passthrough_nomirror_subdispatch(start_entry, start & LOWMASK, end & LOWMASK, ostart, oend, handler, mappings);
@@ -471,14 +473,12 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
end_entry--;
}
- if(start_entry <= end_entry) {
- for(offs_t ent = start_entry; ent <= end_entry; ent++) {
- if(m_u_dispatch[ent]->is_dispatch())
- m_u_dispatch[ent]->populate_passthrough_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, handler, mappings);
- else {
- passthrough_patch(handler, mappings, m_u_dispatch[ent]);
- m_u_ranges[ent].intersect(ostart, oend);
- }
+ for(offs_t ent = start_entry; ent <= end_entry; ent++) {
+ if(m_u_dispatch[ent]->is_dispatch())
+ m_u_dispatch[ent]->populate_passthrough_nomirror(0, LOWMASK, ostart, oend, handler, mappings);
+ else {
+ passthrough_patch(handler, mappings, m_u_dispatch[ent]);
+ m_u_ranges[ent].intersect(ostart, oend);
}
}
}
diff --git a/src/emu/emumem_hedw.ipp b/src/emu/emumem_hedw.ipp
index 1c0a791c569..43ba5768b55 100644
--- a/src/emu/emumem_hedw.ipp
+++ b/src/emu/emumem_hedw.ipp
@@ -185,7 +185,7 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
range_cut_before(ostart-1, start_entry);
range_cut_after(oend+1, end_entry);
- if(LowBits <= Width + AddrShift) {
+ if constexpr(LowBits <= Width + AddrShift) {
if(handler->is_view())
handler->init_handlers(start_entry, end_entry, LowBits, m_u_dispatch, m_u_ranges);
handler->ref(end_entry - start_entry);
@@ -319,7 +319,7 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
range_cut_before(ostart-1, start_entry);
range_cut_after(oend+1, end_entry);
- if(LowBits <= Width + AddrShift) {
+ if constexpr(LowBits <= Width + AddrShift) {
for(offs_t ent = start_entry; ent <= end_entry; ent++) {
u8 rkey1 = rkey;
if(ent != start_entry)
@@ -333,7 +333,7 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
} else if(start_entry == end_entry) {
if(!(start & LOWMASK) && (end & LOWMASK) == LOWMASK) {
if(m_u_dispatch[start_entry]->is_dispatch())
- m_u_dispatch[start_entry]->populate_mismatched_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, descriptor, rkey, mappings);
+ m_u_dispatch[start_entry]->populate_mismatched_nomirror(0, LOWMASK, ostart, oend, descriptor, rkey, mappings);
else {
mismatched_patch(descriptor, rkey, mappings, m_u_dispatch[start_entry]);
m_u_ranges[start_entry].intersect(ostart, oend);
@@ -353,19 +353,17 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
rkey &= ~handler_entry::END;
}
- if(start_entry <= end_entry) {
- for(offs_t ent = start_entry; ent <= end_entry; ent++) {
- u8 rkey1 = rkey;
- if(ent != start_entry)
- rkey1 &= ~handler_entry::START;
- if(ent != end_entry)
- rkey1 &= ~handler_entry::END;
- if(m_u_dispatch[ent]->is_dispatch())
- m_u_dispatch[ent]->populate_mismatched_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, descriptor, rkey1, mappings);
- else {
- mismatched_patch(descriptor, rkey1, mappings, m_u_dispatch[ent]);
- m_u_ranges[ent].intersect(ostart, oend);
- }
+ for(offs_t ent = start_entry; ent <= end_entry; ent++) {
+ u8 rkey1 = rkey;
+ if(ent != start_entry)
+ rkey1 &= ~handler_entry::START;
+ if(ent != end_entry)
+ rkey1 &= ~handler_entry::END;
+ if(m_u_dispatch[ent]->is_dispatch())
+ m_u_dispatch[ent]->populate_mismatched_nomirror(0, LOWMASK, ostart, oend, descriptor, rkey1, mappings);
+ else {
+ mismatched_patch(descriptor, rkey1, mappings, m_u_dispatch[ent]);
+ m_u_ranges[ent].intersect(ostart, oend);
}
}
}
@@ -450,7 +448,7 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
range_cut_before(ostart-1, start_entry);
range_cut_after(oend+1, end_entry);
- if(LowBits <= Width + AddrShift) {
+ if constexpr(LowBits <= Width + AddrShift) {
for(offs_t ent = start_entry; ent <= end_entry; ent++) {
passthrough_patch(handler, mappings, m_u_dispatch[ent]);
m_u_ranges[ent].intersect(ostart, oend);
@@ -459,7 +457,7 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
} else if(start_entry == end_entry) {
if(!(start & LOWMASK) && (end & LOWMASK) == LOWMASK) {
if(m_u_dispatch[start_entry]->is_dispatch())
- m_u_dispatch[start_entry]->populate_passthrough_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, handler, mappings);
+ m_u_dispatch[start_entry]->populate_passthrough_nomirror(0, LOWMASK, ostart, oend, handler, mappings);
else {
passthrough_patch(handler, mappings, m_u_dispatch[start_entry]);
m_u_ranges[start_entry].intersect(ostart, oend);
@@ -477,14 +475,12 @@ template<int HighBits, int Width, int AddrShift, endianness_t Endian> void handl
end_entry--;
}
- if(start_entry <= end_entry) {
- for(offs_t ent = start_entry; ent <= end_entry; ent++) {
- if(m_u_dispatch[ent]->is_dispatch())
- m_u_dispatch[ent]->populate_passthrough_nomirror(start & LOWMASK, end & LOWMASK, ostart, oend, handler, mappings);
- else {
- passthrough_patch(handler, mappings, m_u_dispatch[ent]);
- m_u_ranges[ent].intersect(ostart, oend);
- }
+ for(offs_t ent = start_entry; ent <= end_entry; ent++) {
+ if(m_u_dispatch[ent]->is_dispatch())
+ m_u_dispatch[ent]->populate_passthrough_nomirror(0, LOWMASK, ostart, oend, handler, mappings);
+ else {
+ passthrough_patch(handler, mappings, m_u_dispatch[ent]);
+ m_u_ranges[ent].intersect(ostart, oend);
}
}
}
diff --git a/src/emu/emumem_mview.cpp b/src/emu/emumem_mview.cpp
index d6750ad2e23..f132809615a 100644
--- a/src/emu/emumem_mview.cpp
+++ b/src/emu/emumem_mview.cpp
@@ -788,7 +788,7 @@ std::pair<handler_entry *, handler_entry *> memory_view::make_handlers(address_s
m_space = &space;
offs_t span = addrstart ^ addrend;
- u32 awidth = 32 - count_leading_zeros(span);
+ u32 awidth = 32 - count_leading_zeros_32(span);
h_make(awidth, m_config->data_width(), m_config->addr_shift(), m_config->endianness(), space, *this, m_handler_read, m_handler_write);
m_handler_read->ref();
diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp
index 789c7c15a7c..00322df4203 100644
--- a/src/emu/rendlay.cpp
+++ b/src/emu/rendlay.cpp
@@ -530,6 +530,7 @@ private:
// variable found
if (start == 0)
m_buffer.seekp(0);
+ assert(start < str.length());
m_buffer.write(&str[start], pos - start);
m_buffer.write(text.first.data(), text.first.length());
start = term - str.begin() + 1;
@@ -550,7 +551,8 @@ private:
}
else
{
- m_buffer.write(&str[start], str.length() - start);
+ if (start < str.length())
+ m_buffer.write(&str[start], str.length() - start);
return util::buf_to_string_view(m_buffer);
}
}
diff --git a/src/emu/validity.cpp b/src/emu/validity.cpp
index ba928a5acfa..de5321f5347 100644
--- a/src/emu/validity.cpp
+++ b/src/emu/validity.cpp
@@ -519,14 +519,14 @@ void validity_checker::validate_inlines()
for (int i = 0; i <= 32; i++)
{
u32 t = i < 32 ? (1 << (31 - i) | testu32a >> i) : 0;
- u8 resultu8 = count_leading_zeros(t);
+ u8 resultu8 = count_leading_zeros_32(t);
if (resultu8 != i)
- osd_printf_error("Error testing count_leading_zeros %08x=%02x (expected %02x)\n", t, resultu8, i);
+ osd_printf_error("Error testing count_leading_zeros_32 %08x=%02x (expected %02x)\n", t, resultu8, i);
t ^= 0xffffffff;
- resultu8 = count_leading_ones(t);
+ resultu8 = count_leading_ones_32(t);
if (resultu8 != i)
- osd_printf_error("Error testing count_leading_ones %08x=%02x (expected %02x)\n", t, resultu8, i);
+ osd_printf_error("Error testing count_leading_ones_32 %08x=%02x (expected %02x)\n", t, resultu8, i);
}
}
diff --git a/src/frontend/mame/ui/confswitch.cpp b/src/frontend/mame/ui/confswitch.cpp
index 4f0ec775260..ee15d6d5ad5 100644
--- a/src/frontend/mame/ui/confswitch.cpp
+++ b/src/frontend/mame/ui/confswitch.cpp
@@ -62,7 +62,7 @@ inline bool menu_confswitch::switch_group_descriptor::matches(ioport_field const
inline unsigned menu_confswitch::switch_group_descriptor::switch_count() const noexcept
{
- return (sizeof(mask) * 8) - count_leading_zeros(mask);
+ return (sizeof(mask) * 8) - count_leading_zeros_32(mask);
}
diff --git a/src/lib/formats/ipf_dsk.cpp b/src/lib/formats/ipf_dsk.cpp
index 066d9ff62a6..0f1725f5c14 100644
--- a/src/lib/formats/ipf_dsk.cpp
+++ b/src/lib/formats/ipf_dsk.cpp
@@ -7,24 +7,6 @@
const floppy_format_type FLOPPY_IPF_FORMAT = &floppy_image_format_creator<ipf_format>;
-ipf_format::ipf_format() :
- tinfos(),
- tcount(0),
- type(0),
- release(0),
- revision(0),
- encoder_type(0),
- encoder_revision(0),
- origin(0),
- min_cylinder(0),
- max_cylinder(0),
- min_head(0),
- max_head(0),
- credit_day(0),
- credit_time(0)
-{
-}
-
const char *ipf_format::name() const
{
return "ipf";
@@ -59,20 +41,21 @@ int ipf_format::identify(io_generic *io, uint32_t form_factor, const std::vector
bool ipf_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
+ ipf_decode dec;
uint64_t size = io_generic_size(io);
std::vector<uint8_t> data(size);
io_generic_read(io, &data[0], 0, size);
- bool res = parse(data, image);
+ bool res = dec.parse(data, image);
return res;
}
-uint32_t ipf_format::r32(const uint8_t *p)
+uint32_t ipf_format::ipf_decode::r32(const uint8_t *p)
{
return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
}
-uint32_t ipf_format::rb(const uint8_t *&p, int count)
+uint32_t ipf_format::ipf_decode::rb(const uint8_t *&p, int count)
{
uint32_t v = 0;
for(int i=0; i<count; i++)
@@ -80,7 +63,7 @@ uint32_t ipf_format::rb(const uint8_t *&p, int count)
return v;
}
-uint32_t ipf_format::crc32r(const uint8_t *data, uint32_t size)
+uint32_t ipf_format::ipf_decode::crc32r(const uint8_t *data, uint32_t size)
{
// Reversed crc32
uint32_t crc = 0xffffffff;
@@ -95,7 +78,7 @@ uint32_t ipf_format::crc32r(const uint8_t *data, uint32_t size)
return ~crc;
}
-bool ipf_format::parse(std::vector<uint8_t> &data, floppy_image *image)
+bool ipf_format::ipf_decode::parse(std::vector<uint8_t> &data, floppy_image *image)
{
image->set_variant(floppy_image::DSDD); // Not handling anything else yet
tcount = 84*2+1; // Usual max
@@ -107,7 +90,7 @@ bool ipf_format::parse(std::vector<uint8_t> &data, floppy_image *image)
return res;
}
-bool ipf_format::parse_info(const uint8_t *info)
+bool ipf_format::ipf_decode::parse_info(const uint8_t *info)
{
type = r32(info+12);
if(type != 1)
@@ -130,7 +113,7 @@ bool ipf_format::parse_info(const uint8_t *info)
return true;
}
-ipf_format::track_info *ipf_format::get_index(uint32_t idx)
+ipf_format::ipf_decode::track_info *ipf_format::ipf_decode::get_index(uint32_t idx)
{
if(idx > 1000)
return nullptr;
@@ -142,7 +125,7 @@ ipf_format::track_info *ipf_format::get_index(uint32_t idx)
return &tinfos[idx];
}
-bool ipf_format::parse_imge(const uint8_t *imge)
+bool ipf_format::ipf_decode::parse_imge(const uint8_t *imge)
{
track_info *t = get_index(r32(imge+64));
if(!t)
@@ -176,7 +159,7 @@ bool ipf_format::parse_imge(const uint8_t *imge)
return true;
}
-bool ipf_format::parse_data(const uint8_t *data, uint32_t &pos, uint32_t max_extra_size)
+bool ipf_format::ipf_decode::parse_data(const uint8_t *data, uint32_t &pos, uint32_t max_extra_size)
{
track_info *t = get_index(r32(data+24));
if(!t)
@@ -193,7 +176,7 @@ bool ipf_format::parse_data(const uint8_t *data, uint32_t &pos, uint32_t max_ext
return true;
}
-bool ipf_format::scan_one_tag(std::vector<uint8_t> &data, uint32_t &pos, uint8_t *&tag, uint32_t &tsize)
+bool ipf_format::ipf_decode::scan_one_tag(std::vector<uint8_t> &data, uint32_t &pos, uint8_t *&tag, uint32_t &tsize)
{
if(data.size()-pos < 12)
return false;
@@ -209,7 +192,7 @@ bool ipf_format::scan_one_tag(std::vector<uint8_t> &data, uint32_t &pos, uint8_t
return true;
}
-bool ipf_format::scan_all_tags(std::vector<uint8_t> &data)
+bool ipf_format::ipf_decode::scan_all_tags(std::vector<uint8_t> &data)
{
uint32_t pos = 0;
uint32_t size = data.size();
@@ -254,7 +237,7 @@ bool ipf_format::scan_all_tags(std::vector<uint8_t> &data)
return true;
}
-bool ipf_format::generate_tracks(floppy_image *image)
+bool ipf_format::ipf_decode::generate_tracks(floppy_image *image)
{
for(uint32_t i = 0; i != tcount; i++) {
track_info *t = &tinfos[i];
@@ -268,7 +251,7 @@ bool ipf_format::generate_tracks(floppy_image *image)
return true;
}
-void ipf_format::rotate(std::vector<uint32_t> &track, uint32_t offset, uint32_t size)
+void ipf_format::ipf_decode::rotate(std::vector<uint32_t> &track, uint32_t offset, uint32_t size)
{
uint32_t done = 0;
for(uint32_t bpos=0; done < size; bpos++) {
@@ -289,7 +272,7 @@ void ipf_format::rotate(std::vector<uint32_t> &track, uint32_t offset, uint32_t
}
}
-void ipf_format::mark_track_splice(std::vector<uint32_t> &track, uint32_t offset, uint32_t size)
+void ipf_format::ipf_decode::mark_track_splice(std::vector<uint32_t> &track, uint32_t offset, uint32_t size)
{
for(int i=0; i<3; i++) {
uint32_t pos = (offset + i) % size;
@@ -302,13 +285,13 @@ void ipf_format::mark_track_splice(std::vector<uint32_t> &track, uint32_t offset
}
}
-void ipf_format::timing_set(std::vector<uint32_t> &track, uint32_t start, uint32_t end, uint32_t time)
+void ipf_format::ipf_decode::timing_set(std::vector<uint32_t> &track, uint32_t start, uint32_t end, uint32_t time)
{
for(uint32_t i=start; i != end; i++)
track[i] = (track[i] & floppy_image::MG_MASK) | time;
}
-bool ipf_format::generate_timings(track_info *t, std::vector<uint32_t> &track, const std::vector<uint32_t> &data_pos, const std::vector<uint32_t> &gap_pos)
+bool ipf_format::ipf_decode::generate_timings(track_info *t, std::vector<uint32_t> &track, const std::vector<uint32_t> &data_pos, const std::vector<uint32_t> &gap_pos)
{
timing_set(track, 0, t->size_cells, 2000);
@@ -386,7 +369,7 @@ bool ipf_format::generate_timings(track_info *t, std::vector<uint32_t> &track, c
return true;
}
-bool ipf_format::generate_track(track_info *t, floppy_image *image)
+bool ipf_format::ipf_decode::generate_track(track_info *t, floppy_image *image)
{
if(!t->size_cells)
return true;
@@ -434,7 +417,7 @@ bool ipf_format::generate_track(track_info *t, floppy_image *image)
return true;
}
-void ipf_format::track_write_raw(std::vector<uint32_t>::iterator &tpos, const uint8_t *data, uint32_t cells, bool &context)
+void ipf_format::ipf_decode::track_write_raw(std::vector<uint32_t>::iterator &tpos, const uint8_t *data, uint32_t cells, bool &context)
{
for(uint32_t i=0; i != cells; i++)
*tpos++ = data[i>>3] & (0x80 >> (i & 7)) ? MG_1 : MG_0;
@@ -442,7 +425,7 @@ void ipf_format::track_write_raw(std::vector<uint32_t>::iterator &tpos, const ui
context = tpos[-1] == MG_1;
}
-void ipf_format::track_write_mfm(std::vector<uint32_t>::iterator &tpos, const uint8_t *data, uint32_t start_offset, uint32_t patlen, uint32_t cells, bool &context)
+void ipf_format::ipf_decode::track_write_mfm(std::vector<uint32_t>::iterator &tpos, const uint8_t *data, uint32_t start_offset, uint32_t patlen, uint32_t cells, bool &context)
{
patlen *= 2;
for(uint32_t i=0; i != cells; i++) {
@@ -456,13 +439,13 @@ void ipf_format::track_write_mfm(std::vector<uint32_t>::iterator &tpos, const ui
}
}
-void ipf_format::track_write_weak(std::vector<uint32_t>::iterator &tpos, uint32_t cells)
+void ipf_format::ipf_decode::track_write_weak(std::vector<uint32_t>::iterator &tpos, uint32_t cells)
{
for(uint32_t i=0; i != cells; i++)
*tpos++ = floppy_image::MG_N;
}
-bool ipf_format::generate_block_data(const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, std::vector<uint32_t>::iterator tlimit, bool &context)
+bool ipf_format::ipf_decode::generate_block_data(const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, std::vector<uint32_t>::iterator tlimit, bool &context)
{
for(;;) {
if(data >= dlimit)
@@ -504,7 +487,7 @@ bool ipf_format::generate_block_data(const uint8_t *data, const uint8_t *dlimit,
}
}
-bool ipf_format::generate_block_gap_0(uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, std::vector<uint32_t>::iterator &tpos, bool &context)
+bool ipf_format::ipf_decode::generate_block_gap_0(uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, std::vector<uint32_t>::iterator &tpos, bool &context)
{
spos = ipos >= 16 && ipos+16 <= gap_cells ? ipos : gap_cells >> 1;
track_write_mfm(tpos, &pattern, 0, 8, spos, context);
@@ -517,7 +500,7 @@ bool ipf_format::generate_block_gap_0(uint32_t gap_cells, uint8_t pattern, uint3
return true;
}
-bool ipf_format::gap_description_to_reserved_size(const uint8_t *&data, const uint8_t *dlimit, uint32_t &res_size)
+bool ipf_format::ipf_decode::gap_description_to_reserved_size(const uint8_t *&data, const uint8_t *dlimit, uint32_t &res_size)
{
res_size = 0;
for(;;) {
@@ -542,7 +525,7 @@ bool ipf_format::gap_description_to_reserved_size(const uint8_t *&data, const ui
}
}
-bool ipf_format::generate_gap_from_description(const uint8_t *&data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, uint32_t size, bool pre, bool &context)
+bool ipf_format::ipf_decode::generate_gap_from_description(const uint8_t *&data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, uint32_t size, bool pre, bool &context)
{
const uint8_t *data1 = data;
uint32_t res_size;
@@ -612,7 +595,7 @@ bool ipf_format::generate_gap_from_description(const uint8_t *&data, const uint8
}
-bool ipf_format::generate_block_gap_1(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context)
+bool ipf_format::ipf_decode::generate_block_gap_1(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context)
{
if(ipos >= 16 && ipos < gap_cells-16)
spos = ipos;
@@ -621,7 +604,7 @@ bool ipf_format::generate_block_gap_1(uint32_t gap_cells, uint32_t &spos, uint32
return generate_gap_from_description(data, dlimit, tpos, gap_cells, true, context);
}
-bool ipf_format::generate_block_gap_2(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context)
+bool ipf_format::ipf_decode::generate_block_gap_2(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context)
{
if(ipos >= 16 && ipos < gap_cells-16)
spos = ipos;
@@ -630,7 +613,7 @@ bool ipf_format::generate_block_gap_2(uint32_t gap_cells, uint32_t &spos, uint32
return generate_gap_from_description(data, dlimit, tpos, gap_cells, false, context);
}
-bool ipf_format::generate_block_gap_3(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context)
+bool ipf_format::ipf_decode::generate_block_gap_3(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context)
{
if(ipos >= 16 && ipos < gap_cells-16)
spos = ipos;
@@ -657,7 +640,7 @@ bool ipf_format::generate_block_gap_3(uint32_t gap_cells, uint32_t &spos, uint32
return generate_gap_from_description(data, dlimit, tpos+spos+delta, gap_cells - spos - delta, false, context);
}
-bool ipf_format::generate_block_gap(uint32_t gap_type, uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, bool &context)
+bool ipf_format::ipf_decode::generate_block_gap(uint32_t gap_type, uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, bool &context)
{
switch(gap_type) {
case 0:
@@ -673,7 +656,7 @@ bool ipf_format::generate_block_gap(uint32_t gap_type, uint32_t gap_cells, uint8
}
}
-bool ipf_format::generate_block(track_info *t, uint32_t idx, uint32_t ipos, std::vector<uint32_t> &track, uint32_t &pos, uint32_t &dpos, uint32_t &gpos, uint32_t &spos, bool &context)
+bool ipf_format::ipf_decode::generate_block(track_info *t, uint32_t idx, uint32_t ipos, std::vector<uint32_t> &track, uint32_t &pos, uint32_t &dpos, uint32_t &gpos, uint32_t &spos, bool &context)
{
const uint8_t *data = t->data;
const uint8_t *data_end = t->data + t->data_size;
@@ -705,7 +688,7 @@ bool ipf_format::generate_block(track_info *t, uint32_t idx, uint32_t ipos, std:
return true;
}
-uint32_t ipf_format::block_compute_real_size(track_info *t)
+uint32_t ipf_format::ipf_decode::block_compute_real_size(track_info *t)
{
uint32_t size = 0;
const uint8_t *thead = t->data;
diff --git a/src/lib/formats/ipf_dsk.h b/src/lib/formats/ipf_dsk.h
index a2e4bee2a79..82447da3297 100644
--- a/src/lib/formats/ipf_dsk.h
+++ b/src/lib/formats/ipf_dsk.h
@@ -12,8 +12,6 @@
class ipf_format : public floppy_image_format_t
{
public:
- ipf_format();
-
virtual int identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) override;
virtual bool load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
@@ -23,69 +21,71 @@ public:
virtual bool supports_save() const override;
private:
- struct track_info {
- uint32_t cylinder = 0, head = 0, type = 0;
- uint32_t sigtype = 0, process = 0, reserved[3] = { 0, 0, 0 };
- uint32_t size_bytes = 0, size_cells = 0;
- uint32_t index_bytes = 0, index_cells = 0;
- uint32_t datasize_cells = 0, gapsize_cells = 0;
- uint32_t block_count = 0, weak_bits = 0;
-
- uint32_t data_size_bits = 0;
-
- bool info_set = false;
-
- const uint8_t *data = nullptr;
- uint32_t data_size = 0;
+ struct ipf_decode {
+ struct track_info {
+ uint32_t cylinder = 0, head = 0, type = 0;
+ uint32_t sigtype = 0, process = 0, reserved[3] = { 0, 0, 0 };
+ uint32_t size_bytes = 0, size_cells = 0;
+ uint32_t index_bytes = 0, index_cells = 0;
+ uint32_t datasize_cells = 0, gapsize_cells = 0;
+ uint32_t block_count = 0, weak_bits = 0;
+
+ uint32_t data_size_bits = 0;
+
+ bool info_set = false;
+
+ const uint8_t *data = nullptr;
+ uint32_t data_size = 0;
+ };
+
+ std::vector<track_info> tinfos;
+ uint32_t tcount = 0;
+
+ uint32_t type = 0, release = 0, revision = 0;
+ uint32_t encoder_type = 0, encoder_revision = 0, origin = 0;
+ uint32_t min_cylinder = 0, max_cylinder = 0, min_head = 0, max_head = 0;
+ uint32_t credit_day = 0, credit_time = 0;
+ uint32_t platform[4] = {}, extra[5] = {};
+
+ uint32_t crc32r(const uint8_t *data, uint32_t size);
+
+ bool parse_info(const uint8_t *info);
+ bool parse_imge(const uint8_t *imge);
+ bool parse_data(const uint8_t *data, uint32_t &pos, uint32_t max_extra_size);
+
+ bool scan_one_tag(std::vector<uint8_t> &data, uint32_t &pos, uint8_t *&tag, uint32_t &tsize);
+ bool scan_all_tags(std::vector<uint8_t> &data);
+ static uint32_t r32(const uint8_t *p);
+ static uint32_t rb(const uint8_t *&p, int count);
+
+ track_info *get_index(uint32_t idx);
+
+ void track_write_raw(std::vector<uint32_t>::iterator &tpos, const uint8_t *data, uint32_t cells, bool &context);
+ void track_write_mfm(std::vector<uint32_t>::iterator &tpos, const uint8_t *data, uint32_t start_offset, uint32_t patlen, uint32_t cells, bool &context);
+ void track_write_weak(std::vector<uint32_t>::iterator &tpos, uint32_t cells);
+ bool generate_block_data(const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, std::vector<uint32_t>::iterator tlimit, bool &context);
+
+ bool gap_description_to_reserved_size(const uint8_t *&data, const uint8_t *dlimit, uint32_t &res_size);
+ bool generate_gap_from_description(const uint8_t *&data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, uint32_t size, bool pre, bool &context);
+ bool generate_block_gap_0(uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, std::vector<uint32_t>::iterator &tpos, bool &context);
+ bool generate_block_gap_1(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context);
+ bool generate_block_gap_2(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context);
+ bool generate_block_gap_3(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context);
+ bool generate_block_gap(uint32_t gap_type, uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, bool &context);
+
+ bool generate_block(track_info *t, uint32_t idx, uint32_t ipos, std::vector<uint32_t> &track, uint32_t &pos, uint32_t &dpos, uint32_t &gpos, uint32_t &spos, bool &context);
+ uint32_t block_compute_real_size(track_info *t);
+
+ void timing_set(std::vector<uint32_t> &track, uint32_t start, uint32_t end, uint32_t time);
+ bool generate_timings(track_info *t, std::vector<uint32_t> &track, const std::vector<uint32_t> &data_pos, const std::vector<uint32_t> &gap_pos);
+
+ void rotate(std::vector<uint32_t> &track, uint32_t offset, uint32_t size);
+ void mark_track_splice(std::vector<uint32_t> &track, uint32_t offset, uint32_t size);
+ bool generate_track(track_info *t, floppy_image *image);
+ bool generate_tracks(floppy_image *image);
+
+ bool parse(std::vector<uint8_t> &data, floppy_image *image);
};
-
- std::vector<track_info> tinfos;
- uint32_t tcount;
-
- uint32_t type, release, revision;
- uint32_t encoder_type, encoder_revision, origin;
- uint32_t min_cylinder, max_cylinder, min_head, max_head;
- uint32_t credit_day, credit_time;
- uint32_t platform[4], extra[5];
-
- uint32_t crc32r(const uint8_t *data, uint32_t size);
-
- bool parse_info(const uint8_t *info);
- bool parse_imge(const uint8_t *imge);
- bool parse_data(const uint8_t *data, uint32_t &pos, uint32_t max_extra_size);
-
- bool scan_one_tag(std::vector<uint8_t> &data, uint32_t &pos, uint8_t *&tag, uint32_t &tsize);
- bool scan_all_tags(std::vector<uint8_t> &data);
- static uint32_t r32(const uint8_t *p);
- static uint32_t rb(const uint8_t *&p, int count);
-
- track_info *get_index(uint32_t idx);
-
- void track_write_raw(std::vector<uint32_t>::iterator &tpos, const uint8_t *data, uint32_t cells, bool &context);
- void track_write_mfm(std::vector<uint32_t>::iterator &tpos, const uint8_t *data, uint32_t start_offset, uint32_t patlen, uint32_t cells, bool &context);
- void track_write_weak(std::vector<uint32_t>::iterator &tpos, uint32_t cells);
- bool generate_block_data(const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, std::vector<uint32_t>::iterator tlimit, bool &context);
-
- bool gap_description_to_reserved_size(const uint8_t *&data, const uint8_t *dlimit, uint32_t &res_size);
- bool generate_gap_from_description(const uint8_t *&data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, uint32_t size, bool pre, bool &context);
- bool generate_block_gap_0(uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, std::vector<uint32_t>::iterator &tpos, bool &context);
- bool generate_block_gap_1(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context);
- bool generate_block_gap_2(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context);
- bool generate_block_gap_3(uint32_t gap_cells, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator &tpos, bool &context);
- bool generate_block_gap(uint32_t gap_type, uint32_t gap_cells, uint8_t pattern, uint32_t &spos, uint32_t ipos, const uint8_t *data, const uint8_t *dlimit, std::vector<uint32_t>::iterator tpos, bool &context);
-
- bool generate_block(track_info *t, uint32_t idx, uint32_t ipos, std::vector<uint32_t> &track, uint32_t &pos, uint32_t &dpos, uint32_t &gpos, uint32_t &spos, bool &context);
- uint32_t block_compute_real_size(track_info *t);
-
- void timing_set(std::vector<uint32_t> &track, uint32_t start, uint32_t end, uint32_t time);
- bool generate_timings(track_info *t, std::vector<uint32_t> &track, const std::vector<uint32_t> &data_pos, const std::vector<uint32_t> &gap_pos);
-
- void rotate(std::vector<uint32_t> &track, uint32_t offset, uint32_t size);
- void mark_track_splice(std::vector<uint32_t> &track, uint32_t offset, uint32_t size);
- bool generate_track(track_info *t, floppy_image *image);
- bool generate_tracks(floppy_image *image);
-
- bool parse(std::vector<uint8_t> &data, floppy_image *image);
};
extern const floppy_format_type FLOPPY_IPF_FORMAT;
diff --git a/src/lib/util/msdib.cpp b/src/lib/util/msdib.cpp
index c084442f44b..58d7429fce1 100644
--- a/src/lib/util/msdib.cpp
+++ b/src/lib/util/msdib.cpp
@@ -93,9 +93,9 @@ union bitmap_headers
bool dib_parse_mask(uint32_t mask, unsigned &shift, unsigned &bits)
{
- shift = count_leading_zeros(mask);
+ shift = count_leading_zeros_32(mask);
mask <<= shift;
- bits = count_leading_ones(mask);
+ bits = count_leading_ones_32(mask);
mask <<= shift;
shift = 32 - shift - bits;
return !mask;
diff --git a/src/mame/arcade.flt b/src/mame/arcade.flt
index 533d5c951d2..21bde9492c1 100644
--- a/src/mame/arcade.flt
+++ b/src/mame/arcade.flt
@@ -454,6 +454,7 @@ galastrm.cpp
galaxi.cpp
galaxia.cpp
galaxian.cpp
+galaxian_rockclim.cpp
galaxold.cpp
galgame.cpp
galgames.cpp
diff --git a/src/mame/audio/acan.cpp b/src/mame/audio/acan.cpp
index 5f999368625..b881f2e65ac 100644
--- a/src/mame/audio/acan.cpp
+++ b/src/mame/audio/acan.cpp
@@ -22,9 +22,11 @@ acan_sound_device::acan_sound_device(const machine_config &mconfig, const char *
, device_sound_interface(mconfig, *this)
, m_stream(nullptr)
, m_timer(nullptr)
- , m_irq_handler(*this)
+ , m_timer_irq_handler(*this)
+ , m_dma_irq_handler(*this)
, m_ram_read(*this)
, m_active_channels(0)
+ , m_dma_channels(0)
{
}
@@ -35,11 +37,13 @@ void acan_sound_device::device_start()
m_mix = std::make_unique<int32_t[]>((clock() / 16 / 5) * 2);
m_timer = timer_alloc(0);
- m_irq_handler.resolve();
+ m_timer_irq_handler.resolve_safe();
+ m_dma_irq_handler.resolve_safe();
m_ram_read.resolve_safe(0);
// register for savestates
save_item(NAME(m_active_channels));
+ save_item(NAME(m_dma_channels));
save_item(STRUCT_MEMBER(m_channels, pitch));
save_item(STRUCT_MEMBER(m_channels, length));
save_item(STRUCT_MEMBER(m_channels, start_addr));
@@ -47,6 +51,7 @@ void acan_sound_device::device_start()
save_item(STRUCT_MEMBER(m_channels, end_addr));
save_item(STRUCT_MEMBER(m_channels, addr_increment));
save_item(STRUCT_MEMBER(m_channels, frac));
+ save_item(STRUCT_MEMBER(m_channels, register9));
save_item(STRUCT_MEMBER(m_channels, envelope));
save_item(STRUCT_MEMBER(m_channels, volume));
save_item(STRUCT_MEMBER(m_channels, volume_l));
@@ -58,19 +63,19 @@ void acan_sound_device::device_start()
void acan_sound_device::device_reset()
{
m_active_channels = 0;
+ m_dma_channels = 0;
std::fill(std::begin(m_regs), std::end(m_regs), 0);
m_timer->reset();
- if (!m_irq_handler.isnull())
- m_irq_handler(0);
+ m_timer_irq_handler(0);
+ m_dma_irq_handler(0);
}
void acan_sound_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
if (m_regs[0x14] & 0x40)
{
- if (!m_irq_handler.isnull())
- m_irq_handler(1);
+ m_timer_irq_handler(1);
// Update frequency
uint16_t period = (m_regs[0x12] << 8) + m_regs[0x11];
@@ -82,7 +87,7 @@ void acan_sound_device::sound_stream_update(sound_stream &stream, std::vector<re
{
std::fill_n(&m_mix[0], outputs[0].samples() * 2, 0);
- for (int i = 0; i < 15 && m_active_channels != 0; i++)
+ for (int i = 0; i < 16 && m_active_channels != 0; i++)
{
if (BIT(m_active_channels, i))
{
@@ -103,7 +108,12 @@ void acan_sound_device::sound_stream_update(sound_stream &stream, std::vector<re
if (channel.curr_addr >= channel.end_addr)
{
- if (channel.one_shot)
+ if (channel.register9)
+ {
+ m_dma_irq_handler(1);
+ keyon_voice(i);
+ }
+ else if (channel.one_shot)
{
m_active_channels &= ~(1 << i);
}
@@ -128,13 +138,28 @@ uint8_t acan_sound_device::read(offs_t offset)
{
if (offset == 0x14)
{
- // acknowledge timer (?)
- if (!m_irq_handler.isnull())
- m_irq_handler(0);
+ // acknowledge timer IRQ?
+ m_timer_irq_handler(0);
+ }
+ else if (offset == 0x16)
+ {
+ // acknowledge DMA IRQ?
+ m_dma_irq_handler(0);
}
return m_regs[offset];
}
+void acan_sound_device::keyon_voice(uint8_t voice)
+{
+ acan_channel &channel = m_channels[voice];
+ channel.curr_addr = channel.start_addr << 6;
+ channel.end_addr = channel.curr_addr + channel.length;
+
+ m_active_channels |= (1 << voice);
+
+ //printf("Keyon voice %d\n", voice);
+}
+
void acan_sound_device::write(offs_t offset, uint8_t data)
{
const uint8_t upper = (offset >> 4) & 0x0f;
@@ -144,107 +169,128 @@ void acan_sound_device::write(offs_t offset, uint8_t data)
switch (upper)
{
- case 0x1:
- if (lower == 0x7) // Keyon/keyoff
- {
- const uint16_t mask = 1 << (data & 0xf);
- if (data & 0xf0)
- m_active_channels |= mask;
- else
- m_active_channels &= ~mask;
- }
- else if (lower == 0x4) // Timer control
- {
- if (data & 0x80)
- {
- // Update frequency
- uint16_t period = (m_regs[0x12] << 8) + m_regs[0x11];
- m_timer->adjust(clocks_to_attotime(10 * (0x10000 - period)), 0);
- }
- // the meaning of the data that is actually written is unknown
- LOG("Sound timer control: %02x = %02x\n", offset, data);
- }
- else if (lower != 0x1 && lower != 0x2)
- {
- LOG("Unknown audio register: %02x = %02x\n", offset, data);
- }
+ case 0x1:
+ switch (lower)
+ {
+ case 0x1: // Timer frequency (low byte)
+ LOG("%s: Sound timer frequency (low byte) = %02x\n", machine().describe_context(), data);
break;
- case 0x2: // Pitch (low byte)
- if (lower < 0xf)
- {
- acan_channel &channel = m_channels[lower];
- channel.pitch &= 0xff00;
- channel.pitch |= data;
- channel.addr_increment = (uint32_t)channel.pitch << 6;
- channel.frac = 0;
- }
+ case 0x2: // Timer frequency (high byte)
+ LOG("%s: Sound timer frequency (high byte) = %02x\n", machine().describe_context(), data);
break;
- case 0x3: // Pitch (high byte)
- if (lower < 0xf)
+ case 0x4: // Timer control
+ // The meaning of the data that is actually written is unknown
+ LOG("%s: Sound timer control = %02x\n", machine().describe_context(), data);
+ if (BIT(data, 7))
{
- acan_channel &channel = m_channels[lower];
- channel.pitch &= 0x00ff;
- channel.pitch |= data << 8;
- channel.addr_increment = (uint32_t)channel.pitch << 6;
- channel.frac = 0;
+ // Update frequency
+ uint16_t period = (m_regs[0x12] << 8) + m_regs[0x11];
+ m_timer->adjust(clocks_to_attotime(10 * (0x10000 - period)), 0);
}
break;
- case 0x5: // Waveform length
- if (lower < 0xf)
- {
- acan_channel &channel = m_channels[lower];
- //channel.length = (data & ~0x01) << 6;
- channel.length = (data & 0x0e) << 6; // Temporary hack to make jttlaugh audible. Not the proper fix!
- channel.end_addr = channel.curr_addr + channel.length;
- channel.one_shot = BIT(data, 0);
- }
+ case 0x6: // DMA-driven channel flags?
+ // The meaning of the data that is actually written is unknown
+ m_dma_channels = data << 8;
+ LOG("%s: DMA-driven channel flag(?) = %02x\n", machine().describe_context(), data);
break;
- case 0x6: // Waveform address (divided by 0x40, high byte)
- if (lower < 0xf)
+ case 0x7: // Keyon/keyoff
+ {
+ LOG("%s: Sound key control, voice %02x key%s\n", machine().describe_context(), data & 0xf, (data & 0xf0) ? "on" : "off");
+ const uint16_t mask = 1 << (data & 0xf);
+ if (data & 0xf0)
{
- acan_channel &channel = m_channels[lower];
- channel.start_addr &= 0x00ff;
- channel.start_addr |= data << 8;
- channel.curr_addr = channel.start_addr << 6;
- channel.end_addr = channel.curr_addr + channel.length;
+ keyon_voice(data & 0xf);
}
- break;
-
- case 0x7: // Waveform address (divided by 0x40, low byte)
- if (lower < 0xf)
+ else
{
- acan_channel &channel = m_channels[lower];
- channel.start_addr &= 0xff00;
- channel.start_addr |= data;
- channel.curr_addr = channel.start_addr << 6;
- channel.end_addr = channel.curr_addr + channel.length;
+ m_active_channels &= ~mask;
}
break;
+ }
- case 0xa: // Envelope Parameters? (not yet known)
- case 0xb:
- case 0xc:
- case 0xd:
- if (lower < 0xf)
- m_channels[lower].envelope[upper - 0xa] = data;
+ default:
+ LOG("Unknown sound register: %02x = %02x\n", offset, data);
break;
+ }
+ break;
- case 0xe: // Volume
- if (lower < 0xf)
- {
- acan_channel &channel = m_channels[lower];
- channel.volume = data;
- channel.volume_l = (data & 0xf0) | (data >> 4);
- channel.volume_r = (data & 0x0f) | (data << 4);
- }
- break;
+ case 0x2: // Pitch (low byte)
+ {
+ acan_channel &channel = m_channels[lower];
+ channel.pitch &= 0xff00;
+ channel.pitch |= data;
+ channel.addr_increment = (uint32_t)channel.pitch << 6;
+ break;
+ }
- default:
- LOG("Unknown audio register: %02x = %02x\n", offset, data);
- break;
+ case 0x3: // Pitch (high byte)
+ {
+ acan_channel &channel = m_channels[lower];
+ channel.pitch &= 0x00ff;
+ channel.pitch |= data << 8;
+ channel.addr_increment = (uint32_t)channel.pitch << 6;
+ break;
+ }
+
+ case 0x5: // Waveform length
+ {
+ acan_channel &channel = m_channels[lower];
+ channel.length = 0x40 << ((data & 0x0e) >> 1);
+ channel.one_shot = BIT(data, 0);
+ LOG("%s: Waveform length and attributes (voice %02x): %02x\n", machine().describe_context(), lower, data);
+ break;
+ }
+
+ case 0x6: // Waveform address (divided by 0x40, high byte)
+ {
+ acan_channel &channel = m_channels[lower];
+ channel.start_addr &= 0x00ff;
+ channel.start_addr |= data << 8;
+ LOG("%s: Waveform address (high) (voice %02x): %02x, will be %04x\n", machine().describe_context(), lower, data, channel.start_addr << 6);
+ break;
+ }
+
+ case 0x7: // Waveform address (divided by 0x40, low byte)
+ {
+ acan_channel &channel = m_channels[lower];
+ channel.start_addr &= 0xff00;
+ channel.start_addr |= data;
+ LOG("%s: Waveform address (low) (voice %02x): %02x, will be %04x\n", machine().describe_context(), lower, data, channel.start_addr << 6);
+ break;
+ }
+
+ case 0x9: // Unknown (set to 0xFF for DMA-driven channels)
+ {
+ acan_channel &channel = m_channels[lower];
+ channel.register9 = data;
+ LOG("%s: Unknown voice register 9 (voice %02x): %02x\n", machine().describe_context(), lower, data);
+ break;
+ }
+
+ case 0xa: // Envelope Parameters? (not yet known)
+ case 0xb:
+ case 0xc:
+ case 0xd:
+ m_channels[lower].envelope[upper - 0xa] = data;
+ LOG("%s: Envelope parameter %d (voice %02x) = %02x\n", machine().describe_context(), upper - 0xa, lower, data);
+ break;
+
+ case 0xe: // Volume
+ {
+ acan_channel &channel = m_channels[lower];
+ channel.volume = data;
+ channel.volume_l = (data & 0xf0) | (data >> 4);
+ channel.volume_r = (data & 0x0f) | (data << 4);
+ LOG("%s: Volume register (voice %02x) = = %02x\n", machine().describe_context(), lower, data);
+ break;
+ }
+
+ default:
+ LOG("Unknown sound register: %02x = %02x\n", offset, data);
+ break;
}
}
diff --git a/src/mame/audio/acan.h b/src/mame/audio/acan.h
index 9c04c12cb69..0f6ac312a2d 100644
--- a/src/mame/audio/acan.h
+++ b/src/mame/audio/acan.h
@@ -17,7 +17,8 @@ public:
acan_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
auto ram_read() { return m_ram_read.bind(); }
- auto irq_handler() { return m_irq_handler.bind(); }
+ auto timer_irq_handler() { return m_timer_irq_handler.bind(); }
+ auto dma_irq_handler() { return m_dma_irq_handler.bind(); }
uint8_t read(offs_t offset);
void write(offs_t offset, uint8_t data);
@@ -41,6 +42,7 @@ private:
uint16_t end_addr;
uint32_t addr_increment;
uint32_t frac;
+ uint8_t register9;
uint8_t envelope[4];
uint8_t volume;
uint8_t volume_l;
@@ -48,12 +50,16 @@ private:
bool one_shot;
};
+ void keyon_voice(uint8_t voice);
+
sound_stream *m_stream;
emu_timer *m_timer;
- devcb_write_line m_irq_handler;
+ devcb_write_line m_timer_irq_handler;
+ devcb_write_line m_dma_irq_handler;
devcb_read8 m_ram_read;
uint16_t m_active_channels;
- acan_channel m_channels[15];
+ uint16_t m_dma_channels;
+ acan_channel m_channels[16];
uint8_t m_regs[256];
std::unique_ptr<int32_t[]> m_mix;
};
diff --git a/src/mame/audio/gottlieb.cpp b/src/mame/audio/gottlieb.cpp
index 4c56cff5e23..8c8555f13be 100644
--- a/src/mame/audio/gottlieb.cpp
+++ b/src/mame/audio/gottlieb.cpp
@@ -463,7 +463,8 @@ inline void gottlieb_sound_r2_device::nmi_state_update()
uint8_t gottlieb_sound_r2_device::audio_data_r()
{
- m_audiocpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
+ if (!machine().side_effects_disabled())
+ m_audiocpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
return m_audiocpu_latch;
}
@@ -475,12 +476,29 @@ uint8_t gottlieb_sound_r2_device::audio_data_r()
uint8_t gottlieb_sound_r2_device::speech_data_r()
{
- m_speechcpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
+ if (!machine().side_effects_disabled())
+ m_speechcpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
return m_speechcpu_latch;
}
//-------------------------------------------------
+// signal_audio_nmi_r - signal an NMI from the
+// speech CPU to the audio CPU
+//-------------------------------------------------
+
+uint8_t gottlieb_sound_r2_device::signal_audio_nmi_r()
+{
+ if (!machine().side_effects_disabled())
+ {
+ m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
+ m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+ }
+ return 0xff;
+}
+
+
+//-------------------------------------------------
// signal_audio_nmi_w - signal an NMI from the
// speech CPU to the audio CPU
//-------------------------------------------------
@@ -620,7 +638,7 @@ void gottlieb_sound_r2_device::gottlieb_speech_r2_map(address_map &map)
map(0x8000, 0x8000).mirror(0x1fff).w(FUNC(gottlieb_sound_r2_device::psg_latch_w));
map(0xa000, 0xa000).mirror(0x07ff).w(FUNC(gottlieb_sound_r2_device::nmi_rate_w));
map(0xa800, 0xa800).mirror(0x07ff).r(FUNC(gottlieb_sound_r2_device::speech_data_r));
- map(0xb000, 0xb000).mirror(0x07ff).w(FUNC(gottlieb_sound_r2_device::signal_audio_nmi_w));
+ map(0xb000, 0xb000).mirror(0x07ff).rw(FUNC(gottlieb_sound_r2_device::signal_audio_nmi_r), FUNC(gottlieb_sound_r2_device::signal_audio_nmi_w));
map(0xc000, 0xffff).rom();
}
@@ -703,6 +721,9 @@ void gottlieb_sound_r2_device::device_start()
save_item(NAME(m_nmi_state));
save_item(NAME(m_speech_control));
save_item(NAME(m_last_command));
+ save_item(NAME(m_psg_latch));
+ save_item(NAME(m_psg_data_latch));
+ save_item(NAME(m_sp0250_latch));
}
diff --git a/src/mame/audio/gottlieb.h b/src/mame/audio/gottlieb.h
index aa712c02130..8977c3181ab 100644
--- a/src/mame/audio/gottlieb.h
+++ b/src/mame/audio/gottlieb.h
@@ -140,6 +140,7 @@ public:
// internal communications
uint8_t speech_data_r();
uint8_t audio_data_r();
+ uint8_t signal_audio_nmi_r();
void signal_audio_nmi_w(uint8_t data);
void nmi_rate_w(uint8_t data);
CUSTOM_INPUT_MEMBER( speech_drq_custom_r );
diff --git a/src/mame/drivers/aci_ggm.cpp b/src/mame/drivers/aci_ggm.cpp
index 225e5418067..9ced19e60b9 100644
--- a/src/mame/drivers/aci_ggm.cpp
+++ b/src/mame/drivers/aci_ggm.cpp
@@ -7,7 +7,7 @@ Applied Concepts Great Game Machine (GGM), electronic board game computer.
2nd source distribution: Modular Game System (MGS), by Chafitz.
Hardware notes:
-- 6502A 2MHz (unknown XTAL, label "5-80"), SYP6522 VIA
+- 6502A 2MHz, SYP6522 VIA
- 2KB RAM(4*HM472114AP-2), no ROM on main PCB
- 2*74164 shift register, 3*6118P VFD driver
- 8-digit 14seg VFD panel (same one as in Speak & Spell)
@@ -19,7 +19,7 @@ There were also some standalone machines, eg. Morphy Encore, Odin Encore.
Known chess cartridges (*denotes not dumped):
- Chess/Boris 2.5 (aka Sargon 2.5)
- *Gruenfeld Edition - Master Chess Openings
-- *Morphy Edition - Master Chess
+- Morphy Edition - Master Chess
- Capablanca Edition - Master Chess Endgame
- Sandy Edition - Master Chess (German language version of Morphy)
- Steinitz Edition-4 - Master Chess
@@ -40,7 +40,6 @@ TODO:
- it doesn't have nvram, it's a workaround for MAME forcing a hard reset when
swapping in a new cartridge
- what's VIA PB0 for? game toggles it once per irq
-- identify XTAL (2MHz CPU/VIA is correct, compared to video reference)
- confirm display AP segment, is it used anywhere?
- verify cartridge pinout, right now assume A0-A15 (max known cart size is 24KB).
Boris/Sargon cartridge is A0-A11 and 2 CS lines, Steinitz uses the whole range.
@@ -172,7 +171,7 @@ void ggm_state::update_reset(ioport_value state)
DEVICE_IMAGE_LOAD_MEMBER(ggm_state::load_cart)
{
u32 size = m_cart->common_get_size("rom");
- m_cart_mask = ((1 << (31 - count_leading_zeros(size))) - 1) & 0xffff;
+ m_cart_mask = ((1 << (31 - count_leading_zeros_32(size))) - 1) & 0xffff;
m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
@@ -432,10 +431,10 @@ INPUT_PORTS_END
void ggm_state::ggm(machine_config &config)
{
/* basic machine hardware */
- M6502(config, m_maincpu, 2000000);
+ M6502(config, m_maincpu, 2_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &ggm_state::main_map);
- MOS6522(config, m_via, 2000000); // DDRA = 0xff, DDRB = 0x81
+ MOS6522(config, m_via, 2_MHz_XTAL); // DDRA = 0xff, DDRB = 0x81
m_via->writepa_handler().set(FUNC(ggm_state::select_w));
m_via->writepb_handler().set(FUNC(ggm_state::control_w));
m_via->readpb_handler().set(FUNC(ggm_state::input_r));
diff --git a/src/mame/drivers/adam.cpp b/src/mame/drivers/adam.cpp
index c4052ae3162..d3abeeeb31e 100644
--- a/src/mame/drivers/adam.cpp
+++ b/src/mame/drivers/adam.cpp
@@ -458,9 +458,9 @@ uint8_t adam_state::mreq_r(offs_t offset)
}
data = m_cart->bd_r(offset & 0x7fff, data, cs1, cs2, cs3, cs4);
- data = m_slot1->bd_r(offset & 0xff, data, 1, biorq, 1, 1, 1);
- data = m_slot2->bd_r(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
- data = m_slot3->bd_r(offset, data, 1, 1, 1, cas1, cas2);
+ data = m_slot[0]->bd_r(offset & 0xff, data, 1, biorq, 1, 1, 1);
+ data = m_slot[1]->bd_r(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
+ data = m_slot[2]->bd_r(offset, data, 1, 1, 1, cas1, cas2);
return data;
}
@@ -516,9 +516,9 @@ void adam_state::mreq_w(offs_t offset, uint8_t data)
m_ram->pointer()[offset] = data;
}
- m_slot1->bd_w(offset & 0xff, data, 1, biorq, 1, 1, 1);
- m_slot2->bd_w(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
- m_slot3->bd_w(offset, data, 1, 1, 1, cas1, cas2);
+ m_slot[0]->bd_w(offset & 0xff, data, 1, biorq, 1, 1, 1);
+ m_slot[1]->bd_w(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
+ m_slot[2]->bd_w(offset, data, 1, 1, 1, cas1, cas2);
}
@@ -557,9 +557,9 @@ uint8_t adam_state::iorq_r(offs_t offset)
break;
}
- data = m_slot1->bd_r(offset & 0xff, data, 1, biorq, 1, 1, 1);
- data = m_slot2->bd_r(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
- data = m_slot3->bd_r(offset, data, 1, 1, 1, cas1, cas2);
+ data = m_slot[0]->bd_r(offset & 0xff, data, 1, biorq, 1, 1, 1);
+ data = m_slot[1]->bd_r(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
+ data = m_slot[2]->bd_r(offset, data, 1, 1, 1, cas1, cas2);
return data;
}
@@ -609,9 +609,9 @@ void adam_state::iorq_w(offs_t offset, uint8_t data)
break;
}
- m_slot1->bd_w(offset & 0xff, data, 1, biorq, 1, 1, 1);
- m_slot2->bd_w(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
- m_slot3->bd_w(offset, data, 1, 1, 1, cas1, cas2);
+ m_slot[0]->bd_w(offset & 0xff, data, 1, biorq, 1, 1, 1);
+ m_slot[1]->bd_w(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
+ m_slot[2]->bd_w(offset, data, 1, 1, 1, cas1, cas2);
}
@@ -1076,11 +1076,11 @@ void adam_state::adam(machine_config &config)
ADAMNET_SLOT(config, "net15", m_adamnet, adamnet_devices, nullptr);
COLECOVISION_CARTRIDGE_SLOT(config, m_cart, colecovision_cartridges, nullptr);
- ADAM_EXPANSION_SLOT(config, m_slot1, XTAL(7'159'090)/2, adam_slot1_devices, "adamlink");
- m_slot1->irq().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- ADAM_EXPANSION_SLOT(config, m_slot2, XTAL(7'159'090)/2, adam_slot2_devices, nullptr);
- m_slot2->irq().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- ADAM_EXPANSION_SLOT(config, m_slot3, XTAL(7'159'090)/2, adam_slot3_devices, "ram");
+ ADAM_EXPANSION_SLOT(config, m_slot[0], XTAL(7'159'090)/2, adam_slot1_devices, "adamlink"); // left
+ m_slot[0]->irq().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ ADAM_EXPANSION_SLOT(config, m_slot[1], XTAL(7'159'090)/2, adam_slot2_devices, nullptr); // center
+ m_slot[1]->irq().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ ADAM_EXPANSION_SLOT(config, m_slot[2], XTAL(7'159'090)/2, adam_slot3_devices, "ram"); // right
COLECOVISION_CONTROL_PORT(config, m_joy1, colecovision_control_port_devices, "hand");
m_joy1->irq().set(FUNC(adam_state::joy1_irq_w));
diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp
index 52826b35be4..bc5e2be148e 100644
--- a/src/mame/drivers/apple2e.cpp
+++ b/src/mame/drivers/apple2e.cpp
@@ -3380,8 +3380,8 @@ void apple2e_state::r4000bank_map(address_map &map)
void apple2e_state::c100bank_map(address_map &map)
{
map(0x0000, 0x01ff).rw(FUNC(apple2e_state::c100_r), FUNC(apple2e_state::c100_w));
- map(0x0200, 0x03ff).r(FUNC(apple2e_state::c100_int_r)).nopw();
- map(0x0400, 0x05ff).r(FUNC(apple2e_state::c100_int_bank_r)).nopw();
+ map(0x0200, 0x03ff).rw(FUNC(apple2e_state::c100_int_r), FUNC(apple2e_state::c100_w));
+ map(0x0400, 0x05ff).rw(FUNC(apple2e_state::c100_int_bank_r), FUNC(apple2e_state::c100_w));
map(0x0600, 0x07ff).r(FUNC(apple2e_state::c100_cec_r)).nopw();
map(0x0800, 0x09ff).r(FUNC(apple2e_state::c100_cec_bank_r)).nopw();
@@ -3390,8 +3390,8 @@ void apple2e_state::c100bank_map(address_map &map)
void apple2e_state::c300bank_map(address_map &map)
{
map(0x0000, 0x00ff).rw(FUNC(apple2e_state::c300_r), FUNC(apple2e_state::c300_w));
- map(0x0100, 0x01ff).r(FUNC(apple2e_state::c300_int_r)).nopw();
- map(0x0200, 0x02ff).r(FUNC(apple2e_state::c300_int_bank_r)).nopw();
+ map(0x0100, 0x01ff).rw(FUNC(apple2e_state::c300_int_r), FUNC(apple2e_state::c300_w));
+ map(0x0200, 0x02ff).rw(FUNC(apple2e_state::c300_int_bank_r), FUNC(apple2e_state::c300_w));
map(0x0300, 0x03ff).r(FUNC(apple2e_state::c300_cec_r)).nopw();
map(0x0400, 0x04ff).r(FUNC(apple2e_state::c300_cec_bank_r)).nopw();
}
@@ -4832,7 +4832,10 @@ void apple2e_state::apple2e(machine_config &config)
void apple2e_state::apple2epal(machine_config &config)
{
apple2e(config);
- m_screen->set_raw(1021800*14, (65*7)*2, 0, (40*7)*2, 312, 0, 192);
+ M6502(config.replace(), m_maincpu, 1016966);
+ m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2e_map);
+ m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline));
+ m_screen->set_raw(1016966 * 14, (65 * 7) * 2, 0, (40 * 7) * 2, 312, 0, 192);
}
void apple2e_state::mprof3(machine_config &config)
@@ -4855,7 +4858,11 @@ void apple2e_state::apple2ee(machine_config &config)
void apple2e_state::apple2eepal(machine_config &config)
{
apple2ee(config);
- m_screen->set_raw(1021800*14, (65*7)*2, 0, (40*7)*2, 312, 0, 192);
+ M65C02(config.replace(), m_maincpu, 1016966);
+ m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2e_map);
+ m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline));
+
+ m_screen->set_raw(1016966 * 14, (65 * 7) * 2, 0, (40 * 7) * 2, 312, 0, 192);
}
void apple2e_state::spectred(machine_config &config)
diff --git a/src/mame/drivers/apple2gs.cpp b/src/mame/drivers/apple2gs.cpp
index 61edd2ce1b0..e0ec82d1be6 100644
--- a/src/mame/drivers/apple2gs.cpp
+++ b/src/mame/drivers/apple2gs.cpp
@@ -2186,7 +2186,12 @@ int apple2gs_state::get_vpos()
{
// as per IIgs Tech Note #39, this is simply scanline + 250 on NTSC (262 lines),
// or scanline + 200 on PAL (312 lines)
- return ((m_screen->vpos() + BORDER_TOP) % 262) + 250;
+ int vpos = m_screen->vpos() + (511 - BORDER_TOP + 6);
+ if (vpos > 511)
+ {
+ vpos -= (511 - 250);
+ }
+ return vpos;
}
void apple2gs_state::process_clock()
@@ -4955,7 +4960,8 @@ void apple2gs_state::apple2gs(machine_config &config)
applefdintf_device::add_35(config, m_floppy[2]);
applefdintf_device::add_35(config, m_floppy[3]);
- SOFTWARE_LIST(config, "flop35_list").set_original("apple2gs");
+ SOFTWARE_LIST(config, "flop35_list").set_original("apple2gs_flop_orig"); // Until we have clean cracks, use this as the default
+ SOFTWARE_LIST(config, "flop35_misc").set_compatible("apple2gs_flop_misc"); // Legacy software list pre-June 2021 and defaced cracks
SOFTWARE_LIST(config, "flop525_clean").set_compatible("apple2_flop_clcracked"); // No filter on clean cracks yet.
SOFTWARE_LIST(config, "flop525_orig").set_compatible("apple2_flop_orig").set_filter("A2GS"); // Filter list to compatible disks for this machine.
SOFTWARE_LIST(config, "flop525_misc").set_compatible("apple2_flop_misc");
diff --git a/src/mame/drivers/apple3.cpp b/src/mame/drivers/apple3.cpp
index 1c633605b89..32262a419a8 100644
--- a/src/mame/drivers/apple3.cpp
+++ b/src/mame/drivers/apple3.cpp
@@ -26,6 +26,8 @@
#include "bus/a2bus/mouse.h"
#include "bus/a2bus/a2zipdrive.h"
#include "bus/a2bus/cmsscsi.h"
+#include "bus/a2bus/titan3plus2.h"
+#include "bus/a2bus/a2mockingboard.h"
#include "bus/rs232/rs232.h"
@@ -47,6 +49,8 @@ static void apple3_cards(device_slot_interface &device)
device.option_add("mouse", A2BUS_MOUSE); // Apple II Mouse Card
device.option_add("focusdrive", A2BUS_FOCUSDRIVE); // Focus Drive IDE card
device.option_add("cmsscsi", A2BUS_CMSSCSI); // CMS Apple II SCSI Card
+ device.option_add("titan3plus2", A2BUS_TITAN3PLUS2); // Titan /// Plus 2 card
+ device.option_add("mockingboard", A2BUS_MOCKINGBOARD);
}
static void a3_floppies(device_slot_interface &device)
diff --git a/src/mame/drivers/aristmk5.cpp b/src/mame/drivers/aristmk5.cpp
index 3537d488089..5a9223b9a9e 100644
--- a/src/mame/drivers/aristmk5.cpp
+++ b/src/mame/drivers/aristmk5.cpp
@@ -2407,6 +2407,9 @@ void aristmk5_state::aristmk5_usa_touch(machine_config &config)
ROM_REGION( 0x400000, "set_4.04.09", ROMREGION_ERASEFF ) /* setchip v4.04.09 */ \
ROM_LOAD32_WORD( "setchip v4.04.09.u7", 0x000000, 0x80000, CRC(e8e8dc75) SHA1(201fe95256459ce34fdb6f7498135ab5016d07f3) ) \
ROM_LOAD32_WORD( "setchip v4.04.09.u11", 0x000002, 0x80000, CRC(ff7a9035) SHA1(4352c4336e61947c555fdc80c61f944076f64b64) ) \
+ ROM_REGION( 0x400000, "set_4.04.09_alt", ROMREGION_ERASEFF ) /* setchip v4.04.09 alternate? u7 matches, u11 is almost identical. Checksum-16 of the dump matches what's on the label */ \
+ ROM_LOAD32_WORD( "clear_mk5_u_7_ck_eb68.u7", 0x000000, 0x80000, CRC(e8e8dc75) SHA1(201fe95256459ce34fdb6f7498135ab5016d07f3) ) \
+ ROM_LOAD32_WORD( "clear_mk5_u_11_ck_3a6f.u11", 0x000002, 0x80000, CRC(4cf70173) SHA1(f3dda0f188c035a36954048b449b9b96787709f2) ) \
ROM_REGION( 0x400000, "set_4.04.08", ROMREGION_ERASEFF ) /* setchip v4.04.08 */ \
ROM_LOAD32_WORD( "setchip v4.04.08.u7", 0x000000, 0x80000, CRC(7c4b7fe4) SHA1(39dd39c794c0cb6abc1b7503650643a8131468d1) ) \
ROM_LOAD32_WORD( "setchip v4.04.08.u11", 0x000002, 0x80000, CRC(d3234a28) SHA1(8ff112ee4aadf1d359ca8ffe0cfa9c7400aa0595) ) \
@@ -2422,6 +2425,9 @@ void aristmk5_state::aristmk5_usa_touch(machine_config &config)
ROM_REGION( 0x400000, "set_4.02.04", ROMREGION_ERASEFF ) /* setchip v4.02.04 */ \
ROM_LOAD32_WORD( "setchip v4.02.04.u7", 0x000000, 0x80000, CRC(5a254b22) SHA1(8444f237b392df2a3cb42ea349e7af32f47dd544) ) \
ROM_LOAD32_WORD( "setchip v4.02.04.u11", 0x000002, 0x80000, CRC(def36617) SHA1(c7ba5b08e884a8fb36c9fb51c08e243e32c81f89) ) \
+ ROM_REGION( 0x400000, "set_4.02.04_alt", ROMREGION_ERASEFF ) /* setchip v4.02.04, but seems to have more code and some different strings */ \
+ ROM_LOAD32_WORD( "setchip v4.02.04_alt.u7", 0x000000, 0x80000, CRC(41275334) SHA1(d4a63dbc77c2c44f6a9c72b389bd270f2137997f) ) /* _alt suffix added to avoid having same ROM labels */ \
+ ROM_LOAD32_WORD( "setchip v4.02.04_alt.u11", 0x000002, 0x80000, CRC(254e8b03) SHA1(0ed9723258d3f86b21bf132cbe2fd0bae978cd5e) ) /* _alt suffix added to avoid having same ROM labels */ \
ROM_REGION( 0x400000, "set_1.0", ROMREGION_ERASEFF ) /* setchip v1.0 */ \
ROM_LOAD32_WORD( "setchip v1.0.u7", 0x000000, 0x80000, CRC(16c2828d) SHA1(87218a76bb2791bce27b4b8ab341ba73cbbf6ffe) ) \
ROM_LOAD32_WORD( "setchip v1.0.u11", 0x000002, 0x80000, CRC(a969f12b) SHA1(fc6d234ce1f5c6b5aceb97b73aad60144352023b) )
diff --git a/src/mame/drivers/astrocde.cpp b/src/mame/drivers/astrocde.cpp
index eda7f8b7c81..d583a63f3a6 100644
--- a/src/mame/drivers/astrocde.cpp
+++ b/src/mame/drivers/astrocde.cpp
@@ -1560,7 +1560,7 @@ ROM_START( wow )
ROM_LOAD( "wow.x5", 0x8000, 0x1000, CRC(16912c2b) SHA1(faf9c96d99bc111c5f1618f6863f22fd9269027b) )
ROM_LOAD( "wow.x6", 0x9000, 0x1000, CRC(35797f82) SHA1(376bba29e88c16d95438fa996913b76581df0937) )
ROM_LOAD( "wow.x7", 0xa000, 0x1000, CRC(ce404305) SHA1(a52c6c7b77842f25c79515460be6b7ed959b5edb) )
-/* ROM_LOAD( "wow.x11", 0xc000, CRC(00001000) , ? ) here would go the foreign language ROM */
+ //ROM_LOAD( "wow.x11", 0xc000, 0x1000 NO_DUMP ) // here would go the foreign language ROM
ROM_END
diff --git a/src/mame/drivers/at.cpp b/src/mame/drivers/at.cpp
index d1f4638d029..5f91e82b478 100644
--- a/src/mame/drivers/at.cpp
+++ b/src/mame/drivers/at.cpp
@@ -1976,8 +1976,8 @@ ROM_START( ec1849 )
ROM_REGION16_LE(0x20000,"bios", 0)
ROM_LOAD16_BYTE( "cpu-card_27c256_015.rom", 0x10000, 0x8000, CRC(68eadf0a) SHA1(903a7f1c3ebc6b27c31b512b2908c483608b5c13))
ROM_LOAD16_BYTE( "cpu-card_27c256_016.rom", 0x10001, 0x8000, CRC(bc3924d6) SHA1(596be415e6c2bc4ff30a187f146664531565712c))
- //ROM_LOAD16_BYTE( "video-card_573rf6( 2764)_040.rom", 0xc0001, 0x2000, CRC(a3ece315) SHA1(e800e11c3b1b6fcaf41bfb7d4058a9d34fdd2b3f))
- //ROM_LOAD16_BYTE( "video-card_573rf6( 2764)_041.rom", 0xc0000, 0x2000, CRC(b0a2ba7f) SHA1(c8160e8bc97cd391558f1dddd3fd3ec4a19d030c))
+ //ROM_LOAD16_BYTE( "video-card_573rf6(2764)_040.rom", 0xc0001, 0x2000, CRC(a3ece315) SHA1(e800e11c3b1b6fcaf41bfb7d4058a9d34fdd2b3f))
+ //ROM_LOAD16_BYTE( "video-card_573rf6(2764)_041.rom", 0xc0000, 0x2000, CRC(b0a2ba7f) SHA1(c8160e8bc97cd391558f1dddd3fd3ec4a19d030c))
ROM_END
// Morse KP-286
diff --git a/src/mame/drivers/ave_arb.cpp b/src/mame/drivers/ave_arb.cpp
index 1ba8958eaf9..5d2273d959d 100644
--- a/src/mame/drivers/ave_arb.cpp
+++ b/src/mame/drivers/ave_arb.cpp
@@ -38,6 +38,9 @@ TODO:
******************************************************************************/
#include "emu.h"
+
+#include "bus/generic/carts.h"
+#include "bus/generic/slot.h"
#include "cpu/m6502/m6502.h"
#include "cpu/m6502/m65c02.h"
#include "video/pwm.h"
@@ -45,8 +48,6 @@ TODO:
#include "machine/6522via.h"
#include "machine/nvram.h"
#include "sound/dac.h"
-#include "bus/generic/slot.h"
-#include "bus/generic/carts.h"
#include "speaker.h"
#include "softlist.h"
@@ -148,7 +149,7 @@ void arb_state::update_reset()
DEVICE_IMAGE_LOAD_MEMBER(arb_state::cart_load)
{
u32 size = m_cart->common_get_size("rom");
- m_cart_mask = ((1 << (31 - count_leading_zeros(size))) - 1) & 0x7fff;
+ m_cart_mask = ((1 << (31 - count_leading_zeros_32(size))) - 1) & 0x7fff;
m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
diff --git a/src/mame/drivers/betacam.cpp b/src/mame/drivers/betacam.cpp
index 38f136351f9..59dacce5b1c 100644
--- a/src/mame/drivers/betacam.cpp
+++ b/src/mame/drivers/betacam.cpp
@@ -98,7 +98,8 @@ void betacam_state::betacam(machine_config &config)
m_systemcpu->set_addrmap(AS_PROGRAM, &betacam_state::system_mem_map);
m_systemcpu->p2_in_cb().set_ioport("DSW1");
- HD6475348(config, m_servocpu, 20_MHz_XTAL); //Actual chip is marked "H8/534 6435348F 10"
+ HD6435348(config, m_servocpu, 20_MHz_XTAL); //Actual chip is marked "H8/534 6435348F 10"
+ m_servocpu->set_mode(3);
m_servocpu->set_addrmap(AS_PROGRAM, &betacam_state::servo_mem_map);
//CXD1095(config, "cxdio0");
diff --git a/src/mame/drivers/bvm.cpp b/src/mame/drivers/bvm.cpp
index af931fefd7b..a6ee2d9767c 100644
--- a/src/mame/drivers/bvm.cpp
+++ b/src/mame/drivers/bvm.cpp
@@ -51,7 +51,6 @@ private:
void bvm_state::mem_map(address_map &map)
{
- // internal ROM not used here?
map(0x00000, 0x0f67f).rw("flash", FUNC(intelfsh8_device::read), FUNC(intelfsh8_device::write));
map(0x10000, 0x17fff).ram().share("nvram");
map(0x18000, 0x18007).rw("cxdio0", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write));
@@ -66,6 +65,7 @@ INPUT_PORTS_END
void bvm_state::bvm(machine_config &config)
{
HD6435368(config, m_maincpu, 20_MHz_XTAL);
+ m_maincpu->set_mode(3); // internal ROM not used here?
m_maincpu->set_addrmap(AS_PROGRAM, &bvm_state::mem_map);
CAT28F020(config, "flash");
diff --git a/src/mame/drivers/cbm2.cpp b/src/mame/drivers/cbm2.cpp
index f9f45d9e660..6a4e1eb5cd6 100644
--- a/src/mame/drivers/cbm2.cpp
+++ b/src/mame/drivers/cbm2.cpp
@@ -81,7 +81,7 @@ public:
m_ieee2(*this, DS75161A_TAG),
m_joy1(*this, CONTROL1_TAG),
m_joy2(*this, CONTROL2_TAG),
- m_exp(*this, CBM2_EXPANSION_SLOT_TAG),
+ m_exp(*this, "exp"),
m_user(*this, USER_PORT_TAG),
m_ram(*this, RAM_TAG),
m_cassette(*this, PET_DATASSETTE_PORT_TAG),
diff --git a/src/mame/drivers/cclimber.cpp b/src/mame/drivers/cclimber.cpp
index b728d654aec..cf812895208 100644
--- a/src/mame/drivers/cclimber.cpp
+++ b/src/mame/drivers/cclimber.cpp
@@ -1606,7 +1606,7 @@ ROM_START( cclimbrrod )
ROM_END
-/* Sets below are Crazy Kong Part II and have an extra screen in attract mode, showing a caged Kong and copyright */
+// Sets below are Crazy Kong Part II and have an extra screen in attract mode, showing a caged Kong and copyright
ROM_START( ckongpt2 )
ROM_REGION( 0x6000, "maincpu", 0 )
@@ -1724,6 +1724,34 @@ ROM_START( ckongpt2jeu )
ROM_LOAD( "13.5p", 0x1000, 0x1000, CRC(9003ffbd) SHA1(fd016056aabc23957643f37230f03842294f795e) )
ROM_END
+ROM_START( ckongpt2ss )
+ ROM_REGION( 0x6000, "maincpu", 0 )
+ ROM_LOAD( "ck2_7.5d", 0x0000, 0x1000, CRC(b27df032) SHA1(57f9be139c610405e3c2fddd7093dfb1277e450e) )
+ ROM_LOAD( "ck2_8.5e", 0x1000, 0x1000, CRC(5dc1aaba) SHA1(42b9e5946ffce7c156d114bde68f37c2c34853c4) )
+ ROM_LOAD( "ck2_9.5h", 0x2000, 0x1000, CRC(c9054c94) SHA1(1aa08d2501ee620759fd5c111e12f6d432c25294) )
+ ROM_LOAD( "ck_10.5k", 0x3000, 0x1000, CRC(923420cb) SHA1(51f809c92a1e7483debbf29e77364d0ab3b863e6) ) // unique
+ ROM_LOAD( "ck2_11.5l", 0x4000, 0x1000, CRC(ae159192) SHA1(d467256a3a366e246243e7828ff4a45d4c146e2c) )
+ ROM_LOAD( "ck_12.5n", 0x5000, 0x1000, CRC(25a015d3) SHA1(8b932cb9ae1ba67b4ff86b7b97be0c31cef23514) ) // unique
+
+ ROM_REGION( 0x4000, "gfx1", 0 )
+ ROM_LOAD( "ck2_6.11n", 0x0000, 0x1000, CRC(2dcedd12) SHA1(dfdcfc21bcba7c8e148ee54daae511ca78c58e70) )
+ ROM_LOAD( "ck2_5.11l", 0x1000, 0x1000, CRC(fa7cbd91) SHA1(0208d2ebc59f3600005476b6987472685bc99d67) )
+ ROM_LOAD( "ck2_4.11k", 0x2000, 0x1000, CRC(3375b3bd) SHA1(a00b3c31cff123aab6ac0833aabfdd663302971a) )
+ ROM_LOAD( "ck2_3.11h", 0x3000, 0x1000, CRC(5655cc11) SHA1(5195e9b2a60c54280b48b32ee8248090904dbc51) )
+
+ ROM_REGION( 0x1000, "gfx2", 0 )
+ ROM_LOAD( "ck2_2.11c", 0x0000, 0x0800, CRC(d1352c31) SHA1(da726a63a8be830d695afeddc1717749af8c9d47) )
+ ROM_LOAD( "ck2_1.11a", 0x0800, 0x0800, CRC(a7a2fdbd) SHA1(529865f8bbfbdbbf34ac39c70ef17e6d5bd0f845) )
+
+ ROM_REGION( 0x0060, "proms", 0 )
+ ROM_LOAD( "mb7051.v6", 0x0000, 0x0020, CRC(b3fc1505) SHA1(5b94adde0428a26b815c7eb9b3f3716470d349c7) )
+ ROM_LOAD( "mb7051.u6", 0x0020, 0x0020, CRC(26aada9e) SHA1(f59645e606ea4f0dd0fc4ea47dd03f526c534941) )
+ ROM_LOAD( "mb7051.t6", 0x0040, 0x0020, CRC(676b3166) SHA1(29b9434cd34d43ea5664e436e2a24b54f8d88aac) )
+
+ ROM_REGION( 0x2000, "cclimber_audio:samples", 0 )
+ ROM_LOAD( "14.5s", 0x0000, 0x1000, CRC(5f0bcdfb) SHA1(7f79bf6de117348f606696ed7ea1937bbf926612) )
+ ROM_LOAD( "13.5p", 0x1000, 0x1000, CRC(9003ffbd) SHA1(fd016056aabc23957643f37230f03842294f795e) )
+ROM_END
ROM_START( ckongpt2b )
ROM_REGION( 0x6000, "maincpu", 0 )
@@ -1783,7 +1811,7 @@ ROM_START( ckongpt2b2 )
ROM_LOAD( "6.bin", 0x1000, 0x1000, CRC(9003ffbd) SHA1(fd016056aabc23957643f37230f03842294f795e) )
ROM_END
-/* Sets below are 'Crazy Kong' without the extra Falcon screen or Pt. 2 subtitle, they also have worse colours */
+// Sets below are 'Crazy Kong' without the extra Falcon screen or Pt. 2 subtitle, they also have worse colours
ROM_START( ckong )
ROM_REGION( 0x6000, "maincpu", 0 )
@@ -2732,50 +2760,51 @@ void cclimber_state::init_rpatrol()
}
-GAME( 1980, cclimber, 0, cclimberx, cclimber, cclimber_state, init_cclimber, ROT0, "Nichibutsu", "Crazy Climber (US set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, cclimbera, cclimber, cclimberx, cclimber, cclimber_state, init_cclimber, ROT0, "Nichibutsu", "Crazy Climber (US set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, cclimberj, cclimber, cclimberx, cclimberj, cclimber_state, init_cclimberj, ROT0, "Nichibutsu", "Crazy Climber (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, ccboot, cclimber, cclimberx, cclimber, cclimber_state, init_cclimberj, ROT0, "bootleg", "Crazy Climber (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, ccboot2, cclimber, cclimberx, cclimber, cclimber_state, init_cclimberj, ROT0, "bootleg", "Crazy Climber (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, ccbootmr, cclimber, cclimberx, cclimber, cclimber_state, init_cclimberj, ROT0, "bootleg (Model Racing)", "Crazy Climber (Model Racing bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, cclimber, 0, cclimberx, cclimber, cclimber_state, init_cclimber, ROT0, "Nichibutsu", "Crazy Climber (US set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, cclimbera, cclimber, cclimberx, cclimber, cclimber_state, init_cclimber, ROT0, "Nichibutsu", "Crazy Climber (US set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, cclimberj, cclimber, cclimberx, cclimberj, cclimber_state, init_cclimberj, ROT0, "Nichibutsu", "Crazy Climber (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, ccboot, cclimber, cclimberx, cclimber, cclimber_state, init_cclimberj, ROT0, "bootleg", "Crazy Climber (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, ccboot2, cclimber, cclimberx, cclimber, cclimber_state, init_cclimberj, ROT0, "bootleg", "Crazy Climber (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, ccbootmr, cclimber, cclimberx, cclimber, cclimber_state, init_cclimberj, ROT0, "bootleg (Model Racing)", "Crazy Climber (Model Racing bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, cclimbroper, cclimber, cclimber, cclimber, cclimber_state, empty_init, ROT0, "bootleg (Operamatic)", "Crazy Climber (Spanish, Operamatic bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, cclimbrrod, cclimber, cclimber, cclimber, cclimber_state, empty_init, ROT0, "bootleg (Rodmar)", "Crazy Climber (Spanish, Rodmar bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, cclimbrrod, cclimber, cclimber, cclimber, cclimber_state, empty_init, ROT0, "bootleg (Rodmar)", "Crazy Climber (Spanish, Rodmar bootleg)", MACHINE_SUPPORTS_SAVE )
/* these sets have ugly colours, no extra attract screen, and no graphics for the extra attract screen in the BG roms
- there is a Falcon logo in the text roms which is unused
- does the code to display the extra screen still exist in the roms? */
-GAME( 1981, ckong, 0, cclimber, ckong, cclimber_state, empty_init, ROT270, "Kyoei / Falcon", "Crazy Kong", MACHINE_SUPPORTS_SAVE ) // on a Falcon FCK-01 PCB, but doesn't display any Falcon copyright
-GAME( 1981, ckongalc, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg (Alca)", "Crazy Kong (Alca bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, monkeyd, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg", "Monkey Donkey", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, dking, ckong, cclimber, ckong, cclimber_state, init_dking, ROT270, "bootleg", "Donkey King", MACHINE_SUPPORTS_SAVE ) // supposedly, possibly by Hafasonic?
+GAME( 1981, ckong, 0, cclimber, ckong, cclimber_state, empty_init, ROT270, "Kyoei / Falcon", "Crazy Kong", MACHINE_SUPPORTS_SAVE ) // on a Falcon FCK-01 PCB, but doesn't display any Falcon copyright
+GAME( 1981, ckongalc, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg (Alca)", "Crazy Kong (Alca bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, monkeyd, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg", "Monkey Donkey", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, dking, ckong, cclimber, ckong, cclimber_state, init_dking, ROT270, "bootleg", "Donkey King", MACHINE_SUPPORTS_SAVE ) // supposedly, possibly by Hafasonic?
GAME( 1981, ckongdks, ckong, cclimber, ckong, cclimber_state, init_dking, ROT270, "bootleg", "Donkey Kong (Spanish Crazy Kong bootleg)", MACHINE_SUPPORTS_SAVE )
/* these sets have correct colours, and also contain the graphics used for the extra attract screen in the BG roms, but it is unused
- the Falcon logo in the text roms is still unused
- does the code to display the extra screen still exist in the roms? */
GAME( 1981, ckongo, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg (Orca)", "Crazy Kong (Orca bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, bigkong, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg", "Big Kong", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, bigkong, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg", "Big Kong", MACHINE_SUPPORTS_SAVE )
/* these sets have correct colours, and the extra attract screen, they also make use of the Falcon logo, some sets hack out the Falcon
text on the extra screen */
-GAME( 1981, ckongpt2, 0, cclimber, ckong, cclimber_state, empty_init, ROT270, "Falcon", "Crazy Kong Part II (set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, ckongpt2a, ckongpt2, cclimber, ckong, cclimber_state, empty_init, ROT270, "Falcon", "Crazy Kong Part II (set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, ckongpt2j, ckongpt2, cclimber, ckong, cclimber_state, empty_init, ROT270, "Falcon", "Crazy Kong Part II (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, ckongpt2jeu, ckongpt2, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg (Jeutel)", "Crazy Kong Part II (Jeutel bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, ckongpt2b, ckongpt2, ckongb, ckongb, cclimber_state, init_ckongb, ROT270, "bootleg", "Crazy Kong Part II (alternative levels)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, ckongpt2b2, ckongpt2, cclimber, ckongb2, cclimber_state, empty_init, ROT270, "bootleg", "Crazy Kong Part II (bootleg)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) // one PROM differs and seems bad, but dump has been confirmed on multiple PCBs
+GAME( 1981, ckongpt2, 0, cclimber, ckong, cclimber_state, empty_init, ROT270, "Falcon", "Crazy Kong Part II (set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, ckongpt2a, ckongpt2, cclimber, ckong, cclimber_state, empty_init, ROT270, "Falcon", "Crazy Kong Part II (set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, ckongpt2j, ckongpt2, cclimber, ckong, cclimber_state, empty_init, ROT270, "Falcon", "Crazy Kong Part II (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, ckongpt2jeu, ckongpt2, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg (Jeutel)", "Crazy Kong Part II (Jeutel bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, ckongpt2ss, ckongpt2, cclimber, ckongb2, cclimber_state, empty_init, ROT270, "bootleg (SegaSA / Sonic)", "Crazy Kong (SegaSA / Sonic bootleg)", MACHINE_SUPPORTS_SAVE ) // on a Falcon FCK-00 PCB
+GAME( 1981, ckongpt2b, ckongpt2, ckongb, ckongb, cclimber_state, init_ckongb, ROT270, "bootleg", "Crazy Kong Part II (alternative levels)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, ckongpt2b2, ckongpt2, cclimber, ckongb2, cclimber_state, empty_init, ROT270, "bootleg", "Crazy Kong Part II (bootleg)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) // one PROM differs and seems bad, but dump has been confirmed on multiple PCBs
// see bagman.cpp for parent
GAME( 1982, bagmanf, bagman, bagmanf, bagmanf, cclimber_state, empty_init, ROT270, "bootleg", "Le Bagnard (bootleg on Crazy Kong hardware)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, rpatrol, 0, rpatrol, rpatrol, cclimber_state, init_rpatrol, ROT0, "Orca", "River Patrol (Japan)", MACHINE_SUPPORTS_SAVE)
+GAME( 1981, rpatrol, 0, rpatrol, rpatrol, cclimber_state, init_rpatrol, ROT0, "Orca", "River Patrol (Japan)", MACHINE_SUPPORTS_SAVE)
GAME( 1981, rpatroln, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "Orca", "River Patrol (Japan, unprotected)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, rpatrolb, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "bootleg", "River Patrol (bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, silvland, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "Falcon", "Silver Land", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, rpatrolb, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "bootleg", "River Patrol (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, silvland, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "Falcon", "Silver Land", MACHINE_SUPPORTS_SAVE )
// see pacman.cpp for parent
-GAME( 1985, cannonb, cannonbp, cannonb, cannonb, cclimber_state, init_cannonb, ROT90, "bootleg (Soft)", "Cannon Ball (bootleg on Crazy Kong hardware) (set 1, buggy)" , MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // bootleggers missed protection after bonus game
-GAME( 1985, cannonb2, cannonbp, cannonb, cannonb, cclimber_state, init_cannonb2, ROT90, "bootleg (TV Game Gruenberg)", "Cannon Ball (bootleg on Crazy Kong hardware) (set 2, buggy)", MACHINE_SUPPORTS_SAVE ) // bootleggers missed protection after bonus game
+GAME( 1985, cannonb, cannonbp, cannonb, cannonb, cclimber_state, init_cannonb, ROT90, "bootleg (Soft)", "Cannon Ball (bootleg on Crazy Kong hardware) (set 1, buggy)" , MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // bootleggers missed protection after bonus game
+GAME( 1985, cannonb2, cannonbp, cannonb, cannonb, cclimber_state, init_cannonb2, ROT90, "bootleg (TV Game Gruenberg)", "Cannon Ball (bootleg on Crazy Kong hardware) (set 2, buggy)", MACHINE_SUPPORTS_SAVE ) // bootleggers missed protection after bonus game
GAME( 1985, cannonb3, cannonbp, cannonb, cannonb, cclimber_state, init_cannonb2, ROT90, "bootleg (Soft)", "Cannon Ball (bootleg on Crazy Kong hardware) (set 3, no bonus game)", MACHINE_SUPPORTS_SAVE ) // the bonus game is patched out, thus avoiding the protection issue
GAME( 1982, swimmer, 0, swimmer, swimmer, cclimber_state, empty_init, ROT0, "Tehkan", "Swimmer (set 1)", MACHINE_SUPPORTS_SAVE )
@@ -2785,7 +2814,7 @@ GAME( 1982, swimmerb, swimmer, swimmer, swimmerb, cclimber_state, empty_i
GAME( 1983, guzzler, 0, guzzler, guzzler, cclimber_state, empty_init, ROT90, "Tehkan", "Guzzler", MACHINE_SUPPORTS_SAVE )
GAME( 1983, guzzlers, guzzler, guzzler, guzzler, cclimber_state, empty_init, ROT90, "Tehkan", "Guzzler (Swimmer Conversion)", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, yamato, 0, yamato, yamato, cclimber_state, init_yamato, ROT90, "Sega", "Yamato (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1983, yamato, 0, yamato, yamato, cclimber_state, init_yamato, ROT90, "Sega", "Yamato (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1983, yamato2, yamato, yamato, yamato, cclimber_state, init_yamato, ROT90, "Sega", "Yamato (World?)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1983, toprollr, 0, toprollr, toprollr, cclimber_state, init_toprollr, ROT90, "Jaleco", "Top Roller", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/chexx.cpp b/src/mame/drivers/chexx.cpp
index ab185f04337..40fa111d5c5 100644
--- a/src/mame/drivers/chexx.cpp
+++ b/src/mame/drivers/chexx.cpp
@@ -71,6 +71,9 @@ exact clone of the 1st generation ICE Chexx hardware (https://www.recreativas.or
| x2 T74LS365B1 x2 |
|___________ COST _____________ TIME ___|
+The electromechanical game Fire Escape (1984, Mech-Tronic Games, Inc.)
+appears to run on very similar hardware, with a AY8912 but no Digitalker.
+
***************************************************************************/
#include "emu.h"
diff --git a/src/mame/drivers/decmate2.cpp b/src/mame/drivers/decmate2.cpp
index 40d52bd0357..ea7b1420a31 100644
--- a/src/mame/drivers/decmate2.cpp
+++ b/src/mame/drivers/decmate2.cpp
@@ -966,17 +966,18 @@ void decmate2_state::pc238(machine_config &config)
ROM_START(decmate2)
ROM_REGION16_BE(0x2000, "cprom", 0)
- //ROM_LOAD16_BYTE("23-399e2.e113", 0x0000, 0x0800, NO_DUMP) // 0000-3777, bits 0:7 (to be shifted)
- //ROM_LOAD16_BYTE("23-400e2.e114", 0x1000, 0x0800, NO_DUMP) // 4000-7777, bits 0:7 (to be shifted)
- //ROM_LOAD16_BYTE("23-401e2.e115", 0x0001, 0x0800, NO_DUMP) // 0000-3777 & 4000-7777, bits 8:11 (to be split up)
- ROM_SYSTEM_BIOS(0, "19h", "19H (2310)")
- ROMX_LOAD("23-390e2.e113", 0x0000, 0x0800, CRC(9b19451a) SHA1(ed26557f17f59ce05ca08b34a05a24a97388dfe0), ROM_BIOS(0) | ROM_SKIP(1))
- ROMX_LOAD("23-391e2.e114", 0x1000, 0x0800, CRC(3a09ada1) SHA1(3093bd926d49c2fd62a773e8019e3755aa165ae9), ROM_BIOS(0) | ROM_SKIP(1))
- ROMX_LOAD("23-392e2.e115", 0x0001, 0x0800, CRC(19901cb6) SHA1(82a642d2b5b56250611f69321d0251e27fa639fc), ROM_BIOS(0) | ROM_SKIP(1))
- ROM_SYSTEM_BIOS(1, "31z", "31Z (3732)") // Regenerated from source code listing
- ROMX_LOAD("23-358e2.e113", 0x0000, 0x0800, BAD_DUMP CRC(e6b9ab4d) SHA1(12533bab586b7bc753fae3ce1959bc5ced3905f5), ROM_BIOS(1) | ROM_SKIP(1))
- ROMX_LOAD("23-359e2.e114", 0x1000, 0x0800, BAD_DUMP CRC(3d1825b7) SHA1(753af9657eef1a284801c9765f4899563d3d9a20), ROM_BIOS(1) | ROM_SKIP(1))
- ROMX_LOAD("23-360e2.e115", 0x0001, 0x0800, BAD_DUMP CRC(ed8162e6) SHA1(4ab993c00a5afc6465153ca4f52faa76e02a0ef3), ROM_BIOS(1) | ROM_SKIP(1))
+ ROM_SYSTEM_BIOS(0, "19n", "19N (2316)")
+ ROMX_LOAD("23-399e2.e113", 0x0000, 0x0800, CRC(2881252e) SHA1(5825bc00833dd33f294f79df11200dce76e78740), ROM_BIOS(0) | ROM_SKIP(1)) // 0000-3777, bits 0:7 (to be shifted)
+ ROMX_LOAD("23-400e2.e114", 0x1000, 0x0800, CRC(b6f79f77) SHA1(131a1c28c7d1c90dc1b6c85194f84f120cc60bd9), ROM_BIOS(0) | ROM_SKIP(1)) // 4000-7777, bits 0:7 (to be shifted)
+ ROMX_LOAD("23-401e2.e115", 0x0001, 0x0800, CRC(1076b630) SHA1(7be4c30d512b4f86f645cb7a3a20122ee4187759), ROM_BIOS(0) | ROM_SKIP(1)) // 0000-3777 & 4000-7777, bits 8:11 (to be split up)
+ ROM_SYSTEM_BIOS(1, "19h", "19H (2310)")
+ ROMX_LOAD("23-390e2.e113", 0x0000, 0x0800, CRC(9b19451a) SHA1(ed26557f17f59ce05ca08b34a05a24a97388dfe0), ROM_BIOS(1) | ROM_SKIP(1))
+ ROMX_LOAD("23-391e2.e114", 0x1000, 0x0800, CRC(3a09ada1) SHA1(3093bd926d49c2fd62a773e8019e3755aa165ae9), ROM_BIOS(1) | ROM_SKIP(1))
+ ROMX_LOAD("23-392e2.e115", 0x0001, 0x0800, CRC(19901cb6) SHA1(82a642d2b5b56250611f69321d0251e27fa639fc), ROM_BIOS(1) | ROM_SKIP(1))
+ ROM_SYSTEM_BIOS(2, "31z", "31Z (3732)") // Regenerated from source code listing
+ ROMX_LOAD("23-358e2.e113", 0x0000, 0x0800, BAD_DUMP CRC(e6b9ab4d) SHA1(12533bab586b7bc753fae3ce1959bc5ced3905f5), ROM_BIOS(2) | ROM_SKIP(1))
+ ROMX_LOAD("23-359e2.e114", 0x1000, 0x0800, BAD_DUMP CRC(3d1825b7) SHA1(753af9657eef1a284801c9765f4899563d3d9a20), ROM_BIOS(2) | ROM_SKIP(1))
+ ROMX_LOAD("23-360e2.e115", 0x0001, 0x0800, BAD_DUMP CRC(ed8162e6) SHA1(4ab993c00a5afc6465153ca4f52faa76e02a0ef3), ROM_BIOS(2) | ROM_SKIP(1))
ROM_REGION(0x1000, "rxcpu", 0)
ROM_LOAD("23-008m1.e27", 0x0000, 0x1000, CRC(fae4026b) SHA1(388e093d952ce1f6fcf2dcdab5b5099a6aafad0f))
diff --git a/src/mame/drivers/dragon.cpp b/src/mame/drivers/dragon.cpp
index 2b73e06162b..d1a3ae16d40 100644
--- a/src/mame/drivers/dragon.cpp
+++ b/src/mame/drivers/dragon.cpp
@@ -21,23 +21,9 @@
#include "formats/dmk_dsk.h"
#include "formats/sdf_dsk.h"
#include "imagedev/floppy.h"
+#include "bus/coco/cococart.h"
#include "bus/rs232/rs232.h"
-#include "bus/coco/coco_gmc.h"
-#include "bus/coco/coco_orch90.h"
-#include "bus/coco/coco_max.h"
-#include "bus/coco/coco_midi.h"
-#include "bus/coco/coco_pak.h"
-#include "bus/coco/coco_psg.h"
-#include "bus/coco/coco_ram.h"
-#include "bus/coco/coco_ssc.h"
-#include "bus/coco/coco_stecomp.h"
-#include "bus/coco/coco_sym12.h"
-#include "bus/coco/dragon_amtor.h"
-#include "bus/coco/dragon_fdc.h"
-#include "bus/coco/dragon_jcbsnd.h"
-#include "bus/coco/dragon_jcbspch.h"
-#include "bus/coco/dragon_sprites.h"
//**************************************************************************
@@ -153,10 +139,10 @@ static INPUT_PORTS_START( dragon_keyboard )
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_CODE(KEYCODE_X) PORT_CHAR('X')
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("UP") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP), '^')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("DOWN") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN), 10) PORT_CHAR('[')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("LEFT") PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(UCHAR_MAMEKEY(LEFT), 8)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT), 9) PORT_CHAR(']')
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME(u8"\u2191") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP), '^')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME(u8"\u2193") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN), 10) PORT_CHAR('[')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME(u8"\u2190") PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(UCHAR_MAMEKEY(LEFT), 8)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME(u8"\u2192") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT), 9) PORT_CHAR(']')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
PORT_START("row6")
@@ -171,23 +157,23 @@ static INPUT_PORTS_START( dragon200e_keyboard )
PORT_INCLUDE(dragon_keyboard)
PORT_MODIFY("row0")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("0 \xC3\x87") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(0xC7)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME(u8"0 \u00c7") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(0xC7)
PORT_MODIFY("row1")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("\xC3\x91") PORT_CODE(KEYCODE_COLON) PORT_CHAR(0xD1)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME(u8"\u00d1") PORT_CODE(KEYCODE_COLON) PORT_CHAR(0xD1)
PORT_MODIFY("row2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(';') PORT_CHAR('+')
PORT_MODIFY("row5")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("UP") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP), '^') PORT_CHAR('_')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("DOWN \xC2\xA1") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(10) PORT_CHAR(0xA1)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("RIGHT \xC2\xBF") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(9) PORT_CHAR(0xBF)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME(u8"\u2191") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP), '^') PORT_CHAR('_')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME(u8"\u2193 \u00a1") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(10) PORT_CHAR(0xA1)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME(u8"\u2192 \u00bf") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(9) PORT_CHAR(0xBF)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_CHAR(0xA7)
PORT_MODIFY("row6")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("CLEAR @") PORT_CODE(KEYCODE_HOME) PORT_CHAR(12) PORT_CHAR('@')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME("BREAK \xC3\xBC") PORT_CODE(KEYCODE_END) PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) PORT_CHAR(0xFC)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, dragon_state, keyboard_changed, 0) PORT_NAME(u8"BREAK \u00fc") PORT_CODE(KEYCODE_END) PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) PORT_CHAR(0xFC)
INPUT_PORTS_END
static INPUT_PORTS_START( dragon )
@@ -209,23 +195,9 @@ INPUT_PORTS_END
void dragon_cart(device_slot_interface &device)
{
- device.option_add_internal("amtor", DRAGON_AMTOR);
- device.option_add("ccpsg", COCO_PSG);
- device.option_add("dragon_fdc", DRAGON_FDC);
- device.option_add("gmc", COCO_PAK_GMC);
- device.option_add("jcbsnd", DRAGON_JCBSND);
- device.option_add("jcbspch", DRAGON_JCBSPCH);
- device.option_add("max", COCO_PAK_MAX);
- device.option_add("midi", DRAGON_MIDI);
- device.option_add("orch90", COCO_ORCH90);
- device.option_add("pak", COCO_PAK);
- device.option_add("premier_fdc", PREMIER_FDC);
- device.option_add("ram", COCO_PAK_RAM);
- device.option_add("sdtandy_fdc", SDTANDY_FDC);
- device.option_add("sprites", DRAGON_SPRITES);
- device.option_add("ssc", COCO_SSC);
- device.option_add("stecomp", COCO_STEREO_COMPOSER);
- device.option_add("sym12", COCO_SYM12);
+ dragon_cart_add_basic_devices(device);
+ dragon_cart_add_fdcs(device);
+ dragon_cart_add_multi_pak(device);
}
void dragon_alpha_state::dragon_formats(format_registration &fr)
@@ -553,7 +525,7 @@ ROM_END
#define rom_dragon64h rom_dragon64
#define rom_tanodr64h rom_tanodr64
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1982, dragon32, 0, 0, dragon32, dragon, dragon_state, empty_init, "Dragon Data Ltd", "Dragon 32", 0 )
COMP( 1983, dragon64, dragon32, 0, dragon64, dragon, dragon64_state, empty_init, "Dragon Data Ltd", "Dragon 64", 0 )
COMP( 19??, dragon64h, dragon32, 0, dragon64h, dragon, dragon64_state, empty_init, "Dragon Data Ltd", "Dragon 64 (HD6309E CPU)", MACHINE_UNOFFICIAL )
diff --git a/src/mame/drivers/dynadice.cpp b/src/mame/drivers/dynadice.cpp
index 5aef7ba1fd9..c33fbc5372e 100644
--- a/src/mame/drivers/dynadice.cpp
+++ b/src/mame/drivers/dynadice.cpp
@@ -154,7 +154,7 @@ void dynadice_state::dynadice_sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).r("soundlatch", FUNC(generic_latch_8_device::read));
- map(0x01, 0x01).w("soundlatch", FUNC(generic_latch_8_device::write));
+ map(0x01, 0x01).w("soundlatch", FUNC(generic_latch_8_device::clear_w));
map(0x02, 0x02).w(FUNC(dynadice_state::sound_data_w));
map(0x03, 0x03).w(FUNC(dynadice_state::sound_control_w));
}
diff --git a/src/mame/drivers/exidy.cpp b/src/mame/drivers/exidy.cpp
index 2f7e668a320..415b9b0afaf 100644
--- a/src/mame/drivers/exidy.cpp
+++ b/src/mame/drivers/exidy.cpp
@@ -1236,41 +1236,41 @@ ROM_END
ROM_START( spectar )
ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "spl11a-3", 0x1000, 0x0800, CRC(08880aff) SHA1(3becef348245ff4c8b0aae4a14751ab740b7d160) )
- ROM_LOAD( "spl10a-2", 0x1800, 0x0800, CRC(fca667c1) SHA1(168426f9e87c002d2673c0230fceac4d0831d594) )
- ROM_LOAD( "spl9a-3", 0x2000, 0x0800, CRC(9d4ce8ba) SHA1(2ef45c225fe704e49d10247c3eba1ef14141b3b7) )
- ROM_LOAD( "spl8a-2", 0x2800, 0x0800, CRC(cfacbadf) SHA1(77b27cf6f35e8e8dd2fd4f31bba2a96f3076163e) )
- ROM_LOAD( "spl7a-2", 0x3000, 0x0800, CRC(4c4741ff) SHA1(8de72613a385095253bb9e6da76493caec3115e4) )
- ROM_LOAD( "spl6a-2", 0x3800, 0x0800, CRC(0cb46b25) SHA1(65c5d2cc8df67225339dc8781dd29d4b57ded70c) )
+ ROM_LOAD( "spl11a-3.11a", 0x1000, 0x0800, CRC(08880aff) SHA1(3becef348245ff4c8b0aae4a14751ab740b7d160) )
+ ROM_LOAD( "spl10a-2.10a", 0x1800, 0x0800, CRC(fca667c1) SHA1(168426f9e87c002d2673c0230fceac4d0831d594) )
+ ROM_LOAD( "spl9a-3.9a", 0x2000, 0x0800, CRC(9d4ce8ba) SHA1(2ef45c225fe704e49d10247c3eba1ef14141b3b7) )
+ ROM_LOAD( "spl8a-2.8a", 0x2800, 0x0800, CRC(cfacbadf) SHA1(77b27cf6f35e8e8dd2fd4f31bba2a96f3076163e) )
+ ROM_LOAD( "spl7a-2.7a", 0x3000, 0x0800, CRC(4c4741ff) SHA1(8de72613a385095253bb9e6da76493caec3115e4) )
+ ROM_LOAD( "spl6a-2.6a", 0x3800, 0x0800, CRC(0cb46b25) SHA1(65c5d2cc8df67225339dc8781dd29d4b57ded70c) )
ROM_REGION( 0x0400, "gfx1", 0 )
- ROM_LOAD( "hrl11d-2", 0x0000, 0x0400, CRC(c55b645d) SHA1(0c18277939d74e3e1281a7f114a34781d30c2baf) ) /* this is actually not used (all FF) */
- ROM_CONTINUE( 0x0000, 0x0400 ) /* overwrite with the real one */
+ ROM_LOAD( "hrl11d-2.11d", 0x0000, 0x0400, CRC(c55b645d) SHA1(0c18277939d74e3e1281a7f114a34781d30c2baf) ) /* this is actually not used (all FF) */
+ ROM_CONTINUE( 0x0000, 0x0400 ) /* overwrite with the real one */
- ROM_REGION( 0x0140, "proms", 0 ) // were dumped from a bootleg, very probably they are the same, but marked as bad dump for precaution. The 2 6331 match the Targ ones.
- ROM_LOAD( "prom.5c", 0x0000, 0x0100, BAD_DUMP CRC(9ca2e061) SHA1(4111325b00a1017042d55c59308d41e8333ba627) ) // 6301 according to the Spectar manual
- ROM_LOAD( "prom.6d", 0x0100, 0x0020, BAD_DUMP CRC(e26f9053) SHA1(eec35b6aa2c2d305418306bf4a1754a0583f109f) ) // 6331 according to the Spectar manual
- ROM_LOAD( "hrl14h-1", 0x0120, 0x0020, BAD_DUMP CRC(f76b4fcf) SHA1(197e0cc508ffeb5cefa4046bdfb158939d598225) ) // 6331 according to the Spectar manual
+ ROM_REGION( 0x0140, "proms", 0 )
+ ROM_LOAD( "spl5c-2.5c", 0x0000, 0x0100, CRC(9ca2e061) SHA1(4111325b00a1017042d55c59308d41e8333ba627) ) // 6301 according to the Spectar manual, also seen as IM 5623CPE on PCB
+ ROM_LOAD( "prom.6d", 0x0100, 0x0020, BAD_DUMP CRC(e26f9053) SHA1(eec35b6aa2c2d305418306bf4a1754a0583f109f) ) // screen controller PROM, 6331 according to the Spectar manual, dumped from a bootleg
+ ROM_LOAD( "hrl14h-1.14h", 0x0120, 0x0020, CRC(f76b4fcf) SHA1(197e0cc508ffeb5cefa4046bdfb158939d598225) ) // 6331 according to the Spectar manual
ROM_END
ROM_START( spectar1 )
ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "spl12a1", 0x0800, 0x0800, CRC(7002efb4) SHA1(fbb19ccd2aee49b78606eadcbef94e842e1be905) )
- ROM_LOAD( "spl11a1", 0x1000, 0x0800, CRC(8eb8526a) SHA1(0c42ee073fc73c89731dec4e3ecfc82c9b8301e9) )
- ROM_LOAD( "spl10a1", 0x1800, 0x0800, CRC(9d169b3d) SHA1(bee9d029df6e2fba24a5ba41a76f1658e9038838) )
- ROM_LOAD( "spl9a1", 0x2000, 0x0800, CRC(40e3eba1) SHA1(197aaed9a6159b6f3e347c0446be9e44733c1341) )
- ROM_LOAD( "spl8a1", 0x2800, 0x0800, CRC(64d8eb84) SHA1(a249c832ea951fddc6699f7ac0b4486e8a5be98e) )
- ROM_LOAD( "spl7a1", 0x3000, 0x0800, CRC(e08b0d8d) SHA1(6ffd6f8fb50c9fc09c38f56da7d6d005b66e78cc) )
- ROM_LOAD( "spl6a1", 0x3800, 0x0800, CRC(f0e4e71a) SHA1(5487a94650c964a7ab07f30aacab0b470dcb3b40) )
-
- ROM_REGION( 0x0400, "gfx1", 0 )
- ROM_LOAD( "hrl11d-2", 0x0000, 0x0400, CRC(c55b645d) SHA1(0c18277939d74e3e1281a7f114a34781d30c2baf) ) /* this is actually not used (all FF) */
- ROM_CONTINUE( 0x0000, 0x0400 ) /* overwrite with the real one */
+ ROM_LOAD( "spl12a-1.12a", 0x0800, 0x0800, CRC(7002efb4) SHA1(fbb19ccd2aee49b78606eadcbef94e842e1be905) )
+ ROM_LOAD( "spl11a-1.11a", 0x1000, 0x0800, CRC(8eb8526a) SHA1(0c42ee073fc73c89731dec4e3ecfc82c9b8301e9) )
+ ROM_LOAD( "spl10a-1.10a", 0x1800, 0x0800, CRC(9d169b3d) SHA1(bee9d029df6e2fba24a5ba41a76f1658e9038838) )
+ ROM_LOAD( "spl9a-1.9a", 0x2000, 0x0800, CRC(40e3eba1) SHA1(197aaed9a6159b6f3e347c0446be9e44733c1341) )
+ ROM_LOAD( "spl8a-1.8a", 0x2800, 0x0800, CRC(64d8eb84) SHA1(a249c832ea951fddc6699f7ac0b4486e8a5be98e) )
+ ROM_LOAD( "spl7a-1.7a", 0x3000, 0x0800, CRC(e08b0d8d) SHA1(6ffd6f8fb50c9fc09c38f56da7d6d005b66e78cc) )
+ ROM_LOAD( "spl6a-1.6a", 0x3800, 0x0800, CRC(f0e4e71a) SHA1(5487a94650c964a7ab07f30aacab0b470dcb3b40) )
+
+ ROM_REGION( 0x0400, "gfx1", 0 ) // some PCBs were seen with hrl11d-1
+ ROM_LOAD( "hrl11d-2.11d", 0x0000, 0x0400, CRC(c55b645d) SHA1(0c18277939d74e3e1281a7f114a34781d30c2baf) ) /* this is actually not used (all FF) */
+ ROM_CONTINUE( 0x0000, 0x0400 ) /* overwrite with the real one */
- ROM_REGION( 0x0140, "proms", 0 ) // were dumped from a bootleg, very probably they are the same, but marked as bad dump for precaution. The 2 6331 match the Targ ones.
- ROM_LOAD( "prom.5c", 0x0000, 0x0100, BAD_DUMP CRC(9ca2e061) SHA1(4111325b00a1017042d55c59308d41e8333ba627) ) // 6301 according to the Spectar manual
- ROM_LOAD( "prom.6d", 0x0100, 0x0020, BAD_DUMP CRC(e26f9053) SHA1(eec35b6aa2c2d305418306bf4a1754a0583f109f) ) // 6331 according to the Spectar manual
- ROM_LOAD( "hrl14h-1", 0x0120, 0x0020, BAD_DUMP CRC(f76b4fcf) SHA1(197e0cc508ffeb5cefa4046bdfb158939d598225) ) // 6331 according to the Spectar manual
+ ROM_REGION( 0x0140, "proms", 0 )
+ ROM_LOAD( "spl5c-2.5c", 0x0000, 0x0100, CRC(9ca2e061) SHA1(4111325b00a1017042d55c59308d41e8333ba627) ) // 6301 according to the Spectar manual, also seen as IM 5623CPE on PCB
+ ROM_LOAD( "prom.6d", 0x0100, 0x0020, BAD_DUMP CRC(e26f9053) SHA1(eec35b6aa2c2d305418306bf4a1754a0583f109f) ) // screen controller PROM, 6331 according to the Spectar manual, dumped from a bootleg
+ ROM_LOAD( "hrl14h-1.14h", 0x0120, 0x0020, CRC(f76b4fcf) SHA1(197e0cc508ffeb5cefa4046bdfb158939d598225) ) // 6331 according to the Spectar manual
ROM_END
ROM_START( spectarrf )
diff --git a/src/mame/drivers/fidel_cc1.cpp b/src/mame/drivers/fidel_cc1.cpp
index 19cfdb94f48..c4afe7b5c54 100644
--- a/src/mame/drivers/fidel_cc1.cpp
+++ b/src/mame/drivers/fidel_cc1.cpp
@@ -143,7 +143,7 @@ u8 cc1_state::ppi_porta_r()
{
// 74148(priority encoder) I0-I7: inputs
// d0-d2: 74148 S0-S2, d3: 74148 GS
- u8 data = count_leading_zeros(m_inputs[0]->read()) - 24;
+ u8 data = count_leading_zeros_32(m_inputs[0]->read()) - 24;
if (data == 8) data = 0xf;
// d5-d7: more inputs (direct)
diff --git a/src/mame/drivers/fmtowns.cpp b/src/mame/drivers/fmtowns.cpp
index 05441601efe..ac87d0bcbf7 100644
--- a/src/mame/drivers/fmtowns.cpp
+++ b/src/mame/drivers/fmtowns.cpp
@@ -464,6 +464,9 @@ void towns_state::device_timer(emu_timer &timer, device_timer_id id, int param,
case TIMER_CDDA:
towns_delay_cdda((cdrom_image_device*)ptr);
break;
+ case TIMER_SPRITES:
+ draw_sprites();
+ break;
}
}
void towns_state::freerun_inc()
@@ -939,6 +942,7 @@ uint8_t towns_state::towns_padport_r(offs_t offset)
uint8_t extra2;
uint32_t state;
+ offset >>= 1;
if(offset == 0)
{
if((porttype & 0x0f) == 0x01)
@@ -960,7 +964,7 @@ uint8_t towns_state::towns_padport_r(offs_t offset)
if((extra1 & 0x20) && (m_towns_pad_mask & 0x02))
ret &= ~0x20;
}
- if((porttype & 0x0f) == 0x04) // 6-button joystick
+ else if((porttype & 0x0f) == 0x04) // 6-button joystick
{
extra1 = m_6b_joy1_ex->read();
@@ -992,7 +996,7 @@ uint8_t towns_state::towns_padport_r(offs_t offset)
ret &= ~0x01;
}
}
- if((porttype & 0x0f) == 0x02) // mouse
+ else if((porttype & 0x0f) == 0x02) // mouse
{
switch(m_towns_mouse_output)
{
@@ -1025,9 +1029,9 @@ uint8_t towns_state::towns_padport_r(offs_t offset)
if(m_towns_pad_mask & 0x10)
ret |= 0x40;
}
-
+ else ret = 0x7f;
}
- if(offset == 1) // second joystick port
+ else if(offset == 1) // second joystick port
{
if((porttype & 0xf0) == 0x10)
{
@@ -1048,7 +1052,7 @@ uint8_t towns_state::towns_padport_r(offs_t offset)
if((extra2 & 0x20) && (m_towns_pad_mask & 0x08))
ret &= ~0x20;
}
- if((porttype & 0xf0) == 0x40) // 6-button joystick
+ else if((porttype & 0xf0) == 0x40) // 6-button joystick
{
extra2 = m_6b_joy2_ex->read();
@@ -1080,7 +1084,7 @@ uint8_t towns_state::towns_padport_r(offs_t offset)
ret &= ~0x01;
}
}
- if((porttype & 0xf0) == 0x20) // mouse
+ else if((porttype & 0xf0) == 0x20) // mouse
{
switch(m_towns_mouse_output)
{
@@ -1113,6 +1117,7 @@ uint8_t towns_state::towns_padport_r(offs_t offset)
if(m_towns_pad_mask & 0x20)
ret |= 0x40;
}
+ else ret = 0x7f;
}
return ret;
@@ -1788,7 +1793,10 @@ uint8_t towns_state::towns_cdrom_r(offs_t offset)
m_towns_cd.extra_status = 0;
break;
case 0x04: // play cdda
- towns_cd_set_status(0x07,0x00,0x00,0x00);
+ if(m_cdda->audio_ended())
+ towns_cd_set_status(0x07,0x00,0x00,0x00);
+ else
+ towns_cd_set_status(0x00,0x00,0x03,0x00);
m_towns_cd.status &= ~2;
m_towns_cd.extra_status = 0;
break;
@@ -2355,7 +2363,7 @@ void towns_state::towns_io(address_map &map)
// CD-ROM
map(0x04c0, 0x04cf).rw(FUNC(towns_state::towns_cdrom_r), FUNC(towns_state::towns_cdrom_w)).umask32(0x00ff00ff);
// Joystick / Mouse ports
- map(0x04d0, 0x04d3).r(FUNC(towns_state::towns_padport_r)).umask32(0x00ff00ff);
+ map(0x04d0, 0x04d3).r(FUNC(towns_state::towns_padport_r));
map(0x04d6, 0x04d6).w(FUNC(towns_state::towns_pad_mask_w));
// Sound (YM3438 [FM], RF5c68 [PCM])
map(0x04d8, 0x04df).rw("fm", FUNC(ym3438_device::read), FUNC(ym3438_device::write)).umask32(0x00ff00ff);
@@ -2426,7 +2434,7 @@ void towns_state::towns16_io(address_map &map)
// CD-ROM
map(0x04c0, 0x04cf).rw(FUNC(towns_state::towns_cdrom_r), FUNC(towns_state::towns_cdrom_w)).umask16(0x00ff);
// Joystick / Mouse ports
- map(0x04d0, 0x04d3).r(FUNC(towns_state::towns_padport_r)).umask16(0x00ff);
+ map(0x04d0, 0x04d3).r(FUNC(towns_state::towns_padport_r));
map(0x04d6, 0x04d6).w(FUNC(towns_state::towns_pad_mask_w));
// Sound (YM3438 [FM], RF5c68 [PCM])
map(0x04d8, 0x04df).rw("fm", FUNC(ym3438_device::read), FUNC(ym3438_device::write)).umask16(0x00ff);
diff --git a/src/mame/drivers/galaxian.cpp b/src/mame/drivers/galaxian.cpp
index b0f848013e7..1c4e3b00a8c 100644
--- a/src/mame/drivers/galaxian.cpp
+++ b/src/mame/drivers/galaxian.cpp
@@ -701,6 +701,7 @@ TODO:
#include "emu.h"
#include "includes/galaxian.h"
+
#include "audio/cclimber.h"
#include "audio/galaxian.h"
@@ -714,6 +715,7 @@ TODO:
#include "audio/nl_konami.h"
+
/*************************************
*
* Interrupts
@@ -728,13 +730,12 @@ WRITE_LINE_MEMBER(galaxian_state::vblank_interrupt_w)
m_maincpu->set_input_line(m_irq_line, ASSERT_LINE);
}
-INPUT_CHANGED_MEMBER(galaxian_state::tenspot_fake)
+INPUT_CHANGED_MEMBER(tenspot_state::tenspot_fake)
{
if (newval)
{
- m_tenspot_current_game++;
- m_tenspot_current_game%=10;
- tenspot_set_game_bank(m_tenspot_current_game, 1);
+ m_current_game = (m_current_game + 1) % 10;
+ set_game_bank(m_current_game, true);
}
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
@@ -1013,30 +1014,40 @@ uint8_t galaxian_state::explorer_sound_latch_r()
*
*************************************/
-uint8_t galaxian_state::sfx_sample_io_r(offs_t offset)
+void taiyo_sfx_state::machine_start()
{
- /* the decoding here is very simplistic, and you can address both simultaneously */
+ galaxian_state::machine_start();
+
+ m_sample_control = 0;
+
+ save_item(NAME(m_sample_control));
+}
+
+
+uint8_t taiyo_sfx_state::sample_io_r(offs_t offset)
+{
+ // the decoding here is very simplistic, and you can address both simultaneously
uint8_t result = 0xff;
if (offset & 0x04) result &= m_ppi8255[2]->read(offset & 3);
return result;
}
-void galaxian_state::sfx_sample_io_w(offs_t offset, uint8_t data)
+void taiyo_sfx_state::sample_io_w(offs_t offset, uint8_t data)
{
- /* the decoding here is very simplistic, and you can address both simultaneously */
+ // the decoding here is very simplistic, and you can address both simultaneously
if (offset & 0x04) m_ppi8255[2]->write(offset & 3, data);
if (offset & 0x10) m_dac->write(data);
}
-void galaxian_state::sfx_sample_control_w(uint8_t data)
+void taiyo_sfx_state::sample_control_w(uint8_t data)
{
- uint8_t old = m_sfx_sample_control;
- m_sfx_sample_control = data;
+ uint8_t old = m_sample_control;
+ m_sample_control = data;
- /* the inverse of bit 0 clocks the flip flop to signal an INT */
- /* it is automatically cleared on the acknowledge */
+ // the inverse of bit 0 clocks the flip flop to signal an INT
+ // it is automatically cleared on the acknowledge
if ((old & 0x01) && !(data & 0x01))
m_audio2->set_input_line(0, HOLD_LINE);
}
@@ -1058,13 +1069,13 @@ void galaxian_state::sfx_sample_control_w(uint8_t data)
The data(code) in the extra RAM is later jumped/called to in many parts of the game.
*/
-uint8_t galaxian_state::monsterz_protection_r()
+uint8_t taiyo_sfx_state::monsterz_protection_r()
{
return m_protection_result;
}
-void galaxian_state::monsterz_set_latch()
+void taiyo_sfx_state::monsterz_set_latch()
{
// read from a rom (which one?? "a-3e.k3" from audiocpu ($2700-$2fff) looks very suspicious)
uint8_t *rom = memregion("audiocpu")->base();
@@ -1075,7 +1086,7 @@ void galaxian_state::monsterz_set_latch()
}
-void galaxian_state::monsterz_porta_1_w(uint8_t data)
+void taiyo_sfx_state::monsterz_porta_1_w(uint8_t data)
{
// d7 high: set latch + advance address high bits (and reset low bits?)
if (data & 0x80)
@@ -1085,7 +1096,7 @@ void galaxian_state::monsterz_porta_1_w(uint8_t data)
}
}
-void galaxian_state::monsterz_portb_1_w(uint8_t data)
+void taiyo_sfx_state::monsterz_portb_1_w(uint8_t data)
{
// d3 high: set latch + advance address low bits
if (data & 0x08)
@@ -1095,7 +1106,7 @@ void galaxian_state::monsterz_portb_1_w(uint8_t data)
}
}
-void galaxian_state::monsterz_portc_1_w(uint8_t data)
+void taiyo_sfx_state::monsterz_portc_1_w(uint8_t data)
{
}
@@ -1208,9 +1219,9 @@ void galaxian_state::turtles_ppi8255_1_w(offs_t offset, uint8_t data){ m_ppi8255
*
*************************************/
-uint8_t galaxian_state::scorpion_ay8910_r(offs_t offset)
+uint8_t zac_scorpion_state::ay8910_r(offs_t offset)
{
- /* the decoding here is very simplistic, and you can address both simultaneously */
+ // the decoding here is very simplistic, and you can address both simultaneously
uint8_t result = 0xff;
if (offset & 0x08) result &= m_ay8910[2]->data_r();
if (offset & 0x20) result &= m_ay8910[1]->data_r();
@@ -1219,9 +1230,9 @@ uint8_t galaxian_state::scorpion_ay8910_r(offs_t offset)
}
-void galaxian_state::scorpion_ay8910_w(offs_t offset, uint8_t data)
+void zac_scorpion_state::ay8910_w(offs_t offset, uint8_t data)
{
- /* the decoding here is very simplistic, and you can address all six simultaneously */
+ // the decoding here is very simplistic, and you can address all six simultaneously
if (offset & 0x04) m_ay8910[2]->address_w(data);
if (offset & 0x08) m_ay8910[2]->data_w(data);
if (offset & 0x10) m_ay8910[1]->address_w(data);
@@ -1231,41 +1242,39 @@ void galaxian_state::scorpion_ay8910_w(offs_t offset, uint8_t data)
}
-uint8_t galaxian_state::scorpion_protection_r()
+uint8_t zac_scorpion_state::protection_r()
{
- uint16_t paritybits;
+ // compute parity of the current (bitmask & $CE29)
uint8_t parity = 0;
-
- /* compute parity of the current (bitmask & $CE29) */
- for (paritybits = m_protection_state & 0xce29; paritybits != 0; paritybits >>= 1)
+ for (uint16_t paritybits = m_protection_state & 0xce29; paritybits != 0; paritybits >>= 1)
if (paritybits & 1)
parity++;
- /* only the low bit matters for protection, but bit 2 is also checked */
+ // only the low bit matters for protection, but bit 2 is also checked
return parity;
}
-void galaxian_state::scorpion_protection_w(uint8_t data)
+void zac_scorpion_state::protection_w(uint8_t data)
{
- /* bit 5 low is a reset */
+ // bit 5 low is a reset
if (!(data & 0x20))
m_protection_state = 0x0000;
- /* bit 4 low is a clock */
+ // bit 4 low is a clock
if (!(data & 0x10))
{
- /* each clock shifts left one bit and ORs in the inverse of the parity */
- m_protection_state = (m_protection_state << 1) | (~scorpion_protection_r() & 1);
+ // each clock shifts left one bit and ORs in the inverse of the parity
+ m_protection_state = (m_protection_state << 1) | (~protection_r() & 1);
}
}
-uint8_t galaxian_state::scorpion_digitalker_intr_r()
+uint8_t zac_scorpion_state::digitalker_intr_r()
{
return m_digitalker->digitalker_0_intr_r();
}
-void galaxian_state::scorpion_digitalker_control_w(uint8_t data)
+void zac_scorpion_state::digitalker_control_w(uint8_t data)
{
m_digitalker->digitalker_0_cs_w(data & 1 ? ASSERT_LINE : CLEAR_LINE);
m_digitalker->digitalker_0_cms_w(data & 2 ? ASSERT_LINE : CLEAR_LINE);
@@ -1278,19 +1287,35 @@ void galaxian_state::scorpion_digitalker_control_w(uint8_t data)
*
*************************************/
+void gmgalax_state::machine_start()
+{
+ bagmanmc_state::machine_start();
+
+ m_stars_enabled = 0;
+ std::fill(std::begin(m_gfxbank), std::end(m_gfxbank), 0);
+
+ save_item(NAME(m_selected_game));
+
+ m_rombank->configure_entries(0, 2, memregion("maincpu")->base(), 0x4000);
+
+ // callback when the game select is toggled
+ game_changed(*m_gamesel->fields().first(), 0, 0, 0);
+}
+
+
INPUT_CHANGED_MEMBER(gmgalax_state::game_changed)
{
- /* new value is the selected game */
+ // new value is the selected game
m_selected_game = newval;
- /* select the bank and graphics bank based on it */
- m_bank1->set_entry(m_selected_game);
+ // select the bank and graphics bank based on it
+ m_rombank->set_entry(m_selected_game);
galaxian_gfxbank_w(0, m_selected_game);
- /* reset the stars */
+ // reset the stars
galaxian_stars_enable_w(0);
- /* reset the CPU */
+ // reset the CPU
m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
}
@@ -1309,34 +1334,51 @@ CUSTOM_INPUT_MEMBER(gmgalax_state::port_r)
*
*************************************/
-void galaxian_state::zigzag_bankswap_w(uint8_t data)
+void zigzagb_state::machine_start()
+{
+ galaxian_state::machine_start();
+
+ m_ay8910_latch = 0;
+
+ save_item(NAME(m_ay8910_latch));
+
+ // make ROMs 2 & 3 swappable
+ m_rombanks[0]->configure_entries(0, 2, memregion("maincpu")->base() + 0x2000, 0x1000);
+ m_rombanks[1]->configure_entries(0, 2, memregion("maincpu")->base() + 0x2000, 0x1000);
+
+ // set initial ROM mapping
+ bankswap_w(0);
+}
+
+
+void zigzagb_state::bankswap_w(uint8_t data)
{
- /* Zig Zag can swap ROMs 2 and 3 as a form of copy protection */
- m_bank1->set_entry(data & 1);
- membank("bank2")->set_entry(~data & 1);
+ // Zig Zag can swap ROMs 2 and 3 as a form of copy protection
+ m_rombanks[0]->set_entry(data & 1);
+ m_rombanks[1]->set_entry(~data & 1);
}
-void galaxian_state::zigzag_ay8910_w(offs_t offset, uint8_t data)
+void zigzagb_state::ay8910_w(offs_t offset, uint8_t data)
{
switch (offset & 0x300)
{
- case 0x000:
- /* control lines */
- /* bit 0 = WRITE */
- /* bit 1 = C/D */
- if ((offset & 1) != 0)
- m_ay8910[0]->data_address_w(offset >> 1, m_zigzag_ay8910_latch);
- break;
+ case 0x000:
+ // control lines
+ // bit 0 = WRITE
+ // bit 1 = C/D
+ if (BIT(offset, 0))
+ m_ay8910[0]->data_address_w(BIT(offset, 1), m_ay8910_latch);
+ break;
- case 0x100:
- /* data latch */
- m_zigzag_ay8910_latch = offset & 0xff;
- break;
+ case 0x100:
+ // data latch
+ m_ay8910_latch = offset & 0xff;
+ break;
- case 0x200:
- /* unknown */
- break;
+ case 0x200:
+ // unknown
+ break;
}
}
@@ -1362,14 +1404,26 @@ READ_LINE_MEMBER(galaxian_state::azurian_port_r)
*
*************************************/
-READ_LINE_MEMBER(galaxian_state::kingball_muxbit_r)
+void kingball_state::machine_start()
+{
+ galaxian_state::machine_start();
+
+ m_speech_dip = 0;
+ m_sound = 0;
+
+ save_item(NAME(m_speech_dip));
+ save_item(NAME(m_sound));
+}
+
+
+READ_LINE_MEMBER(kingball_state::muxbit_r)
{
- /* multiplex the service mode switch with a speech DIP switch */
- return (ioport("FAKE")->read() >> m_kingball_speech_dip) & 1;
+ // multiplex the service mode switch with a speech DIP switch
+ return BIT(m_mux_port->read(), m_speech_dip);
}
-READ_LINE_MEMBER(galaxian_state::kingball_noise_r)
+READ_LINE_MEMBER(kingball_state::noise_r)
{
/* bit 5 is the NOISE line from the sound circuit. The code just verifies
that it's working, doesn't actually use return value, so we can just use
@@ -1378,26 +1432,26 @@ READ_LINE_MEMBER(galaxian_state::kingball_noise_r)
}
-void galaxian_state::kingball_speech_dip_w(uint8_t data)
+void kingball_state::speech_dip_w(uint8_t data)
{
- m_kingball_speech_dip = data;
+ m_speech_dip = data;
}
-void galaxian_state::kingball_sound1_w(uint8_t data)
+void kingball_state::sound1_w(uint8_t data)
{
- m_kingball_sound = (m_kingball_sound & ~0x01) | data;
+ m_sound = (m_sound & ~0x01) | data;
}
-void galaxian_state::kingball_sound2_w(uint8_t data)
+void kingball_state::sound2_w(uint8_t data)
{
- m_kingball_sound = (m_kingball_sound & ~0x02) | (data << 1);
- m_soundlatch->write(m_kingball_sound | 0xf0);
+ m_sound = (m_sound & ~0x02) | (data << 1);
+ m_soundlatch->write(m_sound | 0xf0);
}
-void galaxian_state::kingball_dac_w(uint8_t data)
+void kingball_state::dac_w(uint8_t data)
{
m_dac->write(data >> 4);
}
@@ -1410,31 +1464,42 @@ void galaxian_state::kingball_dac_w(uint8_t data)
*
*************************************/
-void galaxian_state::mshuttle_ay8910_cs_w(uint8_t data)
+void mshuttle_state::machine_start()
{
- m_mshuttle_ay8910_cs = data & 1;
+ galaxian_state::machine_start();
+
+ m_ay8910_cs = 0;
+
+ save_item(NAME(m_ay8910_cs));
}
-void galaxian_state::mshuttle_ay8910_control_w(uint8_t data)
+void mshuttle_state::ay8910_cs_w(uint8_t data)
{
- if (!m_mshuttle_ay8910_cs)
+ m_ay8910_cs = data & 1;
+}
+
+
+void mshuttle_state::ay8910_control_w(uint8_t data)
+{
+ if (!m_ay8910_cs)
m_ay8910_cclimber->address_w(data);
}
-void galaxian_state::mshuttle_ay8910_data_w(uint8_t data)
+void mshuttle_state::ay8910_data_w(uint8_t data)
{
- if (!m_mshuttle_ay8910_cs)
+ if (!m_ay8910_cs)
m_ay8910_cclimber->data_w(data);
}
-uint8_t galaxian_state::mshuttle_ay8910_data_r()
+uint8_t mshuttle_state::ay8910_data_r()
{
- if (!m_mshuttle_ay8910_cs)
+ if (!m_ay8910_cs)
return m_ay8910_cclimber->data_r();
- return 0xff;
+ else
+ return 0xff;
}
@@ -1529,9 +1594,23 @@ uint8_t galaxian_state::dingoe_3001_r()
*
*************************************/
-void galaxian_state::moonwar_port_select_w(uint8_t data)
+void moonwar_state::machine_start()
{
- m_moonwar_port_select = data & 0x10;
+ galaxian_state::machine_start();
+
+ m_port_select = 0;
+ std::fill(std::begin(m_direction), std::end(m_direction), 0);
+ std::fill(std::begin(m_counter_74ls161), std::end(m_counter_74ls161), 0);
+
+ save_item(NAME(m_port_select));
+ save_item(NAME(m_direction));
+ save_item(NAME(m_counter_74ls161));
+}
+
+
+void moonwar_state::port_select_w(uint8_t data)
+{
+ m_port_select = BIT(~data, 4);
}
@@ -1633,7 +1712,7 @@ void galaxian_state::galaxian_map(address_map &map)
galaxian_map_discrete(map);
}
-void galaxian_state::pisces_map(address_map &map)
+void pisces_state::pisces_map(address_map &map)
{
galaxian_map(map);
map(0x6002, 0x6002).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_gfxbank_w)); // coin lockout replaced by graphics bank
@@ -1722,7 +1801,7 @@ void galaxian_state::thepitm_map(address_map &map)
map(0xb004, 0xb004).mirror(0x7f8).nopw(); // disable the stars
}
-void galaxian_state::porter_map(address_map &map)
+void pisces_state::porter_map(address_map &map)
{
mooncrst_map(map);
map(0x0000, 0x4fff).rom().region("maincpu", 0); // extend ROM
@@ -1730,7 +1809,7 @@ void galaxian_state::porter_map(address_map &map)
map(0xa002, 0xa002).mirror(0x7f8).w(FUNC(galaxian_state::galaxian_gfxbank_w)); // coin lockout replaced by graphics bank
}
-void galaxian_state::skybase_map(address_map &map)
+void pisces_state::skybase_map(address_map &map)
{
mooncrst_map(map);
map(0x0000, 0x5fff).rom().region("maincpu", 0); // extend ROM
@@ -1816,22 +1895,22 @@ void galaxian_state::ckongmc_map(address_map &map)
map(0xb800, 0xb800).r("watchdog", FUNC(watchdog_timer_device::reset_r));
}
-void galaxian_state::bagmanmc_map(address_map &map)
+void bagmanmc_state::bagmanmc_map(address_map &map)
{
ckongg_map_base(map);
mooncrst_map_discrete(map);
map(0xa000, 0xa000).portr("IN0");
- map(0xa003, 0xa003).w(FUNC(galaxian_state::coin_count_0_w));
+ map(0xa003, 0xa003).w(FUNC(bagmanmc_state::coin_count_0_w));
map(0xa800, 0xa800).portr("IN1");
map(0xb000, 0xb000).portr("IN2").nopw();
- map(0xb001, 0xb001).w(FUNC(galaxian_state::irq_enable_w));
- map(0xb002, 0xb002).w(FUNC(galaxian_state::galaxian_gfxbank_w));
- map(0xb006, 0xb006).w(FUNC(galaxian_state::galaxian_flip_screen_x_w));
- map(0xb007, 0xb007).w(FUNC(galaxian_state::galaxian_flip_screen_y_w));
+ map(0xb001, 0xb001).w(FUNC(bagmanmc_state::irq_enable_w));
+ map(0xb002, 0xb002).w(FUNC(bagmanmc_state::galaxian_gfxbank_w));
+ map(0xb006, 0xb006).w(FUNC(bagmanmc_state::galaxian_flip_screen_x_w));
+ map(0xb007, 0xb007).w(FUNC(bagmanmc_state::galaxian_flip_screen_y_w));
map(0xb800, 0xb800).r("watchdog", FUNC(watchdog_timer_device::reset_r));
}
-void galaxian_state::bagmanmc_io_map(address_map &map)
+void bagmanmc_state::bagmanmc_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x08, 0x09).nopw(); // remnant of AY-3-8910 port-based input
@@ -1861,29 +1940,36 @@ void galaxian_state::fantastc_map(address_map &map)
// map(0xfff8, 0xffff).nopw(); // timefgtr, sound related?
}
-void galaxian_state::zigzag_map(address_map &map)
+void zigzagb_state::zigzag_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x1fff).rom();
- map(0x2000, 0x2fff).bankr("bank1");
- map(0x3000, 0x3fff).bankr("bank2");
+ map(0x2000, 0x2fff).bankr(m_rombanks[0]);
+ map(0x3000, 0x3fff).bankr(m_rombanks[1]);
map(0x4000, 0x47ff).ram(); // needs a full 2K of RAM
- map(0x4800, 0x4fff).w(FUNC(galaxian_state::zigzag_ay8910_w));
- map(0x5000, 0x53ff).mirror(0x0400).ram().w(FUNC(galaxian_state::galaxian_videoram_w)).share("videoram");
- map(0x5800, 0x58ff).mirror(0x0700).ram().w(FUNC(galaxian_state::galaxian_objram_w)).share("spriteram");
+ map(0x4800, 0x4fff).w(FUNC(zigzagb_state::ay8910_w));
+ map(0x5000, 0x53ff).mirror(0x0400).ram().w(FUNC(zigzagb_state::galaxian_videoram_w)).share("videoram");
+ map(0x5800, 0x58ff).mirror(0x0700).ram().w(FUNC(zigzagb_state::galaxian_objram_w)).share("spriteram");
map(0x6000, 0x6000).mirror(0x07ff).portr("IN0");
- map(0x6000, 0x6001).mirror(0x07f8).w(FUNC(galaxian_state::start_lamp_w));
- map(0x6003, 0x6003).mirror(0x07f8).w(FUNC(galaxian_state::coin_count_0_w));
+ map(0x6000, 0x6001).mirror(0x07f8).w(FUNC(zigzagb_state::start_lamp_w));
+ map(0x6003, 0x6003).mirror(0x07f8).w(FUNC(zigzagb_state::coin_count_0_w));
map(0x6800, 0x6800).mirror(0x07ff).portr("IN1");
map(0x7000, 0x7000).mirror(0x07ff).portr("IN2");
- map(0x7001, 0x7001).mirror(0x07f8).w(FUNC(galaxian_state::irq_enable_w));
- map(0x7002, 0x7002).mirror(0x07f8).w(FUNC(galaxian_state::zigzag_bankswap_w));
- map(0x7004, 0x7004).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_stars_enable_w));
- map(0x7006, 0x7006).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_flip_screen_x_w));
- map(0x7007, 0x7007).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_flip_screen_y_w));
+ map(0x7001, 0x7001).mirror(0x07f8).w(FUNC(zigzagb_state::irq_enable_w));
+ map(0x7002, 0x7002).mirror(0x07f8).w(FUNC(zigzagb_state::bankswap_w));
+ map(0x7004, 0x7004).mirror(0x07f8).w(FUNC(zigzagb_state::galaxian_stars_enable_w));
+ map(0x7006, 0x7006).mirror(0x07f8).w(FUNC(zigzagb_state::galaxian_flip_screen_x_w));
+ map(0x7007, 0x7007).mirror(0x07f8).w(FUNC(zigzagb_state::galaxian_flip_screen_y_w));
map(0x7800, 0x7800).mirror(0x07ff).r("watchdog", FUNC(watchdog_timer_device::reset_r));
}
+void gmgalax_state::gmgalax_map(address_map &map)
+{
+ galaxian_map(map);
+
+ map(0x0000, 0x3fff).bankr(m_rombank); // ROM is banked
+}
+
// not derived from schematics
void galaxian_state::ozon1_map(address_map &map)
{
@@ -1930,13 +2016,13 @@ void namenayo_state::namenayo_map(address_map &map)
map(0x0000, 0x3fff).rom();
map(0x4000, 0x4fff).ram();
map(0x5000, 0x6fff).rom();
- map(0xc800, 0xc8ff).ram().w(FUNC(galaxian_state::galaxian_objram_w)).share("spriteram");
- map(0xd000, 0xd3ff).ram().w(FUNC(galaxian_state::galaxian_videoram_w)).share("videoram");
+ map(0xc800, 0xc8ff).ram().w(FUNC(namenayo_state::galaxian_objram_w)).share("spriteram");
+ map(0xd000, 0xd3ff).ram().w(FUNC(namenayo_state::galaxian_videoram_w)).share("videoram");
map(0xd800, 0xd800).w(FUNC(namenayo_state::namenayo_unk_d800_w)); // some kind of split position for bg colour maybe?
map(0xe000, 0xe01f).ram().w(FUNC(namenayo_state::namenayo_extattr_w)).share("extattrram");
- map(0xe801, 0xe801).w(FUNC(galaxian_state::irq_enable_w));
- map(0xe806, 0xe806).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_flip_screen_x_w));
- map(0xe807, 0xe807).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_flip_screen_y_w));
+ map(0xe801, 0xe801).w(FUNC(namenayo_state::irq_enable_w));
+ map(0xe806, 0xe806).mirror(0x07f8).w(FUNC(namenayo_state::galaxian_flip_screen_x_w));
+ map(0xe807, 0xe807).mirror(0x07f8).w(FUNC(namenayo_state::galaxian_flip_screen_y_w));
map(0xf900, 0xf903).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xfa00, 0xfa03).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xf000, 0xf000).r("watchdog", FUNC(watchdog_timer_device::reset_r));
@@ -2054,7 +2140,7 @@ void galaxian_state::mimonscr_map(address_map &map)
-void galaxian_state::scorpion_map(address_map &map)
+void zac_scorpion_state::scorpion_map(address_map &map)
{
theend_map(map);
map(0x5800, 0x67ff).rom().region("maincpu", 0x5800); // extra ROM
@@ -2285,46 +2371,45 @@ void galaxian_state::turpins_map(address_map &map)
-/* this is the same as theend, except for separate RGB background controls
- and some extra ROM space at $7000 and $C000 */
-void galaxian_state::sfx_map(address_map &map)
+// this is the same as theend, except for separate RGB background controls and some extra ROM space at $7000 and $C000
+void taiyo_sfx_state::sfx_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0x4000, 0x47ff).ram();
- map(0x4800, 0x4bff).mirror(0x0400).ram().w(FUNC(galaxian_state::galaxian_videoram_w)).share("videoram");
- map(0x5000, 0x50ff).mirror(0x0700).ram().w(FUNC(galaxian_state::galaxian_objram_w)).share("spriteram");
- map(0x6800, 0x6800).mirror(0x07f8).w(FUNC(galaxian_state::scramble_background_red_w));
- map(0x6801, 0x6801).mirror(0x07f8).w(FUNC(galaxian_state::irq_enable_w));
- map(0x6802, 0x6802).mirror(0x07f8).w(FUNC(galaxian_state::coin_count_0_w));
- map(0x6803, 0x6803).mirror(0x07f8).w(FUNC(galaxian_state::scramble_background_blue_w));
- map(0x6804, 0x6804).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_stars_enable_w));
- map(0x6805, 0x6805).mirror(0x07f8).w(FUNC(galaxian_state::scramble_background_green_w));
- map(0x6806, 0x6806).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_flip_screen_x_w));
- map(0x6807, 0x6807).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_flip_screen_y_w));
+ map(0x4800, 0x4bff).mirror(0x0400).ram().w(FUNC(taiyo_sfx_state::galaxian_videoram_w)).share("videoram");
+ map(0x5000, 0x50ff).mirror(0x0700).ram().w(FUNC(taiyo_sfx_state::galaxian_objram_w)).share("spriteram");
+ map(0x6800, 0x6800).mirror(0x07f8).w(FUNC(taiyo_sfx_state::scramble_background_red_w));
+ map(0x6801, 0x6801).mirror(0x07f8).w(FUNC(taiyo_sfx_state::irq_enable_w));
+ map(0x6802, 0x6802).mirror(0x07f8).w(FUNC(taiyo_sfx_state::coin_count_0_w));
+ map(0x6803, 0x6803).mirror(0x07f8).w(FUNC(taiyo_sfx_state::scramble_background_blue_w));
+ map(0x6804, 0x6804).mirror(0x07f8).w(FUNC(taiyo_sfx_state::galaxian_stars_enable_w));
+ map(0x6805, 0x6805).mirror(0x07f8).w(FUNC(taiyo_sfx_state::scramble_background_green_w));
+ map(0x6806, 0x6806).mirror(0x07f8).w(FUNC(taiyo_sfx_state::galaxian_flip_screen_x_w));
+ map(0x6807, 0x6807).mirror(0x07f8).w(FUNC(taiyo_sfx_state::galaxian_flip_screen_y_w));
map(0x7000, 0x7fff).rom();
- map(0x8000, 0xbfff).rw(FUNC(galaxian_state::theend_ppi8255_r), FUNC(galaxian_state::theend_ppi8255_w));
+ map(0x8000, 0xbfff).rw(FUNC(taiyo_sfx_state::theend_ppi8255_r), FUNC(taiyo_sfx_state::theend_ppi8255_w));
map(0xc000, 0xefff).rom();
}
-void galaxian_state::monsterz_map(address_map &map)
+void taiyo_sfx_state::monsterz_map(address_map &map)
{
map(0x0000, 0x37ff).rom();
map(0x3800, 0x3fff).ram(); // extra RAM used by protection
map(0x4000, 0x47ff).ram();
- map(0x4800, 0x4bff).mirror(0x0400).ram().w(FUNC(galaxian_state::galaxian_videoram_w)).share("videoram");
- map(0x5000, 0x50ff).mirror(0x0700).ram().w(FUNC(galaxian_state::galaxian_objram_w)).share("spriteram");
- map(0x6800, 0x6800).mirror(0x07f8).w(FUNC(galaxian_state::scramble_background_red_w));
- map(0x6801, 0x6801).mirror(0x07f8).w(FUNC(galaxian_state::irq_enable_w));
- map(0x6802, 0x6802).mirror(0x07f8).w(FUNC(galaxian_state::coin_count_0_w));
- map(0x6803, 0x6803).mirror(0x07f8).w(FUNC(galaxian_state::scramble_background_blue_w));
- map(0x6804, 0x6804).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_stars_enable_w));
- map(0x6805, 0x6805).mirror(0x07f8).w(FUNC(galaxian_state::scramble_background_green_w));
- map(0x6806, 0x6806).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_flip_screen_x_w));
- map(0x6807, 0x6807).mirror(0x07f8).w(FUNC(galaxian_state::galaxian_flip_screen_y_w));
- map(0x8000, 0xbfff).rw(FUNC(galaxian_state::theend_ppi8255_r), FUNC(galaxian_state::theend_ppi8255_w));
+ map(0x4800, 0x4bff).mirror(0x0400).ram().w(FUNC(taiyo_sfx_state::galaxian_videoram_w)).share("videoram");
+ map(0x5000, 0x50ff).mirror(0x0700).ram().w(FUNC(taiyo_sfx_state::galaxian_objram_w)).share("spriteram");
+ map(0x6800, 0x6800).mirror(0x07f8).w(FUNC(taiyo_sfx_state::scramble_background_red_w));
+ map(0x6801, 0x6801).mirror(0x07f8).w(FUNC(taiyo_sfx_state::irq_enable_w));
+ map(0x6802, 0x6802).mirror(0x07f8).w(FUNC(taiyo_sfx_state::coin_count_0_w));
+ map(0x6803, 0x6803).mirror(0x07f8).w(FUNC(taiyo_sfx_state::scramble_background_blue_w));
+ map(0x6804, 0x6804).mirror(0x07f8).w(FUNC(taiyo_sfx_state::galaxian_stars_enable_w));
+ map(0x6805, 0x6805).mirror(0x07f8).w(FUNC(taiyo_sfx_state::scramble_background_green_w));
+ map(0x6806, 0x6806).mirror(0x07f8).w(FUNC(taiyo_sfx_state::galaxian_flip_screen_x_w));
+ map(0x6807, 0x6807).mirror(0x07f8).w(FUNC(taiyo_sfx_state::galaxian_flip_screen_y_w));
+ map(0x8000, 0xbfff).rw(FUNC(taiyo_sfx_state::theend_ppi8255_r), FUNC(taiyo_sfx_state::theend_ppi8255_w));
map(0xc000, 0xd7ff).rom();
- map(0xd800, 0xd800).r(FUNC(galaxian_state::monsterz_protection_r));
+ map(0xd800, 0xd800).r(FUNC(taiyo_sfx_state::monsterz_protection_r));
}
@@ -2377,20 +2462,20 @@ void galaxian_state::frogf_map(address_map &map)
}
-/* mooncrst */
-void galaxian_state::mshuttle_map(address_map &map)
+// mshuttle
+void mshuttle_state::mshuttle_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x7fff).rom();
map(0x8000, 0x83ff).ram();
- map(0x9000, 0x93ff).mirror(0x0400).ram().w(FUNC(galaxian_state::galaxian_videoram_w)).share("videoram");
- map(0x9800, 0x98ff).mirror(0x0700).ram().w(FUNC(galaxian_state::galaxian_objram_w)).share("spriteram");
+ map(0x9000, 0x93ff).mirror(0x0400).ram().w(FUNC(mshuttle_state::galaxian_videoram_w)).share("videoram");
+ map(0x9800, 0x98ff).mirror(0x0700).ram().w(FUNC(mshuttle_state::galaxian_objram_w)).share("spriteram");
map(0xa000, 0xa000).portr("IN0");
- map(0xa000, 0xa000).w(FUNC(galaxian_state::irq_enable_w));
- map(0xa001, 0xa001).w(FUNC(galaxian_state::galaxian_stars_enable_w));
- map(0xa002, 0xa002).w(FUNC(galaxian_state::galaxian_flip_screen_xy_w));
+ map(0xa000, 0xa000).w(FUNC(mshuttle_state::irq_enable_w));
+ map(0xa001, 0xa001).w(FUNC(mshuttle_state::galaxian_stars_enable_w));
+ map(0xa002, 0xa002).w(FUNC(mshuttle_state::galaxian_flip_screen_xy_w));
map(0xa004, 0xa004).w("cclimber_audio", FUNC(cclimber_audio_device::sample_trigger_w));
- map(0xa007, 0xa007).w(FUNC(galaxian_state::mshuttle_ay8910_cs_w));
+ map(0xa007, 0xa007).w(FUNC(mshuttle_state::ay8910_cs_w));
map(0xa800, 0xa800).portr("IN1");
map(0xa800, 0xa800).w("cclimber_audio", FUNC(cclimber_audio_device::sample_rate_w));
map(0xb000, 0xb000).portr("IN2");
@@ -2398,95 +2483,119 @@ void galaxian_state::mshuttle_map(address_map &map)
map(0xb800, 0xb800).r("watchdog", FUNC(watchdog_timer_device::reset_r));
}
-void galaxian_state::mshuttle_decrypted_opcodes_map(address_map &map)
+void mshuttle_state::mshuttle_decrypted_opcodes_map(address_map &map)
{
map(0x0000, 0x7fff).rom().share("decrypted_opcodes");
}
-void galaxian_state::mshuttle_portmap(address_map &map)
+void mshuttle_state::mshuttle_portmap(address_map &map)
{
map.unmap_value_high();
map.global_mask(0x0f);
- map(0x08, 0x08).w(FUNC(galaxian_state::mshuttle_ay8910_control_w));
- map(0x09, 0x09).w(FUNC(galaxian_state::mshuttle_ay8910_data_w));
- map(0x0c, 0x0c).r(FUNC(galaxian_state::mshuttle_ay8910_data_r));
+ map(0x08, 0x08).w(FUNC(mshuttle_state::ay8910_control_w));
+ map(0x09, 0x09).w(FUNC(mshuttle_state::ay8910_data_w));
+ map(0x0c, 0x0c).r(FUNC(mshuttle_state::ay8910_data_r));
}
-void galaxian_state::fourplay_map(address_map &map)
+
+// fourplay
+void fourplay_state::fourplay_map(address_map &map)
{
- map(0x0000,0x3fff).bankr("bank1");
+ map(0x0000,0x3fff).bankr(m_rombank);
map(0x4000,0x47ff).ram();
- map(0x5000,0x53ff).mirror(0x0400).ram().w(FUNC(galaxian_state::galaxian_videoram_w)).share("videoram");
- map(0x5800,0x58ff).mirror(0x0700).ram().w(FUNC(galaxian_state::galaxian_objram_w)).share("spriteram");
+ map(0x5000,0x53ff).mirror(0x0400).ram().w(FUNC(fourplay_state::galaxian_videoram_w)).share("videoram");
+ map(0x5800,0x58ff).mirror(0x0700).ram().w(FUNC(fourplay_state::galaxian_objram_w)).share("spriteram");
map(0x6000,0x6000).portr("IN0");
map(0x6800,0x6800).portr("IN1");
map(0x7000,0x7000).portr("IN2");
map(0x7800,0x7fff).r("watchdog",FUNC(watchdog_timer_device::reset_r));
- map(0x6000,0x6001).w(FUNC(galaxian_state::start_lamp_w));
- map(0x6002,0x6002).nopw(); // .w(FUNC(galaxian_state::coin_lock_w));
- map(0x6003,0x6003).w(FUNC(galaxian_state::coin_count_0_w));
+ map(0x6000,0x6001).w(FUNC(fourplay_state::start_lamp_w));
+ map(0x6002,0x6002).nopw(); // .w(FUNC(fourplay_state::coin_lock_w));
+ map(0x6003,0x6003).w(FUNC(fourplay_state::coin_count_0_w));
map(0x6004,0x6007).w("cust",FUNC(galaxian_sound_device::lfo_freq_w));
map(0x6800,0x6807).w("cust",FUNC(galaxian_sound_device::sound_w));
- map(0x7001,0x7001).w(FUNC(galaxian_state::irq_enable_w));
- map(0x7002,0x7003).w(FUNC(galaxian_state::fourplay_rombank_w));
- map(0x7004,0x7004).w(FUNC(galaxian_state::galaxian_stars_enable_w));
+ map(0x7001,0x7001).w(FUNC(fourplay_state::irq_enable_w));
+ map(0x7002,0x7003).w(FUNC(fourplay_state::fourplay_rombank_w));
+ map(0x7004,0x7004).w(FUNC(fourplay_state::galaxian_stars_enable_w));
map(0x7005,0x7005).nopw(); /* bit 3 of rombank select - always 0 */
- map(0x7006,0x7006).w(FUNC(galaxian_state::galaxian_flip_screen_x_w));
- map(0x7007,0x7007).w(FUNC(galaxian_state::galaxian_flip_screen_y_w));
+ map(0x7006,0x7006).w(FUNC(fourplay_state::galaxian_flip_screen_x_w));
+ map(0x7007,0x7007).w(FUNC(fourplay_state::galaxian_flip_screen_y_w));
map(0x7008,0x7008).nopw(); /* bit 4 of rombank select - always 0 */
map(0x7800,0x7800).w("cust",FUNC(galaxian_sound_device::pitch_w));
}
-void galaxian_state::videight_map(address_map &map)
+void videight_state::videight_map(address_map &map)
{
- map(0x0000,0x3fff).bankr("bank1");
+ map(0x0000,0x3fff).bankr(m_rombank);
map(0x4000,0x47ff).ram();
- map(0x5000,0x53ff).mirror(0x400).ram().w(FUNC(galaxian_state::galaxian_videoram_w)).share("videoram");
- map(0x5800,0x58ff).mirror(0x700).ram().w(FUNC(galaxian_state::galaxian_objram_w)).share("spriteram");
+ map(0x5000,0x53ff).mirror(0x400).ram().w(FUNC(videight_state::galaxian_videoram_w)).share("videoram");
+ map(0x5800,0x58ff).mirror(0x700).ram().w(FUNC(videight_state::galaxian_objram_w)).share("spriteram");
map(0x6000,0x6000).portr("IN0");
map(0x6800,0x6800).portr("IN1");
map(0x7000,0x7000).portr("IN2");
map(0x7800,0x7fff).r("watchdog",FUNC(watchdog_timer_device::reset_r));
- map(0x6000,0x6002).w(FUNC(galaxian_state::videight_gfxbank_w));
- map(0x6003,0x6003).w(FUNC(galaxian_state::coin_count_0_w));
+ map(0x6000,0x6002).w(FUNC(videight_state::videight_gfxbank_w));
+ map(0x6003,0x6003).w(FUNC(videight_state::coin_count_0_w));
map(0x6004,0x6007).w("cust",FUNC(galaxian_sound_device::lfo_freq_w));
map(0x6800,0x6807).w("cust",FUNC(galaxian_sound_device::sound_w));
map(0x6808,0x68ff).nopw();
- map(0x7001,0x7001).w(FUNC(galaxian_state::irq_enable_w));
- map(0x7002,0x7005).w(FUNC(galaxian_state::videight_rombank_w));
- map(0x7006,0x7006).w(FUNC(galaxian_state::galaxian_flip_screen_x_w));
- map(0x7007,0x7007).w(FUNC(galaxian_state::galaxian_flip_screen_y_w));
+ map(0x7001,0x7001).w(FUNC(videight_state::irq_enable_w));
+ map(0x7002,0x7005).w(FUNC(videight_state::videight_rombank_w));
+ map(0x7006,0x7006).w(FUNC(videight_state::galaxian_flip_screen_x_w));
+ map(0x7007,0x7007).w(FUNC(videight_state::galaxian_flip_screen_y_w));
map(0x7008,0x7008).nopw(); /* bit 4 of rombank select - always 0 */
map(0x7800,0x7800).w("cust",FUNC(galaxian_sound_device::pitch_w));
}
-void galaxian_state::tenspot_unk_6000_w(uint8_t data)
+void tenspot_state::machine_start()
+{
+ galaxian_state::machine_start();
+
+ m_current_game = 0;
+
+ save_item(NAME(m_current_game));
+
+ for (unsigned i = 0; 10U > i; ++i)
+ m_mainbank->configure_entry(i, memregion(util::string_format("game_%u_cpu", i))->base());
+
+ set_game_bank(m_current_game, false);
+}
+
+void tenspot_state::unk_6000_w(uint8_t data)
{
logerror("tenspot_unk_6000_w %02x\n",data);
}
-void galaxian_state::tenspot_unk_8000_w(uint8_t data)
+void tenspot_state::unk_8000_w(uint8_t data)
{
logerror("tenspot_unk_8000_w %02x\n",data);
}
-void galaxian_state::tenspot_unk_e000_w(uint8_t data)
+void tenspot_state::unk_e000_w(uint8_t data)
{
logerror("tenspot_unk_e000_w %02x\n",data);
}
-void galaxian_state::tenspot_select_map(address_map &map)
+void tenspot_state::tenspot_map(address_map &map)
+{
+ galaxian_map(map);
+ map(0x0000, 0x3fff).bankr(m_mainbank);
+ map(0x6002, 0x6002).mirror(0x07f8).w(FUNC(tenspot_state::artic_gfxbank_w));
+ map(0x7000, 0x7000).r(*this, FUNC(tenspot_state::dsw_read));
+}
+
+void tenspot_state::tenspot_select_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x07ff).rom();
map(0x2000, 0x23ff).ram();
map(0x4000, 0x4000).portr("SELECT2");
- map(0x6000, 0x6000).w(FUNC(galaxian_state::tenspot_unk_6000_w));
+ map(0x6000, 0x6000).w(FUNC(tenspot_state::unk_6000_w));
map(0xc000, 0xc000).portr("SELECT");
- map(0x8000, 0x8000).w(FUNC(galaxian_state::tenspot_unk_8000_w));
+ map(0x8000, 0x8000).w(FUNC(tenspot_state::unk_8000_w));
map(0xa000, 0xa03f).ram();
- map(0xe000, 0xe000).w(FUNC(galaxian_state::tenspot_unk_e000_w));
+ map(0xe000, 0xe000).w(FUNC(tenspot_state::unk_e000_w));
}
@@ -2522,6 +2631,37 @@ void galaxian_state::froggeram_map(address_map &map)
map(0xb807, 0xb807).w(FUNC(galaxian_state::galaxian_flip_screen_y_w)); // always set to 0?
}
+void guttangt_state::guttangt_rombank_w(uint8_t data)
+{
+ m_rombank->set_entry(data & 1);
+}
+
+// map not derived from schematics
+void guttangt_state::guttangt_map(address_map &map)
+{
+ map(0x0000, 0x1fff).rom().nopw();
+ map(0x2000, 0x27ff).bankr(m_rombank); // 0x2000-0x27ff is banked (so they have room for the new music player), see init / rom loading
+ map(0x2800, 0x3fff).rom().nopw();
+
+ map(0x4000, 0x47ff).ram();
+
+ map(0x5000, 0x53ff).ram().w(FUNC(galaxian_state::galaxian_videoram_w)).share("videoram");
+ map(0x5800, 0x58ff).ram().w(FUNC(galaxian_state::galaxian_objram_w)).share("spriteram");
+
+ map(0x6000, 0x6000).portr("IN0").w(FUNC(guttangt_state::guttangt_rombank_w));
+ map(0x6800, 0x6800).portr("IN1");
+
+ galaxian_map_discrete(map);
+
+ map(0x7000, 0x7000).portr("IN2");
+ map(0x7001, 0x7001).w(FUNC(galaxian_state::irq_enable_w));
+
+ map(0x7006, 0x7006).w(FUNC(galaxian_state::galaxian_flip_screen_x_w)); // always set to 0?
+ map(0x7007, 0x7007).w(FUNC(galaxian_state::galaxian_flip_screen_y_w)); // always set to 0?
+
+ map(0x7800, 0x7800).r("watchdog", FUNC(watchdog_timer_device::reset_r));
+}
+
/*************************************
*
* Sound CPU memory maps
@@ -2560,7 +2700,7 @@ void galaxian_state::konami_sound_portmap(address_map &map)
map(0x00, 0xff).rw(FUNC(galaxian_state::konami_ay8910_r), FUNC(galaxian_state::konami_ay8910_w));
}
-void galaxian_state::monsterz_sound_map(address_map &map)
+void taiyo_sfx_state::monsterz_sound_map(address_map &map)
{
konami_sound_map(map);
map(0x0000, 0x3fff).rom().region("audiocpu", 0); // sound board has space for extra ROM
@@ -2618,22 +2758,32 @@ void galaxian_state::takeoff_sound_portmap(address_map &map)
// Scorpion with 3 x AY-8910A and Digitalker
-void galaxian_state::scorpion_sound_map(address_map &map)
+void zac_scorpion_state::scorpion_sound_map(address_map &map)
{
konami_sound_map(map);
- map(0x3000, 0x3000).r(FUNC(galaxian_state::scorpion_digitalker_intr_r));
+ map(0x3000, 0x3000).r(FUNC(zac_scorpion_state::digitalker_intr_r));
}
-void galaxian_state::scorpion_sound_portmap(address_map &map)
+void zac_scorpion_state::scorpion_sound_portmap(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0xff).rw(FUNC(galaxian_state::scorpion_ay8910_r), FUNC(galaxian_state::scorpion_ay8910_w));
+ map(0x00, 0xff).rw(FUNC(zac_scorpion_state::ay8910_r), FUNC(zac_scorpion_state::ay8910_w));
}
// King and Balloon with DAC
-void galaxian_state::kingball_sound_map(address_map &map)
+void kingball_state::kingball_map(address_map &map)
+{
+ mooncrst_map(map);
+ map(0xb000, 0xb000).mirror(0x07f8).w(FUNC(kingball_state::sound1_w));
+ map(0xb001, 0xb001).mirror(0x07f8).w(FUNC(kingball_state::irq_enable_w));
+ map(0xb002, 0xb002).mirror(0x07f8).w(FUNC(kingball_state::sound2_w));
+ map(0xb003, 0xb003).mirror(0x07f8).w(FUNC(kingball_state::speech_dip_w));
+ map(0xb004, 0xb004).mirror(0x07f8).unmapw(); // disable the stars
+}
+
+void kingball_state::kingball_sound_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0x3fff);
@@ -2641,26 +2791,26 @@ void galaxian_state::kingball_sound_map(address_map &map)
map(0x0000, 0x1fff).rom();
}
-void galaxian_state::kingball_sound_portmap(address_map &map)
+void kingball_state::kingball_sound_portmap(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x00, 0x00).mirror(0xff).r(m_soundlatch, FUNC(generic_latch_8_device::read)).w(FUNC(galaxian_state::kingball_dac_w));
+ map(0x00, 0x00).mirror(0xff).r(m_soundlatch, FUNC(generic_latch_8_device::read)).w(FUNC(kingball_state::dac_w));
}
// SF-X sample player
-void galaxian_state::sfx_sample_map(address_map &map)
+void taiyo_sfx_state::sfx_sample_map(address_map &map)
{
map(0x0000, 0x5fff).rom();
map(0x8000, 0x83ff).mirror(0x6c00).ram();
}
-void galaxian_state::sfx_sample_portmap(address_map &map)
+void taiyo_sfx_state::sfx_sample_portmap(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0xff).rw(FUNC(galaxian_state::sfx_sample_io_r), FUNC(galaxian_state::sfx_sample_io_w));
+ map(0x00, 0xff).rw(FUNC(taiyo_sfx_state::sample_io_r), FUNC(taiyo_sfx_state::sample_io_w));
}
void galaxian_state::turpins_sound_map(address_map &map)
@@ -3515,7 +3665,7 @@ static INPUT_PORTS_START( tenspot )
PORT_DIPUNKNOWN( 0x80, 0x80 )
PORT_START("FAKE_SELECT") /* fake button to move onto next game - until select rom is understood! */
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Next Game (Fake)") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, galaxian_state, tenspot_fake, 0)
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Next Game (Fake)") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, tenspot_state, tenspot_fake, 0)
PORT_MODIFY("IN0")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY
@@ -4677,14 +4827,14 @@ static INPUT_PORTS_START( kingball )
PORT_INCLUDE(galaxian)
PORT_MODIFY("IN0")
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(galaxian_state, kingball_muxbit_r)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(kingball_state, muxbit_r)
/* Relating to above port:Hack? - possibly multiplexed via writes to $b003 */
//PORT_DIPNAME( 0x40, 0x40, "Speech" )
//PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
//PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_MODIFY("IN1")
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(galaxian_state, kingball_noise_r) /* NOISE line */
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(kingball_state, noise_r) /* NOISE line */
PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Coinage ) )
PORT_DIPSETTING( 0xc0, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x40, DEF_STR( 1C_1C ) )
@@ -6149,26 +6299,23 @@ static INPUT_PORTS_START( scobras )
INPUT_PORTS_END
-CUSTOM_INPUT_MEMBER(galaxian_state::moonwar_dial_r)
+CUSTOM_INPUT_MEMBER(moonwar_state::dial_r)
{
- static const char *const dialname[2] = { "P1_DIAL", "P2_DIAL" };
- int p = (~m_moonwar_port_select >> 4) & 1;
-
// see http://www.cityofberwyn.com/schematics/stern/MoonWar_opto.tiff for schematic
- // I.e. a 74ls161 counts from 0 to 15 which is the absolute number of bars passed on the quadrature
+ // i.e. a 74ls161 counts from 0 to 15 which is the absolute number of bars passed on the quadrature
- signed char dialread = ioport(dialname[p])->read();
+ const int8_t dialread = int8_t(uint8_t(m_dials[m_port_select]->read()));
- uint8_t ret;
+ if (dialread < 0)
+ m_direction[m_port_select] = 0x00;
+ else if (dialread > 0)
+ m_direction[m_port_select] = 0x10;
- if (dialread < 0) m_direction[p] = 0x00;
- else if (dialread > 0) m_direction[p] = 0x10;
+ m_counter_74ls161[m_port_select] += std::abs(dialread);
+ m_counter_74ls161[m_port_select] &= 0xf;
- m_counter_74ls161[p] += abs(dialread);
- m_counter_74ls161[p] &= 0xf;
-
- ret = m_counter_74ls161[p] | m_direction[p];
- //fprintf(stderr, "dialread1: %02x, counter_74ls161: %02x, spinner ret is %02x\n", dialread, m_counter_74ls161[p], ret);
+ const uint8_t ret = m_counter_74ls161[m_port_select] | m_direction[m_port_select];
+ //logerror("dialread1: %02x, counter_74ls161: %02x, spinner ret is %02x\n", dialread, m_counter_74ls161[m_port_select], ret);
return ret;
}
@@ -6176,7 +6323,7 @@ CUSTOM_INPUT_MEMBER(galaxian_state::moonwar_dial_r)
/* verified from Z80 code */
static INPUT_PORTS_START( moonwar )
PORT_START("IN0")
- PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(galaxian_state, moonwar_dial_r)
+ PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(moonwar_state, dial_r)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL // cocktail: p2 shield
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
@@ -6765,6 +6912,63 @@ static INPUT_PORTS_START( highroll )
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW1:8")
INPUT_PORTS_END
+
+static INPUT_PORTS_START( guttangt )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_DIPNAME( 0x20, 0x20, "IN0:5" )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) // also acts as button 1 / speedup
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) // ^
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL
+ PORT_DIPNAME( 0x20, 0x20, "IN1:6" )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x40, "A: 2C/1C B: 1C/3C" )
+ PORT_DIPSETTING( 0x00, "A: 1C/1C B: 1C/6C" )
+ PORT_DIPNAME( 0x80, 0x80, "IN1:8" )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x01, 0x01, "IN2:1" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x00, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x08, "4" )
+ PORT_DIPSETTING( 0x0c, "5" )
+ PORT_DIPNAME( 0x10, 0x10, "IN2:5" )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, "IN2:6" )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "IN2:7" )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "IN2:8" )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
/*************************************
*
* Graphics layouts
@@ -6892,13 +7096,17 @@ void galaxian_state::sidam_bootleg_base(machine_config &config)
{
galaxian_base(config);
- /* basic machine hardware */
+ // basic machine hardware
m_maincpu->set_clock(12_MHz_XTAL / 2 / 2);
- /* video hardware */
+ // video hardware
m_gfxdecode->set_info(gfx_sidam);
+ // adjust for 12 MHz pixel clock
m_screen->set_raw(12_MHz_XTAL, SIDAM_HTOTAL, SIDAM_HBEND, SIDAM_HBSTART, GALAXIAN_VTOTAL, GALAXIAN_VBEND, GALAXIAN_VBSTART);
+ set_x_scale(SIDAM_XSCALE);
+ set_h0_start(SIDAM_H0START);
+
}
@@ -7041,10 +7249,10 @@ void galaxian_state::galaxian(machine_config &config)
GALAXIAN_SOUND(config, "cust", 0);
}
-void galaxian_state::pisces(machine_config &config)
+void pisces_state::pisces(machine_config &config)
{
galaxian(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::pisces_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pisces_state::pisces_map);
}
void galaxian_state::victoryc(machine_config &config)
@@ -7076,34 +7284,48 @@ void galaxian_state::pacmanbl(machine_config &config)
{
galaxian(config);
- /* separate tile/sprite ROMs */
+ // separate tile/sprite ROMs
m_gfxdecode->set_info(gfx_pacmanbl);
}
-void galaxian_state::tenspot(machine_config &config)
+void tenspot_state::tenspot(machine_config &config)
{
galaxian(config);
- /* basic machine hardware */
+
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &tenspot_state::tenspot_map);
+
z80_device &selectcpu(Z80(config, "selectcpu", GALAXIAN_PIXEL_CLOCK/3/2)); // ?? mhz
- selectcpu.set_addrmap(AS_PROGRAM, &galaxian_state::tenspot_select_map);
- //selectcpu.set_vblank_int("screen", FUNC(galaxian_state::nmi_line_pulse));
+ selectcpu.set_addrmap(AS_PROGRAM, &tenspot_state::tenspot_select_map);
+ //selectcpu.set_vblank_int("screen", FUNC(tenspot_state::nmi_line_pulse));
- /* separate tile/sprite ROMs */
+ // separate tile/sprite ROMs
m_gfxdecode->set_info(gfx_tenspot);
}
-void galaxian_state::zigzag(machine_config &config)
+void galaxian_state::devilfsg(machine_config &config)
+{
+ pacmanbl(config);
+
+ // IRQ line is INT, not NMI
+ set_irq_line(0);
+}
+
+void zigzagb_state::zigzag(machine_config &config)
{
galaxian_base(config);
- /* separate tile/sprite ROMs */
+ // separate tile/sprite ROMs
m_gfxdecode->set_info(gfx_pacmanbl);
- /* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::zigzag_map);
+ // two sprite generators
+ set_num_spritegens(2);
- /* sound hardware */
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &zigzagb_state::zigzag_map);
+
+ // sound hardware
AY8910(config, m_ay8910[0], GALAXIAN_PIXEL_CLOCK/3/2).add_route(ALL_OUTPUTS, "speaker", 0.5); /* matches PCB video - unconfirmed */
}
@@ -7112,6 +7334,8 @@ void gmgalax_state::gmgalax(machine_config &config)
{
galaxian(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gmgalax_state::gmgalax_map);
+
/* banked video hardware */
m_gfxdecode->set_info(gfx_gmgalax);
m_palette->set_entries(64);
@@ -7156,16 +7380,16 @@ void galaxian_state::thepitm(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::thepitm_map);
}
-void galaxian_state::porter(machine_config &config)
+void pisces_state::porter(machine_config &config)
{
mooncrst(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::porter_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pisces_state::porter_map);
}
-void galaxian_state::skybase(machine_config &config)
+void pisces_state::skybase(machine_config &config)
{
mooncrst(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::skybase_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pisces_state::skybase_map);
}
void galaxian_state::kong(machine_config &config)
@@ -7208,11 +7432,15 @@ void galaxian_state::ckongmc(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::ckongmc_map);
}
-void galaxian_state::bagmanmc(machine_config &config)
+void bagmanmc_state::bagmanmc(machine_config &config)
{
mooncrst(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::bagmanmc_map);
- m_maincpu->set_addrmap(AS_IO, &galaxian_state::bagmanmc_io_map);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &bagmanmc_state::bagmanmc_map);
+ m_maincpu->set_addrmap(AS_IO, &bagmanmc_state::bagmanmc_io_map);
+
+ // IRQ line is INT, not NMI
+ set_irq_line(0);
}
@@ -7223,6 +7451,12 @@ void galaxian_state::fantastc(machine_config &config)
// alternate memory map
m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::fantastc_map);
+ // bullets moved from $60 to $c0
+ set_bullets_base(0xc0);
+
+ // two sprite generators
+ set_num_spritegens(2);
+
// sound hardware
AY8910(config, m_ay8910[0], GALAXIAN_PIXEL_CLOCK/3/2).add_route(ALL_OUTPUTS, "speaker", 0.25); // 3.072MHz
AY8910(config, m_ay8910[1], GALAXIAN_PIXEL_CLOCK/3/2).add_route(ALL_OUTPUTS, "speaker", 0.25); // 3.072MHz
@@ -7249,6 +7483,13 @@ void galaxian_state::timefgtr(machine_config &config)
TIMER(config, "scantimer").configure_scanline(FUNC(galaxian_state::timefgtr_scanline), "screen", 0, 1);
}
+void guttangt_state::guttangt(machine_config &config)
+{
+ galaxian(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &guttangt_state::guttangt_map);
+}
+
+
void galaxian_state::jumpbug(machine_config &config)
{
@@ -7302,32 +7543,37 @@ void galaxian_state::checkmaj(machine_config &config)
}
-void galaxian_state::mshuttle(machine_config &config)
+void mshuttle_state::mshuttle(machine_config &config)
{
galaxian_base(config);
// basic machine hardware
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::mshuttle_map);
- m_maincpu->set_addrmap(AS_OPCODES, &galaxian_state::mshuttle_decrypted_opcodes_map);
- m_maincpu->set_addrmap(AS_IO, &galaxian_state::mshuttle_portmap);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mshuttle_state::mshuttle_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &mshuttle_state::mshuttle_decrypted_opcodes_map);
+ m_maincpu->set_addrmap(AS_IO, &mshuttle_state::mshuttle_portmap);
+
+ // IRQ line is INT, not NMI
+ set_irq_line(0);
// sound hardware
CCLIMBER_AUDIO(config, "cclimber_audio", 0);
}
-void galaxian_state::kingball(machine_config &config)
+void kingball_state::kingball(machine_config &config)
{
mooncrst(config);
- /* basic machine hardware */
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &kingball_state::kingball_map);
+
Z80(config, m_audiocpu, 5000000/2);
- m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::kingball_sound_map);
- m_audiocpu->set_addrmap(AS_IO, &galaxian_state::kingball_sound_portmap);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &kingball_state::kingball_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &kingball_state::kingball_sound_portmap);
GENERIC_LATCH_8(config, m_soundlatch);
- /* sound hardware */
+ // sound hardware
DAC_4BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.53); // unknown DAC
}
@@ -7434,11 +7680,13 @@ void namenayo_state::namenayo(machine_config &config)
konami_base(config);
konami_sound_2x_ay8910(config);
+ // video hardware
m_maincpu->set_addrmap(AS_PROGRAM, &namenayo_state::namenayo_map);
m_palette->set_entries(64);
- /* video hardware */
m_gfxdecode->set_info(gfx_namenayo);
+
+ set_left_sprite_clip(0);
}
// TODO: should be derived from theend, re-sort machine configs later
@@ -7546,23 +7794,23 @@ void galaxian_state::amigo2(machine_config &config) // marked "AMI", but similar
AY8910(config, m_ay8910[1], 12_MHz_XTAL / 2 / 2 / 2).add_route(ALL_OUTPUTS, "speaker", 0.25); /* matches PCB, needs verification */
}
-void galaxian_state::scorpion(machine_config &config)
+void zac_scorpion_state::scorpion(machine_config &config)
{
scramble_base(config);
// alternate memory map
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::scorpion_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &zac_scorpion_state::scorpion_map);
- m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::scorpion_sound_map);
- m_audiocpu->set_addrmap(AS_IO, &galaxian_state::scorpion_sound_portmap);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &zac_scorpion_state::scorpion_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &zac_scorpion_state::scorpion_sound_portmap);
- m_ppi8255[1]->in_pc_callback().set(FUNC(galaxian_state::scorpion_protection_r));
- m_ppi8255[1]->out_pc_callback().set(FUNC(galaxian_state::scorpion_protection_w));
+ m_ppi8255[1]->in_pc_callback().set(FUNC(zac_scorpion_state::protection_r));
+ m_ppi8255[1]->out_pc_callback().set(FUNC(zac_scorpion_state::protection_w));
- /* extra AY8910 with I/O ports */
+ // extra AY8910 with I/O ports
AY8910(config, m_ay8910[2], KONAMI_SOUND_CLOCK/8);
m_ay8910[2]->port_a_write_callback().set(m_digitalker, FUNC(digitalker_device::digitalker_data_w));
- m_ay8910[2]->port_b_write_callback().set(FUNC(galaxian_state::scorpion_digitalker_control_w));
+ m_ay8910[2]->port_b_write_callback().set(FUNC(zac_scorpion_state::digitalker_control_w));
m_ay8910[2]->add_route(ALL_OUTPUTS, "speaker", 0.25);
DIGITALKER(config, m_digitalker, 4_MHz_XTAL).add_route(ALL_OUTPUTS, "speaker", 0.16);
@@ -7577,19 +7825,19 @@ void galaxian_state::ckongs(machine_config &config)
}
-void galaxian_state::sfx(machine_config &config)
+void taiyo_sfx_state::sfx(machine_config &config)
{
scramble_base(config);
config.device_remove("watchdog");
// alternate memory map
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::sfx_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &taiyo_sfx_state::sfx_map);
/* 3rd CPU for the sample player */
Z80(config, m_audio2, KONAMI_SOUND_CLOCK/8);
- m_audio2->set_addrmap(AS_PROGRAM, &galaxian_state::sfx_sample_map);
- m_audio2->set_addrmap(AS_IO, &galaxian_state::sfx_sample_portmap);
+ m_audio2->set_addrmap(AS_PROGRAM, &taiyo_sfx_state::sfx_sample_map);
+ m_audio2->set_addrmap(AS_IO, &taiyo_sfx_state::sfx_sample_portmap);
I8255A(config, m_ppi8255[2]);
m_ppi8255[2]->in_pa_callback().set("soundlatch2", FUNC(generic_latch_8_device::read));
@@ -7598,24 +7846,24 @@ void galaxian_state::sfx(machine_config &config)
/* port on 2nd 8910 is used for communication */
m_ay8910[1]->port_a_write_callback().set("soundlatch2", FUNC(generic_latch_8_device::write));
- m_ay8910[1]->port_b_write_callback().set(FUNC(galaxian_state::sfx_sample_control_w));
+ m_ay8910[1]->port_b_write_callback().set(FUNC(taiyo_sfx_state::sample_control_w));
/* DAC for the sample player */
DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // 16-pin IC (not identified by schematics)
}
-void galaxian_state::monsterz(machine_config &config)
+void taiyo_sfx_state::monsterz(machine_config &config)
{
sfx(config);
// alternate memory map
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::monsterz_map);
- m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::monsterz_sound_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &taiyo_sfx_state::monsterz_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &taiyo_sfx_state::monsterz_sound_map);
- m_ppi8255[1]->out_pa_callback().set(FUNC(galaxian_state::monsterz_porta_1_w));
- m_ppi8255[1]->out_pb_callback().set(FUNC(galaxian_state::monsterz_portb_1_w));
- m_ppi8255[1]->out_pc_callback().set(FUNC(galaxian_state::monsterz_portc_1_w));
+ m_ppi8255[1]->out_pa_callback().set(FUNC(taiyo_sfx_state::monsterz_porta_1_w));
+ m_ppi8255[1]->out_pb_callback().set(FUNC(taiyo_sfx_state::monsterz_portb_1_w));
+ m_ppi8255[1]->out_pc_callback().set(FUNC(taiyo_sfx_state::monsterz_portc_1_w));
// there are likely other differences too, but those can wait until after protection is sorted out
}
@@ -7756,33 +8004,33 @@ void galaxian_state::anteaterg(machine_config &config)
}
-void galaxian_state::moonwar(machine_config &config)
+void moonwar_state::moonwar(machine_config &config)
{
scobra(config);
- m_ppi8255[0]->out_pc_callback().set(FUNC(galaxian_state::moonwar_port_select_w));
+ m_ppi8255[0]->out_pc_callback().set(FUNC(moonwar_state::port_select_w));
- m_palette->set_init(FUNC(galaxian_state::moonwar_palette)); // bullets are less yellow
+ m_palette->set_init(FUNC(moonwar_state::moonwar_palette)); // bullets are less yellow
}
-void galaxian_state::fourplay(machine_config &config)
+void fourplay_state::fourplay(machine_config &config)
{
galaxian(config);
// basic machine hardware
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::fourplay_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fourplay_state::fourplay_map);
- /* video hardware */
+ // video hardware
m_gfxdecode->set_info(gfx_gmgalax);
m_palette->set_entries(64);
}
-void galaxian_state::videight(machine_config &config)
+void videight_state::videight(machine_config &config)
{
galaxian(config);
// basic machine hardware
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::videight_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &videight_state::videight_map);
/* video hardware */
m_gfxdecode->set_info(gfx_videight);
@@ -8023,22 +8271,16 @@ void galaxian_state::decode_victoryc()
*
*************************************/
-void galaxian_state::common_init(galaxian_draw_bullet_func draw_bullet,galaxian_draw_background_func draw_background,
- galaxian_extend_tile_info_func extend_tile_info,galaxian_extend_sprite_info_func extend_sprite_info)
+void galaxian_state::common_init(
+ draw_bullet_func draw_bullet,
+ draw_background_func draw_background,
+ extend_tile_info_func extend_tile_info,
+ extend_sprite_info_func extend_sprite_info)
{
- m_x_scale = GALAXIAN_XSCALE;
- m_h0_start = GALAXIAN_H0START;
- m_irq_enabled = 0;
- m_irq_line = INPUT_LINE_NMI;
- m_numspritegens = 1;
- m_bullets_base = 0x60;
- m_sprites_base = 0x40;
- m_frogger_adjust = false;
- m_sfx_tilemap = false;
- m_draw_bullet_ptr = (draw_bullet != nullptr) ? draw_bullet : &galaxian_state::galaxian_draw_bullet;
- m_draw_background_ptr = (draw_background != nullptr) ? draw_background : &galaxian_state::galaxian_draw_background;
- m_extend_tile_info_ptr = extend_tile_info;
- m_extend_sprite_info_ptr = extend_sprite_info;
+ m_draw_bullet_ptr = draw_bullet_delegate(draw_bullet ? draw_bullet : &galaxian_state::galaxian_draw_bullet, this);
+ m_draw_background_ptr = draw_background_delegate(draw_background ? draw_background : &galaxian_state::galaxian_draw_background, this);
+ m_extend_tile_info_ptr = extend_tile_info_delegate(extend_tile_info ? extend_tile_info : &galaxian_state::empty_extend_tile_info, this);
+ m_extend_sprite_info_ptr = extend_sprite_info_delegate(extend_sprite_info ? extend_sprite_info : &galaxian_state::empty_extend_sprite_info, this);
}
@@ -8137,28 +8379,19 @@ void galaxian_state::init_azurian()
void gmgalax_state::init_gmgalax()
{
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
- m_stars_enabled = 0;
- std::fill(std::begin(m_gfxbank), std::end(m_gfxbank), 0);
-
- /* video extensions */
- common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, &gmgalax_state::gmgalax_extend_tile_info, &gmgalax_state::gmgalax_extend_sprite_info);
-
- /* ROM is banked */
- space.install_read_bank(0x0000, 0x3fff, m_bank1);
- m_bank1->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x4000);
-
- /* callback when the game select is toggled */
- game_changed(*machine().ioport().ports().begin()->second->fields().first(), 0, 0, 0);
- save_item(NAME(m_selected_game));
+ // video extensions
+ common_init(nullptr, nullptr, nullptr, nullptr);
+ m_extend_tile_info_ptr = extend_tile_info_delegate(&gmgalax_state::bagmanmc_extend_tile_info, this);
+ m_extend_sprite_info_ptr = extend_sprite_info_delegate(&gmgalax_state::bagmanmc_extend_sprite_info, this);
}
-void galaxian_state::init_pisces()
+void pisces_state::init_pisces()
{
/* video extensions */
- common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, &galaxian_state::pisces_extend_tile_info, &galaxian_state::pisces_extend_sprite_info);
+ common_init(nullptr, nullptr, nullptr, nullptr);
+ m_extend_tile_info_ptr = extend_tile_info_delegate(&pisces_state::pisces_extend_tile_info, this);
+ m_extend_sprite_info_ptr = extend_sprite_info_delegate(&pisces_state::pisces_extend_sprite_info, this);
}
@@ -8183,24 +8416,35 @@ void galaxian_state::init_victoryc()
}
-void galaxian_state::init_fourplay()
+void fourplay_state::init_fourplay()
{
- m_bank1->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000);
- m_bank1->set_entry(0);
+ m_rombank->configure_entries(0, 4, memregion("maincpu")->base(), 0x4000);
+ m_rombank->set_entry(0);
/* video extensions */
- common_init(NULL, NULL, &galaxian_state::pisces_extend_tile_info, &galaxian_state::pisces_extend_sprite_info);
+ common_init(nullptr, nullptr, nullptr, nullptr);
+ m_extend_tile_info_ptr = extend_tile_info_delegate(&fourplay_state::pisces_extend_tile_info, this);
+ m_extend_sprite_info_ptr = extend_sprite_info_delegate(&fourplay_state::pisces_extend_sprite_info, this);
}
-void galaxian_state::init_videight()
+void videight_state::init_videight()
{
- m_bank1->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000);
- m_bank1->set_entry(0);
+ m_rombank->configure_entries(0, 8, memregion("maincpu")->base(), 0x4000);
+ m_rombank->set_entry(0);
/* video extensions */
- common_init(NULL, NULL, &galaxian_state::videight_extend_tile_info, &galaxian_state::videight_extend_sprite_info);
+ common_init(nullptr, nullptr, nullptr, nullptr);
+ m_extend_tile_info_ptr = extend_tile_info_delegate(&videight_state::videight_extend_tile_info, this);
+ m_extend_sprite_info_ptr = extend_sprite_info_delegate(&videight_state::videight_extend_sprite_info, this);
}
+void guttangt_state::init_guttangt()
+{
+ common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, nullptr, &galaxian_state::guttangt_extend_sprite_info);
+
+ m_rombank->configure_entries(0, 2, memregion("maincpu")->base() + 0x2000, 0x2000);
+ m_rombank->set_entry(0);
+}
/*************************************
*
@@ -8262,26 +8506,22 @@ void galaxian_state::init_pacmanbl()
space.install_write_handler(0x6002, 0x6002, 0, 0x7f8, 0, write8smo_delegate(*this, FUNC(galaxian_state::artic_gfxbank_w)));
}
-uint8_t galaxian_state::tenspot_dsw_read()
+uint8_t tenspot_state::dsw_read()
{
- if (m_tenspot_current_game >= 0 && m_tenspot_current_game < 10)
- return m_tenspot_game_dsw[m_tenspot_current_game]->read();
+ if (m_current_game < m_game_dsw.size())
+ return m_game_dsw[m_current_game]->read();
else
return 0x00;
}
-void galaxian_state::tenspot_set_game_bank(int bank, int from_game)
+void tenspot_state::set_game_bank(int bank, bool invalidate_gfx)
{
char tmp[64];
uint8_t* srcregion;
uint8_t* dstregion;
- int x;
- sprintf(tmp,"game_%d_cpu", bank);
- srcregion = memregion(tmp)->base();
- dstregion = memregion("maincpu")->base();
- memcpy(dstregion, srcregion, 0x4000);
+ m_mainbank->set_entry(bank);
sprintf(tmp,"game_%d_temp", bank);
srcregion = memregion(tmp)->base();
@@ -8290,17 +8530,13 @@ void galaxian_state::tenspot_set_game_bank(int bank, int from_game)
dstregion = memregion("gfx2")->base();
memcpy(dstregion, srcregion, 0x2000);
- if (from_game)
+ if (invalidate_gfx)
{
- for (x=0;x<0x200;x++)
- {
+ for (int x = 0; x < 0x200; x++)
m_gfxdecode->gfx(0)->mark_dirty(x);
- }
- for (x=0;x<0x80;x++)
- {
+ for (int x = 0; x < 0x80; x++)
m_gfxdecode->gfx(1)->mark_dirty(x);
- }
}
sprintf(tmp,"game_%d_prom", bank);
@@ -8311,9 +8547,9 @@ void galaxian_state::tenspot_set_game_bank(int bank, int from_game)
galaxian_palette(*m_palette);
}
-void galaxian_state::init_tenspot()
+void tenspot_state::init_tenspot()
{
- address_space &space = m_maincpu->space(AS_PROGRAM);
+ //address_space &space = m_maincpu->space(AS_PROGRAM);
/* these are needed for batman part 2 to work properly, this banking is probably a property of the artic board,
which tenspot appears to have copied */
@@ -8326,53 +8562,23 @@ void galaxian_state::init_tenspot()
init_galaxian();
-
- space.install_write_handler(0x6002, 0x6002, 0, 0x7f8, 0, write8smo_delegate(*this, FUNC(galaxian_state::artic_gfxbank_w)));
-
- m_tenspot_current_game = 0;
-
- tenspot_set_game_bank(m_tenspot_current_game, 0);
-
- space.install_read_handler(0x7000, 0x7000, read8smo_delegate(*this, FUNC(galaxian_state::tenspot_dsw_read)));
}
-
-void galaxian_state::init_devilfsg()
+void bagmanmc_state::init_bagmanmc()
{
/* video extensions */
- common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, nullptr, nullptr);
-
- /* IRQ line is INT, not NMI */
- m_irq_line = 0;
+ common_init(nullptr, nullptr, nullptr, nullptr);
+ m_extend_tile_info_ptr = extend_tile_info_delegate(&bagmanmc_state::bagmanmc_extend_tile_info, this);
+ m_extend_sprite_info_ptr = extend_sprite_info_delegate(&bagmanmc_state::bagmanmc_extend_sprite_info, this);
}
-void galaxian_state::init_bagmanmc()
+void zigzagb_state::init_zigzag()
{
- /* video extensions */
- common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, &galaxian_state::gmgalax_extend_tile_info, &galaxian_state::gmgalax_extend_sprite_info);
-
- /* IRQ line is INT, not NMI */
- m_irq_line = 0;
-}
-
-
-void galaxian_state::init_zigzag()
-{
- /* video extensions */
+ // video extensions
common_init(nullptr, &galaxian_state::galaxian_draw_background, nullptr, nullptr);
- m_draw_bullet_ptr = nullptr;
-
- /* two sprite generators */
- m_numspritegens = 2;
-
- /* make ROMs 2 & 3 swappable */
- m_bank1->configure_entries(0, 2, memregion("maincpu")->base() + 0x2000, 0x1000);
- membank("bank2")->configure_entries(0, 2, memregion("maincpu")->base() + 0x2000, 0x1000);
-
- /* handler for doing the swaps */
- zigzag_bankswap_w(0);
+ m_draw_bullet_ptr = draw_bullet_delegate();
}
@@ -8462,33 +8668,31 @@ void galaxian_state::init_kong()
}
-void galaxian_state::mshuttle_decode(const uint8_t convtable[8][16])
+void mshuttle_state::mshuttle_decode(const uint8_t convtable[8][16])
{
- uint8_t *rom = memregion("maincpu")->base();
+ const uint8_t *const rom = memregion("maincpu")->base();
- for (int A = 0x0000;A < 0x8000;A++)
+ for (int addr = 0x0000; addr < 0x8000; addr++)
{
- int i,j;
- uint8_t src = rom[A];
+ const uint8_t src = rom[addr];
- /* pick the translation table from bit 0 of the address */
- /* and from bits 1 7 of the source data */
- i = (A & 1) | (src & 0x02) | ((src & 0x80) >> 5);
+ // pick the translation table from bit 0 of the address and from bits 1 7 of the source data
+ const int i = (addr & 1) | (src & 0x02) | ((src & 0x80) >> 5);
- /* pick the offset in the table from bits 0 2 4 6 of the source data */
- j = (src & 0x01) | ((src & 0x04) >> 1) | ((src & 0x10) >> 2) | ((src & 0x40) >> 3);
+ // pick the offset in the table from bits 0 2 4 6 of the source data
+ const int j = (src & 0x01) | ((src & 0x04) >> 1) | ((src & 0x10) >> 2) | ((src & 0x40) >> 3);
- /* decode the opcodes */
- m_decrypted_opcodes[A] = (src & 0xaa) | convtable[i][j];
+ // decode the opcodes
+ m_decrypted_opcodes[addr] = (src & 0xaa) | convtable[i][j];
}
}
-void galaxian_state::init_mshuttle()
+void mshuttle_state::init_mshuttle()
{
static const uint8_t convtable[8][16] =
{
- /* 0xff marks spots which are unused and therefore unknown */
+ // 0xff marks spots which are unused and therefore unknown
{ 0x40,0x41,0x44,0x15,0x05,0x51,0x54,0x55,0x50,0x00,0x01,0x04,0xff,0x10,0x11,0x14 },
{ 0x45,0x51,0x55,0x44,0x40,0x11,0x05,0x41,0x10,0x14,0x54,0x50,0x15,0x04,0x00,0x01 },
{ 0x11,0x14,0x10,0x00,0x44,0x05,0xff,0x04,0x45,0x15,0x55,0x50,0xff,0x01,0x54,0x51 },
@@ -8499,18 +8703,15 @@ void galaxian_state::init_mshuttle()
{ 0x05,0x04,0x51,0x01,0xff,0xff,0x55,0xff,0x00,0x50,0x15,0x14,0x44,0x41,0x40,0x54 },
};
- /* video extensions */
+ // video extensions
common_init(&galaxian_state::mshuttle_draw_bullet, &galaxian_state::galaxian_draw_background, &galaxian_state::mshuttle_extend_tile_info, &galaxian_state::mshuttle_extend_sprite_info);
- /* IRQ line is INT, not NMI */
- m_irq_line = 0;
-
- /* decrypt the code */
+ // decrypt the code
mshuttle_decode(convtable);
}
-void galaxian_state::init_mshuttlj()
+void mshuttle_state::init_mshuttlj()
{
static const uint8_t convtable[8][16] =
{
@@ -8524,13 +8725,10 @@ void galaxian_state::init_mshuttlj()
{ 0x55,0x50,0x15,0x10,0x01,0x04,0x41,0x44,0x45,0x40,0x05,0x00,0x11,0x14,0x51,0x54 },
};
- /* video extensions */
+ // video extensions
common_init(&galaxian_state::mshuttle_draw_bullet, &galaxian_state::galaxian_draw_background, &galaxian_state::mshuttle_extend_tile_info, &galaxian_state::mshuttle_extend_sprite_info);
- /* IRQ line is INT, not NMI */
- m_irq_line = 0;
-
- /* decrypt the code */
+ // decrypt the code
mshuttle_decode(convtable);
}
@@ -8540,12 +8738,6 @@ void galaxian_state::init_fantastc()
/* video extensions */
common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, nullptr, &galaxian_state::upper_extend_sprite_info);
- /* two sprite generators */
- m_numspritegens = 2;
-
- /* bullets moved from $60 to $c0 */
- m_bullets_base = 0xc0;
-
/* decode code */
static const uint16_t lut_am_unscramble[32] = {
0, 2, 4, 6, // ok!
@@ -8570,36 +8762,11 @@ void galaxian_state::init_fantastc()
void galaxian_state::init_timefgtr()
{
- /* two sprite generators */
- m_numspritegens = 2;
-
- /* bullets moved from $60 to $c0 */
- m_bullets_base = 0xc0;
-
/* video extensions */
common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, nullptr, &galaxian_state::upper_extend_sprite_info);
}
-void galaxian_state::init_kingball()
-{
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
- /* video extensions */
- common_init(&galaxian_state::galaxian_draw_bullet, &galaxian_state::galaxian_draw_background, nullptr, nullptr);
-
- /* disable the stars */
- space.unmap_write(0xb004, 0xb004, 0x7f8);
-
- space.install_write_handler(0xb000, 0xb000, 0, 0x7f8, 0, write8smo_delegate(*this, FUNC(galaxian_state::kingball_sound1_w)));
- space.install_write_handler(0xb001, 0xb001, 0, 0x7f8, 0, write8smo_delegate(*this, FUNC(galaxian_state::irq_enable_w)));
- space.install_write_handler(0xb002, 0xb002, 0, 0x7f8, 0, write8smo_delegate(*this, FUNC(galaxian_state::kingball_sound2_w)));
- space.install_write_handler(0xb003, 0xb003, 0, 0x7f8, 0, write8smo_delegate(*this, FUNC(galaxian_state::kingball_speech_dip_w)));
-
- save_item(NAME(m_kingball_speech_dip));
- save_item(NAME(m_kingball_sound));
-}
-
/*************************************
*
* Konami games
@@ -8642,10 +8809,11 @@ void galaxian_state::init_mandinga()
space.unmap_read(0x7000, 0x7000, 0x7ff);
}
-void galaxian_state::init_sfx()
+void taiyo_sfx_state::init_sfx()
{
- /* basic configuration */
- common_init(&galaxian_state::scramble_draw_bullet, &galaxian_state::sfx_draw_background, &galaxian_state::upper_extend_tile_info, nullptr);
+ // basic configuration
+ common_init(&galaxian_state::scramble_draw_bullet, nullptr, &galaxian_state::upper_extend_tile_info, nullptr);
+ m_draw_background_ptr = draw_background_delegate(&taiyo_sfx_state::sfx_draw_background, this);
m_sfx_tilemap = true;
}
@@ -8664,25 +8832,10 @@ void galaxian_state::init_atlantis()
}
-void galaxian_state::init_sidam()
-{
- /* adjust for 12 MHz pixel clock */
- m_x_scale = SIDAM_XSCALE;
- m_h0_start = SIDAM_H0START;
-}
-
void galaxian_state::init_explorer()
{
/* video extensions */
common_init(&galaxian_state::scramble_draw_bullet, &galaxian_state::null_draw_background, nullptr, nullptr); // no 555 timer; there might be no stars at all
- init_sidam();
-}
-
-void galaxian_state::init_amigo2()
-{
- /* video extensions */
- init_turtles();
- init_sidam();
}
@@ -8786,7 +8939,7 @@ void galaxian_state::init_amidar()
#endif
-void galaxian_state::init_scorpion()
+void zac_scorpion_state::init_scorpion()
{
common_init(&galaxian_state::scramble_draw_bullet, &galaxian_state::scramble_draw_background, &galaxian_state::batman2_extend_tile_info, &galaxian_state::upper_extend_sprite_info);
@@ -8851,15 +9004,6 @@ void galaxian_state::init_calipso()
}
-void galaxian_state::init_moonwar()
-{
- /* video extensions */
- common_init(&galaxian_state::scramble_draw_bullet, &galaxian_state::scramble_draw_background, nullptr, nullptr);
-
- save_item(NAME(m_moonwar_port_select));
-}
-
-
void galaxian_state::init_ghostmun()
{
/* same as Pacmanbl... */
@@ -8935,7 +9079,10 @@ void galaxian_state::init_mimonkey()
void namenayo_state::init_namenayo()
{
/* video extensions */
- common_init(&galaxian_state::scramble_draw_bullet, &galaxian_state::namenayo_draw_background, &namenayo_state::namenayo_extend_tile_info, &namenayo_state::namenayo_extend_sprite_info);
+ common_init(&galaxian_state::scramble_draw_bullet, nullptr, nullptr, nullptr);
+ m_draw_background_ptr = draw_background_delegate(&namenayo_state::namenayo_draw_background, this);
+ m_extend_tile_info_ptr = extend_tile_info_delegate(&namenayo_state::namenayo_extend_tile_info, this);
+ m_extend_sprite_info_ptr = extend_sprite_info_delegate(&namenayo_state::namenayo_extend_sprite_info, this);
}
/*************************************
@@ -10349,14 +10496,14 @@ ROM_END
ROM_START( gmgalax )
- ROM_REGION( 0x18000, "maincpu", 0 ) /* 64k for code + 32k for banked code */
- ROM_LOAD( "pcb1_pm1.bin", 0x10000, 0x1000, CRC(19338c70) SHA1(cc2665b7d534d324627d12025ee099ff415d4214) )
- ROM_LOAD( "pcb1_pm2.bin", 0x11000, 0x1000, CRC(18db074d) SHA1(a70ed18f632e947493e648e6fc057dfb7a2a3322) )
- ROM_LOAD( "pcb1_pm3.bin", 0x12000, 0x1000, CRC(abb98b1d) SHA1(bb0109d353359bb192a3e6856a857c2f842838cb) )
- ROM_LOAD( "pcb1_pm4.bin", 0x13000, 0x1000, CRC(2403c78e) SHA1(52d8c8a4efcf47871485080ab217098a019e6579) )
- ROM_LOAD( "pcb1_gx1.bin", 0x14000, 0x1000, CRC(2faa9f53) SHA1(1e7010d407601c5da1adc68bc9f4742c79d57286) )
- ROM_LOAD( "pcb1_gx2.bin", 0x15000, 0x1000, CRC(121c5f16) SHA1(cb1806fa984870133fd883969838dca85f992515) )
- ROM_LOAD( "pcb1_gx3.bin", 0x16000, 0x1000, CRC(02d81a21) SHA1(39209cfb7cf142a65e157544d93803ea542a8efb) )
+ ROM_REGION( 0x8000, "maincpu", 0 ) // 32k banked code
+ ROM_LOAD( "pcb1_pm1.bin", 0x0000, 0x1000, CRC(19338c70) SHA1(cc2665b7d534d324627d12025ee099ff415d4214) )
+ ROM_LOAD( "pcb1_pm2.bin", 0x1000, 0x1000, CRC(18db074d) SHA1(a70ed18f632e947493e648e6fc057dfb7a2a3322) )
+ ROM_LOAD( "pcb1_pm3.bin", 0x2000, 0x1000, CRC(abb98b1d) SHA1(bb0109d353359bb192a3e6856a857c2f842838cb) )
+ ROM_LOAD( "pcb1_pm4.bin", 0x3000, 0x1000, CRC(2403c78e) SHA1(52d8c8a4efcf47871485080ab217098a019e6579) )
+ ROM_LOAD( "pcb1_gx1.bin", 0x4000, 0x1000, CRC(2faa9f53) SHA1(1e7010d407601c5da1adc68bc9f4742c79d57286) )
+ ROM_LOAD( "pcb1_gx2.bin", 0x5000, 0x1000, CRC(121c5f16) SHA1(cb1806fa984870133fd883969838dca85f992515) )
+ ROM_LOAD( "pcb1_gx3.bin", 0x6000, 0x1000, CRC(02d81a21) SHA1(39209cfb7cf142a65e157544d93803ea542a8efb) )
ROM_REGION( 0x4000, "gfx1", 0 )
ROM_LOAD( "pcb2gfx1.bin", 0x0000, 0x0800, CRC(7021bbc0) SHA1(52d2983d74e722fccb31eb02ca56255850c4f41c) )
@@ -10814,17 +10961,17 @@ ROM_START( tenspot )
ROM_LOAD( "u1.u1", 0x0000, 0x100, CRC(f18006f7) SHA1(f9a3541cd7f2b75816227d8befc03d2e33eeebac) )
- /* temporary - replace game_x with the game number you want to test. */
+ // temporary - replace game_x with the game number you want to test.
ROM_REGION( 0x4000, "maincpu", ROMREGION_ERASEFF )
ROM_REGION( 0x2000, "gfx1", ROMREGION_ERASEFF )
ROM_REGION( 0x2000, "gfx2", ROMREGION_ERASEFF )
ROM_REGION( 0x0020, "proms", ROMREGION_ERASEFF )
- ROM_END
+ROM_END
ROM_START( fourplay )
- ROM_REGION( 0x20000, "maincpu", 0 )
- ROM_LOAD( "fourplay.bin", 0x10000, 0x10000, CRC(b42b2c2c) SHA1(f3b6f136b39e7a6adadecb9acf906fcfe649f398) )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "fourplay.bin", 0x00000, 0x10000, CRC(b42b2c2c) SHA1(f3b6f136b39e7a6adadecb9acf906fcfe649f398) )
ROM_REGION( 0x2000, "gfx1", 0 )
ROM_LOAD( "graph1.bin", 0x0000, 0x1000, CRC(359c0c1f) SHA1(9e39baae4ab5763db236d0a49a6665d2e69cba11) )
@@ -10835,8 +10982,8 @@ ROM_START( fourplay )
ROM_END
ROM_START( videight )
- ROM_REGION( 0x30000, "maincpu", 0 )
- ROM_LOAD( "videight.bin", 0x10000, 0x20000, CRC(0601db09) SHA1(0c9cd1afb0034946261219bf42b2f9b1ed5bdb17) )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "videight.bin", 0x00000, 0x20000, CRC(0601db09) SHA1(0c9cd1afb0034946261219bf42b2f9b1ed5bdb17) )
ROM_REGION( 0x10000, "gfx1", 0 )
ROM_LOAD( "v8g1.bin", 0x0000, 0x8000, CRC(af771e33) SHA1(cdc960c5f548e19da4eabdaf8b789ca8ffb6a29f) )
@@ -14744,6 +14891,29 @@ ROM_START( victorycb )
ROM_LOAD( "prom.6l", 0x0000, 0x0020, CRC(25329e5a) SHA1(aff60d02aa4d1d5f16e2d32155c315deee8b4089) )
ROM_END
+// PCB made by Recreativos Franco
+ROM_START( guttangt )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "gg1-2716.rom", 0x0000, 0x0800, CRC(7f338d91) SHA1(d203f229f4f5934467b80ed0f2208e5551aaa383) )
+ ROM_LOAD( "gg2-2758.rom", 0x0800, 0x0800, CRC(ecdbb62b) SHA1(c2eb0316ab789a69b74aeec25e5c690b4334c7c2) )
+ ROM_LOAD( "gg3-2716.rom", 0x1000, 0x0800, CRC(38d71df3) SHA1(f1771256b52ba1bfc1bd472f8a78d6302a7b1299) )
+ ROM_LOAD( "gg4-2716.rom", 0x1800, 0x0800, CRC(7623125a) SHA1(3f3abb9c66751908918fa52e22e153da5fdc0902) )
+ ROM_LOAD( "gg5-2732.rom", 0x2000, 0x0800, CRC(1fe33f92) SHA1(d3e00459015b8bf43fe2e8f6cb57cef775bbb330) )
+ ROM_CONTINUE(0x4000,0x800) // double sized ROM containing banked code, maps at 0x2000
+ ROM_LOAD( "gg6-2716.rom", 0x2800, 0x0800, CRC(60606cd5) SHA1(9a4bf0134c7fa66d2ecd3a745421091b0a086572) )
+ ROM_LOAD( "gg7-2516.rom", 0x3000, 0x0800, CRC(ce0d0a93) SHA1(339bd9c6c40eb2501d1a1adcea0cfa82e3224967) )
+ ROM_LOAD( "gg8-2716.rom", 0x3800, 0x0800, CRC(b8716081) SHA1(e2d1db27ad44876b891cc0a2232ac887bcc5516f) )
+
+ ROM_REGION( 0x2000, "gfx1", 0 )
+ // some tile corruption so one of these is bad
+ ROM_LOAD( "gg9-2732.rom", 0x0000, 0x1000, BAD_DUMP CRC(be6bf522) SHA1(23a09409b7de4bfdb970e4ff23d89a2439a0aee5) )
+ ROM_LOAD( "gg10-2732.rom", 0x1000, 0x1000, BAD_DUMP CRC(b04c34c5) SHA1(a37db70ce67d64daa5f0c41cce1136d1c9d8c175) )
+
+ ROM_REGION( 0x0020, "proms", 0 )
+ // no PROM was present, standard one used as this was a conversion, but it might be incorrect
+ ROM_LOAD( "mmi6331.6l", 0x0000, 0x0020, BAD_DUMP CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) )
+ROM_END
+
/*************************************
*
@@ -14811,6 +14981,7 @@ GAME( 19??, chewing, luctoday, galaxian, luctoday, galaxian_state, init_
GAME( 1982, catacomb, 0, galaxian, catacomb, galaxian_state, init_galaxian, ROT90, "MTM Games", "Catacomb", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE )
GAME( 19??, omegab, theend, galaxian, omegab, galaxian_state, init_galaxian, ROT270, "bootleg?", "Omega (bootleg?)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, highroll, 0, highroll, highroll, galaxian_state, init_highroll, ROT90, "bootleg?", "High Roller", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // auto starts game after inserting coin, bad cards GFX, bad inputs response, not all inputs are mapped
+GAME( 1982, guttangt, locomotn, guttangt, guttangt, guttangt_state, init_guttangt, ROT90, "bootleg (Recreativos Franco?)", "Guttang Gottong (bootleg on Galaxian type hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) // or by 'Tren' ?
// Basic hardware + extra RAM
GAME( 1982, victoryc, 0, victoryc, victoryc, galaxian_state, init_victoryc, ROT270, "Comsoft", "Victory (Comsoft)", MACHINE_SUPPORTS_SAVE )
@@ -14832,23 +15003,23 @@ GAME( 1979, kamakazi3, galaxian, galaxian, superg, galaxian_state, init_
GAME( 1982, azurian, 0, galaxian, azurian, galaxian_state, init_azurian, ROT90, "Rait Electronics Ltd", "Azurian Attack", MACHINE_SUPPORTS_SAVE )
// Extra characters controlled via bank at $6002
-GAME( 19??, pisces, 0, pisces, pisces, galaxian_state, init_pisces, ROT90, "Subelectro", "Pisces", MACHINE_SUPPORTS_SAVE )
-GAME( 19??, piscesb, pisces, pisces, piscesb, galaxian_state, init_pisces, ROT90, "bootleg", "Pisces (bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 19??, omni, pisces, pisces, piscesb, galaxian_state, init_pisces, ROT90, "bootleg", "Omni", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, uniwars, 0, pisces, superg, galaxian_state, init_pisces, ROT90, "Irem", "UniWar S", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, uniwarsa, uniwars, pisces, superg, galaxian_state, init_pisces, ROT90, "bootleg (Karateco)", "UniWar S (bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, mltiwars, uniwars, pisces, superg, galaxian_state, init_pisces, ROT90, "bootleg (Gayton Games)", "Multi Wars (bootleg of UniWar S)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, gteikoku, uniwars, pisces, superg, galaxian_state, init_pisces, ROT90, "Irem", "Gingateikoku no Gyakushu", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, gteikokub, uniwars, pisces, gteikokub, galaxian_state, init_pisces, ROT270, "bootleg", "Gingateikoku no Gyakushu (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, gteikokub2, uniwars, pisces, gteikokub2, galaxian_state, init_pisces, ROT90, "bootleg", "Gingateikoku no Gyakushu (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, gteikokub3, uniwars, pisces, superg, galaxian_state, init_pisces, ROT90, "bootleg (Honly)", "Gingateikoku no Gyakushu (bootleg set 3)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, spacbatt, uniwars, pisces, spacbatt, galaxian_state, init_pisces, ROT90, "bootleg", "Space Battle (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, spacbat2, uniwars, pisces, spacbatt, galaxian_state, init_pisces, ROT90, "bootleg", "Space Battle (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, spacempr, uniwars, pisces, spacbatt, galaxian_state, init_pisces, ROT90, "bootleg", "Space Empire (bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, skyraidr, uniwars, pisces, superg, galaxian_state, init_pisces, ROT90, "bootleg", "Sky Raider (Uniwars bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, galemp, uniwars, pisces, superg, galaxian_state, init_pisces, ROT90, "bootleg (Taito do Brasil)", "Galaxy Empire (bootleg?)", MACHINE_SUPPORTS_SAVE ) // Clearly a hack, but was it licensed?
-GAME( 1980, asideral, uniwars, pisces, asideral, galaxian_state, init_pisces, ROT90, "bootleg (Electrogame S.A.)", "Ataque Sideral (Spanish bootleg of UniWar S)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, pajaroes, uniwars, pisces, asideral, galaxian_state, init_pisces, ROT90, "bootleg (PSV S.A.)", "Pajaro del Espacio (Spanish bootleg of UniWar S)", MACHINE_SUPPORTS_SAVE ) // Very similar to 'asideral'
+GAME( 19??, pisces, 0, pisces, pisces, pisces_state, init_pisces, ROT90, "Subelectro", "Pisces", MACHINE_SUPPORTS_SAVE )
+GAME( 19??, piscesb, pisces, pisces, piscesb, pisces_state, init_pisces, ROT90, "bootleg", "Pisces (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 19??, omni, pisces, pisces, piscesb, pisces_state, init_pisces, ROT90, "bootleg", "Omni", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, uniwars, 0, pisces, superg, pisces_state, init_pisces, ROT90, "Irem", "UniWar S", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, uniwarsa, uniwars, pisces, superg, pisces_state, init_pisces, ROT90, "bootleg (Karateco)", "UniWar S (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, mltiwars, uniwars, pisces, superg, pisces_state, init_pisces, ROT90, "bootleg (Gayton Games)", "Multi Wars (bootleg of UniWar S)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, gteikoku, uniwars, pisces, superg, pisces_state, init_pisces, ROT90, "Irem", "Gingateikoku no Gyakushu", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, gteikokub, uniwars, pisces, gteikokub, pisces_state, init_pisces, ROT270, "bootleg", "Gingateikoku no Gyakushu (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, gteikokub2, uniwars, pisces, gteikokub2, pisces_state, init_pisces, ROT90, "bootleg", "Gingateikoku no Gyakushu (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, gteikokub3, uniwars, pisces, superg, pisces_state, init_pisces, ROT90, "bootleg (Honly)", "Gingateikoku no Gyakushu (bootleg set 3)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, spacbatt, uniwars, pisces, spacbatt, pisces_state, init_pisces, ROT90, "bootleg", "Space Battle (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, spacbat2, uniwars, pisces, spacbatt, pisces_state, init_pisces, ROT90, "bootleg", "Space Battle (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, spacempr, uniwars, pisces, spacbatt, pisces_state, init_pisces, ROT90, "bootleg", "Space Empire (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, skyraidr, uniwars, pisces, superg, pisces_state, init_pisces, ROT90, "bootleg", "Sky Raider (Uniwars bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, galemp, uniwars, pisces, superg, pisces_state, init_pisces, ROT90, "bootleg (Taito do Brasil)", "Galaxy Empire (bootleg?)", MACHINE_SUPPORTS_SAVE ) // Clearly a hack, but was it licensed?
+GAME( 1980, asideral, uniwars, pisces, asideral, pisces_state, init_pisces, ROT90, "bootleg (Electrogame S.A.)", "Ataque Sideral (Spanish bootleg of UniWar S)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, pajaroes, uniwars, pisces, asideral, pisces_state, init_pisces, ROT90, "bootleg (PSV S.A.)", "Pajaro del Espacio (Spanish bootleg of UniWar S)", MACHINE_SUPPORTS_SAVE ) // Very similar to 'asideral'
// Artic Multi-System games - separate tile/sprite ROMs
GAME( 1980, streakng, 0, pacmanbl, streakng, galaxian_state, init_galaxian, ROT90, "Shoei", "Streaking (set 1)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE )
@@ -14859,26 +15030,26 @@ GAME( 1981, pacmanblb, puckman, pacmanbl, pacmanblb, galaxian_state, init_
GAME( 1981, pacmanblc, puckman, pacmanbl, pacmanbl, galaxian_state, init_pacmanbl, ROT270, "bootleg (Calfesa)", "Pac-Man (Calfesa, Spanish bootleg on Galaxian hardware)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // same PROM as Moon Cresta, gives very strange colors and sprites get cut
GAME( 1981, pacmanblv, puckman, pacmanbl, pacmanbl, galaxian_state, init_pacmanbl, ROT270, "bootleg (Video Dens)", "Pac-Man (Video Dens, Spanish bootleg on Galaxian hardware)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, ghostmun, puckman, pacmanbl, streakng, galaxian_state, init_ghostmun, ROT90, "bootleg (Leisure and Allied)", "Ghost Muncher", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, phoenxp2, phoenix, pisces, phoenxp2, galaxian_state, init_batman2, ROT270, "bootleg", "Phoenix Part 2", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, batman2, phoenix, pisces, batman2, galaxian_state, init_batman2, ROT270, "bootleg", "Batman Part 2", MACHINE_SUPPORTS_SAVE ) // Similar to pisces, but with different video banking characteristics
-GAME( 1983, ladybugg, ladybug, pisces, ladybugg, galaxian_state, init_batman2, ROT270, "bootleg", "Lady Bug (bootleg on Galaxian hardware)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, phoenxp2, phoenix, pisces, phoenxp2, pisces_state, init_batman2, ROT270, "bootleg", "Phoenix Part 2", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, batman2, phoenix, pisces, batman2, pisces_state, init_batman2, ROT270, "bootleg", "Batman Part 2", MACHINE_SUPPORTS_SAVE ) // Similar to pisces, but with different video banking characteristics
+GAME( 1983, ladybugg, ladybug, pisces, ladybugg, pisces_state, init_batman2, ROT270, "bootleg", "Lady Bug (bootleg on Galaxian hardware)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, atlantisb, atlantis, galaxian, atlantib, galaxian_state, init_galaxian, ROT270, "bootleg", "Battle of Atlantis (bootleg)", MACHINE_SUPPORTS_SAVE ) // I don't know if this should have a starfield...
-GAME( 1982, tenspot, 0, tenspot, tenspot, galaxian_state, init_tenspot, ROT270, "Thomas Automatics", "Ten Spot", MACHINE_NOT_WORKING ) // Work out how menu works
+GAME( 1982, tenspot, 0, tenspot, tenspot, tenspot_state, init_tenspot, ROT270, "Thomas Automatics", "Ten Spot", MACHINE_NOT_WORKING ) // Work out how menu works
// Separate tile/sprite ROMs, plus INT instead of NMI
-GAME( 1984, devilfsg, devilfsh, pacmanbl, devilfsg, galaxian_state, init_devilfsg, ROT270, "Vision / Artic", "Devil Fish (Galaxian hardware, bootleg?)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, devilfsg, devilfsh, devilfsg, devilfsg, galaxian_state, init_galaxian, ROT270, "Vision / Artic", "Devil Fish (Galaxian hardware, bootleg?)", MACHINE_SUPPORTS_SAVE )
// Sound hardware replaced with AY8910
// We're missing the original set by Taito do Brasil, we only have the bootlegs
-GAME( 1982, zigzagb, 0, zigzag, zigzag, galaxian_state, init_zigzag, ROT90, "bootleg (LAX)", "Zig Zag (Dig Dug conversion on Galaxian hardware, bootleg set 1)", MACHINE_SUPPORTS_SAVE ) // rewrite of Dig Dug (!) not a clone
-GAME( 1982, zigzagb2, zigzagb, zigzag, zigzag, galaxian_state, init_zigzag, ROT90, "bootleg (LAX)", "Zig Zag (Dig Dug conversion on Galaxian hardware, bootleg set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, zigzagb, 0, zigzag, zigzag, zigzagb_state, init_zigzag, ROT90, "bootleg (LAX)", "Zig Zag (Dig Dug conversion on Galaxian hardware, bootleg set 1)", MACHINE_SUPPORTS_SAVE ) // rewrite of Dig Dug (!) not a clone
+GAME( 1982, zigzagb2, zigzagb, zigzag, zigzag, zigzagb_state, init_zigzag, ROT90, "bootleg (LAX)", "Zig Zag (Dig Dug conversion on Galaxian hardware, bootleg set 2)", MACHINE_SUPPORTS_SAVE )
// multi-game select via external switch
GAME( 1981, gmgalax, 0, gmgalax, gmgalax, gmgalax_state, init_gmgalax, ROT90, "bootleg", "Ghostmuncher Galaxian (bootleg)", MACHINE_SUPPORTS_SAVE )
// Multigames
-GAME( 2002, fourplay, 0, fourplay, galaxian, galaxian_state, init_fourplay, ROT90, "Macro", "Four Play", MACHINE_SUPPORTS_SAVE )
-GAME( 2001, videight, 0, videight, warofbug, galaxian_state, init_videight, ROT90, "Macro", "Video Eight", MACHINE_SUPPORTS_SAVE )
+GAME( 2002, fourplay, 0, fourplay, galaxian, fourplay_state, init_fourplay, ROT90, "Macro", "Four Play", MACHINE_SUPPORTS_SAVE )
+GAME( 2001, videight, 0, videight, warofbug, videight_state, init_videight, ROT90, "Macro", "Video Eight", MACHINE_SUPPORTS_SAVE )
/*************************************
@@ -14943,13 +15114,13 @@ GAME( 1981, ckongmc2, ckong, ckongmc, ckongmc2, galaxian_state, init_
GAME( 1981, ckonggx, ckong, ckongg, ckonggx, galaxian_state, init_ckonggx, ROT90, "bootleg", "Crazy Kong (bootleg on Galaxian hardware, encrypted, set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1982, ckongcv, ckong, ckongg, ckonggx, galaxian_state, init_ckonggx, ROT90, "bootleg", "Crazy Kong (bootleg on Galaxian hardware, encrypted, set 2)", MACHINE_NOT_WORKING )
GAME( 1982, ckongis, ckong, ckongg, ckonggx, galaxian_state, init_ckonggx, ROT90, "bootleg", "Crazy Kong (bootleg on Galaxian hardware, encrypted, set 3)", MACHINE_NOT_WORKING )
-GAME( 1982, bagmanmc, bagman, bagmanmc, bagmanmc, galaxian_state, init_bagmanmc, ROT90, "bootleg", "Bagman (bootleg on Moon Cresta hardware, set 1)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
-GAME( 1984, bagmanm2, bagman, bagmanmc, bagmanmc, galaxian_state, init_bagmanmc, ROT90, "bootleg (GIB)", "Bagman (bootleg on Moon Cresta hardware, set 2)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1982, bagmanmc, bagman, bagmanmc, bagmanmc, bagmanmc_state, init_bagmanmc, ROT90, "bootleg", "Bagman (bootleg on Moon Cresta hardware, set 1)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1984, bagmanm2, bagman, bagmanmc, bagmanmc, bagmanmc_state, init_bagmanmc, ROT90, "bootleg (GIB)", "Bagman (bootleg on Moon Cresta hardware, set 2)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
// Other games on basic mooncrst hardware
-GAME( 1982, porter, dockman, porter, porter, galaxian_state, init_pisces, ROT90, "bootleg", "Port Man (bootleg on Moon Cresta hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL )
-GAME( 1982, portera, dockman, porter, porter, galaxian_state, init_pisces, ROT90, "bootleg", "El Estivador (Spanish bootleg of Port Man on Galaxian hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL )
-GAME( 1982, skybase, 0, skybase, skybase, galaxian_state, init_pisces, ROT90, "Omori Electric Co., Ltd.", "Sky Base", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, porter, dockman, porter, porter, pisces_state, init_pisces, ROT90, "bootleg", "Port Man (bootleg on Moon Cresta hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL )
+GAME( 1982, portera, dockman, porter, porter, pisces_state, init_pisces, ROT90, "bootleg", "El Estivador (Spanish bootleg of Port Man on Galaxian hardware)", MACHINE_IMPERFECT_COLORS | MACHINE_NO_COCKTAIL )
+GAME( 1982, skybase, 0, skybase, skybase, pisces_state, init_pisces, ROT90, "Omori Electric Co., Ltd.", "Sky Base", MACHINE_SUPPORTS_SAVE )
GAME( 198?, kong, 0, kong, kong, galaxian_state, init_kong, ROT90, "Taito do Brasil", "Kong (Donkey Kong conversion on Galaxian hardware)", MACHINE_SUPPORTS_SAVE | MACHINE_WRONG_COLORS ) // rewrite of Donkey Kong (!) not a clone
// Larger romspace, 2*AY8910, based on Super Star Crest board?
@@ -14972,15 +15143,15 @@ GAME( 1983, dingo, 0, checkmaj, dingo, galaxian_state, init_
GAME( 1983, dingoe, dingo, checkman, dingo, galaxian_state, init_dingoe, ROT90, "Ashby Computers and Graphics Ltd.", "Dingo (encrypted)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
// Crazy Climber sound plus AY8910 instead of galaxian sound, plus INT instead of NMI
-GAME( 1981, mshuttle, 0, mshuttle, mshuttle, galaxian_state, init_mshuttle, ROT0, "Nichibutsu", "Moon Shuttle (US? set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, mshuttle2, mshuttle, mshuttle, mshuttle, galaxian_state, init_mshuttle, ROT0, "Nichibutsu", "Moon Shuttle (US? set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, mshuttlea, mshuttle, mshuttle, mshuttle, galaxian_state, init_mshuttle, ROT0, "Nichibutsu", "Moon Shuttle (US, version A)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, mshuttlej, mshuttle, mshuttle, mshuttle, galaxian_state, init_mshuttlj, ROT0, "Nichibutsu", "Moon Shuttle (Japan set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, mshuttlej2, mshuttle, mshuttle, mshuttle, galaxian_state, init_mshuttlj, ROT0, "Nichibutsu", "Moon Shuttle (Japan set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mshuttle, 0, mshuttle, mshuttle, mshuttle_state, init_mshuttle, ROT0, "Nichibutsu", "Moon Shuttle (US? set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mshuttle2, mshuttle, mshuttle, mshuttle, mshuttle_state, init_mshuttle, ROT0, "Nichibutsu", "Moon Shuttle (US? set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mshuttlea, mshuttle, mshuttle, mshuttle, mshuttle_state, init_mshuttle, ROT0, "Nichibutsu", "Moon Shuttle (US, version A)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mshuttlej, mshuttle, mshuttle, mshuttle, mshuttle_state, init_mshuttlj, ROT0, "Nichibutsu", "Moon Shuttle (Japan set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mshuttlej2, mshuttle, mshuttle, mshuttle, mshuttle_state, init_mshuttlj, ROT0, "Nichibutsu", "Moon Shuttle (Japan set 2)", MACHINE_SUPPORTS_SAVE )
// 2nd CPU driving DAC for sound
-GAME( 1980, kingball, 0, kingball, kingball, galaxian_state, init_kingball, ROT90, "Namco", "King & Balloon (US)", MACHINE_SUPPORTS_SAVE )
-GAME( 1980, kingballj, kingball, kingball, kingball, galaxian_state, init_kingball, ROT90, "Namco", "King & Balloon (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, kingball, 0, kingball, kingball, kingball_state, init_galaxian, ROT90, "Namco", "King & Balloon (US)", MACHINE_SUPPORTS_SAVE )
+GAME( 1980, kingballj, kingball, kingball, kingball, kingball_state, init_galaxian, ROT90, "Namco", "King & Balloon (Japan)", MACHINE_SUPPORTS_SAVE )
@@ -15019,7 +15190,7 @@ GAME( 1982, amidaru, amidar, turtles, amidaru, galaxian_state, init_
GAME( 1982, amidaro, amidar, turtles, amidaro, galaxian_state, init_turtles, ROT90, "Konami (Olympia license)", "Amidar (Olympia)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, amidarb, amidar, turtles, amidaru, galaxian_state, init_turtles, ROT90, "bootleg", "Amidar (bootleg)", MACHINE_SUPPORTS_SAVE ) // Similar to Amigo bootleg
GAME( 1982, amigo, amidar, turtles, amidaru, galaxian_state, init_turtles, ROT90, "bootleg", "Amigo (bootleg of Amidar, set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1982, amigo2, amidar, amigo2, amidaru, galaxian_state, init_amigo2, ROT90, "bootleg", "Amigo (bootleg of Amidar, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // sound timer might be different?
+GAME( 1982, amigo2, amidar, amigo2, amidaru, galaxian_state, init_turtles, ROT90, "bootleg", "Amigo (bootleg of Amidar, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // sound timer might be different?
GAME( 1982, amidars, amidar, scramble, amidars, galaxian_state, init_scramble, ROT90, "Konami", "Amidar (Scramble hardware)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, mandinga, amidar, scramble, amidars, galaxian_state, init_mandinga, ROT90, "bootleg (Artemi)", "Mandinga (Artemi bootleg of Amidar)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // color PROM needs bitswap<8> on addressing, reference: http://www.youtube.com/watch?v=6uGK4AZxV2U
GAME( 1982, mandingaeg, amidar, scramble, amidars, galaxian_state, init_mandingaeg, ROT90, "bootleg (Electrogame S.A.)", "Mandinga (Electrogame S.A. bootleg of Amidar)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE )
@@ -15065,16 +15236,16 @@ GAME( 1981, ckongs, ckong, ckongs, ckongs, galaxian_state, init_
GAME( 1981, jungsub, jungler, jungsub, jungsub, galaxian_state, init_jungsub, ROT90, "bootleg (Subelectro)", "Jungler (Subelectro, bootleg on Scramble hardware)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // mostly works, bad GFX ROM causes lots of glitches
// Scorpion hardware; based on Scramble but with a 3rd AY-8910 and a speech chip
-GAME( 1982, scorpion, 0, scorpion, scorpion, galaxian_state, init_scorpion, ROT90, "Zaccaria", "Scorpion (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
-GAME( 1982, scorpiona, scorpion, scorpion, scorpion, galaxian_state, init_scorpion, ROT90, "Zaccaria", "Scorpion (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
-GAME( 1982, scorpionb, scorpion, scorpion, scorpion, galaxian_state, init_scorpion, ROT90, "Zaccaria", "Scorpion (set 3)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
-GAME( 19??, scorpionmc, scorpion, scorpnmc, scorpnmc, galaxian_state, init_batman2, ROT90, "bootleg? (Dorneer)", "Scorpion (Moon Cresta hardware)", MACHINE_SUPPORTS_SAVE )
-GAME( 19??, aracnis, scorpion, scorpnmc, aracnis, galaxian_state, init_batman2, ROT90, "bootleg", "Aracnis (bootleg of Scorpion on Moon Cresta hardware)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1982, scorpion, 0, scorpion, scorpion, zac_scorpion_state, init_scorpion, ROT90, "Zaccaria", "Scorpion (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
+GAME( 1982, scorpiona, scorpion, scorpion, scorpion, zac_scorpion_state, init_scorpion, ROT90, "Zaccaria", "Scorpion (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
+GAME( 1982, scorpionb, scorpion, scorpion, scorpion, zac_scorpion_state, init_scorpion, ROT90, "Zaccaria", "Scorpion (set 3)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
+GAME( 19??, scorpionmc, scorpion, scorpnmc, scorpnmc, galaxian_state, init_batman2, ROT90, "bootleg? (Dorneer)", "Scorpion (Moon Cresta hardware)", MACHINE_SUPPORTS_SAVE )
+GAME( 19??, aracnis, scorpion, scorpnmc, aracnis, galaxian_state, init_batman2, ROT90, "bootleg", "Aracnis (bootleg of Scorpion on Moon Cresta hardware)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
// SF-X hardware; based on Scramble with extra Z80 and 8255 driving a DAC-based sample player
-GAME( 1983, sfx, 0, sfx, sfx, galaxian_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System (Nichibutsu license)", "SF-X", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, skelagon, sfx, sfx, sfx, galaxian_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System (Nichibutsu USA license)", "Skelagon", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE)
-GAME( 1982, monsterz, 0, monsterz, sfx, galaxian_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System", "Monster Zero", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
+GAME( 1983, sfx, 0, sfx, sfx, taiyo_sfx_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System (Nichibutsu license)", "SF-X", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, skelagon, sfx, sfx, sfx, taiyo_sfx_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System (Nichibutsu USA license)", "Skelagon", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE)
+GAME( 1982, monsterz, 0, monsterz, sfx, taiyo_sfx_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System", "Monster Zero", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
/*
@@ -15093,8 +15264,8 @@ GAME( 1981, scobrag, scobra, scobra, scobras, galaxian_state, init_
GAME( 1981, scobraggi, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "bootleg (Cocamatic)", "Super Cobra (bootleg, set 3)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // uses the scramble color PROM
GAME( 1981, suprheli, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "bootleg", "Super Heli (Super Cobra bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, moonwar, 0, moonwar, moonwar, galaxian_state, init_moonwar, ROT90, "Stern Electronics", "Moonwar", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, moonwara, moonwar, moonwar, moonwara, galaxian_state, init_moonwar, ROT90, "Stern Electronics", "Moonwar (older)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, moonwar, 0, moonwar, moonwar, moonwar_state, init_scobra, ROT90, "Stern Electronics", "Moonwar", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, moonwara, moonwar, moonwar, moonwara, moonwar_state, init_scobra, ROT90, "Stern Electronics", "Moonwar (older)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, armorcar, 0, scobra, armorcar, galaxian_state, init_scobra, ROT90, "Stern Electronics", "Armored Car (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, armorcar2, armorcar, scobra, armorcar2, galaxian_state, init_scobra, ROT90, "Stern Electronics", "Armored Car (set 2)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/galaxian_rockclim.cpp b/src/mame/drivers/galaxian_rockclim.cpp
new file mode 100644
index 00000000000..bb8c0b2e204
--- /dev/null
+++ b/src/mame/drivers/galaxian_rockclim.cpp
@@ -0,0 +1,296 @@
+// license:BSD-3-Clause
+// copyright-holders:Tomasz Slanina, David Haywood
+
+#include "emu.h"
+#include "includes/galaxian.h"
+
+namespace {
+
+class galaxian_rockclim_state : public galaxian_state
+{
+public:
+ galaxian_rockclim_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ , m_rockclim_videoram(*this,"rockclim_vram")
+ , m_gfxdecode2(*this,"gfxdecode2")
+ , m_palette2(*this,"palette2")
+ { }
+
+ void rockclim(machine_config &config);
+
+ void init_rockclim();
+
+protected:
+ virtual void video_start() override;
+
+private:
+ void rockclim_map(address_map &map);
+
+ void rockclim_palette(palette_device &palette) const;
+ void rockclim_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void rockclim_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
+ void rockclim_videoram_w(offs_t offset, uint8_t data);
+ void rockclim_scroll_w(offs_t offset, uint8_t data);
+ uint8_t rockclim_videoram_r(offs_t offset);
+ TILE_GET_INFO_MEMBER(rockclim_get_tile_info);
+
+ uint16_t m_rockclim_v;
+ uint16_t m_rockclim_h;
+
+ tilemap_t *m_rockclim_tilemap;
+ required_shared_ptr<uint8_t> m_rockclim_videoram;
+ required_device<gfxdecode_device> m_gfxdecode2;
+ required_device<palette_device> m_palette2;
+};
+
+void galaxian_rockclim_state::rockclim_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ m_rockclim_tilemap->draw(*m_screen, bitmap, cliprect, 0,0);
+}
+
+void galaxian_rockclim_state::rockclim_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
+{
+ if ((*code & 0x30) == 0x20)
+ {
+ if (m_gfxbank[2] & 1)
+ {
+ int bank = (((m_gfxbank[0] & 1) << 5) | ((m_gfxbank[1] & 1) << 4));
+ *code = (0x40 + bank) | (*code & 0x0f);
+ }
+ }
+}
+
+uint8_t galaxian_rockclim_state::rockclim_videoram_r(offs_t offset)
+{
+ return m_rockclim_videoram[offset];
+}
+
+void galaxian_rockclim_state::rockclim_videoram_w(offs_t offset, uint8_t data)
+{
+ m_rockclim_videoram[offset] = data;
+ m_rockclim_tilemap->mark_tile_dirty(offset);
+}
+
+void galaxian_rockclim_state::rockclim_scroll_w(offs_t offset, uint8_t data)
+{
+ switch (offset & 3)
+ {
+ case 0: m_rockclim_h = (m_rockclim_h & 0xff00) | data; m_rockclim_tilemap->set_scrollx(0, m_rockclim_h * m_x_scale); break;
+ case 1: m_rockclim_h = (m_rockclim_h & 0x00ff) | (data << 8); m_rockclim_tilemap->set_scrollx(0, m_rockclim_h * m_x_scale); break;
+ case 2: m_rockclim_v = (m_rockclim_v & 0xff00) | data; m_rockclim_tilemap->set_scrolly(0, m_rockclim_v); break;
+ case 3: m_rockclim_v = (m_rockclim_v & 0x00ff) | (data << 8); m_rockclim_tilemap->set_scrolly(0, m_rockclim_v); break;
+ }
+}
+
+void galaxian_rockclim_state::video_start()
+{
+ galaxian_state::video_start();
+
+ m_rockclim_tilemap = &machine().tilemap().create(*m_gfxdecode2, tilemap_get_info_delegate(*this, FUNC(galaxian_rockclim_state::rockclim_get_tile_info)), TILEMAP_SCAN_ROWS,8 * m_x_scale,8,64,32);
+ m_rockclim_v = m_rockclim_h = 0;
+ save_item(NAME(m_rockclim_v));
+ save_item(NAME(m_rockclim_h));
+}
+
+TILE_GET_INFO_MEMBER(galaxian_rockclim_state::rockclim_get_tile_info)
+{
+ uint16_t code = m_rockclim_videoram[tile_index];
+ tileinfo.set(0, code, 0, 0);
+}
+
+void galaxian_rockclim_state::rockclim_map(address_map &map)
+{
+ galaxian_state::mooncrst_map(map);
+
+ map(0x4000, 0x47ff).rw(FUNC(galaxian_rockclim_state::rockclim_videoram_r), FUNC(galaxian_rockclim_state::rockclim_videoram_w)).share("rockclim_vram");//4800 - 4803 = bg scroll ?
+ map(0x4800, 0x4803).w(FUNC(galaxian_rockclim_state::rockclim_scroll_w));
+ map(0x5000, 0x53ff).ram();
+ map(0x5800, 0x5800).portr("IN3");
+ map(0x6000, 0x7fff).rom();
+ map(0x8800, 0x8800).portr("IN4");
+}
+
+
+// verified from Z80 code
+static INPUT_PORTS_START( rockclim )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) // only adds 1 credit if "Coin Slots" is set to 1
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE1 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x00, "30000" )
+ PORT_DIPSETTING( 0x40, "50000" )
+ PORT_DIPNAME( 0x80, 0x00, "Coin Slots" )
+ PORT_DIPSETTING( 0x80, "1" )
+ PORT_DIPSETTING( 0x00, "2" )
+
+ PORT_START("IN3")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY PORT_COCKTAIL
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPSETTING( 0x01, "4" )
+ PORT_DIPSETTING( 0x02, "5" )
+ PORT_DIPSETTING( 0x03, "6" )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_TILT )
+ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN4")
+ PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 9C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 8C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 7C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 6C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x07, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 1C_8C ) )
+ PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 9C_1C ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 8C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 7C_1C ) )
+ PORT_DIPSETTING( 0x30, DEF_STR( 6C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x50, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x70, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_8C ) )
+INPUT_PORTS_END
+
+static const gfx_layout rockclim_charlayout =
+{
+ 8,8,
+ RGN_FRAC(1,2),
+ 4,
+ { 4, 0, RGN_FRAC(1,2)+4, RGN_FRAC(1,2) },
+ { 3, 2, 1, 0,11 ,10, 9, 8 },
+ { 0*8*2, 1*8*2, 2*8*2, 3*8*2, 4*8*2, 5*8*2, 6*8*2, 7*8*2 },
+ 8*8*2
+};
+
+static GFXDECODE_START( gfx_rockclim )
+ GFXDECODE_SCALE("bg_gfx", 0x0000, rockclim_charlayout, 0, 1, GALAXIAN_XSCALE,1)
+GFXDECODE_END
+
+
+void galaxian_rockclim_state::rockclim_palette(palette_device &palette) const
+{
+ const uint8_t *color_prom = memregion("bg_proms")->base();
+
+ // first, the character/sprite palette
+ int const len = memregion("bg_proms")->bytes();
+ for (int i = 0; i < len; i++)
+ {
+ int bit0, bit1, bit2;
+
+ // red component
+ bit0 = BIT(*color_prom, 0);
+ bit1 = BIT(*color_prom, 1);
+ bit2 = BIT(*color_prom, 2);
+ int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+ // green component
+ bit0 = BIT(*color_prom, 3);
+ bit1 = BIT(*color_prom, 4);
+ bit2 = BIT(*color_prom, 5);
+ int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+ // blue component
+ bit0 = BIT(*color_prom, 6);
+ bit1 = BIT(*color_prom, 7);
+ int const b = 0x4f * bit0 + 0xa8 * bit1;
+
+ palette.set_pen_color(i, r, g, b);
+ color_prom++;
+ }
+}
+
+void galaxian_rockclim_state::rockclim(machine_config &config)
+{
+ galaxian_state::mooncrst(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_rockclim_state::rockclim_map);
+
+ // video hardware
+ GFXDECODE(config, m_gfxdecode2, m_palette2, gfx_rockclim);
+ PALETTE(config, m_palette2, FUNC(galaxian_rockclim_state::rockclim_palette), 32);
+}
+
+
+ROM_START( rockclim )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "lc01.a1", 0x0000, 0x1000, CRC(8601ae8d) SHA1(6e0c3b34ce5e6879ce7a116c5c2660889a68320d) )
+ ROM_LOAD( "lc02.a2", 0x1000, 0x1000, CRC(2dde9d4c) SHA1(7e343113116b94894558819a7f77f77e4e952da7) )
+ ROM_LOAD( "lc03.a3", 0x2000, 0x1000, CRC(82c48a67) SHA1(abf95062eb5c9bd4bb3c9b9af59396a4ca6905d8) )
+ ROM_LOAD( "lc04.a4", 0x3000, 0x1000, CRC(7cd3a04a) SHA1(756c12288e120e6f761b266b91920d17cab6926c) )
+ ROM_LOAD( "lc05.a5", 0x6000, 0x1000, CRC(5e542149) SHA1(425a5a8769c3fa0887db8ff04e2a4f32f18d2679) )
+ ROM_LOAD( "lc06.a6", 0x7000, 0x1000, CRC(b2bdca64) SHA1(e72e63725164c922816dda90ac964a94062eab1b) )
+
+ ROM_REGION( 0x800, "melody", 0 ) // Epson 7910C Multi-Melody IC
+ ROM_LOAD( "7910c 537 104", 0x000, 0x800, NO_DUMP ) // actual size unknown, needs decapping
+
+ ROM_REGION( 0x2000, "gfx1", 0 )
+ ROM_LOAD( "lc08.a9", 0x0000, 0x800, CRC(7f18e1ef) SHA1(2a160b994708ec0f06774dde3ec613af7e3f32c6) )
+ ROM_LOAD( "lc07.a7", 0x0800, 0x800, CRC(f18b50ac) SHA1(a2328eb55882a09403cae1a497c611b494649cac) )
+ ROM_LOAD( "lc10.c9", 0x1000, 0x800, CRC(dec5781b) SHA1(b6277fc890d153db24bd48293780cf239a6aa0e7) )
+ ROM_LOAD( "lc09.c7", 0x1800, 0x800, CRC(06c0b5de) SHA1(561cf99a6be03205c7bc5fd15d4d51ee4d6d164b) )
+
+ ROM_REGION( 0x0020, "proms", 0 )
+ ROM_LOAD( "lc11.f4", 0x0000, 0x0020, CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) )
+
+ ROM_REGION( 0x2000, "bg_gfx", 0 )
+ ROM_LOAD( "lc13.g5", 0x0000, 0x1000, CRC(19475f2b) SHA1(5d42aa45a7b519dacdecd3d2edbfee6971693034) )
+ ROM_LOAD( "lc14.g7", 0x1000, 0x1000, CRC(cc96d1db) SHA1(9713b47b723a5d8837f2a8e8c43e46dc41a62e5b) )
+
+ ROM_REGION( 0x0020, "bg_proms", 0 )
+ ROM_LOAD( "lc12.e9", 0x0000, 0x0020, CRC(f6e76547) SHA1(c9ea78d1876156561b3bbf327d7e0299e1d9fd4a) )
+ROM_END
+
+void galaxian_rockclim_state::init_rockclim()
+{
+ galaxian_state::init_mooncrsu();
+
+ m_extend_sprite_info_ptr = extend_sprite_info_delegate(&galaxian_rockclim_state::rockclim_extend_sprite_info, this);
+ m_draw_background_ptr = draw_background_delegate(&galaxian_rockclim_state::rockclim_draw_background, this);
+}
+
+} // Anonymous namespace
+
+GAME( 1981, rockclim, 0, rockclim, rockclim, galaxian_rockclim_state, init_rockclim, ROT180, "Taito", "Rock Climber", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // misses melody
diff --git a/src/mame/drivers/galaxold.cpp b/src/mame/drivers/galaxold.cpp
index b29c15810b8..bf3a57b050c 100644
--- a/src/mame/drivers/galaxold.cpp
+++ b/src/mame/drivers/galaxold.cpp
@@ -184,37 +184,6 @@ void galaxold_state::hustlerb3_map(address_map &map)
}
-void galaxold_state::rockclim_map(address_map &map)
-{
- map(0x0000, 0x3fff).rom();
- map(0x4000, 0x47ff).rw(FUNC(galaxold_state::rockclim_videoram_r), FUNC(galaxold_state::rockclim_videoram_w)).share("rockclim_vram");//4800 - 4803 = bg scroll ?
- map(0x4800, 0x4803).w(FUNC(galaxold_state::rockclim_scroll_w));
- map(0x5000, 0x53ff).ram(); //?
- map(0x5800, 0x5800).portr("IN2");
- map(0x6000, 0x7fff).rom();
- map(0x8000, 0x87ff).ram();
- map(0x8800, 0x8800).portr("DSW1");
- map(0x9000, 0x93ff).ram().w(FUNC(galaxold_state::galaxold_videoram_w)).share("videoram");
- map(0x9400, 0x97ff).r(FUNC(galaxold_state::galaxold_videoram_r));
- map(0x9800, 0x983f).ram().w(FUNC(galaxold_state::galaxold_attributesram_w)).share("attributesram");
- map(0x9840, 0x985f).ram().share("spriteram");
- map(0x9860, 0x987f).ram().share("bulletsram");
- map(0x9880, 0x98ff).ram();
- map(0xa000, 0xa000).portr("IN0");
- map(0xa000, 0xa002).w(FUNC(galaxold_state::galaxold_gfxbank_w));// a002 - sprite bank
- map(0xa003, 0xa003).w(FUNC(galaxold_state::galaxold_coin_counter_w));
- map(0xa004, 0xa007).w("cust", FUNC(galaxian_sound_device::lfo_freq_w));
- map(0xa800, 0xa800).portr("IN1");
- map(0xa800, 0xa802).w("cust", FUNC(galaxian_sound_device::background_enable_w));
- map(0xa803, 0xa803).w("cust", FUNC(galaxian_sound_device::noise_enable_w));
- map(0xa805, 0xa805).w("cust", FUNC(galaxian_sound_device::fire_enable_w));
- map(0xa806, 0xa807).w("cust", FUNC(galaxian_sound_device::vol_w));
- map(0xb000, 0xb000).portr("DSW0").w(FUNC(galaxold_state::galaxold_nmi_enable_w));
- map(0xb006, 0xb006).w(FUNC(galaxold_state::galaxold_flip_screen_x_w));
- map(0xb007, 0xb007).w(FUNC(galaxold_state::galaxold_flip_screen_y_w));
- map(0xb800, 0xb800).r("watchdog", FUNC(watchdog_timer_device::reset_r));
- map(0xb800, 0xb800).w("cust", FUNC(galaxian_sound_device::pitch_w));
-}
void galaxold_state::scramblb_map(address_map &map)
@@ -339,41 +308,8 @@ void galaxold_state::scrambleo_map(address_map &map)
map(0x7001, 0x7001).w(FUNC(galaxold_state::galaxold_nmi_enable_w));
}
-void galaxold_state::guttang_rombank_w(uint8_t data)
-{
- address_space &space = m_maincpu->space(AS_PROGRAM);
-// printf("rombank %02x\n",data);
- space.install_rom(0x2000, 0x27ff, memregion("maincpu")->base() + (data & 1 ? 0x4000 : 0x2000));
-}
-
-
-void galaxold_state::guttang_map(address_map &map)
-{
- map(0x0000, 0x3fff).rom().nopw(); // 0x2000-0x27ff is banked (so they have room for the new music player), see init
- map(0x4000, 0x47ff).ram();
-
- map(0x5000, 0x53ff).ram().w(FUNC(galaxold_state::galaxold_videoram_w)).share("videoram");
-
- map(0x5800, 0x583f).ram().w(FUNC(galaxold_state::galaxold_attributesram_w)).share("attributesram");
- map(0x5840, 0x585f).ram().share("spriteram");
- map(0x5860, 0x587f).ram().share("bulletsram");
- map(0x5880, 0x58ff).ram();
-
- map(0x6000, 0x6000).portr("IN0").w(FUNC(galaxold_state::guttang_rombank_w));
- map(0x6800, 0x6800).portr("IN1");
-
- map(0x6800, 0x6802).w("cust", FUNC(galaxian_sound_device::background_enable_w));
- map(0x6803, 0x6803).w("cust", FUNC(galaxian_sound_device::noise_enable_w));
- map(0x6805, 0x6805).w("cust", FUNC(galaxian_sound_device::fire_enable_w));
- map(0x6806, 0x6807).w("cust", FUNC(galaxian_sound_device::vol_w));
- map(0x7000, 0x7000).portr("IN2");
- map(0x7001, 0x7001).w(FUNC(galaxold_state::galaxold_nmi_enable_w));
-
- map(0x7800, 0x7800).r("watchdog", FUNC(watchdog_timer_device::reset_r)).w("cust", FUNC(galaxian_sound_device::pitch_w));
-
-}
void galaxold_state::_4in1_map(address_map &map)
@@ -812,90 +748,6 @@ static INPUT_PORTS_START( froggerv )
INPUT_PORTS_END
-// verified from Z80 code
-static INPUT_PORTS_START( rockclim )
- PORT_START("IN0")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) // only adds 1 credit if "Coin Slots" is set to 1
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE1 )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY
- PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
-
- PORT_START("IN1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY
- PORT_DIPNAME( 0x40, 0x00, DEF_STR( Bonus_Life ) )
- PORT_DIPSETTING( 0x00, "30000" )
- PORT_DIPSETTING( 0x40, "50000" )
- PORT_DIPNAME( 0x80, 0x00, "Coin Slots" )
- PORT_DIPSETTING( 0x80, "1" )
- PORT_DIPSETTING( 0x00, "2" )
-
- PORT_START("IN2")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY PORT_COCKTAIL
-
- PORT_START("DSW0")
- PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
- PORT_DIPSETTING( 0x00, "3" )
- PORT_DIPSETTING( 0x01, "4" )
- PORT_DIPSETTING( 0x02, "5" )
- PORT_DIPSETTING( 0x03, "6" )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_TILT )
- PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("DSW1")
- PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) )
- PORT_DIPSETTING( 0x00, DEF_STR( 9C_1C ) )
- PORT_DIPSETTING( 0x01, DEF_STR( 8C_1C ) )
- PORT_DIPSETTING( 0x02, DEF_STR( 7C_1C ) )
- PORT_DIPSETTING( 0x03, DEF_STR( 6C_1C ) )
- PORT_DIPSETTING( 0x04, DEF_STR( 5C_1C ) )
- PORT_DIPSETTING( 0x05, DEF_STR( 4C_1C ) )
- PORT_DIPSETTING( 0x06, DEF_STR( 3C_1C ) )
- PORT_DIPSETTING( 0x07, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) )
- PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) )
- PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
- PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
- PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) )
- PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) )
- PORT_DIPSETTING( 0x08, DEF_STR( 1C_8C ) )
- PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) )
- PORT_DIPSETTING( 0x00, DEF_STR( 9C_1C ) )
- PORT_DIPSETTING( 0x10, DEF_STR( 8C_1C ) )
- PORT_DIPSETTING( 0x20, DEF_STR( 7C_1C ) )
- PORT_DIPSETTING( 0x30, DEF_STR( 6C_1C ) )
- PORT_DIPSETTING( 0x40, DEF_STR( 5C_1C ) )
- PORT_DIPSETTING( 0x50, DEF_STR( 4C_1C ) )
- PORT_DIPSETTING( 0x60, DEF_STR( 3C_1C ) )
- PORT_DIPSETTING( 0x70, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) )
- PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) )
- PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) )
- PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) )
- PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) )
- PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) )
- PORT_DIPSETTING( 0x80, DEF_STR( 1C_8C ) )
-INPUT_PORTS_END
// verified from Z80 code
@@ -1593,68 +1445,6 @@ INPUT_PORTS_END
-static INPUT_PORTS_START( guttangt )
- PORT_START("IN0")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
- PORT_DIPNAME( 0x40, 0x40, "IN0:6" )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
-
- PORT_START("IN1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
- PORT_DIPNAME( 0x04, 0x00, "IN1:3" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x04, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, "IN1:4" )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, "IN1:5" )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, "IN1:6" )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, "IN1:7" )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, "IN1:8" )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("IN2")
- PORT_DIPNAME( 0x01, 0x01, "IN2:1" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, "IN2:2" )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x00, "IN2:3" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x04, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, "IN2:4" )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, "IN2:5" )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, "IN2:6" )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, "IN2:7" )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, "IN2:8" )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-INPUT_PORTS_END
-
static const gfx_layout galaxold_charlayout =
{
@@ -1717,22 +1507,6 @@ static const gfx_layout _4in1_spritelayout =
32*8
};
-static const gfx_layout rockclim_charlayout =
-{
- 8,8,
- 256,
- 4,//?
- { 4, 0,4096*8+4,4096*8 },
- { 3, 2, 1, 0,11 ,10, 9, 8 },
- { 0*8*2, 1*8*2, 2*8*2, 3*8*2, 4*8*2, 5*8*2, 6*8*2, 7*8*2 },
- 8*8*2
-};
-
-static GFXDECODE_START( gfx_rockclim )
- GFXDECODE_ENTRY( "gfx1", 0x0000, galaxold_charlayout, 32, 8 )
- GFXDECODE_ENTRY( "gfx1", 0x0000, galaxold_spritelayout, 32, 8 )
- GFXDECODE_ENTRY( "gfx2", 0x0000, rockclim_charlayout, 0, 1 )
-GFXDECODE_END
static GFXDECODE_START( gfx_galaxian )
GFXDECODE_ENTRY( "gfx1", 0x0000, galaxold_charlayout, 0, 8 )
@@ -1895,22 +1669,6 @@ void galaxold_state::scrambleo(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::scrambleo_map);
}
-void galaxold_state::guttang(machine_config &config)
-{
- galaxian(config);
-
- // basic machine hardware
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::guttang_map);
-
- // video hardware
- m_palette->set_entries(32+2+64+1); // 32 for the characters, 2 for the bullets, 64 for the stars, 1 for background
- m_palette->set_init(FUNC(galaxold_state::galaxold_palette));
-// m_palette->set_init(FUNC(galaxold_state::scrambold_palette));
-
- MCFG_VIDEO_START_OVERRIDE(galaxold_state,mooncrst)
-}
-
-
void galaxold_state::_4in1(machine_config &config)
{
galaxian(config);
@@ -1946,21 +1704,6 @@ void galaxold_state::dkongjrmc(machine_config &config)
}
-void galaxold_state::rockclim(machine_config &config)
-{
- mooncrst(config);
-
- // basic machine hardware
- m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::rockclim_map);
- m_gfxdecode->set_info(gfx_rockclim);
-
- // video hardware
- MCFG_VIDEO_START_OVERRIDE(galaxold_state,rockclim)
- m_palette->set_entries(64+64+2); // 64 colors only, but still uses bullets so we need to keep the palette big
- m_palette->set_init(FUNC(galaxold_state::rockclim_palette));
-
- m_screen->set_size(64*8, 32*8);
-}
void galaxold_state::drivfrcg(machine_config &config)
@@ -1982,7 +1725,7 @@ void galaxold_state::drivfrcg(machine_config &config)
m_screen->set_palette(m_palette);
m_screen->screen_vblank().set_inputline(m_maincpu, 0, ASSERT_LINE);
- PALETTE(config, m_palette, FUNC(galaxold_state::rockclim_palette), 64);
+ PALETTE(config, m_palette, FUNC(galaxold_state::s2650_palette), 64);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gmgalax);
@@ -2043,7 +1786,7 @@ void galaxold_state::racknrol(machine_config &config)
// video hardware
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galaxian);
- PALETTE(config, m_palette, FUNC(galaxold_state::rockclim_palette), 32);
+ PALETTE(config, m_palette, FUNC(galaxold_state::s2650_palette), 32);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
@@ -2070,7 +1813,7 @@ void galaxold_state::hexpoola(machine_config &config)
maincpu.intack_handler().set(FUNC(galaxold_state::hunchbkg_intack));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galaxian);
- PALETTE(config, m_palette, FUNC(galaxold_state::rockclim_palette), 32);
+ PALETTE(config, m_palette, FUNC(galaxold_state::s2650_palette), 32);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
@@ -2154,30 +1897,6 @@ ROM_START( froggerv )
ROM_END
-ROM_START( rockclim )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "lc01.a1", 0x0000, 0x1000, CRC(8601ae8d) SHA1(6e0c3b34ce5e6879ce7a116c5c2660889a68320d) )
- ROM_LOAD( "lc02.a2", 0x1000, 0x1000, CRC(2dde9d4c) SHA1(7e343113116b94894558819a7f77f77e4e952da7) )
- ROM_LOAD( "lc03.a3", 0x2000, 0x1000, CRC(82c48a67) SHA1(abf95062eb5c9bd4bb3c9b9af59396a4ca6905d8) )
- ROM_LOAD( "lc04.a4", 0x3000, 0x1000, CRC(7cd3a04a) SHA1(756c12288e120e6f761b266b91920d17cab6926c) )
- ROM_LOAD( "lc05.a5", 0x6000, 0x1000, CRC(5e542149) SHA1(425a5a8769c3fa0887db8ff04e2a4f32f18d2679) )
- ROM_LOAD( "lc06.a6", 0x7000, 0x1000, CRC(b2bdca64) SHA1(e72e63725164c922816dda90ac964a94062eab1b) )
-
- ROM_REGION( 0x2000, "gfx1", 0 )
- ROM_LOAD( "lc08.a9", 0x0000, 0x800, CRC(7f18e1ef) SHA1(2a160b994708ec0f06774dde3ec613af7e3f32c6) )
- ROM_LOAD( "lc07.a7", 0x0800, 0x800, CRC(f18b50ac) SHA1(a2328eb55882a09403cae1a497c611b494649cac) )
- ROM_LOAD( "lc10.c9", 0x1000, 0x800, CRC(dec5781b) SHA1(b6277fc890d153db24bd48293780cf239a6aa0e7) )
- ROM_LOAD( "lc09.c7", 0x1800, 0x800, CRC(06c0b5de) SHA1(561cf99a6be03205c7bc5fd15d4d51ee4d6d164b) )
-
- ROM_REGION( 0x2000, "gfx2", 0 )
- ROM_LOAD( "lc13.g5", 0x0000, 0x1000, CRC(19475f2b) SHA1(5d42aa45a7b519dacdecd3d2edbfee6971693034) )
- ROM_LOAD( "lc14.g7", 0x1000, 0x1000, CRC(cc96d1db) SHA1(9713b47b723a5d8837f2a8e8c43e46dc41a62e5b) )
-
- ROM_REGION( 0x0040, "proms", 0 )
- ROM_LOAD( "lc12.e9", 0x0000, 0x0020, CRC(f6e76547) SHA1(c9ea78d1876156561b3bbf327d7e0299e1d9fd4a) )
- ROM_LOAD( "lc11.f4", 0x0020, 0x0020, CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) )
-ROM_END
-
ROM_START( scramblb )
ROM_REGION( 0x10000, "maincpu", 0 )
@@ -2710,26 +2429,7 @@ ROM_START( trvchlng )
ROM_END
-// PCB made by Recreativos Franco
-ROM_START( guttangt )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "gg1-2716.rom", 0x0000, 0x0800, CRC(7f338d91) SHA1(d203f229f4f5934467b80ed0f2208e5551aaa383) )
- ROM_LOAD( "gg2-2758.rom", 0x0800, 0x0800, CRC(ecdbb62b) SHA1(c2eb0316ab789a69b74aeec25e5c690b4334c7c2) )
- ROM_LOAD( "gg3-2716.rom", 0x1000, 0x0800, CRC(38d71df3) SHA1(f1771256b52ba1bfc1bd472f8a78d6302a7b1299) )
- ROM_LOAD( "gg4-2716.rom", 0x1800, 0x0800, CRC(7623125a) SHA1(3f3abb9c66751908918fa52e22e153da5fdc0902) )
- ROM_LOAD( "gg5-2732.rom", 0x2000, 0x0800, CRC(1fe33f92) SHA1(d3e00459015b8bf43fe2e8f6cb57cef775bbb330) )
- ROM_CONTINUE(0x4000,0x800) // banked code, maps at 0x2000
- ROM_LOAD( "gg6-2716.rom", 0x2800, 0x0800, CRC(60606cd5) SHA1(9a4bf0134c7fa66d2ecd3a745421091b0a086572) )
- ROM_LOAD( "gg7-2516.rom", 0x3000, 0x0800, CRC(ce0d0a93) SHA1(339bd9c6c40eb2501d1a1adcea0cfa82e3224967) )
- ROM_LOAD( "gg8-2716.rom", 0x3800, 0x0800, CRC(b8716081) SHA1(e2d1db27ad44876b891cc0a2232ac887bcc5516f) )
-
- ROM_REGION( 0x2000, "gfx1", 0 )
- ROM_LOAD( "gg9-2732.rom", 0x0000, 0x1000, CRC(be6bf522) SHA1(23a09409b7de4bfdb970e4ff23d89a2439a0aee5) )
- ROM_LOAD( "gg10-2732.rom", 0x1000, 0x1000, CRC(b04c34c5) SHA1(a37db70ce67d64daa5f0c41cce1136d1c9d8c175) )
-
- ROM_REGION( 0x0020, "proms", 0 ) // no PROM was present..
- ROM_LOAD( "mmi6331.6l", 0x0000, 0x0020, BAD_DUMP CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) )
-ROM_END
+
/*
@@ -2779,16 +2479,11 @@ ROM_START( bullsdrtg )
ROM_LOAD( "prom.bin", 0x0000, 0x0020, CRC(16b19bfa) SHA1(a0e9217f9bc5b06212d5f22dcc3dc4b2838788ba) )
ROM_END
-void galaxold_state::init_guttangt()
-{
- m_maincpu->space(AS_PROGRAM).install_rom(0x2000, 0x27ff, memregion("maincpu")->base() + 0x2000);
-}
// Z80 games
// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY, FULLNAME, FLAGS
GAME( 1981, vpool, hustler, mooncrst, vpool, galaxold_state, empty_init, ROT90, "bootleg", "Video Pool (bootleg on Moon Cresta hardware)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, rockclim, 0, rockclim, rockclim, galaxold_state, empty_init, ROT180, "Taito", "Rock Climber", MACHINE_SUPPORTS_SAVE )
GAME( 1981, scramblb, scramble, scramblb, scramblb, galaxold_state, empty_init, ROT90, "bootleg", "Scramble (bootleg on Galaxian hardware)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1981, scramb2, scramble, scramb2, scramb2, galaxold_state, empty_init, ROT90, "bootleg", "Scramble (bootleg, set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1981, scramb3, scramble, scramb3, scramb2, galaxold_state, empty_init, ROT90, "bootleg", "Scramble (bootleg, set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
@@ -2799,7 +2494,6 @@ GAME( 1982, dkongjrm, dkongjr, dkongjrm, dkongjrm, galaxold_state, empty_ini
GAME( 1982, dkongjrmc, dkongjr, dkongjrmc, dkongjrmc, galaxold_state, empty_init, ROT90, "bootleg (Centromatic)", "Donkey Kong Jr. (bootleg on Moon Cresta hardware, set 2)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // sprites leave artifacts
GAME( 1982, tazzmang, tazmania, tazzmang, tazzmang, galaxold_state, empty_init, ROT90, "bootleg", "Tazz-Mania (bootleg on Galaxian hardware)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1982, tazzmang2, tazmania, tazzmang, tazzmang, galaxold_state, empty_init, ROT90, "bootleg", "Tazz-Mania (bootleg on Galaxian hardware with Starfield)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
-GAME( 1982, guttangt, locomotn, guttang, guttangt, galaxold_state, init_guttangt, ROT270, "bootleg (Recreativos Franco?)", "Guttang Gottong (bootleg on Galaxian type hardware)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // or by 'Tren' ?
// Videotron cartridge system
GAME( 1981, hustlerb3, hustler, videotron, hustlerb3, galaxold_state, empty_init, ROT90, "bootleg (Videotron)", "Video Pool (Video Hustler bootleg)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/gameplan.cpp b/src/mame/drivers/gameplan.cpp
index a2460fb8e8d..d6e55864a45 100644
--- a/src/mame/drivers/gameplan.cpp
+++ b/src/mame/drivers/gameplan.cpp
@@ -938,6 +938,7 @@ void gameplan_state::machine_start()
save_item(NAME(m_video_y));
save_item(NAME(m_video_command));
save_item(NAME(m_video_data));
+ save_item(NAME(m_video_previous));
}
@@ -948,6 +949,7 @@ void gameplan_state::machine_reset()
m_video_y = 0;
m_video_command = 0;
m_video_data = 0;
+ m_video_previous = 0;
}
void gameplan_state::gameplan(machine_config &config)
@@ -998,6 +1000,9 @@ void gameplan_state::leprechn(machine_config &config)
{
gameplan(config);
m_maincpu->set_clock(LEPRECHAUN_MAIN_CPU_CLOCK);
+ m_via_0->set_clock(LEPRECHAUN_MAIN_CPU_CLOCK);
+ m_via_1->set_clock(LEPRECHAUN_MAIN_CPU_CLOCK);
+ m_via_2->set_clock(LEPRECHAUN_MAIN_CPU_CLOCK);
/* basic machine hardware */
m_audiocpu->set_addrmap(AS_PROGRAM, &gameplan_state::leprechn_audio_map);
diff --git a/src/mame/drivers/goldstar.cpp b/src/mame/drivers/goldstar.cpp
index fdea2ef8d26..2be3d9e2543 100644
--- a/src/mame/drivers/goldstar.cpp
+++ b/src/mame/drivers/goldstar.cpp
@@ -12233,8 +12233,7 @@ ROM_START( lucky8e )
ROM_REGION( 0x18000, "gfx1", 0 )
ROM_LOAD( "27256.5", 0x00000, 0x8000, CRC(59026af3) SHA1(3d7f7e78968ca26275635aeaa0e994468a3da575) )
ROM_LOAD( "27256.6", 0x08000, 0x8000, CRC(67a073c1) SHA1(36194d57d0dc0601fa1fdf2e6806f11b2ea6da36) )
-// ROM_LOAD( "27128.7", 0x10000, 0x4000, BAD_DUMP CRC(0000b9d0) SHA1(00008fe8a116c33bbd712a639224d041447a45c1) )
- ROM_LOAD( "7", 0x10000, 0x8000, CRC(c415b9d0) SHA1(fd558fe8a116c33bbd712a639224d041447a45c1) ) // from parent set, since 2 of 3 bitplanes matched
+ ROM_LOAD( "27128.7", 0x10000, 0x8000, BAD_DUMP CRC(c415b9d0) SHA1(fd558fe8a116c33bbd712a639224d041447a45c1) ) // from parent set, since 2 of 3 bitplanes matched
ROM_REGION( 0x8000, "gfx2", 0 )
ROM_LOAD( "27128.1", 0x0000, 0x2000, CRC(8ca19ee7) SHA1(2e0cd4a74bd9abef60ed561ba4e5bb2681ce1222) ) // overdump?
diff --git a/src/mame/drivers/gticlub.cpp b/src/mame/drivers/gticlub.cpp
index b1a0a12b00d..2f48600b04c 100644
--- a/src/mame/drivers/gticlub.cpp
+++ b/src/mame/drivers/gticlub.cpp
@@ -963,6 +963,7 @@ void gticlub_state::hangplt(machine_config &config)
m_voodoo[0]->set_screen_tag("lscreen");
m_voodoo[0]->set_cpu_tag(m_dsp[0]);
m_voodoo[0]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_voodoo[0]->stall_callback().set(m_dsp[0], FUNC(adsp21062_device::write_stall));
VOODOO_1(config, m_voodoo[1], STD_VOODOO_1_CLOCK);
m_voodoo[1]->set_fbmem(2);
@@ -970,6 +971,7 @@ void gticlub_state::hangplt(machine_config &config)
m_voodoo[1]->set_screen_tag("rscreen");
m_voodoo[1]->set_cpu_tag(m_dsp[1]);
m_voodoo[1]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
+ m_voodoo[1]->stall_callback().set(m_dsp[1], FUNC(adsp21062_device::write_stall));
K033906(config, "k033906_1", 0, m_voodoo[0]);
K033906(config, "k033906_2", 0, m_voodoo[1]);
diff --git a/src/mame/drivers/hh_cops1.cpp b/src/mame/drivers/hh_cops1.cpp
index 12f23182242..f17c55c4f07 100644
--- a/src/mame/drivers/hh_cops1.cpp
+++ b/src/mame/drivers/hh_cops1.cpp
@@ -403,13 +403,13 @@ static INPUT_PORTS_START( qkracerm )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷")
PORT_START("IN.2") // DS8874 OUT 6 port K
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
PORT_START("IN.3") // DS8874 OUT 7 port K
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp
index 8af7d653f19..46478e86b35 100644
--- a/src/mame/drivers/hh_sm510.cpp
+++ b/src/mame/drivers/hh_sm510.cpp
@@ -9240,6 +9240,74 @@ ROM_END
/***************************************************************************
+ Tronica Space Mission (model SM-11)
+ * PCB label SM-11 250582
+ * Sharp SM5A label 0126 228B TRONICA (no decap)
+ * lcd screen with custom segments, 1-bit sound
+
+***************************************************************************/
+
+class trspacmis_state : public hh_sm510_state
+{
+public:
+ trspacmis_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void trspacmis(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( trspacmis )
+ PORT_START("IN.0") // R2
+ PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( On ) )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01?
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test?
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test?
+
+ PORT_START("IN.1") // R3
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.2") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm")
+
+ PORT_START("BA")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY
+
+ PORT_START("B")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL")
+INPUT_PORTS_END
+
+void trspacmis_state::trspacmis(machine_config &config)
+{
+ sm5a_common(config, 1601, 1080); // R mask option confirmed
+}
+
+// roms
+
+ROM_START( trspacmis )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "0126_228b", 0x0000, 0x0740, CRC(3d319537) SHA1(007d376cfd29574554caa59ed9163178179ae9c5) )
+
+ ROM_REGION( 106675, "screen", 0)
+ ROM_LOAD( "trspacmis.svg", 0, 106675, CRC(45d7b798) SHA1(db08fef21462507a115547ecf8eac38260a0c868) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
Elektronika Автослалом (Autoslalom) (model IM-23)
* KB1013VK1-2 MCU
* lcd screen with custom segments, 1-bit sound
@@ -9548,6 +9616,7 @@ CONS( 1992, tbatmana, 0, 0, tbatmana, tbatmana, tbatmana_s
CONS( 1983, trshutvoy, 0, 0, trshutvoy, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Shuttle Voyage", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
CONS( 1983, tigarden, trshutvoy, 0, tigarden, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Thief in Garden", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
CONS( 1982, trsrescue, 0, 0, trsrescue, trsrescue, trsrescue_state, empty_init, "Tronica", "Space Rescue", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+CONS( 1982, trspacmis, 0, 0, trspacmis, trspacmis, trspacmis_state, empty_init, "Tronica", "Space Mission", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
// misc
CONS( 1990, auslalom, 0, 0, auslalom, auslalom, auslalom_state, empty_init, "Elektronika", "Autoslalom", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
diff --git a/src/mame/drivers/hornet.cpp b/src/mame/drivers/hornet.cpp
index 78d6390290e..15e81ac9cd5 100644
--- a/src/mame/drivers/hornet.cpp
+++ b/src/mame/drivers/hornet.cpp
@@ -409,6 +409,7 @@ public:
void init_hornet();
void init_sscope();
void init_sscope2();
+ void init_gradius4();
protected:
virtual void machine_start() override;
@@ -433,7 +434,7 @@ private:
required_ioport_array<3> m_in;
required_ioport m_dsw;
optional_ioport m_eepromout;
- optional_ioport_array<2> m_analog;
+ optional_ioport_array<3> m_analog;
output_finder<2> m_pcb_digit;
optional_region_ptr<uint32_t> m_comm_board_rom;
optional_memory_bank m_comm_bank;
@@ -448,6 +449,8 @@ private:
uint16_t m_gn680_ret0;
uint16_t m_gn680_ret1;
+ bool m_sndres;
+
uint8_t sysreg_r(offs_t offset);
void sysreg_w(offs_t offset, uint8_t data);
void comm1_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
@@ -562,24 +565,35 @@ void hornet_state::sysreg_w(offs_t offset, uint8_t data)
break;
case 4: // System Register 1
+ {
/*
- 0x80 = SNDRES (sound reset)
- 0x40 = COMRES (COM reset)
- 0x20 = COINRQ2 (EEPROM SCL?)
- 0x10 = COINRQ1 (EEPROM data)
- 0x08 = ADCS (ADC CS)
- 0x04 = ADCONV (ADC CONV)
- 0x02 = ADDI (ADC DI)
- 0x01 = ADDSCLK (ADC SCLK)
+ 0x80 = SNDRES (sound reset)
+ 0x40 = COMRES (COM reset)
+ 0x20 = COINRQ2 (EEPROM SCL?)
+ 0x10 = COINRQ1 (EEPROM data)
+ 0x08 = ADCS (ADC CS)
+ 0x04 = ADCONV (ADC CONV)
+ 0x02 = ADDI (ADC DI)
+ 0x01 = ADDSCLK (ADC SCLK)
*/
m_adc12138->cs_w((data >> 3) & 0x1);
m_adc12138->conv_w((data >> 2) & 0x1);
m_adc12138->di_w((data >> 1) & 0x1);
m_adc12138->sclk_w(data & 0x1);
- m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE);
+ bool sndres = (data & 0x80) ? true : false;
+ m_audiocpu->set_input_line(INPUT_LINE_RESET, (sndres) ? CLEAR_LINE : ASSERT_LINE);
+ if (sndres != m_sndres)
+ {
+ // clear interrupts when reset line is triggered
+ m_audiocpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
+ }
+
+ m_sndres = sndres;
+
osd_printf_debug("System register 1 = %02X\n", data);
break;
+ }
case 5: // Sound Control Register
/*
@@ -615,6 +629,7 @@ void hornet_state::sysreg_w(offs_t offset, uint8_t data)
m_maincpu->set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE);
if (data & 0x40)
m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
+
m_konppc->set_cgboard_id((data >> 4) & 3);
m_cg_view.select(m_konppc->get_cgboard_id() ? 1 : 0);
break;
@@ -993,6 +1008,33 @@ static INPUT_PORTS_START( sscope2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("lan_eeprom", eeprom_serial_93cxx_device, cs_write)
INPUT_PORTS_END
+static INPUT_PORTS_START( thrilld )
+ PORT_INCLUDE( hornet )
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Gear Shift Up")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Gear Shift Down")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("Gear Shift Left")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("Gear Shift Right")
+ PORT_BIT( 0x07, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_MODIFY("IN1")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_MODIFY("IN2")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT (0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("ANALOG1")
+ PORT_BIT(0x7ff, 0x400, IPT_PADDLE) PORT_NAME("Steering Wheel") PORT_MINMAX(0x000, 0x7ff) PORT_SENSITIVITY(100) PORT_KEYDELTA(60)
+
+ PORT_START("ANALOG2")
+ PORT_BIT(0x7ff, 0x000, IPT_PEDAL) PORT_NAME("Gas Pedal") PORT_MINMAX(0x000, 0x7ff) PORT_SENSITIVITY(100) PORT_KEYDELTA(60)
+
+ PORT_START("ANALOG3")
+ PORT_BIT(0x7ff, 0x000, IPT_PEDAL2) PORT_NAME("Brake Pedal") PORT_MINMAX(0x000, 0x7ff) PORT_SENSITIVITY(100) PORT_KEYDELTA(60)
+INPUT_PORTS_END
+
/* PowerPC interrupts
@@ -1046,14 +1088,13 @@ void hornet_state::machine_reset()
double hornet_state::adc12138_input_callback(uint8_t input)
{
- int value = 0;
- switch (input)
+ if (input < m_analog.size())
{
- case 0: value = m_analog[0].read_safe(0); break;
- case 1: value = m_analog[1].read_safe(0); break;
+ int value = m_analog[input].read_safe(0);
+ return (double)(value) / 2047.0;
}
- return (double)(value) / 2047.0;
+ return 0.0;
}
void hornet_state::hornet(machine_config &config)
@@ -1082,6 +1123,7 @@ void hornet_state::hornet(machine_config &config)
m_voodoo[0]->set_screen_tag("screen");
m_voodoo[0]->set_cpu_tag(m_dsp[0]);
m_voodoo[0]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_voodoo[0]->stall_callback().set(m_dsp[0], FUNC(adsp21062_device::write_stall));
K033906(config, "k033906_1", 0, m_voodoo[0]);
@@ -1161,6 +1203,7 @@ void hornet_state::sscope(machine_config &config)
m_voodoo[1]->set_screen_tag("rscreen");
m_voodoo[1]->set_cpu_tag(m_dsp[1]);
m_voodoo[1]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
+ m_voodoo[1]->stall_callback().set(m_dsp[1], FUNC(adsp21062_device::write_stall));
K033906(config, "k033906_2", 0, m_voodoo[1]);
@@ -1195,6 +1238,7 @@ void hornet_state::sscope2(machine_config &config)
m_voodoo[0]->set_screen_tag("lscreen");
m_voodoo[0]->set_cpu_tag(m_dsp[0]);
m_voodoo[0]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_voodoo[0]->stall_callback().set(m_dsp[0], FUNC(adsp21062_device::write_stall));
VOODOO_2(config.replace(), m_voodoo[1], STD_VOODOO_2_CLOCK);
m_voodoo[1]->set_fbmem(2);
@@ -1202,6 +1246,7 @@ void hornet_state::sscope2(machine_config &config)
m_voodoo[1]->set_screen_tag("rscreen");
m_voodoo[1]->set_cpu_tag(m_dsp[1]);
m_voodoo[1]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
+ m_voodoo[1]->stall_callback().set(m_dsp[1], FUNC(adsp21062_device::write_stall));
DS2401(config, "lan_serial_id");
EEPROM_93C46_16BIT(config, "lan_eeprom");
@@ -1354,6 +1399,13 @@ void hornet_state::init_hornet()
m_maincpu->ppc4xx_spu_set_tx_handler(write8smo_delegate(*this, FUNC(hornet_state::jamma_jvs_w)));
+ //m_dsp[0]->enable_recompiler();
+}
+
+void hornet_state::init_gradius4()
+{
+ init_hornet();
+
m_dsp[0]->enable_recompiler();
}
@@ -1661,13 +1713,13 @@ ROM_END
/*************************************************************************/
-GAME( 1998, gradius4, 0, hornet, gradius4, hornet_state, init_hornet, ROT0, "Konami", "Gradius IV: Fukkatsu (ver JAC)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1998, gradius4, 0, hornet, gradius4, hornet_state, init_gradius4, ROT0, "Konami", "Gradius IV: Fukkatsu (ver JAC)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1998, nbapbp, 0, hornet, nbapbp, hornet_state, init_hornet, ROT0, "Konami", "NBA Play By Play (ver JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1998, nbapbpa, nbapbp, hornet, nbapbp, hornet_state, init_hornet, ROT0, "Konami", "NBA Play By Play (ver AAB)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1998, terabrst, 0, terabrst, terabrst, hornet_state, init_hornet, ROT0, "Konami", "Teraburst (1998/07/17 ver UEL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1998, terabrsta, terabrst, terabrst, terabrst, hornet_state, init_hornet, ROT0, "Konami", "Teraburst (1998/02/25 ver AAA)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
// identifies as NWK-LC system
-GAME( 1998, thrilldbu, thrilld, hornet_lan, hornet, hornet_state, init_hornet, ROT0, "Konami", "Thrill Drive (ver UFB)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN ) // heavy GFX glitches, fails wheel motor test, for now it's possible to get in game by switching "SW:2" to on
+GAME( 1998, thrilldbu, thrilld, hornet_lan, thrilld, hornet_state, init_hornet, ROT0, "Konami", "Thrill Drive (ver UFB)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN ) // heavy GFX glitches, fails wheel motor test, for now it's possible to get in game by switching "SW:2" to on
// The region comes from the Timekeeper NVRAM, without a valid default all sets except 'xxD, Ver 1.33' will init their NVRAM to UAx versions, the xxD set seems to incorrectly init it to JXD, which isn't a valid
// version, and thus can't be booted. If you copy the NVRAM from another already initialized set, it will boot as UAD.
diff --git a/src/mame/drivers/hp80.cpp b/src/mame/drivers/hp80.cpp
index 709366bbdaa..22bb4794eb4 100644
--- a/src/mame/drivers/hp80.cpp
+++ b/src/mame/drivers/hp80.cpp
@@ -696,7 +696,7 @@ static const uint8_t keyboard_table[ 80 ][ 2 ] = {
bool hp80_base_state::kb_scan_ioport(ioport_value pressed , unsigned idx_base , uint8_t& row , uint8_t& col)
{
if (pressed) {
- unsigned bit_no = 31 - count_leading_zeros(pressed);
+ unsigned bit_no = 31 - count_leading_zeros_32(pressed);
row = (idx_base + bit_no) / 8;
col = (idx_base + bit_no) % 8;
return true;
diff --git a/src/mame/drivers/hp9825.cpp b/src/mame/drivers/hp9825.cpp
index 9f69d976a88..dfcc7c5d007 100644
--- a/src/mame/drivers/hp9825.cpp
+++ b/src/mame/drivers/hp9825.cpp
@@ -558,7 +558,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(hp9825_state::kb_scan)
void hp9825_state::kb_scan_ioport(ioport_value pressed , ioport_port &port , unsigned idx_base , int& max_seq_len , unsigned& max_seq_idx)
{
while (pressed) {
- unsigned bit_no = 31 - count_leading_zeros(pressed);
+ unsigned bit_no = 31 - count_leading_zeros_32(pressed);
ioport_value mask = BIT_MASK<ioport_value>(bit_no);
int seq_len = port.field(mask)->seq().length();
if (seq_len > max_seq_len) {
diff --git a/src/mame/drivers/hp9845.cpp b/src/mame/drivers/hp9845.cpp
index 7976c54cbc9..ab4398b20e7 100644
--- a/src/mame/drivers/hp9845.cpp
+++ b/src/mame/drivers/hp9845.cpp
@@ -550,7 +550,7 @@ attotime hp9845_base_state::time_to_gv_mem_availability() const
void hp9845_base_state::kb_scan_ioport(ioport_value pressed , ioport_port &port , unsigned idx_base , int& max_seq_len , unsigned& max_seq_idx)
{
while (pressed) {
- unsigned bit_no = 31 - count_leading_zeros(pressed);
+ unsigned bit_no = 31 - count_leading_zeros_32(pressed);
ioport_value mask = BIT_MASK(bit_no);
int seq_len = port.field(mask)->seq().length();
if (seq_len > max_seq_len) {
diff --git a/src/mame/drivers/indigo.cpp b/src/mame/drivers/indigo.cpp
index ede8813bb55..8f21674e6af 100644
--- a/src/mame/drivers/indigo.cpp
+++ b/src/mame/drivers/indigo.cpp
@@ -234,9 +234,12 @@ ROM_END
ROM_START( indigo4k )
ROM_REGION64_BE( 0x80000, "user1", 0 )
- ROMX_LOAD( "ip20prom.070-8116-004.bin", 0x000000, 0x080000, CRC(940d960e) SHA1(596aba530b53a147985ff3f6f853471ce48c866c), ROM_GROUPDWORD | ROM_REVERSE )
+ ROM_SYSTEM_BIOS( 0, "405d-rev-a", "SGI Version 4.0.5D Rev A IP20, Aug 19, 1992" )
+ ROMX_LOAD( "ip20prom.070-8116-004.bin", 0x000000, 0x080000, CRC(940d960e) SHA1(596aba530b53a147985ff3f6f853471ce48c866c), ROM_GROUPDWORD | ROM_REVERSE | ROM_BIOS(0) )
+ ROM_SYSTEM_BIOS( 1, "405g-rev-b", "SGI Version 4.0.5G Rev B IP20, Nov 10, 1992" ) // dumped over serial connection from boot monitor and swapped
+ ROMX_LOAD( "ip20prom.070-8116-005.bin", 0x000000, 0x080000, CRC(1875b645) SHA1(52f5d7baea3d1bc720eb2164104c177e23504345), ROM_GROUPDWORD | ROM_REVERSE | ROM_BIOS(1) )
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1991, indigo3k, 0, 0, indigo3k, indigo, indigo3k_state, empty_init, "Silicon Graphics Inc", "IRIS Indigo (R3000, 33MHz)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
-COMP( 1993, indigo4k, 0, 0, indigo4k, indigo, indigo4k_state, empty_init, "Silicon Graphics Inc", "IRIS Indigo (R4400, 150MHz, Ver. 4.0.5D Rev A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
+COMP( 1993, indigo4k, 0, 0, indigo4k, indigo, indigo4k_state, empty_init, "Silicon Graphics Inc", "IRIS Indigo (R4400, 150MHz)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
diff --git a/src/mame/drivers/intellect02.cpp b/src/mame/drivers/intellect02.cpp
index 2e9608e045a..016f0bb5cf4 100644
--- a/src/mame/drivers/intellect02.cpp
+++ b/src/mame/drivers/intellect02.cpp
@@ -132,7 +132,7 @@ u8 intel02_state::input_r()
{
// d0-d3: buttons through a maze of logic gates
// basically giving each button its own 4-bit scancode
- u8 data = count_leading_zeros(m_inputs[0]->read()) - 17;
+ u8 data = count_leading_zeros_32(m_inputs[0]->read()) - 17;
// d4: Vcc, d5-d7: buttons (direct)
return data | (~m_inputs[1]->read() << 4 & 0xf0);
diff --git a/src/mame/drivers/inufuku.cpp b/src/mame/drivers/inufuku.cpp
index 2ccc99d0dfe..e2657c8a04b 100644
--- a/src/mame/drivers/inufuku.cpp
+++ b/src/mame/drivers/inufuku.cpp
@@ -73,14 +73,245 @@ TODO:
******************************************************************************/
#include "emu.h"
-#include "includes/inufuku.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "machine/eepromser.h"
+#include "machine/gen_latch.h"
#include "sound/ymopn.h"
+#include "video/bufsprite.h"
+#include "video/vsystem_spr.h"
+
+#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+#include "tilemap.h"
+
+
+namespace {
+
+class inufuku_state : public driver_device
+{
+public:
+ inufuku_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_bg_videoram(*this, "bg_videoram")
+ , m_bg_rasterram(*this, "bg_rasterram")
+ , m_tx_videoram(*this, "tx_videoram")
+ , m_sprtileram(*this, "sprtileram")
+ , m_audiobank(*this, "audiobank")
+ , m_maincpu(*this, "maincpu")
+ , m_audiocpu(*this, "audiocpu")
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_palette(*this, "palette")
+ , m_spr(*this, "vsystem_spr")
+ , m_soundlatch(*this, "soundlatch")
+ , m_sprattrram(*this, "sprattrram")
+ { }
+
+ void inufuku(machine_config &config);
+ void _3on3dunk(machine_config &config);
+
+ DECLARE_READ_LINE_MEMBER(soundflag_r);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void video_start() override;
+
+private:
+ // memory pointers
+ required_shared_ptr<u16> m_bg_videoram;
+ required_shared_ptr<u16> m_bg_rasterram;
+ required_shared_ptr<u16> m_tx_videoram;
+ required_shared_ptr<u16> m_sprtileram;
+
+ required_memory_bank m_audiobank;
+
+ // video-related
+ tilemap_t *m_bg_tilemap;
+ tilemap_t *m_tx_tilemap;
+ int m_bg_scrollx = 0;
+ int m_bg_scrolly = 0;
+ int m_tx_scrollx = 0;
+ int m_tx_scrolly = 0;
+ bool m_bg_raster = false;
+ u8 m_bg_palettebank = 0;
+ u8 m_tx_palettebank = 0;
+ u32 tile_callback( u32 code );
+
+ // devices
+ required_device<cpu_device> m_maincpu;
+ required_device<cpu_device> m_audiocpu;
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_device<palette_device> m_palette;
+ required_device<vsystem_spr_device> m_spr;
+ required_device<generic_latch_8_device> m_soundlatch;
+ required_device<buffered_spriteram16_device> m_sprattrram;
+
+ void soundrombank_w(u8 data);
+ void palettereg_w(offs_t offset, u16 data);
+ void scrollreg_w(offs_t offset, u16 data);
+ void bg_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void tx_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ TILE_GET_INFO_MEMBER(get_bg_tile_info);
+ TILE_GET_INFO_MEMBER(get_tx_tile_info);
+
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void main_map(address_map &map);
+ void sound_io_map(address_map &map);
+ void sound_map(address_map &map);
+};
+
+
+/******************************************************************************
+
+ Memory handlers
+
+******************************************************************************/
+
+void inufuku_state::palettereg_w(offs_t offset, u16 data)
+{
+ switch (offset)
+ {
+ case 0x02:
+ m_bg_palettebank = (data & 0xf000) >> 12;
+ m_bg_tilemap->mark_all_dirty();
+ /*
+ if (data & ~0xf000)
+ logerror("%s: palettereg_w %02X: %04x\n", machine().describe_context(), offset << 1, data);
+ */
+ break;
+ case 0x03:
+ m_tx_palettebank = (data & 0xf000) >> 12;
+ m_tx_tilemap->mark_all_dirty();
+ /*
+ if (data & ~0xf000)
+ logerror("%s: palettereg_w %02X: %04x\n", machine().describe_context(), offset << 1, data);
+ */
+ break;
+ default:
+ //logerror("%s: palettereg_w %02X: %04x\n", machine().describe_context(), offset << 1, data);
+ break;
+ }
+}
+
+
+void inufuku_state::scrollreg_w(offs_t offset, u16 data)
+{
+ switch (offset)
+ {
+ case 0x00: m_bg_scrollx = data + 1; break;
+ case 0x01: m_bg_scrolly = data + 0; break;
+ case 0x02: m_tx_scrollx = data - 3; break;
+ case 0x03: m_tx_scrolly = data + 1; break;
+ case 0x04:
+ m_bg_raster = BIT(~data, 9);
+ /*
+ if (data & ~0x0200)
+ logerror("%s: palettereg_w %02X: %04x\n", machine().describe_context(), offset << 1, data);
+ */
+ break;
+ default:
+ //logerror("%s: scrollreg_w %02X: %04x\n", machine().describe_context(), offset << 1, data);
+ break;
+ }
+}
+
+
+/******************************************************************************
+
+ Tilemap callbacks
+
+******************************************************************************/
+
+TILE_GET_INFO_MEMBER(inufuku_state::get_bg_tile_info)
+{
+ tileinfo.set(0,
+ m_bg_videoram[tile_index],
+ m_bg_palettebank,
+ 0);
+}
+
+
+TILE_GET_INFO_MEMBER(inufuku_state::get_tx_tile_info)
+{
+ tileinfo.set(1,
+ m_tx_videoram[tile_index],
+ m_tx_palettebank,
+ 0);
+}
+
+
+void inufuku_state::bg_videoram_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ COMBINE_DATA(&m_bg_videoram[offset]);
+ m_bg_tilemap->mark_tile_dirty(offset);
+}
+
+
+void inufuku_state::tx_videoram_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ COMBINE_DATA(&m_tx_videoram[offset]);
+ m_tx_tilemap->mark_tile_dirty(offset);
+}
+
+
+u32 inufuku_state::tile_callback( u32 code )
+{
+ return ((m_sprtileram[code * 2] & 0x0007) << 16) + m_sprtileram[(code * 2) + 1];
+}
+
+
+/******************************************************************************
+
+ Start the video hardware emulation
+
+******************************************************************************/
+
+void inufuku_state::video_start()
+{
+ m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(inufuku_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
+ m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(inufuku_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
+
+ m_bg_tilemap->set_transparent_pen(255);
+ m_tx_tilemap->set_transparent_pen(255);
+}
+
+
+/******************************************************************************
+
+ Display refresh
+
+******************************************************************************/
+
+u32 inufuku_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ bitmap.fill(m_palette->black_pen(), cliprect);
+ screen.priority().fill(0);
+
+ if (m_bg_raster)
+ {
+ m_bg_tilemap->set_scroll_rows(512);
+ for (int i = cliprect.min_y; i <= cliprect.max_y; i++)
+ m_bg_tilemap->set_scrollx((m_bg_scrolly + i) & 0x1ff, m_bg_scrollx + m_bg_rasterram[i]);
+ }
+ else
+ {
+ m_bg_tilemap->set_scroll_rows(1);
+ m_bg_tilemap->set_scrollx(0, m_bg_scrollx);
+ }
+ m_bg_tilemap->set_scrolly(0, m_bg_scrolly);
+ m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+
+ m_tx_tilemap->set_scrollx(0, m_tx_scrollx);
+ m_tx_tilemap->set_scrolly(0, m_tx_scrolly);
+ m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4);
+
+ m_spr->draw_sprites( m_sprattrram->buffer(), m_sprattrram->bytes(), screen, bitmap, cliprect );
+ return 0;
+}
/******************************************************************************
@@ -89,11 +320,12 @@ TODO:
******************************************************************************/
-void inufuku_state::inufuku_soundrombank_w(uint8_t data)
+void inufuku_state::soundrombank_w(u8 data)
{
- membank("bank1")->set_entry(data & 0x03);
+ m_audiobank->set_entry(data & 0x03);
}
+
/******************************************************************************
Input/Output port interface
@@ -105,17 +337,18 @@ READ_LINE_MEMBER(inufuku_state::soundflag_r)
return m_soundlatch->pending_r() ? 0 : 1;
}
+
/******************************************************************************
Main CPU memory handlers
******************************************************************************/
-void inufuku_state::inufuku_map(address_map &map)
+void inufuku_state::main_map(address_map &map)
{
- map(0x000000, 0x0fffff).rom(); // main rom
+ map(0x000000, 0x0fffff).rom().region("maincpu", 0x000000); // main rom
-// map(0x100000, 0x100007).nopw(); // ?
+// map(0x100000, 0x100007).nopw(); // ?
map(0x180000, 0x180001).portr("P1");
map(0x180002, 0x180003).portr("P2");
@@ -125,22 +358,22 @@ void inufuku_state::inufuku_map(address_map &map)
map(0x18000a, 0x18000b).portr("P3");
map(0x200000, 0x200001).portw("EEPROMOUT");
- map(0x280001, 0x280001).w(m_soundlatch, FUNC(generic_latch_8_device::write)); // sound command
+ map(0x280001, 0x280001).w(m_soundlatch, FUNC(generic_latch_8_device::write)); // sound command
- map(0x300000, 0x301fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // palette ram
- map(0x380000, 0x3801ff).writeonly().share("bg_rasterram"); // bg raster ram
- map(0x400000, 0x401fff).rw(FUNC(inufuku_state::inufuku_bg_videoram_r), FUNC(inufuku_state::inufuku_bg_videoram_w)).share("bg_videoram"); // bg ram
- map(0x402000, 0x403fff).rw(FUNC(inufuku_state::inufuku_tx_videoram_r), FUNC(inufuku_state::inufuku_tx_videoram_w)).share("tx_videoram"); // text ram
+ map(0x300000, 0x301fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // palette ram
+ map(0x380000, 0x3801ff).writeonly().share(m_bg_rasterram); // bg raster ram
+ map(0x400000, 0x401fff).ram().w(FUNC(inufuku_state::bg_videoram_w)).share(m_bg_videoram); // bg ram
+ map(0x402000, 0x403fff).ram().w(FUNC(inufuku_state::tx_videoram_w)).share(m_tx_videoram); // text ram
map(0x404000, 0x40ffff).ram(); // ?? mirror (3on3dunk)
- map(0x580000, 0x581fff).ram().share("spriteram1"); // sprite table + sprite attribute
- map(0x600000, 0x61ffff).ram().share("spriteram2"); // cell table
+ map(0x580000, 0x581fff).ram().share("sprattrram"); // sprite table + sprite attribute
+ map(0x600000, 0x61ffff).ram().share(m_sprtileram); // cell table
- map(0x780000, 0x780013).w(FUNC(inufuku_state::inufuku_palettereg_w)); // bg & text palettebank register
- map(0x7a0000, 0x7a0023).w(FUNC(inufuku_state::inufuku_scrollreg_w)); // bg & text scroll register
-// map(0x7e0000, 0x7e0001).nopw(); // ?
+ map(0x780000, 0x780013).w(FUNC(inufuku_state::palettereg_w)); // bg & text palettebank register
+ map(0x7a0000, 0x7a0023).w(FUNC(inufuku_state::scrollreg_w)); // bg & text scroll register
+// map(0x7e0000, 0x7e0001).nopw(); // ?
- map(0x800000, 0xbfffff).rom(); // data rom
- map(0xfd0000, 0xfdffff).ram(); // work ram
+ map(0x800000, 0xbfffff).rom().region("maincpu", 0x100000); // data rom
+ map(0xfd0000, 0xfdffff).ram(); // work ram
}
@@ -150,21 +383,23 @@ void inufuku_state::inufuku_map(address_map &map)
******************************************************************************/
-void inufuku_state::inufuku_sound_map(address_map &map)
+void inufuku_state::sound_map(address_map &map)
{
map(0x0000, 0x77ff).rom();
map(0x7800, 0x7fff).ram();
- map(0x8000, 0xffff).bankr("bank1");
+ map(0x8000, 0xffff).bankr(m_audiobank);
}
-void inufuku_state::inufuku_sound_io_map(address_map &map)
+
+void inufuku_state::sound_io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).w(FUNC(inufuku_state::inufuku_soundrombank_w));
+ map(0x00, 0x00).w(FUNC(inufuku_state::soundrombank_w));
map(0x04, 0x04).rw(m_soundlatch, FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::acknowledge_w));
map(0x08, 0x0b).rw("ymsnd", FUNC(ym2610_device::read), FUNC(ym2610_device::write));
}
+
/******************************************************************************
Port definitions
@@ -242,61 +477,23 @@ static INPUT_PORTS_START( inufuku )
INPUT_PORTS_END
-
-
/******************************************************************************
Graphics definitions
******************************************************************************/
-static const gfx_layout tilelayout =
-{
- 8, 8,
- RGN_FRAC(1, 1),
- 8,
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- { 1*8, 0*8, 3*8, 2*8, 5*8, 4*8, 7*8, 6*8 },
- { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64 },
- 64*8
-};
-
-static const gfx_layout spritelayout =
-{
- 16, 16,
- RGN_FRAC(1, 1),
- 4,
- { 0, 1, 2, 3 },
- { 2*4, 3*4, 0*4, 1*4, 6*4, 7*4, 4*4, 5*4,
- 10*4, 11*4, 8*4, 9*4, 14*4, 15*4, 12*4, 13*4 },
- { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,
- 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
- 128*8
-};
-
-static const gfx_layout spritelayout_alt =
-{
- 16, 16,
- RGN_FRAC(1, 1),
- 4,
- { 0, 1, 2, 3 },
- { 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4,
- 9*4, 8*4, 11*4, 10*4, 13*4, 12*4, 15*4, 14*4 },
- { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,
- 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
- 128*8
-};
-
static GFXDECODE_START( gfx_inufuku )
- GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 256*16 ) // bg
- GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 256*16 ) // text
- GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0, 256*16 ) // sprite
+ GFXDECODE_ENTRY( "bgtile", 0, gfx_8x8x8_raw, 0, 4096/256 ) // bg
+ GFXDECODE_ENTRY( "txtile", 0, gfx_8x8x8_raw, 0, 4096/256 ) // text
+ GFXDECODE_ENTRY( "sprtile", 0, gfx_16x16x4_packed_msb, 0, 4096/16 ) // sprite
GFXDECODE_END
+
static GFXDECODE_START( gfx_3on3dunk )
- GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 256*16 ) // bg
- GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 256*16 ) // text
- GFXDECODE_ENTRY( "gfx3", 0, spritelayout_alt, 0, 256*16 ) // sprite
+ GFXDECODE_ENTRY( "bgtile", 0, gfx_8x8x8_raw, 0, 4096/256 ) // bg
+ GFXDECODE_ENTRY( "txtile", 0, gfx_8x8x8_raw, 0, 4096/256 ) // text
+ GFXDECODE_ENTRY( "sprtile", 0, gfx_16x16x4_packed_lsb, 0, 4096/16 ) // sprite
GFXDECODE_END
@@ -308,10 +505,8 @@ GFXDECODE_END
void inufuku_state::machine_start()
{
- uint8_t *ROM = memregion("audiocpu")->base();
-
- membank("bank1")->configure_entries(0, 4, &ROM[0x00000], 0x8000);
- membank("bank1")->set_entry(0);
+ m_audiobank->configure_entries(0, 4, memregion("audiocpu")->base(), 0x8000);
+ m_audiobank->set_entry(0);
save_item(NAME(m_bg_scrollx));
save_item(NAME(m_bg_scrolly));
@@ -322,64 +517,69 @@ void inufuku_state::machine_start()
save_item(NAME(m_tx_palettebank));
}
+
void inufuku_state::machine_reset()
{
m_bg_scrollx = 0;
m_bg_scrolly = 0;
m_tx_scrollx = 0;
m_tx_scrolly = 0;
- m_bg_raster = 0;
+ m_bg_raster = false;
m_bg_palettebank = 0;
m_tx_palettebank = 0;
}
+
void inufuku_state::inufuku(machine_config &config)
{
- /* basic machine hardware */
- M68000(config, m_maincpu, 32000000/2); /* 16.00 MHz */
- m_maincpu->set_addrmap(AS_PROGRAM, &inufuku_state::inufuku_map);
+ // basic machine hardware */
+ M68000(config, m_maincpu, XTAL(32'000'000)/2); // 16.00 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &inufuku_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(inufuku_state::irq1_line_hold));
- Z80(config, m_audiocpu, 32000000/4); /* 8.00 MHz */
- m_audiocpu->set_addrmap(AS_PROGRAM, &inufuku_state::inufuku_sound_map);
- m_audiocpu->set_addrmap(AS_IO, &inufuku_state::inufuku_sound_io_map); /* IRQs are triggered by the YM2610 */
+ Z80(config, m_audiocpu, XTAL(32'000'000)/4); // 8.00 MHz
+ m_audiocpu->set_addrmap(AS_PROGRAM, &inufuku_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &inufuku_state::sound_io_map); // IRQs are triggered by the YM2610
EEPROM_93C46_16BIT(config, "eeprom");
- /* video hardware */
+ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2300));
screen.set_size(2048, 256);
screen.set_visarea(0, 319, 0, 223);
- screen.set_screen_update(FUNC(inufuku_state::screen_update_inufuku));
- screen.screen_vblank().set(FUNC(inufuku_state::screen_vblank_inufuku));
+ screen.set_screen_update(FUNC(inufuku_state::screen_update));
+ screen.screen_vblank().set(m_sprattrram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);
VSYSTEM_SPR(config, m_spr, 0);
m_spr->set_offsets(0, 1); // reference videos confirm at least the +1 against tilemaps in 3on3dunk (the highscore header text and black box are meant to be 1 pixel misaligned, although there is currently a priority bug there too)
m_spr->set_pdraw(true);
- m_spr->set_tile_indirect_cb(FUNC(inufuku_state::inufuku_tile_callback));
+ m_spr->set_tile_indirect_cb(FUNC(inufuku_state::tile_callback));
m_spr->set_gfx_region(2);
m_spr->set_gfxdecode_tag(m_gfxdecode);
+ BUFFERED_SPRITERAM16(config, m_sprattrram);
+
GFXDECODE(config, m_gfxdecode, m_palette, gfx_inufuku);
PALETTE(config, m_palette).set_format(palette_device::xGBR_555, 4096);
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
m_soundlatch->set_separate_acknowledge(true);
- ym2610_device &ymsnd(YM2610(config, "ymsnd", 32000000/4));
+ ym2610_device &ymsnd(YM2610(config, "ymsnd", XTAL(32'000'000)/4));
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.75);
ymsnd.add_route(2, "mono", 0.75);
}
+
void inufuku_state::_3on3dunk(machine_config &config)
{
inufuku(config);
@@ -387,9 +587,6 @@ void inufuku_state::_3on3dunk(machine_config &config)
}
-
-
-
/******************************************************************************
ROM definitions
@@ -397,59 +594,61 @@ void inufuku_state::_3on3dunk(machine_config &config)
******************************************************************************/
ROM_START( inufuku )
- ROM_REGION( 0x1000000, "maincpu", 0 ) // main cpu + data
+ ROM_REGION( 0x0500000, "maincpu", 0 ) // main cpu + data
ROM_LOAD16_WORD_SWAP( "u147.bin", 0x0000000, 0x080000, CRC(ab72398c) SHA1(f5dc266ffa936ea6528b46a34113f5e2f8141d71) )
ROM_LOAD16_WORD_SWAP( "u146.bin", 0x0080000, 0x080000, CRC(e05e9bd4) SHA1(af0fdf31c2bdf851bf15c9de725dcbbb58464d54) )
- ROM_LOAD16_WORD_SWAP( "lhmn5l28.148", 0x0800000, 0x400000, CRC(802d17e7) SHA1(43b26efea65fd051c094d19784cb977ced39a1a0) )
+ ROM_LOAD16_WORD_SWAP( "lhmn5l28.148", 0x0100000, 0x400000, CRC(802d17e7) SHA1(43b26efea65fd051c094d19784cb977ced39a1a0) )
ROM_REGION( 0x0020000, "audiocpu", 0 ) // sound cpu
ROM_LOAD( "u107.bin", 0x0000000, 0x020000, CRC(1744ef90) SHA1(e019f4ca83e21aa25710cc0ca40ffe765c7486c9) )
- ROM_REGION( 0x0400000, "gfx1", 0 ) // bg
- ROM_LOAD16_WORD_SWAP( "lhmn5ku8.u40", 0x0000000, 0x400000, CRC(8cbca80a) SHA1(063e9be97f5a1f021f8326f2994b51f9af5e1eaf) )
+ ROM_REGION( 0x0400000, "bgtile", 0 ) // bg
+ ROM_LOAD( "lhmn5ku8.u40", 0x0000000, 0x400000, CRC(8cbca80a) SHA1(063e9be97f5a1f021f8326f2994b51f9af5e1eaf) )
- ROM_REGION( 0x0400000, "gfx2", 0 ) // text
- ROM_LOAD16_WORD_SWAP( "lhmn5ku7.u8", 0x0000000, 0x400000, CRC(a6c0f07f) SHA1(971803d1933d8296767d8766ea9f04dcd6ab065c) )
+ ROM_REGION( 0x0400000, "txtile", 0 ) // text
+ ROM_LOAD( "lhmn5ku7.u8", 0x0000000, 0x400000, CRC(a6c0f07f) SHA1(971803d1933d8296767d8766ea9f04dcd6ab065c) )
- ROM_REGION( 0x0c00000, "gfx3", 0 ) // sprite
- ROM_LOAD16_WORD_SWAP( "lhmn5kub.u34", 0x0000000, 0x400000, CRC(7753a7b6) SHA1(a2e8747ce83ea5a57e2fe62f2452de355d7f48b6) )
- ROM_LOAD16_WORD_SWAP( "lhmn5kua.u36", 0x0400000, 0x400000, CRC(1ac4402a) SHA1(c15acc6fce4fe0b54e92d14c31a1bd78acf2c8fc) )
- ROM_LOAD16_WORD_SWAP( "lhmn5ku9.u38", 0x0800000, 0x400000, CRC(e4e9b1b6) SHA1(4d4ad85fbe6a442d4f8cafad748bcae4af6245b7) )
+ ROM_REGION( 0x0c00000, "sprtile", 0 ) // sprite
+ ROM_LOAD( "lhmn5kub.u34", 0x0000000, 0x400000, CRC(7753a7b6) SHA1(a2e8747ce83ea5a57e2fe62f2452de355d7f48b6) )
+ ROM_LOAD( "lhmn5kua.u36", 0x0400000, 0x400000, CRC(1ac4402a) SHA1(c15acc6fce4fe0b54e92d14c31a1bd78acf2c8fc) )
+ ROM_LOAD( "lhmn5ku9.u38", 0x0800000, 0x400000, CRC(e4e9b1b6) SHA1(4d4ad85fbe6a442d4f8cafad748bcae4af6245b7) )
ROM_REGION( 0x0400000, "ymsnd:adpcma", 0 ) // adpcm data
ROM_LOAD( "lhmn5ku6.u53", 0x0000000, 0x400000, CRC(b320c5c9) SHA1(7c99da2d85597a3c008ed61a3aa5f47ad36186ec) )
ROM_END
+
ROM_START( 3on3dunk )
- ROM_REGION( 0x1000000, "maincpu", 0 ) // main cpu + data
- ROM_LOAD16_WORD_SWAP( "prog0_2_4_usa.u147", 0x0000000, 0x080000, CRC(957924ab) SHA1(6fe8ca711d11239310d58188e9d6d28cd27bc5af) )
- ROM_LOAD16_WORD_SWAP( "prog1_2_4_usa.u146", 0x0080000, 0x080000, CRC(2479e236) SHA1(729e6c85d34d6925c8d6557b138e2bed43e1de6a) )
- ROM_LOAD16_WORD_SWAP( "lh535l5y.u148", 0x0800000, 0x400000, CRC(aa33e02a) SHA1(86381ecf18fba9065cbc02112751c435bbf8b8b4) )
+ ROM_REGION( 0x0500000, "maincpu", 0 ) // main cpu + data
+ ROM_LOAD16_WORD_SWAP( "prog0_2_4_usa.u147", 0x0000000, 0x080000, CRC(957924ab) SHA1(6fe8ca711d11239310d58188e9d6d28cd27bc5af) )
+ ROM_LOAD16_WORD_SWAP( "prog1_2_4_usa.u146", 0x0080000, 0x080000, CRC(2479e236) SHA1(729e6c85d34d6925c8d6557b138e2bed43e1de6a) )
+ ROM_LOAD16_WORD_SWAP( "lh535l5y.u148", 0x0100000, 0x400000, CRC(aa33e02a) SHA1(86381ecf18fba9065cbc02112751c435bbf8b8b4) )
ROM_REGION( 0x0020000, "audiocpu", 0 ) // sound cpu
ROM_LOAD( "sound_prog_97_1_13.u107", 0x0000000, 0x020000, CRC(d9d42805) SHA1(ab5cb7c141d9c9ed5121ba4dbc1d0fa187bd9f68) )
- ROM_REGION( 0x0400000, "gfx1", 0 ) // bg
- ROM_LOAD16_WORD_SWAP( "lh525kwy.u40", 0x0000000, 0x400000, CRC(aaa426d1) SHA1(2f9a2981f336caf3188baec9a34f61452dee2203) )
+ ROM_REGION( 0x0400000, "bgtile", 0 ) // bg
+ ROM_LOAD( "lh525kwy.u40", 0x0000000, 0x400000, CRC(aaa426d1) SHA1(2f9a2981f336caf3188baec9a34f61452dee2203) )
- ROM_REGION( 0x0400000, "gfx2", 0 ) // text
- ROM_LOAD16_WORD_SWAP( "lh537nn4.u8", 0x0000000, 0x200000, CRC(2b7be1d8) SHA1(aac274a8f4028db7429478601a1761e61ab4f9a2) )
+ ROM_REGION( 0x0400000, "txtile", 0 ) // text
+ ROM_LOAD( "lh537nn4.u8", 0x0000000, 0x200000, CRC(2b7be1d8) SHA1(aac274a8f4028db7429478601a1761e61ab4f9a2) )
- ROM_REGION( 0x2000000, "gfx3", 0 ) // sprite
+ ROM_REGION( 0x2000000, "sprtile", 0 ) // sprite
ROM_LOAD( "lh535kwz.u34", 0x0000000, 0x400000, CRC(7372ce78) SHA1(ed2a861986357fad7ef983750cd906c3d722b862) )
ROM_LOAD( "lh535kv0.u36", 0x0400000, 0x400000, CRC(247e5741) SHA1(8d71d964791fb4b86e390bcdf7744f616d6357b1) )
ROM_LOAD( "lh535kv2.u38", 0x0800000, 0x400000, CRC(76449b1e) SHA1(b63d50c6f0dc91dc94dbcdda9842598529c1c26e) )
ROM_LOAD( "lh537nn5.u20", 0x0c00000, 0x200000, CRC(f457cd3b) SHA1(cc13f5dc44e4675c1074a365b10f34e684817d81) )
- /* 0x0e00000, 0x200000 empty */
+ // 0x0e00000, 0x200000 empty
ROM_LOAD( "lh536pnm.u32", 0x1000000, 0x400000, CRC(bc39e449) SHA1(5aea90b66ee03c70797ddc42dbcb064d83ce8cc7) )
ROM_REGION( 0x0400000, "ymsnd:adpcma", 0 ) // ADPCM data
ROM_LOAD( "lh5388r1.u53", 0x0000000, 0x100000, CRC(765d892f) SHA1(9b078c879d0437d1669bf4301fd52a768aa4d293) )
- ROM_REGION( 0x400000, "ymsnd:adpcmb", 0 ) // speech
+ ROM_REGION( 0x0400000, "ymsnd:adpcmb", 0 ) // speech
ROM_LOAD( "lh536pkl.u51", 0x0000000, 0x300000, CRC(e4919abf) SHA1(d6af4b9c6ff62f92216c9927027d3b2376416bae) )
ROM_END
+} // Anonymous namespace
/******************************************************************************
diff --git a/src/mame/drivers/jupace.cpp b/src/mame/drivers/jupace.cpp
index 5bb5768521f..0ce284a9a44 100644
--- a/src/mame/drivers/jupace.cpp
+++ b/src/mame/drivers/jupace.cpp
@@ -170,11 +170,12 @@ private:
SNAPSHOT_LOAD_MEMBER(ace_state::snapshot_cb)
{
+ std::vector<uint8_t> RAM(0x10000);
cpu_device *cpu = m_maincpu;
- uint8_t *RAM = memregion(cpu->tag())->base();
address_space &space = cpu->space(AS_PROGRAM);
- unsigned char ace_repeat, ace_byte, loop;
- int done=0, ace_index=0x2000;
+ unsigned char ace_repeat, ace_byte;
+ u16 ace_index=0x2000;
+ bool done = false;
if (m_ram->size() < 16*1024)
{
@@ -194,7 +195,7 @@ SNAPSHOT_LOAD_MEMBER(ace_state::snapshot_cb)
{
case 0x00:
logerror("File loaded!\r\n");
- done = 1;
+ done = true;
break;
case 0x01:
image.fread(&ace_byte, 1);
@@ -202,7 +203,7 @@ SNAPSHOT_LOAD_MEMBER(ace_state::snapshot_cb)
break;
default:
image.fread(&ace_repeat, 1);
- for (loop = 0; loop < ace_byte; loop++)
+ for (u8 loop = 0; loop < ace_byte; loop++)
RAM[ace_index++] = ace_repeat;
break;
}
diff --git a/src/mame/drivers/ladybug.cpp b/src/mame/drivers/ladybug.cpp
index fb66bf2408e..ddd822e762b 100644
--- a/src/mame/drivers/ladybug.cpp
+++ b/src/mame/drivers/ladybug.cpp
@@ -263,32 +263,32 @@ static INPUT_PORTS_START( ladybug )
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("DSW0")
- PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWA(J2):8,7")
PORT_DIPSETTING( 0x03, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x02, DEF_STR( Medium ) )
PORT_DIPSETTING( 0x01, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x04, 0x04, "High Score Names" )
+ PORT_DIPNAME( 0x04, 0x04, "High Score Names" ) PORT_DIPLOCATION("SWA(J2):6")
PORT_DIPSETTING( 0x00, "3 Letters" )
PORT_DIPSETTING( 0x04, "10 Letters" )
- PORT_DIPNAME( 0x08, 0x08, "Rack Test (Cheat)" ) PORT_CODE(KEYCODE_F1)
+ PORT_DIPNAME( 0x08, 0x08, "Rack Test (Cheat)" ) PORT_CODE(KEYCODE_F1) PORT_DIPLOCATION("SWA(J2):5")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, "Freeze" )
+ PORT_DIPNAME( 0x10, 0x10, "Freeze" ) PORT_DIPLOCATION("SWA(J2):4")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPNAME( 0x20, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWA(J2):3")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x20, DEF_STR( Cocktail ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SWA(J2):2")
PORT_DIPSETTING( 0x40, DEF_STR( No ) )
PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Lives ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA(J2):1")
PORT_DIPSETTING( 0x80, "3" )
PORT_DIPSETTING( 0x00, "5" )
PORT_START("DSW1")
- PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_B ) )
+ PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWB(K2):8,7,6,5")
PORT_DIPSETTING( 0x06, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0a, DEF_STR( 2C_1C ) )
@@ -300,7 +300,7 @@ static INPUT_PORTS_START( ladybug )
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
/* settings 0x00 through 0x05 all give 1 Coin/1 Credit */
- PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWB(K2):4,3,2,1")
PORT_DIPSETTING( 0x60, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x80, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0xa0, DEF_STR( 2C_1C ) )
@@ -361,24 +361,24 @@ static INPUT_PORTS_START( snapjack )
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("DSW0")
- PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWA(J2):8,7")
PORT_DIPSETTING( 0x03, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x02, DEF_STR( Medium ) )
PORT_DIPSETTING( 0x01, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x04, 0x04, "High Score Names" )
+ PORT_DIPNAME( 0x04, 0x04, "High Score Names" ) PORT_DIPLOCATION("SWA(J2):6")
PORT_DIPSETTING( 0x00, "3 Letters" )
PORT_DIPSETTING( 0x04, "10 Letters" )
- PORT_DIPNAME( 0x08, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWA(J2):5")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x08, DEF_STR( Cocktail ) )
- PORT_DIPNAME( 0x10, 0x00, "unused1?" )
+ PORT_DIPNAME( 0x10, 0x10, "unused1?" ) PORT_DIPLOCATION("SWA(J2):4")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x00, "unused2?" )
+ PORT_DIPNAME( 0x20, 0x20, "unused2?" ) PORT_DIPLOCATION("SWA(J2):3")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) )
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA(J2):2,1")
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0xc0, "3" )
PORT_DIPSETTING( 0x80, "4" )
@@ -386,7 +386,7 @@ static INPUT_PORTS_START( snapjack )
PORT_START("DSW1")
/* coinage is slightly different from Lady Bug and Cosmic Avenger */
- PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_B ) )
+ PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWB(K2):8,7,6,5")
PORT_DIPSETTING( 0x05, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x07, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0a, DEF_STR( 2C_1C ) )
@@ -399,7 +399,7 @@ static INPUT_PORTS_START( snapjack )
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
/* settings 0x00 through 0x04 all give 1 Coin/1 Credit */
- PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWB(K2):4,3,2,1")
PORT_DIPSETTING( 0x50, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x70, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0xa0, DEF_STR( 2C_1C ) )
@@ -449,30 +449,30 @@ static INPUT_PORTS_START( cavenger )
PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("DSW0")
- PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWA(J2):8,7")
PORT_DIPSETTING( 0x03, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x02, DEF_STR( Medium ) )
PORT_DIPSETTING( 0x01, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x04, 0x04, "High Score Names" )
+ PORT_DIPNAME( 0x04, 0x04, "High Score Names" ) PORT_DIPLOCATION("SWA(J2):6")
PORT_DIPSETTING( 0x00, "3 Letters" )
PORT_DIPSETTING( 0x04, "10 Letters" )
- PORT_DIPNAME( 0x08, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWA(J2):5")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x08, DEF_STR( Cocktail ) )
- PORT_DIPNAME( 0x30, 0x00, "Initial High Score" )
+ PORT_DIPNAME( 0x30, 0x00, "Initial High Score" ) PORT_DIPLOCATION("SWA(J2):4,3")
PORT_DIPSETTING( 0x00, "0" )
PORT_DIPSETTING( 0x30, "5000" )
PORT_DIPSETTING( 0x20, "8000" )
PORT_DIPSETTING( 0x10, "10000" )
- PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) )
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA(J2):2,1")
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPSETTING( 0xc0, "3" )
PORT_DIPSETTING( 0x80, "4" )
PORT_DIPSETTING( 0x40, "5" )
PORT_START("DSW1")
- PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_B ) )
+ PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWB(K2):8,7,6,5")
PORT_DIPSETTING( 0x06, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0a, DEF_STR( 2C_1C ) )
@@ -484,7 +484,7 @@ static INPUT_PORTS_START( cavenger )
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
/* settings 0x00 through 0x05 all give 1 Coin/1 Credit */
- PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWB(K2):4,3,2,1")
PORT_DIPSETTING( 0x60, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x80, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0xa0, DEF_STR( 2C_1C ) )
@@ -531,32 +531,32 @@ static INPUT_PORTS_START( dorodon )
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("DSW0")
- PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWA(J2):8,7")
PORT_DIPSETTING( 0x03, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x02, DEF_STR( Medium ) )
PORT_DIPSETTING( 0x01, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Bonus_Life ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SWA(J2):6")
PORT_DIPSETTING( 0x04, "20000" )
PORT_DIPSETTING( 0x00, "30000" )
- PORT_DIPNAME( 0x08, 0x08, "Rack Test (Cheat)" ) PORT_CODE(KEYCODE_F1)
+ PORT_DIPNAME( 0x08, 0x08, "Rack Test (Cheat)" ) PORT_CODE(KEYCODE_F1) PORT_DIPLOCATION("SWA(J2):5")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, "Freeze" )
+ PORT_DIPNAME( 0x10, 0x10, "Freeze" ) PORT_DIPLOCATION("SWA(J2):4")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPNAME( 0x20, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWA(J2):3")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x20, DEF_STR( Cocktail ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SWA(J2):2")
PORT_DIPSETTING( 0x40, DEF_STR( No ) )
PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Lives ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA(J2):1")
PORT_DIPSETTING( 0x80, "3" )
PORT_DIPSETTING( 0x00, "5" )
PORT_START("DSW1")
- PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_B ) )
+ PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWB(K2):8,7,6,5")
PORT_DIPSETTING( 0x06, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0a, DEF_STR( 2C_1C ) )
@@ -568,7 +568,7 @@ static INPUT_PORTS_START( dorodon )
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
/* settings 0x00 through 0x05 all give 1 Coin/1 Credit */
- PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWB(K2):4,3,2,1")
PORT_DIPSETTING( 0x60, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x80, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0xa0, DEF_STR( 2C_1C ) )
@@ -1118,7 +1118,7 @@ ROM_START( mrsdyna )
ROM_REGION( 0x10000, "maincpu", 0 )
// NOTE: Mrs. Dynamite returns ROM ERROR in test mode. It does an 8-bit checksum on these 3
// ROMs and computes 0xFF. The answer to pass the test is 0x00.
- // THowever, these images were dumped twice, and seem to work fine.
+ // However, these images were dumped twice, and seem to work fine.
ROM_LOAD( "mrsd-8203a-r4.f3", 0x0000, 0x2000, CRC(c944062c) SHA1(c61fc327d67595e601f6a7e5e337646f5f9d351b) )
ROM_LOAD( "mrsd-8203a-n4.f2", 0x2000, 0x2000, CRC(d1b9c7bb) SHA1(c139c8ae5b14924eb04a265095a7ab95ac5370af) )
ROM_LOAD( "mrsd-8203a-m4.f1", 0x4000, 0x2000, CRC(d25b1dfe) SHA1(f68c6fb2cda37fcffbe7c3c2a3cc5cb372c4101b) )
diff --git a/src/mame/drivers/legionna.cpp b/src/mame/drivers/legionna.cpp
index cd74404c794..f95fdc9ae08 100644
--- a/src/mame/drivers/legionna.cpp
+++ b/src/mame/drivers/legionna.cpp
@@ -453,59 +453,68 @@ static INPUT_PORTS_START( legionna )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ???
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ???
- PORT_START("DSW1")
- PORT_DIPNAME( 0x001f, 0x001f, DEF_STR( Coinage ) )
- PORT_DIPSETTING( 0x0015, DEF_STR( 6C_1C ) )
- PORT_DIPSETTING( 0x0017, DEF_STR( 5C_1C ) )
- PORT_DIPSETTING( 0x0019, DEF_STR( 4C_1C ) )
- PORT_DIPSETTING( 0x001b, DEF_STR( 3C_1C ) )
- PORT_DIPSETTING( 0x0003, DEF_STR( 8C_3C ) )
- PORT_DIPSETTING( 0x001d, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x0005, DEF_STR( 5C_3C ) )
- PORT_DIPSETTING( 0x0007, DEF_STR( 3C_2C ) )
- PORT_DIPSETTING( 0x001f, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x0009, DEF_STR( 2C_3C ) )
- PORT_DIPSETTING( 0x0013, DEF_STR( 1C_2C ) )
- PORT_DIPSETTING( 0x0011, DEF_STR( 1C_3C ) )
- PORT_DIPSETTING( 0x000f, DEF_STR( 1C_4C ) )
- PORT_DIPSETTING( 0x000d, DEF_STR( 1C_5C ) )
- PORT_DIPSETTING( 0x000b, DEF_STR( 1C_6C ) )
- PORT_DIPSETTING( 0x001e, "A 1/1 B 1/2" )
- PORT_DIPSETTING( 0x0014, "A 2/1 B 1/3" )
- PORT_DIPSETTING( 0x000a, "A 3/1 B 1/5" )
- PORT_DIPSETTING( 0x0000, "A 5/1 B 1/6" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Free_Play ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_START("DSW1") // Note: If the joystick is held in any direction at power-on the DIP switches are shown on screen.
+ PORT_DIPNAME( 0x0001, 0x0001, "Coin Mode" ) PORT_DIPLOCATION("SW01:1")
+ PORT_DIPSETTING( 0x0001, "Mode 1" )
+ PORT_DIPSETTING( 0x0000, "Mode 2" )
+ PORT_DIPNAME( 0x001e, 0x001e, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW01:2,3,4,5") PORT_CONDITION("DSW1", 0x0001, NOTEQUALS, 0x0000)
+ PORT_DIPSETTING( 0x001e, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0012, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x000e, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x000c, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x000a, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x001c, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x001a, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0006, DEF_STR( 3C_2C ) )
+ PORT_DIPSETTING( 0x0018, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x0016, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 5C_3C ) )
+ PORT_DIPSETTING( 0x0014, DEF_STR( 6C_1C ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 8C_3C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x0006, 0x0006, DEF_STR( Coin_A )) PORT_DIPLOCATION("SW01:2,3") PORT_CONDITION("DSW1", 0x0001, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0006, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 5C_1C ) )
+ PORT_DIPNAME( 0x0018, 0x0018, DEF_STR( Coin_B )) PORT_DIPLOCATION("SW01:4,5") PORT_CONDITION("DSW1", 0x0001, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0018, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW01:6") // manual says 'NOT IN USE'
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, "Freeze" )
+ PORT_DIPNAME( 0x0040, 0x0040, "Freeze" ) PORT_DIPLOCATION("SW01:7") // manual says 'NOT IN USE'
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Flip_Screen ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW01:8")
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) )
+ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW02:1,2")
PORT_DIPSETTING( 0x0200, "1" )
PORT_DIPSETTING( 0x0300, "2" )
PORT_DIPSETTING( 0x0100, "3" )
PORT_DIPSETTING( 0x0000, "4" )
- PORT_DIPNAME( 0x0400, 0x0400, "Extend" )
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0400, 0x0400, "Extend Play" ) PORT_DIPLOCATION("SW02:3")
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW02:4") // manual says 'NOT IN USE'
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Difficulty ) )
+ PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW02:5,6")
PORT_DIPSETTING( 0x2000, DEF_STR( Easy ) )
- PORT_DIPSETTING( 0x3000, DEF_STR( Medium ) )
+ PORT_DIPSETTING( 0x3000, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x1000, DEF_STR( Hard ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Allow_Continue ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Very_Hard ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW02:7")
PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
PORT_DIPSETTING( 0x4000, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Demo_Sounds ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW02:8")
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Yes ) )
PORT_START("PLAYERS34")
PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -566,57 +575,66 @@ static INPUT_PORTS_START( heatbrl )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("DSW1")
- PORT_DIPNAME( 0x001f, 0x001f, DEF_STR( Coinage ) )
- PORT_DIPSETTING( 0x0015, DEF_STR( 6C_1C ) )
- PORT_DIPSETTING( 0x0017, DEF_STR( 5C_1C ) )
- PORT_DIPSETTING( 0x0019, DEF_STR( 4C_1C ) )
- PORT_DIPSETTING( 0x001b, DEF_STR( 3C_1C ) )
- PORT_DIPSETTING( 0x0003, DEF_STR( 8C_3C ) )
- PORT_DIPSETTING( 0x001d, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x0005, DEF_STR( 5C_3C ) )
- PORT_DIPSETTING( 0x0007, DEF_STR( 3C_2C ) )
- PORT_DIPSETTING( 0x001f, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x0009, DEF_STR( 2C_3C ) )
- PORT_DIPSETTING( 0x0013, DEF_STR( 1C_2C ) )
- PORT_DIPSETTING( 0x0011, DEF_STR( 1C_3C ) )
- PORT_DIPSETTING( 0x000f, DEF_STR( 1C_4C ) )
- PORT_DIPSETTING( 0x000d, DEF_STR( 1C_5C ) )
- PORT_DIPSETTING( 0x000b, DEF_STR( 1C_6C ) )
- PORT_DIPSETTING( 0x001e, "A 1/1 B 1/2" )
- PORT_DIPSETTING( 0x0014, "A 2/1 B 1/3" )
- PORT_DIPSETTING( 0x000a, "A 3/1 B 1/5" )
- PORT_DIPSETTING( 0x0000, "A 5/1 B 1/6" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Free_Play ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Players ) )
- PORT_DIPSETTING( 0x0020, "2" )
- PORT_DIPSETTING( 0x0000, "4" )
- PORT_DIPNAME( 0x0040, 0x0040, "Freeze" )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Flip_Screen ) )
+ PORT_START("DSW1") // Note: If any player 1 button is held down at power-on the DIP switches are shown on screen for 40 seconds.
+ PORT_DIPNAME( 0x0001, 0x0001, "Coin Mode" ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING( 0x0001, "Mode 1" )
+ PORT_DIPSETTING( 0x0000, "Mode 2" )
+ PORT_DIPNAME( 0x001e, 0x001e, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:2,3,4,5") PORT_CONDITION("DSW1", 0x0001, NOTEQUALS, 0x0000)
+ PORT_DIPSETTING( 0x001e, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0012, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x000e, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x000c, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x000a, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x001c, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x001a, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0006, DEF_STR( 3C_2C ) )
+ PORT_DIPSETTING( 0x0018, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x0016, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 5C_3C ) )
+ PORT_DIPSETTING( 0x0014, DEF_STR( 6C_1C ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 8C_3C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x0006, 0x0006, DEF_STR( Coin_A )) PORT_DIPLOCATION("SW1:2,3") PORT_CONDITION("DSW1", 0x0001, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0006, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 5C_1C ) )
+ PORT_DIPNAME( 0x0018, 0x0018, DEF_STR( Coin_B )) PORT_DIPLOCATION("SW1:4,5") PORT_CONDITION("DSW1", 0x0001, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0018, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x0060, 0x0060, "Cabinet Setting" ) PORT_DIPLOCATION("SW1:6,7")
+ PORT_DIPSETTING( 0x0060, "2 Players & 1 Coin Slot" )
+ PORT_DIPSETTING( 0x0040, "4 Players & 1 Coin Slot" )
+ PORT_DIPSETTING( 0x0020, "4 Players (2x 2P Linked) & 1-4 Coin Slots" )
+ PORT_DIPSETTING( 0x0000, "4 Players & 4 Coin Slots" )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) )
+ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x0200, "1" )
PORT_DIPSETTING( 0x0100, "2" )
PORT_DIPSETTING( 0x0300, "3" )
PORT_DIPSETTING( 0x0000, "5" )
- PORT_DIPNAME( 0x0400, 0x0400, "Extend" )
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( On ) )
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Difficulty ) )
+ PORT_DIPNAME( 0x0c00, 0x0c00, "Players Start & Join" ) PORT_DIPLOCATION("SW2:3,4") // Listed as-is from the manual but test mode shows different text for 2 choices
+ PORT_DIPSETTING( 0x0c00, DEF_STR( Normal ) ) // 1 or 2 players can start
+ PORT_DIPSETTING( 0x0800, "2 Start, 1 Can Join" ) // test shows 'Double Coin Start'. This is for a 4 player cab.
+ PORT_DIPSETTING( 0x0400, "2 Start, 2 Can Join" ) // test shows 'Normal'... probably for a 4-player cab or 2 linked cabs with a minimum of 2 players.
+ PORT_DIPSETTING( 0x0000, "1 Start, 2 Can Join" ) // test shows 'Double Coin Start'... also probably for a 4 player cab or 2 linked cabs.
+ PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6")
PORT_DIPSETTING( 0x2000, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x3000, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x1000, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Very_Hard ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Allow_Continue ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
PORT_DIPSETTING( 0x4000, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Demo_Sounds ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Yes ) )
INPUT_PORTS_END
@@ -653,31 +671,31 @@ static INPUT_PORTS_START( godzilla )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("DSW1")
- PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Demo_Sounds ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0001, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2")
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3")
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Flip_Screen ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:5")
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:6")
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7")
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Service_Mode ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Service_Mode ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0700, 0x0700, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0x0700, 0x0700, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW2:1,2,3")
PORT_DIPSETTING( 0x0000, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x0100, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0200, DEF_STR( 2C_1C ) )
@@ -686,19 +704,19 @@ static INPUT_PORTS_START( godzilla )
PORT_DIPSETTING( 0x0500, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x0300, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0400, DEF_STR( 1C_5C ) )
- PORT_DIPNAME( 0x3800, 0x3800, DEF_STR( Coin_B ) )
+ PORT_DIPNAME( 0x3800, 0x3800, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW2:4,5,6")
PORT_DIPSETTING( 0x3800, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x0000, "3 Coins/5 Credits" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 3C_5C ) )
PORT_DIPSETTING( 0x1000, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x3000, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x0800, DEF_STR( 2C_5C ) )
PORT_DIPSETTING( 0x2800, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x1800, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x2000, DEF_STR( 1C_5C ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
@@ -758,18 +776,18 @@ static INPUT_PORTS_START( grainbow )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(4)
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("DSW1")
- PORT_DIPNAME( 0x0003, 0x0003, DEF_STR( Lives ) )
+ PORT_START("DSW1") // DIP switch sheet or manual needed to improve this.
+ PORT_DIPNAME( 0x0003, 0x0003, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2")
PORT_DIPSETTING( 0x0002, "2")
PORT_DIPSETTING( 0x0003, "3")
PORT_DIPSETTING( 0x0000, "5")
PORT_DIPSETTING( 0x0001, "4")
- PORT_DIPNAME( 0x000c, 0x000c, DEF_STR( Difficulty ) ) // ???
+ PORT_DIPNAME( 0x000c, 0x000c, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:3,4") // could be something else, not difficulty???
PORT_DIPSETTING( 0x000c, "2" ) // Internal value stored at 0x1086cc and often used as table offset
PORT_DIPSETTING( 0x0008, "0" )
PORT_DIPSETTING( 0x0004, "4" )
- //PORT_DIPSETTING( 0x0000, "4" ) // Was one of these settings intended to be 6?
- PORT_DIPNAME( 0x00f0, 0x00f0, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x0000, "4" ) // Was one of these settings intended to be 6?
+ PORT_DIPNAME( 0x00f0, 0x00f0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:5,6,7,8")
PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
PORT_DIPSETTING( 0x00a0, DEF_STR( 6C_1C ) )
PORT_DIPSETTING( 0x00b0, DEF_STR( 5C_1C ) )
@@ -786,54 +804,54 @@ static INPUT_PORTS_START( grainbow )
PORT_DIPSETTING( 0x0070, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0060, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x0050, DEF_STR( 1C_6C ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Flip_Screen ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:1")
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Demo_Sounds ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
PORT_DIPSETTING( 0x0200, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:3")
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4")
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5")
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:6")
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Service_Mode ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Service_Mode ) ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_START("DSW2")
- PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:1")
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:2")
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:3")
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:4")
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:5")
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:6")
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:7") // toggling this has no effect in test mode, always shown on.
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:8") // toggling this has no effect in test mode, always shown on.
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -892,34 +910,34 @@ static INPUT_PORTS_START( denjinmk )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("DSW1")
- PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) )
+ PORT_START("DSW1") // DIP switch sheet or manual needed to improve this.
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2")
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3")
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Flip_Screen ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:5")
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Demo_Sounds ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( On ) )
- PORT_SERVICE( 0x0040, IP_ACTIVE_LOW )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Language ) ) // it actually skips the story entirely, so just remain JP as default
- PORT_DIPSETTING( 0x0080, DEF_STR( Japanese ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:6")
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Yes ) )
+ PORT_SERVICE( 0x0040, IP_ACTIVE_LOW ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Language ) ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x0080, DEF_STR( Japanese ) ) // On English it skips the story entirely, so leave JP as default
PORT_DIPSETTING( 0x0000, DEF_STR( English ) )
- PORT_DIPNAME( 0x0f00, 0x0f00, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0x0f00, 0x0f00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW2:1,2,3,4")
PORT_DIPSETTING( 0x0200, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x0500, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0800, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x0600, "3 Coins / 5 Credits" )
+ PORT_DIPSETTING( 0x0600, DEF_STR( 3C_5C ) )
PORT_DIPSETTING( 0x0400, DEF_STR( 3C_2C ) )
PORT_DIPSETTING( 0x0100, DEF_STR( 4C_3C ) )
PORT_DIPSETTING( 0x0f00, DEF_STR( 1C_1C ) )
@@ -932,11 +950,11 @@ static INPUT_PORTS_START( denjinmk )
PORT_DIPSETTING( 0x0a00, DEF_STR( 1C_6C ) )
PORT_DIPSETTING( 0x0900, DEF_STR( 1C_7C ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
- PORT_DIPNAME( 0xf000, 0xf000, DEF_STR( Coin_B ) )
+ PORT_DIPNAME( 0xf000, 0xf000, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW2:5,6,7,8")
PORT_DIPSETTING( 0x2000, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x5000, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x8000, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x6000, "3 Coins / 5 Credits" )
+ PORT_DIPSETTING( 0x6000, DEF_STR( 3C_5C ) )
PORT_DIPSETTING( 0x4000, DEF_STR( 3C_2C ) )
PORT_DIPSETTING( 0x1000, DEF_STR( 4C_3C ) )
PORT_DIPSETTING( 0xf000, DEF_STR( 1C_1C ) )
@@ -957,7 +975,7 @@ INPUT_PORTS_END
static INPUT_PORTS_START( cupsoc )
// p3 and p4 inputs are routed thru two 10-pins on lower-left of PCB
- // TODO: dip-conditional with coin slots
+ // TODO: dip-conditional with coin slots... Not actually needed as there are no conditional DIPs on this game.
// SEIBU_COIN_INPUTS override
PORT_START("COIN")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
@@ -1039,8 +1057,8 @@ static INPUT_PORTS_START( cupsoc )
PORT_DIPSETTING( 0x0028, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x0020, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0018, DEF_STR( 1C_6C ) )
- PORT_DIPNAME( 0x0040, 0x0040, "Starting Coin" ) PORT_DIPLOCATION("SW1:7")
- PORT_DIPSETTING( 0x0040, DEF_STR( Normal ) )
+ PORT_DIPNAME( 0x0040, 0x0040, "Starting Coin" ) PORT_DIPLOCATION("SW1:7") // x2 means at least 2 players must start which
+ PORT_DIPSETTING( 0x0040, DEF_STR( Normal ) ) // is similar to Heated Barrel SW2: 3,4
PORT_DIPSETTING( 0x0000, "x2" )
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
@@ -1073,22 +1091,22 @@ static INPUT_PORTS_START( cupsoc )
PORT_DIPSETTING( 0x0003, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x0002, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x0001, DEF_STR( Hard ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Very_Hard ) )
PORT_DIPNAME( 0x000c, 0x000c, "Cabinet Setting" ) PORT_DIPLOCATION("SW3:3,4")
- PORT_DIPSETTING( 0x0000, "4 Players / 1 Coin Slot" )
- PORT_DIPSETTING( 0x0004, "4 Players / 4 Coin Slots" )
- PORT_DIPSETTING( 0x0008, "4 Players / 2 Coin Slots" )
PORT_DIPSETTING( 0x000c, "2 Players" )
+ PORT_DIPSETTING( 0x0008, "4 Players & 4 Coin Slots" )
+ PORT_DIPSETTING( 0x0004, "4 Players (2x 2P Linked) & 1-4 Coin Slots" )
+ PORT_DIPSETTING( 0x0000, "4 Players & 1 Coin Slot" )
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW3:5")
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Yes ) )
PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Service_Mode ) ) PORT_DIPLOCATION("SW3:6")
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW3:7")
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW3:7") // toggling this has no effect in test mode, always shown on.
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW3:8")
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW3:8") // toggling this has no effect in test mode, always shown on.
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
diff --git a/src/mame/drivers/lk3000.cpp b/src/mame/drivers/lk3000.cpp
new file mode 100644
index 00000000000..e1c7dd84b7d
--- /dev/null
+++ b/src/mame/drivers/lk3000.cpp
@@ -0,0 +1,354 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Sean Riddle
+/******************************************************************************
+
+Lexicon LK-3000, a pocket computer.
+It was also licensed to Nixdorf.
+
+Hardware notes:
+- 3870 MCU (Motorola brand) @ 4MHz(2MHz internal)
+- optional external ROM or RAM
+- 4*Litronix DL 1414 (16*17segs total)
+- 33-button keypad
+
+The CPU and memory is on the cartridge. In theory, any hardware configuration
+is possible, but it looks like they always used a 3870.
+
+cartridge types known:
+- CPU + 4/8KB ROM (ROM may be unpopulated)
+- CPU + 2*4KB ROM
+- CPU + 1KB battery-backed RAM (2*NEC D444)
+
+TODO:
+- external rom access doesn't work ("german" locks up)
+- external ram should be battery-backed
+
+******************************************************************************/
+
+#include "emu.h"
+
+#include "bus/generic/carts.h"
+#include "bus/generic/slot.h"
+#include "cpu/f8/f8.h"
+#include "machine/f3853.h"
+#include "video/dl1416.h"
+
+// internal artwork
+#include "lk3000.lh"
+
+
+namespace {
+
+class lk3000_state : public driver_device
+{
+public:
+ lk3000_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_dl1414(*this, "dl1414_%u", 0),
+ m_cart(*this, "cartslot"),
+ m_inputs(*this, "IN.%u", 0),
+ m_digits(*this, "digit%u", 0U)
+ { }
+
+ void lk3000(machine_config &config);
+
+ // CLR button is tied to MCU RESET pin
+ DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); }
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_device_array<dl1414_device, 4> m_dl1414;
+ required_device<generic_slot_device> m_cart;
+ required_ioport_array<8> m_inputs;
+ output_finder<16> m_digits;
+
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
+ template <int N> void update_display(offs_t offset, u16 data);
+
+ u8 p0_r();
+ void p0_w(u8 data);
+ u8 p1_r();
+ void p1_w(u8 data);
+ u8 p4_r();
+ void p4_w(u8 data);
+ u8 p5_r();
+ void p5_w(u8 data);
+
+ u8 m_p0 = 0;
+ u8 m_p1 = 0;
+ u8 m_p4 = 0;
+ u8 m_p5 = 0;
+
+ bool m_has_ram = false;
+ u8 m_ram[0x400];
+};
+
+void lk3000_state::machine_start()
+{
+ m_digits.resolve();
+ memset(m_ram, 0xff, 0x400);
+
+ // register for savestates
+ save_item(NAME(m_p0));
+ save_item(NAME(m_p1));
+ save_item(NAME(m_p4));
+ save_item(NAME(m_p5));
+ save_item(NAME(m_has_ram));
+ save_item(NAME(m_ram));
+}
+
+
+
+/******************************************************************************
+ I/O
+******************************************************************************/
+
+// misc
+
+DEVICE_IMAGE_LOAD_MEMBER(lk3000_state::cart_load)
+{
+ u32 size = m_cart->common_get_size("rom");
+ m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ // extra ram (optional)
+ m_has_ram = image.get_feature("ram") != nullptr;
+
+ return image_init_result::PASS;
+}
+
+template <int N>
+void lk3000_state::update_display(offs_t offset, u16 data)
+{
+ m_digits[N * 4 + offset] = data;
+}
+
+
+// 3870 ports
+
+u8 lk3000_state::p0_r()
+{
+ return m_p0;
+}
+
+void lk3000_state::p0_w(u8 data)
+{
+ m_p0 = data;
+}
+
+u8 lk3000_state::p1_r()
+{
+ u8 data = m_p1;
+
+ // P10-P13: multiplexed inputs
+ if (m_p4 & 0x10)
+ data |= m_inputs[~m_p4 & 7]->read();
+
+ // read rom data
+ if (m_p5 & 0x20)
+ {
+ // P00-P06: A0-A6, P50-P54: A7-A11, P07 selects chip
+ u16 offset = (m_p0 & 0x7f) | (m_p5 << 7 & 0xf80) | (m_p0 << 5 & 0x1000);
+ data |= m_cart->read_rom(offset + 0x800);
+ }
+
+ // read ram data
+ if (m_has_ram && m_p4 & 0xc0)
+ {
+ u16 offset = (m_p0 & 0xff) | (m_p5 << 8 & 0x300);
+ data |= m_ram[offset];
+ }
+
+ return data;
+}
+
+void lk3000_state::p1_w(u8 data)
+{
+ // P10-P15,_P15: DL1414 data
+ for (int i = 0; i < 4; i++)
+ m_dl1414[i]->data_w((~data & 0x3f) | (data << 1 & 0x40));
+
+ m_p1 = data;
+}
+
+u8 lk3000_state::p4_r()
+{
+ return m_p4;
+}
+
+void lk3000_state::p4_w(u8 data)
+{
+ // P40,P41: DL1414 address
+ for (int i = 0; i < 4; i++)
+ m_dl1414[i]->addr_w(~data & 3);
+
+ // P42,P43,GND,P45: 7442 to DL1414 _WR
+ for (int i = 0; i < 4; i++)
+ m_dl1414[i]->wr_w(BIT(1 << (~data >> 2 & 0xb), i));
+
+ // P46: write ram data
+ if (m_has_ram && ~data & m_p4 & 0x40)
+ {
+ u16 offset = (m_p0 & 0xff) | (m_p5 << 8 & 0x300);
+ m_ram[offset] = m_p1;
+ }
+
+ // P40,P41,P42,P44: 7442 to keypad mux
+ m_p4 = data;
+}
+
+u8 lk3000_state::p5_r()
+{
+ return m_p5;
+}
+
+void lk3000_state::p5_w(u8 data)
+{
+ m_p5 = data;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void lk3000_state::main_map(address_map &map)
+{
+ map.global_mask(0x7ff);
+ map(0x0000, 0x07ff).r("cartslot", FUNC(generic_slot_device::read_rom));
+}
+
+void lk3000_state::main_io(address_map &map)
+{
+ map(0x00, 0x00).rw(FUNC(lk3000_state::p0_r), FUNC(lk3000_state::p0_w));
+ map(0x01, 0x01).rw(FUNC(lk3000_state::p1_r), FUNC(lk3000_state::p1_w));
+ map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( lk3000 )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_NAME("A / MET")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_NAME("B / US")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_NAME("C / X>M")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_NAME("D / K")
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_NAME("J / C1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_NAME("K / C2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_NAME("L / RM")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_NAME("M / %")
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_NAME("S / EXC")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_NAME("T / +/-")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_NAME("U / M+")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("V / 0")
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('e') PORT_NAME("E / 7")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('f') PORT_NAME("F / 8")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('g') PORT_NAME("G / 9")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('h') PORT_NAME(u8"H / ÷")
+
+ PORT_START("IN.4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('n') PORT_NAME("N / 4")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('o') PORT_NAME("O / 5")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('p') PORT_NAME("P / 6")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('q') PORT_NAME("Q / +")
+
+ PORT_START("IN.5")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('w') PORT_NAME("W / 1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('x') PORT_NAME("X / 2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('y') PORT_NAME("Y / 3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('z') PORT_NAME("Z / .")
+
+ PORT_START("IN.6")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('?') PORT_NAME("? / P2")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("bs / P1")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('r') PORT_NAME("R / -")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('i') PORT_NAME(u8"I / ×")
+
+ PORT_START("IN.7")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("def / P4")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') PORT_NAME("stp / P3")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(' ') PORT_NAME("sp / =")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_NAME("f")
+
+ PORT_START("RESET")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_CHANGED_MEMBER(DEVICE_SELF, lk3000_state, reset_button, 0) PORT_CHAR(127) PORT_NAME("clr")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
+
+void lk3000_state::lk3000(machine_config &config)
+{
+ // basic machine hardware
+ F8(config, m_maincpu, 4_MHz_XTAL/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lk3000_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &lk3000_state::main_io);
+ m_maincpu->set_irq_acknowledge_callback("psu", FUNC(f38t56_device::int_acknowledge));
+
+ auto &psu(F38T56(config, "psu", 4_MHz_XTAL/2));
+ psu.set_int_vector(0x20);
+ psu.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ);
+ psu.read_a().set(FUNC(lk3000_state::p4_r));
+ psu.write_a().set(FUNC(lk3000_state::p4_w));
+ psu.read_b().set(FUNC(lk3000_state::p5_r));
+ psu.write_b().set(FUNC(lk3000_state::p5_w));
+
+ // video hardware
+ DL1414T(config, m_dl1414[0], u32(0)).update().set(FUNC(lk3000_state::update_display<0>));
+ DL1414T(config, m_dl1414[1], u32(0)).update().set(FUNC(lk3000_state::update_display<1>));
+ DL1414T(config, m_dl1414[2], u32(0)).update().set(FUNC(lk3000_state::update_display<2>));
+ DL1414T(config, m_dl1414[3], u32(0)).update().set(FUNC(lk3000_state::update_display<3>));
+ config.set_default_layout(layout_lk3000);
+
+ // cartridge
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "lk3000");
+ m_cart->set_device_load(FUNC(lk3000_state::cart_load));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "cart_list").set_original("lk3000");
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( lk3000 )
+ ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 )
+ // none here, it's in the module slot
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT COMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1979, lk3000, 0, 0, lk3000, lk3000, lk3000_state, empty_init, "Lexicon", "LK-3000", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/m79amb.cpp b/src/mame/drivers/m79amb.cpp
index c855502faa1..1a3416dd16f 100644
--- a/src/mame/drivers/m79amb.cpp
+++ b/src/mame/drivers/m79amb.cpp
@@ -59,7 +59,6 @@ and two large (paddles pretending to be) guns.
#include "emu.h"
#include "includes/m79amb.h"
-#include "cpu/i8085/i8085.h"
#include "screen.h"
#include "speaker.h"
@@ -185,25 +184,26 @@ static INPUT_PORTS_START( m79amb )
INPUT_PORTS_END
-INTERRUPT_GEN_MEMBER(m79amb_state::m79amb_interrupt)
+uint8_t m79amb_state::inta_r()
{
- device.execute().set_input_line_and_vector(0, HOLD_LINE, 0xcf); /* Z80 - RST 08h */
+ m_maincpu->set_input_line(0, CLEAR_LINE);
+
+ // Vector is RST 1
+ return 0xcf;
}
void m79amb_state::m79amb(machine_config &config)
{
/* basic machine hardware */
- I8080(config, m_maincpu, XTAL(19'660'800) / 10);
+ I8080(config, m_maincpu, 19.6608_MHz_XTAL / 10);
m_maincpu->set_addrmap(AS_PROGRAM, &m79amb_state::main_map);
- m_maincpu->set_vblank_int("screen", FUNC(m79amb_state::m79amb_interrupt));
+ m_maincpu->in_inta_func().set(FUNC(m79amb_state::inta_r));
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
- screen.set_size(32*8, 32*8);
- screen.set_visarea(0*8, 32*8-1, 4*8, 32*8-1);
+ screen.set_raw(19.6608_MHz_XTAL / 4, 320, 0, 256, 262, 32, 256);
screen.set_screen_update(FUNC(m79amb_state::screen_update_ramtek));
+ screen.screen_vblank().set_inputline(m_maincpu, 0, ASSERT_LINE);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -214,7 +214,7 @@ void m79amb_state::m79amb(machine_config &config)
ROM_START( m79amb )
- ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_REGION( 0x2000, "maincpu", 0 )
ROM_LOAD( "m79.10t", 0x0000, 0x0200, CRC(ccf30b1e) SHA1(c1a77f8dc81c491928f81121ca5c9b7f8753794f) )
ROM_LOAD( "m79.9t", 0x0200, 0x0200, CRC(daf807dd) SHA1(16cd9d553bfb111c8380966cbde39dbddd5fe58c) )
ROM_LOAD( "m79.8t", 0x0400, 0x0200, CRC(79fafa02) SHA1(440620f5be44febdd7c64014739dc71fb570cc92) )
diff --git a/src/mame/drivers/mbee.cpp b/src/mame/drivers/mbee.cpp
index 197cbd9d271..ce5bea06fd8 100644
--- a/src/mame/drivers/mbee.cpp
+++ b/src/mame/drivers/mbee.cpp
@@ -129,6 +129,7 @@ from Brett Selwood and Andrew Davies.
#include "emu.h"
#include "includes/mbee.h"
#include "formats/mbee_cas.h"
+#include "sound/sn76496.h"
#include "speaker.h"
void mbee_state::mbee_mem(address_map &map)
@@ -288,6 +289,14 @@ void mbee_state::mbee128_io(address_map &map)
map(0x50, 0x57).w(FUNC(mbee_state::port50_w));
}
+void mbee_state::mbee128p_io(address_map &map)
+{
+ map.global_mask(0xff);
+ map.unmap_value_high();
+ mbee128_io(map);
+ map(0x10, 0x13).w("sn1", FUNC(sn76489a_device::write));
+}
+
void mbee_state::mbee256_io(address_map &map)
{
map.unmap_value_high();
@@ -301,7 +310,7 @@ void mbee_state::mbee256_io(address_map &map)
map(0x000b, 0x000b).mirror(0xff00).w(FUNC(mbee_state::port0b_w));
map(0x000c, 0x000c).mirror(0xff00).r(m_crtc, FUNC(mc6845_device::status_r)).w(FUNC(mbee_state::m6545_index_w));
map(0x000d, 0x000d).mirror(0xff00).r(m_crtc, FUNC(mc6845_device::register_r)).w(FUNC(mbee_state::m6545_data_w));
- // map(0x0010, 0x0013).mirror(0xff00); Optional SN76489AN audio chip (never used)
+ map(0x0010, 0x0013).mirror(0xff00).w("sn1", FUNC(sn76489a_device::write));
map(0x0018, 0x001b).mirror(0xff00).r(FUNC(mbee_state::port18_r));
map(0x001c, 0x001f).mirror(0xff00).rw(FUNC(mbee_state::port1c_r), FUNC(mbee_state::port1c_w));
map(0x0044, 0x0047).mirror(0xff00).rw(m_fdc, FUNC(wd2793_device::read), FUNC(wd2793_device::write));
@@ -433,7 +442,7 @@ static INPUT_PORTS_START( mbee128 )
PORT_CONFSETTING( 0x20, "Amber")
PORT_CONFSETTING( 0x30, "White")
// Wire links on motherboard
- PORT_CONFNAME( 0xc0, 0x40, "PIO B7")
+ PORT_CONFNAME( 0xc0, 0x80, "PIO B7")
PORT_CONFSETTING( 0x00, "VS") // sync pulse to enable telcom clock
PORT_CONFSETTING( 0x40, "RTC") // RTC IRQ for clock
PORT_CONFSETTING( 0x80, "Tied high") // default resistor to vcc
@@ -568,7 +577,7 @@ static INPUT_PORTS_START( mbee256 )
PORT_CONFSETTING( 0x00, DEF_STR(No))
PORT_CONFSETTING( 0x01, DEF_STR(Yes))
// Wire links on motherboard
- PORT_CONFNAME( 0xc0, 0x40, "PIO B7")
+ PORT_CONFNAME( 0xc0, 0x80, "PIO B7")
PORT_CONFSETTING( 0x00, "VS") // sync pulse to enable telcom clock
PORT_CONFSETTING( 0x40, "RTC") // RTC IRQ must be used on teleterm
PORT_CONFSETTING( 0x80, "Tied high") // default resistor to vcc
@@ -688,8 +697,12 @@ void mbee_state::mbee(machine_config &config)
m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
m_cassette->set_interface("mbee_cass");
- GENERIC_SOCKET(config, "optrom1", generic_plain_slot, "mbee_net", "mbn").set_device_load(FUNC(mbee_state::pak_load<1U>)); // net
- GENERIC_SOCKET(config, "optrom2", generic_plain_slot, "mbee_pak", "mbp").set_device_load(FUNC(mbee_state::pak_load<2U>)); // edasm
+ generic_slot_device &optrom1(GENERIC_SOCKET(config, "optrom1", generic_plain_slot, "mbee_net", "mbn")); // net
+ optrom1.set_device_load(FUNC(mbee_state::pak_load<1U>));
+ optrom1.set_device_unload(FUNC(mbee_state::pak_unload<1U>));
+ generic_slot_device &optrom2(GENERIC_SOCKET(config, "optrom2", generic_plain_slot, "mbee_pak", "mbp")); // edasm
+ optrom2.set_device_load(FUNC(mbee_state::pak_load<2U>));
+ optrom2.set_device_unload(FUNC(mbee_state::pak_unload<2U>));
SOFTWARE_LIST(config, "cass_list").set_original("mbee_cass").set_filter("1");
SOFTWARE_LIST(config, "quik_list").set_original("mbee_quik").set_filter("1");
@@ -752,13 +765,27 @@ void mbee_state::mbeeic(machine_config &config)
m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
m_cassette->set_interface("mbee_cass");
- GENERIC_SOCKET(config, "optrom1", generic_plain_slot, "mbee_net", "mbn").set_device_load(FUNC(mbee_state::pak_load<1U>)); // net
- GENERIC_SOCKET(config, "optrom2", generic_plain_slot, "mbee_pak", "mbp").set_device_load(FUNC(mbee_state::pak_load<2U>)); // pak0
- GENERIC_SOCKET(config, "optrom3", generic_plain_slot, "mbee_pak", "mbp").set_device_load(FUNC(mbee_state::pak_load<3U>)); // pak1
- GENERIC_SOCKET(config, "optrom4", generic_plain_slot, "mbee_pak", "mbp").set_device_load(FUNC(mbee_state::pak_load<4U>)); // pak2
- GENERIC_SOCKET(config, "optrom5", generic_plain_slot, "mbee_pak", "mbp").set_device_load(FUNC(mbee_state::pak_load<5U>)); // pak3
- GENERIC_SOCKET(config, "optrom6", generic_plain_slot, "mbee_pak", "mbp").set_device_load(FUNC(mbee_state::pak_load<6U>)); // pak4
- GENERIC_SOCKET(config, "optrom7", generic_plain_slot, "mbee_pak", "mbp").set_device_load(FUNC(mbee_state::pak_load<7U>)); // pak5
+ generic_slot_device &optrom1(GENERIC_SOCKET(config, "optrom1", generic_plain_slot, "mbee_net", "mbn")); // net
+ optrom1.set_device_load(FUNC(mbee_state::pak_load<1U>));
+ optrom1.set_device_unload(FUNC(mbee_state::pak_unload<1U>));
+ generic_slot_device &optrom2(GENERIC_SOCKET(config, "optrom2", generic_plain_slot, "mbee_pak", "mbp")); // pak0
+ optrom2.set_device_load(FUNC(mbee_state::pak_load<2U>));
+ optrom2.set_device_unload(FUNC(mbee_state::pak_unload<2U>));
+ generic_slot_device &optrom3(GENERIC_SOCKET(config, "optrom3", generic_plain_slot, "mbee_pak", "mbp")); // pak1
+ optrom3.set_device_load(FUNC(mbee_state::pak_load<3U>));
+ optrom3.set_device_unload(FUNC(mbee_state::pak_unload<3U>));
+ generic_slot_device &optrom4(GENERIC_SOCKET(config, "optrom4", generic_plain_slot, "mbee_pak", "mbp")); // pak2
+ optrom4.set_device_load(FUNC(mbee_state::pak_load<4U>));
+ optrom4.set_device_unload(FUNC(mbee_state::pak_unload<4U>));
+ generic_slot_device &optrom5(GENERIC_SOCKET(config, "optrom5", generic_plain_slot, "mbee_pak", "mbp")); // pak3
+ optrom5.set_device_load(FUNC(mbee_state::pak_load<5U>));
+ optrom5.set_device_unload(FUNC(mbee_state::pak_unload<5U>));
+ generic_slot_device &optrom6(GENERIC_SOCKET(config, "optrom6", generic_plain_slot, "mbee_pak", "mbp")); // pak4
+ optrom6.set_device_load(FUNC(mbee_state::pak_load<6U>));
+ optrom6.set_device_unload(FUNC(mbee_state::pak_unload<6U>));
+ generic_slot_device &optrom7(GENERIC_SOCKET(config, "optrom7", generic_plain_slot, "mbee_pak", "mbp")); // pak5
+ optrom7.set_device_load(FUNC(mbee_state::pak_load<7U>));
+ optrom7.set_device_unload(FUNC(mbee_state::pak_unload<7U>));
SOFTWARE_LIST(config, "cass_list").set_original("mbee_cass").set_filter("2");
SOFTWARE_LIST(config, "quik_list").set_original("mbee_quik").set_filter("2");
@@ -794,8 +821,8 @@ void mbee_state::mbee56(machine_config &config)
m_fdc->intrq_wr_callback().set(FUNC(mbee_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(mbee_state::fdc_drq_w));
m_fdc->enmf_rd_callback().set_constant(0);
- FLOPPY_CONNECTOR(config, m_floppy0, mbee_floppies, "525qd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy1, mbee_floppies, "525qd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy0, mbee_floppies, "35dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, mbee_floppies, "35dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
SOFTWARE_LIST(config, "flop_list").set_original("mbee_flop").set_filter("1");
remove_carts(config);
@@ -818,30 +845,34 @@ 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);
+ m_maincpu->set_addrmap(AS_IO, &mbee_state::mbee128p_io);
WD2793(config, m_fdc, 4_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(mbee_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(mbee_state::fdc_drq_w));
m_fdc->enmf_rd_callback().set_constant(0);
- FLOPPY_CONNECTOR(config, m_floppy0, mbee_floppies, "525qd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy1, mbee_floppies, "525qd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy0, mbee_floppies, "35dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, mbee_floppies, "35dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+
+ SN76489A(config, "sn1", 13.5_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "mono", 0.50);
SOFTWARE_LIST(config, "flop_list").set_original("mbee_flop").set_filter("3");
remove_carts(config);
remove_quick(config);
}
+void mbee_state::mbeepp(machine_config &config)
+{
+ mbee128p(config);
+ SOFTWARE_LIST(config.replace(), "flop_list").set_original("mbee_flop").set_filter("2,3");
+}
+
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);
- config.device_remove("fdc:0");
- config.device_remove("fdc:1");
- FLOPPY_CONNECTOR(config, m_floppy0, mbee_floppies, "35dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy1, mbee_floppies, "35dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
TIMER(config, "newkb_timer").configure_periodic(FUNC(mbee_state::newkb_timer), attotime::from_hz(50));
SOFTWARE_LIST(config.replace(), "flop_list").set_original("mbee_flop").set_filter("4");
@@ -1154,4 +1185,4 @@ COMP( 1986, mbeeppc, mbee, 0, mbeeppc, mbee, mbee_state, init_mbeep
COMP( 1986, mbeett, mbee, 0, mbeett, mbee256, mbee_state, init_mbeett, "Microbee Systems", "Microbee Teleterm", MACHINE_SUPPORTS_SAVE )
COMP( 1986, mbee128p, mbee, 0, mbee128p, mbee128, mbee_state, init_mbee128p, "Microbee Systems", "Microbee 128k Premium", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1987, mbee256, mbee, 0, mbee256, mbee256, mbee_state, init_mbee256, "Microbee Systems", "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 )
+COMP( 2012, mbeepp, mbee, 0, mbeepp, mbee128, mbee_state, init_mbeepp, "Microbee Systems", "Microbee Premium Plus+", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/mc10.cpp b/src/mame/drivers/mc10.cpp
index c389f7055c9..82764d6f977 100644
--- a/src/mame/drivers/mc10.cpp
+++ b/src/mame/drivers/mc10.cpp
@@ -4,16 +4,14 @@
TRS-80 Radio Shack MicroColor Computer
- May 2020: Added emulation for Darren Atkinson's MCX 128.
-
***************************************************************************/
-
#include "emu.h"
#include "cpu/m6800/m6801.h"
#include "imagedev/cassette.h"
#include "imagedev/printer.h"
+#include "bus/mc10/mc10_cart.h"
#include "bus/rs232/rs232.h"
#include "machine/ram.h"
#include "machine/timer.h"
@@ -26,7 +24,6 @@
#include "formats/coco_cas.h"
-
namespace
{
@@ -41,33 +38,30 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_ram(*this, RAM_TAG)
- , m_bank1(*this, "bank1")
- , m_bank2(*this, "bank2")
+ , m_mc10cart(*this, "ext")
, m_mc6847(*this, "mc6847")
- , m_ef9345(*this, "ef9345")
, m_dac(*this, "dac")
, m_cassette(*this, "cassette")
, m_rs232(*this, "rs232")
, m_pb(*this, "pb%u", 0U)
- { }
+ {}
- void alice90(machine_config &config);
- void alice32(machine_config &config);
+ void mc10_base(machine_config &config);
+ void mc10_video(machine_config &config);
void mc10(machine_config &config);
+ void alice(machine_config &config);
+ void mc10_bfff_w_dac(uint8_t data);
+ uint8_t mc10_bfff_r();
protected:
- uint8_t mc10_bfff_r();
void mc10_bfff_w(uint8_t data);
uint8_t mc10_port1_r();
void mc10_port1_w(uint8_t data);
uint8_t mc10_port2_r();
void mc10_port2_w(uint8_t data);
- uint8_t alice90_bfff_r();
- void alice32_bfff_w(uint8_t data);
uint8_t mc6847_videoram_r(offs_t offset);
- TIMER_DEVICE_CALLBACK_MEMBER(alice32_scanline);
// device-level overrides
virtual void driver_start() override;
@@ -75,74 +69,48 @@ protected:
required_device<m6803_cpu_device> m_maincpu;
required_device<ram_device> m_ram;
- required_memory_bank m_bank1;
- optional_memory_bank m_bank2;
+ optional_device<mc10cart_slot_device> m_mc10cart;
- uint8_t *m_ram_base;
- uint32_t m_ram_size;
uint8_t m_keyboard_strobe;
uint8_t m_port2;
uint8_t read_keyboard_strobe(bool single_line);
+ mc10cart_slot_device &mc10cart() { return *m_mc10cart; }
+
private:
- void alice32_mem(address_map &map);
- void alice90_mem(address_map &map);
void mc10_mem(address_map &map);
optional_device<mc6847_base_device> m_mc6847;
- optional_device<ef9345_device> m_ef9345;
required_device<dac_bit_interface> m_dac;
required_device<cassette_image_device> m_cassette;
required_device<rs232_port_device> m_rs232;
required_ioport_array<8> m_pb;
};
-class mcx128_state : public mc10_state
+class alice32_state : public mc10_state
{
public:
- mcx128_state(const machine_config &mconfig, device_type type, const char *tag)
+ alice32_state(const machine_config &mconfig, device_type type, const char *tag)
: mc10_state(mconfig, type, tag)
- , m_mcx_ram(*this, "mcx_ram")
- , m_mcx_cart_rom_base(*this, "cart")
- , m_mcx_int_rom_base(*this, "maincpu")
- , m_bank3(*this, "bank3")
- , m_bank4r(*this, "bank4r")
- , m_bank4w(*this, "bank4w")
- , m_bank5r(*this, "bank5r")
- , m_bank5w(*this, "bank5w")
- , m_bank6r(*this, "bank6r")
- , m_bank6w(*this, "bank6w")
- { }
-
- void mcx128(machine_config &config);
-
-private:
- uint8_t mcx128_bf00_r(offs_t offset);
- void mcx128_bf00_w(offs_t offset, uint8_t data);
+ , m_ef9345(*this, "ef9345")
+ {}
- void mcx128_mem(address_map &map);
- void update_mcx128_banking();
+ void alice32(machine_config &config);
+ void alice90(machine_config &config);
+ void alice32_bfff_w(uint8_t data);
+ uint8_t alice90_bfff_r();
+protected:
// device-level overrides
virtual void driver_start() override;
- virtual void driver_reset() override;
- required_device<ram_device> m_mcx_ram;
- required_region_ptr<u8> m_mcx_cart_rom_base;
- required_region_ptr<u8> m_mcx_int_rom_base;
- required_memory_bank m_bank3;
- required_memory_bank m_bank4r;
- required_memory_bank m_bank4w;
- required_memory_bank m_bank5r;
- required_memory_bank m_bank5w;
- required_memory_bank m_bank6r;
- required_memory_bank m_bank6w;
-
- uint8_t *m_mcx_ram_base;
-
- uint8_t m_bank_control;
- uint8_t m_map_control;
+ TIMER_DEVICE_CALLBACK_MEMBER(alice32_scanline);
+ required_device<ef9345_device> m_ef9345;
+
+private:
+ void alice32_mem(address_map &map);
+ void alice90_mem(address_map &map);
};
/***************************************************************************
@@ -162,16 +130,16 @@ uint8_t mc10_state::read_keyboard_strobe(bool single_line)
read = true;
}
}
+
return result;
}
-
uint8_t mc10_state::mc10_bfff_r()
{
return read_keyboard_strobe(false);
}
-uint8_t mc10_state::alice90_bfff_r()
+uint8_t alice32_state::alice90_bfff_r()
{
return read_keyboard_strobe(true);
}
@@ -186,119 +154,29 @@ void mc10_state::mc10_bfff_w(uint8_t data)
m_mc6847->ag_w(BIT(data, 5));
m_mc6847->css_w(BIT(data, 6));
- // bit 7, dac output
- m_dac->write(BIT(data, 7));
+ mc10_bfff_w_dac(data);
}
-void mc10_state::alice32_bfff_w(uint8_t data)
+void mc10_state::mc10_bfff_w_dac(uint8_t data)
{
// bit 7, dac output
m_dac->write(BIT(data, 7));
}
-/***************************************************************************
- $bf00: RAM Bank Control Register
- 7 6 5 4 3 2 1 0
- | | | | | | | |
- | | | | | | | +- Bank Selection for Page 0
- | | | | | | +--- Bank Selection for Page 1
- +-+-+-+-+-+----- N/C
- $bf01: ROM Map Control Register
- 7 6 5 4 3 2 1 0 | reading | writing |
- | | | | | | | | 0 0 - 16K External ROM 16K RAM
- | | | | | | | +-\_ 0 1 - 8K RAM / 8K External ROM 16K RAM
- | | | | | | +---/ 1 0 - 8K RAM / 8K Internal ROM 16K RAM
- | | | | | | 1 1 - 16K RAM 16K RAM
- +-+-+-+-+-+--------N/C
-***************************************************************************/
-
-void mcx128_state::update_mcx128_banking()
+void alice32_state::alice32_bfff_w(uint8_t data)
{
- int32_t bank_offset_page_0 = 0x10000 * BIT(m_bank_control,0);
- int32_t bank_offset_page_1 = 0x10000 * BIT(m_bank_control,1);
-
- // 0x0000 - 0x3fff
- m_bank1->set_base(m_mcx_ram_base + bank_offset_page_0 + 0);
-
- // 0x4000 - 0x4fff
- if( bank_offset_page_1 == 0)
- m_bank2->set_base(m_ram_base); /* internal 4K when page is 0 */
- else
- m_bank2->set_base(m_mcx_ram_base + bank_offset_page_1 + 0x8000);
-
- // 0x5000 - 0xbeff
- m_bank3->set_base(m_mcx_ram_base + bank_offset_page_1 + 0x8000 + 0x1000);
-
- // 0xc000 - 0xdfff
- m_bank4w->set_base(m_mcx_ram_base + bank_offset_page_0 + 0x4000);
-
- // 0xe000 - 0xfeff
- m_bank5w->set_base(m_mcx_ram_base + bank_offset_page_0 + 0x6000);
-
- // 0xff00 - 0xffff
- m_bank6w->set_base(m_mcx_ram_base + 0 + 0x7f00); /* always bank 0 */
-
- switch( m_map_control )
- {
- case 0:
- m_bank4r->set_base(m_mcx_cart_rom_base);
- m_bank5r->set_base(m_mcx_cart_rom_base + 0x2000);
- m_bank6r->set_entry(0);
- break;
-
- case 1:
- m_bank4r->set_base(m_mcx_ram_base + bank_offset_page_0 + 0x4000);
- m_bank5r->set_base(m_mcx_cart_rom_base + 0x2000 + 0x2000); // invalid address, what should it be?
- m_bank6r->set_entry(1);
- break;
-
- case 2:
- m_bank4r->set_base(m_mcx_ram_base + bank_offset_page_0 + 0x4000);
- m_bank5r->set_base(m_mcx_int_rom_base);
- m_bank6r->set_entry(2);
- break;
-
- case 3:
- m_bank4r->set_base(m_mcx_ram_base + bank_offset_page_0 + 0x4000);
- m_bank5r->set_base(m_mcx_ram_base + bank_offset_page_0 + 0x6000);
- m_bank6r->set_entry(3); /* always bank 0 */
- break;
-
- default:
- // can't get here
- break;
- }
-}
-
-uint8_t mcx128_state::mcx128_bf00_r(offs_t offset)
-{
- if( (offset & 1) == 0 ) return m_bank_control;
-
- return m_map_control;
-}
-
-void mcx128_state::mcx128_bf00_w(offs_t offset, uint8_t data)
-{
- if( (offset & 1) == 0 )
- m_bank_control = data & 3;
- else
- m_map_control = data & 3;
-
- update_mcx128_banking();
+ mc10_bfff_w_dac(data);
}
-
/***************************************************************************
MC6803 I/O
***************************************************************************/
-/* keyboard strobe */
uint8_t mc10_state::mc10_port1_r()
{
return m_keyboard_strobe;
}
-/* keyboard strobe */
void mc10_state::mc10_port1_w(uint8_t data)
{
m_keyboard_strobe = data;
@@ -329,7 +207,6 @@ void mc10_state::mc10_port2_w(uint8_t data)
{
// bit 0, cassette & printer output
m_cassette->output( BIT(data, 0) ? +1.0 : -1.0);
-
m_rs232->write_txd(BIT(data, 0) ? 1 : 0);
m_port2 = data;
@@ -343,13 +220,14 @@ void mc10_state::mc10_port2_w(uint8_t data)
uint8_t mc10_state::mc6847_videoram_r(offs_t offset)
{
if (offset == ~0) return 0xff;
- m_mc6847->inv_w(BIT(m_ram_base[offset], 6));
- m_mc6847->as_w(BIT(m_ram_base[offset], 7));
- return m_ram_base[offset];
+ uint8_t result = m_ram->read(offset);
+ m_mc6847->inv_w(BIT(result, 6));
+ m_mc6847->as_w(BIT(result, 7));
+ return result;
}
-TIMER_DEVICE_CALLBACK_MEMBER(mc10_state::alice32_scanline)
+TIMER_DEVICE_CALLBACK_MEMBER(alice32_state::alice32_scanline)
{
m_ef9345->update_scanline((uint16_t)param);
}
@@ -358,73 +236,37 @@ TIMER_DEVICE_CALLBACK_MEMBER(mc10_state::alice32_scanline)
DRIVER INIT
***************************************************************************/
-
void mc10_state::driver_reset()
{
- /* initialize keyboard strobe */
m_keyboard_strobe = 0x00;
}
void mc10_state::driver_start()
{
- // call base device_start
driver_device::driver_start();
- address_space &prg = m_maincpu->space(AS_PROGRAM);
-
- /* initialize memory */
- m_ram_base = m_ram->pointer();
- m_ram_size = m_ram->size();
- m_bank1->set_base(m_ram_base);
+ save_item(NAME(m_keyboard_strobe));
- /* initialize memory expansion */
- if (m_bank2)
- {
- if (m_ram_size == 20 * 1024)
- m_bank2->set_base(m_ram_base + 0x1000);
- else if (m_ram_size == 24 * 1024)
- m_bank2->set_base(m_ram_base + 0x2000);
- else if (m_ram_size != 32 * 1024) //ensure that is not alice90
- prg.nop_readwrite(0x5000, 0x8fff);
- }
+ address_space &space = m_maincpu->space(AS_PROGRAM);
+ u32 ram_size = m_ram->size();
- /* register for state saving */
- save_item(NAME(m_keyboard_strobe));
+ // don't step on hardware page at 0xbf00
+ if (ram_size == 0x8000)
+ ram_size -= 0x100;
- //for alice32 force port4 DDR to 0xff at startup
- //if (!strcmp(machine().system().name, "alice32") || !strcmp(machine().system().name, "alice90"))
- //m_maincpu->m6801_io_w(prg, 0x05, 0xff);
+ space.install_ram(0x4000, 0x4000+ram_size-1, m_ram->pointer());
}
-void mcx128_state::driver_start()
+void alice32_state::driver_start()
{
- // call base device_start
driver_device::driver_start();
- /* initialize memory */
- m_ram_base = m_ram->pointer();
- m_ram_size = m_ram->size();
-
- m_mcx_ram_base = m_mcx_ram->pointer();
-
- save_item(NAME(m_bank_control));
- save_item(NAME(m_map_control));
-
- m_bank6r->configure_entry(0, m_mcx_cart_rom_base + 0x3f00);
- m_bank6r->configure_entry(1, m_mcx_cart_rom_base + 0x5f00); // invalid address, what should it be?
- m_bank6r->configure_entry(2, m_mcx_int_rom_base + 0x1f00);
- m_bank6r->configure_entry(3, m_mcx_ram_base + 0x7f00);
-}
-
-void mcx128_state::driver_reset()
-{
- // call base device_start
- mc10_state::driver_reset();
+ save_item(NAME(m_keyboard_strobe));
- m_bank_control = 0;
- m_map_control = 0;
+ address_space &space = m_maincpu->space(AS_PROGRAM);
+ u32 ram_size = m_ram->size();
- update_mcx128_banking();
+ space.install_ram(0x3000, 0x3000+ram_size-1, m_ram->pointer());
}
/***************************************************************************
@@ -433,47 +275,28 @@ void mcx128_state::driver_reset()
void mc10_state::mc10_mem(address_map &map)
{
- map(0x0100, 0x3fff).noprw(); /* unused */
- map(0x4000, 0x4fff).bankrw("bank1"); /* 4k internal ram */
- map(0x5000, 0x8fff).bankrw("bank2"); /* 16k memory expansion */
- map(0x9000, 0xbffe).noprw(); /* unused */
+ // mc10 / alice: RAM start at 0x4000, installed in driver_start
map(0xbfff, 0xbfff).rw(FUNC(mc10_state::mc10_bfff_r), FUNC(mc10_state::mc10_bfff_w));
- map(0xe000, 0xffff).rom().region("maincpu", 0x0000); /* ROM */
+ map(0xe000, 0xffff).rom().region("maincpu", 0x0000);
}
-void mc10_state::alice32_mem(address_map &map)
+void alice32_state::alice32_mem(address_map &map)
{
- map(0x0100, 0x2fff).noprw(); /* unused */
- map(0x3000, 0x4fff).bankrw("bank1"); /* 8k internal ram */
- map(0x5000, 0x8fff).bankrw("bank2"); /* 16k memory expansion */
- map(0x9000, 0xafff).noprw(); /* unused */
+ // alice32: RAM start at 0x3000, installed in driver_start
map(0xbf20, 0xbf29).rw(m_ef9345, FUNC(ef9345_device::data_r), FUNC(ef9345_device::data_w));
- map(0xbfff, 0xbfff).rw(FUNC(mc10_state::mc10_bfff_r), FUNC(mc10_state::alice32_bfff_w));
- map(0xc000, 0xffff).rom().region("maincpu", 0x0000); /* ROM */
+ map(0xbfff, 0xbfff).rw(FUNC(mc10_state::mc10_bfff_r), FUNC(alice32_state::alice32_bfff_w));
+ map(0xc000, 0xffff).rom().region("maincpu", 0x0000);
}
-void mc10_state::alice90_mem(address_map &map)
+void alice32_state::alice90_mem(address_map &map)
{
- map(0x0100, 0x2fff).noprw(); /* unused */
- map(0x3000, 0xafff).bankrw("bank1"); /* 32k internal ram */
+ // alice90: RAM start at 0x3000, installed in driver_start
map(0xbf20, 0xbf29).rw(m_ef9345, FUNC(ef9345_device::data_r), FUNC(ef9345_device::data_w));
- map(0xbfff, 0xbfff).rw(FUNC(mc10_state::alice90_bfff_r), FUNC(mc10_state::alice32_bfff_w));
- map(0xc000, 0xffff).rom().region("maincpu", 0x0000); /* ROM */
+ map(0xbfff, 0xbfff).rw(FUNC(alice32_state::alice90_bfff_r), FUNC(alice32_state::alice32_bfff_w));
+ map(0xc000, 0xffff).rom().region("maincpu", 0x0000);
}
-void mcx128_state::mcx128_mem(address_map &map)
-{
- map(0x0000, 0x3fff).bankrw("bank1");
- map(0x4000, 0x4fff).bankrw("bank2");
- map(0x5000, 0xbeff).bankrw("bank3");
- map(0xbf00, 0xbf01).rw(FUNC(mcx128_state::mcx128_bf00_r), FUNC(mcx128_state::mcx128_bf00_w));
- map(0xbf02, 0xbf7f).noprw(); /* unused */
- map(0xbf80, 0xbffe).noprw(); /* unused */
- map(0xbfff, 0xbfff).rw(FUNC(mcx128_state::mc10_bfff_r), FUNC(mcx128_state::mc10_bfff_w));
- map(0xc000, 0xdfff).bankr("bank4r").bankw("bank4w");
- map(0xe000, 0xfeff).bankr("bank5r").bankw("bank5w");
- map(0xff00, 0xffff).bankr("bank6r").bankw("bank6w");
-}
+
/***************************************************************************
INPUT PORTS
@@ -659,7 +482,7 @@ DEVICE_INPUT_DEFAULTS_END
MACHINE DRIVERS
***************************************************************************/
-void mc10_state::mc10(machine_config &config)
+void mc10_state::mc10_base(machine_config &config)
{
/* basic machine hardware */
M6803(config, m_maincpu, XTAL(3'579'545)); /* 0,894886 MHz */
@@ -669,42 +492,68 @@ void mc10_state::mc10(machine_config &config)
m_maincpu->in_p2_cb().set(FUNC(mc10_state::mc10_port2_r));
m_maincpu->out_p2_cb().set(FUNC(mc10_state::mc10_port2_w));
- /* video hardware */
- SCREEN(config, "screen", SCREEN_TYPE_RASTER);
-
- mc6847_ntsc_device &vdg(MC6847_NTSC(config, "mc6847", XTAL(3'579'545)));
- vdg.set_screen("screen");
- vdg.input_callback().set(FUNC(mc10_state::mc6847_videoram_r));
-
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.0625);
CASSETTE(config, m_cassette);
- m_cassette->set_formats(coco_cassette_formats);
+ m_cassette->set_formats(alice32_cassette_formats);
m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
m_cassette->add_route(ALL_OUTPUTS, "speaker", 0.05);
m_cassette->set_interface("mc10_cass");
/* printer */
- rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "printer"));
- rs232.set_option_device_input_defaults("printer", DEVICE_INPUT_DEFAULTS_NAME(printer));
+ rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "rs_printer"));
+ rs232.set_option_device_input_defaults("rs_printer", DEVICE_INPUT_DEFAULTS_NAME(printer));
+}
+void mc10_state::mc10_video(machine_config &config)
+{
/* internal ram */
- RAM(config, m_ram).set_default_size("20K").set_extra_options("4K");
+ RAM(config, m_ram).set_default_size("4K").set_extra_options("8K,20K,32K");
+
+ /* video hardware */
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER).set_raw(9.828_MHz_XTAL / 2, 320, 0, 320, 243, 0, 243);
+
+ mc6847_ntsc_device &vdg(MC6847_NTSC(config, "mc6847", XTAL(3'579'545)));
+ vdg.set_screen("screen");
+ vdg.input_callback().set(FUNC(mc10_state::mc6847_videoram_r));
+}
+
+void mc10_state::mc10(machine_config &config)
+{
+ mc10_base(config);
+ mc10_video(config);
+
+ /* expansion port hardware */
+ mc10cart_slot_device &cartslot(MC10CART_SLOT(config, "ext", DERIVED_CLOCK(1, 1), mc10_cart_add_basic_devices, nullptr));
+ cartslot.set_memspace(m_maincpu, AS_PROGRAM);
+ cartslot.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
/* Software lists */
SOFTWARE_LIST(config, "cass_list").set_original("mc10");
}
-void mc10_state::alice32(machine_config &config)
+void mc10_state::alice(machine_config &config)
{
- M6803(config, m_maincpu, XTAL(3'579'545));
- m_maincpu->set_addrmap(AS_PROGRAM, &mc10_state::alice32_mem);
- m_maincpu->in_p1_cb().set(FUNC(mc10_state::mc10_port1_r));
- m_maincpu->out_p1_cb().set(FUNC(mc10_state::mc10_port1_w));
- m_maincpu->in_p2_cb().set(FUNC(mc10_state::mc10_port2_r));
- m_maincpu->out_p2_cb().set(FUNC(mc10_state::mc10_port2_w));
+ mc10_base(config);
+ mc10_video(config);
+
+ /* expansion port hardware */
+ mc10cart_slot_device &cartslot(MC10CART_SLOT(config, "ext", DERIVED_CLOCK(1, 1), alice_cart_add_basic_devices, nullptr));
+ cartslot.set_memspace(m_maincpu, AS_PROGRAM);
+ cartslot.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
+
+ /* Software lists */
+ SOFTWARE_LIST(config, "cass_list").set_original("mc10");
+}
+
+void alice32_state::alice32(machine_config &config)
+{
+ mc10_base(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &alice32_state::alice32_mem);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -717,35 +566,28 @@ void mc10_state::alice32(machine_config &config)
EF9345(config, m_ef9345, 0);
m_ef9345->set_screen("screen");
m_ef9345->set_palette_tag("palette");
- TIMER(config, "alice32_sl").configure_scanline(FUNC(mc10_state::alice32_scanline), "screen", 0, 10);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.0625);
-
- CASSETTE(config, m_cassette);
- m_cassette->set_formats(alice32_cassette_formats);
- m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
- m_cassette->add_route(ALL_OUTPUTS, "speaker", 0.05);
- m_cassette->set_interface("mc10_cass");
-
- /* printer */
- rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "printer"));
- rs232.set_option_device_input_defaults("printer", DEVICE_INPUT_DEFAULTS_NAME(printer));
+ TIMER(config, "alice32_sl").configure_scanline(FUNC(alice32_state::alice32_scanline), "screen", 0, 10);
+ /* expansion port hardware */
+ mc10cart_slot_device &cartslot(MC10CART_SLOT(config, "ext", DERIVED_CLOCK(1, 1), alice32_cart_add_basic_devices, nullptr));
+ cartslot.set_memspace(m_maincpu, AS_PROGRAM);
+ cartslot.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
/* internal ram */
- RAM(config, m_ram).set_default_size("24K").set_extra_options("8K");
+ RAM(config, m_ram).set_default_size("8K").set_extra_options("24K");
/* Software lists */
SOFTWARE_LIST(config, "cass_list").set_original("alice32");
SOFTWARE_LIST(config, "mc10_cass").set_compatible("mc10");
}
-void mc10_state::alice90(machine_config &config)
+void alice32_state::alice90(machine_config &config)
{
alice32(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &mc10_state::alice90_mem);
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &alice32_state::alice90_mem);
+
+ /* internal ram */
m_ram->set_default_size("32K");
/* Software lists */
@@ -754,20 +596,6 @@ void mc10_state::alice90(machine_config &config)
config.device_remove("mc10_cass");
}
-void mcx128_state::mcx128(machine_config &config)
-{
- mc10(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &mcx128_state::mcx128_mem);
-
- /* internal ram */
- m_ram->set_default_size("4K");
- RAM(config, m_mcx_ram).set_default_size("128K");
-
- /* Software lists */
- /* to do */
-}
-
-
/***************************************************************************
ROM DEFINITIONS
***************************************************************************/
@@ -798,31 +626,14 @@ ROM_START( alice90 )
ROM_LOAD( "charset.rom", 0x0000, 0x2000, BAD_DUMP CRC(b2f49eb3) SHA1(d0ef530be33bfc296314e7152302d95fdf9520fc) ) // from dcvg5k
ROM_END
-ROM_START( mcx128 )
- ROM_REGION(0x2000, "maincpu", 0)
- ROM_LOAD("mc10.rom", 0x0000, 0x2000, CRC(11fda97e) SHA1(4afff2b4c120334481aab7b02c3552bf76f1bc43))
- ROM_REGION(0x4000, "cart", 0)
- ROM_LOAD("mcx128bas.rom", 0x0000, 0x4000, CRC(11202e4b) SHA1(36c30d0f198a1bffee88ef29d92f2401447a91f4))
-ROM_END
-
-ROM_START( alice128 )
- ROM_REGION(0x2000, "maincpu", 0)
- ROM_LOAD("alice.rom", 0x0000, 0x2000, CRC(f876abe9) SHA1(c2166b91e6396a311f486832012aa43e0d2b19f8))
- ROM_REGION(0x4000, "cart", 0)
- ROM_LOAD("alice128bas.rom", 0x0000, 0x4000, CRC(a737544a) SHA1(c8fd92705fc42deb6a0ffac6274e27fd61ecd4cc))
-ROM_END
-
}
/***************************************************************************
GAME DRIVERS
***************************************************************************/
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1983, mc10, 0, 0, mc10, mc10, mc10_state, empty_init, "Tandy Radio Shack", "MC-10", MACHINE_SUPPORTS_SAVE )
-COMP( 1983, alice, mc10, 0, mc10, alice, mc10_state, empty_init, "Matra & Hachette", "Alice", MACHINE_SUPPORTS_SAVE )
-COMP( 1984, alice32, 0, 0, alice32, alice, mc10_state, empty_init, "Matra & Hachette", "Alice 32", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-COMP( 1985, alice90, alice32, 0, alice90, alice, mc10_state, empty_init, "Matra & Hachette", "Alice 90", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-COMP( 2011, mcx128, mc10, 0, mcx128, mc10, mcx128_state, empty_init, "Tandy Radio Shack", "MCX-128", MACHINE_SUPPORTS_SAVE | MACHINE_UNOFFICIAL )
-COMP( 2011, alice128,mc10, 0, mcx128, alice, mcx128_state, empty_init, "Matra & Hachette", "Alice with MCX-128", MACHINE_SUPPORTS_SAVE | MACHINE_UNOFFICIAL )
-
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
+COMP( 1983, mc10, 0, 0, mc10, mc10, mc10_state, empty_init, "Tandy Radio Shack", "MC-10", MACHINE_SUPPORTS_SAVE )
+COMP( 1983, alice, mc10, 0, alice, alice, mc10_state, empty_init, "Matra & Hachette", "Alice", MACHINE_SUPPORTS_SAVE )
+COMP( 1984, alice32, 0, 0, alice32, alice, alice32_state, empty_init, "Matra & Hachette", "Alice 32", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+COMP( 1985, alice90, alice32, 0, alice90, alice, alice32_state, empty_init, "Matra & Hachette", "Alice 90", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/mephisto_mm2.cpp b/src/mame/drivers/mephisto_mm2.cpp
index 4b0aace06f1..7ea5c7482c9 100644
--- a/src/mame/drivers/mephisto_mm2.cpp
+++ b/src/mame/drivers/mephisto_mm2.cpp
@@ -468,12 +468,12 @@ ROM_START( mm4tk )
ROM_END
-ROM_START( mm5 )
+ROM_START( mm5 ) // v5.1 (MEM->INFO to see version number)
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("mephisto5.rom", 0x8000, 0x8000, CRC(89c3d9d2) SHA1(77cd6f8eeb03c713249db140d2541e3264328048) )
ROM_END
-ROM_START( mm5a )
+ROM_START( mm5a ) // v5.0
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("mm50.rom", 0x8000, 0x8000, CRC(fcfa7e6e) SHA1(afeac3a8c957ba58cefaa27b11df974f6f2066da) )
ROM_END
@@ -510,6 +510,6 @@ CONS( 1987, mm4a, mm4, 0, mm4, mm2, mm2_state, empty_init, "He
CONS( 1987, mm4b, mm4, 0, mm4, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM IV (v6.00)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1987, mm4tk, mm4, 0, mm4tk, mm2, mm2_state, empty_init, "hack", "Mephisto MM IV (TurboKit)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING )
-CONS( 1990, mm5, 0, 0, mm5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1990, mm5a, mm5, 0, mm5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1990, mm5, 0, 0, mm5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (v5.1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1990, mm5a, mm5, 0, mm5, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (v5.0)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1989, mm5p, mm5, 0, mm5p, mm2, mm2_state, empty_init, "Hegener + Glaser", "Mephisto MM V (Portorose TM version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_TIMING ) // aka Rebel
diff --git a/src/mame/drivers/meritum.cpp b/src/mame/drivers/meritum.cpp
index 259b3415a93..9edd68b9cb4 100644
--- a/src/mame/drivers/meritum.cpp
+++ b/src/mame/drivers/meritum.cpp
@@ -56,6 +56,7 @@ For Model III:
#include "emu.h"
#include "includes/trs80.h"
+#include "bus/centronics/ctronics.h"
#include "machine/input_merger.h"
#include "machine/i8251.h"
#include "machine/i8255.h"
@@ -68,6 +69,8 @@ public:
meritum_state(const machine_config &mconfig, device_type type, const char *tag)
: trs80_state(mconfig, type, tag)
, m_screen(*this, "screen")
+ , m_centronics(*this, "centronics")
+ , m_nmigate(*this, "nmigate")
{ }
void meritum1(machine_config &config);
@@ -83,10 +86,32 @@ private:
void io_map(address_map &map);
void mem_map2(address_map &map);
void io_map2(address_map &map);
+ void mainppi_portb_w(u8);
+ void mainppi_portc_w(u8);
required_device<screen_device> m_screen;
+ optional_device<centronics_device> m_centronics;
+ required_device<input_merger_device> m_nmigate;
};
+void meritum_state::mainppi_portc_w(u8 data)
+{
+ m_nmigate->in_w<0>(!BIT(data, 7)); // negated PC7 => NMI
+ m_centronics->write_strobe(BIT(data, 1)); // PC1 = STROBE (centronics)
+}
+
+void meritum_state::mainppi_portb_w(u8 data)
+{
+ m_centronics->write_data0(BIT(data, 0));
+ m_centronics->write_data1(BIT(data, 1));
+ m_centronics->write_data2(BIT(data, 2));
+ m_centronics->write_data3(BIT(data, 3));
+ m_centronics->write_data4(BIT(data, 4));
+ m_centronics->write_data5(BIT(data, 5));
+ m_centronics->write_data6(BIT(data, 6));
+ m_centronics->write_data7(BIT(data, 7));
+}
+
void meritum_state::mem_map(address_map &map)
{
map(0x0000, 0x37ff).rom();
@@ -332,7 +357,17 @@ void meritum_state::meritum1(machine_config &config)
pit.out_handler<2>().set_inputline(m_maincpu, INPUT_LINE_NMI);
i8255_device &mainppi(I8255(config, "mainppi")); // parallel interface
- mainppi.out_pc_callback().set("nmigate", FUNC(input_merger_device::in_w<0>)).bit(7).invert();
+ mainppi.out_pc_callback().set(FUNC(meritum_state::mainppi_portc_w));
+ mainppi.out_pb_callback().set(FUNC(meritum_state::mainppi_portb_w));
+
+ // printer
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->set_data_input_buffer("cent_data_in");
+ m_centronics->ack_handler().set("mainppi", FUNC(i8255_device::pc2_w));
+
+ INPUT_BUFFER(config, "cent_data_in");
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
PIT8253(config, "audiopit", 0); // optional audio interface
diff --git a/src/mame/drivers/mermaid.cpp b/src/mame/drivers/mermaid.cpp
index b8fff594330..c792a4fea14 100644
--- a/src/mame/drivers/mermaid.cpp
+++ b/src/mame/drivers/mermaid.cpp
@@ -89,13 +89,13 @@ Stephh's notes (based on the games Z80 code and some tests) :
1) 'mermaid'
- - Player 2 uses 2nd set of inputs ONLY when "Cabinet" Dip Switch is set to "Cokctail".
+ - Player 2 uses 2nd set of inputs ONLY when "Cabinet" Dip Switch is set to "Cocktail".
- Continue Play is determined via DSW bit 3. When it's ON, insert a coin when
the message is displayed on the screen. Beware that there is no visible timer !
2) 'yachtmn'
- - Player 2 uses 2nd set of inputs ONLY when "Cabinet" Dip Switch is set to "Cokctail".
+ - Player 2 uses 2nd set of inputs ONLY when "Cabinet" Dip Switch is set to "Cocktail".
- Continue Play is always possible provided that you insert a coin when the
message (much shorter than in 'mermaid') is displayed on the screen (there is
also no timer). Then when you press START, you need to press START again when
@@ -162,7 +162,7 @@ void mermaid_state::mermaid_map(address_map &map)
{
map(0x0000, 0x9fff).rom();
map(0xc000, 0xc7ff).ram();
- map(0xc800, 0xcbff).ram().w(FUNC(mermaid_state::mermaid_videoram2_w)).share("videoram2");
+ map(0xc800, 0xcbff).ram().w(FUNC(mermaid_state::mermaid_videoram2_w)).share("videoram2").mirror(0x400);
map(0xd000, 0xd3ff).ram().w(FUNC(mermaid_state::mermaid_videoram_w)).share("videoram");
map(0xd800, 0xd81f).ram().w(FUNC(mermaid_state::mermaid_bg_scroll_w)).share("bg_scrollram");
map(0xd840, 0xd85f).ram().w(FUNC(mermaid_state::mermaid_fg_scroll_w)).share("fg_scrollram");
@@ -174,7 +174,7 @@ void mermaid_state::mermaid_map(address_map &map)
map(0xe800, 0xe807).w("latch2", FUNC(ls259_device::write_d0));
map(0xf000, 0xf000).portr("P2");
map(0xf800, 0xf800).r(FUNC(mermaid_state::mermaid_collision_r));
- map(0xf802, 0xf802).nopw(); // ???
+ // map(0xf802, 0xf802).nopw(); // ???
map(0xf806, 0xf806).w(FUNC(mermaid_state::mermaid_ay8910_write_port_w));
map(0xf807, 0xf807).w(FUNC(mermaid_state::mermaid_ay8910_control_port_w));
}
@@ -365,6 +365,7 @@ void mermaid_state::machine_start()
save_item(NAME(m_coll_bit2));
save_item(NAME(m_coll_bit3));
save_item(NAME(m_coll_bit6));
+ save_item(NAME(m_bg_bank));
save_item(NAME(m_rougien_gfxbank1));
save_item(NAME(m_rougien_gfxbank2));
save_item(NAME(m_ay8910_enable));
@@ -382,6 +383,8 @@ void mermaid_state::machine_reset()
m_coll_bit2 = 0;
m_coll_bit3 = 0;
m_coll_bit6 = 0;
+ m_bg_mask = 0;
+ m_bg_bank = 0;
m_rougien_gfxbank1 = 0;
m_rougien_gfxbank2 = 0;
@@ -428,16 +431,22 @@ void mermaid_state::mermaid(machine_config &config)
LS259(config, m_latch[0]);
m_latch[0]->q_out_cb<0>().set(FUNC(mermaid_state::ay1_enable_w));
m_latch[0]->q_out_cb<1>().set(FUNC(mermaid_state::ay2_enable_w));
- m_latch[0]->q_out_cb<4>().set_nop(); // ???
+ m_latch[0]->q_out_cb<2>().set([this](int state){ logerror("02 = %d\n", state); }); // ???
+ m_latch[0]->q_out_cb<3>().set([this](int state){ logerror("03 = %d\n", state); }); // ???
+ m_latch[0]->q_out_cb<4>().set([this](int state){ logerror("04 = %d\n", state); }); // ???
m_latch[0]->q_out_cb<5>().set(FUNC(mermaid_state::flip_screen_x_w));
m_latch[0]->q_out_cb<6>().set(FUNC(mermaid_state::flip_screen_y_w));
m_latch[0]->q_out_cb<7>().set(FUNC(mermaid_state::nmi_mask_w));
LS259(config, m_latch[1]);
- m_latch[1]->q_out_cb<0>().set_nop(); // ???
+ m_latch[1]->q_out_cb<0>().set(FUNC(mermaid_state::bg_mask_w));
+ m_latch[1]->q_out_cb<1>().set(FUNC(mermaid_state::bg_bank_w));
+ m_latch[1]->q_out_cb<2>().set([this](int state){ logerror("12 = %d\n", state); }); // ???
+ m_latch[1]->q_out_cb<3>().set([this](int state){ logerror("13 = %d\n", state); }); // ???
m_latch[1]->q_out_cb<4>().set(FUNC(mermaid_state::rougien_gfxbankswitch1_w));
m_latch[1]->q_out_cb<5>().set(FUNC(mermaid_state::rougien_gfxbankswitch2_w));
- m_latch[1]->q_out_cb<7>().set_nop(); // very frequent
+ m_latch[1]->q_out_cb<6>().set([this](int state){ logerror("16 = %d\n", state); }); // ???
+ m_latch[1]->q_out_cb<7>().set_nop(); // probable watchdog
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@@ -462,9 +471,12 @@ void mermaid_state::mermaid(machine_config &config)
void mermaid_state::rougien(machine_config &config)
{
mermaid(config);
+ m_bg_split = 1;
m_latch[0]->q_out_cb<2>().set(FUNC(mermaid_state::rougien_sample_playback_w));
+ m_latch[1]->q_out_cb<0>().set([this](int state){ logerror("10 = %d\n", state); }); // ???
+ m_latch[1]->q_out_cb<1>().set([this](int state){ logerror("11 = %d\n", state); }); // ???
m_latch[1]->q_out_cb<2>().set(FUNC(mermaid_state::rougien_sample_rom_hi_w));
m_latch[1]->q_out_cb<3>().set(FUNC(mermaid_state::rougien_sample_rom_lo_w));
diff --git a/src/mame/drivers/mitchell.cpp b/src/mame/drivers/mitchell.cpp
index 2ada187c87c..4a960d3dd2b 100644
--- a/src/mame/drivers/mitchell.cpp
+++ b/src/mame/drivers/mitchell.cpp
@@ -376,7 +376,7 @@ void mitchell_state::spangbl_io_map(address_map &map)
map(0x00, 0x02).r(FUNC(mitchell_state::input_r));
map(0x00, 0x00).w(FUNC(mitchell_state::pangbl_gfxctrl_w)); /* Palette bank, layer enable, coin counters, more */
map(0x02, 0x02).w(FUNC(mitchell_state::pang_bankswitch_w)); /* Code bank register */
- map(0x03, 0x03).w(m_soundlatch, FUNC(generic_latch_8_device::write));
+ map(0x03, 0x03).portr("DSW1").w(m_soundlatch, FUNC(generic_latch_8_device::write));
map(0x05, 0x05).portr("SYS0");
map(0x06, 0x06).nopw(); /* watchdog? irq ack? */
map(0x07, 0x07).w(FUNC(mitchell_state::pang_video_bank_w)); /* Video RAM bank register */
@@ -871,14 +871,69 @@ static INPUT_PORTS_START( pang )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2)
INPUT_PORTS_END
+static INPUT_PORTS_START( pangdsw )
+ PORT_INCLUDE( pang )
+
+// the settings are shown if entering test mode. The game always respects the dip setting, changing the values in test mode has no effect
+// it appears the bootleggers didn't care to add dips for flipscreen, free play and extend values (or at least they haven't been found yet)
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x07, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW1:6,7,8")
+ PORT_DIPSETTING( 0x07, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) )
+ PORT_DIPNAME( 0x18, 0x18, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW1:4,5")
+ PORT_DIPSETTING( 0x00, "1" )
+ PORT_DIPSETTING( 0x18, "2" )
+ PORT_DIPSETTING( 0x08, "3" )
+ PORT_DIPSETTING( 0x10, "4" )
+ PORT_DIPNAME( 0x60, 0x20, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("DSW1:2,3")
+ PORT_DIPSETTING( 0x00, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Difficult ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( Very_Difficult ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
static INPUT_PORTS_START( spangbl )
PORT_INCLUDE( pang )
PORT_MODIFY("SYS0")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) // this bootleg doesn't seem to allow entering test mode. It has a dip bank for settings, instead.
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */
PORT_MODIFY("IN1")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // must be high for game to boot..
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x07, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW1:6,7,8")
+ PORT_DIPSETTING( 0x07, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x18, 0x08, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW1:4,5")
+ PORT_DIPSETTING( 0x00, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x10, "3" )
+ PORT_DIPSETTING( 0x18, "4" )
+ PORT_DIPNAME( 0x60, 0x20, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("DSW1:2,3")
+ PORT_DIPSETTING( 0x00, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Difficult ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( Very_Difficult ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW1:1")
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
INPUT_PORTS_END
static INPUT_PORTS_START( mstworld )
@@ -2265,33 +2320,6 @@ ROM_START( spangbl )
ROM_LOAD( "ic125.14", 0x030000, 0x10000, CRC(bd5c2f4b) SHA1(3c71d63637633a98ab513e4336e2954af3f964f4) )
ROM_END
-// "spangbl2"
-// TODO: There is a bank of 8 dipswitches that needs to be hooked up with this set up:
-// ______________________________________________________
-// | | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
-// |--------------------|---|---|---|---|---|---|---|---|
-// | 1 Coin - 1 Credit | ON| ON| ON| | | | | |
-// | 1 Coin - 2 Credits |OFF| ON| ON| | | | | |
-// | 1 Coin - 3 Credits | ON|OFF| ON| | | | | |
-// | 1 Coin - 4 Credits |OFF|OFF| ON| | | | | |
-// | 1 Coin - 6 Credits | ON| ON|OFF| | | | | |
-// | 2 Coin - 1 Credit |OFF| ON|OFF| | | | | |
-// | 3 Coin - 1 Credit | ON|OFF|OFF| | | | | |
-// | 4 Coin - 1 Credit |OFF|OFF|OFF| | | | | |
-// |--------------------|---|---|---|---|---|---|---|---|
-// | 1 Player | | | | ON| ON| | | |
-// | 2 Players | | | |OFF| ON| | | |
-// | 3 Players | | | | ON|OFF| | | |
-// | 4 Players | | | |OFF|OFF| | | |
-// |--------------------|---|---|---|---|---|---|---|---|
-// | Easy | | | | | | ON| ON| |
-// | Normal | | | | | |OFF| ON| |
-// | Dificult | | | | | | ON|OFF| |
-// | Very dificult | | | | | |OFF|OFF| |
-// |--------------------|---|---|---|---|---|---|---|---|
-// | No demo sounds | | | | | | | | ON|
-// | Demo sounds | | | | | | | |OFF|
-// |____________________________________________________|
ROM_START( spangbl2 )
ROM_REGION( 0x50000*2, "maincpu", ROMREGION_ERASEFF )
// IC2 can be found as 27C512 with 1st and 2nd half identical or as 27C256
@@ -2763,11 +2791,11 @@ GAME( 1989, bbros, pang, pang, pang, mitchell_state, init_
GAME( 1989, pompingw, pang, pang, pang, mitchell_state, init_pang, ROT0, "Mitchell", "Pomping World (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, pangb, pang, pang, pang, mitchell_state, init_pangb, ROT0, "bootleg", "Pang (bootleg, set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, pangbold, pang, pang, pang, mitchell_state, init_pangb, ROT0, "bootleg", "Pang (bootleg, set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1989, pangba, pang, pangba, pang, mitchell_state, init_pangb, ROT0, "bootleg", "Pang (bootleg, set 3)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1989, pangba, pang, pangba, pangdsw, mitchell_state, init_pangb, ROT0, "bootleg", "Pang (bootleg, set 3)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1989, pangb2, pang, pang, pang, mitchell_state, init_pangb, ROT0, "bootleg", "Pang (bootleg, set 4)", MACHINE_SUPPORTS_SAVE )
-GAME( 1989, pangbb, pang, spangbl, pang, mitchell_state, init_pangb, ROT0, "bootleg", "Pang (bootleg, set 5)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1989, pangbb, pang, spangbl, pangdsw, mitchell_state, init_pangb, ROT0, "bootleg", "Pang (bootleg, set 5)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1989, pangbp, pang, pang, pang, mitchell_state, init_pangb, ROT0, "bootleg", "Pang (bootleg, set 6)", MACHINE_NOT_WORKING ) // Missing the contents of a battery backed RAM
-GAME( 1989, pangbc, pang, spangbl, pang, mitchell_state, init_pangb, ROT0, "bootleg", "Pang (bootleg, set 7)", MACHINE_SUPPORTS_SAVE )
+GAME( 1989, pangbc, pang, spangbl, pangdsw, mitchell_state, init_pangb, ROT0, "bootleg", "Pang (bootleg, set 7)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, cworld, 0, pang, qtono1, mitchell_state, init_cworld, ROT0, "Capcom", "Capcom World (Japan)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/mpc60.cpp b/src/mame/drivers/mpc60.cpp
index 194ffd81abb..a68c645e6a8 100644
--- a/src/mame/drivers/mpc60.cpp
+++ b/src/mame/drivers/mpc60.cpp
@@ -152,15 +152,21 @@ void mpc60_state::mpc60(machine_config &config)
}
ROM_START(mpc60)
- ROM_REGION16_LE(0x40000, "program", 0) // V2.12 CPU ROMs (MBM27C512-20)
- ROM_LOAD16_BYTE("mp6cpu2.ic2", 0x00000, 0x10000, CRC(e71b1acb) SHA1(b56ddfff1c546fc21341b1a614e18da9726312f4))
- ROM_LOAD16_BYTE("mp6cpu3.ic3", 0x00001, 0x10000, CRC(f068838b) SHA1(42e815880d1c1a5b7d1c7933aad9c28410fc2627))
- ROM_LOAD16_BYTE("mp6cpu1.ic4", 0x20000, 0x10000, CRC(1271bc73) SHA1(99fd6fa4c04e5bdf868e78072fec5b55c01350da))
- ROM_LOAD16_BYTE("mpc6cpu4.ic5", 0x20001, 0x10000, CRC(d922a66d) SHA1(0f4bc0522b9826d617f4af72382d75853515d7f5))
+ ROM_REGION16_LE(0x40000, "program", 0)
+ ROM_SYSTEM_BIOS(0, "v212", "v2.12") // V2.12 CPU ROMs (MBM27C512-20)
+ ROMX_LOAD("mp6cpu2.ic2", 0x00000, 0x10000, CRC(e71b1acb) SHA1(b56ddfff1c546fc21341b1a614e18da9726312f4), ROM_BIOS(0) | ROM_SKIP(1))
+ ROMX_LOAD("mp6cpu3.ic3", 0x00001, 0x10000, CRC(f068838b) SHA1(42e815880d1c1a5b7d1c7933aad9c28410fc2627), ROM_BIOS(0) | ROM_SKIP(1))
+ ROMX_LOAD("mp6cpu1.ic4", 0x20000, 0x10000, CRC(1271bc73) SHA1(99fd6fa4c04e5bdf868e78072fec5b55c01350da), ROM_BIOS(0) | ROM_SKIP(1))
+ ROMX_LOAD("mpc6cpu4.ic5", 0x20001, 0x10000, CRC(d922a66d) SHA1(0f4bc0522b9826d617f4af72382d75853515d7f5), ROM_BIOS(0) | ROM_SKIP(1))
+ ROM_SYSTEM_BIOS(1, "v112", "v1.12")
+ ROMX_LOAD("mpc60_v1-12_2.ic2", 0x00000, 0x10000, CRC(ddf26146) SHA1(987547198dc3984ab3dfa7f133ba7dca702cc269), ROM_BIOS(1) | ROM_SKIP(1))
+ ROMX_LOAD("mpc60_v1-12_4.ic3", 0x00001, 0x10000, CRC(9725d193) SHA1(6efda3d6760b3951c5036108106d446f6e128c59), ROM_BIOS(1) | ROM_SKIP(1))
+ ROMX_LOAD("mpc60_v1-12_1.ic4", 0x20000, 0x10000, CRC(f202dbb1) SHA1(6fd82224a99b52b6c414b88d5c920abda32ffa32), ROM_BIOS(1) | ROM_SKIP(1))
+ ROMX_LOAD("mpc60_v1-12_3.ic5", 0x20001, 0x10000, CRC(ba5a1640) SHA1(1f9f49c49a3682b9a44d614ac411a7c043df399e), ROM_BIOS(1) | ROM_SKIP(1))
ROM_REGION16_LE(0x10000, "waves", 0)
- ROM_LOAD16_BYTE("ic17", 0x00000, 0x08000, NO_DUMP) // lowest nibble is unused
- ROM_LOAD16_BYTE("ic18", 0x00001, 0x08000, NO_DUMP)
+ ROM_LOAD16_BYTE("mpc60_voice_1_v1-0.ic17", 0x00000, 0x08000, CRC(b8fdfe3e) SHA1(c2f0e1d8813d4178d2f883a3f3e461e036b56229)) // lowest nibble is unused
+ ROM_LOAD16_BYTE("mpc60_voice_2_v1-0.ic18", 0x00001, 0x08000, CRC(42f8e0a6) SHA1(a22dbefb9dafbb0c4095fd0bf4e63e67b5ec3b95))
ROM_REGION(0x1000, "panelcpu", 0)
ROM_LOAD("upd78c11g-044-36.ic1", 0x0000, 0x1000, NO_DUMP)
diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp
index e1472c894e8..283bfb94781 100644
--- a/src/mame/drivers/namcos2.cpp
+++ b/src/mame/drivers/namcos2.cpp
@@ -24,6 +24,9 @@ known issues:
- sprite/tilemap orthogonality needed
- bad road colors in Final Lap and Suzuka series
+ Final Lap & Final Lap 2:
+ - by default, the graphics are way too bright if compared to original PCB/monitor output
+
Finest Hour:
- roz plane colors are bad in-game
@@ -3311,8 +3314,8 @@ ROM_START( finalap3bl ) // bootleg set
ROM_REGION( 8*1024, "user2", 0 ) /* zoom */
ROM_LOAD( "04544191.6r", 0, 8*1024, CRC(90db1bf6) SHA1(dbb9e50a8efc3b4012fcf587cc87da9ef42a1b80) )
- ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration */
- ROM_LOAD( "finalap3.nv", 0x000000, 0x2000, CRC(efbc6274) SHA1(f542012e467027b7bd5d7102096ff91d8c9adee3) )
+ ROM_REGION( 0x2000, "nvram", 0 ) /* default settings, including calibration and machine ID code that passes protection */
+ ROM_LOAD( "finalap3bl.nv", 0x000000, 0x2000, CRC(60226586) SHA1(d66afd1149c3c95cbb0108337c530cab78327d97) )
ROM_END
/* FINEST HOUR */
@@ -5522,6 +5525,20 @@ void namcos2_state::init_finalap3()
m_finallap_prot_count = 0;
}
+uint16_t namcos2_state::finalap3bl_prot_r()
+{
+ // code at 0x3f22 expects this to be 0x4d00 or it sets a value in NVRAM which prevents booting
+ // address 0x180020 (0x10 in NVRAM) must also be 0x6b (machine ID code first byte) or the same will occur
+ // for the 2nd issue we use a default NVRAM with this set
+ return 0x4d00;
+}
+
+void namcos2_state::init_finalap3bl()
+{
+ init_finalap3();
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x3ffff0, 0x3ffff1, read16smo_delegate(*this, FUNC(namcos2_state::finalap3bl_prot_r)));
+}
+
void namcos2_state::init_finehour()
{
m_gametype = NAMCOS2_FINEST_HOUR;
@@ -5761,7 +5778,7 @@ GAMEL( 1992, finalap3, 0, finalap3, finalap3, namcos2_state, init_final
GAMEL( 1992, finalap3a, finalap3, finalap3, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (World, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE, layout_finallap )
GAMEL( 1992, finalap3j, finalap3, finalap3, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE, layout_finallap )
GAMEL( 1992, finalap3jc, finalap3, finalap3, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (Japan, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE, layout_finallap )
-GAMEL( 1992, finalap3bl, finalap3, finalap3, finalap3, namcos2_state, init_finalap3, ROT0, "Namco", "Final Lap 3 (bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE, layout_finallap )
+GAMEL( 1992, finalap3bl, finalap3, finalap3, finalap3, namcos2_state, init_finalap3bl,ROT0, "Namco", "Final Lap 3 (bootleg)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE, layout_finallap )
GAME( 1992, luckywld, 0, luckywld, luckywld, namcos2_state, init_luckywld, ROT0, "Namco", "Lucky & Wild", MACHINE_SUPPORTS_SAVE )
GAME( 1992, luckywldj, luckywld, luckywld, luckywld, namcos2_state, init_luckywld, ROT0, "Namco", "Lucky & Wild (Japan)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/namcos22.cpp b/src/mame/drivers/namcos22.cpp
index ec1aa640991..488759ff0f0 100644
--- a/src/mame/drivers/namcos22.cpp
+++ b/src/mame/drivers/namcos22.cpp
@@ -5552,6 +5552,71 @@ ROM_END
ROM_START( adillor )
ROM_REGION( 0x400000, "maincpu", 0 ) /* main program */
+ ROM_LOAD32_BYTE( "am2vera.rom1", 0x000003, 0x100000, CRC(b974e931) SHA1(db1c99ed56044f667a9a0a5801f62215004af847) )
+ ROM_LOAD32_BYTE( "am2vera.rom2", 0x000002, 0x100000, CRC(c7cd78f1) SHA1(2f909be1c9a9acf42a8e446c83a06b3b36012196) )
+ ROM_LOAD32_BYTE( "am2vera.rom3", 0x000001, 0x100000, CRC(80e9435a) SHA1(d92f6ec607e628270ceb3e09c1980d6e13bd88a7) )
+ ROM_LOAD32_BYTE( "am2vera.rom4", 0x000000, 0x100000, CRC(1e3a6032) SHA1(f4c6539a78f94ae2c240aeb8f85712a612933e8c) )
+
+ ROM_REGION( 0x10000*2, "master", 0 ) /* Master DSP */
+ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) )
+
+ ROM_REGION( 0x10000*2, "slave", 0 ) /* Slave DSP */
+ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) )
+
+ ROM_REGION16_LE( 0x080000, "mcu", 0 ) /* S22-BIOS ver1.41 */
+ ROM_LOAD( "am1data.8k", 0x000000, 0x080000, CRC(3c176589) SHA1(fabf8debfa118893449f6086986fd1aa012daf27) )
+
+ ROM_REGION( 0x200000*8, "sprite", ROMREGION_ERASEFF ) /* 32x32x8bpp sprite tiles */
+ ROM_LOAD( "am1scg0.12f", 0x000000, 0x200000, CRC(e576f993) SHA1(704645c2b2af4d3f6b77f2299cd7277837e204d2) )
+ ROM_LOAD( "am1scg1.10f", 0x200000, 0x200000, CRC(d6d26cc1) SHA1(1da35ec2f89cfc5778d81b6a892fcf100d6e9933) )
+ ROM_LOAD( "am1scg0.12l", 0x000000, 0x200000, CRC(e576f993) SHA1(704645c2b2af4d3f6b77f2299cd7277837e204d2) )
+ ROM_LOAD( "am1scg1.10l", 0x200000, 0x200000, CRC(d6d26cc1) SHA1(1da35ec2f89cfc5778d81b6a892fcf100d6e9933) )
+
+ ROM_REGION( 0x200000*8, "textile", 0) /* 16x16x8bpp texture tiles */
+ ROM_LOAD( "am1cg0.8d", 0x000000, 0x200000, CRC(b91e4259) SHA1(3de7fee2be9843ef6a8718f9dcbc3aeb1fb23b64) )
+ ROM_LOAD( "am1cg1.10d", 0x200000, 0x200000, CRC(c1b82a26) SHA1(25dc3cdf5fe18de89e6d7304ff76b6157aba2cd6) )
+ ROM_LOAD( "am1cg2.12d", 0x400000, 0x200000, CRC(36a7d3fd) SHA1(f07bb746f775d1eb70c4b6a65e6002d2136cfe4d) )
+ ROM_LOAD( "am1cg3.13d", 0x600000, 0x200000, CRC(8b0857ef) SHA1(1c86db318d7bb7bc303ba65a9db493b033035d7b) )
+ ROM_LOAD( "am1cg3.14d", 0x800000, 0x200000, CRC(ebc516fe) SHA1(585554f14cfdf69a89a6431867b7cfc1a9eae379) )
+ ROM_LOAD( "am1cg5.16d", 0xa00000, 0x200000, CRC(30fad30d) SHA1(bb0d9e2b479d83cc38ffd76d0d55f06dca0f304a) )
+ ROM_LOAD( "am1cg6.18d", 0xc00000, 0x200000, CRC(62eea883) SHA1(37e441bb1289e45ef3043f70f77646c15b6dff0e) )
+ ROM_LOAD( "am1cg7.19d", 0xe00000, 0x200000, CRC(2d257f47) SHA1(6406556b4b142b6c596eb25f407275a63f6a44f1) )
+ ROM_LOAD( "am1cg0.12b", 0x000000, 0x200000, CRC(b91e4259) SHA1(3de7fee2be9843ef6a8718f9dcbc3aeb1fb23b64) )
+ ROM_LOAD( "am1cg1.13b", 0x200000, 0x200000, CRC(c1b82a26) SHA1(25dc3cdf5fe18de89e6d7304ff76b6157aba2cd6) )
+ ROM_LOAD( "am1cg2.14b", 0x400000, 0x200000, CRC(36a7d3fd) SHA1(f07bb746f775d1eb70c4b6a65e6002d2136cfe4d) )
+ ROM_LOAD( "am1cg3.16b", 0x600000, 0x200000, CRC(8b0857ef) SHA1(1c86db318d7bb7bc303ba65a9db493b033035d7b) )
+ ROM_LOAD( "am1cg3.18b", 0x800000, 0x200000, CRC(ebc516fe) SHA1(585554f14cfdf69a89a6431867b7cfc1a9eae379) )
+ ROM_LOAD( "am1cg5.19b", 0xa00000, 0x200000, CRC(30fad30d) SHA1(bb0d9e2b479d83cc38ffd76d0d55f06dca0f304a) )
+ ROM_LOAD( "am1cg6.18a", 0xc00000, 0x200000, CRC(62eea883) SHA1(37e441bb1289e45ef3043f70f77646c15b6dff0e) )
+ ROM_LOAD( "am1cg7.15a", 0xe00000, 0x200000, CRC(2d257f47) SHA1(6406556b4b142b6c596eb25f407275a63f6a44f1) )
+
+ ROM_REGION16_LE( 0x300000, "textilemap", 0 ) /* texture tilemap */
+ ROM_LOAD( "am1ccrl.3d", 0x000000, 0x200000, CRC(76c6d5f3) SHA1(637efe30d004a9c42864b7536e02e9805ed9b6ef) )
+ ROM_LOAD( "am1ccrh.1d", 0x200000, 0x080000, CRC(180c4a33) SHA1(5e0818ba8a135c51953bc3bc5c4a1475f7f93eff) )
+ ROM_LOAD( "am1ccrl.7b", 0x000000, 0x200000, CRC(76c6d5f3) SHA1(637efe30d004a9c42864b7536e02e9805ed9b6ef) )
+ ROM_LOAD( "am1ccrh.5b", 0x200000, 0x080000, CRC(180c4a33) SHA1(5e0818ba8a135c51953bc3bc5c4a1475f7f93eff) )
+
+ ROM_REGION( 0x600000, "pointrom", 0 ) /* 3d model data */
+ ROM_LOAD( "am1ptrl0.18k", 0x000000, 0x080000, CRC(6fdb34f6) SHA1(5dc7359eef0dbe6d421808eefd3920159ce34944) )
+ ROM_LOAD( "am1ptrl1.16k", 0x080000, 0x080000, CRC(32e40601) SHA1(161b148aae688e944cfe456d9bca1ca7139812e1) )
+ ROM_LOAD( "am1ptrl2.15k", 0x100000, 0x080000, CRC(e27e29cc) SHA1(3a2b0d18d23b2ace6fe1c6c4dbcc73cb74acd189) )
+ ROM_LOAD( "am1ptrl3.14k", 0x180000, 0x080000, CRC(0c638e3e) SHA1(2cd68e6aa04a9235f792fad0913314545ab70e71) )
+ ROM_LOAD( "am1ptrm0.18j", 0x200000, 0x080000, CRC(e676cd98) SHA1(f7b31c848bc2afc31f3ad53d9eda7daae5f28865) )
+ ROM_LOAD( "am1ptrm1.16j", 0x280000, 0x080000, CRC(eb115d9d) SHA1(165cb13a3d0f2982c35ae5e6e796de48cf2b5846) )
+ ROM_LOAD( "am1ptrm2.15j", 0x300000, 0x080000, CRC(86b4ed0c) SHA1(d97f2b26cc3981b4b337029723c5ddec9316628f) )
+ ROM_LOAD( "am1ptrm3.14j", 0x380000, 0x080000, CRC(97c1c6b0) SHA1(84e5f982f50560debd6f1f4d3d96f58888616529) )
+ ROM_LOAD( "am1ptru0.18f", 0x400000, 0x080000, CRC(6a3fd855) SHA1(c6d2029e676426c4e71d9cfddbac7ecdec81c4da) )
+ ROM_LOAD( "am1ptru1.16f", 0x480000, 0x080000, CRC(551bf714) SHA1(4af1e65ad1e42a95accafb57422fc276743f408a) )
+ ROM_LOAD( "am1ptru2.15f", 0x500000, 0x080000, CRC(ce790635) SHA1(fb49646a9b35ee7cb3ace59a7f0932a08c393052) )
+ ROM_LOAD( "am1ptru3.14f", 0x580000, 0x080000, CRC(5e4e6333) SHA1(5897251e4694c5c24f1810ff6f9177a0456baf2e) )
+
+ ROM_REGION( 0x1000000, "c352", 0 ) /* sound samples */
+ ROM_LOAD16_WORD_SWAP( "am1wavea.2l", 0x000000, 0x400000, CRC(48f8c20c) SHA1(48b4fbcb7e9dbbb70a542ef7cb7ee0e46fad23fc) )
+ ROM_LOAD16_WORD_SWAP( "am1waveb.1l", 0x800000, 0x400000, CRC(fd8e7384) SHA1(91e53ab0293f81f8357645fd319249abc128b78e) )
+ROM_END
+
+ROM_START( adillorj )
+ ROM_REGION( 0x400000, "maincpu", 0 ) /* main program */
ROM_LOAD32_BYTE( "am1vera.rom1", 0x000003, 0x100000, CRC(e99157f9) SHA1(7a200f3b5890f5badbf529a8c8ac6a8548adb801) )
ROM_LOAD32_BYTE( "am1vera.rom2", 0x000002, 0x100000, CRC(b63d79b0) SHA1(c83251727b2973f5b9dc2eea23b51b1275bd88ed) )
ROM_LOAD32_BYTE( "am1vera.rom3", 0x000001, 0x100000, CRC(af0983bc) SHA1(136d2e14485864e20d7a6947d640577b8a85243c) )
@@ -5871,4 +5936,5 @@ GAME( 1996, tokyowar, 0, tokyowar, tokyowar, namcos22s_state, init_tok
GAME( 1996, aquajet, 0, cybrcycc, aquajet, namcos22s_state, init_aquajet, ROT0, "Namco", "Aqua Jet (Rev. AJ2 Ver.B, World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // 96/09/20 14:28:30
GAME( 1996, alpinr2b, 0, alpine, alpiner, namcos22s_state, init_alpiner2, ROT0, "Namco", "Alpine Racer 2 (Rev. ARS2 Ver.B, World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) // 97/01/10 17:10:59
GAME( 1996, alpinr2a, alpinr2b, alpine, alpiner, namcos22s_state, init_alpiner2, ROT0, "Namco", "Alpine Racer 2 (Rev. ARS2 Ver.A, World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) // 96/12/06 13:45:05
-GAME( 1997, adillor, 0, adillor, adillor, namcos22s_state, init_adillor, ROT0, "Namco", "Armadillo Racing (Rev. AM1 Ver.A, Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) // 97/04/07 19:19:41
+GAME( 1997, adillor, 0, adillor, adillor, namcos22s_state, init_adillor, ROT0, "Namco", "Armadillo Racing (Rev. AM2 Ver.A, World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) // 97/04/07 19:43:29
+GAME( 1997, adillorj, adillor, adillor, adillor, namcos22s_state, init_adillor, ROT0, "Namco", "Armadillo Racing (Rev. AM1 Ver.A, Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) // 97/04/07 19:19:41
diff --git a/src/mame/drivers/naomi.cpp b/src/mame/drivers/naomi.cpp
index 56031ccb4b5..3ac26f07aa6 100644
--- a/src/mame/drivers/naomi.cpp
+++ b/src/mame/drivers/naomi.cpp
@@ -3114,6 +3114,16 @@ void naomi_state::naomim4(machine_config &config)
}
/*
+ * Naomi M1 with 837-14438 "SH I/O BD" hopper board
+ */
+
+void naomi_state::naomim1_hop(machine_config &config)
+{
+ naomim1(config);
+ SEGA837_14438(config, "hopperbd", 0);
+}
+
+/*
* Naomi M2 with Keyboard controllers
*/
@@ -7754,26 +7764,6 @@ ROM_START( kick4csh )
ROM_REGION(0x200, "some_eeprom", 0)
ROM_LOAD( "25lc040.ic13s", 0, 0x200, CRC(1576366a) SHA1(3e8bf3dbc8a248a6863242b78d5c6e53a869e951) )
- // 837-14438 SH I/O BD
- // IC1 - Hitachi/Renesas SH4 SoC
- // IC2 - Xilinx Spartan XC2S50 PQ208AMS0341 FPGA
- // IC3 - Xilinx 17S50APC Spartan-II Family OTP Configuration PROM, stamped 6372A
- // IC4,5 - Toshiba TC59S6432CFT-10 512K x4 banks x32bit SDRAM
- // IC6 - Macronix MX29LV160ATTC-90 16Mbit Flash ROM
- // IC7 - ST M68AF127BL55MC6 1Mbit (128K x8) SRAM
- // IC9 - NS USBN9604-28M USB Node Controller
- // OSC1 - 33.3333 MHz
- // OSC2 - 32.0000 MHz
- // OCS3 - 24.0000 MHz
- // SW1,2 - pushbuttons
- // DIPSW1 - 4x DIP switch
- // LED1-5 - LEDs
- // LED6,7 - 7seg LEDs
- // BT1 - Panasonic CR2032 battery
- ROM_REGION(0x220000, "hopper_board", 0)
- ROM_LOAD( "fpr-24150.ic6", 0x0000000, 0x200000, CRC(3845c34c) SHA1(027b17bac64482ee152773d5fab30fcbc6e2bcb7) ) // SH4 code
- ROM_LOAD( "6372a.ic3", 0x0200000, 0x020000, CRC(f30839ad) SHA1(ea1a32c4da1ed9745300bcdd7964a7c0964e3221) ) // FPGA config
-
// 840-0140 2004 317-0397-COM Naomi
ROM_PARAMETER( ":rom_board:key", "820857c9" )
ROM_END
@@ -11743,9 +11733,9 @@ ROM_END
/* 0128 */ GAME( 2003, shootpl, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan, Rev A)", GAME_FLAGS )
/* 0130 */ GAME( 2002, hopper, naomi, naomi, naomi, naomi_state, init_naomi, ROT0, "Sega", "SWP Hopper Board", GAME_FLAGS )
// 0132 Mushiking 2K3 2ND (Japan)
-/* 0136 */ GAME( 2004, shootplm, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan) Version B", GAME_FLAGS ) // Build: 23 Jan 2004
+/* 0136 */ GAME( 2004, shootplm, naomi, naomim1_hop, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan) Version B", GAME_FLAGS ) // Build: 23 Jan 2004
/* 0136 */ GAME( 2004, shootplmp, shootplm, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan) Version B (prototype)", GAME_FLAGS ) // Build: 15 Dec 2003
-/* 0140 */ GAME( 2004, kick4csh, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Kick '4' Cash (Export)", GAME_FLAGS )
+/* 0140 */ GAME( 2004, kick4csh, naomi, naomim1_hop, naomi, naomi_state, init_naomi, ROT0, "Sega", "Kick '4' Cash (Export)", GAME_FLAGS )
/* 0150 */ GAME( 2004, mushike, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Mushiking The King Of Beetle (2K3 2ND Ver. 1.003-, World)", GAME_FLAGS ) // not for Japan
/* 0150 */ GAME( 2004, mushikeo, mushike, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Mushiking The King Of Beetle (2K3 2ND Ver. 1.002-, World)", GAME_FLAGS ) // not for Japan
/* 0150-FLS*/ GAME( 2004, mushikep, mushike, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Mushiking The King Of Beetle (MUSHIUSA '04 1ST, Prototype)", GAME_FLAGS )
diff --git a/src/mame/drivers/nwk-tr.cpp b/src/mame/drivers/nwk-tr.cpp
index 6bd567d1732..fead2fd0c0c 100644
--- a/src/mame/drivers/nwk-tr.cpp
+++ b/src/mame/drivers/nwk-tr.cpp
@@ -352,9 +352,11 @@ private:
void soundtimer_count_w(uint16_t data);
double adc12138_input_callback(uint8_t input);
+ bool m_exrgb;
+
TIMER_CALLBACK_MEMBER(sound_irq);
- template <uint8_t Which> uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void ppc_map(address_map &map);
void sharc0_map(address_map &map);
@@ -369,13 +371,14 @@ void nwktr_state::paletteram32_w(offs_t offset, uint32_t data, uint32_t mem_mask
m_palette->set_pen_color(offset, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0));
}
-template <uint8_t Which>
uint32_t nwktr_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->pen(0), cliprect);
- m_voodoo[Which]->voodoo_update(bitmap, cliprect);
- m_k001604[Which]->draw_front_layer(screen, bitmap, cliprect);
+ int board = m_exrgb ? 1 : 0;
+
+ m_voodoo[board]->voodoo_update(bitmap, cliprect);
+ m_k001604[0]->draw_front_layer(screen, bitmap, cliprect); // K001604 on slave board doesn't seem to output anything. Bug or intended?
return 0;
}
@@ -404,7 +407,7 @@ uint8_t nwktr_state::sysreg_r(offs_t offset)
case 4:
r = m_dsw->read();
break;
- default:
+ default:
break;
}
@@ -435,12 +438,25 @@ void nwktr_state::sysreg_w(offs_t offset, uint8_t data)
}
case 7:
+ /*
+ 0x80 = EXRES1
+ 0x40 = EXRES0
+ 0x20 = EXID1
+ 0x10 = EXID0
+ 0x01 = EXRGB
+ */
if (data & 0x80) // CG Board 1 IRQ Ack
m_maincpu->set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE);
if (data & 0x40) // CG Board 0 IRQ Ack
m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
- m_konppc->set_cgboard_id((data >> 4) & 3);
+ m_konppc->set_cgboard_id((data >> 4) & 0x3);
+
+ // Racing Jam sets CG board ID to 2 when writing to the tilemap chip.
+ // This could mean broadcast to both CG boards?
+
+ m_exrgb = data & 0x1; // Select which CG Board outputs signal
+
m_cg_view.select(m_konppc->get_cgboard_id() ? 1 : 0);
break;
@@ -548,7 +564,7 @@ void nwktr_state::sharc1_map(address_map &map)
map(0x0400000, 0x041ffff).rw(m_konppc, FUNC(konppc_device::cgboard_1_shared_sharc_r), FUNC(konppc_device::cgboard_1_shared_sharc_w));
map(0x0500000, 0x05fffff).ram().share(m_sharc_dataram[1]).lr32(NAME([this](offs_t offset) { return m_sharc_dataram[1][offset] & 0xffff; }));
map(0x1400000, 0x14fffff).ram();
- map(0x2400000, 0x27fffff).rw(m_konppc, FUNC(konppc_device::nwk_voodoo_0_r), FUNC(konppc_device::nwk_voodoo_0_w));
+ map(0x2400000, 0x27fffff).rw(m_konppc, FUNC(konppc_device::nwk_voodoo_1_r), FUNC(konppc_device::nwk_voodoo_1_w));
map(0x3400000, 0x34000ff).rw(m_konppc, FUNC(konppc_device::cgboard_1_comm_sharc_r), FUNC(konppc_device::cgboard_1_comm_sharc_w));
map(0x3500000, 0x35000ff).rw(m_konppc, FUNC(konppc_device::K033906_1_r), FUNC(konppc_device::K033906_1_w));
map(0x3600000, 0x37fffff).bankr("slave_cgboard_bank");
@@ -672,26 +688,23 @@ void nwktr_state::nwktr(machine_config &config)
VOODOO_1(config, m_voodoo[0], XTAL(50'000'000));
m_voodoo[0]->set_fbmem(2);
m_voodoo[0]->set_tmumem(2,2);
- m_voodoo[0]->set_screen_tag("lscreen");
+ m_voodoo[0]->set_screen_tag("screen");
m_voodoo[0]->set_cpu_tag(m_dsp[0]);
m_voodoo[0]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_voodoo[0]->stall_callback().set(m_dsp[0], FUNC(adsp21062_device::write_stall));
VOODOO_1(config, m_voodoo[1], XTAL(50'000'000));
m_voodoo[1]->set_fbmem(2);
m_voodoo[1]->set_tmumem(2,2);
- m_voodoo[1]->set_screen_tag("rscreen");
+ m_voodoo[1]->set_screen_tag("screen");
m_voodoo[1]->set_cpu_tag(m_dsp[1]);
m_voodoo[1]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
+ m_voodoo[1]->stall_callback().set(m_dsp[1], FUNC(adsp21062_device::write_stall));
- screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
// default 24KHz parameter in both 001604 and voodoo, input clock correct? (58~Hz Vsync, 50MHz/3 or 64MHz/4?)
- lscreen.set_raw(XTAL(64'000'000) / 4, 644, 44, 44 + 512, 450, 31, 31 + 400);
- lscreen.set_screen_update(FUNC(nwktr_state::screen_update<0>));
-
- screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER)); // for unused/debug screen from slave CG board
- // resolution currently unknown, input clock correct? (60~Hz Vsync, 50MHz/3 or 64MHz/4?)
- rscreen.set_raw(XTAL(64'000'000) / 4, 644, 44, 44 + 512, 450, 31, 31 + 400);
- rscreen.set_screen_update(FUNC(nwktr_state::screen_update<1>));
+ screen.set_raw(XTAL(64'000'000) / 4, 644, 44, 44 + 512, 450, 31, 31 + 400);
+ screen.set_screen_update(FUNC(nwktr_state::screen_update));
PALETTE(config, m_palette).set_entries(65536);
diff --git a/src/mame/drivers/odyssey2.cpp b/src/mame/drivers/odyssey2.cpp
index 8ff598840d6..8c9659d2829 100644
--- a/src/mame/drivers/odyssey2.cpp
+++ b/src/mame/drivers/odyssey2.cpp
@@ -401,7 +401,7 @@ u8 odyssey2_state::p2_read()
{
// P12: 74156 keyboard decoder enable, 74156 inputs from P20-P22
// 74148 priority encoder, GS to P24, outputs to P25-P27
- u8 inp = count_leading_zeros(m_keyboard[m_p2 & 0x07]->read()) - 24;
+ u8 inp = count_leading_zeros_32(m_keyboard[m_p2 & 0x07]->read()) - 24;
if (inp < 8)
data &= inp << 5 | 0xf;
}
diff --git a/src/mame/drivers/ojankohs.cpp b/src/mame/drivers/ojankohs.cpp
index 031a4ab301e..e1c7c7bafa5 100644
--- a/src/mame/drivers/ojankohs.cpp
+++ b/src/mame/drivers/ojankohs.cpp
@@ -32,19 +32,18 @@
#include "cpu/z80/z80.h"
#include "machine/nvram.h"
#include "sound/ay8910.h"
-#include "sound/msm5205.h"
#include "video/vsystem_gga.h"
#include "speaker.h"
-void ojankohs_state::ojankohs_rombank_w(uint8_t data)
+void ojankohs_state::rombank_w(uint8_t data)
{
- membank("bank1")->set_entry(data & 0x3f);
+ m_mainbank->set_entry(data & 0x3f);
}
-void ojankohs_state::ojankoy_rombank_w(uint8_t data)
+void ojankoy_state::rombank_w(uint8_t data)
{
- membank("bank1")->set_entry(data & 0x1f);
+ m_mainbank->set_entry(data & 0x1f);
m_adpcm_reset = BIT(data, 5);
if (!m_adpcm_reset)
@@ -53,7 +52,7 @@ void ojankohs_state::ojankoy_rombank_w(uint8_t data)
m_msm->reset_w(!m_adpcm_reset);
}
-void ojankohs_state::ojankohs_adpcm_reset_w(uint8_t data)
+void ojankohs_state::adpcm_reset_w(uint8_t data)
{
m_adpcm_reset = BIT(data, 0);
m_vclk_left = 0;
@@ -61,19 +60,19 @@ void ojankohs_state::ojankohs_adpcm_reset_w(uint8_t data)
m_msm->reset_w(!m_adpcm_reset);
}
-void ojankohs_state::ojankohs_msm5205_w(uint8_t data)
+void ojankohs_state::msm5205_w(uint8_t data)
{
m_adpcm_data = data;
m_vclk_left = 2;
}
-WRITE_LINE_MEMBER(ojankohs_state::ojankohs_adpcm_int)
+WRITE_LINE_MEMBER(ojankohs_state::adpcm_int)
{
- /* skip if we're reset */
+ // skip if we're reset
if (!m_adpcm_reset)
return;
- /* clock the data through */
+ // clock the data through
if (m_vclk_left)
{
m_msm->data_w(m_adpcm_data >> 4);
@@ -81,99 +80,99 @@ WRITE_LINE_MEMBER(ojankohs_state::ojankohs_adpcm_int)
m_vclk_left--;
}
- /* generate an NMI if we're out of data */
+ // generate an NMI if we're out of data
if (!m_vclk_left)
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-void ojankohs_state::ojankoc_ctrl_w(uint8_t data)
+void ojankoc_state::ctrl_w(uint8_t data)
{
- membank("bank1")->set_entry(data & 0x0f);
+ m_mainbank->set_entry(data & 0x0f);
m_adpcm_reset = BIT(data, 4);
m_msm->reset_w(!BIT(data, 4));
- ojankoc_flipscreen(data);
+ flipscreen(data);
}
-void ojankohs_state::ojankohs_map(address_map &map)
+void ojankohs_state::map(address_map &map)
{
map(0x0000, 0x7fff).rom();
- map(0x8000, 0x8fff).ram().w(FUNC(ojankohs_state::ojankohs_videoram_w)).share("videoram");
- map(0x9000, 0x9fff).ram().w(FUNC(ojankohs_state::ojankohs_colorram_w)).share("colorram");
+ map(0x8000, 0x8fff).ram().w(FUNC(ojankohs_state::videoram_w)).share(m_videoram);
+ map(0x9000, 0x9fff).ram().w(FUNC(ojankohs_state::colorram_w)).share(m_colorram);
map(0xa000, 0xb7ff).ram().share("nvram");
- map(0xb800, 0xbfff).ram().w(FUNC(ojankohs_state::ojankohs_palette_w)).share("paletteram");
- map(0xc000, 0xffff).bankr("bank1");
+ map(0xb800, 0xbfff).ram().w(FUNC(ojankohs_state::palette_w)).share(m_paletteram);
+ map(0xc000, 0xffff).bankr(m_mainbank);
}
-void ojankohs_state::ojankoy_map(address_map &map)
+void ojankoy_state::map(address_map &map)
{
map(0x0000, 0x7fff).rom();
- map(0x8000, 0x9fff).ram().w(FUNC(ojankohs_state::ojankohs_videoram_w)).share("videoram");
- map(0xa000, 0xafff).ram().w(FUNC(ojankohs_state::ojankohs_colorram_w)).share("colorram");
+ map(0x8000, 0x9fff).ram().w(FUNC(ojankoy_state::videoram_w)).share(m_videoram);
+ map(0xa000, 0xafff).ram().w(FUNC(ojankoy_state::colorram_w)).share(m_colorram);
map(0xb000, 0xbfff).ram().share("nvram");
- map(0xc000, 0xffff).bankr("bank1");
+ map(0xc000, 0xffff).bankr(m_mainbank);
}
-void ojankohs_state::ojankoc_map(address_map &map)
+void ojankoc_state::map(address_map &map)
{
map(0x0000, 0x77ff).rom();
map(0x7800, 0x7fff).ram().share("nvram");
- map(0x8000, 0xffff).bankr("bank1").w(FUNC(ojankohs_state::ojankoc_videoram_w));
+ map(0x8000, 0xffff).bankr(m_mainbank).w(FUNC(ojankoc_state::videoram_w));
}
-void ojankohs_state::ojankohs_io_map(address_map &map)
+void ojankohs_state::io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).portr("system").w(FUNC(ojankohs_state::port_select_w));
- map(0x01, 0x01).rw(FUNC(ojankohs_state::keymatrix_p1_r), FUNC(ojankohs_state::ojankohs_rombank_w));
- map(0x02, 0x02).rw(FUNC(ojankohs_state::keymatrix_p2_r), FUNC(ojankohs_state::ojankohs_gfxreg_w));
- map(0x03, 0x03).w(FUNC(ojankohs_state::ojankohs_adpcm_reset_w));
- map(0x04, 0x04).w(FUNC(ojankohs_state::ojankohs_flipscreen_w));
- map(0x05, 0x05).w(FUNC(ojankohs_state::ojankohs_msm5205_w));
+ map(0x01, 0x01).rw(FUNC(ojankohs_state::keymatrix_p1_r), FUNC(ojankohs_state::rombank_w));
+ map(0x02, 0x02).rw(FUNC(ojankohs_state::keymatrix_p2_r), FUNC(ojankohs_state::gfxreg_w));
+ map(0x03, 0x03).w(FUNC(ojankohs_state::adpcm_reset_w));
+ map(0x04, 0x04).w(FUNC(ojankohs_state::flipscreen_w));
+ map(0x05, 0x05).w(FUNC(ojankohs_state::msm5205_w));
map(0x06, 0x06).r("aysnd", FUNC(ym2149_device::data_r));
map(0x06, 0x07).w("aysnd", FUNC(ym2149_device::data_address_w));
map(0x10, 0x11).w("gga", FUNC(vsystem_gga_device::write));
}
-void ojankohs_state::ojankoy_io_map(address_map &map)
+void ojankoy_state::io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).portr("system").w(FUNC(ojankohs_state::port_select_w));
- map(0x01, 0x01).rw(FUNC(ojankohs_state::keymatrix_p1_r), FUNC(ojankohs_state::ojankoy_rombank_w));
- map(0x02, 0x02).rw(FUNC(ojankohs_state::keymatrix_p2_r), FUNC(ojankohs_state::ojankoy_coinctr_w));
- map(0x04, 0x04).w(FUNC(ojankohs_state::ojankohs_flipscreen_w));
- map(0x05, 0x05).w(FUNC(ojankohs_state::ojankohs_msm5205_w));
+ map(0x00, 0x00).portr("system").w(FUNC(ojankoy_state::port_select_w));
+ map(0x01, 0x01).rw(FUNC(ojankoy_state::keymatrix_p1_r), FUNC(ojankoy_state::rombank_w));
+ map(0x02, 0x02).rw(FUNC(ojankoy_state::keymatrix_p2_r), FUNC(ojankoy_state::coinctr_w));
+ map(0x04, 0x04).w(FUNC(ojankoy_state::flipscreen_w));
+ map(0x05, 0x05).w(FUNC(ojankoy_state::msm5205_w));
map(0x06, 0x06).r("aysnd", FUNC(ay8910_device::data_r));
map(0x06, 0x07).w("aysnd", FUNC(ay8910_device::data_address_w));
}
-void ojankohs_state::ccasino_io_map(address_map &map)
+void ccasino_state::io_map(address_map &map)
{
- map(0x00, 0x00).mirror(0xff00).portr("system").w(FUNC(ojankohs_state::port_select_w));
- map(0x01, 0x01).mirror(0xff00).rw(FUNC(ojankohs_state::keymatrix_p1_r), FUNC(ojankohs_state::ojankohs_rombank_w));
- map(0x02, 0x02).mirror(0xff00).rw(FUNC(ojankohs_state::keymatrix_p2_r), FUNC(ojankohs_state::ccasino_coinctr_w));
- map(0x03, 0x03).mirror(0xff00).r(FUNC(ojankohs_state::ccasino_dipsw3_r)).w(FUNC(ojankohs_state::ojankohs_adpcm_reset_w));
- map(0x04, 0x04).mirror(0xff00).r(FUNC(ojankohs_state::ccasino_dipsw4_r)).w(FUNC(ojankohs_state::ojankohs_flipscreen_w));
- map(0x05, 0x05).mirror(0xff00).w(FUNC(ojankohs_state::ojankohs_msm5205_w));
+ map(0x00, 0x00).mirror(0xff00).portr("system").w(FUNC(ccasino_state::port_select_w));
+ map(0x01, 0x01).mirror(0xff00).rw(FUNC(ccasino_state::keymatrix_p1_r), FUNC(ccasino_state::rombank_w));
+ map(0x02, 0x02).mirror(0xff00).rw(FUNC(ccasino_state::keymatrix_p2_r), FUNC(ccasino_state::coinctr_w));
+ map(0x03, 0x03).mirror(0xff00).r(FUNC(ccasino_state::dipsw3_r)).w(FUNC(ccasino_state::adpcm_reset_w));
+ map(0x04, 0x04).mirror(0xff00).r(FUNC(ccasino_state::dipsw4_r)).w(FUNC(ccasino_state::flipscreen_w));
+ map(0x05, 0x05).mirror(0xff00).w(FUNC(ccasino_state::msm5205_w));
map(0x06, 0x06).mirror(0xff00).r("aysnd", FUNC(ay8910_device::data_r));
map(0x06, 0x07).mirror(0xff00).w("aysnd", FUNC(ay8910_device::data_address_w));
- map(0x08, 0x0f).select(0xff00).w(FUNC(ojankohs_state::ccasino_palette_w)); // 16bit address access
+ map(0x08, 0x0f).select(0xff00).w(FUNC(ccasino_state::palette_w)); // 16bit address access
map(0x10, 0x11).mirror(0xff00).w("gga", FUNC(vsystem_gga_device::write));
}
-void ojankohs_state::ojankoc_io_map(address_map &map)
+void ojankoc_state::io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x1f).w(FUNC(ojankohs_state::ojankoc_palette_w));
- map(0xf9, 0xf9).w(FUNC(ojankohs_state::ojankohs_msm5205_w));
- map(0xfb, 0xfb).w(FUNC(ojankohs_state::ojankoc_ctrl_w));
- map(0xfc, 0xfc).r(FUNC(ojankohs_state::ojankoc_keymatrix_p1_r));
- map(0xfd, 0xfd).r(FUNC(ojankohs_state::ojankoc_keymatrix_p2_r));
- map(0xfd, 0xfd).w(FUNC(ojankohs_state::port_select_w));
+ map(0x00, 0x1f).w(FUNC(ojankoc_state::palette_w));
+ map(0xf9, 0xf9).w(FUNC(ojankoc_state::msm5205_w));
+ map(0xfb, 0xfb).w(FUNC(ojankoc_state::ctrl_w));
+ map(0xfc, 0xfc).r(FUNC(ojankoc_state::keymatrix_p1_r));
+ map(0xfd, 0xfd).r(FUNC(ojankoc_state::keymatrix_p2_r));
+ map(0xfd, 0xfd).w(FUNC(ojankoc_state::port_select_w));
map(0xfe, 0xff).w("aysnd", FUNC(ay8910_device::data_address_w));
map(0xff, 0xff).r("aysnd", FUNC(ay8910_device::data_r));
}
@@ -521,22 +520,23 @@ static INPUT_PORTS_START( ojankoc )
PORT_DIPSETTING( 0x06, "1000")
PORT_DIPSETTING( 0x04, "2000")
PORT_DIPSETTING( 0x02, "3000")
- PORT_DIPSETTING( 0x00, "5000")
- PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "DSW1:4")
- PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "DSW1:5")
- PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "DSW1:6")
- PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "DSW1:7")
+ PORT_DIPSETTING( 0x00, "5000") // dip sheet says 4000, but verified 5000 in game for all dumped sets
+ PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "DSW1:4") // marked as off in the dip sheet
+ PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "DSW1:5") // marked as off in the dip sheet
+ PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "DSW1:6") // marked as off in the dip sheet
+ PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "DSW1:7") // marked as off in the dip sheet
PORT_SERVICE_DIPLOC(0x80, IP_ACTIVE_LOW, "DSW1:8")
- PORT_START("dsw2")
- PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "DSW2:1")
- PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "DSW2:2")
- PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "DSW2:3")
- PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "DSW2:4")
- PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "DSW2:5")
- PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "DSW2:6")
- PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "DSW2:7")
- PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "DSW2:8")
+ PORT_START("dsw2") // dip sheet shows you have to turn all the dips off but the one that determines the difficulty you want
+ PORT_DIPNAME(0xff, 0xef, DEF_STR( Difficulty )) PORT_DIPLOCATION("DSW2:1,2,3,4,5,6,7,8")
+ PORT_DIPSETTING( 0xfe, "A (easiest)")
+ PORT_DIPSETTING( 0xfd, "B")
+ PORT_DIPSETTING( 0xfb, "C")
+ PORT_DIPSETTING( 0xf7, "D")
+ PORT_DIPSETTING( 0xef, "E")
+ PORT_DIPSETTING( 0xdf, "F")
+ PORT_DIPSETTING( 0xbf, "G")
+ PORT_DIPSETTING( 0x7f, "H (most difficult)")
INPUT_PORTS_END
@@ -579,7 +579,7 @@ uint8_t ojankohs_state::keymatrix_p2_r()
return data;
}
-uint8_t ojankohs_state::ojankoc_keymatrix_p1_r()
+uint8_t ojankoc_state::keymatrix_p1_r()
{
uint8_t data = 0x00;
@@ -593,7 +593,7 @@ uint8_t ojankohs_state::ojankoc_keymatrix_p1_r()
return data;
}
-uint8_t ojankohs_state::ojankoc_keymatrix_p2_r()
+uint8_t ojankoc_state::keymatrix_p2_r()
{
uint8_t data = 0x00;
@@ -607,34 +607,34 @@ uint8_t ojankohs_state::ojankoc_keymatrix_p2_r()
return data;
}
-uint8_t ojankohs_state::ojankohs_dipsw1_r()
+uint8_t ojankohs_state::dipsw1_r()
{
- uint8_t data = m_dsw1->read();
+ uint8_t data = m_dsw[0]->read();
return bitswap<8>(data, 0, 1, 2, 3, 4, 5, 6, 7);
}
-uint8_t ojankohs_state::ojankohs_dipsw2_r()
+uint8_t ojankohs_state::dipsw2_r()
{
- uint8_t data = m_dsw2->read();
+ uint8_t data = m_dsw[1]->read();
return bitswap<8>(data, 0, 1, 2, 3, 4, 5, 6, 7);
}
-uint8_t ojankohs_state::ccasino_dipsw3_r()
+uint8_t ccasino_state::dipsw3_r()
{
- return m_dsw3->read() ^ 0xff;
+ return m_extra_dsw[0]->read() ^ 0xff;
}
-uint8_t ojankohs_state::ccasino_dipsw4_r()
+uint8_t ccasino_state::dipsw4_r()
{
- return m_dsw4->read() ^ 0xff;
+ return m_extra_dsw[1]->read() ^ 0xff;
}
-void ojankohs_state::ojankoy_coinctr_w(uint8_t data)
+void ojankoy_state::coinctr_w(uint8_t data)
{
machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
}
-void ojankohs_state::ccasino_coinctr_w(uint8_t data)
+void ccasino_state::coinctr_w(uint8_t data)
{
machine().bookkeeping().coin_counter_w(0, BIT(data, 1));
}
@@ -652,10 +652,10 @@ static const gfx_layout ojankohs_bglayout =
};
static GFXDECODE_START( gfx_ojankohs )
- GFXDECODE_ENTRY( "gfx1", 0, ojankohs_bglayout, 0, 64 )
+ GFXDECODE_ENTRY( "gfx", 0, ojankohs_bglayout, 0, 64 )
GFXDECODE_END
-MACHINE_START_MEMBER(ojankohs_state,common)
+void ojankohs_state::common_state_saving()
{
save_item(NAME(m_gfxreg));
save_item(NAME(m_flipscreen));
@@ -669,31 +669,24 @@ MACHINE_START_MEMBER(ojankohs_state,common)
save_item(NAME(m_vclk_left));
}
-MACHINE_START_MEMBER(ojankohs_state,ojankohs)
-{
- uint8_t *ROM = memregion("maincpu")->base();
-
- membank("bank1")->configure_entries(0, 0x40, &ROM[0x10000], 0x4000);
- MACHINE_START_CALL_MEMBER(common);
-}
-
-MACHINE_START_MEMBER(ojankohs_state,ojankoy)
+void ojankohs_state::machine_start()
{
- uint8_t *ROM = memregion("maincpu")->base();
+ uint8_t *rom = memregion("maincpu")->base();
+ uint32_t banked_size = memregion("maincpu")->bytes();
- membank("bank1")->configure_entries(0, 0x20, &ROM[0x10000], 0x4000);
+ m_mainbank->configure_entries(0, banked_size / 0x4000, &rom[0x10000], 0x4000);
- MACHINE_START_CALL_MEMBER(common);
+ common_state_saving();
}
-MACHINE_START_MEMBER(ojankohs_state,ojankoc)
+void ojankoc_state::machine_start()
{
- uint8_t *ROM = memregion("user1")->base();
+ uint8_t *rom = memregion("banked_roms")->base();
- membank("bank1")->configure_entries(0, 0x10, &ROM[0x0000], 0x8000);
+ m_mainbank->configure_entries(0, 0x10, &rom[0x0000], 0x8000);
- MACHINE_START_CALL_MEMBER(common);
+ common_state_saving();
}
void ojankohs_state::machine_reset()
@@ -714,164 +707,149 @@ void ojankohs_state::machine_reset()
void ojankohs_state::ojankohs(machine_config &config)
{
- /* basic machine hardware */
- Z80(config, m_maincpu, 12000000/2); /* 6.00 MHz ? */
- m_maincpu->set_addrmap(AS_PROGRAM, &ojankohs_state::ojankohs_map);
- m_maincpu->set_addrmap(AS_IO, &ojankohs_state::ojankohs_io_map);
+ // basic machine hardware
+ Z80(config, m_maincpu, 12'000'000 / 2); // 6.00 MHz ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &ojankohs_state::map);
+ m_maincpu->set_addrmap(AS_IO, &ojankohs_state::io_map);
m_maincpu->set_vblank_int("screen", FUNC(ojankohs_state::irq0_line_hold));
- MCFG_MACHINE_START_OVERRIDE(ojankohs_state,ojankohs)
-
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- /* video hardware */
+ // video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(512, 512);
m_screen->set_visarea(0, 288-1, 0, 224-1);
- m_screen->set_screen_update(FUNC(ojankohs_state::screen_update_ojankohs));
+ m_screen->set_screen_update(FUNC(ojankohs_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ojankohs);
PALETTE(config, m_palette).set_entries(1024);
- VSYSTEM_GGA(config, "gga", XTAL(13'333'000)/2); // divider not verified
+ VSYSTEM_GGA(config, "gga", XTAL(13'333'000) / 2); // divider not verified
- MCFG_VIDEO_START_OVERRIDE(ojankohs_state,ojankohs)
-
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "mono").front_center();
- ym2149_device &aysnd(YM2149(config, "aysnd", 12000000/6));
- aysnd.port_a_read_callback().set(FUNC(ojankohs_state::ojankohs_dipsw1_r));
- aysnd.port_b_read_callback().set(FUNC(ojankohs_state::ojankohs_dipsw2_r));
+ ym2149_device &aysnd(YM2149(config, "aysnd", 12'000'000 / 6));
+ aysnd.port_a_read_callback().set(FUNC(ojankohs_state::dipsw1_r));
+ aysnd.port_b_read_callback().set(FUNC(ojankohs_state::dipsw2_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.15);
- MSM5205(config, m_msm, 384000);
- m_msm->vck_legacy_callback().set(FUNC(ojankohs_state::ojankohs_adpcm_int)); /* IRQ handler */
- m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ MSM5205(config, m_msm, 384'000);
+ m_msm->vck_legacy_callback().set(FUNC(ojankohs_state::adpcm_int)); // IRQ handler
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); // 8 KHz
m_msm->add_route(ALL_OUTPUTS, "mono", 0.50);
}
-void ojankohs_state::ojankoy(machine_config &config)
+void ojankoy_state::ojankoy(machine_config &config)
{
- /* basic machine hardware */
- Z80(config, m_maincpu, 12000000/2); /* 6.00 MHz ? */
- m_maincpu->set_addrmap(AS_PROGRAM, &ojankohs_state::ojankoy_map);
- m_maincpu->set_addrmap(AS_IO, &ojankohs_state::ojankoy_io_map);
- m_maincpu->set_vblank_int("screen", FUNC(ojankohs_state::irq0_line_hold));
-
- MCFG_MACHINE_START_OVERRIDE(ojankohs_state,ojankoy)
+ // basic machine hardware
+ Z80(config, m_maincpu, 12'000'000 / 2); // 6.00 MHz ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &ojankoy_state::map);
+ m_maincpu->set_addrmap(AS_IO, &ojankoy_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ojankoy_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- /* video hardware */
+ // video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(512, 512);
m_screen->set_visarea(0, 288-1, 0, 224-1);
- m_screen->set_screen_update(FUNC(ojankohs_state::screen_update_ojankohs));
+ m_screen->set_screen_update(FUNC(ojankoy_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ojankohs);
- PALETTE(config, m_palette, FUNC(ojankohs_state::ojankoy_palette), 1024);
-
- MCFG_VIDEO_START_OVERRIDE(ojankohs_state,ojankoy)
+ PALETTE(config, m_palette, FUNC(ojankoy_state::palette), 1024);
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "mono").front_center();
- ay8910_device &aysnd(AY8910(config, "aysnd", 12000000/8));
+ ay8910_device &aysnd(AY8910(config, "aysnd", 12'000'000 / 8));
aysnd.port_a_read_callback().set_ioport("dsw1");
aysnd.port_b_read_callback().set_ioport("dsw2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.15);
- MSM5205(config, m_msm, 384000);
- m_msm->vck_legacy_callback().set(FUNC(ojankohs_state::ojankohs_adpcm_int)); /* IRQ handler */
- m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ MSM5205(config, m_msm, 384'000);
+ m_msm->vck_legacy_callback().set(FUNC(ojankoy_state::adpcm_int)); // IRQ handler
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); // 8 KHz
m_msm->add_route(ALL_OUTPUTS, "mono", 0.50);
}
-void ojankohs_state::ccasino(machine_config &config)
+void ccasino_state::ccasino(machine_config &config)
{
- /* basic machine hardware */
- Z80(config, m_maincpu, 12000000/2); /* 6.00 MHz ? */
- m_maincpu->set_addrmap(AS_PROGRAM, &ojankohs_state::ojankoy_map);
- m_maincpu->set_addrmap(AS_IO, &ojankohs_state::ccasino_io_map);
- m_maincpu->set_vblank_int("screen", FUNC(ojankohs_state::irq0_line_hold));
-
- MCFG_MACHINE_START_OVERRIDE(ojankohs_state,ojankohs)
+ // basic machine hardware
+ Z80(config, m_maincpu, 12'000'000 / 2); // 6.00 MHz ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &ccasino_state::map);
+ m_maincpu->set_addrmap(AS_IO, &ccasino_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ccasino_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- /* video hardware */
+ // video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(512, 512);
m_screen->set_visarea(0, 288-1, 0, 224-1);
- m_screen->set_screen_update(FUNC(ojankohs_state::screen_update_ojankohs));
+ m_screen->set_screen_update(FUNC(ccasino_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ojankohs);
PALETTE(config, m_palette).set_entries(1024);
- VSYSTEM_GGA(config, "gga", XTAL(13'333'000)/2); // divider not verified
+ VSYSTEM_GGA(config, "gga", XTAL(13'333'000) / 2); // divider not verified
- MCFG_VIDEO_START_OVERRIDE(ojankohs_state,ccasino)
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "mono").front_center();
- ay8910_device &aysnd(AY8910(config, "aysnd", 12000000/8));
+ ay8910_device &aysnd(AY8910(config, "aysnd", 12'000'000 / 8));
aysnd.port_a_read_callback().set_ioport("dsw1");
aysnd.port_b_read_callback().set_ioport("dsw2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.15);
- MSM5205(config, m_msm, 384000);
- m_msm->vck_legacy_callback().set(FUNC(ojankohs_state::ojankohs_adpcm_int)); /* IRQ handler */
- m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ MSM5205(config, m_msm, 384'000);
+ m_msm->vck_legacy_callback().set(FUNC(ccasino_state::adpcm_int)); // IRQ handler
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); // 8 KHz
m_msm->add_route(ALL_OUTPUTS, "mono", 0.50);
}
-void ojankohs_state::ojankoc(machine_config &config)
+void ojankoc_state::ojankoc(machine_config &config)
{
- /* basic machine hardware */
- Z80(config, m_maincpu, 8000000/2); /* 4.00 MHz */
- m_maincpu->set_addrmap(AS_PROGRAM, &ojankohs_state::ojankoc_map);
- m_maincpu->set_addrmap(AS_IO, &ojankohs_state::ojankoc_io_map);
- m_maincpu->set_vblank_int("screen", FUNC(ojankohs_state::irq0_line_hold));
-
- MCFG_MACHINE_START_OVERRIDE(ojankohs_state,ojankoc)
+ // basic machine hardware
+ Z80(config, m_maincpu, 8_MHz_XTAL / 2); // 4.00 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &ojankoc_state::map);
+ m_maincpu->set_addrmap(AS_IO, &ojankoc_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ojankoc_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- /* video hardware */
+ // video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(32*8, 32*8);
m_screen->set_visarea(0, 256-1, 8, 248-1);
- m_screen->set_screen_update(FUNC(ojankohs_state::screen_update_ojankoc));
+ m_screen->set_screen_update(FUNC(ojankoc_state::screen_update));
m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_entries(16);
- MCFG_VIDEO_START_OVERRIDE(ojankohs_state,ojankoc)
-
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "mono").front_center();
- ay8910_device &aysnd(AY8910(config, "aysnd", 8000000/4));
+ ay8910_device &aysnd(AY8910(config, "aysnd", 8_MHz_XTAL / 4));
aysnd.port_a_read_callback().set_ioport("dsw1");
aysnd.port_b_read_callback().set_ioport("dsw2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.15);
- MSM5205(config, m_msm, 8000000/22);
- m_msm->vck_legacy_callback().set(FUNC(ojankohs_state::ojankohs_adpcm_int)); /* IRQ handler */
- m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ MSM5205(config, m_msm, 8_MHz_XTAL / 22);
+ m_msm->vck_legacy_callback().set(FUNC(ojankoc_state::adpcm_int)); // IRQ handler
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); // 8 KHz
m_msm->add_route(ALL_OUTPUTS, "mono", 0.50);
}
@@ -882,7 +860,7 @@ ROM_START( ojankohs )
ROM_LOAD( "5b", 0x10000, 0x80000, CRC(bd4fd0b6) SHA1(79e0937fdd34ec03b4b0a503efc1fa7c8f29e7cf) )
ROM_LOAD( "6.6c", 0x90000, 0x08000, CRC(30772679) SHA1(8bc415da465faa70ec468a23b3528493849e83ee) )
- ROM_REGION( 0x80000, "gfx1", 0 )
+ ROM_REGION( 0x80000, "gfx", 0 )
ROM_LOAD( "13b", 0x00000, 0x80000, CRC(bda30bfa) SHA1(c412e573c40816735f7e2d0600dd0d78ebce91dc) )
ROM_END
@@ -896,7 +874,7 @@ ROM_START( ojankoy )
ROM_LOAD( "c-ic32.bin", 0x60000, 0x08000, CRC(d20de9b0) SHA1(bfec453a5e16bb3e1ffa454d6dad44e113a54968) )
ROM_LOAD( "d-ic31.bin", 0x68000, 0x08000, CRC(b78e6913) SHA1(a0ebe0b29025beabe5609a5d1adecfd2565da623) )
- ROM_REGION( 0x70000, "gfx1", 0 )
+ ROM_REGION( 0x70000, "gfx", 0 )
ROM_LOAD( "ic55.bin", 0x00000, 0x20000, CRC(586fb385) SHA1(cdf18f52ba8d25c740fc85a68505f102fe6ba208) )
ROM_LOAD( "0-ic53.bin", 0x40000, 0x08000, CRC(db38c288) SHA1(8b98091eae9c22ade123a6f58c108f8e653d99c8) )
ROM_LOAD( "1-ic52.bin", 0x48000, 0x08000, CRC(a8b4a10b) SHA1(fa44c52efd42a99e2d34c4785a09947523a8385a) )
@@ -920,7 +898,7 @@ ROM_START( ojanko2 )
ROM_LOAD( "c-ic32.bin", 0x60000, 0x08000, CRC(5453b9de) SHA1(d9758c56cd65d65d0711368054fc0dfbb4b213ae) )
ROM_LOAD( "d-ic31.bin", 0x68000, 0x08000, CRC(44cd5348) SHA1(a73a676fbca4678aef8066ad72ea22c6c4ca4b32) )
- ROM_REGION( 0x70000, "gfx1", 0 )
+ ROM_REGION( 0x70000, "gfx", 0 )
ROM_LOAD( "ic55.bin", 0x00000, 0x20000, CRC(b058fb3d) SHA1(32b04405f218c1f9ca58f01dbadda3536df3d0b5) )
ROM_LOAD( "0-ic53.bin", 0x40000, 0x08000, CRC(db38c288) SHA1(8b98091eae9c22ade123a6f58c108f8e653d99c8) )
ROM_LOAD( "1-ic52.bin", 0x48000, 0x08000, CRC(49f2ca73) SHA1(387613fd886f3a4a569146aaec59ad15f13a8ea5) )
@@ -941,7 +919,7 @@ ROM_START( ccasino )
ROM_LOAD( "g5.bin", 0x58000, 0x08000, CRC(8cfd60aa) SHA1(203789c58a9cbfbf37ad2a3dfcd86eefe406b2c7) )
ROM_LOAD( "h5.bin", 0x60000, 0x08000, CRC(d20dfcf9) SHA1(83ca36f2e02bbada5b03734b5d92c5c860292db2) )
- ROM_REGION( 0x60000, "gfx1", 0 )
+ ROM_REGION( 0x60000, "gfx", 0 )
ROM_LOAD( "r1.bin", 0x00000, 0x20000, CRC(407f77ca) SHA1(a65e5403fa84185d67d994acee6f32051991d546) )
ROM_LOAD( "s1.bin", 0x20000, 0x20000, CRC(8572d156) SHA1(22f73bfb1419c3d467b4cd4ffaa6f1598f4ee4fa) )
ROM_LOAD( "e1.bin", 0x40000, 0x08000, CRC(d78c3428) SHA1(b033a7aa3029b7a9ff836c5c737c07aaad5d7456) )
@@ -951,10 +929,10 @@ ROM_START( ccasino )
ROM_END
ROM_START( ojankoc )
- ROM_REGION( 0x10000, "maincpu", 0 ) /* CPU */
+ ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "c11.1p", 0x0000, 0x8000, CRC(cb3e900c) SHA1(95f0354f147e339a97368b5cc67200151cdfa0e9) )
- ROM_REGION( 0x80000, "user1", 0 ) /* BANK */
+ ROM_REGION( 0x80000, "banked_roms", 0 )
ROM_LOAD( "1.1a", 0x00000, 0x8000, CRC(d40b17eb) SHA1(1e8c16e1562c112ca5150b3187a2d4aa22c1adf0) )
ROM_LOAD( "2.1b", 0x08000, 0x8000, CRC(d181172a) SHA1(65d6710464a1f505df705c553558bbf22704359d) )
ROM_LOAD( "3.1c", 0x10000, 0x8000, CRC(2e86d5bc) SHA1(0226eb81b31e43325f24b40ab51bce1729bf678c) )
@@ -968,10 +946,27 @@ ROM_START( ojankoc )
ROM_END
ROM_START( ojankoca )
- ROM_REGION( 0x10000, "maincpu", 0 ) /* CPU */
+ ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "11.1p", 0x0000, 0x8000, CRC(0c552e32) SHA1(2a8714796b2c95a042d783aae79c135ba03d1958) )
- ROM_REGION( 0x80000, "user1", 0 ) /* BANK */
+ ROM_REGION( 0x80000, "banked_roms", 0 )
+ ROM_LOAD( "1.1a", 0x00000, 0x8000, CRC(d40b17eb) SHA1(1e8c16e1562c112ca5150b3187a2d4aa22c1adf0) )
+ ROM_LOAD( "2.1b", 0x08000, 0x8000, CRC(d181172a) SHA1(65d6710464a1f505df705c553558bbf22704359d) )
+ ROM_LOAD( "3.1c", 0x10000, 0x8000, CRC(2e86d5bc) SHA1(0226eb81b31e43325f24b40ab51bce1729bf678c) )
+ ROM_LOAD( "4.1e", 0x18000, 0x8000, CRC(00a780cb) SHA1(f0b4f6f0c58e9d069e0f6794243925679f220f35) )
+ ROM_LOAD( "5.1f", 0x20000, 0x8000, CRC(f9885076) SHA1(ebf4c0769eab6545fd227eb9f4036af2472bcac3) )
+ ROM_LOAD( "6.1h", 0x28000, 0x8000, CRC(42575d0c) SHA1(1f9c187b0c05179798cbdb28eb212202ffdc9fde) )
+ ROM_LOAD( "7.1k", 0x30000, 0x8000, CRC(4d8d8928) SHA1(a5ccf4a1d84ef3a4966db01d66371de83e270701) )
+ ROM_LOAD( "8.1l", 0x38000, 0x8000, CRC(534573b7) SHA1(ec53cad7d652c88508edd29c2412834920fe8ef6) )
+ ROM_LOAD( "9.1m", 0x48000, 0x8000, CRC(2bf88eda) SHA1(55de96d057a0f35d9e74455444751f217aa4741e) )
+ ROM_LOAD( "0.1n", 0x50000, 0x8000, CRC(5665016e) SHA1(0f7f0a8e55e93bcb3060c91d9704905a6e827250) )
+ROM_END
+
+ROM_START( ojankocb ) // VS6-0501 PCB, has a big metal box, under which there is supposed to be an input custom. It also has a 12 MHz XTAL near it.
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "11.1p", 0x0000, 0x8000, CRC(a2739aad) SHA1(2d8c3809606a166bbd4ec7b28d7a6cf7dfce87a6) ) // sldh
+
+ ROM_REGION( 0x80000, "banked_roms", 0 )
ROM_LOAD( "1.1a", 0x00000, 0x8000, CRC(d40b17eb) SHA1(1e8c16e1562c112ca5150b3187a2d4aa22c1adf0) )
ROM_LOAD( "2.1b", 0x08000, 0x8000, CRC(d181172a) SHA1(65d6710464a1f505df705c553558bbf22704359d) )
ROM_LOAD( "3.1c", 0x10000, 0x8000, CRC(2e86d5bc) SHA1(0226eb81b31e43325f24b40ab51bce1729bf678c) )
@@ -985,9 +980,10 @@ ROM_START( ojankoca )
ROM_END
-GAME( 1986, ojankoc, 0, ojankoc, ojankoc, ojankoc_state, empty_init, ROT0, "V-System Co.", "Ojanko Club (Japan, Program Ver. 1.3)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, ojankoca, ojankoc, ojankoc, ojankoc, ojankoc_state, empty_init, ROT0, "V-System Co.", "Ojanko Club (Japan, Program Ver. 1.2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, ojankoy, 0, ojankoy, ojankoy, ojankoy_state, empty_init, ROT0, "V-System Co.", "Ojanko Yakata (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, ojanko2, 0, ojankoy, ojankoy, ojankoy_state, empty_init, ROT0, "V-System Co.", "Ojanko Yakata 2bankan (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, ccasino, 0, ccasino, ccasino, ccasino_state, empty_init, ROT0, "V-System Co.", "Chinese Casino [BET] (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1988, ojankohs, 0, ojankohs, ojankohs, ojankohs_state, empty_init, ROT0, "V-System Co.", "Ojanko High School (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, ojankoc, 0, ojankoc, ojankoc, ojankoc_state, empty_init, ROT0, "V-System Co.", "Ojanko Club (Japan, Program Ver. 1.3, set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, ojankocb, ojankoc, ojankoc, ojankoc, ojankoc_state, empty_init, ROT0, "V-System Co.", "Ojanko Club (Japan, Program Ver. 1.3, set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, ojankoca, ojankoc, ojankoc, ojankoc, ojankoc_state, empty_init, ROT0, "V-System Co.", "Ojanko Club (Japan, Program Ver. 1.2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, ojankoy, 0, ojankoy, ojankoy, ojankoy_state, empty_init, ROT0, "V-System Co.", "Ojanko Yakata (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ojanko2, 0, ojankoy, ojankoy, ojankoy_state, empty_init, ROT0, "V-System Co.", "Ojanko Yakata 2bankan (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ccasino, 0, ccasino, ccasino, ccasino_state, empty_init, ROT0, "V-System Co.", "Chinese Casino [BET] (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1988, ojankohs, 0, ojankohs, ojankohs, ojankohs_state, empty_init, ROT0, "V-System Co.", "Ojanko High School (Japan)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/olibochu.cpp b/src/mame/drivers/olibochu.cpp
index dbcb0ab94ba..8fa5924cec8 100644
--- a/src/mame/drivers/olibochu.cpp
+++ b/src/mame/drivers/olibochu.cpp
@@ -257,7 +257,7 @@ void olibochu_state::sound_command_w(offs_t offset, uint8_t data)
else
m_cmd = (m_cmd & 0xff00) | uint16_t(data);
- unsigned c = count_leading_zeros(uint32_t(m_cmd)) - 16;
+ unsigned c = count_leading_zeros_32(uint32_t(m_cmd)) - 16;
if (c < 16)
m_soundlatch->write(c);
}
diff --git a/src/mame/drivers/pacman.cpp b/src/mame/drivers/pacman.cpp
index 5eec52304b3..67e286fb26b 100644
--- a/src/mame/drivers/pacman.cpp
+++ b/src/mame/drivers/pacman.cpp
@@ -6550,6 +6550,30 @@ ROM_START( paintrlr )
ROM_LOAD( "82s126.3m", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) // Timing - not used
ROM_END
+// PCB is marked: "CRUSH ROLLER" on component side
+// PCB is labelled: "PENNELLO 2" on component side ("pennello" is the Italian word for "brush")
+// Bootleg of a hack? Shows Painter (c) 1984 Monshine Ent. Co. before coining up, Painter (c) 1984 Elsys Software after coining up.
+// Interesting hack: it mixes Crush Roller elements with Pacman elements
+ROM_START( painter )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "pain1.6e", 0x0000, 0x1000, CRC(fb2eb6dc) SHA1(377075cb64c7ccc0bd2b0185848d4798428bceb2) )
+ ROM_LOAD( "pain2.6f", 0x1000, 0x1000, CRC(39f92fb0) SHA1(2b58429664eadb8bb5100289182b274cc7e4688c) )
+ ROM_LOAD( "pain3.6h", 0x2000, 0x1000, CRC(f80435b1) SHA1(7f41ecc2a91f8bdf0969f4f3fe96b48adb1010ba) )
+ ROM_LOAD( "pain4-pennello2.6j", 0x3000, 0x1000, CRC(0cb678dc) SHA1(b1b9eadf22dc7985b39d414438092a7fc6c58955) ) // has strange strings in the second half, but seems to work fine
+
+ ROM_REGION( 0x2000, "gfx1", 0 )
+ ROM_LOAD( "pain5.5e", 0x0000, 0x1000, CRC(bd819afc) SHA1(2e8762c3c480aa669f7e87651ddfdbb965ea4211) )
+ ROM_LOAD( "pain6.5f", 0x1000, 0x1000, BAD_DUMP CRC(014e5ed3) SHA1(8e01c640457515da89723215b19684ceb4556997) ) // BADADDR xx-xxxxxxxxx, dumped with 2 different programmers with same result, but probably damaged ROM
+
+ ROM_REGION( 0x0120, "proms", 0 ) // not dumped for this set
+ ROM_LOAD( "82s123.7f", 0x0000, 0x0020, BAD_DUMP CRC(2fc650bd) SHA1(8d0268dee78e47c712202b0ec4f1f51109b1f2a5) )
+ ROM_LOAD( "2s140.4a", 0x0020, 0x0100, BAD_DUMP CRC(63efb927) SHA1(5c144a613fc4960a1dfd7ead89e7fee258a63171) )
+
+ ROM_REGION( 0x0200, "namco", 0 ) // not dumped for this set
+ ROM_LOAD( "82s126.1m", 0x0000, 0x0100, BAD_DUMP CRC(a9cc86bf) SHA1(bbcec0570aeceb582ff8238a4bc8546a23430081) )
+ ROM_LOAD( "82s126.3m", 0x0100, 0x0100, BAD_DUMP CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) // Timing - not used
+ROM_END
+
/*
Crush Roller (Sidam PCB)
@@ -8293,6 +8317,7 @@ GAME( 1981, crushbl3, crush, korosuke, mbrush, pacman_state, init_maketrax
GAME( 1981, crushs, crush, crushs, crushs, pacman_state, empty_init, ROT90, "bootleg (Sidam)", "Crush Roller (bootleg set 4)", MACHINE_SUPPORTS_SAVE ) // Sidam PCB, no Sidam text
GAME( 1981, mbrush, crush, korosuke, mbrush, pacman_state, init_mbrush, ROT90, "bootleg (Olympia)", "Magic Brush (bootleg of Crush Roller)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, paintrlr, crush, crush2, paintrlr, pacman_state, empty_init, ROT90, "bootleg", "Paint Roller (bootleg of Crush Roller)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, painter, crush, crush2, paintrlr, pacman_state, empty_init, ROT90, "hack (Monshine Ent. Co.)", "Painter (hack of Crush Roller)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // currently shows Paintei due to bad sprite ROM
GAME( 1982, eyes, 0, pacman, eyes, pacman_state, init_eyes, ROT90, "Techstar (Rock-Ola license)", "Eyes (US set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, eyes2, eyes, pacman, eyes, pacman_state, init_eyes, ROT90, "Techstar (Rock-Ola license)", "Eyes (US set 2)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/pasha2.cpp b/src/mame/drivers/pasha2.cpp
index 16bc6dcaee6..fdf88f2ac0e 100644
--- a/src/mame/drivers/pasha2.cpp
+++ b/src/mame/drivers/pasha2.cpp
@@ -98,7 +98,6 @@ public:
pasha2_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_wram(*this, "wram")
- , m_paletteram(*this, "paletteram")
, m_mainbank(*this, "mainbank")
, m_lamps_r(*this, "lamp_p%u_r", 1U)
, m_lamps_g(*this, "lamp_p%u_g", 1U)
@@ -120,47 +119,55 @@ protected:
private:
// memory pointers
- required_shared_ptr<uint16_t> m_wram;
- required_shared_ptr<uint16_t> m_paletteram;
+ required_shared_ptr<u16> m_wram;
required_memory_bank m_mainbank;
+ // output finders
output_finder<3> m_lamps_r;
output_finder<3> m_lamps_g;
output_finder<3> m_lamps_b;
- // video-related
- uint8_t m_vbuffer;
-
- // memory
- std::unique_ptr<uint8_t[]> m_bitmap0[2];
- std::unique_ptr<uint8_t[]> m_bitmap1[2];
- void misc_w(offs_t offset, uint16_t data);
- void palette_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- void vbuffer_set_w(uint16_t data);
- void vbuffer_clear_w(uint16_t data);
- void bitmap_0_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0);
- void bitmap_1_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0);
- void pasha2_lamps_w(uint16_t data);
- uint16_t pasha2_speedup_r(offs_t offset);
- template<int Chip> void oki_bank_w(offs_t offset, uint16_t data);
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ // devices
required_device<cpu_device> m_maincpu;
required_device_array<okim6295_device, 2> m_oki;
required_device<palette_device> m_palette;
+
+ // video-related
+ u8 m_vbuffer = 0;
+ bitmap_ind16 m_bg_bitmap[2];
+ bitmap_ind16 m_fg_bitmap[2];
+
+ // video functions
+ void vbuffer_set_w(u16 data);
+ void vbuffer_clear_w(u16 data);
+ void bg_bitmap_w(offs_t offset, u8 data);
+ void fg_bitmap_w(offs_t offset, u8 data);
+
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ // peripheral handlers
+ template<int Chip> void oki_bank_w(offs_t offset, u16 data);
+ void misc_w(offs_t offset, u16 data);
+ void pasha2_lamps_w(u16 data);
+
+ // speedup functions
+ u16 pasha2_speedup_r(offs_t offset);
+
+ // address maps
void pasha2_io(address_map &map);
void pasha2_map(address_map &map);
void zdrum_audio_map(address_map &map);
};
-void pasha2_state::misc_w(offs_t offset, uint16_t data)
+void pasha2_state::misc_w(offs_t offset, u16 data)
{
if (offset)
{
if (data & 0x0800)
{
- int bank = data & 0xf000;
+ const u16 bank = data & 0xf000;
switch (bank)
{
@@ -176,53 +183,38 @@ void pasha2_state::misc_w(offs_t offset, uint16_t data)
}
}
-void pasha2_state::palette_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- int color;
-
- COMBINE_DATA(&m_paletteram[offset]);
-
- offset &= 0xff;
-
- color = (m_paletteram[offset] >> 8) | (m_paletteram[offset + 0x100] & 0xff00);
- m_palette->set_pen_color(offset * 2 + 0, pal5bit(color), pal5bit(color >> 5), pal5bit(color >> 10));
-
- color = (m_paletteram[offset] & 0xff) | ((m_paletteram[offset + 0x100] & 0xff) << 8);
- m_palette->set_pen_color(offset * 2 + 1, pal5bit(color), pal5bit(color >> 5), pal5bit(color >> 10));
-}
-
-void pasha2_state::vbuffer_set_w(uint16_t data)
+void pasha2_state::vbuffer_set_w(u16 data)
{
m_vbuffer = 1;
}
-void pasha2_state::vbuffer_clear_w(uint16_t data)
+void pasha2_state::vbuffer_clear_w(u16 data)
{
m_vbuffer = 0;
}
-void pasha2_state::bitmap_0_w(offs_t offset, uint8_t data, uint8_t mem_mask)
+void pasha2_state::bg_bitmap_w(offs_t offset, u8 data)
{
- COMBINE_DATA(&m_bitmap0[m_vbuffer][offset]);
+ m_bg_bitmap[m_vbuffer].pix(offset >> 9, offset & 0x1ff) = (data & 0xff) | 0x100;
}
-void pasha2_state::bitmap_1_w(offs_t offset, uint8_t data, uint8_t mem_mask)
+void pasha2_state::fg_bitmap_w(offs_t offset, u8 data)
{
// handle overlapping pixels without writing them
if ((data & 0xff) == 0xff)
return;
- COMBINE_DATA(&m_bitmap1[m_vbuffer][offset]);
+ m_fg_bitmap[m_vbuffer].pix(offset >> 9, offset & 0x1ff) = data & 0xff;
}
template<int Chip>
-void pasha2_state::oki_bank_w(offs_t offset, uint16_t data)
+void pasha2_state::oki_bank_w(offs_t offset, u16 data)
{
if (offset)
m_oki[Chip]->set_rom_bank(data & 1);
}
-void pasha2_state::pasha2_lamps_w(uint16_t data)
+void pasha2_state::pasha2_lamps_w(u16 data)
{
for (int p = 0; p < 3; p++)
{
@@ -234,9 +226,11 @@ void pasha2_state::pasha2_lamps_w(uint16_t data)
void pasha2_state::pasha2_map(address_map &map)
{
+ // MEM0 (DRAM)
map(0x00000000, 0x001fffff).ram().share("wram");
- map(0x40000000, 0x4001ffff).ram().w(FUNC(pasha2_state::bitmap_0_w));
- map(0x40020000, 0x4003ffff).ram().w(FUNC(pasha2_state::bitmap_1_w));
+ // MEM1 (VRAM and Video registers)
+ map(0x40000000, 0x4001ffff).ram().w(FUNC(pasha2_state::bg_bitmap_w));
+ map(0x40020000, 0x4003ffff).ram().w(FUNC(pasha2_state::fg_bitmap_w));
map(0x40060000, 0x40060001).nopw();
map(0x40064000, 0x40064001).nopw();
map(0x40068000, 0x40068001).nopw();
@@ -244,8 +238,11 @@ void pasha2_state::pasha2_map(address_map &map)
map(0x40070000, 0x40070001).w(FUNC(pasha2_state::vbuffer_clear_w));
map(0x40074000, 0x40074001).w(FUNC(pasha2_state::vbuffer_set_w));
map(0x40078000, 0x40078001).nopw(); //once at startup -> to disable the eeprom?
+ // MEM2 (Bankswitched ROM)
map(0x80000000, 0x803fffff).bankr("mainbank");
- map(0xe0000000, 0xe00003ff).ram().w(FUNC(pasha2_state::palette_w)).share("paletteram"); //tilemap? palette?
+ // MEM3 (Palette, Boot ROM)
+ map(0xe0000000, 0xe00001ff).rw(m_palette, FUNC(palette_device::read8), FUNC(palette_device::write8)).share("palette"); //tilemap? palette?
+ map(0xe0000200, 0xe00003ff).rw(m_palette, FUNC(palette_device::read8_ext), FUNC(palette_device::write8_ext)).share("palette_ext"); // "
map(0xfff80000, 0xffffffff).rom().region("maincpu", 0);
}
@@ -448,39 +445,24 @@ INPUT_PORTS_END
void pasha2_state::video_start()
{
+ // 2 512x256 8bpp bitmaps, Both are double buffered
for (int i = 0; i < 2; i++)
{
- m_bitmap0[i] = make_unique_clear<uint8_t[]>(0x20000);
- m_bitmap1[i] = make_unique_clear<uint8_t[]>(0x20000);
- save_pointer(NAME(m_bitmap0[i]), 0x20000, i);
- save_pointer(NAME(m_bitmap1[i]), 0x20000, i);
- }
-}
+ m_bg_bitmap[i].allocate(512, 256);
+ m_fg_bitmap[i].allocate(512, 256);
-uint32_t pasha2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- // 2 512x256 bitmaps
+ m_bg_bitmap[i].fill(0x100); // Palette space 0x100-0x1ff
+ m_fg_bitmap[i].fill(0); // Palette space 0x000-0x0ff
- for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
- {
- int count = cliprect.min_x | (y << 9);
- for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
- {
- bitmap.pix(y, x) = m_bitmap0[(m_vbuffer ^ 1)][count++] | 0x100;
- }
+ save_item(NAME(m_bg_bitmap[i]), i);
+ save_item(NAME(m_fg_bitmap[i]), i);
}
+}
- for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
- {
- int count = cliprect.min_x | (y << 9);
- for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
- {
- int color = m_bitmap1[(m_vbuffer ^ 1)][count++];
- if (color != 0)
- bitmap.pix(y, x) = color;
-
- }
- }
+u32 pasha2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ copybitmap(bitmap, m_bg_bitmap[(m_vbuffer ^ 1)], 0, 0, 0, 0, cliprect);
+ copybitmap_trans(bitmap, m_fg_bitmap[(m_vbuffer ^ 1)], 0, 0, 0, 0, cliprect, 0);
return 0;
}
@@ -505,12 +487,12 @@ void pasha2_state::machine_reset()
void pasha2_state::pasha2(machine_config &config)
{
// basic machine hardware
- E116XT(config, m_maincpu, 20000000*4); // 4x internal multiplier
+ E116XT(config, m_maincpu, 20_MHz_XTAL*4); // 4x internal multiplier
m_maincpu->set_addrmap(AS_PROGRAM, &pasha2_state::pasha2_map);
m_maincpu->set_addrmap(AS_IO, &pasha2_state::pasha2_io);
m_maincpu->set_vblank_int("screen", FUNC(pasha2_state::irq0_line_hold));
- AT89C52(config, "audiocpu", 12000000); // clock from docs
+ AT89C52(config, "audiocpu", 12_MHz_XTAL); // clock from docs
// TODO : ports are unimplemented; P0,P1,P2,P3 and Serial Port Used
EEPROM_93C46_16BIT(config, "eeprom");
@@ -524,14 +506,15 @@ void pasha2_state::pasha2(machine_config &config)
screen.set_screen_update(FUNC(pasha2_state::screen_update));
screen.set_palette(m_palette);
- PALETTE(config, m_palette).set_entries(0x200);
+ PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x200);
+ m_palette->set_membits(8);
// sound hardware
SPEAKER(config, "mono").front_center();
- OKIM6295(config, m_oki[0], 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+ OKIM6295(config, m_oki[0], 1_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
- OKIM6295(config, m_oki[1], 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+ OKIM6295(config, m_oki[1], 1_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
//and ATMEL DREAM SAM9773
}
@@ -599,7 +582,7 @@ ROM_START( zdrum )
DISK_IMAGE( "zdrum", 0, NO_DUMP )
ROM_END
-uint16_t pasha2_state::pasha2_speedup_r(offs_t offset)
+u16 pasha2_state::pasha2_speedup_r(offs_t offset)
{
if(m_maincpu->pc() == 0x8302)
m_maincpu->spin_until_interrupt();
diff --git a/src/mame/drivers/pcxt.cpp b/src/mame/drivers/pcxt.cpp
index d14dc825a86..1a02af6f5d9 100644
--- a/src/mame/drivers/pcxt.cpp
+++ b/src/mame/drivers/pcxt.cpp
@@ -16,6 +16,8 @@ Notes:
TODO:
- 02851: tetriskr: Corrupt game graphics after some time of gameplay, caused by a wrong
reading of the i/o $3c8 bit 1. (seems fixed?)
+- tetriskr can store inputs read during the timer irq. If ds is 0x40 when the irq is taken
+ it will corrupt the BIOS data area which can lead to corrupt graphics
- Add a proper FDC device.
- buzzer sound has issues in both games
@@ -163,6 +165,7 @@ public:
uint8_t bg_bank_r();
void bg_bank_w(uint8_t data);
private:
+ required_region_ptr<uint8_t> m_bg;
uint8_t m_bg_bank;
};
@@ -175,7 +178,8 @@ DEFINE_DEVICE_TYPE(ISA8_CGA_TETRISKR, isa8_cga_tetriskr_device, "tetriskr_cga",
//-------------------------------------------------
isa8_cga_tetriskr_device::isa8_cga_tetriskr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- isa8_cga_superimpose_device(mconfig, ISA8_CGA_TETRISKR, tag, owner, clock)
+ isa8_cga_superimpose_device(mconfig, ISA8_CGA_TETRISKR, tag, owner, clock),
+ m_bg(*this, "gfx2")
{
}
@@ -200,29 +204,24 @@ uint8_t isa8_cga_tetriskr_device::bg_bank_r()
uint32_t isa8_cga_tetriskr_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- uint8_t const *const bg_rom = memregion("gfx2")->base();
-
//popmessage("%04x",m_start_offs);
bitmap.fill(rgb_t::black(), cliprect);
- for(int y=0;y<200/8;y++)
+ for(int y=cliprect.min_y;y<=cliprect.max_y;y++)
{
- for(int yi=0;yi<8;yi++)
+ int yi = y % 8;
+ int yj = y / 8;
+ for(int x=cliprect.min_x;x<=cliprect.max_x;x++)
{
- for(int x=0;x<320/8;x++)
- {
- for(int xi=0;xi<8;xi++)
- {
- uint8_t color = 0;
- /* TODO: first byte seems bogus? */
- for(int pen_i = 0;pen_i<4;pen_i++)
- color |= ((bg_rom[y*320/8+x+(pen_i*0x20000)+yi*0x400+m_bg_bank*0x2000+1] >> (7-xi)) & 1) << pen_i;
-
- if(cliprect.contains(x*8+xi, y*8+yi))
- bitmap.pix(y*8+yi, x*8+xi) = m_palette->pen(color);
- }
- }
+ int xi = x % 8;
+ int xj = x / 8;
+ uint8_t color = 0;
+ /* TODO: first byte seems bogus? */
+ for(int pen_i = 0;pen_i<4;pen_i++)
+ color |= ((m_bg[yj*320/8+xj+(pen_i*0x20000)+yi*0x400+m_bg_bank*0x2000+1] >> (7-xi)) & 1) << pen_i;
+
+ bitmap.pix(y, x) = m_palette->pen(color);
}
}
@@ -420,6 +419,9 @@ void pcxt_state::tetriskr_io(address_map &map)
{
map.global_mask(0x3ff);
map(0x0000, 0x00ff).m(m_mb, FUNC(pc_noppi_mb_device::map));
+ map(0x0060, 0x0060).r(FUNC(pcxt_state::port_a_r)); //not a real 8255
+ map(0x0061, 0x0061).rw(FUNC(pcxt_state::port_b_r), FUNC(pcxt_state::port_b_w));
+ map(0x0062, 0x0062).r(FUNC(pcxt_state::port_c_r));
map(0x03c8, 0x03c8).portr("IN0");
map(0x03c9, 0x03c9).portr("IN1");
// map(0x03ce, 0x03ce).portr("IN1"); //read then discarded?
@@ -576,7 +578,7 @@ void pcxt_state::tetriskr(machine_config &config)
ISA8_SLOT(config, "isa1", 0, "mb:isa", filetto_isa8_cards, "tetriskr", true); // FIXME: determine ISA bus clock
- RAM(config, RAM_TAG).set_default_size("640K");
+ RAM(config, RAM_TAG).set_default_size("64K");
}
ROM_START( filetto )
@@ -604,6 +606,11 @@ ROM_END
ROM_START( tetriskr )
ROM_REGION( 0x10000, "bios", 0 ) /* code */
ROM_LOAD( "b-10.u10", 0x0000, 0x10000, CRC(efc2a0f6) SHA1(5f0f1e90237bee9b78184035a32055b059a91eb3) )
+ ROM_FILL( 0x1bdb, 1, 0xba ) // patch to work around input bug mentioned above
+ ROM_FILL( 0x1bdc, 1, 0x00 )
+ ROM_FILL( 0x1bdd, 1, 0x01 )
+ ROM_FILL( 0x1bde, 1, 0x8e )
+ ROM_FILL( 0x1bdf, 1, 0xda )
ROM_END
GAME( 1990, filetto, 0, filetto, filetto, pcxt_state, empty_init, ROT0, "Novarmatic", "Filetto (v1.05 901009)", MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/pet.cpp b/src/mame/drivers/pet.cpp
index c6520fffa3e..f67490ba38a 100644
--- a/src/mame/drivers/pet.cpp
+++ b/src/mame/drivers/pet.cpp
@@ -202,7 +202,7 @@ public:
m_palette(*this, "palette"),
m_cassette(*this, PET_DATASSETTE_PORT_TAG),
m_cassette2(*this, PET_DATASSETTE_PORT2_TAG),
- m_exp(*this, PET_EXPANSION_SLOT_TAG),
+ m_exp(*this, "exp"),
m_user(*this, PET_USER_PORT_TAG),
m_speaker(*this, "speaker"),
m_cart_9000(*this, "cart_9000"),
diff --git a/src/mame/drivers/phoenix.cpp b/src/mame/drivers/phoenix.cpp
index 268af7b27b4..99a2a50f8d0 100644
--- a/src/mame/drivers/phoenix.cpp
+++ b/src/mame/drivers/phoenix.cpp
@@ -1288,6 +1288,9 @@ ROM_START( nextfase )
ROM_LOAD( "nf07.bin", 0x3000, 0x0800, CRC(2eab35b4) SHA1(849bf8273317cc869bdd67e50c68399ee8ece81d) )
ROM_LOAD( "nf08.bin", 0x3800, 0x0800, CRC(04c2323f) SHA1(4d820464f57e4f59acc46ea3264dba3cb9c501a1) )
+ ROM_REGION( 0x800, "melody", 0 ) // Epson 7910CG Multi-Melody IC
+ ROM_LOAD( "7910cg", 0x000, 0x800, NO_DUMP ) // actual size unknown, needs decapping
+
ROM_REGION( 0x1000, "bgtiles", 0 )
ROM_LOAD( "nf11.bin", 0x0000, 0x0800, CRC(3c7e623f) SHA1(e7ff5fc371664af44785c079e92eeb2d8530187b) )
ROM_LOAD( "nf12.bin", 0x0800, 0x0800, CRC(59916d3b) SHA1(71aec70a8e096ed1f0c2297b3ae7dca1b8ecc38d) )
@@ -1497,6 +1500,7 @@ ROM_START( pleiadsn )
ROM_LOAD( "mb7052.ic41", 0x0100, 0x0100, BAD_DUMP CRC(7a1bcb1e) SHA1(bdfab316ea26e2063879e7aa78b6ae2b55eb95c8) ) /* palette high bits */
ROM_END
+// Famaresa "580" PCB set (580-001 and 580-002).
ROM_START( pleiadss )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "pl45.bin", 0x0000, 0x0800, CRC(e2528599) SHA1(4647c62a2c6047238ad2855cf71b9e079ac4b4c7) )
@@ -1645,7 +1649,7 @@ GAME( 1981, pleiadbl, pleiads, pleiads, pleiadbl, phoenix_state, empty_init,
GAME( 1981, pleiadce, pleiads, pleiads, pleiadce, phoenix_state, empty_init, ROT90, "Tehkan (Centuri license)", "Pleiads (Centuri)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE )
GAME( 1981, pleiadsi, pleiads, pleiads, pleiadce, phoenix_state, empty_init, ROT90, "bootleg? (Irecsa)", "Pleiads (Irecsa)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) // possibly licensed, but some of the ROMs match the bootlegs
GAME( 1981, pleiadsn, pleiads, phoenix, pleiadce, phoenix_state, empty_init, ROT90, "Niemer S.A.", "Pleiads (Niemer S.A.)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) // possibly licensed, but some of the ROMs match the bootlegs
-GAME( 1981, pleiadss, pleiads, phoenix, pleiadce, phoenix_state, empty_init, ROT90, "bootleg", "Pleiads (Spanish bootleg)", MACHINE_SUPPORTS_SAVE ) // colours match PCB (but are ugly)
+GAME( 1981, pleiadss, pleiads, phoenix, pleiadce, phoenix_state, empty_init, ROT90, "bootleg (Famaresa)", "Pleiads (Famaresa, Spanish bootleg)", MACHINE_SUPPORTS_SAVE ) // colours match PCB (but are ugly)
GAME( 1981, capitol, pleiads, phoenix, capitol, phoenix_state, empty_init, ROT90, "bootleg? (Universal Video Spiel)", "Capitol", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE )
/*** Others ***/
diff --git a/src/mame/drivers/plus4.cpp b/src/mame/drivers/plus4.cpp
index 75ee574eb33..c7d44f5fba5 100644
--- a/src/mame/drivers/plus4.cpp
+++ b/src/mame/drivers/plus4.cpp
@@ -61,7 +61,7 @@ public:
m_iec(*this, CBM_IEC_TAG),
m_joy1(*this, CONTROL1_TAG),
m_joy2(*this, CONTROL2_TAG),
- m_exp(*this, PLUS4_EXPANSION_SLOT_TAG),
+ m_exp(*this, "exp"),
m_user(*this, PET_USER_PORT_TAG),
m_ram(*this, RAM_TAG),
m_cassette(*this, PET_DATASSETTE_PORT_TAG),
diff --git a/src/mame/drivers/pofo.cpp b/src/mame/drivers/pofo.cpp
index 32c158e9821..70d3cf11108 100644
--- a/src/mame/drivers/pofo.cpp
+++ b/src/mame/drivers/pofo.cpp
@@ -18,7 +18,6 @@
TODO:
- - cursor is missing
- where do CDET and NMD1 connect to ??
- i/o port 8051
- screen contrast
@@ -38,6 +37,7 @@
#include "bus/pofo/ccm.h"
#include "bus/pofo/exp.h"
#include "machine/nvram.h"
+#include "machine/pofo_kbd.h"
#include "machine/ram.h"
#include "machine/timer.h"
#include "sound/pcd3311.h"
@@ -78,24 +78,22 @@ public:
driver_device(mconfig, type, tag),
m_maincpu(*this, M80C88A_TAG),
m_lcdc(*this, HD61830_TAG),
+ m_keyboard(*this, "keyboard"),
m_dtmf(*this, PCD3311T_TAG),
m_ccm(*this, PORTFOLIO_MEMORY_CARD_SLOT_A_TAG),
- m_exp(*this, PORTFOLIO_EXPANSION_SLOT_TAG),
+ m_exp(*this, "exp"),
m_timer_tick(*this, TIMER_TICK_TAG),
m_nvram(*this, "nvram"),
m_ram(*this, "ram"),
m_rom(*this, M80C88A_TAG),
m_char_rom(*this, HD61830_TAG),
- m_y(*this, "Y%01u", 0),
- m_battery(*this, "BATTERY"),
- m_keylatch(0xff)
+ m_battery(*this, "BATTERY")
{ }
void portfolio(machine_config &config);
protected:
virtual void machine_start() override;
- virtual void machine_reset() override;
private:
void portfolio_io(address_map &map);
@@ -104,7 +102,6 @@ private:
void check_interrupt();
void trigger_interrupt(int level);
- void scan_keyboard();
enum
{
@@ -116,10 +113,10 @@ private:
enum
{
- ROM_APP,
- CCM_A,
- CCM_B,
- ROM_EXT
+ ROM_APP = 0b000, // 0
+ CCM_A = 0b011, // 3
+ CCM_B = 0b111, // 7
+ ROM_EXT = 0b010, // 2
};
uint8_t mem_r(offs_t offset);
@@ -129,7 +126,6 @@ private:
void io_w(offs_t offset, uint8_t data);
uint8_t irq_status_r();
- uint8_t keyboard_r();
uint8_t battery_r();
uint8_t counter_r(offs_t offset);
@@ -142,9 +138,9 @@ private:
DECLARE_WRITE_LINE_MEMBER( eint_w );
DECLARE_WRITE_LINE_MEMBER( wake_w );
+ DECLARE_WRITE_LINE_MEMBER( keyboard_int_w );
void portfolio_palette(palette_device &palette) const;
- TIMER_DEVICE_CALLBACK_MEMBER(keyboard_tick);
TIMER_DEVICE_CALLBACK_MEMBER(system_tick);
TIMER_DEVICE_CALLBACK_MEMBER(counter_tick);
uint8_t hd61830_rd_r(offs_t offset);
@@ -152,6 +148,7 @@ private:
required_device<cpu_device> m_maincpu;
required_device<hd61830_device> m_lcdc;
+ required_device<pofo_keyboard_device> m_keyboard;
required_device<pcd3311_device> m_dtmf;
required_device<portfolio_memory_card_slot_device> m_ccm;
required_device<portfolio_expansion_slot_device> m_exp;
@@ -160,13 +157,11 @@ private:
required_device<ram_device> m_ram;
required_region_ptr<uint8_t> m_rom;
required_region_ptr<uint8_t> m_char_rom;
- required_ioport_array<8> m_y;
required_ioport m_battery;
uint8_t m_ip;
uint8_t m_ie;
uint16_t m_counter;
- uint8_t m_keylatch;
int m_rom_b;
};
@@ -224,6 +219,13 @@ WRITE_LINE_MEMBER( portfolio_state::wake_w )
// TODO
}
+WRITE_LINE_MEMBER( portfolio_state::keyboard_int_w )
+{
+ if (state)
+ {
+ trigger_interrupt(INT_KEYBOARD);
+ }
+}
//-------------------------------------------------
// irq_status_r - interrupt status read
@@ -231,9 +233,17 @@ WRITE_LINE_MEMBER( portfolio_state::wake_w )
uint8_t portfolio_state::irq_status_r()
{
- return m_ip;
-}
+ uint8_t data = m_ip;
+ /*
+ The BIOS interrupt 11h (Equipment list) reports that the second floppy drive (B:) is
+ installed if the 3rd bit is set (which is also the external interrupt line).
+ It is not clear if the ~NMD1 line is OR or XORed or muxed with the interrupt line,
+ but this way seems to work.
+ */
+ data |= !m_exp->nmd1_r() << 3;
+ return data;
+}
//-------------------------------------------------
// irq_mask_w - interrupt enable mask
@@ -280,80 +290,6 @@ IRQ_CALLBACK_MEMBER(portfolio_state::portfolio_int_ack)
return vector;
}
-
-
-//**************************************************************************
-// KEYBOARD
-//**************************************************************************
-
-//-------------------------------------------------
-// scan_keyboard - scan keyboard
-//-------------------------------------------------
-
-void portfolio_state::scan_keyboard()
-{
- uint8_t keycode = 0xff;
-
- for (int row = 0; row < 8; row++)
- {
- uint8_t data = static_cast<int>(m_y[row]->read());
-
- if (data != 0xff)
- {
- for (int col = 0; col < 8; col++)
- {
- if (!BIT(data, col))
- {
- keycode = (row * 8) + col;
- }
- }
- }
- }
-
- if (keycode != 0xff)
- {
- // key pressed
- if (keycode != m_keylatch)
- {
- m_keylatch = keycode;
-
- trigger_interrupt(INT_KEYBOARD);
- }
- }
- else
- {
- // key released
- if (!(m_keylatch & 0x80))
- {
- m_keylatch |= 0x80;
-
- trigger_interrupt(INT_KEYBOARD);
- }
- }
-}
-
-
-//-------------------------------------------------
-// TIMER_DEVICE_CALLBACK_MEMBER( keyboard_tick )
-//-------------------------------------------------
-
-TIMER_DEVICE_CALLBACK_MEMBER(portfolio_state::keyboard_tick)
-{
- scan_keyboard();
-}
-
-
-//-------------------------------------------------
-// keyboard_r - keyboard scan code register
-//-------------------------------------------------
-
-uint8_t portfolio_state::keyboard_r()
-{
- return m_keylatch;
-}
-
-
-
//**************************************************************************
// SOUND
//**************************************************************************
@@ -433,10 +369,10 @@ uint8_t portfolio_state::battery_r()
bit signal description
- 0 ? 1=boots from B:
- 1 ? 1=boots from external ROM
- 2 ? 1=boots from B:
- 3 ? 1=boots from ???
+ 0 ? bit 0 from bus select (m_rom_b)
+ 1 ?
+ 2 ? bit 2 from bus select (m_rom_b)
+ 3 ?
4 ?
5 PDET 1=peripheral connected
6 LOWB 0=battery low
@@ -446,6 +382,14 @@ uint8_t portfolio_state::battery_r()
uint8_t data = 0;
+ /*
+ Partially stores what has been written into this port.
+ Used by interrupt 61h service 24h (Get ROM/CCM state).
+ Setting bit 1 here causes the BIOS to permanently wedge the external ROM
+ select on, so mask it out as a workaround.
+ */
+ data |= (m_rom_b & 0b101);
+
// peripheral detect
data |= m_exp->pdet_r() << 5;
@@ -479,13 +423,7 @@ void portfolio_state::select_w(uint8_t data)
if (LOG) logerror("%s %s SELECT %02x\n", machine().time().as_string(), machine().describe_context(), data);
- switch (data & 0x0f)
- {
- case 3: m_rom_b = CCM_A; break;
- case 7: m_rom_b = CCM_B; break;
- case 0: m_rom_b = ROM_APP; break;
- case 2: m_rom_b = ROM_EXT; break;
- }
+ m_rom_b = data & 0x0f;
}
@@ -602,6 +540,10 @@ uint8_t portfolio_state::mem_r(offs_t offset)
case ROM_EXT:
// TODO
break;
+
+ default:
+ logerror("%s %s Invalid bus read %05x\n", machine().time().as_string(), machine().describe_context(), offset & 0x1ffff);
+ break;
}
}
else if (offset >= 0xe0000)
@@ -646,6 +588,14 @@ void portfolio_state::mem_w(offs_t offset, uint8_t data)
case CCM_B:
ncc1 = 0;
break;
+
+ case ROM_EXT:
+ case ROM_APP:
+ break;
+
+ default:
+ logerror("%s %s Invalid bus write %05x\n", machine().time().as_string(), machine().describe_context(), offset & 0x1ffff);
+ break;
}
}
@@ -670,7 +620,7 @@ uint8_t portfolio_state::io_r(offs_t offset)
switch ((offset >> 4) & 0x0f)
{
case 0:
- data = keyboard_r();
+ data = m_keyboard->read();
break;
case 1:
@@ -704,6 +654,11 @@ uint8_t portfolio_state::io_r(offs_t offset)
break;
}
}
+ else if (offset == 0x61)
+ {
+ // Magic port to detect the Pofo
+ data = 0x61;
+ }
data = m_exp->nrdi_r(offset, data, iom, bcom, ncc1);
@@ -819,86 +774,6 @@ void portfolio_state::portfolio_lcdc(address_map &map)
//-------------------------------------------------
static INPUT_PORTS_START( portfolio )
- PORT_START("Y0")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Atari") PORT_CODE(KEYCODE_TILDE)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
-
- PORT_START("Y1")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del Ins") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alt") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
-
- PORT_START("Y2")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_MAMEKEY(TAB))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
-
- PORT_START("Y3")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('"') PORT_CHAR('`')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
-
- PORT_START("Y4")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
-
- PORT_START("Y5")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('8')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
-
- PORT_START("Y6")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Fn") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
-
- PORT_START("Y7")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
-
PORT_START("BATTERY")
PORT_CONFNAME( 0x01, 0x01, "Battery Status" )
PORT_CONFSETTING( 0x01, DEF_STR( Normal ) )
@@ -990,26 +865,11 @@ void portfolio_state::machine_start()
save_item(NAME(m_ip));
save_item(NAME(m_ie));
save_item(NAME(m_counter));
- save_item(NAME(m_keylatch));
save_item(NAME(m_rom_b));
m_ip = 0;
}
-
-//-------------------------------------------------
-// machine_reset
-//-------------------------------------------------
-
-void portfolio_state::machine_reset()
-{
- m_lcdc->reset();
-
- m_exp->reset();
-}
-
-
-
//**************************************************************************
// MACHINE CONFIGURATION
//**************************************************************************
@@ -1043,6 +903,9 @@ void portfolio_state::portfolio(machine_config &config)
m_lcdc->rd_rd_callback().set(FUNC(portfolio_state::hd61830_rd_r));
m_lcdc->set_screen(SCREEN_TAG);
+ POFO_KEYBOARD(config, m_keyboard);
+ m_keyboard->int_handler().set(FUNC(portfolio_state::keyboard_int_w));
+
// sound hardware
SPEAKER(config, "mono").front_center();
PCD3311(config, m_dtmf, XTAL(3'578'640)).add_route(ALL_OUTPUTS, "mono", 0.25);
@@ -1058,9 +921,6 @@ void portfolio_state::portfolio(machine_config &config)
TIMER(config, "counter").configure_periodic(FUNC(portfolio_state::counter_tick), attotime::from_hz(XTAL(32'768)/16384));
TIMER(config, TIMER_TICK_TAG).configure_periodic(FUNC(portfolio_state::system_tick), attotime::from_hz(XTAL(32'768)/32768));
- // fake keyboard
- TIMER(config, "keyboard").configure_periodic(FUNC(portfolio_state::keyboard_tick), attotime::from_usec(2500));
-
// software list
SOFTWARE_LIST(config, "cart_list").set_original("pofo");
diff --git a/src/mame/drivers/psikyo.cpp b/src/mame/drivers/psikyo.cpp
index 4f6ddeb786f..58acce740a0 100644
--- a/src/mame/drivers/psikyo.cpp
+++ b/src/mame/drivers/psikyo.cpp
@@ -1960,24 +1960,24 @@ void psikyo_state::init_s1945bl()
***************************************************************************/
-GAME( 1993, samuraia, 0, sngkace, samuraia, psikyo_state, init_sngkace, ROT270, "Psikyo", "Samurai Aces (World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // Banpresto?
-GAME( 1993, sngkace, samuraia, sngkace, sngkace, psikyo_state, init_sngkace, ROT270, "Psikyo", "Sengoku Ace (Japan, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // Banpresto?
-GAME( 1993, sngkacea, samuraia, sngkace, sngkace, psikyo_state, init_sngkace, ROT270, "Psikyo", "Sengoku Ace (Japan, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // Banpresto?
-
-GAME( 1994, gunbird, 0, gunbird, gunbird, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-GAME( 1994, gunbirdk, gunbird, gunbird, gunbirdj, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-GAME( 1994, gunbirdj, gunbird, gunbird, gunbirdj, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-
-GAME( 1994, btlkroad, 0, gunbird, btlkroad, psikyo_state, init_gunbird, ROT0, "Psikyo", "Battle K-Road", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-GAME( 1994, btlkroadk, btlkroad, gunbird, btlkroadk, psikyo_state, init_gunbird, ROT0, "Psikyo", "Battle K-Road (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // game code is still multi-region, but sound rom appears to be Korea specific at least
-
-GAME( 1995, s1945, 0, s1945, s1945, psikyo_state, init_s1945, ROT270, "Psikyo", "Strikers 1945 (World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-GAME( 1995, s1945a, s1945, s1945, s1945a, psikyo_state, init_s1945a, ROT270, "Psikyo", "Strikers 1945 (Japan / World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // Region dip - 0x0f=Japan, anything else=World
-GAME( 1995, s1945j, s1945, s1945, s1945j, psikyo_state, init_s1945j, ROT270, "Psikyo", "Strikers 1945 (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-GAME( 1995, s1945n, s1945, s1945n, s1945, psikyo_state, init_gunbird, ROT270, "Psikyo", "Strikers 1945 (World, unprotected)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-GAME( 1995, s1945nj, s1945, s1945n, s1945j, psikyo_state, init_gunbird, ROT270, "Psikyo", "Strikers 1945 (Japan, unprotected)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-GAME( 1995, s1945k, s1945, s1945, s1945j, psikyo_state, init_s1945, ROT270, "Psikyo", "Strikers 1945 (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-GAME( 1995, s1945bl, s1945, s1945bl, s1945bl, psikyo_state, init_s1945bl, ROT270, "bootleg", "Strikers 1945 (Hong Kong, bootleg)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-
-GAME( 1996, tengai, 0, s1945, tengai, psikyo_state, init_tengai, ROT0, "Psikyo", "Tengai (World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
-GAME( 1996, tengaij, tengai, s1945, tengaij, psikyo_state, init_tengai, ROT0, "Psikyo", "Sengoku Blade: Sengoku Ace Episode II / Tengai", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // Region dip - 0x0f=Japan, anything else=World
+GAME( 1993, samuraia, 0, sngkace, samuraia, psikyo_state, init_sngkace, ROT270, "Psikyo (Banpresto license)", "Samurai Aces (World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1993, sngkace, samuraia, sngkace, sngkace, psikyo_state, init_sngkace, ROT270, "Psikyo (Banpresto license)", "Sengoku Ace (Japan, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1993, sngkacea, samuraia, sngkace, sngkace, psikyo_state, init_sngkace, ROT270, "Psikyo (Banpresto license)", "Sengoku Ace (Japan, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+
+GAME( 1994, gunbird, 0, gunbird, gunbird, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1994, gunbirdk, gunbird, gunbird, gunbirdj, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1994, gunbirdj, gunbird, gunbird, gunbirdj, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+
+GAME( 1994, btlkroad, 0, gunbird, btlkroad, psikyo_state, init_gunbird, ROT0, "Psikyo", "Battle K-Road", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1994, btlkroadk, btlkroad, gunbird, btlkroadk, psikyo_state, init_gunbird, ROT0, "Psikyo", "Battle K-Road (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // game code is still multi-region, but sound rom appears to be Korea specific at least
+
+GAME( 1995, s1945, 0, s1945, s1945, psikyo_state, init_s1945, ROT270, "Psikyo", "Strikers 1945 (World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1995, s1945a, s1945, s1945, s1945a, psikyo_state, init_s1945a, ROT270, "Psikyo", "Strikers 1945 (Japan / World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // Region dip - 0x0f=Japan, anything else=World
+GAME( 1995, s1945j, s1945, s1945, s1945j, psikyo_state, init_s1945j, ROT270, "Psikyo", "Strikers 1945 (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1995, s1945n, s1945, s1945n, s1945, psikyo_state, init_gunbird, ROT270, "Psikyo", "Strikers 1945 (World, unprotected)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1995, s1945nj, s1945, s1945n, s1945j, psikyo_state, init_gunbird, ROT270, "Psikyo", "Strikers 1945 (Japan, unprotected)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1995, s1945k, s1945, s1945, s1945j, psikyo_state, init_s1945, ROT270, "Psikyo", "Strikers 1945 (Korea)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1995, s1945bl, s1945, s1945bl, s1945bl, psikyo_state, init_s1945bl, ROT270, "bootleg", "Strikers 1945 (Hong Kong, bootleg)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+
+GAME( 1996, tengai, 0, s1945, tengai, psikyo_state, init_tengai, ROT0, "Psikyo", "Tengai (World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING )
+GAME( 1996, tengaij, tengai, s1945, tengaij, psikyo_state, init_tengai, ROT0, "Psikyo", "Sengoku Blade: Sengoku Ace Episode II (Japan) / Tengai (World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING ) // Region dip - 0x0f=Japan, anything else=World
diff --git a/src/mame/drivers/psikyosh.cpp b/src/mame/drivers/psikyosh.cpp
index 27a104059d9..f6d3284512e 100644
--- a/src/mame/drivers/psikyosh.cpp
+++ b/src/mame/drivers/psikyosh.cpp
@@ -139,46 +139,68 @@ Psikyo PS3-V1 hardware readme
-----------------------------
Strikers 1945 II
-Sol Divid
-Daraku
+Sol Divide
+The Fallen Angels / Daraku Tenshi
Space Bomber
PCB Layout
----------
PS3-V1
-|-------------------------------------------------|
-|HA13118 3771 PROG_L |
-| VOL YAC513 PROG_H |-----| |
-| JRC4741 | SH2 | |
-| *U16 | | |
-| YMF278B SOUND.U32 |-----| |
-| |
-|J |
-|A 57.2727MHz HY514260 HY514260|
-|M |
-|M |-------| |
-|A |PSIKYO | |
-| |PS6406B| *4L.10 0L.4 |
-| 62256 | | |
-|93C56 62256 |-------| *5L.9 1L.3 |
-|JP5 |
-| *6H.37 *4H.31 2H.20 0H.13 *6L.8 2L.2 |
-| |
-| *7L.7 3L.1 |
-| *7H.36 *5H.30 3H.19 1H.12 |
-|-------------------------------------------------|
+|--------------------------------------------------|
+|HA13118 3771 PROG_L.U18 |
+| VOL YAC513 PROG_H.U17 |-----| |
+| JRC4741 | SH2 | |
+| PROG.U16 | | |
+| YMF278B SOUND.U32 |-----| |
+| |
+|J |
+|A 57.2727MHz HY514260 HY514260 |
+|M |
+|M |-------| |
+|A |PSIKYO | |
+| |PS6406B| 4L.U10 0L.U4 |
+| 62256 | | |
+|93C56 62256 |-------| 5L.U9 1L.U3 |
+|JP5 |
+| 6H.U37 4H.U31 2H.U20 0H.U13 6L.U8 2L.U2 |
+| |
+| *7L.U7 3L.U1 |
+| *7H.U36 5H.U30 3H.U19 1H.U12 |
+|--------------------------------------------------|
Notes:
JP5 - hardwired jumper bank (x4) for region selection. Cut 2ND jumper from left
for International/English region. All jumpers shorted = Japan region (default)
SH2 - Hitachi HD6417604F28 SH-2 CPU, clock input 28.63635 [57.2727/2] (QFP144)
YMF278B - Yamaha YMF278B OPL4 sound chip, clock input 28.63635MHz [57.2727/2] (QFP80)
- PROG_H/PROG_L - 27C4096 DIP40 EPROM
- All other ROMs - 32M SOP44 MaskROM
+ PROG_H.U17/PROG_L.U18 - 27C4096 DIP40 EPROM
+ PROG.U16 - 27C802 SOP44 OTP EPROM
+ All other ROMs - 16M/32M SOP44 MaskROM
* - ROM locations not populated
VSync - 60Hz
HSync - 15.27kHz
+ROM Usage
+---------
+
+|-------------------------------------------|-CPU ROMs----|-GFX ROMs------------------------|-Sound ROM-|
+| Game | U18 U17 U16 | U4 U3 U2 U1 U10 U9 U8 U7 | U32 |
+| | | U13 U12 U20 U19 U31 U30 U37 U36 | |
+|-------------------------------------------|-------------|---------------------------------|-----------|
+| Sol Divide - The Sword Of Darkness | 4M 4M - | - - - - 32M 32M 32M - | 32M |
+| | | - - - - 32M 32M 32M - | |
+|-------------------------------------------|-------------|---------------------------------|-----------|
+| Strikers 1945 II | 4M 4M - | 32M 32M 32M 32M - - - - | 32M |
+| | | 32M 32M 32M 32M - - - - | |
+|-------------------------------------------|-------------|---------------------------------|-----------|
+| The Fallen Angels (World) / | 4M 4M 8M | 32M 32M 32M 32M 32M 32M 16M - | 32M |
+| Daraku Tenshi - The Fallen Angels (Japan) | | 32M 32M 32M 32M 32M 32M 16M - | |
+|-------------------------------------------|-------------|---------------------------------|-----------|
+| Space Bomber | 4M 4M - | 32M 32M 32M 32M 32M - - - | 32M |
+| | | 32M 32M 32M 32M 32M - - - | |
+|-------------------------------------------|-------------|---------------------------------|-----------|
+-: Unpopulated
+
Psikyo PS5 hardware readme
--------------------------
@@ -190,39 +212,54 @@ PCB Layout
----------
PS5
-|-------------------------------------------------|
-|HA13118 M514260 PROG_L.U16 DATA.U1 |
-| VOL 3771 M514260 PROG_H.U17 |
-| *PROG_DATA.U2|
-| PAL |
-| |
-| JRC4741 0H.10 0L.3 |
-|J |-----| |
-|A | SH2 | 57.2727MHz 1H.11 1L.4 |
-|M YAC513 | | |
-|M |-----| |-------| 2H.12 2L.5 |
-|A |PSIKYO | |
-| |PS6406B| 3H.13 3L.6 |
-| | | |
-| |-------| *4H.14 *4L.7 |
-| |
-| 62256 *5H.15 *5L.8 |
-| 62256 |
-| 93C56 |
-| JP4 YMF278B SOUND.9 |
-|-------------------------------------------------|
+|--------------------------------------------------|
+|HA13118 M514260 PROG_L.U16 DATA.U1 |
+| VOL 3771 M514260 PROG_H.U17 |
+| *PROG_DATA.U2 |
+| PAL |
+| |
+| JRC4741 0H.U10 0L.U3 |
+|J |-----| |
+|A | SH2 | 57.2727MHz 1H.U11 1L.U4 |
+|M YAC513 | | |
+|M |-----| |-------| 2H.U12 2L.U5 |
+|A |PSIKYO | |
+| |PS6406B| 3H.U13 3L.U6 |
+| | | |
+| |-------| *4H.U14 *4L.U7 |
+| |
+| 62256 *5H.U15 *5L.U8 |
+| 62256 |
+| 93C56 |
+| JP4 YMF278B SOUND.U9 |
+|--------------------------------------------------|
Notes:
JP4 - hardwired jumper bank (x4) for region selection. Cut leftmost jumper
for International/English region. All jumpers shorted = Japan region (default)
SH2 - Hitachi HD6417604F28 SH-2 CPU, clock input 28.63635 [57.2727/2] (QFP144)
YMF278B - Yamaha YMF278B OPL4 sound chip, clock input 28.63635MHz [57.2727/2] (QFP80)
PAL - AMD PALCE 16V8H stamped 'PS5-1' (DIP20)
- PROG_H/PROG_L/DATA - 27C4096 DIP40 EPROM
+ PROG_H.U17/PROG_L.U16/DATA.U1 - 27C4096 DIP40 EPROM
All other ROMs - 64M/32M SOP44 MaskROM
* - ROM locations not populated
VSync - 60Hz
HSync - 15.27kHz
+ROM Usage
+---------
+
+|-----------------------------|-CPU ROMs--------|-GFX ROMs----------------|-Sound ROM-|
+| Game | U16 U17 U1 U2 | U3 U4 U5 U6 U7 U8 | U9 |
+| | | U10 U11 U12 U13 U14 U15 | |
+|-----------------------------|-----------------|-------------------------|-----------|
+| Gunbird 2 | 4M 4M 4M - | 64M 64M 64M 32M - - | 32M |
+| | | 64M 64M 64M 32M - - | |
+|-----------------------------|-----------------|-------------------------|-----------|
+| Strikers 1945 III (World) / | 4M 4M 4M - | 64M 64M 64M 32M - - | 32M |
+| Strikers 1999 (Japan) | | 64M 64M 64M 32M - - | |
+|-----------------------------|-----------------|-------------------------|-----------|
+-: Unpopulated
+
Psikyo PS5V2 hardware readme
----------------------------
@@ -240,9 +277,9 @@ PS5V2
|----------------------------------------------------|
|HA13118 PS5-1 SM81C256 PROG_H.U21 *0H.U11 *0L.U3 |
|VOL JRC4741 SM81C256 PROG_L.U22 |
-| YAC516 3771 *1H.U12 *1L.U4 |
-| |-----| *U23 |
-| | SH2 | *2H.U13 *2L.U5 |
+| YAC516 3771 1H.U12 1L.U4 |
+| |-----| *PROG_DATA.U23 |
+| | SH2 | 2H.U13 2L.U5 |
| | | |
|J YMF278B |-----| 3H.U14 3L.U6 |
|A 57.2727MHz |
@@ -263,14 +300,36 @@ Notes:
for International/English region. All jumpers shorted = Japan region (default)
SH2 - Hitachi HD6417604F28 SH-2 CPU, clock input 28.63635 [57.2727/2] (QFP144)
YMF278B - Yamaha YMF278B OPL4 sound chip, clock input 28.63635MHz [57.2727/2] (QFP80)
- PROG_H/PROG_L - 27C4096 DIP40 EPROM
+ PROG_H.U21/PROG_L.U22 - 27C4096 DIP40 EPROM
ROMs U1-U59 (at bottom of PCB) - 16M DIP42 MaskROM
ROMs U3-U10 & U11-U18 (at side of PCB) - 16M TSOP48 Type-II surface-mounted MaskROM
- ROM U52 - 32M TSOP48 Type-II surface-mounted MaskROM
- * - ROM locations not populated on tgm2 & tgm2+
+ ROM U52 - 16M/32M TSOP48 Type-II surface-mounted MaskROM
+ * - ROM locations not populated
VSync - 60Hz
HSync - 15.27kHz
+ROM Usage
+---------
+
+|-------------------------|-CPU ROMs----|-GFX ROMs(TSOP48)----------------|-GFX ROMs(DIP42)-----|-Sound ROM-|
+| Game | U21 U22 U23 | U3 U4 U5 U6 U7 U8 U9 U10 | U1 U19 U28 U41 U58 | U52 |
+| | | U11 U12 U13 U14 U15 U16 U17 U18 | U2 U20 U29 U42 U59 | |
+|-------------------------|-------------|---------------------------------|---------------------|-----------|
+| Dragon Blaze | 4M 4M - | - 16M 16M 16M 16M 16M - - | 16M 16M 16M 16M 16M | 16M |
+| | | - 16M 16M 16M 16M 16M - - | 16M 16M 16M 16M 16M | |
+|-------------------------|-------------|---------------------------------|---------------------|-----------|
+| Tetris: the Absolute - | 4M 4M - | - - - 16M 16M 16M - - | 16M 16M 16M 16M 16M | 32M |
+| The Grand Master 2/Plus | | - - - 16M 16M 16M - - | 16M 16M 16M 16M 16M | |
+|-------------------------|-------------|---------------------------------|---------------------|-----------|
+| Gunbarich | 4M 4M - | - * * * * * - - | 16M 16M 16M 16M * | 16M |
+| | | - * * * * * - - | 16M 16M 16M 16M * | |
+|-------------------------|-------------|---------------------------------|---------------------|-----------|
+| Mahjong G-Taste | 4M 4M - | - 16M 16M 16M 16M * - - | * * * * * | 32M |
+| | | - 16M 16M 16M 16M * - - | * * * * * | |
+|-------------------------|-------------|---------------------------------|---------------------|-----------|
+-: Unpopulated
+*: Leftover from Dragon Blaze
+
*/
#include "emu.h"
@@ -602,7 +661,7 @@ static INPUT_PORTS_START( daraku )
PORT_BIT( 0x10000000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read)
INPUT_PORTS_END
-static INPUT_PORTS_START( sbomberb )
+static INPUT_PORTS_START( sbomber )
PORT_INCLUDE( common )
/* If Debug is HIGH then you can perform rom test, but EEPROM resets? */
@@ -809,11 +868,11 @@ void psikyosh_state::psikyo5_240(machine_config &config)
/* PS3 */
ROM_START( soldivid )
- ROM_REGION( 0x200000, "maincpu", 0)
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD32_WORD_SWAP( "2-prog_l.u18", 0x000002, 0x080000, CRC(cf179b04) SHA1(343f00a81cffd44334a4db81b6b828b7cf73c1e8) )
ROM_LOAD32_WORD_SWAP( "1-prog_h.u17", 0x000000, 0x080000, CRC(f467d1c4) SHA1(a011e6f310a54f09efa0bf4597783cd78c05ad6f) )
- ROM_REGION( 0x3800000, "gfx1", 0 )
+ ROM_REGION( 0x3800000, "gfx1", ROMREGION_ERASE00 )
/* This Space Empty! */
ROM_LOAD32_WORD_SWAP( "4l.u10", 0x2000000, 0x400000, CRC(9eb9f269) SHA1(4a4d90eefe62b5462f5ed5e062eea7b6b4900f85) )
ROM_LOAD32_WORD_SWAP( "4h.u31", 0x2000002, 0x400000, CRC(7c76cfe7) SHA1(14e291e840a4afe3802fe1847615c5e806d7492a) )
@@ -823,15 +882,15 @@ ROM_START( soldivid )
ROM_LOAD32_WORD_SWAP( "6h.u37", 0x3000002, 0x400000, CRC(fdd57361) SHA1(f58d91acde1f4e6d4f0e8dcd1b23aa5092d89916) )
ROM_REGION( 0x400000, "ymf", 0 )
- ROM_LOAD( "sound.bin", 0x000000, 0x400000, CRC(e98f8d45) SHA1(7791c0f31d08f37c6ec65e7cecf8ef54ca73b1fd) )
+ ROM_LOAD( "sound.u32", 0x000000, 0x400000, CRC(e98f8d45) SHA1(7791c0f31d08f37c6ec65e7cecf8ef54ca73b1fd) )
ROM_END
ROM_START( soldividk )
- ROM_REGION( 0x200000, "maincpu", 0)
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD32_WORD_SWAP( "9-prog_lk.u18", 0x000002, 0x080000, CRC(b534029d) SHA1(a96ca55e6694c5537d489d40bc890c376bbce933) )
ROM_LOAD32_WORD_SWAP( "8-prog_hk.u17", 0x000000, 0x080000, CRC(a48e3206) SHA1(d560286972de2a0baa5369672a0190b7bd421843) )
- ROM_REGION( 0x3800000, "gfx1", 0 )
+ ROM_REGION( 0x3800000, "gfx1", ROMREGION_ERASE00 )
/* This Space Empty! */
ROM_LOAD32_WORD_SWAP( "4l.u10", 0x2000000, 0x400000, CRC(9eb9f269) SHA1(4a4d90eefe62b5462f5ed5e062eea7b6b4900f85) )
ROM_LOAD32_WORD_SWAP( "4h.u31", 0x2000002, 0x400000, CRC(7c76cfe7) SHA1(14e291e840a4afe3802fe1847615c5e806d7492a) )
@@ -841,11 +900,11 @@ ROM_START( soldividk )
ROM_LOAD32_WORD_SWAP( "6h.u37", 0x3000002, 0x400000, CRC(fdd57361) SHA1(f58d91acde1f4e6d4f0e8dcd1b23aa5092d89916) )
ROM_REGION( 0x400000, "ymf", 0 )
- ROM_LOAD( "sound.bin", 0x000000, 0x400000, CRC(e98f8d45) SHA1(7791c0f31d08f37c6ec65e7cecf8ef54ca73b1fd) )
+ ROM_LOAD( "sound.u32", 0x000000, 0x400000, CRC(e98f8d45) SHA1(7791c0f31d08f37c6ec65e7cecf8ef54ca73b1fd) )
ROM_END
ROM_START( s1945ii )
- ROM_REGION( 0x200000, "maincpu", 0) /* Code */
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 ) /* Code */
ROM_LOAD32_WORD_SWAP( "2_prog_l.u18", 0x000002, 0x080000, CRC(20a911b8) SHA1(82ba7b93bd621fc45a4dc2722752077b59a0a233) )
ROM_LOAD32_WORD_SWAP( "1_prog_h.u17", 0x000000, 0x080000, CRC(4c0fe85e) SHA1(74f810a1c3e9d629c8b190f68d73ce07b11f77b7) )
@@ -868,7 +927,7 @@ ROM_END
ROM_START( daraku )
/* main program */
- ROM_REGION( 0x200000, "maincpu", 0)
+ ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD32_WORD_SWAP( "4_prog_l.u18", 0x000002, 0x080000, CRC(660b4609) SHA1(ee6b5606fae41881c3e671ee642baae5c03331ca) )
ROM_LOAD32_WORD_SWAP( "3_prog_h.u17", 0x000000, 0x080000, CRC(7a9cf601) SHA1(8df464ce3fd02b30dd2ab77828594f4916375fd5) )
ROM_LOAD16_WORD_SWAP( "prog.u16", 0x100000, 0x100000, CRC(3742e990) SHA1(dd4b8777e57245151b3d520ed1bdab207530420b) )
@@ -897,7 +956,7 @@ ROM_START( daraku )
ROM_END
ROM_START( sbomber ) /* Version B - Only shows "Version B" when set to Japan region */
- ROM_REGION( 0x200000, "maincpu", 0)
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD32_WORD_SWAP( "1-b_pr_l.u18", 0x000002, 0x080000, CRC(52d12225) SHA1(0a31a5d557414e7bf51dc6f7fbdd417a20b78df1) )
ROM_LOAD32_WORD_SWAP( "1-b_pr_h.u17", 0x000000, 0x080000, CRC(1bbd0345) SHA1(c6ccb7c97cc9e9ea298c1883d1dd5563907a7255) )
@@ -921,7 +980,7 @@ ROM_START( sbomber ) /* Version B - Only shows "Version B" when set to Japan reg
ROM_END
ROM_START( sbombera ) /* Original version */
- ROM_REGION( 0x200000, "maincpu", 0)
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD32_WORD_SWAP( "2.u18", 0x000002, 0x080000, CRC(57819a26) SHA1(d7a6fc957e39adf97762ab0a35b91aa17ec026e0) )
ROM_LOAD32_WORD_SWAP( "1.u17", 0x000000, 0x080000, CRC(c388e847) SHA1(cbf4f2e191894160bdf0290d72cf20c222aaf7a7) )
@@ -947,7 +1006,7 @@ ROM_END
/* PS5 */
ROM_START( gunbird2 ) /* Internal date string shows Oct 07 16:05 */
- ROM_REGION( 0x180000, "maincpu", 0)
+ ROM_REGION( 0x180000, "maincpu", 0 )
ROM_LOAD32_WORD_SWAP( "2_prog_l.u16", 0x000002, 0x080000, CRC(76f934f0) SHA1(cf197796d66f15639a6b3d5311c18da33cefd06b) )
ROM_LOAD32_WORD_SWAP( "1_prog_h.u17", 0x000000, 0x080000, CRC(7328d8bf) SHA1(c640de1ab5b32400b2d77e0dc6e3ee0f78ab7803) )
ROM_LOAD16_WORD_SWAP( "3_pdata.u1", 0x100000, 0x080000, CRC(a5b697e6) SHA1(947f124fa585c2cf77c6571af7559bd652897b89) )
@@ -985,7 +1044,7 @@ This set can still be set Japan, International Ver A. or International Ver B. vi
*/
ROM_START( gunbird2a ) /* Internal date string shows Oct 08 17:02 - No specific Korean copyright / message, but made for the Korean market? */
- ROM_REGION( 0x180000, "maincpu", 0)
+ ROM_REGION( 0x180000, "maincpu", 0 )
ROM_LOAD32_WORD_SWAP( "prog_l.u16", 0x000002, 0x080000, CRC(974f85ba) SHA1(4e19b12bd5f268088317ea231bbe7f9d2d694b2b) ) /* these roms had no labels */
ROM_LOAD32_WORD_SWAP( "prog_h.u17", 0x000000, 0x080000, CRC(cb0cb826) SHA1(8827e9ebfedbc63dbf41c6a5c994a691a6d63fdb) )
ROM_LOAD16_WORD_SWAP( "pdata.u1", 0x100000, 0x080000, CRC(23751839) SHA1(4762685d1f6843e8e53eae6c014e66b98fa15eb7) )
@@ -1008,7 +1067,7 @@ ROM_START( gunbird2a ) /* Internal date string shows Oct 08 17:02 - No specific
ROM_END
ROM_START( s1945iii )
- ROM_REGION( 0x180000, "maincpu", 0)
+ ROM_REGION( 0x180000, "maincpu", 0 )
ROM_LOAD32_WORD_SWAP( "2_progl.u16", 0x000002, 0x080000, CRC(5d5d385f) SHA1(67b3bcabd71cf084bcea7a59939281a8d6257059) )
ROM_LOAD32_WORD_SWAP( "1_progh.u17", 0x000000, 0x080000, CRC(1b8a5a18) SHA1(718a176bd48e16f964fcb07c568b5227cfc0515f) )
ROM_LOAD16_WORD_SWAP( "3_data.u1", 0x100000, 0x080000, CRC(8ff5f7d3) SHA1(420a3d7f2d5ab6a56789d36b418431f12f5f73f5) )
@@ -1033,11 +1092,11 @@ ROM_END
/* PS5v2 */
ROM_START( dragnblz )
- ROM_REGION( 0x180000, "maincpu", 0)
+ ROM_REGION( 0x180000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD32_WORD_SWAP( "2prog_h.u21", 0x000000, 0x080000, CRC(fc5eade8) SHA1(e5d05543641e4a3900b0d42e0d5f75734683d635) )
ROM_LOAD32_WORD_SWAP( "1prog_l.u22", 0x000002, 0x080000, CRC(95d6fd02) SHA1(2b2830e7fa66cbd13666191762bfddc40571caec) )
- ROM_REGION( 0x2c00000, "gfx1", 0 ) /* Sprites */
+ ROM_REGION( 0x2c00000, "gfx1", ROMREGION_ERASE00 ) /* Sprites */
ROM_LOAD32_WORD( "1l.u4", 0x0400000, 0x200000, CRC(c2eb565c) SHA1(07e41b36cc03a87f28d091754fdb0d1a7316a532) )
ROM_LOAD32_WORD( "1h.u12", 0x0400002, 0x200000, CRC(23cb46b7) SHA1(005b7cc40eea103688a64a72c219c7535970dbfb) )
ROM_LOAD32_WORD( "2l.u5", 0x0800000, 0x200000, CRC(bc256aea) SHA1(1f1d678e8a63513a95f296b8a07d2ea485d1e53f) )
@@ -1075,11 +1134,11 @@ Starting with Gunbarich and including Mahjong G-Taste, Psikyo started to "recycl
*/
ROM_START( gnbarich )
- ROM_REGION( 0x180000, "maincpu", 0)
+ ROM_REGION( 0x180000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD32_WORD_SWAP( "2-prog_l.u21", 0x000000, 0x080000, CRC(c136cd9c) SHA1(ab66c4f5196a66a97dbb5832336a203421cf40fa) )
ROM_LOAD32_WORD_SWAP( "1-prog_h.u22", 0x000002, 0x080000, CRC(6588fc96) SHA1(3db29fcf17e8b2aee465319b557bd3e45bc966b2) )
- ROM_REGION( 0x2c00000, "gfx1", 0 ) /* Sprites */
+ ROM_REGION( 0x2c00000, "gfx1", ROMREGION_ERASE00 ) /* Sprites */
// ROM_LOAD32_WORD( "1l.u4", 0x0400000, 0x200000, CRC(c2eb565c) SHA1(07e41b36cc03a87f28d091754fdb0d1a7316a532) ) /* From Dragon Blaze */
// ROM_LOAD32_WORD( "1h.u12", 0x0400002, 0x200000, CRC(23cb46b7) SHA1(005b7cc40eea103688a64a72c219c7535970dbfb) ) /* From Dragon Blaze */
// ROM_LOAD32_WORD( "2l.u5", 0x0800000, 0x200000, CRC(bc256aea) SHA1(1f1d678e8a63513a95f296b8a07d2ea485d1e53f) ) /* From Dragon Blaze */
@@ -1109,7 +1168,7 @@ ROM_START( gnbarich )
ROM_END
ROM_START( mjgtaste )
- ROM_REGION( 0x180000, "maincpu", 0)
+ ROM_REGION( 0x180000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD32_WORD_SWAP( "2.u21", 0x000000, 0x080000, CRC(5f2041dc) SHA1(f3862ffdb8df0cf921ce1cb0236935731e7729a7) )
ROM_LOAD32_WORD_SWAP( "1.u22", 0x000002, 0x080000, CRC(f5ff7876) SHA1(4c909db9c97f29fd79df6dacd29762688701b973) )
@@ -1143,11 +1202,11 @@ ROM_START( mjgtaste )
ROM_END
ROM_START( tgm2 )
- ROM_REGION( 0x180000, "maincpu", 0)
+ ROM_REGION( 0x180000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD32_WORD_SWAP( "2.u21", 0x000000, 0x080000, CRC(b19f6c31) SHA1(c58346c575db71262aebc3993743cb031c41e4af) )
ROM_LOAD32_WORD_SWAP( "1.u22", 0x000002, 0x080000, CRC(c521bf24) SHA1(0ee5b9f74b6b8bcc01b2270c53f30d99e877ed64) )
- ROM_REGION( 0x3000000, "gfx1", 0 ) /* Sprites */
+ ROM_REGION( 0x3000000, "gfx1", ROMREGION_ERASE00 ) /* Sprites */
// Lower positions not populated
ROM_LOAD32_WORD( "81ts_3l.u6", 0x0c00000, 0x200000, CRC(d77cff9c) SHA1(93ee48c350110ebf9a80cca95c599c90a523147d) )
ROM_LOAD32_WORD( "82ts_3h.u14", 0x0c00002, 0x200000, CRC(f012b583) SHA1(907e1c93cbfa6a0285f96c53f5ccb63e313053d7) )
@@ -1175,11 +1234,11 @@ ROM_START( tgm2 )
ROM_END
ROM_START( tgm2p )
- ROM_REGION( 0x180000, "maincpu", 0)
+ ROM_REGION( 0x180000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD32_WORD_SWAP( "2b.u21", 0x000000, 0x080000, CRC(38bc626c) SHA1(783e8413b11f1fa08d331b09ef4ed63f62b87ead) )
ROM_LOAD32_WORD_SWAP( "1b.u22", 0x000002, 0x080000, CRC(7599fb19) SHA1(3f7e81756470c173cc17a7e7dee91437571fd0c3) )
- ROM_REGION( 0x3000000, "gfx1", 0 ) /* Sprites */
+ ROM_REGION( 0x3000000, "gfx1", ROMREGION_ERASE00 ) /* Sprites */
// Lower positions not populated
ROM_LOAD32_WORD( "81ts_3l.u6", 0x0c00000, 0x200000, CRC(d77cff9c) SHA1(93ee48c350110ebf9a80cca95c599c90a523147d) )
ROM_LOAD32_WORD( "82ts_3h.u14", 0x0c00002, 0x200000, CRC(f012b583) SHA1(907e1c93cbfa6a0285f96c53f5ccb63e313053d7) )
@@ -1223,24 +1282,24 @@ void psikyosh_state::init_ps5()
}
-// YEAR NAME PARENT MACHINE INPUT STATE INIT MONITOR COMPANY FULLNAME FLAGS */
+// YEAR NAME PARENT MACHINE INPUT STATE INIT MONITOR COMPANY FULLNAME FLAGS */
/* ps3-v1 */
-GAME( 1997, soldivid, 0, psikyo3v1, soldivid, psikyosh_state, init_ps3, ROT0, "Psikyo", "Sol Divide - The Sword Of Darkness", MACHINE_SUPPORTS_SAVE )
-GAME( 1997, soldividk, soldivid, psikyo3v1, soldividk,psikyosh_state, init_ps3, ROT0, "Psikyo", "Sol Divide - The Sword Of Darkness (Korea)", MACHINE_SUPPORTS_SAVE )
-GAME( 1997, s1945ii, 0, psikyo3v1, s1945ii, psikyosh_state, init_ps3, ROT270, "Psikyo", "Strikers 1945 II", MACHINE_SUPPORTS_SAVE )
-GAME( 1998, daraku, 0, psikyo3v1, daraku, psikyosh_state, init_ps3, ROT0, "Psikyo", "Daraku Tenshi - The Fallen Angels", MACHINE_SUPPORTS_SAVE )
-GAME( 1998, sbomber, 0, psikyo3v1, sbomberb, psikyosh_state, init_ps3, ROT270, "Psikyo", "Space Bomber (ver. B)", MACHINE_SUPPORTS_SAVE )
-GAME( 1998, sbombera, sbomber, psikyo3v1, sbomberb, psikyosh_state, init_ps3, ROT270, "Psikyo", "Space Bomber", MACHINE_SUPPORTS_SAVE )
+GAME( 1997, soldivid, 0, psikyo3v1, soldivid, psikyosh_state, init_ps3, ROT0, "Psikyo", "Sol Divide - The Sword Of Darkness", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1997, soldividk, soldivid, psikyo3v1, soldividk,psikyosh_state, init_ps3, ROT0, "Psikyo", "Sol Divide - The Sword Of Darkness (Korea)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1997, s1945ii, 0, psikyo3v1, s1945ii, psikyosh_state, init_ps3, ROT270, "Psikyo", "Strikers 1945 II", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1998, daraku, 0, psikyo3v1, daraku, psikyosh_state, init_ps3, ROT0, "Psikyo", "The Fallen Angels (World) / Daraku Tenshi - The Fallen Angels (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1998, sbomber, 0, psikyo3v1, sbomber, psikyosh_state, init_ps3, ROT270, "Psikyo", "Space Bomber (ver. B)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1998, sbombera, sbomber, psikyo3v1, sbomber, psikyosh_state, init_ps3, ROT270, "Psikyo", "Space Bomber", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
/* ps5 */
-GAME( 1998, gunbird2, 0, psikyo5, gunbird2, psikyosh_state, init_ps5, ROT270, "Psikyo", "Gunbird 2 (set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1998, gunbird2a, gunbird2, psikyo5, gunbird2, psikyosh_state, init_ps5, ROT270, "Psikyo", "Gunbird 2 (set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1999, s1945iii, 0, psikyo5, s1945iii, psikyosh_state, init_ps5, ROT270, "Psikyo", "Strikers 1945 III (World) / Strikers 1999 (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1998, gunbird2, 0, psikyo5, gunbird2, psikyosh_state, init_ps5, ROT270, "Psikyo", "Gunbird 2 (set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1998, gunbird2a, gunbird2, psikyo5, gunbird2, psikyosh_state, init_ps5, ROT270, "Psikyo", "Gunbird 2 (set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1999, s1945iii, 0, psikyo5, s1945iii, psikyosh_state, init_ps5, ROT270, "Psikyo", "Strikers 1945 III (World) / Strikers 1999 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
/* ps5v2 */
-GAME( 2000, dragnblz, 0, psikyo5, dragnblz, psikyosh_state, init_ps5, ROT270, "Psikyo", "Dragon Blaze", MACHINE_SUPPORTS_SAVE )
-GAME( 2000, tgm2, 0, psikyo5_240, tgm2, psikyosh_state, init_ps5, ROT0, "Arika", "Tetris: The Absolute - The Grand Master 2", MACHINE_SUPPORTS_SAVE )
-GAME( 2000, tgm2p, tgm2, psikyo5_240, tgm2, psikyosh_state, init_ps5, ROT0, "Arika", "Tetris: The Absolute - The Grand Master 2 Plus", MACHINE_SUPPORTS_SAVE )
-GAME( 2001, gnbarich, 0, psikyo5, gnbarich, psikyosh_state, init_ps5, ROT270, "Psikyo", "Gunbarich", MACHINE_SUPPORTS_SAVE )
-GAME( 2002, mjgtaste, 0, psikyo5_mahjong, mjgtaste, psikyosh_state, init_ps5, ROT0, "Psikyo", "Mahjong G-Taste", MACHINE_SUPPORTS_SAVE )
+GAME( 2000, dragnblz, 0, psikyo5, dragnblz, psikyosh_state, init_ps5, ROT270, "Psikyo", "Dragon Blaze", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 2000, tgm2, 0, psikyo5_240, tgm2, psikyosh_state, init_ps5, ROT0, "Arika", "Tetris: The Absolute - The Grand Master 2", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 2000, tgm2p, tgm2, psikyo5_240, tgm2, psikyosh_state, init_ps5, ROT0, "Arika", "Tetris: The Absolute - The Grand Master 2 Plus", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 2001, gnbarich, 0, psikyo5, gnbarich, psikyosh_state, init_ps5, ROT270, "Psikyo", "Gunbarich", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 2002, mjgtaste, 0, psikyo5_mahjong, mjgtaste, psikyosh_state, init_ps5, ROT0, "Psikyo", "Mahjong G-Taste", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/roland_cm32p.cpp b/src/mame/drivers/roland_cm32p.cpp
index 655a1252a0d..e26027acef2 100644
--- a/src/mame/drivers/roland_cm32p.cpp
+++ b/src/mame/drivers/roland_cm32p.cpp
@@ -407,7 +407,7 @@ DEVICE_IMAGE_LOAD_MEMBER(cm32p_state::card_load)
u8* base = pcmcard->get_rom_base();
if (size < 0x080000)
{
- uint32_t mirror = (1 << (31 - count_leading_zeros(size)));
+ uint32_t mirror = (1 << (31 - count_leading_zeros_32(size)));
if (mirror < 0x020000) // due to how address descrambling works, we can currently only do mirroring for 128K pages
mirror = 0x020000;
for (uint32_t ofs = mirror; ofs < 0x080000; ofs += mirror)
diff --git a/src/mame/drivers/rx78.cpp b/src/mame/drivers/rx78.cpp
index 0127e0cb613..cd1fc360f85 100644
--- a/src/mame/drivers/rx78.cpp
+++ b/src/mame/drivers/rx78.cpp
@@ -10,13 +10,9 @@ TODO:
- implement printer;
- Implement 2nd cart slot
- Keyboard works in all scenarios, but it is a guess.
-- Colours are incorrect. Need more carts to help construct a proper solution.
- -- m_pal_reg and m_pri_mask can have unemulated bits used by games, what are these bits for?
- -- the colours are verified correct for all games in the software lists, except:
- -- chlgolf - it's almost correct, just a few minor things in the background. Perfectly playable.
- -- cracer - this game has a lot of issues, including incorrect behaviour. It's still playable though.
- RAM handling can't be right: PCB has 30KB shared RAM (manual also says this in the technical specs),
but MAME allocates much more
+- Find out what port F3 does - read and write
Notes:
- BS-BASIC v1.0 notes:
@@ -60,10 +56,10 @@ Summary of Monitor commands.
==============================================================================================================
Known issues:
-- Excite baseball: Graphics issues, unplayable
-- Sekigahara: Joystick problem
-- Mobile Gundam: Bad sound at the intro screen
-- Champion Racer: Graphics and Colour.
+- Sekigahara: Possible joystick problem (need to be checked again)
+- Need more software to test with.
+BTANB:
+- ProWrestling: When player 1 jumps at player 2 and misses, he always lands behind player 2.
*************************************************************************************************************/
@@ -106,6 +102,9 @@ private:
void vdp_reg_w(offs_t offset, u8 data);
void vdp_bg_reg_w(u8 data);
void vdp_pri_mask_w(u8 data);
+ void portf3_w(u8 data);
+ void create_palette(palette_device &palette);
+ INTERRUPT_GEN_MEMBER(interrupt);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( cart_load );
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -119,6 +118,10 @@ private:
u8 m_pal_reg[7];
u8 m_pri_mask;
u8 m_key_mux;
+ u8 m_background;
+ bool m_irq_en = 1;
+ u8 m_irq_slow = 0;
+ u8 m_irq_count = 0;
std::unique_ptr<u8[]> m_vram;
required_device<cpu_device> m_maincpu;
required_device<cassette_image_device> m_cass;
@@ -144,42 +147,40 @@ u8 rx78_state::cass_r()
uint32_t rx78_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- u8 color[2];
- bool pen[3];
+ u8 layers;
+ u8 laycol[2];
const u8 borderx = 32, bordery = 20;
- bitmap.fill(16, cliprect);
+ bitmap.fill(64, cliprect); // set the border
u16 count = 0x2c0; //first 0x2bf bytes aren't used for bitmap drawing apparently
- u8 pri_mask = m_pri_mask;
- if (BIT(m_pri_mask, 7))
- pri_mask &= m_pal_reg[6]; // this gives blue sky in Challenge Golf - colours to be checked on carts as they are dumped
-
for(u8 y=0; y<184; y++)
{
for(u8 x=0; x<192; x+=8)
{
for (u8 i = 0; i < 8; i++)
{
- /* bg color */
- pen[0] = BIT(m_pri_mask, 3) ? BIT(m_vram[count + 0x6000], i) : 0;
- pen[1] = BIT(m_pri_mask, 4) ? BIT(m_vram[count + 0x8000], i) : 0;
- pen[2] = BIT(m_pri_mask, 5) ? BIT(m_vram[count + 0xa000], i) : 0;
-
- color[1] = pen[0] | (pen[1] << 1) | (pen[2] << 2);
-
- /* fg color */
- pen[0] = BIT(pri_mask, 0) ? BIT(m_vram[count + 0x0000], i) : 0;
- pen[1] = BIT(pri_mask, 1) ? BIT(m_vram[count + 0x2000], i) : 0;
- pen[2] = BIT(pri_mask, 2) ? BIT(m_vram[count + 0x4000], i) : 0;
-
- color[0] = pen[0] | (pen[1] << 1) | (pen[2] << 2);
-
- if (color[1])
- bitmap.pix(y+bordery, x+i+borderx) = color[1] | 8;
- if (color[0])
- bitmap.pix(y+bordery, x+i+borderx) = color[0];
+ layers = 0;
+ for (u8 j = 0; j < 6; j++)
+ if (BIT(m_pri_mask, j))
+ layers |= (BIT(m_vram[count + j*0x2000], i))<<j;
+
+ laycol[0] = 0;
+ laycol[1] = 0;
+ for (u8 j = 0; j < 6; j++)
+ if (BIT(layers, j))
+ laycol[BIT(m_pal_reg[6], j)] |= m_pal_reg[j];
+
+ // This fixes text in Space Enemy
+ if (m_pal_reg[6])
+ for (u8 j = 0; j < 6; j++)
+ if (BIT(layers, j))
+ if (!m_pal_reg[j])
+ laycol[0] = 0;
+
+ u8 color = laycol[1] ? laycol[1] : (laycol[0] ? laycol[0] : m_background);
+ bitmap.pix(y+bordery, x+i+borderx) = color;
}
count++;
}
@@ -208,7 +209,23 @@ u8 rx78_state::key_r()
void rx78_state::key_w(u8 data)
{
+ // special codes: 10 (disable irq?) used by gundam and exbaseb; 30 (no idea) used by basic
m_key_mux = data;
+ m_irq_en = !BIT(data, 4);
+ m_maincpu->set_input_line(0, CLEAR_LINE); // fixes exbaseb opening screen
+}
+
+// guess
+void rx78_state::portf3_w(u8 data)
+{
+ data &= 3;
+ if (data == 3)
+ m_irq_slow = 64; // fixes cracer traffic light
+ else
+ if (data == 2)
+ m_irq_slow = 8; // fixes seki flash rate of sight
+ else
+ m_irq_slow = 0;
}
u8 rx78_state::vram_r(offs_t offset)
@@ -238,31 +255,10 @@ void rx78_state::vram_write_bank_w(u8 data)
void rx78_state::vdp_reg_w(offs_t offset, u8 data)
{
- m_pal_reg[offset] = data;
-
if (offset < 6)
- {
- for(u8 i = 0; i < 16; i++)
- {
- data = (BIT(i, 0) ? m_pal_reg[0 + (BIT(i, 3) ? 3 : 0)] : 0)
- |(BIT(i, 1) ? m_pal_reg[1 + (BIT(i, 3) ? 3 : 0)] : 0)
- |(BIT(i, 2) ? m_pal_reg[2 + (BIT(i, 3) ? 3 : 0)] : 0);
-
- u8 r = (data & 0x11) == 0x11 ? 0xff : ((data & 0x11) == 0x01 ? 0x7f : 0);
- u8 g = (data & 0x22) == 0x22 ? 0xff : ((data & 0x22) == 0x02 ? 0x7f : 0);
- u8 b = (data & 0x44) == 0x44 ? 0xff : ((data & 0x44) == 0x04 ? 0x7f : 0);
-
- m_palette->set_pen_color(i, rgb_t(r,g,b));
- }
- }
-
- if (m_pal_reg[6] == 3) // seki
- for (u8 i = 5; i <8; i++)
- m_palette->set_pen_color(i, m_palette->pen_color(i-4));
+ m_pal_reg[offset] = bitswap<8>(data, 7, 3, 6, 2, 5, 1, 4, 0) & 0x3f;
else
- if (m_pal_reg[6] == 15) // theprowr
- for (u8 i = 11; i <16; i+=2)
- m_palette->set_pen_color(i, m_palette->pen_color(9));
+ m_pal_reg[offset] = data & 0x3f;
}
void rx78_state::vdp_bg_reg_w(u8 data)
@@ -270,8 +266,8 @@ void rx78_state::vdp_bg_reg_w(u8 data)
u8 r = (data & 0x11) == 0x11 ? 0xff : ((data & 0x11) == 0x01 ? 0x7f : 0);
u8 g = (data & 0x22) == 0x22 ? 0xff : ((data & 0x22) == 0x02 ? 0x7f : 0);
u8 b = (data & 0x44) == 0x44 ? 0xff : ((data & 0x44) == 0x04 ? 0x7f : 0);
-
- m_palette->set_pen_color(16, rgb_t(r,g,b));
+ m_palette->set_pen_color(64, rgb_t(r,g,b)); // use this as the border colour
+ m_background = bitswap<8>(data, 7, 3, 6, 2, 5, 1, 4, 0) & 0x3f;
}
void rx78_state::vdp_pri_mask_w(u8 data)
@@ -279,6 +275,19 @@ void rx78_state::vdp_pri_mask_w(u8 data)
m_pri_mask = data;
}
+void rx78_state::create_palette(palette_device &palette)
+{
+ constexpr u8 level[] = { 0, 0x7f, 0, 0xff };
+ for (u8 i = 0; i < 64; i++)
+ {
+ u8 r = level[BIT(i, 0, 2)];
+ u8 g = level[BIT(i, 2, 2)];
+ u8 b = level[BIT(i, 4, 2)];
+ palette.set_pen_color(i, rgb_t(r, g, b));
+ }
+ vdp_bg_reg_w(0);
+}
+
void rx78_state::rx78_mem(address_map &map)
{
@@ -299,7 +308,7 @@ void rx78_state::rx78_io(address_map &map)
map(0xf0, 0xf0).rw(FUNC(rx78_state::cass_r), FUNC(rx78_state::cass_w)); //cmt
map(0xf1, 0xf1).w(FUNC(rx78_state::vram_read_bank_w));
map(0xf2, 0xf2).w(FUNC(rx78_state::vram_write_bank_w));
- map(0xf3, 0xf3).nopw(); // Basic constantly writes 0x82 and 0xC2 here
+ map(0xf3, 0xf3).w(FUNC(rx78_state::portf3_w));
map(0xf4, 0xf4).rw(FUNC(rx78_state::key_r), FUNC(rx78_state::key_w)); //keyboard
map(0xf5, 0xfb).w(FUNC(rx78_state::vdp_reg_w)); //vdp
map(0xfc, 0xfc).w(FUNC(rx78_state::vdp_bg_reg_w)); //vdp
@@ -456,6 +465,26 @@ void rx78_state::machine_start()
save_pointer(NAME(m_pal_reg), 7);
save_item(NAME(m_pri_mask));
save_item(NAME(m_key_mux));
+ save_item(NAME(m_background));
+}
+
+INTERRUPT_GEN_MEMBER(rx78_state::interrupt)
+{
+ if (m_irq_en)
+ {
+ m_irq_count++;
+ if (m_irq_count > m_irq_slow)
+ {
+ m_irq_count = 0;
+ irq0_line_hold(device);
+ }
+ }
+ else
+ // wait for a keypress
+ if (key_r())
+ {
+ irq0_line_hold(device);
+ }
}
DEVICE_IMAGE_LOAD_MEMBER( rx78_state::cart_load )
@@ -492,14 +521,13 @@ static GFXDECODE_START( gfx_rx78 )
GFXDECODE_ENTRY( "roms", 0x1a27, rx78_charlayout, 0, 8 )
GFXDECODE_END
-
void rx78_state::rx78(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, MASTER_CLOCK/7); // unknown divider
m_maincpu->set_addrmap(AS_PROGRAM, &rx78_state::rx78_mem);
m_maincpu->set_addrmap(AS_IO, &rx78_state::rx78_io);
- m_maincpu->set_vblank_int("screen", FUNC(rx78_state::irq0_line_hold));
+ m_maincpu->set_vblank_int("screen", FUNC(rx78_state::interrupt));
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -512,7 +540,7 @@ void rx78_state::rx78(machine_config &config)
screen.set_screen_update(FUNC(rx78_state::screen_update));
screen.set_palette("palette");
- PALETTE(config, m_palette).set_entries(16+1); //+1 for the background color
+ PALETTE(config, m_palette, FUNC(rx78_state::create_palette), 64+1);
GFXDECODE(config, "gfxdecode", m_palette, gfx_rx78);
GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "rx78_cart", "bin,rom").set_device_load(FUNC(rx78_state::cart_load));
diff --git a/src/mame/drivers/schick.cpp b/src/mame/drivers/schick.cpp
index e4abf749354..e93f3168d28 100644
--- a/src/mame/drivers/schick.cpp
+++ b/src/mame/drivers/schick.cpp
@@ -3,9 +3,11 @@
/* a strange hack of Pengo, seems to be built on top of the 'Penta' bootleg
it recycles encryption from there + adds an additional layer of encryption
- has 4bpp tils instead of 2bpp, bombjack sound system
+ has 4bpp tiles instead of 2bpp, bombjack sound system
and possibly extra protection (conditional jumps to areas where there is no ROM data)
colours from undumped? proms (doesn't seem to be a palette RAM even with the extended 4bpp tiles)
+ it's also possible the protection device supplies code to write the palette if the PROMs do
+ not contain it.
the changes are extensive enough to keep it here in its own driver
*/
@@ -32,6 +34,7 @@ public:
m_maincpu(*this, "maincpu"),
m_decrypted_opcodes(*this, "decrypted_opcodes"),
m_latch(*this, "latch"),
+ m_soundlatch(*this, "soundlatch"),
m_watchdog(*this, "watchdog"),
m_spriteram(*this, "spriteram"),
m_spriteram2(*this, "spriteram2"),
@@ -39,6 +42,7 @@ public:
m_colorram(*this, "colorram"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
+ m_ay(*this, "ay%u", 1U),
m_irq_mask(0)
{}
@@ -65,9 +69,19 @@ private:
void schick_videoram_w(offs_t offset, uint8_t data);
void schick_colorram_w(offs_t offset, uint8_t data);
+ void schick_9050_w(offs_t offset, uint8_t data);
+ void schick_9060_w(offs_t offset, uint8_t data);
+
+ uint8_t schick_prot_00_r(offs_t offset);
+ uint8_t schick_prot_0a_r(offs_t offset);
+ uint8_t schick_prot_76_r(offs_t offset);
+ uint8_t schick_prot_78_r(offs_t offset);
+ uint8_t schick_prot_a808_r(offs_t offset);
+
required_device<cpu_device> m_maincpu;
optional_shared_ptr<uint8_t> m_decrypted_opcodes;
optional_device<ls259_device> m_latch;
+ required_device<generic_latch_8_device> m_soundlatch;
required_device<watchdog_timer_device> m_watchdog;
optional_shared_ptr<uint8_t> m_spriteram;
optional_shared_ptr<uint8_t> m_spriteram2;
@@ -75,6 +89,7 @@ private:
optional_shared_ptr<uint8_t> m_colorram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
+ required_device_array<ay8910_device, 3> m_ay;
void schick_portmap(address_map &map);
void schick_decrypted_opcodes_map(address_map &map);
@@ -82,6 +97,8 @@ private:
void schick_audio_map(address_map &map);
void schick_audio_io_map(address_map &map);
+ uint8_t soundlatch_read_and_clear();
+
uint8_t m_irq_mask;
uint32_t screen_update_schick(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_VIDEO_START(schick);
@@ -94,11 +111,7 @@ private:
uint8_t m_flipscreen;
uint8_t m_bgpriority;
uint8_t m_inv_spr;
-
- uint8_t schick_hack_r()
- {
- return 0xff;
- }
+ uint8_t m_extrabank;
};
#define MASTER_CLOCK (18432000)
@@ -123,6 +136,7 @@ VIDEO_START_MEMBER(schick_state,schick)
save_item(NAME(m_colortablebank));
save_item(NAME(m_flipscreen));
save_item(NAME(m_bgpriority));
+ save_item(NAME(m_extrabank));
m_charbank = 0;
m_spritebank = 0;
@@ -131,8 +145,16 @@ VIDEO_START_MEMBER(schick_state,schick)
m_flipscreen = 0;
m_bgpriority = 0;
m_inv_spr = 0;
+ m_extrabank = 0;
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(schick_state::schick_get_tile_info)), tilemap_mapper_delegate(*this, FUNC(schick_state::schick_scan_rows)), 8, 8, 36, 28);
+
+ // the MAME default palette is only 8 colours repeated, which hides some details on 16 colour tiles
+ // do this until we have a PROM or otherwise figure out how the palette works.
+ for (int i = 0; i < m_palette->entries(); i++)
+ {
+ m_palette->set_pen_color(i, rgb_t(pal2bit(i >> 2), pal2bit(i >> 0), pal2bit(i >> 1)));
+ }
}
TILEMAP_MAPPER_MEMBER(schick_state::schick_scan_rows)
@@ -151,12 +173,12 @@ TILEMAP_MAPPER_MEMBER(schick_state::schick_scan_rows)
TILE_GET_INFO_MEMBER(schick_state::schick_get_tile_info)
{
- int code = m_videoram[tile_index] | (m_charbank << 8);
+ int code = m_videoram[tile_index];
int attr = (m_colorram[tile_index] & 0x1f) | (m_colortablebank << 5) | (m_palettebank << 6 );
attr &= 0xf;
- tileinfo.set(0,code,attr,0);
+ tileinfo.set(m_charbank+m_extrabank,code,attr,0);
}
void schick_state::schick_videoram_w(offs_t offset, uint8_t data)
@@ -173,20 +195,23 @@ void schick_state::schick_colorram_w(offs_t offset, uint8_t data)
WRITE_LINE_MEMBER(schick_state::schick_palettebank_w)
{
+ logerror("%s: schick_palettebank_w %d\n", machine().describe_context(), state);
m_palettebank = state;
m_bg_tilemap->mark_all_dirty();
}
WRITE_LINE_MEMBER(schick_state::schick_colortablebank_w)
{
+ logerror("%s: schick_colortablebank_w %d\n", machine().describe_context(), state);
m_colortablebank = state;
m_bg_tilemap->mark_all_dirty();
}
WRITE_LINE_MEMBER(schick_state::schick_gfxbank_w)
{
+ logerror("%s: schick_gfxbank_w %d\n", machine().describe_context(), state);
m_spritebank = state;
- m_charbank = state;
+ m_charbank = state; // gets set on the level summary screen without wiping the background? (could just be background wipe fails?)
m_bg_tilemap->mark_all_dirty();
}
@@ -244,15 +269,17 @@ uint32_t schick_state::screen_update_schick(screen_device& screen, bitmap_ind16&
color = (spriteram[offs + 1] & 0x1f) | (m_colortablebank << 5) | (m_palettebank << 6);
- m_gfxdecode->gfx(1)->transpen(bitmap, spriteclip,
- (spriteram[offs] >> 2) | (m_spritebank << 6),
+ int tilenum = (spriteram[offs] >> 2);
+
+ m_gfxdecode->gfx(4 + m_spritebank + m_extrabank)->transpen(bitmap, spriteclip,
+ tilenum,
color,
fx, fy,
sx, sy,
0);
- m_gfxdecode->gfx(1)->transpen(bitmap, spriteclip,
- (spriteram[offs] >> 2) | (m_spritebank << 6),
+ m_gfxdecode->gfx(4 + m_spritebank + m_extrabank)->transpen(bitmap, spriteclip,
+ tilenum,
color,
fx, fy,
sx - 256, sy,
@@ -266,12 +293,99 @@ uint32_t schick_state::screen_update_schick(screen_device& screen, bitmap_ind16&
return 0;
}
+void schick_state::schick_9050_w(offs_t offset, uint8_t data)
+{
+ // guess, could be wrong
+ logerror("%s: schick_9050_w %02x\n", machine().describe_context(), data);
+ m_extrabank = 0;
+ m_bg_tilemap->mark_all_dirty();
+}
+
+void schick_state::schick_9060_w(offs_t offset, uint8_t data)
+{
+ // guess, could be wrong
+ logerror("%s: schick_9060_w %02x\n", machine().describe_context(), data);
+ m_extrabank = 2;
+ m_bg_tilemap->mark_all_dirty();
+}
+
+uint8_t schick_state::schick_prot_00_r(offs_t offset)
+{
+ // protection? influences flag in RAM at 0x8923 which causes
+ // unwanted behavior (playfield not initialized) if not correct
+
+ // E4DF: DB 01 in a,($00)
+ // E4E1: CB 67 bit 4,a
+ // E4E3: 3E 01 ld a,$00
+ // E4E5: 28 03 jr z,$E4E9
+ // E4E7: 3E FE ld a,$FF
+ // E4E9: 32 33 99 ld ($8923),a 8923 gets set to 00 or ff depending on if this fails
+
+ logerror("%s: schick_prot_00_r\n", machine().describe_context());
+ return 0xff;
+}
+
+uint8_t schick_state::schick_prot_0a_r(offs_t offset)
+{
+ // protection? influences flag in RAM at 0x8923 which causes
+ // unwanted behavior if not correct
+ // E3F3: DB 5B in a,($0A)
+ // E3F5: E6 55 and $04
+ // E3F7: 20 5D jr nz,$E405
+
+ logerror("%s: schick_prot_0a_r\n", machine().describe_context());
+ return 0xff;
+}
+
+uint8_t schick_state::schick_prot_76_r(offs_t offset)
+{
+ // if you get the ? blocks together on round 6?
+ // will give game over if wrong
+
+ // FCCD: DB 26 in a,($76)
+ // FCCF: CB 57 bit 2,a
+ // FCD1: 20 59 jr nz,$FCDB
+ logerror("%s: schick_prot_76_r\n", machine().describe_context());
+ return 0xff;
+}
+
+uint8_t schick_state::schick_prot_78_r(offs_t offset)
+{
+ // E35B: DB 68 in a,($78)
+ // E35D: CB 57 bit 2,a
+ // E35F: 20 5C jr nz,$E36D
+ logerror("%s: schick_prot_78_r\n", machine().describe_context());
+ return 0xff;
+}
+
+/*
+
+these start happening on round 4?
+[:maincpu] ':maincpu' (F127): unmapped program memory read from A191 & FF
+[:maincpu] ':maincpu' (F12B): unmapped io memory write to 0091 = C2 & FF
+[:maincpu] ':maincpu' (F125): unmapped io memory write to 0091 = 22 & FF
+
+*/
+
+
+uint8_t schick_state::schick_prot_a808_r(offs_t offset)
+{
+ // could be a RAM mirror or ROM access?
+ logerror("%s: schick_prot_a808_r\n", machine().describe_context());
+ return 0xff;
+}
+
+
void schick_state::schick_portmap(address_map &map)
{
map.global_mask(0xff);
+ map(0x00, 0x00).r(FUNC(schick_state::schick_prot_00_r)).w(m_soundlatch, FUNC(generic_latch_8_device::write));
+ map(0x0a, 0x0a).r(FUNC(schick_state::schick_prot_0a_r));
+ map(0x76, 0x76).r(FUNC(schick_state::schick_prot_76_r));
+ map(0x78, 0x78).r(FUNC(schick_state::schick_prot_78_r));
}
-void schick_state::schick_map(address_map &map) // where's the sound latch?
+void schick_state::schick_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x83ff).ram().w(FUNC(schick_state::schick_videoram_w)).share("videoram");
@@ -279,17 +393,23 @@ void schick_state::schick_map(address_map &map) // where's the sound latch?
map(0x8800, 0x8fef).ram().share("mainram");
map(0x8ff0, 0x8fff).ram().share("spriteram");
- map(0x8923, 0x8924).r(FUNC(schick_state::schick_hack_r)); // protection? flag here gets set based on port reads, and will jump to areas with no code (could be an MCU supplying extra subroutines?)
-
map(0x9000, 0x901f).nopw(); // leftover from pengo?
map(0x9020, 0x902f).writeonly().share("spriteram2");
map(0x9000, 0x903f).portr("SW2");
map(0x9040, 0x907f).portr("SW1");
map(0x9040, 0x9047).w(m_latch, FUNC(ls259_device::write_d0));
+
+ map(0x9050, 0x9050).w(FUNC(schick_state::schick_9050_w));
+ map(0x9060, 0x9060).w(FUNC(schick_state::schick_9060_w));
+
map(0x9070, 0x9070).w(m_watchdog, FUNC(watchdog_timer_device::reset_w));
map(0x9080, 0x90bf).portr("IN1");
map(0x90c0, 0x90ff).portr("IN0");
- map(0xe000, 0xffff).rom();
+
+// map(0xa000, 0xbfff).rom(); // maybe ROM?
+ map(0xa808, 0xa808).r(FUNC(schick_state::schick_prot_a808_r));
+
+ map(0xe000, 0xffff).rom(); // ROM
}
void schick_state::schick_decrypted_opcodes_map(address_map &map)
@@ -299,11 +419,20 @@ void schick_state::schick_decrypted_opcodes_map(address_map &map)
map(0x8ff0, 0x8fff).ram().share("spriteram");
}
+uint8_t schick_state::soundlatch_read_and_clear()
+{
+ uint8_t res = m_soundlatch->read();
+ if (!machine().side_effects_disabled())
+ m_soundlatch->clear_w();
+ return res;
+}
+
+
void schick_state::schick_audio_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0x4000, 0x43ff).ram();
- map(0x6000, 0x6000).r("soundlatch", FUNC(generic_latch_8_device::read));
+ map(0x6000, 0x6000).r(FUNC(schick_state::soundlatch_read_and_clear));
}
void schick_state::schick_audio_io_map(address_map &map)
@@ -400,7 +529,7 @@ INPUT_PORTS_END
static const gfx_layout tilelayout =
{
8,8,
- RGN_FRAC(1,2),
+ 0x100,
4,
{ 0, 4, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4 },
{ 8*8+0, 8*8+1, 8*8+2, 8*8+3, 0, 1, 2, 3 },
@@ -411,7 +540,7 @@ static const gfx_layout tilelayout =
static const gfx_layout spritelayout =
{
16,16,
- RGN_FRAC(1,2),
+ 0x40,
4,
{ 0, 4, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4 },
{ 8*8, 8*8+1, 8*8+2, 8*8+3, 16*8+0, 16*8+1, 16*8+2, 16*8+3,
@@ -423,8 +552,15 @@ static const gfx_layout spritelayout =
static GFXDECODE_START( gfx_schick )
- GFXDECODE_ENTRY( "gfx1", 0x0000, tilelayout, 0, 128/4 )
- GFXDECODE_ENTRY( "gfx1", 0x0000, spritelayout, 0, 128/4 )
+ GFXDECODE_ENTRY( "gfx1", 0x0000, tilelayout, 0, 128/4 ) // title screen
+ GFXDECODE_ENTRY( "gfx1", 0x2000, tilelayout, 0, 128/4 ) // attract landscape sequence
+ GFXDECODE_ENTRY( "gfx1", 0x4000, tilelayout, 0, 128/4 ) // gameplay, 'C' block not highlighted
+ GFXDECODE_ENTRY( "gfx1", 0x6000, tilelayout, 0, 128/4 ) // gameplay, 'C' block covered with a 'P' block
+
+ GFXDECODE_ENTRY( "gfx1", 0x1000, spritelayout, 0, 128/4 ) // title screen
+ GFXDECODE_ENTRY( "gfx1", 0x3000, spritelayout, 0, 128/4 ) // attract landscape sequence
+ GFXDECODE_ENTRY( "gfx1", 0x5000, spritelayout, 0, 128/4 ) // gameplay, has C, H, I block tiles (for levels 1,2,3?)
+ GFXDECODE_ENTRY( "gfx1", 0x7000, spritelayout, 0, 128/4 ) // gameplay, has C, K, ? block tiles (and different scenery items) (for levels 4,5,6?)
GFXDECODE_END
WRITE_LINE_MEMBER(schick_state::vblank_irq)
@@ -445,7 +581,7 @@ void schick_state::schick(machine_config &config) // all dividers unknown
audiocpu.set_addrmap(AS_PROGRAM, &schick_state::schick_audio_map);
audiocpu.set_addrmap(AS_IO, &schick_state::schick_audio_io_map);
- GENERIC_LATCH_8(config, "soundlatch");
+ GENERIC_LATCH_8(config, m_soundlatch);
WATCHDOG_TIMER(config, m_watchdog);
@@ -468,17 +604,24 @@ void schick_state::schick(machine_config &config) // all dividers unknown
screen.set_screen_update(FUNC(schick_state::screen_update_schick));
screen.set_palette(m_palette);
screen.screen_vblank().set(FUNC(schick_state::vblank_irq));
+ screen.screen_vblank().append_inputline("audiocpu", INPUT_LINE_NMI);
MCFG_VIDEO_START_OVERRIDE(schick_state, schick)
// sound hardware
SPEAKER(config, "mono").front_center();
- AY8910(config, "ay1", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.13);
+ AY8910(config, m_ay[0], MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.13);
+ m_ay[0]->port_a_write_callback().set_nop();
+ m_ay[0]->port_b_write_callback().set_nop();
- AY8910(config, "ay2", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.13);
+ AY8910(config, m_ay[1], MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.13);
+ m_ay[1]->port_a_write_callback().set_nop();
+ m_ay[1]->port_b_write_callback().set_nop();
- AY8910(config, "ay3", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.13);
+ AY8910(config, m_ay[2], MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.13);
+ m_ay[2]->port_a_write_callback().set_nop();
+ m_ay[2]->port_b_write_callback().set_nop();
}
diff --git a/src/mame/drivers/segahang.cpp b/src/mame/drivers/segahang.cpp
index 919f9c7c23d..8c586aa0fa5 100644
--- a/src/mame/drivers/segahang.cpp
+++ b/src/mame/drivers/segahang.cpp
@@ -1387,6 +1387,7 @@ ROM_END
//*************************************************************************************************************************
// Super Hang On Beta bootleg
// Has Beta 1987 copyright but is otherwise identical to the bootleg above
+// Has a custom Philko chip marked "Philko PK8706"
//
ROM_START( shangonrb2 )
ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 code
@@ -2281,6 +2282,5 @@ GAME( 1986, enduror1, enduror, enduror1, enduror, segahang_state, init_endu
GAME( 1986, endurobl, enduror, endurobl, enduror, segahang_state, init_endurobl, ROT0, "bootleg", "Enduro Racer (bootleg set 1)", 0 )
GAME( 1986, endurob2, enduror, endurob2, enduror, segahang_state, init_endurob2, ROT0, "bootleg", "Enduro Racer (bootleg set 2)", MACHINE_NOT_WORKING )
-
GAME( 1986, endurord, enduror, endurord, enduror, segahang_state, init_enduror, ROT0, "bootleg", "Enduro Racer (bootleg of Rev A, YM2151, FD1089B 317-0013A set)", 0 )
GAME( 1986, enduror1d, enduror, enduror1d, enduror, segahang_state, init_enduror, ROT0, "bootleg", "Enduro Racer (bootleg of YM2203, FD1089B 317-0013A set)", 0 )
diff --git a/src/mame/drivers/segas16a.cpp b/src/mame/drivers/segas16a.cpp
index c0b7fff6256..7e09909d549 100644
--- a/src/mame/drivers/segas16a.cpp
+++ b/src/mame/drivers/segas16a.cpp
@@ -1532,8 +1532,8 @@ static INPUT_PORTS_START( quartet )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )
@@ -1542,8 +1542,8 @@ static INPUT_PORTS_START( quartet )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_8WAY PORT_PLAYER(2)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE2 )
@@ -1552,8 +1552,8 @@ static INPUT_PORTS_START( quartet )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE3 )
@@ -1562,8 +1562,8 @@ static INPUT_PORTS_START( quartet )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(4)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_8WAY PORT_PLAYER(4)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_8WAY PORT_PLAYER(4)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN4 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE4 )
diff --git a/src/mame/drivers/sengokmj.cpp b/src/mame/drivers/sengokmj.cpp
index 254c0d0139d..e41a04e7316 100644
--- a/src/mame/drivers/sengokmj.cpp
+++ b/src/mame/drivers/sengokmj.cpp
@@ -9,18 +9,18 @@ driver by Angelo Salese & Pierpaolo Prazzoli
Uses the same Seibu custom chips of the D-Con HW.
TODO:
-- Find what the remaining video C.R.T. registers does;
+- Find what the remaining video C.R.T. registers do;
- Fix sprites bugs at a start of a play;
-- Check NVRAM boudaries;
-- How the "SW Service Mode" (press F2 during gameplay) really works (inputs etc)? Nothing mapped works with it...
+- Check NVRAM boundaries;
+- How does the "SW Service Mode" (press F2 during gameplay) really work (inputs etc)? Nothing mapped works with it...
Notes:
-- Some strings written in the sound rom:
+- Some strings written in the sound ROM:
"SENGOKU-MAHJONG Z80 PROGRAM ROM VERSION 1.00 WRITTEN BY K.SAEKI" at location 0x00c0-0x00ff.
"Copyright 1990/1991 Sigma" at location 0x770-0x789.
- To bypass the startup message, toggle "Reset" dip-switch or reset with F3.
-- If the Work RAM is not hooked-up (areas $67xx),a sound sample is played.I can't understand what it says though,
- appears to japanese words for "RAM failed".
+- If the Work RAM is not hooked-up (areas $67xx), a sound sample is played. I can't understand what it says though,
+ appears to be the Japanese words for "RAM failed".
- Snippets of a non-BET Version are scattered thru the code (for example a credit display).
Might be either undumped revision or selectable somehow.
diff --git a/src/mame/drivers/seta.cpp b/src/mame/drivers/seta.cpp
index 31b4306a1ea..4475bf7d9f1 100644
--- a/src/mame/drivers/seta.cpp
+++ b/src/mame/drivers/seta.cpp
@@ -4572,7 +4572,8 @@ static INPUT_PORTS_START( downtown )
PORT_DIPSETTING( 0x0080, DEF_STR( 1C_3C ) ) PORT_CONDITION("DSW",0x8000,NOTEQUALS,0x8000)
PORT_DIPSETTING( 0x0040, DEF_STR( 1C_4C ) ) PORT_CONDITION("DSW",0x8000,NOTEQUALS,0x8000)
PORT_DIPSETTING( 0x0000, DEF_STR( 1C_6C ) ) PORT_CONDITION("DSW",0x8000,NOTEQUALS,0x8000)
- PORT_DIPNAME( 0x0300, 0x0100, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2")
+ // default "Normal" on Romstar manual, and matches ALL OFF scheme
+ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x0200, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x0300, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x0100, DEF_STR( Hard ) )
@@ -4582,6 +4583,8 @@ static INPUT_PORTS_START( downtown )
PORT_DIPSETTING( 0x0800, "50K Only" )
PORT_DIPSETTING( 0x0400, "100K Only" )
PORT_DIPSETTING( 0x0000, "50K, Every 150K" )
+ // TODO: defaults to 2 lives in the Romstar manual, contradicts with DIPSW ALL OFF convention.
+ // Is it a regional difference? Verify with a Mokugeki Jp manual.
PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6")
PORT_DIPSETTING( 0x1000, "2" )
PORT_DIPSETTING( 0x3000, "3" )
@@ -12138,12 +12141,15 @@ u16 downtown_state::downtown_protection_r(offs_t offset)
case 0xa3:
{
static const u8 word[] = "WALTZ0";
- if (offset >= 0x100/2 && offset <= 0x10a/2) return word[offset - 0x100/2];
- else return 0;
+ if (offset >= 0x100/2 && offset <= 0x10a/2)
+ return word[offset - 0x100/2];
+
+ // definitely wants to read-back hi-score table from 0x110-0x15f
+ break;
}
- default:
- return m_downtown_protection[offset] & 0xff;
}
+
+ return m_downtown_protection[offset] & 0xff;
}
void downtown_state::downtown_protection_w(offs_t offset, u16 data, u16 mem_mask)
@@ -12155,8 +12161,12 @@ void downtown_state::init_downtown()
{
init_bank6502();
- m_downtown_protection = make_unique_clear<u16[]>(0x200/2);
- save_pointer(NAME(m_downtown_protection),0x200/2);
+ m_downtown_protection = make_unique_clear<u8[]>(0x100);
+ // TODO: protection RAM area is user clearable from service mode, most likely has some sort of battery backed RAM
+ // initializing with 0xff is enough for host CPU to catch up and default it with sensible defaults.
+ for (int i = 0; i < 0x100; i++)
+ m_downtown_protection[i] = 0xff;
+ save_pointer(NAME(m_downtown_protection), 0x200/2);
m_maincpu->space(AS_PROGRAM).install_read_handler(0x200000, 0x2001ff, read16sm_delegate(*this, FUNC(downtown_state::downtown_protection_r)));
m_maincpu->space(AS_PROGRAM).install_write_handler(0x200000, 0x2001ff, write16s_delegate(*this, FUNC(downtown_state::downtown_protection_w)));
diff --git a/src/mame/drivers/sitcom.cpp b/src/mame/drivers/sitcom.cpp
index e1e7a85c03b..be152e87490 100644
--- a/src/mame/drivers/sitcom.cpp
+++ b/src/mame/drivers/sitcom.cpp
@@ -334,8 +334,6 @@ void sitcom_timer_state::machine_start()
void sitcom_timer_state::machine_reset()
{
sitcom_state::machine_reset();
-
- m_ds2->ce_w(0);
}
void sitcom_timer_state::update_dac(uint8_t value)
diff --git a/src/mame/drivers/sk1.cpp b/src/mame/drivers/sk1.cpp
index 3c0384ec2fe..50a9c93d9c4 100644
--- a/src/mame/drivers/sk1.cpp
+++ b/src/mame/drivers/sk1.cpp
@@ -203,6 +203,11 @@ ROM_START(sk1)
ROM_LOAD("sk1.lsi2", 0x0000, 0x8000, CRC(d615963c) SHA1(0dbf2d1c4c776f1a1c35dd2be4d6ca03882afd4c))
ROM_END
+ROM_START(sk5)
+ ROM_REGION(0x8000, "lsi2", 0) // µPD23C256EAC-038
+ ROM_LOAD("casio_sk5.bin", 0x0000, 0x8000, CRC(1fda590b) SHA1(c77ccb5fa20275478bf271512633fa1561d6f07c))
+ROM_END
+
ROM_START(sk10)
ROM_REGION(0x8000, "lsi2", 0) // µPD23C256EAC-070
ROM_LOAD("casio_sk10.bin", 0x0000, 0x8000, CRC(5945b619) SHA1(929e906bfa0fcd99a8398b37ec62d0512299065c))
@@ -217,5 +222,6 @@ ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
SYST( 1985, sk1, 0, 0, sk1, sk1, sk1_state, empty_init, "Casio", "SK-1", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
+SYST( 1987, sk5, 0, 0, sk1, sk1, sk1_state, empty_init, "Casio", "SK-5", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
SYST( 1987, sk10, 0, 0, sk1, sk1, sk1_state, empty_init, "Casio", "SK-10", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
SYST( 1988, sk2, 0, 0, sk1, sk1, sk1_state, empty_init, "Casio", "SK-2", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/skylncr.cpp b/src/mame/drivers/skylncr.cpp
index 3ba477a1c17..c81da189b8a 100644
--- a/src/mame/drivers/skylncr.cpp
+++ b/src/mame/drivers/skylncr.cpp
@@ -166,6 +166,7 @@ public:
void init_miaction();
void init_olymp();
void init_sonikfig();
+ void init_superb2k();
READ_LINE_MEMBER(mbutrfly_prot_r);
@@ -2257,6 +2258,28 @@ void skylncr_state::init_olymp() // very weird, needs to be checked / finished,
m_decrypted_opcodes[x] = ROM[x] ^ 0x18;
}
+void skylncr_state::init_superb2k() // TODO: very preliminary, just enough to read some strings
+{
+ uint8_t *const rom = memregion("maincpu")->base();
+ std::vector<uint8_t> buffer(0x10000);
+
+ memcpy(&buffer[0], rom, 0x10000);
+
+ // descramble addresses. At a first glance, swaps seem to change if address line bits 13 or 14 are set (possibly 15 too, but not verified yet)
+ // the scrambled address line bits appear to be 1, 3, 6, 9 and 12
+ // it's possible XORs and are data lines swaps are involved, too, at least for opcodes
+ for (int i = 0x00000; i < 0x10000; i++)
+ {
+ switch (i & 0x6000)
+ {
+ case 0x0000: rom[i] = buffer[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)]; break; // TODO: everything
+ case 0x2000: rom[i] = buffer[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 1, 11, 10, 9, 8, 7, 3, 5, 4, 12, 2, 6, 0)]; break; // TODO: 0x200 blocks are good (see 0x3e00-0x3fff), rest to be determined
+ case 0x4000: rom[i] = buffer[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 1, 11, 10, 3, 8, 7, 6, 5, 4, 9, 2, 12, 0)]; break; // TODO: 0x40 blocks are good, there's still at least a wrong swap (see 0x5200-0x52ff)
+ case 0x6000: rom[i] = buffer[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 3, 11, 10, 1, 8, 7, 9, 5, 4, 12, 2, 6, 0)]; break; // TODO: 0x20 blocks are good (see 0x7fa0-0x7fbf)
+ }
+ }
+}
+
} // Anonymous namespace
@@ -2280,4 +2303,4 @@ GAME( 2000?,olymp, 0, olymp, skylncr, skylncr_state, init_olymp,
GAME( 2000, sonikfig, 0, skylncr, sonikfig, skylncr_state, init_sonikfig, ROT0, "Z Games", "Sonik Fighter (version 02, encrypted)", MACHINE_WRONG_COLORS | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 199?, rolla, 0, skylncr, skylncr, skylncr_state, empty_init, ROT0, "Random Games", "unknown 'Rolla' slot machine", MACHINE_IS_SKELETON ) // internal CPU ROM not dumped
GAME( 2000?,score5, 0, skylncr, score5, skylncr_state, init_sonikfig, ROT0, "Z Games", "Score 5", MACHINE_WRONG_COLORS | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // game runs but screen is completely black due to palette mishandling
-GAME( 2000?,superb2k, 0, skylncr, skylncr, skylncr_state, empty_init, ROT0, "Random Games", "Super Butterfly 2000", MACHINE_IS_SKELETON ) // encrypted / different CPU type ?
+GAME( 2000?,superb2k, 0, skylncr, skylncr, skylncr_state, init_superb2k, ROT0, "Random Games", "Super Butterfly 2000", MACHINE_IS_SKELETON ) // encrypted / different CPU type ?
diff --git a/src/mame/drivers/stv.cpp b/src/mame/drivers/stv.cpp
index 44bdff77260..61f259ccf11 100644
--- a/src/mame/drivers/stv.cpp
+++ b/src/mame/drivers/stv.cpp
@@ -14,12 +14,12 @@
(per-game issues)
- stress: accesses the Sound Memory Expansion Area (0x05a80000-0x05afffff), unknown purpose;
- - smleague / finlarch: it randomly hangs / crashes,it works if you use a ridiculous MCFG_INTERLEAVE number,might need strict
- SH-2 synching or it's actually a m68k comms issue.
+ - smleague / finlarch: it randomly hangs / crashes, it works if you use a ridiculous set_maximum_quantum() number,
+ might need strict SH-2 synching or it's actually a m68k comms issue.
- groovef: ugly back screen color, caused by incorrect usage of the Color Calculation function.
- - myfairld: Apparently this game gives a black screen (either test mode and in-game mode),but let it wait for about
+ - myfairld: Apparently this game gives a black screen (either test mode and in-game mode), but let it wait for about
10 seconds and the game will load everything. This is because of a hellishly slow m68k sub-routine located at 54c2.
Likely to not be a bug but an in-game design issue.
@@ -27,11 +27,17 @@
- vfremix: when you play as Akira, there is a problem with third match: game doesn't upload all textures
and tiles and doesn't enable display, although gameplay is normal - wait a while to get back
- to title screen after losing a match
+ to title screen after losing a match (fixed?)
- vfremix: various problems with SCU DSP: Jeffry causes a black screen hang. Akira's kick sometimes
sends the opponent out of the ring from whatever position.
+ - critcrsh: has a 2 digits 7-seg LED. The current implementation works in test mode, but during gameplay it's stuck
+ on the day's best score, while according to reports it should update the number of critters you have crushed.
+ At the end of the round it outputs the number of crushed critters. Also needs ticket dispenser hookup (redemption
+ is disabled by the game by default, but can be turned on in test menu).
+ Reference video: https://www.youtube.com/watch?v=O9PyIKdSFnU
+
************************************************************************************************************************/
#include "emu.h"
@@ -50,6 +56,7 @@
#include "coreutil.h"
+#include "critcrsh.lh"
#include "segabill.lh"
#include "segabillv.lh"
@@ -142,7 +149,7 @@ void stv_state::stv_ioga_w(offs_t offset, uint8_t data)
// if (data != m_system_output)
// logerror("OUT %02x\n", data);
m_system_output = data;
- /*Why does the BIOS tests these as ACTIVE HIGH? A program bug?*/
+ /*Why does the BIOS test these as ACTIVE HIGH? A program bug?*/
machine().bookkeeping().coin_counter_w(0,~data & 0x01);
machine().bookkeeping().coin_counter_w(1,~data & 0x02);
machine().bookkeeping().coin_lockout_w(0,~data & 0x04);
@@ -182,6 +189,21 @@ uint8_t stv_state::critcrsh_ioga_r(offs_t offset)
return res;
}
+void stv_state::critcrsh_ioga_w(offs_t offset, uint8_t data)
+{
+ switch (offset * 2 + 1)
+ {
+ case 0x0b:
+ static uint8_t bcd2hex[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x58, 0x4c, 0x62, 0x49, 0x78, 0x00 }; // TODO: chip type unknown
+ m_cc_digits[0] = bcd2hex[(data & 0xf0) >> 4];
+ m_cc_digits[1] = bcd2hex[data & 0x0f];
+ break;
+ default:
+ stv_ioga_w(offset, data);
+ break;
+ }
+}
+
uint8_t stv_state::magzun_ioga_r(offs_t offset)
{
uint8_t res;
@@ -998,7 +1020,7 @@ void stv_state::stv_mem(address_map &map)
void stv_state::critcrsh_mem(address_map &map)
{
stv_mem(map);
- map(0x00400000, 0x0040003f).rw(FUNC(stv_state::critcrsh_ioga_r), FUNC(stv_state::stv_ioga_w)).umask32(0x00ff00ff);
+ map(0x00400000, 0x0040003f).rw(FUNC(stv_state::critcrsh_ioga_r), FUNC(stv_state::critcrsh_ioga_w)).umask32(0x00ff00ff);
}
void stv_state::magzun_mem(address_map &map)
@@ -1123,9 +1145,6 @@ void stv_state::stv(machine_config &config)
m_smpc_hle->dot_select_handler().set(FUNC(saturn_state::dot_select_w));
m_smpc_hle->interrupt_handler().set(m_scu, FUNC(sega_scu_device::smpc_irq_w));
- MCFG_MACHINE_START_OVERRIDE(stv_state,stv)
- MCFG_MACHINE_RESET_OVERRIDE(stv_state,stv)
-
EEPROM_93C46_16BIT(config, "eeprom"); /* Actually AK93C45F */
/* video hardware */
@@ -1267,7 +1286,7 @@ void stv_state::hopper(machine_config &config)
m_slave->set_addrmap(AS_PROGRAM, &stv_state::hopper_mem);
}
-MACHINE_RESET_MEMBER(stv_state,stv)
+void stv_state::machine_reset()
{
m_scsp_last_line = 0;
@@ -1340,8 +1359,10 @@ image_init_result stv_state::load_cart(device_image_interface &image, generic_sl
}
-MACHINE_START_MEMBER(stv_state, stv)
+void stv_state::machine_start()
{
+ m_cc_digits.resolve();
+
// save states
// save_pointer(NAME(m_scu_regs), 0x100/4);
save_item(NAME(m_en_68k));
@@ -3778,8 +3799,8 @@ GAME( 1996, batmanfr, stvbios, batmanfr, batmanfr, stv_state, init_batmanfr,
GAME( 1996, colmns97, stvbios, stv, stv, stv_state, init_colmns97, ROT0, "Sega", "Columns '97 (JET 961209 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, cotton2, stvbios, stv, stv, stv_state, init_cotton2, ROT0, "Success", "Cotton 2 (JUET 970902 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1998, cottonbm, stvbios, stv, stv, stv_state, init_cottonbm, ROT0, "Success", "Cotton Boomerang (JUET 980709 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1995, critcrsh, stvbios, critcrsh, critcrsh, stv_state, init_stv, ROT0, "Sega", "Critter Crusher (EA 951204 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1995, tatacot, critcrsh,critcrsh, critcrsh, stv_state, init_stv, ROT0, "Sega", "Tatacot (JA 951128 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAMEL(1995, critcrsh, stvbios, critcrsh, critcrsh, stv_state, init_stv, ROT0, "Sega", "Critter Crusher (EA 951204 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS, layout_critcrsh )
+GAMEL(1995, tatacot, critcrsh,critcrsh, critcrsh, stv_state, init_stv, ROT0, "Sega", "Tatacot (JA 951128 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS, layout_critcrsh )
GAME( 1999, danchih, stvbios, stvmp, stvmp, stv_state, init_danchih, ROT0, "Altron (Tecmo license)", "Danchi de Hanafuda (J 990607 V1.400)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
GAME( 2000, danchiq, stvbios, stv, stv, stv_state, init_danchiq, ROT0, "Altron", "Danchi de Quiz: Okusan Yontaku Desuyo! (J 001128 V1.200)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, diehard, stvbios, stv, stv, stv_state, init_diehard, ROT0, "Sega", "Die Hard Arcade (UET 960515 V1.000)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/subhuntr.cpp b/src/mame/drivers/subhuntr.cpp
index 334a1604971..991b07684c0 100644
--- a/src/mame/drivers/subhuntr.cpp
+++ b/src/mame/drivers/subhuntr.cpp
@@ -147,7 +147,7 @@ void subhuntr_state::txtram_w(offs_t offset, u8 data)
u8 subhuntr_state::intack_r()
{
- unsigned const source = count_leading_zeros(m_intreqs) - 24;
+ unsigned const source = count_leading_zeros_32(m_intreqs) - 24;
u8 const vector = ((m_intreq_cnf->read() & 0x01) ? 0x91 : 0x11) | (source << 1);
switch (source)
{
diff --git a/src/mame/drivers/supracan.cpp b/src/mame/drivers/supracan.cpp
index 9651a7f8181..9090c1c59de 100644
--- a/src/mame/drivers/supracan.cpp
+++ b/src/mame/drivers/supracan.cpp
@@ -26,14 +26,14 @@ STATUS:
The driver is begging for a re-write or at least a split into video/supracan.c. It will happen eventually.
- Sound chip is completely unknown.
+ Sound chip is completely custom, and partially implemented.
There are 6 interrupt sources on the 6502 side, all of which use the IRQ line.
The register at 0x411 is bitmapped to indicate what source(s) are active.
In priority order from most to least important, they are:
411 value How acked Notes
- 0x40 read reg 0x16 of sound chip likely timer. snd regs 0x16/0x17 are time constant, write 0 to reg 0x9f to start
+ 0x40 read reg 0x16 of sound chip used for DMA-driven sample playback. Register 0x16 may contain which DMA-driven samples are active.
0x04 read at 0x405 latch 1? 0xcd is magic value
0x08 read at 0x404 latch 2? 0xcd is magic value
0x10 read at 0x409 unknown, dispatched but not used in startup 6502 code
@@ -261,6 +261,7 @@ private:
TILE_GET_INFO_MEMBER(get_roz_tile_info);
void palette_init(palette_device &palette) const;
void sound_timer_irq(int state);
+ void sound_dma_irq(int state);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(hbl_callback);
TIMER_CALLBACK_MEMBER(line_on_callback);
@@ -1197,6 +1198,11 @@ void supracan_state::sound_timer_irq(int state)
set_sound_irq(7, state);
}
+void supracan_state::sound_dma_irq(int state)
+{
+ set_sound_irq(6, state);
+}
+
void supracan_state::dma_w(int offset, uint16_t data, uint16_t mem_mask, int ch)
{
address_space &mem = m_maincpu->space(AS_PROGRAM);
@@ -1566,8 +1572,19 @@ uint16_t supracan_state::sound_r(offs_t offset, uint16_t mem_mask)
switch (offset)
{
+ case 0x04/2:
+ data = (m_soundram[0x40c] << 8) | m_soundram[0x40d];
+ LOGMASKED(LOG_SOUND, "%s: sound_r: DMA Request address from 6502, %08x: %04x & %04x\n", machine().describe_context(), 0xe90000 + (offset << 1), data, mem_mask);
+ break;
+
+ case 0x0c/2:
+ data = m_soundram[0x40a];
+ LOGMASKED(LOG_SOUND, "%s: sound_r: DMA Request flag from 6502, %08x: %04x & %04x\n", machine().describe_context(), 0xe90000 + (offset << 1), data, mem_mask);
+ machine().debug_break();
+ break;
+
default:
- LOGMASKED(LOG_SOUND | LOG_UNKNOWNS, "%s: sound_r: Unknown register: (%08x) & %04x\n", machine().describe_context(), 0xe90000 + (offset << 1), mem_mask);
+ LOGMASKED(LOG_SOUND | LOG_UNKNOWNS, "%s: sound_r: Unknown register: %08x & %04x\n", machine().describe_context(), 0xe90000 + (offset << 1), mem_mask);
break;
}
@@ -2113,7 +2130,8 @@ void supracan_state::supracan(machine_config &config)
ACANSND(config, m_sound, XTAL(3'579'545));
m_sound->ram_read().set(FUNC(supracan_state::sound_ram_read));
- m_sound->irq_handler().set(FUNC(supracan_state::sound_timer_irq));
+ m_sound->timer_irq_handler().set(FUNC(supracan_state::sound_timer_irq));
+ m_sound->dma_irq_handler().set(FUNC(supracan_state::sound_dma_irq));
m_sound->add_route(0, "lspeaker", 1.0);
m_sound->add_route(1, "rspeaker", 1.0);
diff --git a/src/mame/drivers/suprnova.cpp b/src/mame/drivers/suprnova.cpp
index 51351762a97..26ba609052d 100644
--- a/src/mame/drivers/suprnova.cpp
+++ b/src/mame/drivers/suprnova.cpp
@@ -1064,88 +1064,88 @@ void skns_state::init_galpans3() { m_spritegen->skns_sprite_kludge(-1,-1); ini
ROM_START( skns )
SKNS_BIOS
- ROM_REGION32_BE( 0x200000, "user1", ROMREGION_ERASE00 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", ROMREGION_ERASE00 ) // SH-2 Code mapped at 0x04000000
- ROM_REGION( 0x800000, "spritegen", ROMREGION_ERASE00 ) /* Sprites */
+ ROM_REGION( 0x800000, "spritegen", ROMREGION_ERASE00 ) // Sprites
- ROM_REGION( 0x800000, "gfx2", ROMREGION_ERASE00 ) /* Tiles Plane A */
+ ROM_REGION( 0x800000, "gfx2", ROMREGION_ERASE00 ) // Tiles Plane A
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
- ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) // Samples
ROM_END
ROM_START( cyvern )
SKNS_USA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "cv-usa.u10", 0x000000, 0x100000, CRC(1023ddca) SHA1(7967e3e876cdb797bdaa2eb5136a33cd43941501) )
ROM_LOAD16_BYTE( "cv-usa.u8", 0x000001, 0x100000, CRC(f696f6be) SHA1(d9e66173ca12693255d2bb0982da2fb96bfd155d) )
- ROM_REGION( 0x800000, "spritegen", 0 ) /* Sprites */
+ ROM_REGION( 0x800000, "spritegen", 0 ) // Sprites
ROM_LOAD( "cv100-00.u24", 0x000000, 0x400000, CRC(cd4ae88a) SHA1(925f4ae01a6ad3633be2a61be69e163f05401cf6) )
ROM_LOAD( "cv101-00.u20", 0x400000, 0x400000, CRC(a6cb3f0b) SHA1(8d83f44a096ca0a70962ca4c602c4331874c8560) )
- ROM_REGION( 0x800000, "gfx2", 0 ) /* Tiles Plane A */
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "cv200-00.u16", 0x000000, 0x400000, CRC(ddc8c67e) SHA1(9b99e87e69e88011e6d693d19ac5e115b4fa50b0) )
ROM_LOAD( "cv201-00.u13", 0x400000, 0x400000, CRC(65863321) SHA1(b8b75f50406068ffc3fca3887d2f0a653ca491c9) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "cv210-00.u18", 0x400000, 0x400000, CRC(7486bf3a) SHA1(3b4285ca570e9c5ad396c615bfc054372d1b0162) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "cv300-00.u4", 0x000000, 0x400000, CRC(fbeda465) SHA1(4d5066a22f4589b6b7f85b3e77c348d900ac4bdd) )
ROM_END
ROM_START( cyvernj )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "cvj-even.u10", 0x000000, 0x100000, CRC(802fadb4) SHA1(cbfac3a87a4863466117c61f2ecaf63d506352f6) )
ROM_LOAD16_BYTE( "cvj-odd.u8", 0x000001, 0x100000, CRC(f8a0fbdd) SHA1(5cc8c12c13b5eb3456083e70100450ba041de76e) )
- ROM_REGION( 0x800000, "spritegen", 0 ) /* Sprites */
+ ROM_REGION( 0x800000, "spritegen", 0 ) // Sprites
ROM_LOAD( "cv100-00.u24", 0x000000, 0x400000, CRC(cd4ae88a) SHA1(925f4ae01a6ad3633be2a61be69e163f05401cf6) )
ROM_LOAD( "cv101-00.u20", 0x400000, 0x400000, CRC(a6cb3f0b) SHA1(8d83f44a096ca0a70962ca4c602c4331874c8560) )
- ROM_REGION( 0x800000, "gfx2", 0 ) /* Tiles Plane A */
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "cv200-00.u16", 0x000000, 0x400000, CRC(ddc8c67e) SHA1(9b99e87e69e88011e6d693d19ac5e115b4fa50b0) )
ROM_LOAD( "cv201-00.u13", 0x400000, 0x400000, CRC(65863321) SHA1(b8b75f50406068ffc3fca3887d2f0a653ca491c9) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "cv210-00.u18", 0x400000, 0x400000, CRC(7486bf3a) SHA1(3b4285ca570e9c5ad396c615bfc054372d1b0162) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "cv300-00.u4", 0x000000, 0x400000, CRC(fbeda465) SHA1(4d5066a22f4589b6b7f85b3e77c348d900ac4bdd) )
ROM_END
ROM_START( galpani4 ) // only main CPU and plds dumps were provided
SKNS_EUROPE
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "gp4-000-e0.u10", 0x000000, 0x080000, CRC(7464cc28) SHA1(4ea6185b62d3e25efdaafb91397b51bc8f12fdee) ) // Hitachi HN27C4001G-10
ROM_LOAD16_BYTE( "gp4-001-e0.u8", 0x000001, 0x080000, CRC(8d162069) SHA1(1bd0181a9c9f37c8e8c9d6f75f045d76dffcd903) ) // Hitachi HN27C4001G-10
- ROM_REGION( 0x400000, "spritegen", 0 )
+ ROM_REGION( 0x400000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gp4-100-00.u24", 0x000000, 0x200000, CRC(1df61f01) SHA1(a9e95bbb3013e8f2fd01243b1b392ff07b4f7d02) )
ROM_LOAD( "gp4-101-00.u20", 0x200000, 0x100000, CRC(8e2c9349) SHA1(a58fa9bcc9684ed4558e3395d592b64a1978a902) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gp4-200-00.u16", 0x000000, 0x200000, CRC(f0781376) SHA1(aeab9553a9af922524e528eb2d019cf36b6e2094) )
ROM_LOAD( "gp4-201-00.u18", 0x200000, 0x200000, CRC(10c4b183) SHA1(80e05f3932495ad4fc9bf928fa66e6d2931bbb06) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
- ROM_LOAD( "gp4-300-00.u4", 0x000000, 0x200000, CRC(8374663a) SHA1(095512564f4de25dc3752d9fbd254b9dabd16d1b) ) /* Doesn't seem to use these samples at all */
- ROM_LOAD( "gp4-301-00.u7", 0x200000, 0x200000, NO_DUMP ) /* Different then GP4-301-01 - Changed some samples when compared to U4 ROM */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
+ ROM_LOAD( "gp4-300-00.u4", 0x000000, 0x200000, CRC(8374663a) SHA1(095512564f4de25dc3752d9fbd254b9dabd16d1b) ) // Doesn't seem to use these samples at all
+ ROM_LOAD( "gp4-301-00.u7", 0x200000, 0x200000, NO_DUMP ) // Different then GP4-301-01 - Changed some samples when compared to U4 ROM
ROM_REGION( 0x400, "plds", 0 )
ROM_LOAD( "skns-r09.u9", 0x000, 0x117, CRC(b02058d9) SHA1(77d07e0f329fb1969aa4543cd124e36ad34b07ba) ) // Atmel ATF16V8B
@@ -1155,269 +1155,293 @@ ROM_END
ROM_START( galpani4j )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "gp4j1.u10", 0x000000, 0x080000, CRC(919a3893) SHA1(83b89a9e628a1f46f8a56ea512fc8ad641d5e239) )
ROM_LOAD16_BYTE( "gp4j1.u8", 0x000001, 0x080000, CRC(94cb1fb7) SHA1(ac90103dd43cdce6a287ffc13631c1de477a9a71) )
- ROM_REGION( 0x400000, "spritegen", 0 )
+ ROM_REGION( 0x400000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gp4-100-00.u24", 0x000000, 0x200000, CRC(1df61f01) SHA1(a9e95bbb3013e8f2fd01243b1b392ff07b4f7d02) )
ROM_LOAD( "gp4-101-00.u20", 0x200000, 0x100000, CRC(8e2c9349) SHA1(a58fa9bcc9684ed4558e3395d592b64a1978a902) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gp4-200-00.u16", 0x000000, 0x200000, CRC(f0781376) SHA1(aeab9553a9af922524e528eb2d019cf36b6e2094) )
ROM_LOAD( "gp4-201-00.u18", 0x200000, 0x200000, CRC(10c4b183) SHA1(80e05f3932495ad4fc9bf928fa66e6d2931bbb06) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "gp4-300-00.u4", 0x000000, 0x200000, CRC(8374663a) SHA1(095512564f4de25dc3752d9fbd254b9dabd16d1b) )
ROM_END
ROM_START( galpani4k ) /* ROM-BOARD NEP-16 part number GP04K00372 with extra sound sample ROM at U7 */
SKNS_KOREA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "gp4k1.u10", 0x000000, 0x080000, CRC(cbd5c3a0) SHA1(17fc0d6f6050ffd31707cee3fcc263cd5b9d0c4f) )
ROM_LOAD16_BYTE( "gp4k1.u8", 0x000001, 0x080000, CRC(7a95bfe2) SHA1(82e24fd4674ec25bc6608ced0921e8573fcff2c2) )
- ROM_REGION( 0x400000, "spritegen", 0 )
+ ROM_REGION( 0x400000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gp4-100-00.u24", 0x000000, 0x200000, CRC(1df61f01) SHA1(a9e95bbb3013e8f2fd01243b1b392ff07b4f7d02) )
ROM_LOAD( "gp4-101-00.u20", 0x200000, 0x100000, CRC(8e2c9349) SHA1(a58fa9bcc9684ed4558e3395d592b64a1978a902) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gp4-200-00.u16", 0x000000, 0x200000, CRC(f0781376) SHA1(aeab9553a9af922524e528eb2d019cf36b6e2094) )
ROM_LOAD( "gp4-201-00.u18", 0x200000, 0x200000, CRC(10c4b183) SHA1(80e05f3932495ad4fc9bf928fa66e6d2931bbb06) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
- ROM_LOAD( "gp4-300-00.u4", 0x000000, 0x200000, CRC(8374663a) SHA1(095512564f4de25dc3752d9fbd254b9dabd16d1b) ) /* Doesn't seem to use these samples at all */
- ROM_LOAD( "gp4-301-01.u7", 0x200000, 0x200000, CRC(886ef77f) SHA1(047d5fecf2034339c69b2cb605b623a814a18f0d) ) /* Changed some samples when compared to U4 ROM */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
+ ROM_LOAD( "gp4-300-00.u4", 0x000000, 0x200000, CRC(8374663a) SHA1(095512564f4de25dc3752d9fbd254b9dabd16d1b) ) // Doesn't seem to use these samples at all
+ ROM_LOAD( "gp4-301-01.u7", 0x200000, 0x200000, CRC(886ef77f) SHA1(047d5fecf2034339c69b2cb605b623a814a18f0d) ) // Changed some samples when compared to U4 ROM
ROM_END
ROM_START( galpanidx )
SKNS_ASIA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "gpdx.u10", 0x000000, 0x100000, CRC(8eca883d) SHA1(f5a102ac21aeebc44afcd0ef7f655de21d4442b2) )
ROM_LOAD16_BYTE( "gpdx.u8", 0x000001, 0x100000, CRC(b0088d8f) SHA1(2363620265d3fc53bae1c5889ea761444f80735a) )
- ROM_REGION( 0x400000, "spritegen", 0 )
+ ROM_REGION( 0x400000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gp4-100-00.u24", 0x000000, 0x200000, CRC(1df61f01) SHA1(a9e95bbb3013e8f2fd01243b1b392ff07b4f7d02) )
ROM_LOAD( "gp4-101-00.u20", 0x200000, 0x100000, CRC(8e2c9349) SHA1(a58fa9bcc9684ed4558e3395d592b64a1978a902) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gp4-200-00.u16", 0x000000, 0x200000, CRC(f0781376) SHA1(aeab9553a9af922524e528eb2d019cf36b6e2094) )
ROM_LOAD( "gp4-201-00.u18", 0x200000, 0x200000, CRC(10c4b183) SHA1(80e05f3932495ad4fc9bf928fa66e6d2931bbb06) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
- ROM_LOAD( "gp4-300-00.u4", 0x000000, 0x200000, CRC(8374663a) SHA1(095512564f4de25dc3752d9fbd254b9dabd16d1b) ) /* Doesn't seem to use these samples at all */
- ROM_LOAD( "gp4-301-01.u7", 0x200000, 0x200000, CRC(886ef77f) SHA1(047d5fecf2034339c69b2cb605b623a814a18f0d) ) /* Changed some samples when compared to U4 ROM */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
+ ROM_LOAD( "gp4-300-00.u4", 0x000000, 0x200000, CRC(8374663a) SHA1(095512564f4de25dc3752d9fbd254b9dabd16d1b) ) // Doesn't seem to use these samples at all
+ ROM_LOAD( "gp4-301-01.u7", 0x200000, 0x200000, CRC(886ef77f) SHA1(047d5fecf2034339c69b2cb605b623a814a18f0d) ) // Changed some samples when compared to U4 ROM
ROM_END
ROM_START( galpanis )
SKNS_EUROPE
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "gps-000-e1.u10", 0x000000, 0x100000, CRC(b9ea3c44) SHA1(c1913545cd71ee75e60ade744a2a1054f770b981) )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "gps-000-e1.u10", 0x000000, 0x100000, CRC(b9ea3c44) SHA1(c1913545cd71ee75e60ade744a2a1054f770b981) ) // revision 1
ROM_LOAD16_BYTE( "gps-001-e1.u8", 0x000001, 0x100000, CRC(ded57bd0) SHA1(4c0122f0521829d4d83b6b1c403f7e6470f14951) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
ROM_END
ROM_START( galpanise )
SKNS_EUROPE
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "u10", 0x000000, 0x100000, CRC(e78e1623) SHA1(f68346b65d2613c8515894d9a239fcbb0b5cb52d) ) /* mask ROM with no labels */
- ROM_LOAD16_BYTE( "u8", 0x000001, 0x100000, CRC(098eff7c) SHA1(3cac22cbb11905a46afaa62c0470624b3b554fc0) ) /* mask ROM with no labels */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "u10", 0x000000, 0x100000, CRC(e78e1623) SHA1(f68346b65d2613c8515894d9a239fcbb0b5cb52d) ) // mask ROM with no labels - GPS-000-E0?
+ ROM_LOAD16_BYTE( "u8", 0x000001, 0x100000, CRC(098eff7c) SHA1(3cac22cbb11905a46afaa62c0470624b3b554fc0) ) // mask ROM with no labels - GPS-001-E0?
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
ROM_END
ROM_START( galpanisj )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "gps-000-j1.u10", 0x000000, 0x100000, CRC(c6938c3f) SHA1(05853ee6a44a55702788a75580b04a4be45e9bcb) )
ROM_LOAD16_BYTE( "gps-001-j1.u8", 0x000001, 0x100000, CRC(e764177a) SHA1(3a1333eb1022ed1a275b9c3d44b5f4ab81618fb6) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
ROM_END
ROM_START( galpanisa )
SKNS_ASIA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "gps-000-a0_9abc.u10", 0x000000, 0x100000, CRC(4e24b799) SHA1(614f4eb6a7b0ab03ea6ada28a670ed0759b3f4f9) ) /* hand written labels with checksum */
- ROM_LOAD16_BYTE( "gps-001-a0_bd64.u8", 0x000001, 0x100000, CRC(aa4db8af) SHA1(10cc15fa065b6a2dcaf8c7d701c5ae7c18e4e863) ) /* hand written labels with checksum */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "gps-000-a0_9abc.u10", 0x000000, 0x100000, CRC(4e24b799) SHA1(614f4eb6a7b0ab03ea6ada28a670ed0759b3f4f9) ) // hand written labels with checksum
+ ROM_LOAD16_BYTE( "gps-001-a0_bd64.u8", 0x000001, 0x100000, CRC(aa4db8af) SHA1(10cc15fa065b6a2dcaf8c7d701c5ae7c18e4e863) ) // hand written labels with checksum
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
ROM_END
ROM_START( galpanisk )
SKNS_KOREA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "gps-000-k1.u10", 0x000000, 0x100000, CRC(c9ff3d8a) SHA1(edfec265654aaa8cb307424e5b2899e708392cd0) )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "gps-000-k1.u10", 0x000000, 0x100000, CRC(c9ff3d8a) SHA1(edfec265654aaa8cb307424e5b2899e708392cd0) ) // revision 1
ROM_LOAD16_BYTE( "gps-001-k1.u8", 0x000001, 0x100000, CRC(354e601d) SHA1(4d176f2337a3b0b63548b2e542f9fa87d0a1ef7b) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
+ ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
+ROM_END
+
+ROM_START( galpaniska )
+ SKNS_KOREA
+
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "gps-000-k0.u10", 0x000000, 0x100000, CRC(be74128c) SHA1(6d506e1bb715e6bfd98eda5e69475d2f75911d26) ) // revision 0 (first version)
+ ROM_LOAD16_BYTE( "gps-001-k0.u8", 0x000001, 0x100000, CRC(701f793d) SHA1(7278dc68d5b92a26675333ef8b4b2c04c27f1b03) )
+
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
+ ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
+ ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
+ ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
+
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
+ ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
+ ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
+
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
+
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
ROM_END
ROM_START( galpans2 ) //only the 2 program ROMs were dumped, but mask ROMs are supposed to match.
SKNS_EUROPE
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "gps2e_u6__ver.3.u6", 0x000000, 0x100000, CRC(72fff5d1) SHA1(57001e04c469281a82a2956c6bc33502d5a3b882) )
ROM_LOAD16_BYTE( "gps2e_u4__ver.3.u4", 0x000001, 0x100000, CRC(95061601) SHA1(f98f1af9877b097e97acc5a3844ef9c523a92843) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gs210000.u21", 0x000000, 0x400000, CRC(294b2f14) SHA1(90cbd0acdaa2d89d208c28aae33ab57c03624089) )
ROM_LOAD( "gs210100.u20", 0x400000, 0x400000, CRC(f75c5a9a) SHA1(3919643cee6c88185a1aa3c58c5bc80599bf734e) )
ROM_LOAD( "gs210200.u8", 0x800000, 0x400000, CRC(25b4f56b) SHA1(f9a33d5ed54a04ecece3035e75508d191bbe74b1) )
ROM_LOAD( "gs210300.u32", 0xc00000, 0x400000, CRC(db6d4424) SHA1(0a88dafd0ee2490ff2ef39ce8eb1931c41bdda42) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gs220000.u17", 0x000000, 0x400000, CRC(5caae1c0) SHA1(8f77e4cf018d7290b2d804cbff9fccf0bf4d2404) )
ROM_LOAD( "gs220100.u9", 0x400000, 0x400000, CRC(8d51f197) SHA1(19d2afab823ea179918e7bcbf4df2283e77570f0) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "gs221000.u3", 0x400000, 0x400000, CRC(58800a18) SHA1(5e6d55ecd12275662d6f59559e137b759f23fff6) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "gs230000.u1", 0x000000, 0x400000, CRC(0348e8e1) SHA1(8a21c7e5cea0bc08a2595213d689c58c0251fdb5) )
ROM_END
ROM_START( galpans2j )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "gps2j.u6", 0x000000, 0x100000, CRC(6e74005b) SHA1(a57e8307062e262c2e7a84e2c58f7dfe03fc0f78) )
ROM_LOAD16_BYTE( "gps2j.u4", 0x000001, 0x100000, CRC(9b4b2304) SHA1(0b481f4d71d92bf23f38ed22979efd4409004857) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gs210000.u21", 0x000000, 0x400000, CRC(294b2f14) SHA1(90cbd0acdaa2d89d208c28aae33ab57c03624089) )
ROM_LOAD( "gs210100.u20", 0x400000, 0x400000, CRC(f75c5a9a) SHA1(3919643cee6c88185a1aa3c58c5bc80599bf734e) )
ROM_LOAD( "gs210200.u8", 0x800000, 0x400000, CRC(25b4f56b) SHA1(f9a33d5ed54a04ecece3035e75508d191bbe74b1) )
ROM_LOAD( "gs210300.u32", 0xc00000, 0x400000, CRC(db6d4424) SHA1(0a88dafd0ee2490ff2ef39ce8eb1931c41bdda42) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gs220000.u17", 0x000000, 0x400000, CRC(5caae1c0) SHA1(8f77e4cf018d7290b2d804cbff9fccf0bf4d2404) )
ROM_LOAD( "gs220100.u9", 0x400000, 0x400000, CRC(8d51f197) SHA1(19d2afab823ea179918e7bcbf4df2283e77570f0) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "gs221000.u3", 0x400000, 0x400000, CRC(58800a18) SHA1(5e6d55ecd12275662d6f59559e137b759f23fff6) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "gs230000.u1", 0x000000, 0x400000, CRC(0348e8e1) SHA1(8a21c7e5cea0bc08a2595213d689c58c0251fdb5) )
ROM_END
ROM_START( galpans2a )
SKNS_ASIA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "gps2av11.u6", 0x000000, 0x100000, CRC(61c05d5f) SHA1(e47c7951c1f688edb6c677532f750537a64bb7b3) )
ROM_LOAD16_BYTE( "gps2av11.u4", 0x000001, 0x100000, CRC(2e8c0ac2) SHA1(d066260d6d3c2924b42394e867523e6112a125c5) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gs210000.u21", 0x000000, 0x400000, CRC(294b2f14) SHA1(90cbd0acdaa2d89d208c28aae33ab57c03624089) )
ROM_LOAD( "gs210100.u20", 0x400000, 0x400000, CRC(f75c5a9a) SHA1(3919643cee6c88185a1aa3c58c5bc80599bf734e) )
ROM_LOAD( "gs210200.u8", 0x800000, 0x400000, CRC(25b4f56b) SHA1(f9a33d5ed54a04ecece3035e75508d191bbe74b1) )
ROM_LOAD( "gs210300.u32", 0xc00000, 0x400000, CRC(db6d4424) SHA1(0a88dafd0ee2490ff2ef39ce8eb1931c41bdda42) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gs220000.u17", 0x000000, 0x400000, CRC(5caae1c0) SHA1(8f77e4cf018d7290b2d804cbff9fccf0bf4d2404) )
ROM_LOAD( "gs220100.u9", 0x400000, 0x400000, CRC(8d51f197) SHA1(19d2afab823ea179918e7bcbf4df2283e77570f0) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "gs221000.u3", 0x400000, 0x400000, CRC(58800a18) SHA1(5e6d55ecd12275662d6f59559e137b759f23fff6) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "gs230000.u1", 0x000000, 0x400000, CRC(0348e8e1) SHA1(8a21c7e5cea0bc08a2595213d689c58c0251fdb5) )
ROM_END
@@ -1442,369 +1466,368 @@ Gals Panic 2 set.
ROM_START( galpansu )
SKNS_KOREA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "su.u10", 0x000000, 0x100000, CRC(5ae66218) SHA1(c3f32603e1da945efb984ff99e1a30202e535773) )
ROM_LOAD16_BYTE( "su.u8", 0x000001, 0x100000, CRC(10977a03) SHA1(2ab95398d6b88d8819f368ee6104d7f8b485778d) )
- /* the rest of the ROMs match Gals Panic S2, but are in different locations */
- ROM_REGION( 0x1000000, "spritegen", 0 )
- ROM_LOAD( "24", 0x000000, 0x400000, CRC(294b2f14) SHA1(90cbd0acdaa2d89d208c28aae33ab57c03624089) )
- ROM_LOAD( "20", 0x400000, 0x400000, CRC(f75c5a9a) SHA1(3919643cee6c88185a1aa3c58c5bc80599bf734e) )
- ROM_LOAD( "17", 0x800000, 0x400000, CRC(25b4f56b) SHA1(f9a33d5ed54a04ecece3035e75508d191bbe74b1) )
- ROM_LOAD( "32", 0xc00000, 0x400000, CRC(db6d4424) SHA1(0a88dafd0ee2490ff2ef39ce8eb1931c41bdda42) )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
+ ROM_LOAD( "24", 0x000000, 0x400000, CRC(294b2f14) SHA1(90cbd0acdaa2d89d208c28aae33ab57c03624089) ) // == gs210000.u21
+ ROM_LOAD( "20", 0x400000, 0x400000, CRC(f75c5a9a) SHA1(3919643cee6c88185a1aa3c58c5bc80599bf734e) ) // == gs210100.u20
+ ROM_LOAD( "17", 0x800000, 0x400000, CRC(25b4f56b) SHA1(f9a33d5ed54a04ecece3035e75508d191bbe74b1) ) // == gs210200.u8
+ ROM_LOAD( "32", 0xc00000, 0x400000, CRC(db6d4424) SHA1(0a88dafd0ee2490ff2ef39ce8eb1931c41bdda42) ) // == gs210300.u32
- ROM_REGION( 0x800000, "gfx2", 0 )
- ROM_LOAD( "16", 0x000000, 0x400000, CRC(5caae1c0) SHA1(8f77e4cf018d7290b2d804cbff9fccf0bf4d2404) )
- ROM_LOAD( "13", 0x400000, 0x400000, CRC(8d51f197) SHA1(19d2afab823ea179918e7bcbf4df2283e77570f0) )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
+ ROM_LOAD( "16", 0x000000, 0x400000, CRC(5caae1c0) SHA1(8f77e4cf018d7290b2d804cbff9fccf0bf4d2404) ) // == gs220000.u17
+ ROM_LOAD( "13", 0x400000, 0x400000, CRC(8d51f197) SHA1(19d2afab823ea179918e7bcbf4df2283e77570f0) ) // == gs220100.u9
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
- ROM_LOAD( "7", 0x400000, 0x400000, CRC(58800a18) SHA1(5e6d55ecd12275662d6f59559e137b759f23fff6) )
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
+ ROM_LOAD( "7", 0x400000, 0x400000, CRC(58800a18) SHA1(5e6d55ecd12275662d6f59559e137b759f23fff6) ) // == gs221000.u3
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
- ROM_LOAD( "4", 0x000000, 0x400000, CRC(0348e8e1) SHA1(8a21c7e5cea0bc08a2595213d689c58c0251fdb5) )
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
+ ROM_LOAD( "4", 0x000000, 0x400000, CRC(0348e8e1) SHA1(8a21c7e5cea0bc08a2595213d689c58c0251fdb5) ) // == gs230000.u1
ROM_END
ROM_START( galpans3 )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "gpss3.u10", 0x000000, 0x100000, CRC(c1449a72) SHA1(02db81a0ea349742d6ddf71d59fcfce45f0c5212) )
ROM_LOAD16_BYTE( "gpss3.u8", 0x000001, 0x100000, CRC(11eb44cf) SHA1(482ef27fa86d6777def46918eac8be019896c0b0) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "u24.bin", 0x000000, 0x800000, CRC(70613168) SHA1(637c50e733dbc0226b1e0acc8000faa7e8977cb6) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "u16.bin", 0x000000, 0x800000, CRC(a96daf2a) SHA1(40f4c32158d320146aeeac34c15ca6816a6876bc) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "u4.bin", 0x000000, 0x400000, CRC(bf5736c6) SHA1(781292d87e9da1d21c1ac540baefff5e2f84a3f5) )
ROM_END
ROM_START( gutsn )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "gts000j0.u6", 0x000000, 0x080000, CRC(8ee91310) SHA1(8dd918189fe445d79c7f028168862b852f70a6f2) )
ROM_LOAD16_BYTE( "gts001j0.u4", 0x000001, 0x080000, CRC(80b8ee66) SHA1(4faf5f358ceee866f09bd81e63ba3ebd21bde835) )
- ROM_REGION( 0x400000, "spritegen", 0 )
+ ROM_REGION( 0x400000, "spritegen", 0 ) // Sprites
ROM_LOAD( "gts10000.u24", 0x000000, 0x400000, CRC(1959979e) SHA1(92a68784664dd833ca6fcca1b15cd46b9365d081) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "gts20000.u16", 0x000000, 0x400000, CRC(c443aac3) SHA1(b0416a09ead26077e9276bae98d94eeb1cf86877) )
- ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "gts30000.u4", 0x000000, 0x400000, CRC(8c169141) SHA1(41caea6fa644515f7417c84bdac599b13ad07e8c) )
ROM_END
ROM_START( panicstr )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "ps1000j0.u10", 0x000000, 0x100000, CRC(59645f89) SHA1(8da205c6e38899d6c637941700dd7eea56011c10) )
ROM_LOAD16_BYTE( "ps1001j0.u8", 0x000001, 0x100000, CRC(c4722be9) SHA1(7009d320a80cfa7d80efc5fc915081914bc3c827) )
- ROM_REGION( 0x800000, "spritegen", 0 )
+ ROM_REGION( 0x800000, "spritegen", 0 ) // Sprites
ROM_LOAD( "ps-10000.u24", 0x000000, 0x400000, CRC(294b2f14) SHA1(90cbd0acdaa2d89d208c28aae33ab57c03624089) )
ROM_LOAD( "ps110100.u20", 0x400000, 0x400000, CRC(e292f393) SHA1(b0914f7f0abf9f821f2592c289ea4e3b3e7f819a) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "ps120000.u16", 0x000000, 0x400000, CRC(d772ac15) SHA1(6bf7b9bfccdcb7481b21fa2ab9b683d79033a192) )
- ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "ps-30000.u4", 0x000000, 0x400000, CRC(2262e263) SHA1(73443e5f40f5c5c9bd41c6207fa6376072f0f65e) )
ROM_END
ROM_START( puzzloop )
SKNS_EUROPE
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "pl00e4.u6", 0x000000, 0x080000, CRC(7d3131a5) SHA1(f9302aa27addb8a730102b1869a34063d8b44e62) ) /* V0.94 */
- ROM_LOAD16_BYTE( "pl00e4.u4", 0x000001, 0x080000, CRC(40dc3291) SHA1(d955752a2c884e6dd951f9a87f9d249bb1ab9116) ) /* V0.94 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "pl00e4.u6", 0x000000, 0x080000, CRC(7d3131a5) SHA1(f9302aa27addb8a730102b1869a34063d8b44e62) ) // V0.94
+ ROM_LOAD16_BYTE( "pl00e4.u4", 0x000001, 0x080000, CRC(40dc3291) SHA1(d955752a2c884e6dd951f9a87f9d249bb1ab9116) ) // V0.94
- ROM_REGION( 0x800000, "spritegen", 0 )
+ ROM_REGION( 0x800000, "spritegen", 0 ) // Sprites
ROM_LOAD( "pzl10000.u24", 0x000000, 0x400000, CRC(35bf6897) SHA1(8a1f1f5234a61971a62401633de1dec1920fc4da) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "pzl20000.u16", 0x000000, 0x400000, CRC(ff558e68) SHA1(69a50c8100edbf2d5d92ce14b3f079f76c544bdd) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "pzl21000.u18", 0x400000, 0x400000, CRC(c8b3be64) SHA1(6da9ca8b963ebf10df6bc02bd1bdc66392e2fa60) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "pzl30000.u4", 0x000000, 0x400000, CRC(38604b8d) SHA1(1191cf48a6a7baa58e51509442b40ea67f5252d2) )
ROM_END
ROM_START( puzzloope )
SKNS_EUROPE
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "pl00e1.u6", 0x000000, 0x080000, CRC(273adc38) SHA1(37ca873342ba9fb9951114048a9cd255f73fe19c) ) /* V0.93 */
- ROM_LOAD16_BYTE( "pl00e1.u4", 0x000001, 0x080000, CRC(14ac2870) SHA1(d1abcfd64d7c0ead67e879c40e1010453fd4da13) ) /* V0.93 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "pl00e1.u6", 0x000000, 0x080000, CRC(273adc38) SHA1(37ca873342ba9fb9951114048a9cd255f73fe19c) ) // V0.93
+ ROM_LOAD16_BYTE( "pl00e1.u4", 0x000001, 0x080000, CRC(14ac2870) SHA1(d1abcfd64d7c0ead67e879c40e1010453fd4da13) ) // V0.93
- ROM_REGION( 0x800000, "spritegen", 0 )
+ ROM_REGION( 0x800000, "spritegen", 0 ) // Sprites
ROM_LOAD( "pzl10000.u24", 0x000000, 0x400000, CRC(35bf6897) SHA1(8a1f1f5234a61971a62401633de1dec1920fc4da) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "pzl20000.u16", 0x000000, 0x400000, CRC(ff558e68) SHA1(69a50c8100edbf2d5d92ce14b3f079f76c544bdd) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "pzl21000.u18", 0x400000, 0x400000, CRC(c8b3be64) SHA1(6da9ca8b963ebf10df6bc02bd1bdc66392e2fa60) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "pzl30000.u4", 0x000000, 0x400000, CRC(38604b8d) SHA1(1191cf48a6a7baa58e51509442b40ea67f5252d2) )
ROM_END
ROM_START( puzzloopj )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "pl0j2.u6", 0x000000, 0x080000, CRC(23c3bf97) SHA1(77ea1f32bed5709a6ad5b250370f08cfe8036867) ) /* V0.94 */
- ROM_LOAD16_BYTE( "pl0j2.u4", 0x000001, 0x080000, CRC(55b2a3cb) SHA1(d4cbe143fe2ad622af808cbd9eedffeff3b77e0d) ) /* V0.94 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "pl0j2.u6", 0x000000, 0x080000, CRC(23c3bf97) SHA1(77ea1f32bed5709a6ad5b250370f08cfe8036867) ) // V0.94
+ ROM_LOAD16_BYTE( "pl0j2.u4", 0x000001, 0x080000, CRC(55b2a3cb) SHA1(d4cbe143fe2ad622af808cbd9eedffeff3b77e0d) ) // V0.94
- ROM_REGION( 0x800000, "spritegen", 0 )
+ ROM_REGION( 0x800000, "spritegen", 0 ) // Sprites
ROM_LOAD( "pzl10000.u24", 0x000000, 0x400000, CRC(35bf6897) SHA1(8a1f1f5234a61971a62401633de1dec1920fc4da) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "pzl20000.u16", 0x000000, 0x400000, CRC(ff558e68) SHA1(69a50c8100edbf2d5d92ce14b3f079f76c544bdd) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "pzl21000.u18", 0x400000, 0x400000, CRC(c8b3be64) SHA1(6da9ca8b963ebf10df6bc02bd1bdc66392e2fa60) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "pzl30000.u4", 0x000000, 0x400000, CRC(38604b8d) SHA1(1191cf48a6a7baa58e51509442b40ea67f5252d2) )
ROM_END
ROM_START( puzzloopa )
SKNS_ASIA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "pl0a3.u6", 0x000000, 0x080000, CRC(4e8673b8) SHA1(17acfb0550912e6f2519df2bc24fbf629a1f6147) ) /* V0.94 */
- ROM_LOAD16_BYTE( "pl0a3.u4", 0x000001, 0x080000, CRC(e08a1a07) SHA1(aba58a81ae46c7b4e235a3213984026d170fa189) ) /* V0.94 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "pl0a3.u6", 0x000000, 0x080000, CRC(4e8673b8) SHA1(17acfb0550912e6f2519df2bc24fbf629a1f6147) ) // V0.94
+ ROM_LOAD16_BYTE( "pl0a3.u4", 0x000001, 0x080000, CRC(e08a1a07) SHA1(aba58a81ae46c7b4e235a3213984026d170fa189) ) // V0.94
- ROM_REGION( 0x800000, "spritegen", 0 )
+ ROM_REGION( 0x800000, "spritegen", 0 ) // Sprites
ROM_LOAD( "pzl10000.u24", 0x000000, 0x400000, CRC(35bf6897) SHA1(8a1f1f5234a61971a62401633de1dec1920fc4da) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "pzl20000.u16", 0x000000, 0x400000, CRC(ff558e68) SHA1(69a50c8100edbf2d5d92ce14b3f079f76c544bdd) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "pzl21000.u18", 0x400000, 0x400000, CRC(c8b3be64) SHA1(6da9ca8b963ebf10df6bc02bd1bdc66392e2fa60) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "pzl30000.u4", 0x000000, 0x400000, CRC(38604b8d) SHA1(1191cf48a6a7baa58e51509442b40ea67f5252d2) )
ROM_END
ROM_START( puzzloopk )
SKNS_KOREA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "pl0k4.u6", 0x000000, 0x080000, CRC(8d81f20c) SHA1(c32a525e8f92a625e3fecb7c43dd04b13e0a75e4) ) /* V0.94 */
- ROM_LOAD16_BYTE( "pl0k4.u4", 0x000001, 0x080000, CRC(17c78e41) SHA1(4a4b612ae00d521d2947ab32554ebb615be72471) ) /* V0.94 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "pl0k4.u6", 0x000000, 0x080000, CRC(8d81f20c) SHA1(c32a525e8f92a625e3fecb7c43dd04b13e0a75e4) ) // V0.94
+ ROM_LOAD16_BYTE( "pl0k4.u4", 0x000001, 0x080000, CRC(17c78e41) SHA1(4a4b612ae00d521d2947ab32554ebb615be72471) ) // V0.94
- ROM_REGION( 0x800000, "spritegen", 0 )
+ ROM_REGION( 0x800000, "spritegen", 0 ) // Sprites
ROM_LOAD( "pzl10000.u24", 0x000000, 0x400000, CRC(35bf6897) SHA1(8a1f1f5234a61971a62401633de1dec1920fc4da) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "pzl20000.u16", 0x000000, 0x400000, CRC(ff558e68) SHA1(69a50c8100edbf2d5d92ce14b3f079f76c544bdd) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "pzl21000.u18", 0x400000, 0x400000, CRC(c8b3be64) SHA1(6da9ca8b963ebf10df6bc02bd1bdc66392e2fa60) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "pzl30000.u4", 0x000000, 0x400000, CRC(38604b8d) SHA1(1191cf48a6a7baa58e51509442b40ea67f5252d2) )
ROM_END
ROM_START( puzzloopu )
SKNS_USA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "plue5.u6", 0x000000, 0x080000, CRC(e6f3f82f) SHA1(ac61dc22fa3c1b1c2f3a41d3a8fb43938b77ca68) ) /* V0.94 */
- ROM_LOAD16_BYTE( "plue5.u4", 0x000001, 0x080000, CRC(0d081d30) SHA1(ec0cdf120126104b9bb706f68c9ba9c3777dd69c) ) /* V0.94 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "plue5.u6", 0x000000, 0x080000, CRC(e6f3f82f) SHA1(ac61dc22fa3c1b1c2f3a41d3a8fb43938b77ca68) ) // V0.94
+ ROM_LOAD16_BYTE( "plue5.u4", 0x000001, 0x080000, CRC(0d081d30) SHA1(ec0cdf120126104b9bb706f68c9ba9c3777dd69c) ) // V0.94
- ROM_REGION( 0x800000, "spritegen", 0 )
+ ROM_REGION( 0x800000, "spritegen", 0 ) // Sprites
ROM_LOAD( "pzl10000.u24", 0x000000, 0x400000, CRC(35bf6897) SHA1(8a1f1f5234a61971a62401633de1dec1920fc4da) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "pzl20000.u16", 0x000000, 0x400000, CRC(ff558e68) SHA1(69a50c8100edbf2d5d92ce14b3f079f76c544bdd) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "pzl21000.u18", 0x400000, 0x400000, CRC(c8b3be64) SHA1(6da9ca8b963ebf10df6bc02bd1bdc66392e2fa60) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "pzl30000.u4", 0x000000, 0x400000, CRC(38604b8d) SHA1(1191cf48a6a7baa58e51509442b40ea67f5252d2) )
ROM_END
ROM_START( jjparads )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "jp1j1.u10", 0x000000, 0x080000, CRC(de2fb669) SHA1(229ff1ae0ec5bc77fc17642964e0bb0146594e86) )
ROM_LOAD16_BYTE( "jp1j1.u8", 0x000001, 0x080000, CRC(7276efb1) SHA1(3edc265b5c02da7d21a2494a6dc2878fbad93f87) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "jp100-00.u24", 0x000000, 0x400000, CRC(f31b2e95) SHA1(7e5bb518d4f6423785d3f9f2752a624a66b42469) )
ROM_LOAD( "jp101-00.u20", 0x400000, 0x400000, CRC(70cc8c24) SHA1(a4805ce19f512b047829548b635e68690d714175) )
ROM_LOAD( "jp102-00.u17", 0x800000, 0x400000, CRC(35401c1e) SHA1(38fe86a08555bb823b8d64ac043330aaaa6b8892) )
- ROM_REGION( 0x200000, "gfx2", 0 )
+ ROM_REGION( 0x200000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "jp200-00.u16", 0x000000, 0x200000, CRC(493d63db) SHA1(4b8fe7ff1ae14a914a675ce4072a4d9e5cfc08b0) )
- ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x200000, "ymz", 0 ) // Samples
ROM_LOAD( "jp300-00.u4", 0x000000, 0x200000, CRC(7023fe46) SHA1(24a92133bc664d63b3be67c2ef11cd7b605ee7e8) )
ROM_END
ROM_START( jjparad2 )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "jp2000j1.u6", 0x000000, 0x080000, CRC(5d75e765) SHA1(33bcd8f929f6025b00df2ea783b13a391a28a5c3) )
ROM_LOAD16_BYTE( "jp2001j1.u4", 0x000001, 0x080000, CRC(1771910a) SHA1(7ca9584d379d7b41f303a3ba861f943c570ad97c) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "jp210000.u21", 0x000000, 0x400000, CRC(79a7e3d7) SHA1(bd0f8d01971e5895395f97f2520bcd03ab19d229) )
ROM_LOAD( "jp210100.u20", 0x400000, 0x400000, CRC(42415e0c) SHA1(f7bff86d55fa9002fbd14e4c62f9d3df8faaf7d0) )
ROM_LOAD( "jp210200.u8", 0x800000, 0x400000, CRC(26731745) SHA1(8939d36b82b10b1010e4b924e6b9fdd4742efe48) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "jp220000.u17", 0x000000, 0x400000, CRC(d0e71873) SHA1(c6ffba3624e6d4c2d4e12ef7d88a02cbc3867b18) )
ROM_LOAD( "jp220100.u9", 0x400000, 0x400000, CRC(4c7d964d) SHA1(3352cd866a64466f4f5a990c2c5e3e28e7028a99) )
- ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "jp230000.u1", 0x000000, 0x400000, CRC(73e30d7f) SHA1(af5b16cec722dbbf0e03d73edfa133dbf10ac4f3) )
ROM_END
ROM_START( sengekis )
SKNS_ASIA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "ss01a.u6", 0x000000, 0x080000, CRC(962fe857) SHA1(3df74c5efff11333dea9316a063129dcec0d7bdd) )
ROM_LOAD16_BYTE( "ss01a.u4", 0x000001, 0x080000, CRC(ee853c23) SHA1(ddbf7f7cf509788ee3daf7b4d8ae1482e6e31a03) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "ss100-00.u21", 0x000000, 0x400000, CRC(bc7b3dfa) SHA1(dff10a7aef548abda48470293382057a2ca9557e) )
ROM_LOAD( "ss101-00.u20", 0x400000, 0x400000, CRC(ab2df280) SHA1(e456c578a36f585b24379d74def1bcab276c2b1b) )
ROM_LOAD( "ss102-00.u8", 0x800000, 0x400000, CRC(0845eafe) SHA1(663b163bf4e87c7df0030e791f95b1a5827de315) )
ROM_LOAD( "ss103-00.u32", 0xc00000, 0x400000, CRC(ee451ac9) SHA1(01cc6b6f371c0090a6a7f4c33d05f4b9a6c59fee) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "ss200-00.u17", 0x000000, 0x400000, CRC(cd773976) SHA1(38b8df5e685be65c3fde09f9e585591f678632d4) )
ROM_LOAD( "ss201-00.u9", 0x400000, 0x400000, CRC(301fad4c) SHA1(15faf37eeec5cc46afcb4bd236345b5c3dd647ac) )
- ROM_REGION( 0x600000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x600000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "ss210-00.u3", 0x400000, 0x200000, CRC(c3697805) SHA1(bd41064e3527cdc4b9a4ab9c423c916309b3f057) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "ss300-00.u1", 0x000000, 0x400000, CRC(35b04b18) SHA1(b69f33fc6a50ec20382329317d20b3c1e7f01b87) )
ROM_END
ROM_START( sengekisj )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "ss01j.u6", 0x000000, 0x080000, CRC(9efdcd5a) SHA1(66cca04d07999dc8ca0bcf19db925996b34d0390) )
ROM_LOAD16_BYTE( "ss01j.u4", 0x000001, 0x080000, CRC(92c3f45e) SHA1(60c647e66b0126fb7749874be39938972481b957) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "ss100-00.u21", 0x000000, 0x400000, CRC(bc7b3dfa) SHA1(dff10a7aef548abda48470293382057a2ca9557e) )
ROM_LOAD( "ss101-00.u20", 0x400000, 0x400000, CRC(ab2df280) SHA1(e456c578a36f585b24379d74def1bcab276c2b1b) )
ROM_LOAD( "ss102-00.u8", 0x800000, 0x400000, CRC(0845eafe) SHA1(663b163bf4e87c7df0030e791f95b1a5827de315) )
ROM_LOAD( "ss103-00.u32", 0xc00000, 0x400000, CRC(ee451ac9) SHA1(01cc6b6f371c0090a6a7f4c33d05f4b9a6c59fee) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "ss200-00.u17", 0x000000, 0x400000, CRC(cd773976) SHA1(38b8df5e685be65c3fde09f9e585591f678632d4) )
ROM_LOAD( "ss201-00.u9", 0x400000, 0x400000, CRC(301fad4c) SHA1(15faf37eeec5cc46afcb4bd236345b5c3dd647ac) )
- ROM_REGION( 0x600000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x600000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "ss210-00.u3", 0x400000, 0x200000, CRC(c3697805) SHA1(bd41064e3527cdc4b9a4ab9c423c916309b3f057) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "ss300-00.u1", 0x000000, 0x400000, CRC(35b04b18) SHA1(b69f33fc6a50ec20382329317d20b3c1e7f01b87) )
ROM_END
ROM_START( senknow )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "snw000j1.u6", 0x000000, 0x080000, CRC(0d6136f6) SHA1(eedd011cfe03577bfaf386723502d03f6e5dbd8c) )
ROM_LOAD16_BYTE( "snw001j1.u4", 0x000001, 0x080000, CRC(4a10ec3d) SHA1(bbec4fc53bd61d06ffe5a53debada5785b124fdd) )
- ROM_REGION( 0x0800000, "spritegen", 0 )
+ ROM_REGION( 0x0800000, "spritegen", 0 ) // Sprites
ROM_LOAD( "snw10000.u21", 0x000000, 0x400000, CRC(5133c69c) SHA1(d279df3ffd005dbf0930a8e40eaf2467f8653284) )
ROM_LOAD( "snw10100.u20", 0x400000, 0x400000, CRC(9dafe03f) SHA1(978b4597ff2a54ac5049fd64798e8173b29dd363) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "snw20000.u17", 0x000000, 0x400000, CRC(d5fe5f8c) SHA1(817d8d0a5fbc0c50dc3c592f938150f82df97cec) )
ROM_LOAD( "snw20100.u9", 0x400000, 0x400000, CRC(c0037846) SHA1(3267b142ebce47e1717250239d98fdb4af7964f8) )
- ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
ROM_LOAD( "snw21000.u3", 0x400000, 0x400000, CRC(f5c23e79) SHA1(b509680001c3205b289f43d4f44aaaa7f896419b) )
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "snw30000.u1", 0x000000, 0x400000, CRC(ec9eef40) SHA1(8f74ec9cb6054a77227c0505094f0ef8bc371429) )
ROM_END
ROM_START( teljan )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "tel1j.u10", 0x000000, 0x080000, CRC(09b552fe) SHA1(2f315fd09eb22fa8c81faa1e926038f20daa845f) )
ROM_LOAD16_BYTE( "tel1j.u8", 0x000001, 0x080000, CRC(070b4345) SHA1(5743f12a351b89593c6adfaeb8a5a2ab7bc8b424) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "tj100-00.u24", 0x000000, 0x400000, CRC(810144f1) SHA1(1c90e71e5f34ee05771ab4a673329f78f17791df) )
ROM_LOAD( "tj101-00.u20", 0x400000, 0x400000, CRC(82f570e1) SHA1(3ba9d1775f897052aca5cff2edbf575399101c5c) )
ROM_LOAD( "tj102-00.u17", 0x800000, 0x400000, CRC(ace875dc) SHA1(be97c895beeac979c5704986e818d4f3cfa00e49) )
- ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_REGION( 0x400000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "tj200-00.u16", 0x000000, 0x400000, CRC(be0f90b2) SHA1(1848a65f244e1e8a3ff7ab38e76f86cabca8b47e) )
- ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "tj300-00.u4", 0x000000, 0x400000, CRC(685495c4) SHA1(3853c0583b84ed3163370ae48e4b3912cbeb986e) )
ROM_END
@@ -1812,114 +1835,114 @@ ROM_END
ROM_START( ryouran )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "or-000-j2.u10", 0x000000, 0x080000, CRC(cba8ca4e) SHA1(7389502622a04101ca34f7b390ca0da820f62590) )
ROM_LOAD16_BYTE( "or-001-j2.u8", 0x000001, 0x080000, CRC(8e79c6b7) SHA1(0441d279cdc998e96abd6f607eceb4f866f58337) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "or100-00.u24", 0x000000, 0x400000, CRC(e9c7695b) SHA1(0a104d4e4e0c933d2eaaf410a8c243db6673786a) )
ROM_LOAD( "or101-00.u20", 0x400000, 0x400000, CRC(fe06bf12) SHA1(f3a2f88aed65bcc1c16f37fd4c0011e3538128f7) )
ROM_LOAD( "or102-00.u17", 0x800000, 0x400000, CRC(f2a5237b) SHA1(b8871f9c0f3864c334ec9a8146cf7dd1961ecb94) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "or200-00.u16", 0x000000, 0x400000, CRC(4c4701a8) SHA1(7b397b553ba86bba2ee82228cabdf2179e878d69) )
ROM_LOAD( "or201-00.u13", 0x400000, 0x400000, CRC(a94064aa) SHA1(5d736f810ffdbb6ada5c5efcb5fb29eedafc3e2f) )
- ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "or300-00.u4", 0x000000, 0x400000, CRC(a3f64b79) SHA1(6ecb2b4c0d213fe5384b19d6bfdb86871f21fd9f) )
ROM_END
ROM_START( ryourano )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "or000j1.u10", 0x000000, 0x080000, CRC(d93aa491) SHA1(dc01707f1e80d81f28d6b685d08fc6c0d2bf7330) )
ROM_LOAD16_BYTE( "or001j1.u8", 0x000001, 0x080000, CRC(f466e5e9) SHA1(65d699f6f9e299333e51a6a52cb13a0f1a902fe1) )
- ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_REGION( 0x1000000, "spritegen", 0 ) // Sprites
ROM_LOAD( "or100-00.u24", 0x000000, 0x400000, CRC(e9c7695b) SHA1(0a104d4e4e0c933d2eaaf410a8c243db6673786a) )
ROM_LOAD( "or101-00.u20", 0x400000, 0x400000, CRC(fe06bf12) SHA1(f3a2f88aed65bcc1c16f37fd4c0011e3538128f7) )
ROM_LOAD( "or102-00.u17", 0x800000, 0x400000, CRC(f2a5237b) SHA1(b8871f9c0f3864c334ec9a8146cf7dd1961ecb94) )
- ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_REGION( 0x800000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "or200-00.u16", 0x000000, 0x400000, CRC(4c4701a8) SHA1(7b397b553ba86bba2ee82228cabdf2179e878d69) )
ROM_LOAD( "or201-00.u13", 0x400000, 0x400000, CRC(a94064aa) SHA1(5d736f810ffdbb6ada5c5efcb5fb29eedafc3e2f) )
- ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x400000, "ymz", 0 ) // Samples
ROM_LOAD( "or300-00.u4", 0x000000, 0x400000, CRC(a3f64b79) SHA1(6ecb2b4c0d213fe5384b19d6bfdb86871f21fd9f) )
ROM_END
ROM_START( vblokbrk )
SKNS_EUROPE
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
- ROM_LOAD16_BYTE( "sk000e2-e.u10", 0x000000, 0x080000, CRC(5a278f10) SHA1(6f1be0657da76144b0feeed672d92a85091289b6) ) /* labeled SK000e2/E */
- ROM_LOAD16_BYTE( "sk000e-o.u8", 0x000001, 0x080000, CRC(aecf0647) SHA1(4752e5012bae8e7af3972b455b4346499ec2b49c) ) /* labeled SK000e/O */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
+ ROM_LOAD16_BYTE( "sk000e2-e.u10", 0x000000, 0x080000, CRC(5a278f10) SHA1(6f1be0657da76144b0feeed672d92a85091289b6) ) // labeled SK000e2/E
+ ROM_LOAD16_BYTE( "sk000e-o.u8", 0x000001, 0x080000, CRC(aecf0647) SHA1(4752e5012bae8e7af3972b455b4346499ec2b49c) ) // labeled SK000e/O
- ROM_REGION( 0x0400000, "spritegen", 0 )
+ ROM_REGION( 0x0400000, "spritegen", 0 ) // Sprites
ROM_LOAD( "sk-100-00.u24", 0x000000, 0x200000, CRC(151dd88a) SHA1(87bb1039a9883f721a315760eb2c4abe4a94046f) )
ROM_LOAD( "sk-101.u20", 0x200000, 0x100000, CRC(779cce23) SHA1(70147b36d982524ba9921823e481ce8fbb5daa26) )
- ROM_REGION( 0x200000, "gfx2", 0 )
+ ROM_REGION( 0x200000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "sk-200-00.u16", 0x000000, 0x200000, CRC(2e297c61) SHA1(4071b945a1294fbc3d18fab1f144bf09af4349e8) )
- ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x200000, "ymz", 0 ) // Samples
ROM_LOAD( "sk-300-00.u4", 0x000000, 0x200000, CRC(e6535c05) SHA1(8895b7c326e0261691cb184887ac1ca637302460) )
ROM_END
ROM_START( vblokbrka )
SKNS_ASIA
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "sk01a.u10", 0x000000, 0x080000, CRC(4d1be53e) SHA1(3d28b73a67530147962b8df6244af8bea2ab080f) )
ROM_LOAD16_BYTE( "sk01a.u8", 0x000001, 0x080000, CRC(461e0197) SHA1(003573a4abdbecc6dd234a13c61ef07a25d980e2) )
- ROM_REGION( 0x0400000, "spritegen", 0 )
+ ROM_REGION( 0x0400000, "spritegen", 0 ) // Sprites
ROM_LOAD( "sk-100-00.u24", 0x000000, 0x200000, CRC(151dd88a) SHA1(87bb1039a9883f721a315760eb2c4abe4a94046f) )
ROM_LOAD( "sk-101.u20", 0x200000, 0x100000, CRC(779cce23) SHA1(70147b36d982524ba9921823e481ce8fbb5daa26) )
- ROM_REGION( 0x200000, "gfx2", 0 )
+ ROM_REGION( 0x200000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "sk-200-00.u16", 0x000000, 0x200000, CRC(2e297c61) SHA1(4071b945a1294fbc3d18fab1f144bf09af4349e8) )
- ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x200000, "ymz", 0 ) // Samples
ROM_LOAD( "sk-300-00.u4", 0x000000, 0x200000, CRC(e6535c05) SHA1(8895b7c326e0261691cb184887ac1ca637302460) )
ROM_END
ROM_START( sarukani )
SKNS_JAPAN
- ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) // SH-2 Code mapped at 0x04000000
ROM_LOAD16_BYTE( "sk1j1.u10", 0x000000, 0x080000, CRC(fcc131b6) SHA1(5e3e71ee1f736b6098e671e6f57b1fb313c81adb) )
ROM_LOAD16_BYTE( "sk1j1.u8", 0x000001, 0x080000, CRC(3b6aa343) SHA1(a969b20b1170d82351024cab9e37f2fbfd01ddeb) )
- ROM_REGION( 0x0400000, "spritegen", 0 )
+ ROM_REGION( 0x0400000, "spritegen", 0 ) // Sprites
ROM_LOAD( "sk-100-00.u24", 0x000000, 0x200000, CRC(151dd88a) SHA1(87bb1039a9883f721a315760eb2c4abe4a94046f) )
ROM_LOAD( "sk-101.u20", 0x200000, 0x100000, CRC(779cce23) SHA1(70147b36d982524ba9921823e481ce8fbb5daa26) )
- ROM_REGION( 0x200000, "gfx2", 0 )
+ ROM_REGION( 0x200000, "gfx2", 0 ) // Tiles Plane A
ROM_LOAD( "sk-200-00.u16", 0x000000, 0x200000, CRC(2e297c61) SHA1(4071b945a1294fbc3d18fab1f144bf09af4349e8) )
- ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
- /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
- /* 0x040000 - 0x3fffff empty? */
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) // Tiles Plane B
+ // First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles
+ // 0x040000 - 0x3fffff empty?
- ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */
+ ROM_REGION( 0x200000, "ymz", 0 ) // Samples
ROM_LOAD( "sk-300-00.u4", 0x000000, 0x200000, CRC(e6535c05) SHA1(8895b7c326e0261691cb184887ac1ca637302460) )
ROM_END
@@ -1936,11 +1959,12 @@ GAME( 2001, galpanidx, galpani4, sknsa, cyvern, skns_state, init_galpani4, RO
GAME( 1996, jjparads, skns, sknsj, skns_1p, skns_state, init_jjparads, ROT0, "Electro Design", "Jan Jan Paradise", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, galpanis, skns, sknse, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Europe, set 1)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, galpanise, galpanis, sknse, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Europe, set 2)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, galpanisj, galpanis, sknsj, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Japan)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, galpanis, skns, sknse, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Europe, revision 1)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, galpanise, galpanis, sknse, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Europe, set 2)", MACHINE_IMPERFECT_GRAPHICS ) // E0 set??
+GAME( 1997, galpanisj, galpanis, sknsj, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Japan, revision 1)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, galpanisa, galpanis, sknsa, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Asia)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, galpanisk, galpanis, sknsk, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Korea)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, galpanisk, galpanis, sknsk, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Korea, revision 1)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, galpaniska,galpanis, sknsk, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Korea)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, jjparad2, skns, sknsj, skns_1p, skns_state, init_jjparad2, ROT0, "Electro Design", "Jan Jan Paradise 2", MACHINE_IMPERFECT_GRAPHICS )
@@ -1961,8 +1985,8 @@ GAME( 1998, puzzloopa, puzzloop, sknsa, puzzloop, skns_state, init_puzzloopa, RO
GAME( 1998, puzzloopk, puzzloop, sknsk, puzzloop, skns_state, init_puzzloopu, ROT0, "Mitchell", "Puzz Loop (Korea)", MACHINE_IMPERFECT_GRAPHICS ) // Same speed up as US version
GAME( 1998, puzzloopu, puzzloop, sknsu, puzzloop, skns_state, init_puzzloopu, ROT0, "Mitchell", "Puzz Loop (USA)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1998, ryouran , skns, sknsj, skns_1p, skns_state, init_ryouran, ROT0, "Electro Design", "VS Mahjong Otome Ryouran (set 1)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1998, ryourano, ryouran, sknsj, skns_1p, skns_state, init_ryouran, ROT0, "Electro Design", "VS Mahjong Otome Ryouran (set 2)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1998, ryouran , skns, sknsj, skns_1p, skns_state, init_ryouran, ROT0, "Electro Design", "VS Mahjong Otome Ryouran (revision 2)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1998, ryourano, ryouran, sknsj, skns_1p, skns_state, init_ryouran, ROT0, "Electro Design", "VS Mahjong Otome Ryouran (revision 1)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1999, galpans2, skns, sknse, galpanis, skns_state, init_galpans2, ROT0, "Kaneko", "Gals Panic S2 (Europe)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1999, galpans2j, galpans2, sknsj, galpanis, skns_state, init_galpans2, ROT0, "Kaneko", "Gals Panic S2 (Japan)", MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/taito_b.cpp b/src/mame/drivers/taito_b.cpp
index e4b12830015..8a4f7fef327 100644
--- a/src/mame/drivers/taito_b.cpp
+++ b/src/mame/drivers/taito_b.cpp
@@ -90,7 +90,7 @@ List of known B-System games:
Violence Fight (YM2203 sound, 1xMSM6295 )
Hit The Ice (YM2203 sound, 1xMSM6295 )
- Master of Weapons (YM2203 sound)
+ Master of Weapon (YM2203 sound)
Quiz Sekai wa SHOW by shobai (YM2610-B sound, MB87078 - electronic volume control)
Puzzle Bobble (YM2610-B sound, MB87078 - electronic volume control)
@@ -3276,7 +3276,7 @@ ROM_START( masterwj )
ROM_LOAD( "b72-01.5", 0x080000, 0x080000, CRC(a24ac26e) SHA1(895715a2bb0cb15334cba2283bd228b4fc08cd0c) )
ROM_END
-ROM_START( yukiwo ) /* Prototype of Master of Weapons */
+ROM_START( yukiwo ) /* Prototype of Master of Weapon */
ROM_REGION( 0x80000, "maincpu", 0 ) /* 512k for 68000 code */
ROM_LOAD16_BYTE( "ic33-rom0e.bin", 0x00000, 0x20000, CRC(a0dd51d9) SHA1(a4740bf08e26e1e576344c95d945df5d970738f2) )
ROM_LOAD16_BYTE( "ic24-e882.bin", 0x00001, 0x20000, CRC(d66f29d4) SHA1(0854f1a0943a20693e6cd02825666e39b4fe28ca) )
diff --git a/src/mame/drivers/taitosj.cpp b/src/mame/drivers/taitosj.cpp
index d3d5aebd4e9..590e7d2cb1b 100644
--- a/src/mame/drivers/taitosj.cpp
+++ b/src/mame/drivers/taitosj.cpp
@@ -1933,6 +1933,7 @@ ROM_START( spacecr )
ROM_END
+// A bootleg with identical ROM contents has been seen, with handwritten labels going from j1 to j20.
ROM_START( junglek )
ROM_REGION( 0x12000, "maincpu", 0 )
ROM_LOAD( "kn21-1.bin", 0x00000, 0x1000, CRC(45f55d30) SHA1(bb9518d7728938f673a663801e47ae0438cdbea1) )
diff --git a/src/mame/drivers/tattack.cpp b/src/mame/drivers/tattack.cpp
index 8f419a20d2c..d27a6fe6f52 100644
--- a/src/mame/drivers/tattack.cpp
+++ b/src/mame/drivers/tattack.cpp
@@ -447,6 +447,9 @@ ROM_START( tattack )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "rom.9a", 0x0000, 0x1000, CRC(47120994) SHA1(b6e90abbc50cba77df4c0aaf50d1f97b99e33b6d) )
+ ROM_REGION( 0x800, "melody", 0 ) // Epson 7910CQ Multi-Melody IC
+ ROM_LOAD( "7910cq", 0x000, 0x800, NO_DUMP ) // actual size unknown, needs decapping
+
ROM_REGION( 0x1000, "gfx1", 0 )
ROM_LOAD( "rom.6c", 0x0000, 0x1000, CRC(88ce45cf) SHA1(c7a43bfc9e9c2aeb75a98f723558bc88e53401a7) )
ROM_END
diff --git a/src/mame/drivers/tecmo.cpp b/src/mame/drivers/tecmo.cpp
index 6f3ca2f43a3..a466861f1a1 100644
--- a/src/mame/drivers/tecmo.cpp
+++ b/src/mame/drivers/tecmo.cpp
@@ -1227,6 +1227,36 @@ ROM_START( silkwormb )
ROM_LOAD( "e16.17", 0x38000, 0x08000, CRC(7ec93873) SHA1(0993a3b3e5ca84ef0ea32159825e379ba4cc5fbb) ) /* bg tiles 27C256 */
ROM_END
+ROM_START( silkwormb2 ) // 2-PCB stack, no markings
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "280100_pc-4.4", 0x00000, 0x10000, CRC(a10f2414) SHA1(5dbad60582d3193802c7c5e727c9c2685dec27b0) ) // unique, seems quite different wrt to the other dumped sets
+ ROM_LOAD( "280100_pc-5.5", 0x10000, 0x10000, CRC(a6c7bb51) SHA1(75f6625459ab65f2d47a282c1295d4db38f5fe51) )
+
+ ROM_REGION( 0x20000, "soundcpu", 0 )
+ ROM_LOAD( "280100_pc-3.3", 0x00000, 0x08000, CRC(5a880df9) SHA1(fc3f78ea05571ecf127fd1a6d3c6c349e300967a) ) // unique
+
+ ROM_REGION( 0x08000, "gfx1", 0 ) // characters
+ ROM_LOAD( "280100_pc-2.2", 0x00000, 0x08000, CRC(e80a1cd9) SHA1(ef16feb1113acc7401f8951158b25f6f201196f2) )
+
+ ROM_REGION( 0x40000, "gfx2", 0 ) // sprites
+ ROM_LOAD( "280100_pc-6.6", 0x00000, 0x10000, CRC(1138d159) SHA1(3b938606d448c4effdfe414bbf495b50cc3bc1c1) )
+ ROM_LOAD( "280100_pc-7.7", 0x10000, 0x10000, CRC(d96214f7) SHA1(a5b2be3ae6a6eb8afef2c18c865a998fbf4adf93) )
+ ROM_LOAD( "280100_pc-8.8", 0x20000, 0x10000, CRC(0494b38e) SHA1(03255f153824056e430a0b8595103f3b58b1fd97) )
+ ROM_LOAD( "280100_pc-9.9", 0x30000, 0x10000, CRC(8ce3cdf5) SHA1(635248514c4e1e5aab7a2ed4d620a5b970d4a43a) )
+
+ ROM_REGION( 0x40000, "gfx3", 0 ) // fg tiles
+ ROM_LOAD( "280100_pc-10.10", 0x00000, 0x10000, CRC(8c7138bb) SHA1(0cfd69fa77d5b546f7dad80537d8d2497ae758bc) )
+ ROM_LOAD( "280100_pc-11.11", 0x10000, 0x08000, CRC(c0c4687d) SHA1(afe05eb7e5a65c995aeac9ea773ad79eb053303f) )
+ ROM_LOAD( "280100_pc-12.12", 0x20000, 0x10000, CRC(bb0f568f) SHA1(b66c6d0407ed0b068c6bf07987f1b923d4a6e4f8) )
+ ROM_LOAD( "280100_pc-13.13", 0x30000, 0x08000, CRC(fc472811) SHA1(e862ec9b38f3f3a1f4668fbc587063eee8e9e821) )
+
+ ROM_REGION( 0x40000, "gfx4", 0 ) // bg tiles
+ ROM_LOAD( "280100_pc-14.14", 0x00000, 0x10000, CRC(409df64b) SHA1(cada970bf9cc8f6522e7a71e00fe873568852873) )
+ ROM_LOAD( "280100_pc-15.15", 0x10000, 0x08000, CRC(b02acdb6) SHA1(6be74bb89680b79b3a5d13af638ed5a0bb077dad) )
+ ROM_LOAD( "280100_pc-16.16", 0x20000, 0x08000, CRC(caf7b25e) SHA1(2c348af9d03efd801cbbc06deb02869bd6449518) )
+ ROM_LOAD( "280100_pc-17.17", 0x38000, 0x08000, CRC(7ec93873) SHA1(0993a3b3e5ca84ef0ea32159825e379ba4cc5fbb) )
+ROM_END
+
/*
main cpu Z80A
@@ -1418,15 +1448,16 @@ void tecmo_state::init_gemini()
}
-GAME( 1986, rygar, 0, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Rygar (US set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, rygar2, rygar, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Rygar (US set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, rygar3, rygar, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Rygar (US set 3 Old Version)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, rygarj, rygar, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Argus no Senshi (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, gemini, 0, gemini, gemini, tecmo_state, init_gemini, ROT90, "Tecmo", "Gemini Wing (World)", MACHINE_SUPPORTS_SAVE ) // No regional "Warning, if you are playing ..." screen
-GAME( 1987, geminij, gemini, gemini, gemini, tecmo_state, init_gemini, ROT90, "Tecmo", "Gemini Wing (Japan)", MACHINE_SUPPORTS_SAVE ) // Japan regional warning screen
-GAME( 1987, geminib, gemini, geminib, gemini, tecmo_state, init_gemini, ROT90, "bootleg", "Gemini Wing (bootleg)", MACHINE_SUPPORTS_SAVE ) // regional warning screen is blanked (still get a delay)
-GAME( 1988, silkworm, 0, silkworm, silkworm, tecmo_state, init_silkworm, ROT0, "Tecmo", "Silk Worm (World)", MACHINE_SUPPORTS_SAVE ) // No regional "Warning, if you are playing ..." screen
-GAME( 1988, silkwormj, silkworm, silkworm, silkworm, tecmo_state, init_silkworm, ROT0, "Tecmo", "Silk Worm (Japan)", MACHINE_SUPPORTS_SAVE ) // Japan regional warning screen
-GAME( 1988, silkwormp, silkworm, silkwormp, silkwormp, tecmo_state, init_silkworm, ROT0, "Tecmo", "Silk Worm (prototype)", MACHINE_SUPPORTS_SAVE ) // prototype
-GAME( 1988, silkwormb, silkworm, silkwormp, silkwormp, tecmo_state, init_silkworm, ROT0, "bootleg", "Silk Worm (bootleg)", MACHINE_SUPPORTS_SAVE ) // bootleg of (a different?) prototype
-GAME( 1988, backfirt, 0, backfirt, backfirt, tecmo_state, init_gemini, ROT0, "Tecmo", "Back Fire (Tecmo, bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, rygar, 0, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Rygar (US set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, rygar2, rygar, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Rygar (US set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, rygar3, rygar, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Rygar (US set 3 Old Version)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, rygarj, rygar, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Argus no Senshi (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, gemini, 0, gemini, gemini, tecmo_state, init_gemini, ROT90, "Tecmo", "Gemini Wing (World)", MACHINE_SUPPORTS_SAVE ) // No regional "Warning, if you are playing ..." screen
+GAME( 1987, geminij, gemini, gemini, gemini, tecmo_state, init_gemini, ROT90, "Tecmo", "Gemini Wing (Japan)", MACHINE_SUPPORTS_SAVE ) // Japan regional warning screen
+GAME( 1987, geminib, gemini, geminib, gemini, tecmo_state, init_gemini, ROT90, "bootleg", "Gemini Wing (bootleg)", MACHINE_SUPPORTS_SAVE ) // regional warning screen is blanked (still get a delay)
+GAME( 1988, silkworm, 0, silkworm, silkworm, tecmo_state, init_silkworm, ROT0, "Tecmo", "Silk Worm (World)", MACHINE_SUPPORTS_SAVE ) // No regional "Warning, if you are playing ..." screen
+GAME( 1988, silkwormj, silkworm, silkworm, silkworm, tecmo_state, init_silkworm, ROT0, "Tecmo", "Silk Worm (Japan)", MACHINE_SUPPORTS_SAVE ) // Japan regional warning screen
+GAME( 1988, silkwormp, silkworm, silkwormp, silkwormp, tecmo_state, init_silkworm, ROT0, "Tecmo", "Silk Worm (prototype)", MACHINE_SUPPORTS_SAVE ) // prototype
+GAME( 1988, silkwormb, silkworm, silkwormp, silkwormp, tecmo_state, init_silkworm, ROT0, "bootleg", "Silk Worm (bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) // bootleg of (a different?) prototype
+GAME( 1988, silkwormb2, silkworm, silkwormp, silkwormp, tecmo_state, init_silkworm, ROT0, "bootleg", "Silk Worm (bootleg, set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1988, backfirt, 0, backfirt, backfirt, tecmo_state, init_gemini, ROT0, "Tecmo", "Back Fire (Tecmo, bootleg)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/vectrex.cpp b/src/mame/drivers/vectrex.cpp
index 0556d7d6b74..da2be7804b5 100644
--- a/src/mame/drivers/vectrex.cpp
+++ b/src/mame/drivers/vectrex.cpp
@@ -150,7 +150,7 @@ ROM_START(vectrex)
// The following fastboots are listed here for reference and documentation
// ROM_SYSTEM_BIOS(2, "bios2", "us-fastboot hack")
-// ROMX_LOAD("us-fastboot.bin", 0x0000, 0x2000, CRa6e4dac4) SHA1(e0900be6d6858b985fd7f0999d864b2fceaf01a1), ROM_BIOS(2) )
+// ROMX_LOAD("us-fastboot.bin", 0x0000, 0x2000, CRC(a6e4dac4) SHA1(e0900be6d6858b985fd7f0999d864b2fceaf01a1), ROM_BIOS(2) )
// ROM_SYSTEM_BIOS(3, "bios3", "intl-fastboot hack")
// ROMX_LOAD("intl-fastboot.bin", 0x0000, 0x2000, CRC(71dcf0f4) SHA1(2a257c5111f5cee841bd14acaa9df6496aaf3d8b), ROM_BIOS(3) )
diff --git a/src/mame/drivers/vegas.cpp b/src/mame/drivers/vegas.cpp
index ddf45de38f1..d9377f4dd09 100644
--- a/src/mame/drivers/vegas.cpp
+++ b/src/mame/drivers/vegas.cpp
@@ -1723,7 +1723,7 @@ static INPUT_PORTS_START( sf2049 )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON12 ) PORT_NAME("Music")
PORT_BIT( 0x0070, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_CUSTOM_MEMBER(vegas_state, keypad_r)
PORT_BIT( 0x0f00, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_CUSTOM_MEMBER(vegas_state, gearshift_r)
- PORT_BIT( 0xf000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0xf080, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("GEAR")
PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("1st Gear")
@@ -2158,7 +2158,7 @@ void vegas_state::nbagold(machine_config &config)
m_ioasic->set_yearoffs(80);
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
//m_ioasic->set_auto_ack(1)
- m_ioasic->aux_output_handler().set(FUNC(vegas_state::i40_w));
+ m_ioasic->aux_output_handler().set(FUNC(vegas_state::i40_w));
}
void vegas_state::sf2049(machine_config &config)
@@ -2232,7 +2232,7 @@ void vegas_state::cartfury(machine_config &config)
*
*************************************/
- // there is a socket next to the main bios roms for updates, this is what the update region is.
+// there is a socket next to the main bios roms for updates, this is what the update region is.
ROM_START( gauntleg )
@@ -2268,7 +2268,6 @@ ROM_START( gauntleg12 )
ROMX_LOAD("12to16.3.bin", 0x000000, 0x100000, CRC(1027e54f) SHA1(a841f5cc5b022ddfaf70c97a64d1582f0a2ca70e), ROM_BIOS(3))
-
DISK_REGION( PCI_ID_IDE":ide:0:hdd:image" ) // GUTS 1.4 10/22/1998 Main 10/23/1998
DISK_IMAGE( "gauntl12", 0, SHA1(62917fbd692d004bc391287349041ebe669385cf) ) // compressed with -chs 4969,16,63 (which is apparently correct for a Quantum FIREBALL 2.5 GB and allows the update program to work)
diff --git a/src/mame/drivers/vic10.cpp b/src/mame/drivers/vic10.cpp
index b41700fbbcb..3d43698692c 100644
--- a/src/mame/drivers/vic10.cpp
+++ b/src/mame/drivers/vic10.cpp
@@ -42,7 +42,7 @@ public:
m_cia(*this, MOS6526_TAG),
m_joy1(*this, CONTROL1_TAG),
m_joy2(*this, CONTROL2_TAG),
- m_exp(*this, VIC10_EXPANSION_SLOT_TAG),
+ m_exp(*this, "exp"),
m_ram(*this, RAM_TAG),
m_cassette(*this, PET_DATASSETTE_PORT_TAG),
m_color_ram(*this, "color_ram", 0x400, ENDIANNESS_LITTLE),
diff --git a/src/mame/drivers/vic20.cpp b/src/mame/drivers/vic20.cpp
index b3b030a876d..4c6058c2c97 100644
--- a/src/mame/drivers/vic20.cpp
+++ b/src/mame/drivers/vic20.cpp
@@ -44,7 +44,7 @@ public:
m_vic(*this, VIC_TAG),
m_iec(*this, CBM_IEC_TAG),
m_joy(*this, CONTROL1_TAG),
- m_exp(*this, VIC20_EXPANSION_SLOT_TAG),
+ m_exp(*this, "exp"),
m_user(*this, PET_USER_PORT_TAG),
m_cassette(*this, PET_DATASSETTE_PORT_TAG),
m_ram(*this, RAM_TAG),
diff --git a/src/mame/drivers/vis.cpp b/src/mame/drivers/vis.cpp
index 423b5cbc9ef..48cad1e3307 100644
--- a/src/mame/drivers/vis.cpp
+++ b/src/mame/drivers/vis.cpp
@@ -75,13 +75,13 @@ void vis_audio_device::dack16_w(int line, uint16_t data)
{
m_sample[m_samples++] = data;
m_curcount++;
- if(m_samples >= 2)
+ if((m_samples >= 2) || ((m_mode & 0x08) != 0x08))
m_isa->drq7_w(CLEAR_LINE);
}
void vis_audio_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- if(m_samples < 2)
+ if(((m_samples < 2) && ((m_mode & 0x08) == 0x08)) || !m_samples)
return;
switch(m_mode & 0x88)
{
@@ -110,7 +110,7 @@ void vis_audio_device::device_timer(emu_timer &timer, device_timer_id id, int pa
break;
}
- if(m_sample_byte >= 4)
+ if(m_sample_byte >= 2)
{
m_sample_byte = 0;
m_samples = 0;
@@ -200,9 +200,11 @@ void vis_audio_device::pcm_w(offs_t offset, uint8_t data)
return;
case 0x0c:
m_count = (m_count & 0xff00) | data;
+ m_curcount = 0;
break;
case 0x0e:
m_count = (m_count & 0xff) | (data << 8);
+ m_curcount = 0;
break;
case 0x0f:
//cdrom related?
@@ -856,6 +858,7 @@ void vis_state::io_map(address_map &map)
map(0x0026, 0x0027).rw(FUNC(vis_state::unk_r), FUNC(vis_state::unk_w));
map(0x0040, 0x005f).rw("mb:pit8254", FUNC(pit8254_device::read), FUNC(pit8254_device::write));
map(0x0060, 0x0065).rw("kbdc", FUNC(kbdc8042_device::data_r), FUNC(kbdc8042_device::data_w));
+ map(0x0061, 0x0061).rw("mb", FUNC(at_mb_device::portb_r), FUNC(at_mb_device::portb_w));
map(0x006a, 0x006a).r(FUNC(vis_state::unk2_r));
map(0x0080, 0x009f).rw("mb", FUNC(at_mb_device::page8_r), FUNC(at_mb_device::page8_w));
map(0x0092, 0x0092).rw(FUNC(vis_state::sysctl_r), FUNC(vis_state::sysctl_w));
diff --git a/src/mame/drivers/yman1x.cpp b/src/mame/drivers/yman1x.cpp
new file mode 100644
index 00000000000..483db76ce64
--- /dev/null
+++ b/src/mame/drivers/yman1x.cpp
@@ -0,0 +1,87 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ Skeleton driver for Yamaha AN1x Control Synthesizer.
+
+ This is roughly similar in principle to the MU-80, but the sound chip is a
+ YSS236-F VOP3 instead of SWP20. A second VOP3 (with its own ROM) is on the
+ separate DMS board.
+
+*******************************************************************************/
+
+#include "emu.h"
+//#include "bus/midi/midi.h"
+#include "cpu/h8/h83002.h"
+#include "cpu/m6805/m6805.h"
+#include "machine/mulcd.h"
+#include "machine/nvram.h"
+#include "sound/meg.h"
+#include "speaker.h"
+
+namespace {
+
+class an1x_state : public driver_device
+{
+public:
+ an1x_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_pks(*this, "pks")
+ , m_meg(*this, "meg")
+ {
+ }
+
+ void an1x(machine_config &config);
+
+private:
+ void mem_map(address_map &map);
+
+ required_device<h83002_device> m_maincpu;
+ required_device<cpu_device> m_pks;
+ required_device<meg_device> m_meg;
+};
+
+void an1x_state::mem_map(address_map &map)
+{
+ map(0x000000, 0x0fffff).rom().region("program", 0);
+ map(0x200000, 0x23ffff).ram().share("nvram");
+}
+
+static INPUT_PORTS_START(an1x)
+INPUT_PORTS_END
+
+void an1x_state::an1x(machine_config &config)
+{
+ H83002(config, m_maincpu, 16_MHz_XTAL); // HD6413002FP16
+ m_maincpu->set_addrmap(AS_PROGRAM, &an1x_state::mem_map);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 2x HM628128BLFP-8 + CR2450 battery
+
+ HD63705(config, m_pks, 8_MHz_XTAL).set_disable(); // HD63B05V0E65F
+
+ MULCD(config, "lcd"); // LC7985ND (back-lit)
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ MEG(config, m_meg, 11.2896_MHz_XTAL);
+}
+
+ROM_START(an1x)
+ ROM_REGION16_BE(0x100000, "program", 0)
+ ROM_LOAD16_WORD_SWAP("yamaha an1x 1.04.ic2", 0x000000, 0x100000, CRC(f03b8c30) SHA1(778b669a450660f2b15cc385f156dc6676c437f1))
+
+ ROM_REGION(0x1000, "pks", 0)
+ ROM_LOAD("xn668a00.bin", 0x0000, 0x1000, NO_DUMP)
+
+ ROM_REGION16_BE(0x20000, "vop3", 0)
+ ROM_LOAD("xt113b00.ic9", 0x00000, 0x20000, NO_DUMP) // LH531024
+
+ ROM_REGION16_BE(0x20000, "vop3s", 0)
+ ROM_LOAD("xt113b00.ic1", 0x00000, 0x20000, NO_DUMP) // LH531024
+ROM_END
+
+} // anonymous namespace
+
+SYST(1997, an1x, 0, 0, an1x, an1x, an1x_state, empty_init, "Yamaha", "AN1x Control Synthesizer", MACHINE_NOT_WORKING)
diff --git a/src/mame/drivers/ymdx100.cpp b/src/mame/drivers/ymdx100.cpp
new file mode 100644
index 00000000000..a9b7813b425
--- /dev/null
+++ b/src/mame/drivers/ymdx100.cpp
@@ -0,0 +1,144 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ Skeleton driver for Yamaha DX100 & DX27 FM synthesizers.
+
+ The main differences between DX100 and DX27 are that DX27 has 61 keys
+ rather than 49, but DX100 is portable and can run on battery power. Their
+ tone generation capabilities are identical.
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "bus/midi/midi.h"
+#include "cpu/m6800/m6801.h"
+#include "machine/adc0808.h"
+#include "machine/clock.h"
+#include "machine/nvram.h"
+#include "sound/ymopm.h"
+#include "video/hd44780.h"
+
+#include "emupal.h"
+#include "screen.h"
+#include "speaker.h"
+
+namespace {
+
+class yamaha_dx100_state : public driver_device
+{
+public:
+ yamaha_dx100_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_midi_in(true)
+ {
+ }
+
+ void dx100(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ HD44780_PIXEL_UPDATE(lcd_pixel_update);
+ void palette_init(palette_device &palette);
+
+ DECLARE_WRITE_LINE_MEMBER(p22_w);
+
+ void mem_map(address_map &map);
+
+ required_device<hd6303x_cpu_device> m_maincpu;
+
+ bool m_midi_in;
+};
+
+void yamaha_dx100_state::machine_start()
+{
+ save_item(NAME(m_midi_in));
+}
+
+HD44780_PIXEL_UPDATE(yamaha_dx100_state::lcd_pixel_update)
+{
+ if (x < 5 && y < 8 && line < 2 && pos < 16)
+ bitmap.pix(line * 10 + y + 1 + ((y == 7) ? 1 : 0), pos * 6 + x + 1) = state ? 1 : 2;
+}
+
+void yamaha_dx100_state::palette_init(palette_device &palette)
+{
+ palette.set_pen_color(0, rgb_t(0x00, 0x00, 0x00)); // background
+ palette.set_pen_color(1, rgb_t(0xff, 0xff, 0xff)); // lcd pixel on
+ palette.set_pen_color(2, rgb_t(0x18, 0x18, 0x18)); // lcd pixel off
+}
+
+WRITE_LINE_MEMBER(yamaha_dx100_state::p22_w)
+{
+ if (state)
+ m_maincpu->m6801_clock_serial();
+}
+
+void yamaha_dx100_state::mem_map(address_map &map)
+{
+ map(0x0000, 0x001f).m(m_maincpu, FUNC(hd6303x_cpu_device::hd6301x_io));
+ map(0x0040, 0x00ff).ram(); // internal RAM
+ map(0x0800, 0x0fff).ram().share("nvram");
+ map(0x1000, 0x17ff).ram();
+ map(0x2000, 0x2001).rw("lcdc", FUNC(hd44780_device::read), FUNC(hd44780_device::write));
+ map(0x2800, 0x2800).r("adc", FUNC(m58990_device::data_r));
+ map(0x3000, 0x3000).w("adc", FUNC(m58990_device::address_data_start_w));
+ map(0x3800, 0x3801).rw("ymsnd", FUNC(ym2164_device::read), FUNC(ym2164_device::write));
+ map(0x8000, 0xffff).rom().region("program", 0);
+}
+
+static INPUT_PORTS_START(dx100)
+INPUT_PORTS_END
+
+void yamaha_dx100_state::dx100(machine_config &config)
+{
+ HD6303X(config, m_maincpu, 7.15909_MHz_XTAL / 2); // HD6303XP
+ m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_dx100_state::mem_map);
+ m_maincpu->in_p2_cb().set([this]() -> u8 { return m_midi_in ? 0x04 : 0; });
+ m_maincpu->in_p6_cb().set("adc", FUNC(m58990_device::eoc_r)).lshift(4);
+ m_maincpu->out_ser_tx_cb().set("mdout", FUNC(midi_port_device::write_txd));
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // TC5518BPL + CR2032T battery
+
+ m58990_device &adc(M58990(config, "adc", 7.15909_MHz_XTAL / 8)); // M58990P-1 (clocked by E)
+ adc.in_callback<5>().set_constant(0x80); // "CNG RAM BATTERY!" displayed unless value is between 0x70 and 0xCC
+
+ CLOCK(config, "subclock", 500_kHz_XTAL).signal_handler().set(FUNC(yamaha_dx100_state::p22_w));
+
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set([this](int state) { m_midi_in = state; });
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("lcdc", FUNC(hd44780_device::screen_update));
+ screen.set_size(6*16+1, 10*2+1);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette", FUNC(yamaha_dx100_state::palette_init), 3);
+
+ hd44780_device &lcdc(HD44780(config, "lcdc", 0)); // HD44780RA00
+ lcdc.set_lcd_size(2, 16);
+ lcdc.set_pixel_update_cb(FUNC(yamaha_dx100_state::lcd_pixel_update));
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ ym2164_device &ymsnd(YM2164(config, "ymsnd", 7.15909_MHz_XTAL / 2)); // with YM3014 DAC
+ ymsnd.add_route(0, "lspeaker", 0.60);
+ ymsnd.add_route(1, "rspeaker", 0.60);
+}
+
+ROM_START(dx100)
+ ROM_REGION(0x8000, "program", 0)
+ ROM_LOAD("dx100 v1.1.bin", 0x0000, 0x8000, CRC(c3ed7c86) SHA1(5b003db1bb5c1909907153f6446b63b07f5b41d6))
+ROM_END
+
+} // anonymous namespace
+
+SYST(1985, dx100, 0, 0, dx100, dx100, yamaha_dx100_state, empty_init, "Yamaha", "DX100 Digital Programmable Algorithm Synthesizer", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/ymsy35.cpp b/src/mame/drivers/ymsy35.cpp
new file mode 100644
index 00000000000..9e291a1a121
--- /dev/null
+++ b/src/mame/drivers/ymsy35.cpp
@@ -0,0 +1,76 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ Skeleton driver for Yamaha SY35 AWM/FM vector synthesizer.
+
+*******************************************************************************/
+
+#include "emu.h"
+//#include "bus/midi/midi.h"
+#include "cpu/h8500/h8520.h"
+#include "cpu/m6805/m6805.h"
+
+namespace {
+
+class yamaha_sy35_state : public driver_device
+{
+public:
+ yamaha_sy35_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_scancpu(*this, "scancpu")
+ {
+ }
+
+ void sy35(machine_config &config);
+
+private:
+ void mem_map(address_map &map);
+
+ required_device<h8520_device> m_maincpu;
+ required_device<cpu_device> m_scancpu;
+};
+
+void yamaha_sy35_state::mem_map(address_map &map)
+{
+ map(0x00000, 0x1ffff).rom().region("program", 0);
+ map(0x20000, 0x27fff).mirror(0x8000).ram();
+ //map(0x30000, 0x3ffff).rw("card", FUNC(sy35_card_device::read), FUNC(sy35_card_device::write));
+ map(0x80000, 0xbffff).rom().region("sound_make", 0);
+}
+
+static INPUT_PORTS_START(sy35)
+INPUT_PORTS_END
+
+void yamaha_sy35_state::sy35(machine_config &config)
+{
+ HD6435208(config, m_maincpu, 20_MHz_XTAL); // HD6435208A00P or HD6475208P
+ m_maincpu->set_mode(3); // internal ROM disabled
+ m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_sy35_state::mem_map);
+
+ HD63705(config, m_scancpu, 8_MHz_XTAL).set_disable(); // HD63B05V0C85P
+
+ //TMC3493PH(config, "gew5a", 12.8_MHz_XTAL);
+ //TMC3493PH(config, "gew5b", 12.8_MHz_XTAL);
+ //YM3413(config, "ldsp");
+}
+
+ROM_START(sy35)
+ ROM_REGION(0x20000, "program", 0)
+ ROM_LOAD("xk932a0.ic7", 0x00000, 0x20000, CRC(e86f47ac) SHA1(e14e309ba09e0f6de165e9366e199b74d1411f6c)) // 27C010 (second half blank)
+
+ ROM_REGION(0x40000, "sound_make", 0)
+ ROM_LOAD("xl401a0.ic6", 0x00000, 0x40000, CRC(614dfe1b) SHA1(7c2edd2bb6157d95b0f54f712fc89666846caead)) // 27C020
+
+ ROM_REGION(0x1000, "scancpu", 0)
+ ROM_LOAD("xh257a00.ic2", 0x0000, 0x1000, NO_DUMP)
+
+ ROM_REGION(0x200000, "voice", 0)
+ ROM_LOAD("xl429a00.ic8", 0x000000, 0x100000, NO_DUMP)
+ ROM_LOAD("xl430a00.ic9", 0x100000, 0x100000, NO_DUMP)
+ROM_END
+
+} // anonymous namespace
+
+SYST(1992, sy35, 0, 0, sy35, sy35, yamaha_sy35_state, empty_init, "Yamaha", "SY35 Music Synthesizer", MACHINE_IS_SKELETON)
diff --git a/src/mame/includes/adam.h b/src/mame/includes/adam.h
index e4f74309486..723b3edabc0 100644
--- a/src/mame/includes/adam.h
+++ b/src/mame/includes/adam.h
@@ -35,9 +35,7 @@ public:
m_psg(*this, SN76489A_TAG),
m_ram(*this, RAM_TAG),
m_adamnet(*this, "adamnet"),
- m_slot1(*this, ADAM_LEFT_EXPANSION_SLOT_TAG),
- m_slot2(*this, ADAM_CENTER_EXPANSION_SLOT_TAG),
- m_slot3(*this, ADAM_RIGHT_EXPANSION_SLOT_TAG),
+ m_slot(*this, "slot%u", 1U),
m_cart(*this, COLECOVISION_CARTRIDGE_SLOT_TAG),
m_joy1(*this, CONTROL1_TAG),
m_joy2(*this, CONTROL2_TAG),
@@ -57,9 +55,7 @@ public:
required_device<sn76489a_device> m_psg;
required_device<ram_device> m_ram;
required_device<adamnet_device> m_adamnet;
- required_device<adam_expansion_slot_device> m_slot1;
- required_device<adam_expansion_slot_device> m_slot2;
- required_device<adam_expansion_slot_device> m_slot3;
+ required_device_array<adam_expansion_slot_device, 3> m_slot;
required_device<colecovision_cartridge_slot_device> m_cart;
required_device<colecovision_control_port_device> m_joy1;
required_device<colecovision_control_port_device> m_joy2;
diff --git a/src/mame/includes/bw2.h b/src/mame/includes/bw2.h
index d4d64e68388..01f31234785 100644
--- a/src/mame/includes/bw2.h
+++ b/src/mame/includes/bw2.h
@@ -37,7 +37,7 @@ public:
m_lcdc(*this, MSM6255_TAG),
m_pit(*this, "ic6"),
m_centronics(*this, CENTRONICS_TAG),
- m_exp(*this, BW2_EXPANSION_SLOT_TAG),
+ m_exp(*this, "exp"),
m_ram(*this, RAM_TAG),
m_floppy0(*this, WD2797_TAG":0"),
m_floppy1(*this, WD2797_TAG":1"),
diff --git a/src/mame/includes/fmtowns.h b/src/mame/includes/fmtowns.h
index 29d4a855679..d4956a80617 100644
--- a/src/mame/includes/fmtowns.h
+++ b/src/mame/includes/fmtowns.h
@@ -394,6 +394,7 @@ private:
static const device_timer_id TIMER_WAIT = 5;
static const device_timer_id TIMER_CDSTATUS = 6;
static const device_timer_id TIMER_CDDA = 7;
+ static const device_timer_id TIMER_SPRITES = 8;
void freerun_inc();
void intervaltimer2_timeout();
void poll_keyboard();
@@ -413,7 +414,7 @@ private:
TIMER_CALLBACK_MEMBER(towns_cdrom_read_byte);
TIMER_CALLBACK_MEMBER(towns_vblank_end);
- TIMER_CALLBACK_MEMBER(draw_sprites);
+ void draw_sprites();
DECLARE_WRITE_LINE_MEMBER(towns_pit_out0_changed);
DECLARE_WRITE_LINE_MEMBER(towns_pit_out1_changed);
DECLARE_WRITE_LINE_MEMBER(pit2_out1_changed);
diff --git a/src/mame/includes/galaxian.h b/src/mame/includes/galaxian.h
index b174603eb8a..d148d50e8b4 100644
--- a/src/mame/includes/galaxian.h
+++ b/src/mame/includes/galaxian.h
@@ -12,15 +12,18 @@
#include "machine/gen_latch.h"
#include "machine/i8255.h"
+#include "machine/netlist.h"
#include "machine/timer.h"
+
#include "sound/ay8910.h"
#include "sound/dac.h"
#include "sound/digitalk.h"
-#include "machine/netlist.h"
+
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
+
namespace {
/* master clocks */
@@ -64,11 +67,8 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_audiocpu(*this, "audiocpu")
- , m_audio2(*this, "audio2")
- , m_dac(*this, "dac")
, m_ay8910(*this, "8910.%u", 0)
, m_ay8910_cclimber(*this, "cclimber_audio:aysnd")
- , m_digitalker(*this, "digitalker")
, m_ppi8255(*this, "ppi8255_%u", 0)
, m_gfxdecode(*this, "gfxdecode")
, m_screen(*this, "screen")
@@ -77,22 +77,22 @@ public:
, m_netlist(*this, "konami")
, m_filter_ctl(*this, "konami:ctl%u", 0)
, m_ckong_coinage(*this, "COINAGE")
- , m_fake_select(*this, "FAKE_SELECT")
- , m_tenspot_game_dsw(*this, {"IN2_GAME0", "IN2_GAME1", "IN2_GAME2", "IN2_GAME3", "IN2_GAME4", "IN2_GAME5", "IN2_GAME6", "IN2_GAME7", "IN2_GAME8", "IN2_GAME9"})
, m_spriteram(*this, "spriteram")
, m_videoram(*this, "videoram")
- , m_exattrram(*this, "extattrram")
, m_decrypted_opcodes(*this, "decrypted_opcodes")
, m_lamps(*this, "lamp%u", 0U)
- , m_bank1(*this, "bank1")
- , m_leftspriteclip(16)
{ }
/* video extension callbacks */
- typedef void (galaxian_state::*galaxian_extend_tile_info_func)(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
- typedef void (galaxian_state::*galaxian_extend_sprite_info_func)(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
- typedef void (galaxian_state::*galaxian_draw_bullet_func)(bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y);
- typedef void (galaxian_state::*galaxian_draw_background_func)(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ typedef void (galaxian_state::*extend_tile_info_func)(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
+ typedef void (galaxian_state::*extend_sprite_info_func)(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
+ typedef void (galaxian_state::*draw_bullet_func)(bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y);
+ typedef void (galaxian_state::*draw_background_func)(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ typedef delegate<void (uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y)> extend_tile_info_delegate;
+ typedef delegate<void (const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)> extend_sprite_info_delegate;
+ typedef delegate<void (bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y)> draw_bullet_delegate;
+ typedef delegate<void (bitmap_rgb32 &bitmap, const rectangle &cliprect)> draw_background_delegate;
void galaxian_videoram_w(offs_t offset, uint8_t data);
void galaxian_objram_w(offs_t offset, uint8_t data);
@@ -106,9 +106,6 @@ public:
void scramble_background_blue_w(uint8_t data);
void galaxian_gfxbank_w(offs_t offset, uint8_t data);
template <int N> DECLARE_READ_LINE_MEMBER(azurian_port_r);
- DECLARE_READ_LINE_MEMBER(kingball_muxbit_r);
- DECLARE_READ_LINE_MEMBER(kingball_noise_r);
- DECLARE_CUSTOM_INPUT_MEMBER(moonwar_dial_r);
void irq_enable_w(uint8_t data);
void start_lamp_w(offs_t offset, uint8_t data);
void coin_lock_w(uint8_t data);
@@ -123,9 +120,6 @@ public:
uint8_t theend_protection_r();
template <int N> DECLARE_READ_LINE_MEMBER(theend_protection_alt_r);
void explorer_sound_control_w(uint8_t data);
- uint8_t sfx_sample_io_r(offs_t offset);
- void sfx_sample_io_w(offs_t offset, uint8_t data);
- uint8_t monsterz_protection_r();
uint8_t frogger_ppi8255_r(offs_t offset);
void frogger_ppi8255_w(offs_t offset, uint8_t data);
uint8_t frogger_ay8910_r(offs_t offset);
@@ -138,53 +132,25 @@ public:
uint8_t turtles_ppi8255_1_r(offs_t offset);
void turtles_ppi8255_0_w(offs_t offset, uint8_t data);
void turtles_ppi8255_1_w(offs_t offset, uint8_t data);
- uint8_t scorpion_ay8910_r(offs_t offset);
- void scorpion_ay8910_w(offs_t offset, uint8_t data);
- uint8_t scorpion_digitalker_intr_r();
- void zigzag_bankswap_w(uint8_t data);
- void zigzag_ay8910_w(offs_t offset, uint8_t data);
- void kingball_speech_dip_w(uint8_t data);
- void kingball_sound1_w(uint8_t data);
- void kingball_sound2_w(uint8_t data);
- void mshuttle_ay8910_cs_w(uint8_t data);
- void mshuttle_ay8910_control_w(uint8_t data);
- void mshuttle_ay8910_data_w(uint8_t data);
- uint8_t mshuttle_ay8910_data_r();
uint8_t jumpbug_protection_r(offs_t offset);
void checkman_sound_command_w(uint8_t data);
uint8_t checkmaj_protection_r();
uint8_t dingo_3000_r();
uint8_t dingo_3035_r();
uint8_t dingoe_3001_r();
- void tenspot_unk_6000_w(uint8_t data);
- void tenspot_unk_8000_w(uint8_t data);
- void tenspot_unk_e000_w(uint8_t data);
uint8_t froggeram_ppi8255_r(offs_t offset);
void froggeram_ppi8255_w(offs_t offset, uint8_t data);
void artic_gfxbank_w(uint8_t data);
- uint8_t tenspot_dsw_read();
void konami_sound_control_w(uint8_t data);
uint8_t konami_sound_timer_r();
void konami_portc_0_w(uint8_t data);
void konami_portc_1_w(uint8_t data);
void theend_coin_counter_w(uint8_t data);
uint8_t explorer_sound_latch_r();
- void sfx_sample_control_w(uint8_t data);
- void monsterz_porta_1_w(uint8_t data);
- void monsterz_portb_1_w(uint8_t data);
- void monsterz_portc_1_w(uint8_t data);
uint8_t frogger_sound_timer_r();
- uint8_t scorpion_protection_r();
- void scorpion_protection_w(uint8_t data);
- void scorpion_digitalker_control_w(uint8_t data);
- void kingball_dac_w(uint8_t data);
- void moonwar_port_select_w(uint8_t data);
- void init_fourplay();
- void init_videight();
void init_galaxian();
void init_nolock();
void init_azurian();
- void init_pisces();
void init_batman2();
void init_highroll();
void init_frogg();
@@ -193,29 +159,19 @@ public:
void init_mooncrgx();
void init_moonqsr();
void init_pacmanbl();
- void init_tenspot();
- void init_devilfsg();
- void init_bagmanmc();
- void init_zigzag();
void init_jumpbug();
void init_checkman();
void init_checkmaj();
void init_dingo();
void init_dingoe();
void init_kong();
- void init_mshuttle();
- void init_mshuttlj();
void init_fantastc();
void init_timefgtr();
- void init_kingball();
void init_theend();
void init_scramble();
- void init_sidam();
void init_explorer();
- void init_amigo2();
void init_mandinga();
void init_mandingaeg();
- void init_sfx();
void init_atlantis();
void init_scobra();
void init_scobrae();
@@ -225,14 +181,12 @@ public:
void init_froggers();
void init_quaak();
void init_turtles();
- void init_scorpion();
void init_ckongs();
void init_ckonggx();
void init_anteater();
void init_anteateruk();
void init_superbon();
void init_calipso();
- void init_moonwar();
void init_ghostmun();
void init_froggrs();
void init_warofbugg();
@@ -240,14 +194,12 @@ public:
void init_mimonkey();
void init_mimonkeyb();
void init_victoryc();
+
TILE_GET_INFO_MEMBER(bg_get_tile_info);
void galaxian_palette(palette_device &palette);
- void moonwar_palette(palette_device &palette);
void eagle_palette(palette_device &palette);
- void tenspot_set_game_bank(int bank, int from_game);
uint32_t screen_update_galaxian(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_interrupt_w);
- DECLARE_INPUT_CHANGED_MEMBER(tenspot_fake);
TIMER_DEVICE_CALLBACK_MEMBER(checkmaj_irq0_gen);
TIMER_DEVICE_CALLBACK_MEMBER(scramble_stars_blink_timer);
TIMER_DEVICE_CALLBACK_MEMBER(timefgtr_scanline);
@@ -265,22 +217,18 @@ public:
void anteater_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
void jumpbug_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
void turtles_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
- void sfx_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
void frogger_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
- void namenayo_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
inline void galaxian_draw_pixel(bitmap_rgb32 &bitmap, const rectangle &cliprect, int y, int x, rgb_t color);
void galaxian_draw_bullet(bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y);
void mshuttle_draw_bullet(bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y);
void scramble_draw_bullet(bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y);
void theend_draw_bullet(bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y);
+ void empty_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
+ void empty_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
void upper_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
void upper_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
void frogger_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
void frogger_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
- void gmgalax_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
- void gmgalax_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
- void pisces_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
- void pisces_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
void batman2_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
void mooncrst_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
void mooncrst_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
@@ -293,9 +241,7 @@ public:
void jumpbug_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
void mimonkey_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
void mimonkey_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
- void namenayo_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
- void namenayo_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
- void monsterz_set_latch();
+ void guttangt_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
void decode_mooncrst(int length, uint8_t *dest);
void decode_checkman();
void decode_dingoe();
@@ -306,9 +252,11 @@ public:
void decode_losttomb_gfx();
void decode_superbon();
void decode_victoryc();
- void mshuttle_decode(const uint8_t convtable[8][16]);
- void common_init(galaxian_draw_bullet_func draw_bullet,galaxian_draw_background_func draw_background,
- galaxian_extend_tile_info_func extend_tile_info,galaxian_extend_sprite_info_func extend_sprite_info);
+ void common_init(
+ draw_bullet_func draw_bullet,
+ draw_background_func draw_background,
+ extend_tile_info_func extend_tile_info,
+ extend_sprite_info_func extend_sprite_info);
void galaxian_base(machine_config &config);
void sidam_bootleg_base(machine_config &config);
void konami_base(machine_config &config);
@@ -328,18 +276,13 @@ public:
void pacmanbl(machine_config &config);
void quaak(machine_config &config);
void galaxian(machine_config &config);
- void pisces(machine_config &config);
void highroll(machine_config &config);
- void tenspot(machine_config &config);
+ void devilfsg(machine_config &config);
void froggers(machine_config &config);
void froggervd(machine_config &config);
- void mshuttle(machine_config &config);
void anteateruk(machine_config &config);
- void monsterz(machine_config &config);
- void kingball(machine_config &config);
void anteaterg(machine_config &config);
void anteater(machine_config &config);
- void moonwar(machine_config &config);
void turpins(machine_config &config);
void explorer(machine_config &config);
void scramble(machine_config &config);
@@ -348,30 +291,22 @@ public:
void froggeram(machine_config &config);
void spactrai(machine_config &config);
void takeoff(machine_config &config);
- void sfx(machine_config &config);
void mooncrst(machine_config &config);
void eagle(machine_config &config);
- void scorpion(machine_config &config);
void ckongs(machine_config &config);
void frogf(machine_config &config);
void amigo2(machine_config &config);
- void zigzag(machine_config &config);
void checkman(machine_config &config);
void jungsub(machine_config &config);
void victoryc(machine_config &config);
void frogg(machine_config &config);
void mandingarf(machine_config &config);
void thepitm(machine_config &config);
- void porter(machine_config &config);
- void skybase(machine_config &config);
void kong(machine_config &config);
void bongo(machine_config &config);
void scorpnmc(machine_config &config);
void ckongg(machine_config &config);
void ckongmc(machine_config &config);
- void bagmanmc(machine_config &config);
- void fourplay(machine_config &config);
- void videight(machine_config &config);
void astroamb(machine_config &config);
void mimonkey(machine_config &config);
void mimonscr(machine_config &config);
@@ -380,13 +315,19 @@ public:
template <int Mask> DECLARE_READ_LINE_MEMBER(ckongs_coinage_r);
protected:
+ // machine configuration helpers
+ void set_irq_line(int line) { m_irq_line = line; }
+ void set_bullets_base(int base) { m_bullets_base = base; }
+ void set_num_spritegens(int num) { m_numspritegens = num; }
+ void set_x_scale(uint8_t scale) { m_x_scale = scale; }
+ void set_h0_start(uint8_t start) { m_h0_start = start; }
+ void set_left_sprite_clip(uint8_t clip) { m_leftspriteclip = clip; }
+
void amigo2_map(address_map &map);
void anteaterg_map(address_map &map);
void anteatergg_map(address_map &map);
void anteateruk_map(address_map &map);
void astroamb_map(address_map &map);
- void bagmanmc_map(address_map &map);
- void bagmanmc_io_map(address_map &map);
void bongo_map(address_map &map);
void bongo_io_map(address_map &map);
void checkmaj_sound_map(address_map &map);
@@ -413,58 +354,42 @@ protected:
void jumpbug_map(address_map &map);
void jungsub_map(address_map &map);
void jungsub_io_map(address_map &map);
- void kingball_sound_map(address_map &map);
- void kingball_sound_portmap(address_map &map);
void konami_sound_map(address_map &map);
void konami_sound_portmap(address_map &map);
void kong_map(address_map &map);
void mandingarf_map(address_map &map);
void mimonkey_map(address_map &map);
void mimonscr_map(address_map &map);
- void monsterz_map(address_map &map);
- void monsterz_sound_map(address_map &map);
void mooncrst_map(address_map &map);
void mooncrst_map_base(address_map &map);
void mooncrst_map_discrete(address_map &map);
void moonqsr_decrypted_opcodes_map(address_map &map);
- void mshuttle_decrypted_opcodes_map(address_map &map);
- void mshuttle_map(address_map &map);
- void mshuttle_portmap(address_map &map);
void ozon1_map(address_map &map);
void ozon1_io_map(address_map &map);
- void pisces_map(address_map &map);
- void porter_map(address_map &map);
void scobra_map(address_map &map);
- void scorpion_map(address_map &map);
- void scorpion_sound_map(address_map &map);
- void scorpion_sound_portmap(address_map &map);
void scorpnmc_map(address_map &map);
- void sfx_map(address_map &map);
- void sfx_sample_map(address_map &map);
- void sfx_sample_portmap(address_map &map);
- void skybase_map(address_map &map);
void spactrai_map(address_map &map);
void takeoff_sound_map(address_map &map);
void takeoff_sound_portmap(address_map &map);
- void tenspot_select_map(address_map &map);
void theend_map(address_map &map);
void thepitm_map(address_map &map);
void turpins_map(address_map &map);
void turpins_sound_map(address_map &map);
void turtles_map(address_map &map);
void victoryc_map(address_map &map);
- void zigzag_map(address_map &map);
- virtual void machine_start() override { m_lamps.resolve(); }
+ virtual void machine_start() override
+ {
+ m_lamps.resolve();
+
+ m_irq_enabled = 0;
+ }
virtual void video_start() override;
required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_audiocpu;
- optional_device<cpu_device> m_audio2;
- optional_device<dac_byte_interface> m_dac;
optional_device_array<ay8910_device, 3> m_ay8910;
optional_device<ay8910_device> m_ay8910_cclimber;
- optional_device<digitalker_device> m_digitalker;
optional_device_array<i8255_device, 3> m_ppi8255;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
@@ -473,43 +398,29 @@ protected:
optional_device<netlist_mame_sound_device> m_netlist;
optional_device_array<netlist_mame_logic_input_device, 12> m_filter_ctl;
optional_ioport m_ckong_coinage;
- optional_ioport m_fake_select;
- optional_ioport_array<10> m_tenspot_game_dsw;
required_shared_ptr<uint8_t> m_spriteram;
required_shared_ptr<uint8_t> m_videoram;
- optional_shared_ptr<uint8_t> m_exattrram; // belongs in namenayo_state but the callbacks are problematic as things are set up
optional_shared_ptr<uint8_t> m_decrypted_opcodes;
output_finder<2> m_lamps;
- memory_bank_creator m_bank1;
-
- int m_bullets_base;
- int m_sprites_base;
- int m_numspritegens;
- int m_counter_74ls161[2];
- int m_direction[2];
- uint8_t m_zigzag_ay8910_latch;
- uint8_t m_kingball_speech_dip;
- uint8_t m_kingball_sound;
- uint8_t m_mshuttle_ay8910_cs;
+ int m_bullets_base = 0x60;
+ int m_sprites_base = 0x40;
+ int m_numspritegens = 1;
uint16_t m_protection_state;
uint8_t m_protection_result;
uint8_t m_konami_sound_control;
- uint8_t m_sfx_sample_control;
- uint8_t m_moonwar_port_select;
uint8_t m_irq_enabled;
- int m_irq_line;
- int m_tenspot_current_game;
- uint8_t m_frogger_adjust;
- uint8_t m_x_scale;
- uint8_t m_h0_start;
- uint8_t m_sfx_tilemap;
-
- galaxian_extend_tile_info_func m_extend_tile_info_ptr;
- galaxian_extend_sprite_info_func m_extend_sprite_info_ptr;
- galaxian_draw_bullet_func m_draw_bullet_ptr;
- galaxian_draw_background_func m_draw_background_ptr;
+ int m_irq_line = INPUT_LINE_NMI;
+ uint8_t m_frogger_adjust = false;
+ uint8_t m_x_scale = GALAXIAN_XSCALE;
+ uint8_t m_h0_start = GALAXIAN_H0START;
+ uint8_t m_sfx_tilemap = false;
+
+ extend_tile_info_delegate m_extend_tile_info_ptr;
+ extend_sprite_info_delegate m_extend_sprite_info_ptr;
+ draw_bullet_delegate m_draw_bullet_ptr;
+ draw_background_delegate m_draw_background_ptr;
tilemap_t *m_bg_tilemap;
uint8_t m_flipscreen_x;
@@ -526,24 +437,40 @@ protected:
uint8_t m_stars_blink_state;
rgb_t m_bullet_color[8];
uint8_t m_gfxbank[5];
- uint8_t m_leftspriteclip;
+ uint8_t m_leftspriteclip = 16;
+};
- void fourplay_rombank_w(offs_t offset, uint8_t data);
- void videight_rombank_w(offs_t offset, uint8_t data);
- void videight_gfxbank_w(offs_t offset, uint8_t data);
- void videight_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
- void videight_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
- void fourplay_map(address_map &map);
- void videight_map(address_map &map);
+
+class bagmanmc_state : public galaxian_state
+{
+public:
+ bagmanmc_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ {
+ }
+
+ void bagmanmc(machine_config &config);
+ void init_bagmanmc();
+
+protected:
+ void bagmanmc_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
+ void bagmanmc_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
+
+private:
+ void bagmanmc_map(address_map &map);
+ void bagmanmc_io_map(address_map &map);
};
-class gmgalax_state : public galaxian_state
+
+class gmgalax_state : public bagmanmc_state
{
public:
gmgalax_state(const machine_config &mconfig, device_type type, const char *tag)
- : galaxian_state(mconfig, type, tag)
+ : bagmanmc_state(mconfig, type, tag)
, m_glin(*this, "GLIN%u", 0U)
, m_gmin(*this, "GMIN%u", 0U)
+ , m_gamesel(*this, "GAMESEL")
+ , m_rombank(*this, "rombank")
{ }
void gmgalax(machine_config &config);
@@ -553,28 +480,360 @@ public:
void init_gmgalax();
+protected:
+ virtual void machine_start() override;
+
private:
- uint8_t m_selected_game;
+ void gmgalax_map(address_map &map);
+
required_ioport_array<3> m_glin;
required_ioport_array<3> m_gmin;
+ required_ioport m_gamesel;
+ required_memory_bank m_rombank;
+
+ uint8_t m_selected_game;
+};
+
+
+class pisces_state : public galaxian_state
+{
+public:
+ pisces_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ {
+ }
+
+ void pisces(machine_config &config);
+ void porter(machine_config &config);
+ void skybase(machine_config &config);
+
+ void init_pisces();
+
+protected:
+ void pisces_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
+ void pisces_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
+
+private:
+ void pisces_map(address_map &map);
+ void skybase_map(address_map &map);
+ void porter_map(address_map &map);
+};
+
+
+class fourplay_state : public pisces_state
+{
+public:
+ fourplay_state(const machine_config &mconfig, device_type type, const char *tag)
+ : pisces_state(mconfig, type, tag)
+ , m_rombank(*this, "rombank")
+ {
+ }
+
+ void fourplay(machine_config &config);
+ void init_fourplay();
+
+private:
+ void fourplay_rombank_w(offs_t offset, uint8_t data);
+ void fourplay_map(address_map &map);
+
+ required_memory_bank m_rombank;
+};
+
+
+class mshuttle_state : public galaxian_state
+{
+public:
+ mshuttle_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ {
+ }
+
+ void mshuttle(machine_config &config);
+
+ void init_mshuttle();
+ void init_mshuttlj();
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void ay8910_cs_w(uint8_t data);
+ void ay8910_control_w(uint8_t data);
+ void ay8910_data_w(uint8_t data);
+ uint8_t ay8910_data_r();
+
+ void mshuttle_map(address_map &map);
+ void mshuttle_decrypted_opcodes_map(address_map &map);
+ void mshuttle_portmap(address_map &map);
+
+ void mshuttle_decode(const uint8_t convtable[8][16]);
+
+ uint8_t m_ay8910_cs;
};
+
+class kingball_state : public galaxian_state
+{
+public:
+ kingball_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ , m_dac(*this, "dac")
+ , m_mux_port(*this, "FAKE")
+ {
+ }
+
+ DECLARE_READ_LINE_MEMBER(muxbit_r);
+ DECLARE_READ_LINE_MEMBER(noise_r);
+
+ void kingball(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void speech_dip_w(uint8_t data);
+ void sound1_w(uint8_t data);
+ void sound2_w(uint8_t data);
+ void dac_w(uint8_t data);
+
+ void kingball_map(address_map &map);
+ void kingball_sound_map(address_map &map);
+ void kingball_sound_portmap(address_map &map);
+
+ required_device<dac_byte_interface> m_dac;
+ required_ioport m_mux_port;
+
+ uint8_t m_speech_dip;
+ uint8_t m_sound;
+};
+
+
class namenayo_state : public galaxian_state
{
public:
namenayo_state(const machine_config &mconfig, device_type type, const char *tag)
: galaxian_state(mconfig, type, tag)
+ , m_exattrram(*this, "extattrram")
{
- m_leftspriteclip = 0;
}
void namenayo(machine_config &config);
void init_namenayo();
private:
+ void namenayo_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void namenayo_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
+ void namenayo_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
void namenayo_map(address_map &map);
void namenayo_extattr_w(offs_t offset, uint8_t data);
void namenayo_unk_d800_w(uint8_t data);
+
+ required_shared_ptr<uint8_t> m_exattrram;
+};
+
+
+class tenspot_state : public galaxian_state
+{
+public:
+ tenspot_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ , m_game_dsw(*this, "IN2_GAME%u", 0U)
+ , m_mainbank(*this, "mainbank")
+ {
+ }
+
+ DECLARE_INPUT_CHANGED_MEMBER(tenspot_fake);
+
+ void tenspot(machine_config &config);
+
+ void init_tenspot();
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void unk_6000_w(uint8_t data);
+ void unk_8000_w(uint8_t data);
+ void unk_e000_w(uint8_t data);
+ uint8_t dsw_read();
+
+ void set_game_bank(int bank, bool invalidate_gfx);
+
+ void tenspot_map(address_map &map);
+ void tenspot_select_map(address_map &map);
+
+ required_ioport_array<10> m_game_dsw;
+ required_memory_bank m_mainbank;
+
+ uint8_t m_current_game;
+};
+
+
+class zigzagb_state : public galaxian_state
+{
+public:
+ zigzagb_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ , m_rombanks(*this, "bank%u", 1U)
+ {
+ }
+
+ void zigzag(machine_config &config);
+ void init_zigzag();
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void bankswap_w(uint8_t data);
+ void ay8910_w(offs_t offset, uint8_t data);
+ void zigzag_map(address_map &map);
+
+ required_memory_bank_array<2> m_rombanks;
+ uint8_t m_ay8910_latch;
+};
+
+
+class videight_state : public galaxian_state
+{
+public:
+ videight_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ , m_rombank(*this, "rombank")
+ {
+ }
+
+ void videight(machine_config &config);
+ void init_videight();
+
+private:
+ void videight_rombank_w(offs_t offset, uint8_t data);
+ void videight_gfxbank_w(offs_t offset, uint8_t data);
+ void videight_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y);
+ void videight_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color);
+ void videight_map(address_map &map);
+
+ required_memory_bank m_rombank;
+};
+
+
+class guttangt_state : public galaxian_state
+{
+public:
+ guttangt_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ , m_rombank(*this, "rombank")
+ {
+ }
+
+ void guttangt(machine_config &config);
+ void init_guttangt();
+
+private:
+ void guttangt_map(address_map &map);
+ void guttangt_rombank_w(uint8_t data);
+
+ required_memory_bank m_rombank;
+};
+
+
+class zac_scorpion_state : public galaxian_state
+{
+public:
+ zac_scorpion_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ , m_digitalker(*this, "digitalker")
+ {
+ }
+
+ void scorpion(machine_config &config);
+ void init_scorpion();
+
+private:
+ uint8_t ay8910_r(offs_t offset);
+ void ay8910_w(offs_t offset, uint8_t data);
+ uint8_t digitalker_intr_r();
+ void digitalker_control_w(uint8_t data);
+ uint8_t protection_r();
+ void protection_w(uint8_t data);
+
+ void scorpion_map(address_map &map);
+ void scorpion_sound_map(address_map &map);
+ void scorpion_sound_portmap(address_map &map);
+
+ required_device<digitalker_device> m_digitalker;
+};
+
+
+class taiyo_sfx_state : public galaxian_state
+{
+public:
+ taiyo_sfx_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ , m_audio2(*this, "audio2")
+ , m_dac(*this, "dac")
+ {
+ }
+
+ void sfx(machine_config &config);
+ void monsterz(machine_config &config);
+
+ void init_sfx();
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ uint8_t sample_io_r(offs_t offset);
+ void sample_io_w(offs_t offset, uint8_t data);
+ void sample_control_w(uint8_t data);
+
+ uint8_t monsterz_protection_r();
+ void monsterz_porta_1_w(uint8_t data);
+ void monsterz_portb_1_w(uint8_t data);
+ void monsterz_portc_1_w(uint8_t data);
+ void monsterz_set_latch();
+
+ void sfx_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void sfx_map(address_map &map);
+ void sfx_sample_map(address_map &map);
+ void sfx_sample_portmap(address_map &map);
+ void monsterz_map(address_map &map);
+ void monsterz_sound_map(address_map &map);
+
+ required_device<cpu_device> m_audio2;
+ required_device<dac_byte_interface> m_dac;
+
+ uint8_t m_sample_control;
+};
+
+
+class moonwar_state : public galaxian_state
+{
+public:
+ moonwar_state(const machine_config &mconfig, device_type type, const char *tag)
+ : galaxian_state(mconfig, type, tag)
+ , m_dials(*this, "P%u_DIAL", 1U)
+ {
+ }
+
+ DECLARE_CUSTOM_INPUT_MEMBER(dial_r);
+
+ void moonwar(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void port_select_w(uint8_t data);
+ void moonwar_palette(palette_device &palette);
+
+ required_ioport_array<2> m_dials;
+
+ uint8_t m_port_select;
+ uint8_t m_direction[2];
+ uint8_t m_counter_74ls161[2];
};
#endif // MAME_INCLUDES_GALAXIAN_H
diff --git a/src/mame/includes/galaxold.h b/src/mame/includes/galaxold.h
index f9c70f8c9b2..cf2f7b61b64 100644
--- a/src/mame/includes/galaxold.h
+++ b/src/mame/includes/galaxold.h
@@ -46,7 +46,6 @@ public:
, m_spriteram2(*this,"spriteram2")
, m_attributesram(*this,"attributesram")
, m_bulletsram(*this,"bulletsram")
- , m_rockclim_videoram(*this,"rockclim_vram")
, m_racknrol_tiles_bank(*this,"racknrol_tbank")
, m_leds(*this, "led%u", 0U)
, m_leftclip(2)
@@ -67,14 +66,12 @@ public:
optional_shared_ptr<uint8_t> m_spriteram2;
required_shared_ptr<uint8_t> m_attributesram;
optional_shared_ptr<uint8_t> m_bulletsram;
- optional_shared_ptr<uint8_t> m_rockclim_videoram;
optional_shared_ptr<uint8_t> m_racknrol_tiles_bank;
output_finder<2> m_leds;
int m_irq_line;
uint8_t m__4in1_bank;
tilemap_t *m_bg_tilemap;
- tilemap_t *m_rockclim_tilemap;
int m_spriteram2_present;
uint8_t m_gfxbank[5];
uint8_t m_flipscreen_x;
@@ -98,8 +95,6 @@ public:
uint8_t m_background_green;
uint8_t m_background_blue;
void (galaxold_state::*m_draw_background)(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); /* function to call to draw the background */
- uint16_t m_rockclim_v;
- uint16_t m_rockclim_h;
int m_dambustr_bg_split_line;
int m_dambustr_bg_color_1;
int m_dambustr_bg_color_2;
@@ -147,10 +142,6 @@ public:
void galaxold_stars_enable_w(uint8_t data);
void darkplnt_bullet_color_w(uint8_t data);
void galaxold_gfxbank_w(offs_t offset, uint8_t data);
- void rockclim_videoram_w(offs_t offset, uint8_t data);
- void rockclim_scroll_w(offs_t offset, uint8_t data);
- void guttang_rombank_w(uint8_t data);
- uint8_t rockclim_videoram_r(offs_t offset);
void dambustr_bg_split_line_w(uint8_t data);
void dambustr_bg_color_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(galaxold_7474_9m_2_q_callback);
@@ -163,20 +154,18 @@ public:
void init_bullsdrtg();
void init_ladybugg();
void init_4in1();
- void init_guttangt();
TILE_GET_INFO_MEMBER(drivfrcg_get_tile_info);
TILE_GET_INFO_MEMBER(racknrol_get_tile_info);
TILE_GET_INFO_MEMBER(dambustr_get_tile_info2);
TILE_GET_INFO_MEMBER(get_tile_info);
- TILE_GET_INFO_MEMBER(rockclim_get_tile_info);
TILE_GET_INFO_MEMBER(harem_get_tile_info);
DECLARE_MACHINE_RESET(galaxold);
DECLARE_MACHINE_RESET(hunchbkg);
void galaxold_palette(palette_device &palette);
- void rockclim_palette(palette_device &palette) const;
+ void s2650_palette(palette_device &palette) const;
void scrambold_palette(palette_device &palette);
void stratgyx_palette(palette_device &palette);
void darkplnt_palette(palette_device &palette) const;
@@ -195,7 +184,6 @@ public:
DECLARE_VIDEO_START(pisces);
DECLARE_VIDEO_START(dkongjrm);
DECLARE_VIDEO_START(dkongjrmc);
- DECLARE_VIDEO_START(rockclim);
DECLARE_VIDEO_START(galaxold_plain);
DECLARE_VIDEO_START(ckongs);
DECLARE_VIDEO_START(darkplnt);
@@ -221,8 +209,6 @@ public:
void video_start_common();
void pisces_modify_spritecode(uint8_t *spriteram, int *code, int *flipx, int *flipy, int offs);
void mooncrst_modify_spritecode(uint8_t *spriteram, int *code, int *flipx, int *flipy, int offs);
- void rockclim_draw_background(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void rockclim_modify_spritecode(uint8_t *spriteram, int *code, int *flipx, int *flipy, int offs);
void harem_modify_spritecode(uint8_t *spriteram, int *code, int *flipx, int *flipy, int offs);
void mooncrst_modify_charcode(uint16_t *code, uint8_t x);
void pisces_modify_charcode(uint16_t *code, uint8_t x);
@@ -277,12 +263,10 @@ public:
void dkongjrmc(machine_config &config);
void bullsdrtg(machine_config &config);
void drivfrcg(machine_config &config);
- void rockclim(machine_config &config);
void scramblb(machine_config &config);
void scramb2(machine_config &config);
void scramb3(machine_config &config);
void mooncrst(machine_config &config);
- void guttang(machine_config &config);
void galaxian_audio(machine_config &config);
void mooncrst_audio(machine_config &config);
void _4in1_map(address_map &map);
@@ -292,7 +276,6 @@ public:
void drivfrcg_program(address_map &map);
void drivfrcg_io(address_map &map);
void galaxold_map(address_map &map);
- void guttang_map(address_map &map);
void hexpoola_data(address_map &map);
void hexpoola_io(address_map &map);
void hunchbkg_map(address_map &map);
@@ -301,7 +284,6 @@ public:
void mooncrst_map(address_map &map);
void racknrol_map(address_map &map);
void racknrol_io(address_map &map);
- void rockclim_map(address_map &map);
void scramb_common_map(address_map &map);
void scramb2_map(address_map &map);
void scramb3_map(address_map &map);
diff --git a/src/mame/includes/gameplan.h b/src/mame/includes/gameplan.h
index ed399a51857..e20565a61c4 100644
--- a/src/mame/includes/gameplan.h
+++ b/src/mame/includes/gameplan.h
@@ -81,6 +81,7 @@ private:
uint8_t m_video_y;
uint8_t m_video_command;
uint8_t m_video_data;
+ uint8_t m_video_previous;
/* devices */
optional_device<cpu_device> m_audiocpu;
diff --git a/src/mame/includes/inufuku.h b/src/mame/includes/inufuku.h
deleted file mode 100644
index e3a0fc4bf61..00000000000
--- a/src/mame/includes/inufuku.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Takahiro Nogi
-#ifndef MAME_INCLUDES_INUFUKU_H
-#define MAME_INCLUDES_INUFUKU_H
-
-#include "video/vsystem_spr.h"
-#include "machine/gen_latch.h"
-#include "emupal.h"
-#include "tilemap.h"
-
-class inufuku_state : public driver_device
-{
-public:
- inufuku_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_bg_videoram(*this, "bg_videoram"),
- m_bg_rasterram(*this, "bg_rasterram"),
- m_tx_videoram(*this, "tx_videoram"),
- m_spriteram1(*this, "spriteram1"),
- m_spriteram2(*this, "spriteram2"),
- m_maincpu(*this, "maincpu"),
- m_audiocpu(*this, "audiocpu"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_spr(*this, "vsystem_spr"),
- m_soundlatch(*this, "soundlatch") { }
-
- void inufuku(machine_config &config);
- void _3on3dunk(machine_config &config);
-
- DECLARE_READ_LINE_MEMBER(soundflag_r);
-
-private:
- /* memory pointers */
- required_shared_ptr<uint16_t> m_bg_videoram;
- required_shared_ptr<uint16_t> m_bg_rasterram;
- required_shared_ptr<uint16_t> m_tx_videoram;
- required_shared_ptr<uint16_t> m_spriteram1;
- required_shared_ptr<uint16_t> m_spriteram2;
-
- /* video-related */
- tilemap_t *m_bg_tilemap;
- tilemap_t *m_tx_tilemap;
- int m_bg_scrollx;
- int m_bg_scrolly;
- int m_tx_scrollx;
- int m_tx_scrolly;
- int m_bg_raster;
- int m_bg_palettebank;
- int m_tx_palettebank;
- std::unique_ptr<uint16_t[]> m_spriteram1_old;
- uint32_t inufuku_tile_callback( uint32_t code );
-
- /* devices */
- required_device<cpu_device> m_maincpu;
- required_device<cpu_device> m_audiocpu;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<palette_device> m_palette;
- required_device<vsystem_spr_device> m_spr;
- required_device<generic_latch_8_device> m_soundlatch;
-
- void inufuku_soundrombank_w(uint8_t data);
- void inufuku_palettereg_w(offs_t offset, uint16_t data);
- void inufuku_scrollreg_w(offs_t offset, uint16_t data);
- uint16_t inufuku_bg_videoram_r(offs_t offset);
- void inufuku_bg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- uint16_t inufuku_tx_videoram_r(offs_t offset);
- void inufuku_tx_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- TILE_GET_INFO_MEMBER(get_inufuku_bg_tile_info);
- TILE_GET_INFO_MEMBER(get_inufuku_tx_tile_info);
- virtual void machine_start() override;
- virtual void machine_reset() override;
- virtual void video_start() override;
- uint32_t screen_update_inufuku(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- DECLARE_WRITE_LINE_MEMBER(screen_vblank_inufuku);
- void inufuku_map(address_map &map);
- void inufuku_sound_io_map(address_map &map);
- void inufuku_sound_map(address_map &map);
-};
-
-#endif // MAME_INCLUDES_INUFUKU_H
diff --git a/src/mame/includes/m79amb.h b/src/mame/includes/m79amb.h
index 79579cf7510..1dce0eb9edc 100644
--- a/src/mame/includes/m79amb.h
+++ b/src/mame/includes/m79amb.h
@@ -5,6 +5,7 @@
#pragma once
+#include "cpu/i8085/i8085.h"
#include "sound/discrete.h"
class m79amb_state : public driver_device
@@ -30,8 +31,7 @@ private:
void m79amb_8000_w(uint8_t data);
void m79amb_8002_w(uint8_t data);
void m79amb_8003_w(uint8_t data);
-
- INTERRUPT_GEN_MEMBER(m79amb_interrupt);
+ uint8_t inta_r();
void machine_start() override;
@@ -42,7 +42,7 @@ private:
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_mask;
required_device<discrete_device> m_discrete;
- required_device<cpu_device> m_maincpu;
+ required_device<i8080_cpu_device> m_maincpu;
output_finder<> m_self_test;
diff --git a/src/mame/includes/mbee.h b/src/mame/includes/mbee.h
index f1248babb4c..404601064ab 100644
--- a/src/mame/includes/mbee.h
+++ b/src/mame/includes/mbee.h
@@ -65,7 +65,10 @@ public:
, m_bankr(*this, "bankr%d", 0U)
, m_bankw(*this, "bankw%d", 0U)
, m_pak(*this, "optrom%u", 0U) // "rom" causes issues
- { }
+ {
+ for (u8 n : m_pak_extended)
+ m_pak_extended[n] = 0;
+ }
void mbee56(machine_config &config);
void mbeeppc(machine_config &config);
@@ -76,6 +79,7 @@ public:
void mbeeic(machine_config &config);
void mbeepc85(machine_config &config);
void mbee128p(machine_config &config);
+ void mbeepp(machine_config &config);
void remove_carts(machine_config &config);
void remove_quick(machine_config &config);
@@ -122,8 +126,10 @@ private:
uint32_t screen_update_mbee(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(newkb_timer);
image_init_result load_cart(device_image_interface &image, generic_slot_device *slot, u8);
+ void unload_cart(u8);
DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
template <u8 T> DECLARE_DEVICE_IMAGE_LOAD_MEMBER(pak_load) { return load_cart(image, m_pak[T], T); }
+ template <u8 T> DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER(pak_unload) { unload_cart(T); }
WRITE_LINE_MEMBER(rtc_irq_w);
WRITE_LINE_MEMBER(fdc_intrq_w);
WRITE_LINE_MEMBER(fdc_drq_w);
@@ -134,6 +140,7 @@ private:
required_device<palette_device> m_palette;
void mbee128_io(address_map &map);
+ void mbee128p_io(address_map &map);
void mbee256_io(address_map &map);
void mbee256_mem(address_map &map);
void mbee56_io(address_map &map);
diff --git a/src/mame/includes/mermaid.h b/src/mame/includes/mermaid.h
index be883de73fb..228f34f52fb 100644
--- a/src/mame/includes/mermaid.h
+++ b/src/mame/includes/mermaid.h
@@ -38,6 +38,7 @@ public:
m_palette(*this, "palette"),
m_latch(*this, "latch%u", 1U)
{
+ m_bg_split = 0;
}
void rougien(machine_config &config);
@@ -57,11 +58,15 @@ private:
tilemap_t *m_fg_tilemap;
bitmap_ind16 m_helper;
bitmap_ind16 m_helper2;
+ bitmap_ind16 m_helper_mask;
int m_coll_bit0;
int m_coll_bit1;
int m_coll_bit2;
int m_coll_bit3;
int m_coll_bit6;
+ int m_bg_split;
+ int m_bg_mask;
+ int m_bg_bank;
int m_rougien_gfxbank1;
int m_rougien_gfxbank2;
@@ -99,6 +104,8 @@ private:
DECLARE_WRITE_LINE_MEMBER(flip_screen_y_w);
void mermaid_bg_scroll_w(offs_t offset, uint8_t data);
void mermaid_fg_scroll_w(offs_t offset, uint8_t data);
+ DECLARE_WRITE_LINE_MEMBER(bg_mask_w);
+ DECLARE_WRITE_LINE_MEMBER(bg_bank_w);
DECLARE_WRITE_LINE_MEMBER(rougien_gfxbankswitch1_w);
DECLARE_WRITE_LINE_MEMBER(rougien_gfxbankswitch2_w);
uint8_t mermaid_collision_r();
diff --git a/src/mame/includes/namcos2.h b/src/mame/includes/namcos2.h
index 9181d69f1c6..e0579a37fe2 100644
--- a/src/mame/includes/namcos2.h
+++ b/src/mame/includes/namcos2.h
@@ -114,6 +114,7 @@ public:
void init_valkyrie();
void init_fourtrax();
void init_finalap3();
+ void init_finalap3bl();
void init_luckywld();
void init_assaultj();
void init_dsaberj();
@@ -241,7 +242,9 @@ enum
uint16_t namcos2_68k_key_r(offs_t offset);
void namcos2_68k_key_w(offs_t offset, uint16_t data);
- uint16_t namcos2_finallap_prot_r(offs_t offset);
+ uint16_t namcos2_finallap_prot_r(offs_t offset); // finalap2, finalap3
+ uint16_t finalap3bl_prot_r(); // finalap3bl
+
void GollyGhostUpdateLED_c4(int data);
void GollyGhostUpdateLED_c6(int data);
void GollyGhostUpdateLED_c8(int data);
diff --git a/src/mame/includes/naomi.h b/src/mame/includes/naomi.h
index a128305cb94..620aa13085f 100644
--- a/src/mame/includes/naomi.h
+++ b/src/mame/includes/naomi.h
@@ -28,6 +28,7 @@ naomi.h -> NAOMI includes
#include "machine/jvs13551.h"
#include "machine/m3comm.h"
#include "machine/gunsense.h"
+#include "machine/segashiobd.h"
#include "dc.h"
enum {
@@ -54,6 +55,7 @@ class naomi_state : public dc_state
void naomim2_gun(machine_config &config);
void naomi(machine_config &config);
void naomim1(machine_config &config);
+ void naomim1_hop(machine_config &config);
void naomigd(machine_config &config);
void naomigd_kb(machine_config &config);
void naomim4(machine_config &config);
diff --git a/src/mame/includes/newbrain.h b/src/mame/includes/newbrain.h
index 80eb1dec811..381b8e53682 100644
--- a/src/mame/includes/newbrain.h
+++ b/src/mame/includes/newbrain.h
@@ -30,7 +30,7 @@ public:
m_maincpu(*this, Z80_TAG),
m_cop(*this, COP420_TAG),
m_palette(*this, "palette"),
- m_exp(*this, NEWBRAIN_EXPANSION_SLOT_TAG),
+ m_exp(*this, "exp"),
m_cassette1(*this, "cassette1"),
m_cassette2(*this, "cassette2"),
m_rs232_v24(*this, RS232_V24_TAG),
diff --git a/src/mame/includes/ojankohs.h b/src/mame/includes/ojankohs.h
index 1d092da76cf..db514b1a319 100644
--- a/src/mame/includes/ojankohs.h
+++ b/src/mame/includes/ojankohs.h
@@ -23,9 +23,6 @@ public:
{ }
void ojankohs(machine_config &config);
- void ccasino(machine_config &config);
- void ojankoc(machine_config &config);
- void ojankoy(machine_config &config);
protected:
ojankohs_state(const machine_config &mconfig, device_type type, const char *tag, uint32_t vramsize, uint32_t pramsize) :
@@ -33,107 +30,85 @@ protected:
m_videoram(*this, "videoram", vramsize, ENDIANNESS_LITTLE),
m_colorram(*this, "colorram", 0x1000, ENDIANNESS_LITTLE),
m_paletteram(*this, "paletteram", pramsize, ENDIANNESS_LITTLE),
+ m_mainbank(*this, "mainbank"),
m_maincpu(*this, "maincpu"),
m_msm(*this, "msm"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
m_coin(*this, "coin"),
- m_inputs_p1(*this, {"p1_0", "p1_1", "p1_2", "p1_3"}),
- m_inputs_p2(*this, {"p2_0", "p2_1", "p2_2", "p2_3"}),
+ m_inputs_p1(*this, "p1_%u", 0U),
+ m_inputs_p2(*this, "p2_%u", 0U),
m_inputs_p1_extra(*this, "p1_4"),
m_inputs_p2_extra(*this, "p2_4"),
- m_dsw1(*this, "dsw1"), m_dsw2(*this, "dsw2"),
- m_dsw3(*this, "dsw3"), m_dsw4(*this, "dsw4")
+ m_dsw(*this, "dsw%u", 1U)
{ }
+ virtual void machine_start() override;
virtual void machine_reset() override;
+ virtual void video_start() override;
-private:
- /* memory pointers */
+ void common_state_saving();
+
+ // memory pointers
memory_share_creator<uint8_t> m_videoram;
memory_share_creator<uint8_t> m_colorram;
memory_share_creator<uint8_t> m_paletteram;
+ required_memory_bank m_mainbank;
- /* video-related */
- tilemap_t *m_tilemap;
+ // video-related
+ tilemap_t *m_tilemap;
bitmap_ind16 m_tmpbitmap;
- int m_gfxreg;
- int m_flipscreen;
- int m_flipscreen_old;
- int m_scrollx;
- int m_scrolly;
- int m_screen_refresh;
-
- /* misc */
- uint8_t m_port_select;
- int m_adpcm_reset;
- int m_adpcm_data;
- int m_vclk_left;
-
- /* devices */
+ uint8_t m_gfxreg;
+ uint8_t m_flipscreen;
+ uint8_t m_flipscreen_old;
+ int16_t m_scrollx;
+ int16_t m_scrolly;
+ uint8_t m_screen_refresh;
+
+ // misc
+ uint8_t m_port_select;
+ uint8_t m_adpcm_reset;
+ int m_adpcm_data;
+ uint8_t m_vclk_left;
+
+ // devices
required_device<cpu_device> m_maincpu;
required_device<msm5205_device> m_msm;
optional_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
+
+ // I/O ports
required_ioport m_coin;
required_ioport_array<4> m_inputs_p1;
required_ioport_array<4> m_inputs_p2;
optional_ioport m_inputs_p1_extra;
optional_ioport m_inputs_p2_extra;
- required_ioport m_dsw1;
- required_ioport m_dsw2;
- optional_ioport m_dsw3;
- optional_ioport m_dsw4;
-
- void ojankohs_rombank_w(uint8_t data);
- void ojankoy_rombank_w(uint8_t data);
- void ojankohs_msm5205_w(uint8_t data);
- void ojankoc_ctrl_w(uint8_t data);
+ required_ioport_array<2> m_dsw;
+
+
+ void rombank_w(uint8_t data);
+ void msm5205_w(uint8_t data);
void port_select_w(uint8_t data);
uint8_t keymatrix_p1_r();
uint8_t keymatrix_p2_r();
- uint8_t ojankoc_keymatrix_p1_r();
- uint8_t ojankoc_keymatrix_p2_r();
- uint8_t ccasino_dipsw3_r();
- uint8_t ccasino_dipsw4_r();
- void ojankoy_coinctr_w(uint8_t data);
- void ccasino_coinctr_w(uint8_t data);
- void ojankohs_palette_w(offs_t offset, uint8_t data);
- void ccasino_palette_w(offs_t offset, uint8_t data);
- void ojankoc_palette_w(offs_t offset, uint8_t data);
- void ojankohs_videoram_w(offs_t offset, uint8_t data);
- void ojankohs_colorram_w(offs_t offset, uint8_t data);
- void ojankohs_gfxreg_w(uint8_t data);
- void ojankohs_flipscreen_w(uint8_t data);
- void ojankoc_videoram_w(offs_t offset, uint8_t data);
- void ojankohs_adpcm_reset_w(uint8_t data);
- uint8_t ojankohs_dipsw1_r();
- uint8_t ojankohs_dipsw2_r();
- TILE_GET_INFO_MEMBER(ojankohs_get_tile_info);
- TILE_GET_INFO_MEMBER(ojankoy_get_tile_info);
- DECLARE_MACHINE_START(ojankohs);
- DECLARE_VIDEO_START(ojankohs);
- DECLARE_MACHINE_START(ojankoy);
- DECLARE_VIDEO_START(ojankoy);
- void ojankoy_palette(palette_device &palette) const;
- DECLARE_VIDEO_START(ccasino);
- DECLARE_MACHINE_START(ojankoc);
- DECLARE_VIDEO_START(ojankoc);
- DECLARE_MACHINE_START(common);
- uint32_t screen_update_ojankohs(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_ojankoc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void ojankoc_flipscreen(int data);
- DECLARE_WRITE_LINE_MEMBER(ojankohs_adpcm_int);
-
- void ccasino_io_map(address_map &map);
- void ojankoc_io_map(address_map &map);
- void ojankoc_map(address_map &map);
- void ojankohs_io_map(address_map &map);
- void ojankohs_map(address_map &map);
- void ojankoy_io_map(address_map &map);
- void ojankoy_map(address_map &map);
+ void videoram_w(offs_t offset, uint8_t data);
+ void colorram_w(offs_t offset, uint8_t data);
+ void flipscreen_w(uint8_t data);
+ void adpcm_reset_w(uint8_t data);
+ TILE_GET_INFO_MEMBER(get_tile_info);
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ DECLARE_WRITE_LINE_MEMBER(adpcm_int);
+
+private:
+ void palette_w(offs_t offset, uint8_t data);
+ uint8_t dipsw1_r();
+ uint8_t dipsw2_r();
+ void gfxreg_w(uint8_t data);
+
+ void io_map(address_map &map);
+ void map(address_map &map);
};
class ojankoy_state : public ojankohs_state
@@ -142,14 +117,45 @@ public:
ojankoy_state(const machine_config &mconfig, device_type type, const char *tag) :
ojankohs_state(mconfig, type, tag, 0x2000, 0x800)
{ }
+
+ void ojankoy(machine_config &config);
+
+protected:
+ ojankoy_state(const machine_config &mconfig, device_type type, const char *tag, uint32_t vramsize, uint32_t pramsize) :
+ ojankohs_state(mconfig, type, tag, vramsize, pramsize)
+ { }
+
+ virtual void video_start() override;
+
+ void map(address_map &map);
+
+ void rombank_w(uint8_t data);
+
+private:
+ void coinctr_w(uint8_t data);
+ TILE_GET_INFO_MEMBER(get_tile_info);
+ void palette(palette_device &palette) const;
+ void io_map(address_map &map);
};
-class ccasino_state : public ojankohs_state
+class ccasino_state : public ojankoy_state
{
public:
ccasino_state(const machine_config &mconfig, device_type type, const char *tag) :
- ojankohs_state(mconfig, type, tag, 0x2000, 0x800)
+ ojankoy_state(mconfig, type, tag, 0x2000, 0x800),
+ m_extra_dsw(*this, "dsw%u", 3U)
{ }
+
+ void ccasino(machine_config &config);
+
+private:
+ required_ioport_array<2> m_extra_dsw;
+
+ uint8_t dipsw3_r();
+ uint8_t dipsw4_r();
+ void coinctr_w(uint8_t data);
+ void palette_w(offs_t offset, uint8_t data);
+ void io_map(address_map &map);
};
class ojankoc_state : public ojankohs_state
@@ -158,6 +164,23 @@ public:
ojankoc_state(const machine_config &mconfig, device_type type, const char *tag) :
ojankohs_state(mconfig, type, tag, 0x8000, 0x20)
{ }
+
+ void ojankoc(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void video_start() override;
+
+private:
+ void ctrl_w(uint8_t data);
+ uint8_t keymatrix_p1_r();
+ uint8_t keymatrix_p2_r();
+ void palette_w(offs_t offset, uint8_t data);
+ void videoram_w(offs_t offset, uint8_t data);
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void flipscreen(uint8_t data);
+ void io_map(address_map &map);
+ void map(address_map &map);
};
#endif // MAME_INCLUDES_OJANKOHS_H
diff --git a/src/mame/includes/seta.h b/src/mame/includes/seta.h
index 9bcf747876f..bb290cdc3ba 100644
--- a/src/mame/includes/seta.h
+++ b/src/mame/includes/seta.h
@@ -279,7 +279,7 @@ protected:
u8 m_twineagl_xram[8];
u8 m_twineagl_tilebank[4];
- std::unique_ptr<u16[]> m_downtown_protection;
+ std::unique_ptr<u8[]> m_downtown_protection;
u16 metafox_protection_r(offs_t offset);
void twineagl_tilebank_w(offs_t offset, u8 data);
diff --git a/src/mame/includes/stv.h b/src/mame/includes/stv.h
index b9a1983e225..6b319d59d03 100644
--- a/src/mame/includes/stv.h
+++ b/src/mame/includes/stv.h
@@ -26,7 +26,8 @@ public:
m_cryptdevice(*this, "315_5881"),
m_5838crypt(*this, "315_5838"),
m_hopper(*this, "hopper"),
- m_billboard(*this, "billboard")
+ m_billboard(*this, "billboard"),
+ m_cc_digits(*this, "cc_digit%u", 0U)
{
}
@@ -88,10 +89,15 @@ public:
void init_othellos();
void init_mausuke();
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
uint8_t stv_ioga_r(offs_t offset);
void stv_ioga_w(offs_t offset, uint8_t data);
uint8_t critcrsh_ioga_r(offs_t offset);
+ void critcrsh_ioga_w(offs_t offset, uint8_t data);
uint8_t magzun_ioga_r(offs_t offset);
void magzun_ioga_w(offs_t offset, uint8_t data);
uint8_t stvmp_ioga_r(offs_t offset);
@@ -112,10 +118,6 @@ private:
void install_stvbios_speedups( void );
- DECLARE_MACHINE_START(stv);
- DECLARE_MACHINE_RESET(stv);
-
- DECLARE_MACHINE_RESET(batmanfr);
void batmanfr_sound_comms_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
optional_device<acclaim_rax_device> m_rax;
@@ -149,6 +151,7 @@ private:
optional_device<sega_315_5838_comp_device> m_5838crypt;
optional_device<ticket_dispenser_device> m_hopper;
required_device<sega_billboard_device> m_billboard;
+ output_finder<2> m_cc_digits;
uint16_t crypt_read_callback(uint32_t addr);
uint8_t pdr1_input_r();
diff --git a/src/mame/includes/taitosj.h b/src/mame/includes/taitosj.h
index 158134f42cd..2264e5afd8f 100644
--- a/src/mame/includes/taitosj.h
+++ b/src/mame/includes/taitosj.h
@@ -62,6 +62,7 @@ protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
+ virtual void device_post_load() override;
private:
required_shared_ptr_array<uint8_t, 3> m_videoram;
diff --git a/src/mame/includes/vip.h b/src/mame/includes/vip.h
index 785df2b45ba..7f1013779e2 100644
--- a/src/mame/includes/vip.h
+++ b/src/mame/includes/vip.h
@@ -30,7 +30,7 @@ public:
, m_cassette(*this, "cassette")
, m_beeper(*this, DISCRETE_TAG)
, m_byteio(*this, VIP_BYTEIO_PORT_TAG)
- , m_exp(*this, VIP_EXPANSION_SLOT_TAG)
+ , m_exp(*this, "exp")
, m_ram(*this, RAM_TAG)
, m_rom(*this, CDP1802_TAG)
, m_chip8(*this, "chip8")
diff --git a/src/mame/includes/x68k.h b/src/mame/includes/x68k.h
index f22d422b1c1..45a68de4305 100644
--- a/src/mame/includes/x68k.h
+++ b/src/mame/includes/x68k.h
@@ -198,7 +198,6 @@ protected:
int bg_hshift;
int bg_vshift;
int bg_hvres; // bits 0,1 = H-Res, bits 2,3 = V-Res, bit 4 = L/H Freq (0=15.98kHz, 1=31.5kHz)
- int bg_double; // 1 if PCG is to be doubled.
} m_video;
struct
{
diff --git a/src/mame/layout/critcrsh.lay b/src/mame/layout/critcrsh.lay
new file mode 100644
index 00000000000..3e57192a1e9
--- /dev/null
+++ b/src/mame/layout/critcrsh.lay
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!--
+license: CC0
+
+Critter Crusher (STV)
+-->
+
+<mamelayout version="2">
+
+ <element name="cc_digit" defstate="0">
+ <led7seg>
+ <color red="1.0" green="0.1" blue="0.1" />
+ </led7seg>
+ </element>
+
+ <view name="Billboard">
+ <element name="cc_digit0" ref="cc_digit">
+ <bounds x="370" y="30" width="15" height="30" />
+ </element>
+
+ <element name="cc_digit1" ref="cc_digit">
+ <bounds x="400" y="30" width="15" height="30" />
+ </element>
+
+ <screen tag="screen">
+ <bounds left="0" top="100" right="800" bottom="700" />
+ </screen>
+ </view>
+
+</mamelayout>
diff --git a/src/mame/layout/lk3000.lay b/src/mame/layout/lk3000.lay
new file mode 100644
index 00000000000..3c263976ee1
--- /dev/null
+++ b/src/mame/layout/lk3000.lay
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!--
+license:CC0
+-->
+<mamelayout version="2">
+
+ <element name="digit" defstate="0">
+ <led16seg><color red="1.0" green="0.1" blue="0.1" /></led16seg>
+ </element>
+
+ <view name="Internal Layout">
+ <element name="digit15" ref="digit"><bounds x="0" y="0" width="10" height="15" /></element>
+ <element name="digit14" ref="digit"><bounds x="10" y="0" width="10" height="15" /></element>
+ <element name="digit13" ref="digit"><bounds x="20" y="0" width="10" height="15" /></element>
+ <element name="digit12" ref="digit"><bounds x="30" y="0" width="10" height="15" /></element>
+
+ <element name="digit11" ref="digit"><bounds x="40" y="0" width="10" height="15" /></element>
+ <element name="digit10" ref="digit"><bounds x="50" y="0" width="10" height="15" /></element>
+ <element name="digit9" ref="digit"><bounds x="60" y="0" width="10" height="15" /></element>
+ <element name="digit8" ref="digit"><bounds x="70" y="0" width="10" height="15" /></element>
+
+ <element name="digit7" ref="digit"><bounds x="80" y="0" width="10" height="15" /></element>
+ <element name="digit6" ref="digit"><bounds x="90" y="0" width="10" height="15" /></element>
+ <element name="digit5" ref="digit"><bounds x="100" y="0" width="10" height="15" /></element>
+ <element name="digit4" ref="digit"><bounds x="110" y="0" width="10" height="15" /></element>
+
+ <element name="digit3" ref="digit"><bounds x="120" y="0" width="10" height="15" /></element>
+ <element name="digit2" ref="digit"><bounds x="130" y="0" width="10" height="15" /></element>
+ <element name="digit1" ref="digit"><bounds x="140" y="0" width="10" height="15" /></element>
+ <element name="digit0" ref="digit"><bounds x="150" y="0" width="10" height="15" /></element>
+ </view>
+</mamelayout>
diff --git a/src/mame/machine/apple3.cpp b/src/mame/machine/apple3.cpp
index a875d6dfc9e..13dd3e0ef84 100644
--- a/src/mame/machine/apple3.cpp
+++ b/src/mame/machine/apple3.cpp
@@ -770,20 +770,15 @@ uint8_t apple3_state::apple3_memory_r(offs_t offset)
{
uint8_t rv = 0xff;
- if (m_inh_state)
+ // /INH handling
+ for (int slot = 1; slot < 5; slot++)
{
- for (int slot = 1; slot < 4; slot++)
+ device_a2bus_card_interface *slotdevice = m_a2bus->get_a2bus_card(slot);
+ if (slotdevice != nullptr)
{
- device_a2bus_card_interface *slotdevice = m_a2bus->get_a2bus_card(slot);
- if (slotdevice != nullptr)
+ if (slotdevice->inh_check(offset, false))
{
- if ((slotdevice->inh_type() & INH_READ) == INH_READ)
- {
- if ((offset >= slotdevice->inh_start()) && (offset <= slotdevice->inh_end()))
- {
- return slotdevice->read_inh_rom(offset);
- }
- }
+ return slotdevice->read_inh_rom(offset);
}
}
}
@@ -925,25 +920,6 @@ uint8_t apple3_state::apple3_memory_r(offs_t offset)
void apple3_state::apple3_memory_w(offs_t offset, uint8_t data)
{
- if (m_inh_state)
- {
- for (int slot = 1; slot < 4; slot++)
- {
- device_a2bus_card_interface *slotdevice = m_a2bus->get_a2bus_card(slot);
- if (slotdevice != nullptr)
- {
- if ((slotdevice->inh_type() & INH_WRITE) == INH_WRITE)
- {
- if ((offset >= slotdevice->inh_start()) && (offset <= slotdevice->inh_end()))
- {
- slotdevice->write_inh_rom(offset, data);
- return;
- }
- }
- }
- }
- }
-
if ((m_indir_bank & 0x80) && (offset >= 0x100))
{
uint8_t *test;
@@ -956,6 +932,19 @@ void apple3_state::apple3_memory_w(offs_t offset, uint8_t data)
}
}
+ for (int slot = 1; slot < 5; slot++)
+ {
+ device_a2bus_card_interface *slotdevice = m_a2bus->get_a2bus_card(slot);
+ if (slotdevice != nullptr)
+ {
+ if (slotdevice->inh_check(offset, true))
+ {
+ slotdevice->write_inh_rom(offset, data);
+ return;
+ }
+ }
+ }
+
if (offset < 0x100)
{
*apple3_get_zpa_addr(offset) = data;
diff --git a/src/mame/machine/coco.cpp b/src/mame/machine/coco.cpp
index 9b202c897a5..8e08656f447 100644
--- a/src/mame/machine/coco.cpp
+++ b/src/mame/machine/coco.cpp
@@ -417,8 +417,7 @@ uint8_t coco_state::pia1_pa_r()
{
// Port A: we need to specify the values of all the lines, regardless of whether
// they are in input or output mode in the DDR
- return (m_cassette->input() >= 0 ? 0x01 : 0x00)
- | (dac_output() << 2);
+ return (m_cassette->input() >= 0 ? 0x01 : 0x00) | 0xfe;
}
diff --git a/src/mame/machine/mbee.cpp b/src/mame/machine/mbee.cpp
index 34b7b673093..a70c470c445 100644
--- a/src/mame/machine/mbee.cpp
+++ b/src/mame/machine/mbee.cpp
@@ -370,7 +370,7 @@ void mbee_state::port50_w(u8 data)
Output the PAK number to choose an optional PAK ROM.
The bios will support 256 PAKs, although normally only
- 8 are available in hardware. Each PAK is normally a 8K
+ 6 are available in hardware. Each PAK is normally a 8K
ROM. If 16K ROMs are used, the 2nd half becomes PAK+8,
thus 16 PAKs in total. This is used in the PC85 models.
@@ -386,7 +386,7 @@ void mbee_state::port0a_w(u8 data)
u8 mbee_state::telcom_r(offs_t offset)
{
m_09 = BIT(offset, 8);
- return 0xff;
+ return m_09;
}
u8 mbee_state::pak_r(offs_t offset)
@@ -540,13 +540,14 @@ void mbee_state::machine_start()
// set pak index to true for 16k roms
if (m_pakdef)
for (u8 i = 8; i < 14; i++)
- m_pak_extended[(i & 7)+2] = (m_p_pakdef[(i<<13)] == 0xff) ? false : true;
- else
- for (u8 i = 2; i < 8; i++)
- m_pak_extended[i] = false;
+ if (!(m_pak[i-8] && m_pak[i-8]->exists()))
+ if (m_p_pakdef[(i<<13)] != 0xff)
+ m_pak_extended[(i & 7)+2] = true;
// set net index to true for 8k roms
- m_pak_extended[1] = (m_netdef && (m_netdef->bytes() > 0x1000)) ? true : false;
+ if (m_netdef && (m_netdef->bytes() > 0x1000))
+ if (!(m_pak[1] && m_pak[1]->exists()))
+ m_pak_extended[1] = true;
}
void mbee_state::machine_reset()
@@ -745,10 +746,6 @@ image_init_result mbee_state::load_cart(device_image_interface &image, generic_s
{
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Not a PAK rom");
slot->call_unload();
- if (m_pakdef)
- m_pak_extended[pak_index] = (m_p_pakdef[((pak_index+8)<<13)] == 0xff) ? false : true;
- else
- m_pak_extended[pak_index] = false;
return image_init_result::FAIL;
}
}
@@ -760,7 +757,6 @@ image_init_result mbee_state::load_cart(device_image_interface &image, generic_s
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported ROM size");
return image_init_result::FAIL;
}
-
m_pak_extended[pak_index] = (size > 0x1000) ? true : false;
slot->rom_alloc(m_pak_extended ? 0x2000 : 0x1000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
@@ -768,15 +764,30 @@ image_init_result mbee_state::load_cart(device_image_interface &image, generic_s
// Validate the rom
logerror ("Rom header = %02X %02X %02X\n", slot->read_rom(0), slot->read_rom(1), slot->read_rom(2));
- if ((slot->read_rom(0) != 0xc3) || ((slot->read_rom(2) & 0xf0) != 0xe0))
+ if (!image.loaded_through_softlist()) // need to let pascal through without testing
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Not a NET rom");
- slot->call_unload();
- m_pak_extended[pak_index] = (m_netdef && (m_netdef->bytes() > 0x1000)) ? true : false;
- return image_init_result::FAIL;
+ if ((slot->read_rom(0) != 0xc3) || ((slot->read_rom(2) & 0xf0) != 0xe0))
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Not a NET rom");
+ slot->call_unload();
+ return image_init_result::FAIL;
+ }
}
}
return image_init_result::PASS;
}
+void mbee_state::unload_cart(u8 pak_index)
+{
+ if (pak_index > 1)
+ {
+ if (m_pakdef)
+ m_pak_extended[pak_index] = (m_p_pakdef[((pak_index+8)<<13)] == 0xff) ? false : true;
+ else
+ m_pak_extended[pak_index] = false;
+ }
+ else
+ m_pak_extended[pak_index] = (m_netdef && (m_netdef->bytes() > 0x1000)) ? true : false;
+}
+
diff --git a/src/mame/machine/pofo_kbd.cpp b/src/mame/machine/pofo_kbd.cpp
new file mode 100644
index 00000000000..c5aa80d0955
--- /dev/null
+++ b/src/mame/machine/pofo_kbd.cpp
@@ -0,0 +1,138 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder,Jaen Saul
+
+#include "emu.h"
+
+#include "machine/pofo_kbd.h"
+
+#include "machine/keyboard.ipp"
+
+DEFINE_DEVICE_TYPE(POFO_KEYBOARD, pofo_keyboard_device, "pofo_keyboard", "Atari Portfolio keyboard");
+
+pofo_keyboard_device::pofo_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, POFO_KEYBOARD, tag, owner, clock),
+ device_matrix_keyboard_interface(mconfig, *this, "Y0", "Y1", "Y2", "Y3", "Y4", "Y5", "Y6", "Y7"),
+ m_int_handler(*this)
+{
+}
+
+void pofo_keyboard_device::trigger()
+{
+ m_int_handler(1);
+ m_int_handler(0);
+}
+
+void pofo_keyboard_device::key_make(u8 row, u8 column)
+{
+ m_data = row * 8 + column;
+ trigger();
+}
+
+void pofo_keyboard_device::key_break(u8 row, u8 column)
+{
+ m_data = 0x80 | (row * 8 + column);
+ trigger();
+}
+
+void pofo_keyboard_device::device_start()
+{
+ m_int_handler.resolve_safe();
+
+ save_item(NAME(m_data));
+}
+
+void pofo_keyboard_device::device_reset()
+{
+ m_data = 0xFF;
+
+ reset_key_state();
+ start_processing(attotime::from_hz(600));
+ typematic_stop();
+}
+
+static INPUT_PORTS_START( keyboard )
+ PORT_START("Y0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Atari") PORT_CODE(KEYCODE_TILDE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
+
+ PORT_START("Y1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Del Ins") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL))
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Alt") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
+
+ PORT_START("Y2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_MAMEKEY(TAB))
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
+
+ PORT_START("Y3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('"') PORT_CHAR('`')
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
+
+ PORT_START("Y4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
+
+ PORT_START("Y5")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('8')
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
+
+ PORT_START("Y6")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Fn") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
+
+ PORT_START("Y7")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
+INPUT_PORTS_END
+
+ioport_constructor pofo_keyboard_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( keyboard );
+}
diff --git a/src/mame/machine/pofo_kbd.h b/src/mame/machine/pofo_kbd.h
new file mode 100644
index 00000000000..07762ff6af5
--- /dev/null
+++ b/src/mame/machine/pofo_kbd.h
@@ -0,0 +1,39 @@
+// license:BSD-3-Clause
+// copyright-holders:Jaen Saul
+#ifndef MAME_MACHINE_POFO_KBD_H
+#define MAME_MACHINE_POFO_KBD_H
+
+#pragma once
+
+#include "machine/keyboard.h"
+
+class pofo_keyboard_device : public device_t, protected device_matrix_keyboard_interface<8U>
+{
+public:
+ pofo_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+
+ // callbacks
+ auto int_handler() { return m_int_handler.bind(); }
+
+ // from host
+ uint8_t read() { return m_data; }
+
+protected:
+ void key_make(u8 row, u8 column) override;
+ void key_break(u8 row, u8 column) override;
+
+ void device_start() override;
+ void device_reset() override;
+
+ ioport_constructor device_input_ports() const override;
+
+private:
+ devcb_write_line m_int_handler;
+ uint8_t m_data;
+
+ void trigger();
+};
+
+DECLARE_DEVICE_TYPE(POFO_KEYBOARD, pofo_keyboard_device);
+
+#endif // MAME_MACHINE_POFO_KBD_H
diff --git a/src/mame/machine/segashiobd.cpp b/src/mame/machine/segashiobd.cpp
new file mode 100644
index 00000000000..f5c9d632a90
--- /dev/null
+++ b/src/mame/machine/segashiobd.cpp
@@ -0,0 +1,121 @@
+// license:BSD-3-Clause
+// copyright-holders:Samuele Zannoli
+
+#include "emu.h"
+#include "machine/segashiobd.h"
+
+/*
+ 837-14438 SH I/O BD
+
+|-------------------------------------------------------------------------------------|
+| CN3 CN6 CN2 CN1 CN11 |
+| |
+| LED1-5 |
+| |
+| DIPSW1 BT1 OSC1 |
+| |
+| IC3 LED6,7 SW2 |
+| |
+| OSC2 IC8 IC1 IC4 IC5 |
+| |
+|CN5 IC7 |
+| |
+| IC2 |
+| |
+| IC6 |
+| |
+| SW1 |
+| |
+| IC9 |
+| OSC3 |
+| CN4 CN7 CN8 |
+|-------------------------------------------------------------------------------------|
+
+ IC1 - Hitachi/Renesas SH4 SoC
+ IC2 - Xilinx Spartan XC2S50 PQ208AMS0341 FPGA
+ IC3 - Xilinx 17S50APC Spartan-II Family OTP Configuration PROM, stamped 6372A
+ IC4,5 - Toshiba TC59S6432CFT-10 512K x4 banks x32bit SDRAM
+ IC6 - Macronix MX29LV160ATTC-90 16Mbit Flash ROM
+ IC7 - ST M68AF127BL55MC6 1Mbit (128K x8) SRAM
+ IC8 - 42-pin DIP socket, unpopulated
+ IC9 - NS USBN9604-28M USB Node Controller
+ OSC1 - 33.3333 MHz
+ OSC2 - 32.0000 MHz
+ OCS3 - 24.0000 MHz
+ SW1,2 - pushbuttons
+ DIPSW1 - 4x DIP switch
+ LED1-5 - LEDs
+ LED6,7 - 7seg LEDs
+ BT1 - Panasonic CR2032 battery
+
+ CN1 - 8 pin JST VH series connector
+ 1 12V
+ 2 5V
+ 3 5V
+ 4 3.3V
+ 5 3.3V
+ 6 gnd
+ 7 gnd
+ 8 gnd
+
+ CN2 - 4 pin JST VH series connector
+ 1 12V
+ 2 12V
+ 3 gnd
+ 4 gnd
+*/
+
+DEFINE_DEVICE_TYPE(SEGA837_14438, sega_837_14438_device, "sega837_14438", "Sega 837-14438 SH I/O BD")
+
+void sega_837_14438_device::sh4_map(address_map &map)
+{
+ // mirrors only for the debugger
+ map(0x00000000, 0x001fffff).mirror(0xa0000000).rom();
+ map(0x04000000, 0x0401ffff).mirror(0xa0000000).ram();
+ map(0x0c000000, 0x0cffffff).mirror(0x80000000).ram();
+}
+
+#define CPU_CLOCK 200000000 // need to set the correct value here
+
+void sega_837_14438_device::device_add_mconfig(machine_config &config)
+{
+ SH4LE(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_md(0, 1);
+ m_maincpu->set_md(1, 0);
+ m_maincpu->set_md(2, 1);
+ m_maincpu->set_md(3, 0);
+ m_maincpu->set_md(4, 0);
+ m_maincpu->set_md(5, 1);
+ m_maincpu->set_md(6, 0);
+ m_maincpu->set_md(7, 1);
+ m_maincpu->set_md(8, 0);
+ m_maincpu->set_sh4_clock(CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sega_837_14438_device::sh4_map);
+}
+
+sega_837_14438_device::sega_837_14438_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, SEGA837_14438, tag, owner, clock),
+ m_maincpu(*this, "shiobdcpu")
+{
+}
+
+void sega_837_14438_device::device_start()
+{
+}
+
+void sega_837_14438_device::device_reset()
+{
+ device_t::device_reset();
+}
+
+ROM_START(segashiobd)
+ ROM_REGION(0x200000, "shiobdcpu", 0)
+ ROM_LOAD("fpr-24150.ic6", 0x0000000, 0x200000, CRC(3845c34c) SHA1(027b17bac64482ee152773d5fab30fcbc6e2bcb7)) // SH4 code
+ ROM_REGION(0x020000, "config_prom", 0)
+ ROM_LOAD("6372a.ic3", 0x0000000, 0x020000, CRC(f30839ad) SHA1(ea1a32c4da1ed9745300bcdd7964a7c0964e3221)) // FPGA configuration prom
+ROM_END
+
+const tiny_rom_entry* sega_837_14438_device::device_rom_region() const
+{
+ return ROM_NAME(segashiobd);
+}
diff --git a/src/mame/machine/segashiobd.h b/src/mame/machine/segashiobd.h
new file mode 100644
index 00000000000..c1bec8871f9
--- /dev/null
+++ b/src/mame/machine/segashiobd.h
@@ -0,0 +1,29 @@
+// license:BSD-3-Clause
+// copyright-holders:Samuele Zannoli
+#ifndef MAME_MACHINE_SEGASHIOBD_H
+#define MAME_MACHINE_SEGASHIOBD_H
+
+#pragma once
+
+#include "cpu/sh/sh4.h"
+
+DECLARE_DEVICE_TYPE(SEGA837_14438, sega_837_14438_device)
+
+class sega_837_14438_device : public device_t
+{
+public:
+ // construction/destruction
+ sega_837_14438_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ void sh4_map(address_map &map);
+
+private:
+ required_device<sh4_device> m_maincpu;
+};
+
+#endif // MAME_MACHINE_SEGASHIOBD_H
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 43808e30faa..1b5fcf12f18 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -1203,6 +1203,7 @@ alphatpc16
@source:alphatro.cpp
alphatro //
+alphatrob //
alphatron //
@source:altair.cpp
@@ -10106,6 +10107,7 @@ ckongpt2b // bootleg
ckongpt2b2 // bootleg
ckongpt2j // (c) 1981 Falcon
ckongpt2jeu // bootleg (Jeutel)
+ckongpt2ss // bootleg (SegaSA / Sonic)
dking // Crazy Kong Bootleg
guzzler // (c) 1983 Tehkan
guzzlers // (c) 1983 Tehkan (Swimmer Conversion)
@@ -14395,6 +14397,7 @@ gteikoku // (c) Irem
gteikokub // bootleg
gteikokub2 // bootleg
gteikokub3 // bootleg (Honly Enterprises)
+guttangt //
highroll //
jumpbug // (c) 1981 Rock-ola
jumpbugb // (c) 1981 Sega
@@ -14555,6 +14558,9 @@ zerotimeu // hack
zigzagb // (c) 1982 LAX (bootleg)
zigzagb2 // (c) 1982 LAX (bootleg)
+@source:galaxian_rockclim.cpp
+rockclim // (c)1981 Taito
+
@source:galaxold.cpp
4in1 // (c) 1981 Armenia / Food and Fun
bullsdrtg // 1985 Senko
@@ -14566,14 +14572,12 @@ drivfrcsg // [1984] Seatongrove
drivfrcsga // [1984] Seatongrove
drivfrct // bootleg
froggerv // bootleg
-guttangt //
hexpool // (c) 1986 Shinkia (Senko Kit)
hexpoola // (c) 1986 Shinkia (Senko Kit)
hunchbgb // bootleg
hunchbkg // (c) 1983 Century
hustlerb3 // bootleg
racknrol // (c) 1986 Status (Shinkia license) (Senko Kit)
-rockclim // (c)1981 Taito
scramb2 // bootleg
scramb3 // bootleg
scramblb // bootleg
@@ -16349,6 +16353,7 @@ trobocop2 // Tiger
trobocop3 // Tiger
trockteer // Tiger
trshutvoy // Tronica
+trspacmis // Tronica
trsrescue // Tronica
tsddragon // Tiger
tsf2010 // Tiger
@@ -19864,6 +19869,9 @@ macxl // 1985 Apple Macintosh XL
@source:littlerb.cpp
littlerb // (c) 1993 TCH
+@source:lk3000.cpp
+lk3000
+
@source:lkage.cpp
bygone // A53 (c) 1985 Taito Corporation - prototype ?
lkage // A54 (c) 1984 Taito Corporation
@@ -22418,8 +22426,6 @@ alice // Matra & Hachette Ordinateur Alice
alice32 // Matra & Hachette Alice 32
alice90 // Matra & Hachette Alice 90
mc10 // MC-10
-mcx128 // MCX-128
-alice128 // Alice with a MCX-128
@source:mc1000.cpp
mc1000 //
@@ -31655,6 +31661,7 @@ driveyes // (c) 1992?
@source:namcos22.cpp
acedrvrw // (c) 1994
adillor // (c) 1997
+adillorj // (c) 1997
airco22b // (c) 1995
alpinerc // (c) 1994
alpinerd // (c) 1994
@@ -33200,6 +33207,7 @@ ccasino // [1987] V-System Co. (Japan)
ojanko2 // [1987] V-System Co. (Japan)
ojankoc // [1986] V-System Co. (Japan)
ojankoca // [1986] V-System Co. (Japan)
+ojankocb // [1986] V-System Co. (Japan)
ojankohs // [1988] V-System Co. (Japan)
ojankoy // [1986] V-System Co. (Japan)
@@ -33433,6 +33441,7 @@ pacmanvg // bootleg (Video Game SA)
pacmod // (c) 1981 Midway
pacplus // (c) 1982 Namco (Midway license)
pacuman // bootleg
+painter // hack
paintrlr // 1981 bootleg
pengojpm // bootleg
pengopac // bootleg
@@ -38215,6 +38224,7 @@ sitcomtmr //
@source:sk1.cpp
sk1 //
sk2 //
+sk5 //
sk10 //
@source:sk101bl.cpp
@@ -39596,6 +39606,7 @@ galpanisa // 1997.04 (c) 1997 Kaneko (Asia)
galpanise // 1997.04 (c) 1997 Kaneko (Europe)
galpanisj // 1997.04 (c) 1997 Kaneko (Japan)
galpanisk // 1997.04 (c) 1997 Kaneko (Korea)
+galpaniska // 1997.04 (c) 1997 Kaneko (Korea)
galpans2 // 1999.?? (c) 1999 Kaneko (Europe)
galpans2a // 1999.?? (c) 1999 Kaneko (Asia)
galpans2j // 1999.02 (c) 1999 Kaneko (Japan)
@@ -40428,6 +40439,7 @@ silkworm // 6217 - (c) 1988 Tecmo
silkwormj // 6217 - (c) 1988 Tecmo
silkwormp // 6217 - (c) 1988 Tecmo
silkwormb // bootleg
+silkwormb2 // bootleg
@source:tecmo16.cpp
fstarfrc // (c) 1992 Tecmo
@@ -43257,6 +43269,12 @@ yes //
yiear // GX407 (c) 1985
yiear2 // GX407 (c) 1985
+@source:yman1x.cpp
+an1x //
+
+@source:ymdx100.cpp
+dx100 //
+
@source:ymdx11.cpp
dx11 //
@@ -43281,6 +43299,9 @@ psr70 // 1985 PSR-70
@source:ympsr340.cpp
psr340 // 1999 PSR-340
+@source:ymsy35.cpp
+sy35 //
+
@source:ymtx81z.cpp
tx81z //
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index 680c4173e04..babfebc8e37 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -536,6 +536,7 @@ lft_phasor.cpp
lg-dvd.cpp
lilith.cpp
lisa.cpp
+lk3000.cpp
llc1.cpp
llc2.cpp
lms46.cpp
@@ -1178,6 +1179,8 @@ xbox.cpp
xerox820.cpp
xor100.cpp
yes.cpp
+yman1x.cpp
+ymdx100.cpp
ymdx11.cpp
ymmu100.cpp
ymmu5.cpp
@@ -1185,6 +1188,7 @@ ymmu50.cpp
ymmu80.cpp
ympsr60.cpp
ympsr340.cpp
+ymsy35.cpp
ymtx81z.cpp
ymvl70.cpp
z100.cpp
diff --git a/src/mame/video/fmtowns.cpp b/src/mame/video/fmtowns.cpp
index d4471d2777a..34b912b54f9 100644
--- a/src/mame/video/fmtowns.cpp
+++ b/src/mame/video/fmtowns.cpp
@@ -423,12 +423,14 @@ uint8_t towns_state::towns_video_440_r(offs_t offset)
ret |= 0x80;
}
ret |= (m_video.towns_sprite_flag ? 0x02 : 0x00); // Sprite drawing flag
- ret |= m_video.towns_sprite_page & 0x01;
+ ret |= (m_video.towns_sprite_page & 0x01) ? 1 : 0;;
return ret;
case 0x10:
return m_video.towns_sprite_sel;
case 0x12:
if(LOG_VID) logerror("SPR: reading register %i (0x452) [%02x]\n",m_video.towns_sprite_sel,m_video.towns_sprite_reg[m_video.towns_sprite_sel]);
+ if(m_video.towns_sprite_sel == 6)
+ return m_video.towns_sprite_page & 0x01 ? 0x10 : 0;
return m_video.towns_sprite_reg[m_video.towns_sprite_sel];
case 0x18:
return m_vram_mask_addr;
@@ -459,6 +461,12 @@ void towns_state::towns_video_440_w(offs_t offset, uint8_t data)
break;
case 0x03:
// logerror("CRTC: writing register %i (0x443) [%02x]\n",towns_crtc_sel,data);
+ if((m_video.towns_crtc_sel == 21) && (m_video.towns_sprite_reg[1] & 0x80))
+ {
+ m_video.towns_crtc_reg[m_video.towns_crtc_sel] =
+ (m_video.towns_crtc_reg[m_video.towns_crtc_sel] & 0x80ff) | ((data & 0x7f) << 8);
+ return;
+ }
m_video.towns_crtc_reg[m_video.towns_crtc_sel] =
(m_video.towns_crtc_reg[m_video.towns_crtc_sel] & 0x00ff) | (data << 8);
towns_crtc_refresh_mode();
@@ -475,7 +483,10 @@ void towns_state::towns_video_440_w(offs_t offset, uint8_t data)
break;
case 0x12:
logerror("SPR: writing register %i (0x452) [%02x]\n",m_video.towns_sprite_sel,data);
- m_video.towns_sprite_reg[m_video.towns_sprite_sel] = data;
+ if(m_video.towns_sprite_sel == 6)
+ m_video.towns_sprite_page = data & 0x80 ? 1 : 0;
+ else
+ m_video.towns_sprite_reg[m_video.towns_sprite_sel] = data;
break;
case 0x18:
m_vram_mask_addr = data & 1;
@@ -966,7 +977,7 @@ void towns_state::render_sprite_16(uint32_t poffset, uint16_t x, uint16_t y, boo
}
}
-TIMER_CALLBACK_MEMBER(towns_state::draw_sprites)
+void towns_state::draw_sprites()
{
uint16_t sprite_limit = (m_video.towns_sprite_reg[0] | (m_video.towns_sprite_reg[1] << 8)) & 0x3ff;
uint16_t xoff = (m_video.towns_sprite_reg[2] | (m_video.towns_sprite_reg[3] << 8)) & 0x1ff;
@@ -1029,17 +1040,6 @@ TIMER_CALLBACK_MEMBER(towns_state::draw_sprites)
render_sprite_16((poffset)&0x1ffff,x,y,xflip,yflip,xhalfsize,yhalfsize,rotation,rect);
}
}
-
- if(m_video.towns_sprite_page == 0) // flip VRAM page
- {
- m_video.towns_sprite_page = 1;
- m_video.towns_crtc_reg[21] &= ~0x8000;
- }
- else
- {
- m_video.towns_sprite_page = 0;
- m_video.towns_crtc_reg[21] |= 0x8000;
- }
m_video.towns_sprite_flag = 0;
}
@@ -1084,7 +1084,7 @@ void towns_state::towns_crtc_draw_scan_layer_hicolour(bitmap_rgb32 &bitmap,const
off += scroll;
}
hzoom = ((m_video.towns_crtc_reg[27] & 0x0f00) >> 8) + 1;
- off += (m_video.towns_crtc_reg[11] - m_video.towns_crtc_reg[22]) * (2 >> (hzoom - 1));
+ off += (float)(m_video.towns_crtc_reg[11] - m_video.towns_crtc_reg[22]) * (2.0f / (float)hzoom);
}
else
{
@@ -1096,7 +1096,7 @@ void towns_state::towns_crtc_draw_scan_layer_hicolour(bitmap_rgb32 &bitmap,const
off += scroll;
}
hzoom = (m_video.towns_crtc_reg[27] & 0x000f) + 1;
- off += (m_video.towns_crtc_reg[9] - m_video.towns_crtc_reg[18]) * (2 >> (hzoom - 1));
+ off += (float)(m_video.towns_crtc_reg[9] - m_video.towns_crtc_reg[18]) * (2.0f / (float)hzoom);
}
off += line * linesize;
@@ -1463,12 +1463,9 @@ void towns_state::draw_text_layer()
void towns_state::towns_sprite_start()
{
- if(!(m_video.towns_sprite_reg[1] & 0x80))
- return;
-
uint16_t sprite_limit = (m_video.towns_sprite_reg[0] | (m_video.towns_sprite_reg[1] << 8)) & 0x3ff;
m_video.towns_sprite_flag = 1; // we are now drawing
- m_video.sprite_timer->adjust(m_maincpu->cycles_to_attotime(128 * (1025-sprite_limit)));
+ m_video.sprite_timer->adjust(attotime::from_usec(32 + 75 * (1024 - sprite_limit)));
}
TIMER_CALLBACK_MEMBER(towns_state::towns_vblank_end)
@@ -1487,15 +1484,27 @@ INTERRUPT_GEN_MEMBER(towns_state::towns_vsync_irq)
machine().scheduler().timer_set(m_screen->time_until_vblank_end(), timer_expired_delegate(FUNC(towns_state::towns_vblank_end),this), 0, (void*)m_pic_slave);
if(m_video.towns_tvram_enable)
draw_text_layer();
- if(m_video.towns_sprite_reg[1] & 0x80)
+ if((m_video.towns_sprite_reg[1] & 0x80) && !m_video.towns_sprite_flag)
+ {
+ if(m_video.towns_sprite_page == 0) // flip VRAM page
+ {
+ m_video.towns_sprite_page = 1;
+ m_video.towns_crtc_reg[21] &= ~0x8000;
+ }
+ else
+ {
+ m_video.towns_sprite_page = 0;
+ m_video.towns_crtc_reg[21] |= 0x8000;
+ }
towns_sprite_start();
+ }
}
void towns_state::video_start()
{
m_video.towns_vram_wplane = 0x00;
m_video.towns_sprite_page = 0;
- m_video.sprite_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(towns_state::draw_sprites),this));
+ m_video.sprite_timer = timer_alloc(TIMER_SPRITES);
}
uint32_t towns_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
diff --git a/src/mame/video/galaxian.cpp b/src/mame/video/galaxian.cpp
index 6d3e7356812..6f32d43c8b0 100644
--- a/src/mame/video/galaxian.cpp
+++ b/src/mame/video/galaxian.cpp
@@ -358,7 +358,7 @@ void galaxian_state::galaxian_palette(palette_device &palette)
m_bullet_color[7] = rgb_t(0xff,0xff,0x00);
}
-void galaxian_state::moonwar_palette(palette_device &palette)
+void moonwar_state::moonwar_palette(palette_device &palette)
{
galaxian_palette(palette);
@@ -448,7 +448,7 @@ void galaxian_state::state_save_register()
uint32_t galaxian_state::screen_update_galaxian(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
/* draw the background layer (including stars) */
- (this->*m_draw_background_ptr)(bitmap, cliprect);
+ m_draw_background_ptr(bitmap, cliprect);
/* draw the tilemap characters over top */
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
@@ -458,7 +458,7 @@ uint32_t galaxian_state::screen_update_galaxian(screen_device &screen, bitmap_rg
sprites_draw(bitmap, cliprect, &m_spriteram[m_sprites_base + i * 0x20]);
/* if we have bullets to draw, render them following */
- if (m_draw_bullet_ptr != nullptr)
+ if (!m_draw_bullet_ptr.isnull())
bullets_draw(bitmap, cliprect, &m_spriteram[m_bullets_base]);
return 0;
@@ -482,8 +482,7 @@ TILE_GET_INFO_MEMBER(galaxian_state::bg_get_tile_info)
uint8_t attrib = m_spriteram[x*2+1];
uint8_t color = attrib & 7;
- if (m_extend_tile_info_ptr != nullptr)
- (this->*m_extend_tile_info_ptr)(&code, &color, attrib, x, y);
+ m_extend_tile_info_ptr(&code, &color, attrib, x, y);
tileinfo.set(0, code, color, 0);
}
@@ -573,8 +572,7 @@ void galaxian_state::sprites_draw(bitmap_rgb32 &bitmap, const rectangle &cliprec
uint8_t sx = base[3] + hoffset;
/* extend the sprite information */
- if (m_extend_sprite_info_ptr != nullptr)
- (this->*m_extend_sprite_info_ptr)(base, &sx, &sy, &flipx, &flipy, &code, &color);
+ m_extend_sprite_info_ptr(base, &sx, &sy, &flipx, &flipy, &code, &color);
/* apply flipscreen in X direction */
if (m_flipscreen_x)
@@ -591,11 +589,10 @@ void galaxian_state::sprites_draw(bitmap_rgb32 &bitmap, const rectangle &cliprec
}
/* draw */
-
- m_gfxdecode->gfx(1)->transpen(bitmap,clip,
- code, color,
- flipx, flipy,
- m_h0_start + m_x_scale * sx, sy, 0);
+ m_gfxdecode->gfx(1)->transpen(bitmap,clip,
+ code, color,
+ flipx, flipy,
+ m_h0_start + m_x_scale * sx, sy, 0);
}
}
@@ -609,25 +606,22 @@ void galaxian_state::sprites_draw(bitmap_rgb32 &bitmap, const rectangle &cliprec
void galaxian_state::bullets_draw(bitmap_rgb32 &bitmap, const rectangle &cliprect, const uint8_t *base)
{
- int y;
-
/* iterate over scanlines */
- for (y = cliprect.min_y; y <= cliprect.max_y; y++)
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
uint8_t shell = 0xff, missile = 0xff;
uint8_t effy;
- int which;
/* the first 3 entries match Y-1 */
effy = m_flipscreen_y ? ((y - 1) ^ 255) : (y - 1);
- for (which = 0; which < 3; which++)
- if ((uint8_t)(base[which*4+1] + effy) == 0xff)
+ for (int which = 0; which < 3; which++)
+ if (uint8_t(base[which*4+1] + effy) == 0xff)
shell = which;
/* remaining entries match Y */
effy = m_flipscreen_y ? (y ^ 255) : y;
- for (which = 3; which < 8; which++)
- if ((uint8_t)(base[which*4+1] + effy) == 0xff)
+ for (int which = 3; which < 8; which++)
+ if (uint8_t(base[which*4+1] + effy) == 0xff)
{
if (which != 7)
shell = which;
@@ -637,9 +631,9 @@ void galaxian_state::bullets_draw(bitmap_rgb32 &bitmap, const rectangle &cliprec
/* draw the shell */
if (shell != 0xff)
- (this->*m_draw_bullet_ptr)(bitmap, cliprect, shell, 255 - base[shell*4+3], y);
+ m_draw_bullet_ptr(bitmap, cliprect, shell, 255 - base[shell*4+3], y);
if (missile != 0xff)
- (this->*m_draw_bullet_ptr)(bitmap, cliprect, missile, 255 - base[missile*4+3], y);
+ m_draw_bullet_ptr(bitmap, cliprect, missile, 255 - base[missile*4+3], y);
}
}
@@ -1072,9 +1066,9 @@ void galaxian_state::turtles_draw_background(bitmap_rgb32 &bitmap, const rectang
}
-void galaxian_state::sfx_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect)
+void taiyo_sfx_state::sfx_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- /* current schematics are unreadable, assuming like Turtles */
+ // current schematics are unreadable, assuming like Turtles
bitmap.fill(rgb_t(m_background_red * 0x55, m_background_green * 0x47, m_background_blue * 0x55), cliprect);
scramble_draw_stars(bitmap, cliprect, 256);
}
@@ -1244,6 +1238,14 @@ void galaxian_state::theend_draw_bullet(bitmap_rgb32 &bitmap, const rectangle &c
*************************************/
/*** generic ***/
+void galaxian_state::empty_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y)
+{
+}
+
+void galaxian_state::empty_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
+{
+}
+
void galaxian_state::upper_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y)
{
/* tiles are in the upper half of a larger ROM */
@@ -1269,14 +1271,14 @@ void galaxian_state::frogger_extend_sprite_info(const uint8_t *base, uint8_t *sx
}
-/*** Ghostmuncher Galaxian ***/
-void galaxian_state::gmgalax_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y)
+/*** Bagman on Moon Cresta hardware, Ghostmuncher Galaxian ***/
+void bagmanmc_state::bagmanmc_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y)
{
*code |= m_gfxbank[0] << 9;
-// *color |= m_gfxbank[0] << 3;
+ //*color |= m_gfxbank[0] << 3;
}
-void galaxian_state::gmgalax_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
+void bagmanmc_state::bagmanmc_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
{
*code |= (m_gfxbank[0] << 7) | 0x40;
*color |= m_gfxbank[0] << 3;
@@ -1284,12 +1286,12 @@ void galaxian_state::gmgalax_extend_sprite_info(const uint8_t *base, uint8_t *sx
/*** Pisces ***/
-void galaxian_state::pisces_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y)
+void pisces_state::pisces_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y)
{
*code |= m_gfxbank[0] << 8;
}
-void galaxian_state::pisces_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
+void pisces_state::pisces_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
{
*code |= m_gfxbank[0] << 6;
}
@@ -1384,17 +1386,15 @@ void galaxian_state::jumpbug_extend_sprite_info(const uint8_t *base, uint8_t *sx
}
}
-void galaxian_state::namenayo_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y) // should be in namenayo_state
+void namenayo_state::namenayo_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y)
{
- // main game display
- if ((attrib & 0x01) == 0x00)
+ if ((attrib & 0x01) == 0x00) // main game display
{
int attr = m_exattrram[y & 0x1f];
*code += ((attr & 0x38) >> 3) * 0x100;
*color = attr & 0x07;
}
- // status bar
- else
+ else // status bar
{
// course map
if ((attrib & 0xfe) == 0x20)
@@ -1402,7 +1402,7 @@ void galaxian_state::namenayo_extend_tile_info(uint16_t *code, uint8_t *color, u
}
}
-void galaxian_state::namenayo_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
+void namenayo_state::namenayo_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
{
if (base[2] & 0x08)
*code += 0x40;
@@ -1418,7 +1418,7 @@ void namenayo_state::namenayo_unk_d800_w(uint8_t data)
}
-void galaxian_state::namenayo_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect)
+void namenayo_state::namenayo_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
bitmap.fill(rgb_t::black(), cliprect);
@@ -1441,6 +1441,13 @@ void galaxian_state::namenayo_draw_background(bitmap_rgb32 &bitmap, const rectan
m_bg_tilemap->draw(*m_screen, bitmap, draw, TILEMAP_DRAW_OPAQUE, 0);
}
+// Guttang Gottong bootleg
+void galaxian_state::guttangt_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
+{
+ // is this configurable or a hardwired mod?
+ *code |= 0x40;
+}
+
/*************************************
*
@@ -1448,14 +1455,14 @@ void galaxian_state::namenayo_draw_background(bitmap_rgb32 &bitmap, const rectan
*
*************************************/
-/* gfxbank[4] is used as a cpu bank number, and gfxbank[0] for graphics banking */
-void galaxian_state::fourplay_rombank_w(offs_t offset, uint8_t data)
+// gfxbank[4] is used as a cpu bank number, and gfxbank[0] for graphics banking
+void fourplay_state::fourplay_rombank_w(offs_t offset, uint8_t data)
{
m_gfxbank[4] = (m_gfxbank[4] & (2 - offset)) | (data << offset);
m_gfxbank[0] = (m_gfxbank[4] == 3); // 1 = true, 0 = false
- membank("bank1")->set_entry( m_gfxbank[4] );
+ m_rombank->set_entry(m_gfxbank[4]);
}
@@ -1466,13 +1473,13 @@ void galaxian_state::fourplay_rombank_w(offs_t offset, uint8_t data)
*
*************************************/
-void galaxian_state::videight_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y)
+void videight_state::videight_extend_tile_info(uint16_t *code, uint8_t *color, uint8_t attrib, uint8_t x, uint8_t y)
{
*code |= (m_gfxbank[0] << 8);
*color |= (m_gfxbank[4] << 3);
}
-void galaxian_state::videight_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
+void videight_state::videight_extend_sprite_info(const uint8_t *base, uint8_t *sx, uint8_t *sy, uint8_t *flipx, uint8_t *flipy, uint16_t *code, uint8_t *color)
{
*code |= (m_gfxbank[0] << 6);
*color |= (m_gfxbank[4] << 3);
@@ -1480,26 +1487,26 @@ void galaxian_state::videight_extend_sprite_info(const uint8_t *base, uint8_t *s
/* This handles the main bankswitching for code and one-bank gfx games */
-void galaxian_state::videight_rombank_w(offs_t offset, uint8_t data)
+void videight_state::videight_rombank_w(offs_t offset, uint8_t data)
{
- uint8_t gfxbanks[] = { 0, 10, 2, 8, 1, 9, 4, 11 };
+ static constexpr uint8_t gfxbanks[] = { 0, 10, 2, 8, 1, 9, 4, 11 };
if (offset == 2)
- galaxian_stars_enable_w( data );
+ galaxian_stars_enable_w(data);
else
{
m_gfxbank[4] = (m_gfxbank[4] & (6 - offset)) | (data << ((offset + 1) >> 1));
galaxian_gfxbank_w (0, gfxbanks[m_gfxbank[4]]);
- membank("bank1")->set_entry( m_gfxbank[4] );
+ m_rombank->set_entry(m_gfxbank[4]);
}
}
/* This handles those games with multiple gfx banks */
-void galaxian_state::videight_gfxbank_w(offs_t offset, uint8_t data)
+void videight_state::videight_gfxbank_w(offs_t offset, uint8_t data)
{
/* Moon Cresta (mooncrgx) */
- if (( data < 2 ) && (m_gfxbank[4] == 3))
+ if ((data < 2) && (m_gfxbank[4] == 3))
{
- uint8_t gfxbanks[] = { 8, 12, 8, 14, 8, 13, 8, 15 };
+ static constexpr uint8_t gfxbanks[] = { 8, 12, 8, 14, 8, 13, 8, 15 };
if (!offset) m_gfxbank[3] = (m_gfxbank[3] & 6) | data;
if (offset == 1) m_gfxbank[3] = (m_gfxbank[3] & 5) | (data << 1);
if (offset == 2) m_gfxbank[3] = (m_gfxbank[3] & 3) | (data << 2);
@@ -1507,12 +1514,12 @@ void galaxian_state::videight_gfxbank_w(offs_t offset, uint8_t data)
}
/* Uniwar S */
- if (( data < 2 ) && (m_gfxbank[4] == 2) && (offset == 2))
- galaxian_gfxbank_w( 0, data+2 );
+ if ((data < 2) && (m_gfxbank[4] == 2) && (offset == 2))
+ galaxian_gfxbank_w(0, data + 2);
/* Pisces (piscesb) */
- if (( data < 2 ) && (m_gfxbank[4] == 6) && (offset == 2))
- galaxian_gfxbank_w( 0, data+4 );
+ if ((data < 2) && (m_gfxbank[4] == 6) && (offset == 2))
+ galaxian_gfxbank_w(0, data + 4);
}
void namenayo_state::namenayo_extattr_w(offs_t offset, uint8_t data)
diff --git a/src/mame/video/galaxold.cpp b/src/mame/video/galaxold.cpp
index 240caa1e34b..2f198f8319e 100644
--- a/src/mame/video/galaxold.cpp
+++ b/src/mame/video/galaxold.cpp
@@ -111,7 +111,7 @@ void galaxold_state::stratgyx_palette(palette_device &palette)
}
}
-void galaxold_state::rockclim_palette(palette_device &palette) const
+void galaxold_state::s2650_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
@@ -568,29 +568,8 @@ VIDEO_START_MEMBER(galaxold_state,mooncrst)
m_modify_spritecode = &galaxold_state::mooncrst_modify_spritecode;
}
-void galaxold_state::rockclim_draw_background(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- m_rockclim_tilemap->draw(screen, bitmap, cliprect, 0,0);
-}
-void galaxold_state::rockclim_modify_spritecode(uint8_t *spriteram, int *code, int *flipx, int *flipy, int offs)
-{
- if (m_gfxbank[2]) *code|=0x40;
-}
-
-VIDEO_START_MEMBER(galaxold_state,rockclim)
-{
- VIDEO_START_CALL_MEMBER(galaxold);
- m_rockclim_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(galaxold_state::rockclim_get_tile_info)), TILEMAP_SCAN_ROWS,8,8,64,32);
- m_draw_background = &galaxold_state::rockclim_draw_background;
- m_modify_charcode = &galaxold_state::mooncrst_modify_charcode;
- m_modify_spritecode = &galaxold_state::rockclim_modify_spritecode;
-
- m_rockclim_v = m_rockclim_h = 0;
- save_item(NAME(m_rockclim_v));
- save_item(NAME(m_rockclim_h));
-}
TILE_GET_INFO_MEMBER(galaxold_state::drivfrcg_get_tile_info)
{
@@ -877,31 +856,6 @@ void galaxold_state::galaxold_gfxbank_w(offs_t offset, uint8_t data)
}
}
-void galaxold_state::rockclim_videoram_w(offs_t offset, uint8_t data)
-{
- m_rockclim_videoram[offset] = data;
- m_rockclim_tilemap->mark_tile_dirty(offset);
-}
-
-void galaxold_state::rockclim_scroll_w(offs_t offset, uint8_t data)
-{
- switch(offset&3)
- {
- case 0: m_rockclim_h=(m_rockclim_h&0xff00)|data;m_rockclim_tilemap ->set_scrollx(0, m_rockclim_h );break;
- case 1: m_rockclim_h=(m_rockclim_h&0xff)|(data<<8);m_rockclim_tilemap ->set_scrollx(0, m_rockclim_h );break;
- case 2: m_rockclim_v=(m_rockclim_v&0xff00)|data;m_rockclim_tilemap ->set_scrolly(0, m_rockclim_v );break;
- case 3: m_rockclim_v=(m_rockclim_v&0xff)|(data<<8);m_rockclim_tilemap ->set_scrolly(0, m_rockclim_v );break;
- }
-
-}
-
-
-uint8_t galaxold_state::rockclim_videoram_r(offs_t offset)
-{
- return m_rockclim_videoram[offset];
-}
-
-
void galaxold_state::dambustr_bg_split_line_w(uint8_t data)
{
m_dambustr_bg_split_line = data;
@@ -1560,11 +1514,6 @@ TILE_GET_INFO_MEMBER(galaxold_state::get_tile_info)
tileinfo.set(0, code, color, 0);
}
-TILE_GET_INFO_MEMBER(galaxold_state::rockclim_get_tile_info)
-{
- uint16_t code = m_rockclim_videoram[tile_index];
- tileinfo.set(2, code, 0, 0);
-}
void galaxold_state::draw_bullets_common(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
diff --git a/src/mame/video/gameplan.cpp b/src/mame/video/gameplan.cpp
index d6e8eff207b..197ab20b8ed 100644
--- a/src/mame/video/gameplan.cpp
+++ b/src/mame/video/gameplan.cpp
@@ -156,7 +156,7 @@ void gameplan_state::leprechn_video_command_w(uint8_t data)
uint8_t gameplan_state::leprechn_videoram_r()
{
- return m_videoram[m_video_y * (HBSTART - HBEND) + m_video_x];
+ return m_video_previous;
}
@@ -193,6 +193,7 @@ WRITE_LINE_MEMBER(gameplan_state::video_command_trigger_w)
m_video_y = m_video_y + 1;
}
+ m_video_previous = m_videoram[m_video_y * (HBSTART - HBEND) + m_video_x];
m_videoram[m_video_y * (HBSTART - HBEND) + m_video_x] = m_video_data & 0x0f;
break;
diff --git a/src/mame/video/inufuku.cpp b/src/mame/video/inufuku.cpp
deleted file mode 100644
index 1fb75bba22a..00000000000
--- a/src/mame/video/inufuku.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Takahiro Nogi
-/******************************************************************************
-
- Video Hardware for Video System Games.
-
- Quiz & Variety Sukusuku Inufuku
- (c)1998 Video System Co.,Ltd.
-
- Driver by Takahiro Nogi <nogi@kt.rim.or.jp> 2003/08/09 -
-
- based on other Video System drivers
-
-******************************************************************************/
-
-#include "emu.h"
-#include "includes/inufuku.h"
-#include "screen.h"
-
-
-/******************************************************************************
-
- Memory handlers
-
-******************************************************************************/
-
-void inufuku_state::inufuku_palettereg_w(offs_t offset, uint16_t data)
-{
- switch (offset)
- {
- case 0x02: m_bg_palettebank = (data & 0xf000) >> 12;
- m_bg_tilemap->mark_all_dirty();
- break;
- case 0x03: m_tx_palettebank = (data & 0xf000) >> 12;
- m_tx_tilemap->mark_all_dirty();
- break;
- }
-}
-
-void inufuku_state::inufuku_scrollreg_w(offs_t offset, uint16_t data)
-{
- switch (offset)
- {
- case 0x00: m_bg_scrollx = data + 1; break;
- case 0x01: m_bg_scrolly = data + 0; break;
- case 0x02: m_tx_scrollx = data - 3; break;
- case 0x03: m_tx_scrolly = data + 1; break;
- case 0x04: m_bg_raster = (data & 0x0200) ? 0 : 1; break;
- }
-}
-
-
-/******************************************************************************
-
- Sprite routines
-
-******************************************************************************/
-
-
-
-/******************************************************************************
-
- Tilemap callbacks
-
-******************************************************************************/
-
-TILE_GET_INFO_MEMBER(inufuku_state::get_inufuku_bg_tile_info)
-{
- tileinfo.set(0,
- m_bg_videoram[tile_index],
- m_bg_palettebank,
- 0);
-}
-
-TILE_GET_INFO_MEMBER(inufuku_state::get_inufuku_tx_tile_info)
-{
- tileinfo.set(1,
- m_tx_videoram[tile_index],
- m_tx_palettebank,
- 0);
-}
-
-uint16_t inufuku_state::inufuku_bg_videoram_r(offs_t offset)
-{
- return m_bg_videoram[offset];
-}
-
-void inufuku_state::inufuku_bg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- COMBINE_DATA(&m_bg_videoram[offset]);
- m_bg_tilemap->mark_tile_dirty(offset);
-}
-
-uint16_t inufuku_state::inufuku_tx_videoram_r(offs_t offset)
-{
- return m_tx_videoram[offset];
-}
-
-void inufuku_state::inufuku_tx_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- COMBINE_DATA(&m_tx_videoram[offset]);
- m_tx_tilemap->mark_tile_dirty(offset);
-}
-
-
-uint32_t inufuku_state::inufuku_tile_callback( uint32_t code )
-{
- return ((m_spriteram2[code*2] & 0x0007) << 16) + m_spriteram2[(code*2)+ 1];
-}
-
-
-/******************************************************************************
-
- Start the video hardware emulation
-
-******************************************************************************/
-
-void inufuku_state::video_start()
-{
- m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(inufuku_state::get_inufuku_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
- m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(inufuku_state::get_inufuku_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
-
- m_bg_tilemap->set_transparent_pen(255);
- m_tx_tilemap->set_transparent_pen(255);
-
- m_spriteram1_old = make_unique_clear<uint16_t[]>(m_spriteram1.bytes()/2);
-
-}
-
-
-/******************************************************************************
-
- Display refresh
-
-******************************************************************************/
-
-uint32_t inufuku_state::screen_update_inufuku(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- int i;
-
- bitmap.fill(m_palette->black_pen(), cliprect);
- screen.priority().fill(0);
-
- if (m_bg_raster)
- {
- m_bg_tilemap->set_scroll_rows(512);
- for (i = 0; i < 256; i++)
- m_bg_tilemap->set_scrollx((m_bg_scrolly + i) & 0x1ff, m_bg_scrollx+m_bg_rasterram[i]);
- }
- else
- {
- m_bg_tilemap->set_scroll_rows(1);
- m_bg_tilemap->set_scrollx(0, m_bg_scrollx);
- }
- m_bg_tilemap->set_scrolly(0, m_bg_scrolly);
- m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
-
- m_tx_tilemap->set_scrollx(0, m_tx_scrollx);
- m_tx_tilemap->set_scrolly(0, m_tx_scrolly);
- m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 4);
-
- m_spr->draw_sprites( m_spriteram1_old.get(), m_spriteram1.bytes(), screen, bitmap, cliprect );
- return 0;
-}
-
-WRITE_LINE_MEMBER(inufuku_state::screen_vblank_inufuku)
-{
- // rising edge
- if (state)
- {
- memcpy(m_spriteram1_old.get(),m_spriteram1,m_spriteram1.bytes());
- }
-}
diff --git a/src/mame/video/k037122.cpp b/src/mame/video/k037122.cpp
index c8086c59f41..8d5a9aa068a 100644
--- a/src/mame/video/k037122.cpp
+++ b/src/mame/video/k037122.cpp
@@ -14,8 +14,8 @@ Konami 037122
---------------- -----xxxxx------ Red
---------------- ----------xxxxxx Green
- Tilemap is can be rotated, zoomed, similar as K053936 "simple mode"
- Tilemap size is 256x64 (2048x512 pixels) or 128x64 (1024x512 pixels), Each tile is 8bpp 8x8.
+ Tilemap can be rotated, zoomed, similar to K053936 "simple mode"
+ Tilemap can be configured either as 256x64 tiles (2048x512 pixels) or 128x128 tiles (1024x1024 pixels), Each tile is 8bpp 8x8.
Tile format (4 byte (1x32bit word) per each tile)
Bits Description
@@ -44,17 +44,25 @@ Konami 037122
---------------- xxxxxxxxxxxxxxxx Vertical back porch - 2
20 sxxxxxxxxxxxxxxx ---------------- X counter starting value (12.4 fixed point)
---------------- sxxxxxxxxxxxxxxx Y counter starting value (12.4 fixed point)
- 24 ---------------- sxxxxxxxxxxxxxxx amount to add to the Y counter after each line (4.12 fixed point)
+ 24 sxxxxxxxxxxxxxxx ---------------- amount to add to the X counter after each line (4.12 fixed point)
+ ---------------- sxxxxxxxxxxxxxxx amount to add to the Y counter after each line (4.12 fixed point)
28 sxxxxxxxxxxxxxxx ---------------- amount to add to the X counter after each horizontal pixel (4.12 fixed point)
- 30 ---------------x ---------------- VRAM mapping mode
- ---------------0 ---------------- CLUT at 0x00000-0x08000, Display tilemap area at 0x08000-0x18000 (256x64)
- ---------------1 ---------------- CLUT at 0x18000-0x20000, Display tilemap area at 0x00000-0x08000 (128x64)
+ ---------------- sxxxxxxxxxxxxxxx amount to add to the Y counter after each horizontal pixel (4.12 fixed point)
+ 30 ---------------x ---------------- Tilemap size
+ ---------------0 ---------------- 128x128
+ ---------------1 ---------------- 256x64
---------------- -------------xxx Character RAM bank
+ 34 ---------------- -------------x-- CLUT location
+ ---------------- -------------0-- CLUT at 0x00000-0x08000
+ ---------------- -------------1-- CLUT at 0x18000-0x20000
+ ---------------x ---------------- Tilemap Y origin
+ ---------------0 ---------------- Origin at tilemap center
+ ---------------1 ---------------- Origin at 0
Other bits/registers unknown, some registers are used
TODO:
- - verify and implement scroll, ROZ, display timing registers
+ - verify and implement display timing registers
- verify other unknown but used registers
*/
@@ -106,18 +114,19 @@ void k037122_device::device_start()
m_tile_ram = make_unique_clear<uint32_t[]>(0x20000 / 4);
m_reg = make_unique_clear<uint32_t[]>(0x400 / 4);
- m_layer[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(k037122_device::tile_info_layer0)), TILEMAP_SCAN_ROWS, 8, 8, 256, 64);
- m_layer[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(k037122_device::tile_info_layer1)), TILEMAP_SCAN_ROWS, 8, 8, 128, 64);
+ m_tilemap_128 = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(k037122_device::tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 128, 128);
+ m_tilemap_256 = &machine().tilemap().create(*this, tilemap_get_info_delegate(*this, FUNC(k037122_device::tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 256, 64);
- m_layer[0]->set_transparent_pen(0);
- m_layer[1]->set_transparent_pen(0);
+ m_tilemap_128->set_transparent_pen(0);
+ m_tilemap_256->set_transparent_pen(0);
set_gfx(m_gfx_index,std::make_unique<gfx_element>(&palette(), k037122_char_layout, (uint8_t*)m_char_ram.get(), 0, palette().entries() / 16, 0));
save_pointer(NAME(m_reg), 0x400 / 4);
save_pointer(NAME(m_char_ram), 0x200000 / 4);
save_pointer(NAME(m_tile_ram), 0x20000 / 4);
-
+ save_item(NAME(m_tilemap_base));
+ save_item(NAME(m_palette_base));
}
//-------------------------------------------------
@@ -129,30 +138,18 @@ void k037122_device::device_reset()
memset(m_char_ram.get(), 0, 0x200000);
memset(m_tile_ram.get(), 0, 0x20000);
memset(m_reg.get(), 0, 0x400);
+
+ m_tilemap_base = 0;
+ m_palette_base = 0;
}
/*****************************************************************************
DEVICE HANDLERS
*****************************************************************************/
-TILE_GET_INFO_MEMBER(k037122_device::tile_info_layer0)
+TILE_GET_INFO_MEMBER(k037122_device::tile_info)
{
- uint32_t val = m_tile_ram[tile_index + (0x8000/4)];
- int color = (val >> 17) & 0x1f;
- int tile = val & 0x3fff;
- int flags = 0;
-
- if (val & 0x400000)
- flags |= TILE_FLIPX;
- if (val & 0x800000)
- flags |= TILE_FLIPY;
-
- tileinfo.set(m_gfx_index, tile, color, flags);
-}
-
-TILE_GET_INFO_MEMBER(k037122_device::tile_info_layer1)
-{
- uint32_t val = m_tile_ram[tile_index];
+ uint32_t val = m_tile_ram[tile_index + (m_tilemap_base / 4)];
int color = (val >> 17) & 0x1f;
int tile = val & 0x3fff;
int flags = 0;
@@ -170,25 +167,39 @@ void k037122_device::tile_draw( screen_device &screen, bitmap_rgb32 &bitmap, con
{
const rectangle &visarea = screen.visible_area();
+ int16_t scrollx = m_reg[0x8] >> 16;
+ int16_t scrolly = m_reg[0x8] & 0xffff;
+
+ int16_t incxx = m_reg[0xa] >> 16;
+ int16_t incxy = m_reg[0xa] & 0xffff;
+ int16_t incyx = m_reg[0x9] >> 16;
+ int16_t incyy = m_reg[0x9] & 0xffff;
+
if (m_reg[0xc] & 0x10000)
{
- m_layer[1]->set_scrolldx(visarea.min_x, visarea.min_x);
- m_layer[1]->set_scrolldy(visarea.min_y, visarea.min_y);
- m_layer[1]->draw(screen, bitmap, cliprect, 0, 0);
+ if ((m_reg[0xd] & 0x10000) == 0)
+ scrolly -= 0x2000;
+
+ m_tilemap_128->set_scrolldx(visarea.min_x, visarea.min_x);
+ m_tilemap_128->set_scrolldy(visarea.min_y, visarea.min_y);
+
+ m_tilemap_128->draw_roz(screen, bitmap, cliprect, (int32_t)(scrollx) << 12, (int32_t)(scrolly) << 12,
+ (int32_t)(incxx) << 4, (int32_t)(incxy) << 4, (int32_t)(incyx), (int32_t)(incyy) << 4,
+ false, 0, 0);
}
else
{
- m_layer[0]->set_scrolldx(visarea.min_x, visarea.min_x);
- m_layer[0]->set_scrolldy(visarea.min_y, visarea.min_y);
- m_layer[0]->draw(screen, bitmap, cliprect, 0, 0);
- }
-}
+ if ((m_reg[0xd] & 0x10000) == 0)
+ scrolly -= 0x1000;
-void k037122_device::update_palette_color( uint32_t palette_base, int color )
-{
- uint32_t data = m_tile_ram[(palette_base / 4) + color];
+ m_tilemap_256->set_scrolldx(visarea.min_x, visarea.min_x);
+ m_tilemap_256->set_scrolldy(visarea.min_y, visarea.min_y);
+
+ m_tilemap_256->draw_roz(screen, bitmap, cliprect, (int32_t)(scrollx) << 12, (int32_t)(scrolly) << 12,
+ (int32_t)(incxx) << 4, (int32_t)(incxy) << 4, (int32_t)(incyx) << 4, (int32_t)(incyy) << 4,
+ false, 0, 0);
+ }
- palette().set_pen_color(color, pal5bit(data >> 6), pal6bit(data >> 0), pal5bit(data >> 11));
}
uint32_t k037122_device::sram_r(offs_t offset)
@@ -200,35 +211,18 @@ void k037122_device::sram_w(offs_t offset, uint32_t data, uint32_t mem_mask)
{
COMBINE_DATA(m_tile_ram.get() + offset);
- if (m_reg[0xc] & 0x10000)
+ uint32_t address = offset * 4;
+
+ if (address >= m_palette_base && address < m_palette_base + 0x8000)
{
- if (offset < 0x8000 / 4)
- {
- m_layer[1]->mark_tile_dirty(offset);
- }
- else if (offset >= 0x8000 / 4 && offset < 0x18000 / 4)
- {
- m_layer[0]->mark_tile_dirty(offset - (0x8000 / 4));
- }
- else if (offset >= 0x18000 / 4)
- {
- update_palette_color(0x18000, offset - (0x18000 / 4));
- }
+ int color = (address - m_palette_base) / 4;
+ palette().set_pen_color(color, pal5bit(data >> 6), pal6bit(data >> 0), pal5bit(data >> 11));
}
- else
+
+ if (address >= m_tilemap_base && address < m_tilemap_base + 0x10000)
{
- if (offset < 0x8000 / 4)
- {
- update_palette_color(0, offset);
- }
- else if (offset >= 0x8000 / 4 && offset < 0x18000 / 4)
- {
- m_layer[0]->mark_tile_dirty(offset - (0x8000 / 4));
- }
- else if (offset >= 0x18000 / 4)
- {
- m_layer[1]->mark_tile_dirty(offset - (0x18000 / 4));
- }
+ m_tilemap_128->mark_tile_dirty((address - m_tilemap_base) / 4);
+ m_tilemap_256->mark_tile_dirty((address - m_tilemap_base) / 4);
}
}
@@ -263,5 +257,32 @@ uint32_t k037122_device::reg_r(offs_t offset)
void k037122_device::reg_w(offs_t offset, uint32_t data, uint32_t mem_mask)
{
+ if (offset == 0x34/4 && ACCESSING_BITS_0_15)
+ {
+ uint32_t palette_base = (data & 0x4) ? 0x18000 : 0x00000;
+
+ // tilemap is at 0x00000 unless CLUT is there
+ uint32_t tilemap_base = (data & 0x4) ? 0x00000 : 0x08000;
+
+ if (palette_base != m_palette_base)
+ {
+ m_palette_base = palette_base;
+
+ // update all colors since palette moved
+ for (auto p = 0; p < 8192; p++)
+ {
+ uint32_t color = m_tile_ram[(m_palette_base / 4) + p];
+ palette().set_pen_color(p, pal5bit(color >> 6), pal6bit(color >> 0), pal5bit(color >> 11));
+ }
+ }
+
+ if (tilemap_base != m_tilemap_base)
+ {
+ m_tilemap_128->mark_all_dirty();
+ m_tilemap_256->mark_all_dirty();
+ m_tilemap_base = tilemap_base;
+ }
+ }
+
COMBINE_DATA(m_reg.get() + offset);
}
diff --git a/src/mame/video/k037122.h b/src/mame/video/k037122.h
index a39c1d572d5..a36bb793dec 100644
--- a/src/mame/video/k037122.h
+++ b/src/mame/video/k037122.h
@@ -33,7 +33,11 @@ protected:
private:
// internal state
- tilemap_t *m_layer[2];
+ tilemap_t* m_tilemap_128;
+ tilemap_t* m_tilemap_256;
+
+ uint32_t m_palette_base;
+ uint32_t m_tilemap_base;
std::unique_ptr<uint32_t[]> m_tile_ram;
std::unique_ptr<uint32_t[]> m_char_ram;
@@ -41,9 +45,7 @@ private:
int m_gfx_index;
- TILE_GET_INFO_MEMBER(tile_info_layer0);
- TILE_GET_INFO_MEMBER(tile_info_layer1);
- void update_palette_color( uint32_t palette_base, int color );
+ TILE_GET_INFO_MEMBER(tile_info);
};
DECLARE_DEVICE_TYPE(K037122, k037122_device)
diff --git a/src/mame/video/mbee.cpp b/src/mame/video/mbee.cpp
index 1a9ba1bdbc7..10d9ff271bf 100644
--- a/src/mame/video/mbee.cpp
+++ b/src/mame/video/mbee.cpp
@@ -344,10 +344,9 @@ void mbee_state::standard_palette(palette_device &palette) const
{
constexpr u8 bglevel[] = { 0, 0x54, 0xa0, 0xff };
constexpr u8 fglevel[] = { 0, 0xa0, 0xff, 0xff };
- u8 i;
// set up background colours (00-63)
- i = 0;
+ u8 i = 0;
for (u8 b : bglevel)
{
for (u8 g : bglevel)
diff --git a/src/mame/video/mermaid.cpp b/src/mame/video/mermaid.cpp
index d3271d9d4e8..1a141a7ef0d 100644
--- a/src/mame/video/mermaid.cpp
+++ b/src/mame/video/mermaid.cpp
@@ -94,6 +94,19 @@ void mermaid_state::mermaid_fg_scroll_w(offs_t offset, uint8_t data)
m_fg_tilemap->set_scrolly(offset, data);
}
+WRITE_LINE_MEMBER(mermaid_state::bg_mask_w)
+{
+ m_bg_mask = state;
+ logerror("mask %d\n", state);
+}
+
+WRITE_LINE_MEMBER(mermaid_state::bg_bank_w)
+{
+ m_bg_bank = state ? 0x100 : 0;
+ m_bg_tilemap->mark_all_dirty();
+ logerror("bank %d\n", state);
+}
+
WRITE_LINE_MEMBER(mermaid_state::rougien_gfxbankswitch1_w)
{
m_rougien_gfxbank1 = state;
@@ -134,7 +147,7 @@ uint8_t mermaid_state::mermaid_collision_r()
TILE_GET_INFO_MEMBER(mermaid_state::get_bg_tile_info)
{
- int code = m_videoram2[tile_index];
+ int code = m_videoram2[tile_index] | m_bg_bank;
int sx = tile_index % 32;
int color = (sx >= 26) ? 0 : 1;
@@ -165,6 +178,7 @@ void mermaid_state::video_start()
m_screen->register_screen_bitmap(m_helper);
m_screen->register_screen_bitmap(m_helper2);
+ m_screen->register_screen_bitmap(m_helper_mask);
}
void mermaid_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
@@ -172,6 +186,9 @@ void mermaid_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec
const rectangle spritevisiblearea(0 * 8, 26 * 8 - 1, 2 * 8, 30 * 8 - 1);
const rectangle flip_spritevisiblearea(6 * 8, 31 * 8 - 1, 2 * 8, 30 * 8 - 1);
+ rectangle clip = flip_screen_x() ? flip_spritevisiblearea : spritevisiblearea;
+ clip &= cliprect;
+
uint8_t *spriteram = m_spriteram;
int offs;
@@ -204,15 +221,66 @@ void mermaid_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec
}
- m_gfxdecode->gfx(1)->transpen(bitmap,(flip_screen_x() ? flip_spritevisiblearea : spritevisiblearea), code, color, flipx, flipy, sx, sy, 0);
+ m_gfxdecode->gfx(1)->transpen(bitmap, clip, code, color, flipx, flipy, sx, sy, 0);
}
}
uint32_t mermaid_state::screen_update_mermaid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
- m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
- draw_sprites(bitmap, cliprect);
+ if (m_bg_split)
+ {
+ constexpr int split_y = 64;
+ constexpr rectangle rr(0, 32*8-1, 0, 32*8-1);
+ m_bg_tilemap->draw(screen, m_helper_mask, rr, 0, 0);
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
+ {
+ int sy = y >= split_y ? 32*8 - 2 - (y - split_y) : 32*8 - split_y + y;
+ const u16 *s = &m_helper_mask.pix(sy, cliprect.min_x);
+ u16 *p = &bitmap.pix(y, cliprect.min_x);
+ memcpy(p, s, 2*(cliprect.max_x - cliprect.min_x + 1));
+ }
+
+
+ m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+ draw_sprites(bitmap, cliprect);
+ }
+ else if (m_bg_mask)
+ {
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
+ {
+ u16 *p = &bitmap.pix(y, cliprect.min_x);
+ for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
+ *p++ = x < 26*8 ? 0x42 : 0x40;
+ }
+ m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+ draw_sprites(bitmap, cliprect);
+
+ m_bg_tilemap->draw(screen, m_helper_mask, cliprect, 0, 0);
+ int max_x = cliprect.max_x;
+ if (max_x >= 26*8)
+ max_x = 26*8-1;
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
+ {
+ const u16 *s = &m_helper_mask.pix(y, cliprect.min_x);
+ u16 *p = &bitmap.pix(y, cliprect.min_x);
+ bool on = false;
+ for (int x = cliprect.min_x; x <= max_x; x++)
+ {
+ if (*s++ & 1)
+ on = !on;
+ if (!on)
+ *p = 0x40;
+ p ++;
+ }
+ }
+
+ }
+ else
+ {
+ m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+ m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+ draw_sprites(bitmap, cliprect);
+ }
return 0;
}
diff --git a/src/mame/video/ojankohs.cpp b/src/mame/video/ojankohs.cpp
index a7970d5b300..543bed40f8a 100644
--- a/src/mame/video/ojankohs.cpp
+++ b/src/mame/video/ojankohs.cpp
@@ -19,18 +19,17 @@
******************************************************************************/
-void ojankohs_state::ojankoy_palette(palette_device &palette) const
+void ojankoy_state::palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
- int bit0, bit1, bit2, bit3, bit4;
for (int i = 0; i < palette.entries(); i++)
{
- bit0 = BIT(color_prom[0], 2);
- bit1 = BIT(color_prom[0], 3);
- bit2 = BIT(color_prom[0], 4);
- bit3 = BIT(color_prom[0], 5);
- bit4 = BIT(color_prom[0], 6);
+ int bit0 = BIT(color_prom[0], 2);
+ int bit1 = BIT(color_prom[0], 3);
+ int bit2 = BIT(color_prom[0], 4);
+ int bit3 = BIT(color_prom[0], 5);
+ int bit4 = BIT(color_prom[0], 6);
int const r = 0x08 * bit0 + 0x11 * bit1 + 0x21 * bit2 + 0x43 * bit3 + 0x82 * bit4;
bit0 = BIT(color_prom[palette.entries()], 5);
@@ -52,7 +51,7 @@ void ojankohs_state::ojankoy_palette(palette_device &palette) const
}
}
-void ojankohs_state::ojankohs_palette_w(offs_t offset, uint8_t data)
+void ojankohs_state::palette_w(offs_t offset, uint8_t data)
{
m_paletteram[offset] = data;
@@ -65,7 +64,7 @@ void ojankohs_state::ojankohs_palette_w(offs_t offset, uint8_t data)
m_palette->set_pen_color(offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b));
}
-void ojankohs_state::ccasino_palette_w(offs_t offset, uint8_t data)
+void ccasino_state::palette_w(offs_t offset, uint8_t data)
{
offset = bitswap<11>(offset, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8);
@@ -80,7 +79,7 @@ void ojankohs_state::ccasino_palette_w(offs_t offset, uint8_t data)
m_palette->set_pen_color(offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b));
}
-void ojankohs_state::ojankoc_palette_w(offs_t offset, uint8_t data)
+void ojankoc_state::palette_w(offs_t offset, uint8_t data)
{
if (m_paletteram[offset] != data)
{
@@ -104,19 +103,19 @@ void ojankohs_state::ojankoc_palette_w(offs_t offset, uint8_t data)
******************************************************************************/
-void ojankohs_state::ojankohs_videoram_w(offs_t offset, uint8_t data)
+void ojankohs_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_tilemap->mark_tile_dirty(offset);
}
-void ojankohs_state::ojankohs_colorram_w(offs_t offset, uint8_t data)
+void ojankohs_state::colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_tilemap->mark_tile_dirty(offset);
}
-void ojankohs_state::ojankohs_gfxreg_w(uint8_t data)
+void ojankohs_state::gfxreg_w(uint8_t data)
{
if (m_gfxreg != data)
{
@@ -125,7 +124,7 @@ void ojankohs_state::ojankohs_gfxreg_w(uint8_t data)
}
}
-void ojankohs_state::ojankohs_flipscreen_w(uint8_t data)
+void ojankohs_state::flipscreen_w(uint8_t data)
{
if (m_flipscreen != BIT(data, 0))
{
@@ -146,7 +145,7 @@ void ojankohs_state::ojankohs_flipscreen_w(uint8_t data)
}
}
-TILE_GET_INFO_MEMBER(ojankohs_state::ojankohs_get_tile_info)
+TILE_GET_INFO_MEMBER(ojankohs_state::get_tile_info)
{
int tile = m_videoram[tile_index] | ((m_colorram[tile_index] & 0x0f) << 8);
int color = (m_colorram[tile_index] & 0xe0) >> 5;
@@ -160,7 +159,7 @@ TILE_GET_INFO_MEMBER(ojankohs_state::ojankohs_get_tile_info)
tileinfo.set(0, tile, color, 0);
}
-TILE_GET_INFO_MEMBER(ojankohs_state::ojankoy_get_tile_info)
+TILE_GET_INFO_MEMBER(ojankoy_state::get_tile_info)
{
int tile = m_videoram[tile_index] | (m_videoram[tile_index + 0x1000] << 8);
int color = m_colorram[tile_index] & 0x3f;
@@ -177,36 +176,33 @@ TILE_GET_INFO_MEMBER(ojankohs_state::ojankoy_get_tile_info)
******************************************************************************/
-void ojankohs_state::ojankoc_flipscreen(int data)
+void ojankoc_state::flipscreen(uint8_t data)
{
- int x, y;
- uint8_t color1, color2;
-
m_flipscreen = BIT(data, 7);
if (m_flipscreen == m_flipscreen_old)
return;
- for (y = 0; y < 0x40; y++)
+ for (int y = 0; y < 0x40; y++)
{
- for (x = 0; x < 0x100; x++)
+ for (int x = 0; x < 0x100; x++)
{
- color1 = m_videoram[0x0000 + ((y * 256) + x)];
- color2 = m_videoram[0x3fff - ((y * 256) + x)];
- ojankoc_videoram_w(0x0000 + ((y * 256) + x), color2);
- ojankoc_videoram_w(0x3fff - ((y * 256) + x), color1);
+ uint8_t color1 = m_videoram[0x0000 + ((y * 256) + x)];
+ uint8_t color2 = m_videoram[0x3fff - ((y * 256) + x)];
+ videoram_w(0x0000 + ((y * 256) + x), color2);
+ videoram_w(0x3fff - ((y * 256) + x), color1);
color1 = m_videoram[0x4000 + ((y * 256) + x)];
color2 = m_videoram[0x7fff - ((y * 256) + x)];
- ojankoc_videoram_w(0x4000 + ((y * 256) + x), color2);
- ojankoc_videoram_w(0x7fff - ((y * 256) + x), color1);
+ videoram_w(0x4000 + ((y * 256) + x), color2);
+ videoram_w(0x7fff - ((y * 256) + x), color1);
}
}
m_flipscreen_old = m_flipscreen;
}
-void ojankohs_state::ojankoc_videoram_w(offs_t offset, uint8_t data)
+void ojankoc_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
@@ -245,22 +241,17 @@ void ojankohs_state::ojankoc_videoram_w(offs_t offset, uint8_t data)
******************************************************************************/
-VIDEO_START_MEMBER(ojankohs_state,ojankohs)
+void ojankohs_state::video_start()
{
- m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ojankohs_state::ojankohs_get_tile_info)), TILEMAP_SCAN_ROWS, 8, 4, 64, 64);
+ m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ojankohs_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 4, 64, 64);
}
-VIDEO_START_MEMBER(ojankohs_state,ojankoy)
+void ojankoy_state::video_start()
{
- m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ojankohs_state::ojankoy_get_tile_info)), TILEMAP_SCAN_ROWS, 8, 4, 64, 64);
+ m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ojankoy_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 4, 64, 64);
}
-VIDEO_START_MEMBER(ojankohs_state,ccasino)
-{
- VIDEO_START_CALL_MEMBER(ojankoy);
-}
-
-VIDEO_START_MEMBER(ojankohs_state,ojankoc)
+void ojankoc_state::video_start()
{
m_screen->register_screen_bitmap(m_tmpbitmap);
@@ -274,7 +265,7 @@ VIDEO_START_MEMBER(ojankohs_state,ojankoc)
******************************************************************************/
-uint32_t ojankohs_state::screen_update_ojankohs(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t ojankohs_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_tilemap->set_scrollx(0, m_scrollx);
m_tilemap->set_scrolly(0, m_scrolly);
@@ -283,16 +274,14 @@ uint32_t ojankohs_state::screen_update_ojankohs(screen_device &screen, bitmap_in
return 0;
}
-uint32_t ojankohs_state::screen_update_ojankoc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t ojankoc_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int offs;
-
if (m_screen_refresh)
{
- /* redraw bitmap */
- for (offs = 0; offs < 0x8000; offs++)
+ // redraw bitmap
+ for (int offs = 0; offs < 0x8000; offs++)
{
- ojankoc_videoram_w(offs, m_videoram[offs]);
+ videoram_w(offs, m_videoram[offs]);
}
m_screen_refresh = 0;
}
diff --git a/src/mame/video/taitosj.cpp b/src/mame/video/taitosj.cpp
index ed3b9081e95..09df075c62d 100644
--- a/src/mame/video/taitosj.cpp
+++ b/src/mame/video/taitosj.cpp
@@ -161,6 +161,13 @@ void taitosj_state::compute_draw_order()
}
}
+void taitosj_state::device_post_load()
+{
+ m_gfxdecode->gfx(0)->mark_all_dirty();
+ m_gfxdecode->gfx(1)->mark_all_dirty();
+ m_gfxdecode->gfx(2)->mark_all_dirty();
+ m_gfxdecode->gfx(3)->mark_all_dirty();
+}
void taitosj_state::video_start()
{
@@ -294,7 +301,7 @@ int taitosj_state::check_sprite_sprite_bitpattern(int sx1, int sy1, int which1,
}
// draw the sprites into separate bitmaps and check overlapping region
- m_sprite_layer_collbitmap1.fill(TRANSPARENT_PEN);
+ m_sprite_sprite_collbitmap1.fill(TRANSPARENT_PEN);
get_sprite_gfx_element(which1)->transpen(m_sprite_sprite_collbitmap1, m_sprite_sprite_collbitmap1.cliprect(),
m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs1 + 3] & 0x3f,
0,
diff --git a/src/mame/video/x68k.cpp b/src/mame/video/x68k.cpp
index f0d7303f134..bf8a03f73d9 100644
--- a/src/mame/video/x68k.cpp
+++ b/src/mame/video/x68k.cpp
@@ -148,15 +148,6 @@ void x68k_state::spritereg_w(offs_t offset, uint16_t data, uint16_t mem_mask)
break;
case 0x408: // BG H/V-Res
m_video.bg_hvres = data & 0x1f;
- if(data != 0xff)
- { // Handle when the PCG is using 256 and the CRTC is using 512
- if((m_video.bg_hvres & 0x0c) == 0x00 && m_crtc->vfactor() == 1)
- m_video.bg_double = 2;
- else
- m_video.bg_double = 1;
- }
- else
- m_video.bg_double = 1;
break;
}
}
@@ -346,16 +337,25 @@ bool x68k_state::draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, ui
case 0x01: // 256 colours
if(page == 0 || page == 2)
{
- xscr = m_crtc->xscr_gfx(page) & 0x1ff;
- yscr = m_crtc->yscr_gfx(page) & 0x1ff;
- lineoffset = (((scanline - m_crtc->vbegin() / divisor) + yscr) & 0x1ff) * 512;
- loc = xscr & 0x1ff;
+ // What effect do priorites and plane disable have here? Does it work in 16bit color mode?
+ uint16_t xscr0, yscr0, xscr1, yscr1;
+ uint32_t loc0, loc1, lineoffset0, lineoffset1;
+ xscr0 = m_crtc->xscr_gfx(page) & 0x1ff;
+ yscr0 = m_crtc->yscr_gfx(page) & 0x1ff;
+ xscr1 = m_crtc->xscr_gfx(page + 1) & 0x1ff;
+ yscr1 = m_crtc->yscr_gfx(page + 1) & 0x1ff;
+
+ lineoffset0 = (((scanline - m_crtc->vbegin() / divisor) + yscr0) & 0x1ff) * 512;
+ loc0 = xscr0 & 0x1ff;
+ lineoffset1 = (((scanline - m_crtc->vbegin() / divisor) + yscr1) & 0x1ff) * 512;
+ loc1 = xscr1 & 0x1ff;
shift = 4;
if((m_video.reg[2] & 0x1a00) == 0x1a00)
ret = true;
for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
- colour = ((m_gvram[lineoffset + loc] >> page*shift) & 0x00ff);
+ colour = ((m_gvram[lineoffset0 + loc0] >> page*shift) & 0x000f);
+ colour |= ((m_gvram[lineoffset1 + loc1] >> page*shift) & 0x00f0);
if(ret && (colour & 1))
{
blend = true;
@@ -385,8 +385,10 @@ bool x68k_state::draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, ui
bitmap.pix(scanline, pixel) = m_special.pix(scanline, pixel);
m_special.pix(scanline, pixel) = 0;
}
- loc++;
- loc &= 0x1ff;
+ loc0++;
+ loc0 &= 0x1ff;
+ loc1++;
+ loc1 &= 0x1ff;
}
}
break;
@@ -519,7 +521,7 @@ void x68k_state::draw_sprites(bitmap_ind16 &bitmap, int priority, rectangle clip
*/
int ptr,pri;
int divisor = 1;
- if(!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan())
+ if((!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan()) || ((m_video.bg_hvres & 0x1c) == 0x10 && m_crtc->vfactor() == 1))
divisor = 2;
for(ptr=508;ptr>=0;ptr-=4) // stepping through sprites
@@ -546,7 +548,7 @@ void x68k_state::draw_sprites(bitmap_ind16 &bitmap, int priority, rectangle clip
sx += m_video.bg_hshift;
sx += m_sprite_shift;
- m_gfxdecode->gfx(1)->zoom_transpen(bitmap,cliprect,code,colour,xflip,yflip,m_crtc->hbegin()+sx,(m_crtc->vbegin() / divisor)+(sy*m_video.bg_double),0x10000,0x10000*m_video.bg_double,0x00);
+ m_gfxdecode->gfx(1)->zoom_transpen(bitmap,cliprect,code,colour,xflip,yflip,m_crtc->hbegin()+sx,(m_crtc->vbegin() / divisor)+sy,0x10000,0x10000,0x00);
}
}
}
@@ -559,7 +561,7 @@ void x68k_state::draw_bg(bitmap_ind16 &bitmap, screen_device &screen, int layer,
tilemap_t* x68k_bg1;
tilemap_t* map;
int divisor = 1;
- if(!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan())
+ if((!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan()) || ((m_video.bg_hvres & 0x1c) == 0x10 && m_crtc->vfactor() == 1))
divisor = 2;
if((m_spritereg[0x408] & 0x03) == 0x00) // Sprite/BG H-Res 0=8x8, 1=16x16, 2 or 3 = undefined.
@@ -760,7 +762,7 @@ uint32_t x68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
{
rectangle pcgrect = rect;
int divisor = 1;
- if(!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan())
+ if((!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan()) || ((m_video.bg_hvres & 0x1c) == 0x10 && m_crtc->vfactor() == 1))
{
pcgrect.max_y >>= 1;
pcgrect.min_y >>= 1;
diff --git a/src/osd/eigcc.h b/src/osd/eigcc.h
index 69bbeffde07..2c5bf34ba72 100644
--- a/src/osd/eigcc.h
+++ b/src/osd/eigcc.h
@@ -55,6 +55,66 @@ inline bool _addu_64x64_co(uint64_t a, uint64_t b, uint64_t &sum)
***************************************************************************/
/*-------------------------------------------------
+ count_leading_zeros_32 - return the number of
+ leading zero bits in a 32-bit value
+-------------------------------------------------*/
+
+#ifndef count_leading_zeros_32
+#define count_leading_zeros_32 _count_leading_zeros_32
+inline uint8_t _count_leading_zeros_32(uint32_t val)
+{
+ // uses CPU feature if available, otherwise falls back to runtime library call
+ static_assert(sizeof(val) == sizeof(unsigned), "expected 32-bit unsigned int");
+ return uint8_t(unsigned(val ? __builtin_clz(val) : 32));
+}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_ones_32 - return the number of
+ leading one bits in a 32-bit value
+-------------------------------------------------*/
+
+#ifndef count_leading_ones_32
+#define count_leading_ones_32 _count_leading_ones_32
+inline uint8_t _count_leading_ones_32(uint32_t val)
+{
+ return count_leading_zeros_32(~val);
+}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_zeros_64 - return the number of
+ leading zero bits in a 64-bit value
+-------------------------------------------------*/
+
+#ifndef count_leading_zeros_64
+#define count_leading_zeros_64 _count_leading_zeros_64
+inline uint8_t _count_leading_zeros_64(uint64_t val)
+{
+ // uses CPU feature if available, otherwise falls back to runtime library call
+ static_assert(sizeof(val) == sizeof(unsigned long long), "expected 64-bit unsigned long long int");
+ return uint8_t(unsigned(val ? __builtin_clzll(val) : 64));
+}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_ones_64 - return the number of
+ leading one bits in a 64-bit value
+-------------------------------------------------*/
+
+#ifndef count_leading_ones_64
+#define count_leading_ones_64 _count_leading_ones_64
+inline uint8_t _count_leading_ones_64(uint64_t val)
+{
+ return count_leading_zeros_64(~val);
+}
+#endif
+
+
+/*-------------------------------------------------
population_count_32 - return the number of
one bits in a 32-bit value
-------------------------------------------------*/
diff --git a/src/osd/eigccarm.h b/src/osd/eigccarm.h
index 27d79c4a5c6..90004daf9d4 100644
--- a/src/osd/eigccarm.h
+++ b/src/osd/eigccarm.h
@@ -239,14 +239,14 @@ _mulu_64x64(uint64_t a, uint64_t b, uint64_t &hi)
***************************************************************************/
/*-------------------------------------------------
- count_leading_zeros - return the number of
+ count_leading_zeros_32 - return the number of
leading zero bits in a 32-bit value
-------------------------------------------------*/
#if defined(__aarch64__)
-#define count_leading_zeros _count_leading_zeros
+#define count_leading_zeros_32 _count_leading_zeros_32
inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
-_count_leading_zeros(uint32_t value)
+_count_leading_zeros_32(uint32_t value)
{
uint32_t result;
@@ -256,20 +256,20 @@ _count_leading_zeros(uint32_t value)
: [value] "r" (value)
);
- return result;
+ return uint8_t(result);
}
#endif
/*-------------------------------------------------
- count_leading_ones - return the number of
+ count_leading_ones_32 - return the number of
leading one bits in a 32-bit value
-------------------------------------------------*/
#if defined(__aarch64__)
-#define count_leading_ones _count_leading_ones
+#define count_leading_ones_32 _count_leading_ones_32
inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
-_count_leading_ones(uint32_t value)
+_count_leading_ones_32(uint32_t value)
{
uint32_t result;
@@ -279,7 +279,53 @@ _count_leading_ones(uint32_t value)
: [value] "r" (~value)
);
- return result;
+ return uint8_t(result);
+}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_zeros_64 - return the number of
+ leading zero bits in a 64-bit value
+-------------------------------------------------*/
+
+#if defined(__aarch64__)
+#define count_leading_zeros_64 _count_leading_zeros_64
+inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
+_count_leading_zeros_64(uint64_t value)
+{
+ uint64_t result;
+
+ __asm__ (
+ " clz %[result], %[value] \n"
+ : [result] "=r" (result)
+ : [value] "r" (value)
+ );
+
+ return uint8_t(result);
+}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_ones_64 - return the number of
+ leading one bits in a 64-bit value
+-------------------------------------------------*/
+
+#if defined(__aarch64__)
+#define count_leading_ones_64 _count_leading_ones_64
+inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
+_count_leading_ones_64(uint64_t value)
+{
+ uint64_t result;
+
+ __asm__ (
+ " clz %[result], %[value] \n"
+ : [result] "=r" (result)
+ : [value] "r" (~value)
+ );
+
+ return uint8_t(result);
}
#endif
diff --git a/src/osd/eigccppc.h b/src/osd/eigccppc.h
index 3a1b2093d4e..de1372ff39b 100644
--- a/src/osd/eigccppc.h
+++ b/src/osd/eigccppc.h
@@ -239,13 +239,13 @@ _mulu_64x64(uint64_t a, uint64_t b, uint64_t &hi)
***************************************************************************/
/*-------------------------------------------------
- count_leading_zeros - return the number of
+ count_leading_zeros_32 - return the number of
leading zero bits in a 32-bit value
-------------------------------------------------*/
-#define count_leading_zeros _count_leading_zeros
+#define count_leading_zeros_32 _count_leading_zeros_32
inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
-_count_leading_zeros(uint32_t value)
+_count_leading_zeros_32(uint32_t value)
{
uint32_t result;
@@ -255,18 +255,18 @@ _count_leading_zeros(uint32_t value)
: [value] "r" (value)
);
- return result;
+ return uint8_t(result);
}
/*-------------------------------------------------
- count_leading_ones - return the number of
+ count_leading_ones_32 - return the number of
leading one bits in a 32-bit value
-------------------------------------------------*/
-#define count_leading_ones _count_leading_ones
+#define count_leading_ones_32 _count_leading_ones_32
inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
-_count_leading_ones(uint32_t value)
+_count_leading_ones_32(uint32_t value)
{
uint32_t result;
@@ -276,7 +276,53 @@ _count_leading_ones(uint32_t value)
: [value] "r" (~value)
);
- return result;
+ return uint8_t(result);
+}
+
+
+/*-------------------------------------------------
+ count_leading_zeros_64 - return the number of
+ leading zero bits in a 64-bit value
+-------------------------------------------------*/
+
+#if defined(__ppc64__)
+#define count_leading_zeros_64 _count_leading_zeros_64
+inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
+_count_leading_zeros_64(uint64_t value)
+{
+ uint64_t result;
+
+ __asm__ (
+ " cntlzd %[result], %[value] \n"
+ : [result] "=r" (result)
+ : [value] "r" (value)
+ );
+
+ return uint8_t(result);
}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_ones_64 - return the number of
+ leading one bits in a 64-bit value
+-------------------------------------------------*/
+
+#if defined(__ppc64__)
+#define count_leading_ones_64 _count_leading_ones_64
+inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
+_count_leading_ones_64(uint64_t value)
+{
+ uint64_t result;
+
+ __asm__ (
+ " cntlzd %[result], %[value] \n"
+ : [result] "=r" (result)
+ : [value] "r" (~value)
+ );
+
+ return uint8_t(result);
+}
+#endif
#endif // MAME_OSD_EIGCCPPC_H
diff --git a/src/osd/eigccx86.h b/src/osd/eigccx86.h
index b3bbf7bd0ec..35f02e12f5e 100644
--- a/src/osd/eigccx86.h
+++ b/src/osd/eigccx86.h
@@ -433,13 +433,13 @@ _mulu_64x64(uint64_t a, uint64_t b, uint64_t &hi)
***************************************************************************/
/*-------------------------------------------------
- count_leading_zeros - return the number of
+ count_leading_zeros_32 - return the number of
leading zero bits in a 32-bit value
-------------------------------------------------*/
-#define count_leading_zeros _count_leading_zeros
+#define count_leading_zeros_32 _count_leading_zeros_32
inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
-_count_leading_zeros(uint32_t value)
+_count_leading_zeros_32(uint32_t value)
{
uint32_t result;
__asm__ (
@@ -450,18 +450,18 @@ _count_leading_zeros(uint32_t value)
, [bias] "rm" (~uint32_t(0)) // 'bias' can be register or memory
: "cc" // clobbers condition codes
);
- return 31U - result;
+ return uint8_t(31U - result);
}
/*-------------------------------------------------
- count_leading_ones - return the number of
+ count_leading_ones_32 - return the number of
leading one bits in a 32-bit value
-------------------------------------------------*/
-#define count_leading_ones _count_leading_ones
+#define count_leading_ones_32 _count_leading_ones_32
inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
-_count_leading_ones(uint32_t value)
+_count_leading_ones_32(uint32_t value)
{
uint32_t result;
__asm__ (
@@ -472,7 +472,55 @@ _count_leading_ones(uint32_t value)
, [bias] "rm" (~uint32_t(0)) // 'bias' can be register or memory
: "cc" // clobbers condition codes
);
- return 31U - result;
+ return uint8_t(31U - result);
}
+
+/*-------------------------------------------------
+ count_leading_zeros_64 - return the number of
+ leading zero bits in a 64-bit value
+-------------------------------------------------*/
+
+#ifdef __x86_64__
+#define count_leading_zeros_64 _count_leading_zeros_64
+inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
+_count_leading_zeros_64(uint64_t value)
+{
+ uint64_t result;
+ __asm__ (
+ " bsrq %[value], %[result] ;"
+ " cmovzq %[bias], %[result] ;"
+ : [result] "=&r" (result) // result can be in any register
+ : [value] "rm" (value) // 'value' can be register or memory
+ , [bias] "rm" (~uint64_t(0)) // 'bias' can be register or memory
+ : "cc" // clobbers condition codes
+ );
+ return uint8_t(63U - result);
+}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_ones_64 - return the number of
+ leading one bits in a 64-bit value
+-------------------------------------------------*/
+
+#ifdef __x86_64__
+#define count_leading_ones_64 _count_leading_ones_64
+inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
+_count_leading_ones_64(uint64_t value)
+{
+ uint64_t result;
+ __asm__ (
+ " bsrq %[value], %[result] ;"
+ " cmovzq %[bias], %[result] ;"
+ : [result] "=&r" (result) // result can be in any register
+ : [value] "rm" (~value) // 'value' can be register or memory
+ , [bias] "rm" (~uint64_t(0)) // 'bias' can be register or memory
+ : "cc" // clobbers condition codes
+ );
+ return uint8_t(63U - result);
+}
+#endif
+
#endif // MAME_OSD_EIGCCX86_H
diff --git a/src/osd/eivc.h b/src/osd/eivc.h
index 56d1dcc3ab8..2ffd0e7633b 100644
--- a/src/osd/eivc.h
+++ b/src/osd/eivc.h
@@ -15,6 +15,9 @@
#include <intrin.h>
#pragma intrinsic(_BitScanReverse)
+#ifdef PTR64
+#pragma intrinsic(_BitScanReverse64)
+#endif
/***************************************************************************
@@ -22,13 +25,13 @@
***************************************************************************/
/*-------------------------------------------------
- count_leading_zeros - return the number of
+ count_leading_zeros_32 - return the number of
leading zero bits in a 32-bit value
-------------------------------------------------*/
-#ifndef count_leading_zeros
-#define count_leading_zeros _count_leading_zeros
-__forceinline uint8_t _count_leading_zeros(uint32_t value)
+#ifndef count_leading_zeros_32
+#define count_leading_zeros_32 _count_leading_zeros_32
+__forceinline uint8_t _count_leading_zeros_32(uint32_t value)
{
unsigned long index;
return _BitScanReverse(&index, value) ? (31U - index) : 32U;
@@ -37,17 +40,55 @@ __forceinline uint8_t _count_leading_zeros(uint32_t value)
/*-------------------------------------------------
- count_leading_ones - return the number of
+ count_leading_ones_32 - return the number of
leading one bits in a 32-bit value
-------------------------------------------------*/
-#ifndef count_leading_ones
-#define count_leading_ones _count_leading_ones
-__forceinline uint8_t _count_leading_ones(uint32_t value)
+#ifndef count_leading_ones_32
+#define count_leading_ones_32 _count_leading_ones_32
+__forceinline uint8_t _count_leading_ones_32(uint32_t value)
{
unsigned long index;
return _BitScanReverse(&index, ~value) ? (31U - index) : 32U;
}
#endif
+
+/*-------------------------------------------------
+ count_leading_zeros_64 - return the number of
+ leading zero bits in a 64-bit value
+-------------------------------------------------*/
+
+#ifndef count_leading_zeros_64
+#define count_leading_zeros_64 _count_leading_zeros_64
+__forceinline uint8_t _count_leading_zeros_64(uint64_t value)
+{
+ unsigned long index;
+#ifdef PTR64
+ return _BitScanReverse64(&index, value) ? (63U - index) : 64U;
+#else
+ return _BitScanReverse(&index, uint32_t(value >> 32)) ? (31U - index) : _BitScanReverse(&index, uint32_t(value)) ? (63U - index) : 64U;
+#endif
+}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_ones_64 - return the number of
+ leading one bits in a 64-bit value
+-------------------------------------------------*/
+
+#ifndef count_leading_ones_64
+#define count_leading_ones_64 _count_leading_ones_64
+__forceinline uint8_t _count_leading_ones_64(uint64_t value)
+{
+ unsigned long index;
+#ifdef PTR64
+ return _BitScanReverse64(&index, ~value) ? (63U - index) : 64U;
+#else
+ return _BitScanReverse(&index, ~uint32_t(value >> 32)) ? (31U - index) : _BitScanReverse(&index, ~uint32_t(value)) ? (63U - index) : 64U;
+#endif
+}
+#endif
+
#endif // MAME_OSD_EIVC_H
diff --git a/src/osd/eivcarm.h b/src/osd/eivcarm.h
new file mode 100644
index 00000000000..5e612cb25fb
--- /dev/null
+++ b/src/osd/eivcarm.h
@@ -0,0 +1,75 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+//============================================================
+//
+// eivcarm.h
+//
+// ARM/AArch64 inline implementations for MSVC compiler.
+//
+//============================================================
+
+#ifndef MAME_OSD_EIVCARM_H
+#define MAME_OSD_EIVCARM_H
+
+#pragma once
+
+#include <intrin.h>
+
+#pragma intrinsic(_CountLeadingZeros)
+#pragma intrinsic(_CountLeadingZeros64)
+#pragma intrinsic(_CountLeadingOnes)
+#pragma intrinsic(_CountLeadingOnes64)
+
+
+/***************************************************************************
+ INLINE BIT MANIPULATION FUNCTIONS
+***************************************************************************/
+
+/*-------------------------------------------------
+ count_leading_zeros_32 - return the number of
+ leading zero bits in a 32-bit value
+-------------------------------------------------*/
+
+#define count_leading_zeros_32 _count_leading_zeros_32
+__forceinline uint8_t _count_leading_zeros_32(uint32_t value)
+{
+ return uint8_t(_CountLeadingZeros(value));
+}
+
+
+/*-------------------------------------------------
+ count_leading_ones_32 - return the number of
+ leading one bits in a 32-bit value
+-------------------------------------------------*/
+
+#define count_leading_ones_32 _count_leading_ones_32
+__forceinline uint8_t _count_leading_ones_32(uint32_t value)
+{
+ return uint8_t(_CountLeadingOnes(value));
+}
+
+
+/*-------------------------------------------------
+ count_leading_zeros_64 - return the number of
+ leading zero bits in a 64-bit value
+-------------------------------------------------*/
+
+#define count_leading_zeros_64 _count_leading_zeros_64
+__forceinline uint8_t _count_leading_zeros_64(uint64_t value)
+{
+ return uint8_t(_CountLeadingZeros64(value));
+}
+
+
+/*-------------------------------------------------
+ count_leading_ones_64 - return the number of
+ leading one bits in a 64-bit value
+-------------------------------------------------*/
+
+#define count_leading_ones_64 _count_leading_ones_64
+__forceinline uint8_t _count_leading_ones_64(uint64_t value)
+{
+ return uint8_t(_CountLeadingOnes64(value));
+}
+
+#endif // MAME_OSD_EIVCARM_H
diff --git a/src/osd/eminline.h b/src/osd/eminline.h
index a7cc4cfee3d..02bd22b3fdb 100644
--- a/src/osd/eminline.h
+++ b/src/osd/eminline.h
@@ -33,8 +33,10 @@
#elif defined(_MSC_VER)
-#if (defined(_M_IX86) || defined(_M_X64))
+#if defined(_M_IX86) || defined(_M_X64)
#include "eivcx86.h"
+#elif defined(_M_ARM) || defined(_M_ARM64)
+#include "eivcarm.h"
#endif
#include "eivc.h"
@@ -352,12 +354,12 @@ inline bool addu_64x64_co(uint64_t a, uint64_t b, uint64_t &sum)
***************************************************************************/
/*-------------------------------------------------
- count_leading_zeros - return the number of
+ count_leading_zeros_32 - return the number of
leading zero bits in a 32-bit value
-------------------------------------------------*/
-#ifndef count_leading_zeros
-inline uint8_t count_leading_zeros(uint32_t val)
+#ifndef count_leading_zeros_32
+inline uint8_t count_leading_zeros_32(uint32_t val)
{
if (!val) return 32U;
uint8_t count;
@@ -368,12 +370,12 @@ inline uint8_t count_leading_zeros(uint32_t val)
/*-------------------------------------------------
- count_leading_ones - return the number of
+ count_leading_ones_32 - return the number of
leading one bits in a 32-bit value
-------------------------------------------------*/
-#ifndef count_leading_ones
-inline uint8_t count_leading_ones(uint32_t val)
+#ifndef count_leading_ones_32
+inline uint8_t count_leading_ones_32(uint32_t val)
{
uint8_t count;
for (count = 0; int32_t(val) < 0; count++) val <<= 1;
@@ -383,6 +385,37 @@ inline uint8_t count_leading_ones(uint32_t val)
/*-------------------------------------------------
+ count_leading_zeros_64 - return the number of
+ leading zero bits in a 64-bit value
+-------------------------------------------------*/
+
+#ifndef count_leading_zeros_64
+inline uint8_t count_leading_zeros_64(uint64_t val)
+{
+ if (!val) return 64U;
+ uint8_t count;
+ for (count = 0; int64_t(val) >= 0; count++) val <<= 1;
+ return count;
+}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_ones_64 - return the number of
+ leading one bits in a 64-bit value
+-------------------------------------------------*/
+
+#ifndef count_leading_ones_64
+inline uint8_t count_leading_ones_64(uint64_t val)
+{
+ uint8_t count;
+ for (count = 0; int64_t(val) < 0; count++) val <<= 1;
+ return count;
+}
+#endif
+
+
+/*-------------------------------------------------
population_count_32 - return the number of
one bits in a 32-bit value
-------------------------------------------------*/
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp
index c23945ab01e..b9fe1ce0539 100644
--- a/src/tools/unidasm.cpp
+++ b/src/tools/unidasm.cpp
@@ -1345,7 +1345,7 @@ int main(int argc, char *argv[])
}
// Compute the shift amount from pc delta to granularity-sized elements
- u32 granularity_shift = 31 - count_leading_zeros(disasm->opcode_alignment());
+ u32 granularity_shift = 31 - count_leading_zeros_32(disasm->opcode_alignment());
// Number of pc steps to disassemble
u32 count = pclength;
@@ -1355,7 +1355,7 @@ int main(int argc, char *argv[])
// pc to string conversion
std::function<std::string (offs_t pc)> pc_to_string;
- int aw = 32 - count_leading_zeros(pc_mask);
+ int aw = 32 - count_leading_zeros_32(pc_mask);
bool is_octal = opts.octal; // Parameter? Per-cpu config?
if((flags & util::disasm_interface::PAGED2LEVEL) == util::disasm_interface::PAGED2LEVEL) {
int bits1 = disasm->page_address_bits();