From ae49c58f72af51bfd542a6198891384bfb39dcee Mon Sep 17 00:00:00 2001 From: David Haywood Date: Fri, 12 Feb 2016 11:13:59 +0000 Subject: [PATCH 1/8] figured out algorithm and replaced SnowBoard Championship lookup table with proper emulation of device [Samuel Neves & Peter Wilhelmsen] --- src/mame/drivers/gaelco2.cpp | 6 --- src/mame/machine/gaelco2.cpp | 78 +++++++++++++++++++++++++++++++----- 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/src/mame/drivers/gaelco2.cpp b/src/mame/drivers/gaelco2.cpp index 06a068e372c..44739b59053 100644 --- a/src/mame/drivers/gaelco2.cpp +++ b/src/mame/drivers/gaelco2.cpp @@ -1046,9 +1046,6 @@ ROM_START( snowboara ) ROM_LOAD( "sb44", 0x0000000, 0x0400000, CRC(1bbe88bc) SHA1(15bce9ada2b742ba4d537fa8efc0f29f661bff00) ) /* GFX only */ ROM_LOAD( "sb45", 0x0400000, 0x0400000, CRC(373983d9) SHA1(05e35a8b27cab469885f0ec2a5df200a366b50a1) ) /* Sound only */ ROM_LOAD( "sb46", 0x0800000, 0x0400000, CRC(22e7c648) SHA1(baddb9bc13accd83bea61533d7286cf61cd89279) ) /* GFX only */ - - DISK_REGION( "decrypt" ) - DISK_IMAGE( "snowboar", 0, SHA1(fecf611bd9289d24a0b1cabaaf030e2cee322cfa) ) ROM_END ROM_START( snowboar ) @@ -1086,9 +1083,6 @@ ROM_START( snowboar ) ROM_LOAD( "sb.e2", 0x1100000, 0x0080000, CRC(f5948c6c) SHA1(91bba817ced194b02885ce84b7a8132ef5ca631a) ) /* GFX only */ ROM_LOAD( "sb.e3", 0x1180000, 0x0080000, CRC(4baa678f) SHA1(a7fbbd687e2d8d7e96207c8ace0799a3cc9c3272) ) /* GFX only */ ROM_FILL( 0x1200000, 0x0200000, 0x00 ) /* Empty */ - - DISK_REGION( "decrypt" ) - DISK_IMAGE( "snowboar", 0, SHA1(fecf611bd9289d24a0b1cabaaf030e2cee322cfa) ) ROM_END diff --git a/src/mame/machine/gaelco2.cpp b/src/mame/machine/gaelco2.cpp index 6d39cdd0962..0ac284242d7 100644 --- a/src/mame/machine/gaelco2.cpp +++ b/src/mame/machine/gaelco2.cpp @@ -287,19 +287,75 @@ WRITE16_MEMBER(gaelco2_state::gaelco2_eeprom_data_w) ***************************************************************************/ +static UINT32 rol(UINT32 x, unsigned int c) +{ + return (x << c) | (x >> (32 - c)); +} + +static UINT16 get_lo(UINT32 x) +{ + return ((x & 0x00000010) << 1) | + ((x & 0x00000800) << 3) | + ((x & 0x40000000) >> 27) | + ((x & 0x00000005) << 6) | + ((x & 0x00000008) << 8) | + rol(x & 0x00800040, 9) | + ((x & 0x04000000) >> 16) | + ((x & 0x00008000) >> 14) | + ((x & 0x00002000) >> 11) | + ((x & 0x00020000) >> 10) | + ((x & 0x00100000) >> 8) | + ((x & 0x00044000) >> 5) | + ((x & 0x00000020) >> 1); +} + +static UINT16 get_hi(UINT32 x) +{ + return ((x & 0x00001400) >> 0) | + ((x & 0x10000000) >> 26) | + ((x & 0x02000000) >> 24) | + ((x & 0x08000000) >> 21) | + ((x & 0x00000002) << 12) | + ((x & 0x01000000) >> 19) | + ((x & 0x20000000) >> 18) | + ((x & 0x80000000) >> 16) | + ((x & 0x00200000) >> 13) | + ((x & 0x00010000) >> 12) | + ((x & 0x00080000) >> 10) | + ((x & 0x00000200) >> 9) | + ((x & 0x00400000) >> 8) | + ((x & 0x00000080) >> 4) | + ((x & 0x00000100) >> 1); +} + +static UINT16 get_out(UINT16 x) +{ + return ((x & 0xc840) << 0) | + ((x & 0x0080) << 2) | + ((x & 0x0004) << 3) | + ((x & 0x0008) << 5) | + ((x & 0x0010) << 8) | + ((x & 0x0002) << 9) | + ((x & 0x0001) << 13) | + ((x & 0x0200) >> 9) | + ((x & 0x1400) >> 8) | + ((x & 0x0100) >> 7) | + ((x & 0x2000) >> 6) | + ((x & 0x0020) >> 2); +} + +UINT16 mangle(UINT32 x) +{ + UINT16 a = get_lo(x); + UINT16 b = get_hi(x); + return get_out(((a ^ 0x0010) - (b ^ 0x0024)) ^ 0x5496); +} + READ16_MEMBER(gaelco2_state::snowboar_protection_r) { - chd_file * table = machine().rom_load().get_disk_handle(":decrypt"); - UINT8 temp[1024]; - table->read_hunk(snowboard_latch>>9, &temp[0]); - UINT16 data = (temp[(snowboard_latch & 0x1ff)*2]<<8) | temp[((snowboard_latch & 0x1ff)*2)+1]; - - // TODO: replace above lookup (8GB table) with emulation of device - - logerror("%06x: protection read (input %08x output %04x)\n", space.device().safe_pc(), snowboard_latch, data); - - - return data; + UINT16 ret = mangle(snowboard_latch); + ret = ((ret & 0xff00) >> 8) | ((ret & 0x00ff) << 8); + return ret; } From 12a23988b3d9d42bfae59d188c988e929c8bf21e Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 11 Feb 2016 23:25:56 +1100 Subject: [PATCH 2/8] Add a BC548 transistor model --- src/lib/netlist/devices/net_lib.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 3b8edc8ac84..4df6811dddc 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -41,8 +41,9 @@ NETLIST_START(bjt_models) NET_MODEL("2N5190 NPN(IS=9.198E-14 NF=1.003 ISE=4.468E-16 NE=1.65 BF=338.8 IKF=0.4913 VAF=107.9 NR=1.002 ISC=5.109E-15 NC=1.071 BR=29.48 IKR=0.193 VAR=25 RB=1 IRB=1000 RBM=1 RE=0.2126 RC=0.143 XTB=0 EG=1.11 XTI=3 CJE=3.825E-11 VJE=0.7004 MJE=0.364 TF=5.229E-10 XTF=219.7 VTF=3.502 ITF=7.257 PTF=0 CJC=1.27E-11 VJC=0.4431 MJC=0.3983 XCJC=0.4555 TR=7E-11 CJS=0 VJS=0.75 MJS=0.333 FC=0.905 Vceo=45 Icrating=500m mfg=Philips)") NET_MODEL("2SC945 NPN(IS=3.577E-14 BF=2.382E+02 NF=1.01 VAF=1.206E+02 IKF=3.332E-01 ISE=3.038E-16 NE=1.205 BR=1.289E+01 NR=1.015 VAR=1.533E+01 IKR=2.037E-01 ISC=3.972E-14 NC=1.115 RB=3.680E+01 IRB=1.004E-04 RBM=1 RE=8.338E-01 RC=1.557E+00 CJE=1.877E-11 VJE=7.211E-01 MJE=3.486E-01 TF=4.149E-10 XTF=1.000E+02 VTF=9.956 ITF=5.118E-01 PTF=0 CJC=6.876p VJC=3.645E-01 MJC=3.074E-01 TR=5.145E-08 XTB=1.5 EG=1.11 XTI=3 FC=0.5 Vceo=50 Icrating=100m MFG=NEC)") - NET_MODEL("BC237B NPN(IS=1.8E-14 ISE=5.0E-14 ISC=1.72E-13 XTI=3 BF=400 BR=35.5 IKF=0.14 IKR=0.03 XTB=1.5 VAF=80 VAR=12.5 VJE=0.58 VJC=0.54 RE=0.6 RC=0.25 RB=0.56 CJE=13E-12 CJC=4E-12 XCJC=0.75 FC=0.5 NF=0.9955 NR=1.005 NE=1.46 NC=1.27 MJE=0.33 MJC=0.33 TF=0.64E-9 TR=50.72E-9 EG=1.11 KF=0 AF=1 VCEO=45V ICRATING=100M MFG=ZETEX)") + NET_MODEL("BC237B NPN(IS=1.8E-14 ISE=5.0E-14 ISC=1.72E-13 XTI=3 BF=400 BR=35.5 IKF=0.14 IKR=0.03 XTB=1.5 VAF=80 VAR=12.5 VJE=0.58 VJC=0.54 RE=0.6 RC=0.25 RB=0.56 CJE=13E-12 CJC=4E-12 XCJC=0.75 FC=0.5 NF=0.9955 NR=1.005 NE=1.46 NC=1.27 MJE=0.33 MJC=0.33 TF=0.64E-9 TR=50.72E-9 EG=1.11 KF=0 AF=1 VCEO=45 ICRATING=100M MFG=ZETEX)") NET_MODEL("BC556B PNP(IS=3.83E-14 NF=1.008 ISE=1.22E-14 NE=1.528 BF=344.4 IKF=0.08039 VAF=21.11 NR=1.005 ISC=2.85E-13 NC=1.28 BR=14.84 IKR=0.047 VAR=32.02 RB=1 IRB=1.00E-06 RBM=1 RE=0.6202 RC=0.5713 XTB=0 EG=1.11 XTI=3 CJE=1.23E-11 VJE=0.6106 MJE=0.378 TF=5.60E-10 XTF=3.414 VTF=5.23 ITF=0.1483 PTF=0 CJC=1.08E-11 VJC=0.1022 MJC=0.3563 XCJC=0.6288 TR=1.00E-32 CJS=0 VJS=0.75 MJS=0.333 FC=0.8027 Vceo=65 Icrating=100m mfg=Philips)") + NET_MODEL("BC548C NPN(IS=1.95E-14 ISE=1.31E-15 ISC=1.0E-13 XTI=3 BF=466 BR=2.42 IKF=0.18 IKR=1 XTB=1.5 VAF=91.7 VAR=24.7 VJE=0.632 VJC=0.339 RE=1 RC=1.73 RB=26.5 RBM=10 IRB=10 CJE=1.33E-11 CJC=5.17E-12 XCJC=1 FC=0.9 NF=0.993 NR=1.2 NE=1.32 NC=2.00 MJE=0.326 MJC=0.319 TF=6.52E-10 TR=0 PTF=0 ITF=1.03 VTF=1.65 XTF=100 EG=1.11 KF=1E-9 AF=1 VCEO=40 ICrating=800M MFG=Siemens)") NET_MODEL("BC817-25 NPN(IS=9.198E-14 NF=1.003 ISE=4.468E-16 NE=1.65 BF=338.8 IKF=0.4913 VAF=107.9 NR=1.002 ISC=5.109E-15 NC=1.071 BR=29.48 IKR=0.193 VAR=25 RB=1 IRB=1000 RBM=1 RE=0.2126 RC=0.143 XTB=0 EG=1.11 XTI=3 CJE=3.825E-11 VJE=0.7004 MJE=0.364 TF=5.229E-10 XTF=219.7 VTF=3.502 ITF=7.257 PTF=0 CJC=1.27E-11 VJC=0.4431 MJC=0.3983 XCJC=0.4555 TR=7E-11 CJS=0 VJS=0.75 MJS=0.333 FC=0.905 Vceo=45 Icrating=500m mfg=Philips)") NETLIST_END() From 5ad3e6664d52b2bf379936c4b764ceb35a2f6f2a Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 12 Feb 2016 22:20:25 +1100 Subject: [PATCH 3/8] Make Zaccaria 1B11142 sound board a device in preparation for netlist sound --- scripts/target/mame/arcade.lua | 2 + src/mame/audio/laserbat.cpp | 10 -- src/mame/audio/zaccaria.cpp | 294 +++++++++++++++++++++++++++++++++ src/mame/audio/zaccaria.h | 80 +++++++++ src/mame/drivers/laserbat.cpp | 4 +- src/mame/drivers/zaccaria.cpp | 262 ++++------------------------- src/mame/includes/laserbat.h | 2 - src/mame/includes/zaccaria.h | 85 ++++------ 8 files changed, 441 insertions(+), 298 deletions(-) create mode 100644 src/mame/audio/zaccaria.cpp create mode 100644 src/mame/audio/zaccaria.h diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index ba487965464..f59119796fc 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -4021,6 +4021,8 @@ files { createMAMEProjects(_target, _subtarget, "zaccaria") files { + MAME_DIR .. "src/mame/audio/zaccaria.cpp", + MAME_DIR .. "src/mame/audio/zaccaria.h", MAME_DIR .. "src/mame/drivers/laserbat.cpp", MAME_DIR .. "src/mame/includes/laserbat.h", MAME_DIR .. "src/mame/video/laserbat.cpp", diff --git a/src/mame/audio/laserbat.cpp b/src/mame/audio/laserbat.cpp index ef26a168f31..a10e749757f 100644 --- a/src/mame/audio/laserbat.cpp +++ b/src/mame/audio/laserbat.cpp @@ -355,16 +355,6 @@ WRITE8_MEMBER(catnmous_state::pia_portb_w) m_psg2->data_address_w(space, (data >> 2) & 0x01, m_pia->a_output()); } -WRITE_LINE_MEMBER(catnmous_state::pia_irqa) -{ - m_audiocpu->set_input_line(INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE); -} - -WRITE_LINE_MEMBER(catnmous_state::pia_irqb) -{ - m_audiocpu->set_input_line(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE); -} - WRITE8_MEMBER(catnmous_state::psg1_porta_w) { // similar to zaccaria.c since we have no clue how this board really works diff --git a/src/mame/audio/zaccaria.cpp b/src/mame/audio/zaccaria.cpp new file mode 100644 index 00000000000..9f9b71c9a7b --- /dev/null +++ b/src/mame/audio/zaccaria.cpp @@ -0,0 +1,294 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +#include "emu.h" +#include "audio/zaccaria.h" + +#include "cpu/m6800/m6800.h" +#include "machine/clock.h" +#include "sound/dac.h" + + +device_type const ZACCARIA_1B11142 = &device_creator; + + +/* + * slave sound cpu, produces music and sound effects + * mapping: + * A15 A14 A13 A12 A11 A10 A09 A08 A07 A06 A05 A04 A03 A02 A01 A00 + * 0 0 0 0 0 0 0 0 0 * * * * * * * RW 6802 internal ram + * 0 0 0 x x x x x x x x x x x x x Open bus (for area that doesn't overlap ram) + * 0 0 1 x x x x x x x x x x x x x Open bus + * 0 1 0 x x x x x x x x x 0 0 x x Open bus + * 0 1 0 x x x x x x x x x 0 1 x x Open bus + * 0 1 0 x x x x x x x x x 1 0 x x Open bus + * 0 1 0 x x x x x x x x x 1 1 * * RW 6821 PIA @ 4I + * 0 1 1 x x x x x x x x x x x x x Open bus + * 1 0 % % * * * * * * * * * * * * R /CS4A: Enable ROM 13 + * 1 1 % % * * * * * * * * * * * * R /CS5A: Enable ROM 9 + * note that the % bits go to pins 2 (6802 A12) and 26 (6802 A13) of the roms + * monymony and jackrabt both use 2764 roms, which use pin 2 as A12 and pin 26 as N/C don't care + * hence for actual chips used, the mem map is: + * 1 0 x * * * * * * * * * * * * * R /CS4A: Enable ROM 13 + * 1 1 x * * * * * * * * * * * * * R /CS5A: Enable ROM 9 + * + * 6821 PIA: + * CA1 comes from the master sound cpu's latch bit 7 (which is also connected to the AY chip at 4G's IOB1) + * CB1 comes from the 6802's clock divided by 4096*2 (about 437Hz) + * CA2 and CB2 are not connected + * PA0-7 connect to the data busses of the AY-3-8910 chips + * PB0 and PB1 connect to the BC1 and BDIR pins of the AY chip at 4G + * PB2 and PB3 connect to the BC1 and BDIR pins of the AY chip at 4H. + */ +static ADDRESS_MAP_START(zac1b11142_melody_map, AS_PROGRAM, 8, zac1b11142_audio_device) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x0000, 0x007f) AM_RAM // 6802 internal RAM + AM_RANGE(0x400c, 0x400f) AM_MIRROR(0x1ff0) AM_DEVREADWRITE("pia_4i", pia6821_device, read, write) + AM_RANGE(0x8000, 0x9fff) AM_MIRROR(0x2000) AM_ROM // rom 13 + AM_RANGE(0xc000, 0xdfff) AM_MIRROR(0x2000) AM_ROM // rom 9 +ADDRESS_MAP_END + + +/* + * master sound cpu, controls speech directly + * mapping: + * A15 A14 A13 A12 A11 A10 A09 A08 A07 A06 A05 A04 A03 A02 A01 A00 + * 0 0 0 0 0 0 0 0 0 * * * * * * * RW 6802 internal ram + * x 0 0 0 x x x x 1 x x 0 x x * * Open bus (test mode writes as if there was another PIA here) + * x 0 0 0 x x x x 1 x x 1 x x * * RW 6821 PIA @ 1I + * x 0 0 1 0 0 x x x x x x x x x x W MC1408 DAC + * x x 0 1 0 1 x x x x x x x x x x W Command to slave melody cpu + * x x 0 1 1 0 x x x x x x x x x x R Command read latch from z80 + * x x 0 1 1 1 x x x x x x x x x x Open bus + * % % 1 0 * * * * * * * * * * * * R /CS1A: Enable ROM 8 + * % % 1 1 * * * * * * * * * * * * R /CS0A: Enable ROM 7 + * note that the % bits go to pins 2 (6802 A14) and 26 (6802 A15) of the roms + * monymony and jackrabt both use 2764 roms, which use pin 2 as A12 and pin 26 as N/C don't care + * hence for actual chips used, the mem map is: + * x * 1 0 * * * * * * * * * * * * R /CS1A: Enable ROM 8 + * x * 1 1 * * * * * * * * * * * * R /CS0A: Enable ROM 7 + * + * 6821 PIA: + * PA0-7, PB0-1, CA2 and CB1 connect to the TMS5200 + * CA1 and CB2 are not connected, though the test mode assumes there's something connected to CB2 (possibly another LED like the one connected to PB4) + * PB3 connects to 'ACS' which goes to the Z80 + */ +static ADDRESS_MAP_START(zac1b11142_audio_map, AS_PROGRAM, 8, zac1b11142_audio_device) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x0000, 0x007f) AM_RAM // 6802 internal RAM + AM_RANGE(0x0090, 0x0093) AM_MIRROR(0x8f6c) AM_DEVREADWRITE("pia_1i", pia6821_device, read, write) + AM_RANGE(0x1000, 0x1000) AM_MIRROR(0x83ff) AM_DEVWRITE("dac_1f", dac_device, write_unsigned8) // MC1408 + AM_RANGE(0x1400, 0x1400) AM_MIRROR(0xc3ff) AM_WRITE(melody_command_w) + AM_RANGE(0x1800, 0x1800) AM_MIRROR(0xc3ff) AM_READ(host_command_r) + AM_RANGE(0x2000, 0x2fff) AM_MIRROR(0x8000) AM_ROM // ROM 8 with A12 low + AM_RANGE(0x3000, 0x3fff) AM_MIRROR(0x8000) AM_ROM // ROM 7 with A12 low + AM_RANGE(0x6000, 0x6fff) AM_MIRROR(0x8000) AM_ROM // ROM 8 with A12 high + AM_RANGE(0x7000, 0x7fff) AM_MIRROR(0x8000) AM_ROM // ROM 7 with A12 high +ADDRESS_MAP_END + + +MACHINE_CONFIG_FRAGMENT(zac1b11142_config) + MCFG_CPU_ADD("melodycpu", M6802, XTAL_3_579545MHz) // verified on pcb + MCFG_CPU_PROGRAM_MAP(zac1b11142_melody_map) + + MCFG_DEVICE_ADD("timebase", CLOCK, XTAL_3_579545MHz/4096/2) // CPU clock divided using 4040 and half of 74LS74 + MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("pia_4i", pia6821_device, cb1_w)) + + MCFG_DEVICE_ADD("pia_4i", PIA6821, 0) + MCFG_PIA_READPA_HANDLER(READ8(zac1b11142_audio_device, pia_4i_porta_r)) + MCFG_PIA_WRITEPA_HANDLER(WRITE8(zac1b11142_audio_device, pia_4i_porta_w)) + MCFG_PIA_WRITEPB_HANDLER(WRITE8(zac1b11142_audio_device, pia_4i_portb_w)) + MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("melodycpu", m6802_cpu_device, nmi_line)) + MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("melodycpu", m6802_cpu_device, irq_line)) + + MCFG_SOUND_ADD("ay_4g", AY8910, XTAL_3_579545MHz/2) // CPU clock divided using 4040 + MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(zac1b11142_audio_device, ay_4g_porta_w)) + MCFG_AY8910_PORT_B_READ_CB(READ8(zac1b11142_audio_device, ay_4g_portb_r)) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, DEVICE_SELF_OWNER, 0.15) + + MCFG_SOUND_ADD("ay_4h", AY8910, XTAL_3_579545MHz/2) // CPU clock divided using 4040 + MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(zac1b11142_audio_device, ay_4h_porta_w)) + MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(zac1b11142_audio_device, ay_4h_portb_w)) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, DEVICE_SELF_OWNER, 0.15) + + MCFG_CPU_ADD("audiocpu", M6802, XTAL_3_579545MHz) // verified on pcb + MCFG_CPU_PROGRAM_MAP(zac1b11142_audio_map) + MCFG_CPU_PERIODIC_INT_DRIVER(zac1b11142_audio_device, input_poll, 60) + + MCFG_DEVICE_ADD("pia_1i", PIA6821, 0) + MCFG_PIA_READPA_HANDLER(DEVREAD8("speech", tms5220_device, status_r)) + MCFG_PIA_WRITEPA_HANDLER(DEVWRITE8("speech", tms5220_device, data_w)) + MCFG_PIA_WRITEPB_HANDLER(WRITE8(zac1b11142_audio_device, pia_1i_portb_w)) + + MCFG_DAC_ADD("dac_1f") + MCFG_SOUND_ROUTE(ALL_OUTPUTS, DEVICE_SELF_OWNER, 0.80) + + // There is no xtal, the clock is obtained from a RC oscillator as shown in the TMS5220 datasheet (R=100kOhm C=22pF) + // 162kHz measured on pin 3 20 minutes after power on, clock would then be 162.3*4=649.2kHz + MCFG_SOUND_ADD("speech", TMS5200, 649200) // ROMCLK pin measured at 162.3Khz, OSC is exactly *4 of that) + MCFG_TMS52XX_IRQ_HANDLER(DEVWRITELINE("pia_1i", pia6821_device, cb1_w)) + MCFG_TMS52XX_READYQ_HANDLER(DEVWRITELINE("pia_1i", pia6821_device, ca2_w)) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, DEVICE_SELF_OWNER, 0.80) +MACHINE_CONFIG_END + + +INPUT_PORTS_START(zac1b11142_ioports) + PORT_START("1B11142") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("P1") +INPUT_PORTS_END + + +zac1b11142_audio_device::zac1b11142_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, ZACCARIA_1B11142, "Zaccaria 1B11142 Sound Board", tag, owner, clock, "zac1b11142", __FILE__) + , device_mixer_interface(mconfig, *this, 1) + , m_acs_cb(*this) + , m_melodycpu(*this, "melodycpu") + , m_pia_4i(*this, "pia_4i") + , m_ay_4g(*this, "ay_4g") + , m_ay_4h(*this, "ay_4h") + , m_audiocpu(*this, "audiocpu") + , m_pia_1i(*this, "pia_1i") + , m_speech(*this, "speech") + , m_inputs(*this, "1B11142") + , m_host_command(0) + , m_melody_command(0) +{ +} + +WRITE8_MEMBER(zac1b11142_audio_device::hs_w) +{ + m_host_command = data; + m_audiocpu->set_input_line(INPUT_LINE_IRQ0, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE); +} + +READ_LINE_MEMBER(zac1b11142_audio_device::acs_r) +{ + return (~m_pia_1i->b_output() >> 3) & 0x01; +} + +WRITE_LINE_MEMBER(zac1b11142_audio_device::ressound_w) +{ + // TODO: there is a pulse-stretching network attached that should be simulated + m_melodycpu->set_input_line(INPUT_LINE_RESET, state); + // TODO: holds the reset line of m_pia_4i - can't implement this in MAME at this time + // TODO: holds the reset line of m_ay_4g - can't implement this in MAME at this time + // TODO: holds the reset line of m_ay_4h - can't implement this in MAME at this time + m_audiocpu->set_input_line(INPUT_LINE_RESET, state); + // TODO: holds the reset line of m_pia_1i - can't implement this in MAME at this time + // TODO: does some funky stuff with the VDD and VSS lines on the speech chip +} + +READ8_MEMBER(zac1b11142_audio_device::pia_4i_porta_r) +{ + UINT8 const control = m_pia_4i->b_output(); + UINT8 data = 0xff; + + if (0x01 == (control & 0x03)) + data &= m_ay_4g->data_r(space, 0); + + if (0x04 == (control & 0x0c)) + data &= m_ay_4h->data_r(space, 0); + + return data; +} + +WRITE8_MEMBER(zac1b11142_audio_device::pia_4i_porta_w) +{ + UINT8 const control = m_pia_4i->b_output(); + + if (control & 0x02) + m_ay_4g->data_address_w(space, (control >> 0) & 0x01, data); + + if (control & 0x08) + m_ay_4h->data_address_w(space, (control >> 2) & 0x01, data); +} + +WRITE8_MEMBER(zac1b11142_audio_device::pia_4i_portb_w) +{ + if (data & 0x02) + m_ay_4g->data_address_w(space, (data >> 0) & 0x01, m_pia_4i->a_output()); + + if (data & 0x08) + m_ay_4h->data_address_w(space, (data >> 2) & 0x01, m_pia_4i->a_output()); +} + +WRITE8_MEMBER(zac1b11142_audio_device::ay_4g_porta_w) +{ + // TODO: (data & 0x07) controls tromba mix volume + // TODO: (data & 0x08) controls cassa gate + // TODO: (data & 0x10) controls rullante gate +} + +READ8_MEMBER(zac1b11142_audio_device::ay_4g_portb_r) +{ + return m_melody_command; +} + +WRITE8_MEMBER(zac1b11142_audio_device::ay_4h_porta_w) +{ + // TODO: data & 0x01 controls LEVEL + // TODO: data & 0x02 controls LEVELT +} + +WRITE8_MEMBER(zac1b11142_audio_device::ay_4h_portb_w) +{ + // TODO: data & 0x01 controls ANAL3 filter +} + +READ8_MEMBER(zac1b11142_audio_device::host_command_r) +{ + return m_host_command; +} + +WRITE8_MEMBER(zac1b11142_audio_device::melody_command_w) +{ + m_melody_command = data; + m_pia_4i->ca1_w((data >> 7) & 0x01); +} + +WRITE8_MEMBER(zac1b11142_audio_device::pia_1i_portb_w) +{ + m_speech->rsq_w((data >> 0) & 0x01); + m_speech->wsq_w((data >> 1) & 0x01); + m_acs_cb((~data >> 3) & 0x01); + // TODO: a LED output().set_led_value(0, (data >> 4) & 0x01); +} + +INTERRUPT_GEN_MEMBER(zac1b11142_audio_device::input_poll) +{ + m_audiocpu->set_input_line(INPUT_LINE_NMI, (m_inputs->read() & 0x80) ? CLEAR_LINE : ASSERT_LINE); +} + +machine_config_constructor zac1b11142_audio_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME(zac1b11142_config); +} + +ioport_constructor zac1b11142_audio_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(zac1b11142_ioports); +} + +void zac1b11142_audio_device::device_config_complete() +{ +} + +void zac1b11142_audio_device::device_start() +{ + m_acs_cb.resolve_safe(); + + save_item(NAME(m_host_command)); + save_item(NAME(m_melody_command)); +} + +void zac1b11142_audio_device::device_reset() +{ + m_host_command = 0; + m_melody_command = 0; +} diff --git a/src/mame/audio/zaccaria.h b/src/mame/audio/zaccaria.h new file mode 100644 index 00000000000..de796f9cf06 --- /dev/null +++ b/src/mame/audio/zaccaria.h @@ -0,0 +1,80 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +#pragma once + +#ifndef __AUDIO_ZACCARIA_H__ +#define __AUDIO_ZACCARIA_H__ + +#include "emu.h" +#include "machine/6821pia.h" +#include "machine/netlist.h" +#include "sound/ay8910.h" +#include "sound/tms5220.h" + + +extern device_type const ZACCARIA_1B11142; + + +#define MCFG_ZACCARIA_1B11142(_tag) \ + MCFG_DEVICE_ADD(_tag, ZACCARIA_1B11142, 0) + +#define MCFG_ZACCARIA_1B11142_SET_ACS_CALLBACK(_devcb) \ + devcb = &zac1b11142_audio_device::static_set_acs_cb(*device, DEVCB_##_devcb); + + +class zac1b11142_audio_device : public device_t, public device_mixer_interface +{ +public: + template static devcb_base &static_set_acs_cb(device_t &device, _Object object) + { return downcast(device).m_acs_cb.set_callback(object); } + + zac1b11142_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, UINT32 clock); + ~zac1b11142_audio_device() { } + + // host interface + DECLARE_WRITE8_MEMBER(hs_w); + DECLARE_READ_LINE_MEMBER(acs_r); + DECLARE_WRITE_LINE_MEMBER(ressound_w); + + // melody section handlers + DECLARE_READ8_MEMBER(pia_4i_porta_r); + DECLARE_WRITE8_MEMBER(pia_4i_porta_w); + DECLARE_WRITE8_MEMBER(pia_4i_portb_w); + DECLARE_WRITE8_MEMBER(ay_4g_porta_w); + DECLARE_READ8_MEMBER(ay_4g_portb_r); + DECLARE_WRITE8_MEMBER(ay_4h_porta_w); + DECLARE_WRITE8_MEMBER(ay_4h_portb_w); + + // master audio section handlers + DECLARE_READ8_MEMBER(host_command_r); + DECLARE_WRITE8_MEMBER(melody_command_w); + DECLARE_WRITE8_MEMBER(pia_1i_portb_w); + + // input ports don't push + INTERRUPT_GEN_MEMBER(input_poll); + +protected: + virtual machine_config_constructor device_mconfig_additions() const override; + virtual ioport_constructor device_input_ports() const override; + virtual void device_config_complete() override; + virtual void device_start() override; + virtual void device_reset() override; + + devcb_write_line m_acs_cb; + + required_device m_melodycpu; + required_device m_pia_4i; + required_device m_ay_4g; + required_device m_ay_4h; + + required_device m_audiocpu; + required_device m_pia_1i; + required_device m_speech; + + required_ioport m_inputs; + + UINT8 m_host_command; + UINT8 m_melody_command; +}; + +#endif // __AUDIO_ZACCARIA_H__ \ No newline at end of file diff --git a/src/mame/drivers/laserbat.cpp b/src/mame/drivers/laserbat.cpp index c1a072ac821..60aeeef360b 100644 --- a/src/mame/drivers/laserbat.cpp +++ b/src/mame/drivers/laserbat.cpp @@ -555,8 +555,8 @@ static MACHINE_CONFIG_DERIVED_CLASS( catnmous, laserbat_base, catnmous_state ) MCFG_PIA_READPA_HANDLER(READ8(catnmous_state, pia_porta_r)) MCFG_PIA_WRITEPA_HANDLER(WRITE8(catnmous_state, pia_porta_w)) MCFG_PIA_WRITEPB_HANDLER(WRITE8(catnmous_state, pia_portb_w)) - MCFG_PIA_IRQA_HANDLER(WRITELINE(catnmous_state, pia_irqa)) - MCFG_PIA_IRQB_HANDLER(WRITELINE(catnmous_state, pia_irqb)) + MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("audiocpu", m6802_cpu_device, nmi_line)) + MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("audiocpu", m6802_cpu_device, irq_line)) MCFG_SPEAKER_STANDARD_MONO("mono") diff --git a/src/mame/drivers/zaccaria.cpp b/src/mame/drivers/zaccaria.cpp index 3cc556bf7ab..328c9614af7 100644 --- a/src/mame/drivers/zaccaria.cpp +++ b/src/mame/drivers/zaccaria.cpp @@ -41,29 +41,19 @@ Notes: #include "emu.h" #include "cpu/z80/z80.h" -#include "cpu/m6800/m6800.h" #include "machine/i8255.h" -#include "sound/dac.h" #include "includes/zaccaria.h" void zaccaria_state::machine_start() { save_item(NAME(m_dsw_sel)); - save_item(NAME(m_active_8910)); - save_item(NAME(m_port0a)); - save_item(NAME(m_acs)); - save_item(NAME(m_last_port0b)); save_item(NAME(m_nmi_mask)); } void zaccaria_state::machine_reset() { m_dsw_sel = 0; - m_active_8910 = 0; - m_port0a = 0; - m_acs = 0; - m_last_port0b = 0; m_nmi_mask = 0; } @@ -71,21 +61,21 @@ WRITE8_MEMBER(zaccaria_state::dsw_sel_w) { switch (data & 0xf0) { - case 0xe0: - m_dsw_sel = 0; - break; + case 0xe0: + m_dsw_sel = 0; + break; - case 0xd0: - m_dsw_sel = 1; - break; + case 0xd0: + m_dsw_sel = 1; + break; - case 0xb0: - m_dsw_sel = 2; - break; + case 0xb0: + m_dsw_sel = 2; + break; - default: - logerror("%s: portsel = %02x\n", machine().describe_context(), data); - break; + default: + logerror("%s: portsel = %02x\n", machine().describe_context(), data); + break; } } @@ -95,94 +85,6 @@ READ8_MEMBER(zaccaria_state::dsw_r) } -WRITE8_MEMBER(zaccaria_state::ay8910_port0a_w) -{ - /* bits 0-2 go to a 74LS156 with open collector outputs - * one out of 8 Resitors is than used to form a resistor - * divider with Analog input 5 (tromba) - */ - - // bits 3-4 control the analog drum emulation on 8910 #0 ch. A - - static const int table[8] = { 8200, 5600, 3300, 1500, 820, 390, 150, 47 }; - int b0, b1, b2, ba, v; - b0 = data & 0x01; - b1 = (data & 0x02) >> 1; - b2 = (data & 0x04) >> 2; - ba = (b0<<2) | (b1<<1) | b2; - /* 150 below to scale to volume 100 */ - v = (150 * table[ba]) / (4700 + table[ba]); - //printf("dac1w %02d %04d\n", ba, v); - m_ay2->set_volume(1, v); -} - -READ8_MEMBER(zaccaria_state::port0a_r) -{ - return (m_active_8910 == 0) ? m_ay1->data_r(space, 0) : m_ay2->data_r(space, 0); -} - -WRITE8_MEMBER(zaccaria_state::port0a_w) -{ - m_port0a = data; -} - -WRITE8_MEMBER(zaccaria_state::port0b_w) -{ - /* bit 1 goes to 8910 #0 BDIR pin */ - if ((m_last_port0b & 0x02) == 0x02 && (data & 0x02) == 0x00) - { - /* bit 0 goes to the 8910 #0 BC1 pin */ - m_ay1->data_address_w(space, m_last_port0b, m_port0a); - } - else if ((m_last_port0b & 0x02) == 0x00 && (data & 0x02) == 0x02) - { - /* bit 0 goes to the 8910 #0 BC1 pin */ - if (m_last_port0b & 0x01) - m_active_8910 = 0; - } - /* bit 3 goes to 8910 #1 BDIR pin */ - if ((m_last_port0b & 0x08) == 0x08 && (data & 0x08) == 0x00) - { - /* bit 2 goes to the 8910 #1 BC1 pin */ - m_ay2->data_address_w(space, m_last_port0b >> 2, m_port0a); - } - else if ((m_last_port0b & 0x08) == 0x00 && (data & 0x08) == 0x08) - { - /* bit 2 goes to the 8910 #1 BC1 pin */ - if (m_last_port0b & 0x04) - m_active_8910 = 1; - } - - m_last_port0b = data; -} - -WRITE8_MEMBER(zaccaria_state::port1b_w) -{ - // bit 0 = /RS - m_tms->rsq_w((data >> 0) & 0x01); - // bit 1 = /WS - m_tms->wsq_w((data >> 1) & 0x01); - - // bit 3 = "ACS" (goes, inverted, to input port 6 bit 3) - m_acs = ~data & 0x08; - - // bit 4 = led (for testing?) - output().set_led_value(0,~data & 0x10); -} - - -WRITE8_MEMBER(zaccaria_state::sound_command_w) -{ - soundlatch_byte_w(space, 0, data); - m_audio2->set_input_line(0, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE); -} - -WRITE8_MEMBER(zaccaria_state::sound1_command_w) -{ - m_pia0->ca1_w(data & 0x80); - soundlatch2_byte_w(space, 0, data); -} - GAME_EXTERN(monymony); READ8_MEMBER(zaccaria_state::prot1_r) @@ -245,83 +147,23 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, zaccaria_state ) AM_RANGE(0x6800, 0x683f) AM_WRITE(attributes_w) AM_SHARE("attributesram") AM_RANGE(0x6840, 0x685f) AM_RAM AM_SHARE("spriteram") AM_RANGE(0x6881, 0x68c0) AM_RAM AM_SHARE("spriteram2") - AM_RANGE(0x6c00, 0x6c00) AM_WRITE(flip_screen_x_w) - AM_RANGE(0x6c01, 0x6c01) AM_WRITE(flip_screen_y_w) - AM_RANGE(0x6c02, 0x6c02) AM_WRITENOP /* sound reset */ - AM_RANGE(0x6c06, 0x6c06) AM_WRITE(coin_w) - AM_RANGE(0x6c07, 0x6c07) AM_WRITE(nmi_mask_w) - AM_RANGE(0x6c00, 0x6c07) AM_READ(prot2_r) - AM_RANGE(0x6e00, 0x6e00) AM_READWRITE(dsw_r, sound_command_w) + AM_RANGE(0x6c00, 0x6c00) AM_MIRROR(0x81f8) AM_WRITE(flip_screen_x_w) + AM_RANGE(0x6c01, 0x6c01) AM_MIRROR(0x81f8) AM_WRITE(flip_screen_y_w) + AM_RANGE(0x6c02, 0x6c02) AM_MIRROR(0x81f8) AM_WRITE(ressound_w) + AM_RANGE(0x6c06, 0x6c06) AM_MIRROR(0x81f8) AM_WRITE(coin_w) + AM_RANGE(0x6c07, 0x6c07) AM_MIRROR(0x81f8) AM_WRITE(nmi_mask_w) + AM_RANGE(0x6c00, 0x6c07) AM_MIRROR(0x81f8) AM_READ(prot2_r) + AM_RANGE(0x6e00, 0x6e00) AM_MIRROR(0x81f8) AM_READ(dsw_r) AM_DEVWRITE("audiopcb", zac1b11142_audio_device, hs_w) AM_RANGE(0x7000, 0x77ff) AM_RAM AM_RANGE(0x7800, 0x7803) AM_DEVREADWRITE("ppi8255", i8255_device, read, write) AM_RANGE(0x7c00, 0x7c00) AM_READ(watchdog_reset_r) AM_RANGE(0x8000, 0xdfff) AM_ROM ADDRESS_MAP_END -/* slave sound cpu, produces music and sound effects */ -/* mapping: - A15 A14 A13 A12 A11 A10 A09 A08 A07 A06 A05 A04 A03 A02 A01 A00 - 0 0 0 0 0 0 0 0 0 * * * * * * * RW 6802 internal ram - 0 0 0 x x x x x x x x x x x x x Open bus (for area that doesn't overlap ram) - 0 0 1 x x x x x x x x x x x x x Open bus - 0 1 0 x x x x x x x x x 0 0 x x Open bus - 0 1 0 x x x x x x x x x 0 1 x x Open bus - 0 1 0 x x x x x x x x x 1 0 x x Open bus - 0 1 0 x x x x x x x x x 1 1 * * RW 6821 PIA @ 4I - 0 1 1 x x x x x x x x x x x x x Open bus - 1 0 % % * * * * * * * * * * * * R /CS4A: Enable Rom 13 - 1 1 % % * * * * * * * * * * * * R /CS5A: Enable Rom 9 - note that the % bits go to pins 2 (6802 A12) and 26 (6802 A13) of the roms - monymony and jackrabt both use 2764 roms, which use pin 2 as A12 and pin 26 as N/C don't care - hence for actual chips used, the mem map is: - 1 0 x * * * * * * * * * * * * * R /CS4A: Enable Rom 13 - 1 1 x * * * * * * * * * * * * * R /CS5A: Enable Rom 9 - 6821 PIA: CA1 comes from the master sound cpu's latch bit 7 (which is also connected to the AY chip at 4G's IOB1); CB1 comes from a periodic counter clocked by the 6802's clock, divided by 4096. CA2 and CB2 are disconnected. PA0-7 connect to the data busses of the AY-3-8910 chips; PB0 and PB1 connect to the BC1 and BDIR pins of the AY chip at 4G; PB2 and PB3 connect to the BC1 and BDIR pins of the AY chip at 4H. -*/ -static ADDRESS_MAP_START( sound_map_1, AS_PROGRAM, 8, zaccaria_state ) - AM_RANGE(0x0000, 0x007f) AM_RAM - AM_RANGE(0x500c, 0x500f) AM_DEVREADWRITE("pia0", pia6821_device, read, write) AM_MIRROR(0x1ff0) - AM_RANGE(0x8000, 0x9fff) AM_ROM AM_MIRROR(0x2000) // rom 13 - AM_RANGE(0xc000, 0xdfff) AM_ROM AM_MIRROR(0x2000) // rom 9 -ADDRESS_MAP_END - -/* master sound cpu, controls speech directly */ -/* mapping: - A15 A14 A13 A12 A11 A10 A09 A08 A07 A06 A05 A04 A03 A02 A01 A00 - 0 0 0 0 0 0 0 0 0 * * * * * * * RW 6802 internal ram -**** x 0 0 0 x x x x 1 x x 0 x x * * Open bus (test mode writes as if there was another PIA here) - x 0 0 0 x x x x 1 x x 1 x x * * RW 6821 PIA @ 1I - x 0 0 1 0 0 x x x x x x x x x x W MC1408 DAC - x x 0 1 0 1 x x x x x x x x x x W Command to slave sound1 cpu - x x 0 1 1 0 x x x x x x x x x x R Command read latch from z80 - x x 0 1 1 1 x x x x x x x x x x Open bus - % % 1 0 * * * * * * * * * * * * R /CS1A: Enable Rom 8 - % % 1 1 * * * * * * * * * * * * R /CS0A: Enable Rom 7 - note that the % bits go to pins 2 (6802 A14) and 26 (6802 A15) of the roms - monymony and jackrabt both use 2764 roms, which use pin 2 as A12 and pin 26 as N/C don't care - hence for actual chips used, the mem map is: - x * 1 0 * * * * * * * * * * * * R /CS1A: Enable Rom 8 - x * 1 1 * * * * * * * * * * * * R /CS0A: Enable Rom 7 - - 6821 PIA: PA0-7, CA2 and CB1 connect to the TMS5200; CA1 and CB2 are disconnected, though the test mode assumes there's something connected to CB2 (possibly another LED like the one connected to PB4); PB3 connects to 'ACS' which goes to the z80. -*/ -static ADDRESS_MAP_START( sound_map_2, AS_PROGRAM, 8, zaccaria_state ) - AM_RANGE(0x0000, 0x007f) AM_RAM /* 6802 internal ram */ - AM_RANGE(0x0090, 0x0093) AM_DEVREADWRITE("pia1", pia6821_device, read, write) AM_MIRROR(0x8F6C) - AM_RANGE(0x1000, 0x1000) AM_DEVWRITE("mc1408", dac_device, write_unsigned8) AM_MIRROR(0x83FF) /* MC1408 */ - AM_RANGE(0x1400, 0x1400) AM_WRITE(sound1_command_w) AM_MIRROR(0xC3FF) - AM_RANGE(0x1800, 0x1800) AM_READ(soundlatch_byte_r) AM_MIRROR(0xC3FF) - AM_RANGE(0x2000, 0x2fff) AM_ROM AM_MIRROR(0x8000) // rom 8 with A12 low - AM_RANGE(0x3000, 0x3fff) AM_ROM AM_MIRROR(0x8000) // rom 7 with A12 low - AM_RANGE(0x6000, 0x6fff) AM_ROM AM_MIRROR(0x8000) // rom 8 with A12 high - AM_RANGE(0x7000, 0x7fff) AM_ROM AM_MIRROR(0x8000) // rom 7 with A12 high -ADDRESS_MAP_END - - -CUSTOM_INPUT_MEMBER(zaccaria_state::acs_r) +WRITE8_MEMBER(zaccaria_state::ressound_w) { - return (m_acs & 0x08) ? 1 : 0; + m_audiopcb->ressound_w(data & 0x01); } static INPUT_PORTS_START( monymony ) @@ -429,7 +271,7 @@ static INPUT_PORTS_START( monymony ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, zaccaria_state,acs_r, NULL) /* "ACS" - from pin 13 of a PIA on the sound board */ + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("audiopcb", zac1b11142_audio_device, acs_r) /* other bits come from a protection device */ INPUT_PORTS_END @@ -500,36 +342,12 @@ static MACHINE_CONFIG_START( zaccaria, zaccaria_state ) MCFG_CPU_VBLANK_INT_DRIVER("screen", zaccaria_state, vblank_irq) // MCFG_QUANTUM_TIME(attotime::from_hz(1000000)) - MCFG_CPU_ADD("audiocpu", M6802,XTAL_3_579545MHz) /* verified on pcb */ - MCFG_CPU_PROGRAM_MAP(sound_map_1) - - MCFG_DEVICE_ADD("timebase", CLOCK, XTAL_3_579545MHz/4096/2) /* verified on pcb */ - MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("pia0", pia6821_device, cb1_w)) - -// MCFG_QUANTUM_TIME(attotime::from_hz(1000000)) - - MCFG_CPU_ADD("audio2", M6802,XTAL_3_579545MHz) /* verified on pcb */ - MCFG_CPU_PROGRAM_MAP(sound_map_2) -// MCFG_QUANTUM_TIME(attotime::from_hz(1000000)) - MCFG_DEVICE_ADD("ppi8255", I8255A, 0) MCFG_I8255_IN_PORTA_CB(IOPORT("P1")) MCFG_I8255_IN_PORTB_CB(IOPORT("P2")) MCFG_I8255_IN_PORTC_CB(IOPORT("SYSTEM")) MCFG_I8255_OUT_PORTC_CB(WRITE8(zaccaria_state, dsw_sel_w)) - MCFG_DEVICE_ADD( "pia0", PIA6821, 0) - MCFG_PIA_READPA_HANDLER(READ8(zaccaria_state, port0a_r)) - MCFG_PIA_WRITEPA_HANDLER(WRITE8(zaccaria_state, port0a_w)) - MCFG_PIA_WRITEPB_HANDLER(WRITE8(zaccaria_state, port0b_w)) - MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("audiocpu", m6802_cpu_device, nmi_line)) - MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("audiocpu", m6802_cpu_device, irq_line)) - - MCFG_DEVICE_ADD( "pia1", PIA6821, 0) - MCFG_PIA_READPA_HANDLER(DEVREAD8("tms", tms5220_device, status_r)) - MCFG_PIA_WRITEPA_HANDLER(DEVWRITE8("tms", tms5220_device, data_w)) - MCFG_PIA_WRITEPB_HANDLER(WRITE8(zaccaria_state,port1b_w)) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.57) /* verified on pcb */ @@ -546,24 +364,8 @@ static MACHINE_CONFIG_START( zaccaria, zaccaria_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - - MCFG_SOUND_ADD("ay1", AY8910, XTAL_3_579545MHz/2) /* verified on pcb */ - MCFG_AY8910_PORT_B_READ_CB(READ8(driver_device, soundlatch2_byte_r)) - MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(zaccaria_state, ay8910_port0a_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15) - - MCFG_SOUND_ADD("ay2", AY8910, XTAL_3_579545MHz/2) /* verified on pcb */ - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15) - - MCFG_DAC_ADD("mc1408") - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) - - /* There is no xtal, the clock is obtained from a RC oscillator as shown in the TMS5220 datasheet (R=100kOhm C=22pF) */ - /* 162kHz measured on pin 3 20 minutesa fter power on. Clock would then be 162*4=648kHz. */ - MCFG_SOUND_ADD("tms", TMS5200, 649200) /* ROMCLK pin measured at 162.3Khz, OSC is exactly *4 of that) */ - MCFG_TMS52XX_IRQ_HANDLER(DEVWRITELINE("pia1", pia6821_device, cb1_w)) - MCFG_TMS52XX_READYQ_HANDLER(DEVWRITELINE("pia1", pia6821_device, ca2_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) + MCFG_ZACCARIA_1B11142("audiopcb") + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) MACHINE_CONFIG_END @@ -589,11 +391,11 @@ ROM_START( monymony ) ROM_LOAD( "cpu6.2c", 0x5000, 0x1000, CRC(31da62b1) SHA1(486f07087244f8537510afacb64ddd59eb512a4d) ) ROM_CONTINUE( 0xd000, 0x1000 ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for first 6802 */ + ROM_REGION( 0x10000, "audiopcb:melodycpu", 0 ) /* 64k for first 6802 */ ROM_LOAD( "snd13.2g", 0x8000, 0x2000, CRC(78b01b98) SHA1(2aabed56cdae9463deb513c0c5021f6c8dfd271e) ) ROM_LOAD( "snd9.1i", 0xc000, 0x2000, CRC(94e3858b) SHA1(04961f67b95798b530bd83355dec612389f22255) ) - ROM_REGION( 0x10000, "audio2", 0 ) /* 64k for second 6802 */ + ROM_REGION( 0x10000, "audiopcb:audiocpu", 0 ) /* 64k for second 6802 */ ROM_LOAD( "snd8.1h", 0x2000, 0x1000, CRC(aad76193) SHA1(e08fc184efced392ee902c4cc9daaaf3310cdfe2) ) ROM_CONTINUE( 0x6000, 0x1000 ) ROM_LOAD( "snd7.1g", 0x3000, 0x1000, CRC(1e8ffe3e) SHA1(858ee7abe88d5801237e519cae2b50ae4bf33a58) ) @@ -624,11 +426,11 @@ ROM_START( jackrabt ) ROM_LOAD( "cpu-01.5h", 0xc000, 0x1000, CRC(785e1a01) SHA1(a748d300be9455cad4f912e01c2279bb8465edfe) ) ROM_LOAD( "cpu-01.6h", 0xd000, 0x1000, CRC(dd5979cf) SHA1(e9afe7002b2258a1c3132bdd951c6e20d473fb6a) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for first 6802 */ + ROM_REGION( 0x10000, "audiopcb:melodycpu", 0 ) /* 64k for first 6802 */ ROM_LOAD( "13snd.2g", 0x8000, 0x2000, CRC(fc05654e) SHA1(ed9c66672fe89c41e320e1d27b53f5efa92dce9c) ) ROM_LOAD( "9snd.1i", 0xc000, 0x2000, CRC(3dab977f) SHA1(3e79c06d2e70b050f01b7ac58be5127ba87904b0) ) - ROM_REGION( 0x10000, "audio2", 0 ) /* 64k for second 6802 */ + ROM_REGION( 0x10000, "audiopcb:audiocpu", 0 ) /* 64k for second 6802 */ ROM_LOAD( "8snd.1h", 0x2000, 0x1000, CRC(f4507111) SHA1(0513f0831b94aeda84aa4f3b4a7c60dfc5113b2d) ) ROM_CONTINUE( 0x6000, 0x1000 ) ROM_LOAD( "7snd.1g", 0x3000, 0x1000, CRC(c722eff8) SHA1(d8d1c091ab80ea2d6616e4dc030adc9905c0a496) ) @@ -663,11 +465,11 @@ ROM_START( jackrabt2 ) ROM_LOAD( "6cpu2.2c", 0x5000, 0x1000, CRC(404496eb) SHA1(44381e27e540fe9d8cacab4c3b1fe9a4f20d26a8) ) ROM_CONTINUE( 0xd000, 0x1000 ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for first 6802 */ + ROM_REGION( 0x10000, "audiopcb:melodycpu", 0 ) /* 64k for first 6802 */ ROM_LOAD( "13snd.2g", 0x8000, 0x2000, CRC(fc05654e) SHA1(ed9c66672fe89c41e320e1d27b53f5efa92dce9c) ) ROM_LOAD( "9snd.1i", 0xc000, 0x2000, CRC(3dab977f) SHA1(3e79c06d2e70b050f01b7ac58be5127ba87904b0) ) - ROM_REGION( 0x10000, "audio2", 0 ) /* 64k for second 6802 */ + ROM_REGION( 0x10000, "audiopcb:audiocpu", 0 ) /* 64k for second 6802 */ ROM_LOAD( "8snd.1h", 0x2000, 0x1000, CRC(f4507111) SHA1(0513f0831b94aeda84aa4f3b4a7c60dfc5113b2d) ) ROM_CONTINUE( 0x6000, 0x1000 ) ROM_LOAD( "7snd.1g", 0x3000, 0x1000, CRC(c722eff8) SHA1(d8d1c091ab80ea2d6616e4dc030adc9905c0a496) ) @@ -704,11 +506,11 @@ ROM_START( jackrabts ) ROM_LOAD( "6cpu.2c", 0x5000, 0x1000, CRC(f53d6356) SHA1(9b167edca59cf81a2468368a372bab132f15e2ea) ) ROM_CONTINUE( 0xd000, 0x1000 ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for first 6802 */ + ROM_REGION( 0x10000, "audiopcb:melodycpu", 0 ) /* 64k for first 6802 */ ROM_LOAD( "13snd.2g", 0x8000, 0x2000, CRC(fc05654e) SHA1(ed9c66672fe89c41e320e1d27b53f5efa92dce9c) ) ROM_LOAD( "9snd.1i", 0xc000, 0x2000, CRC(3dab977f) SHA1(3e79c06d2e70b050f01b7ac58be5127ba87904b0) ) - ROM_REGION( 0x10000, "audio2", 0 ) /* 64k for second 6802 */ + ROM_REGION( 0x10000, "audiopcb:audiocpu", 0 ) /* 64k for second 6802 */ ROM_LOAD( "8snd.1h", 0x2000, 0x1000, CRC(f4507111) SHA1(0513f0831b94aeda84aa4f3b4a7c60dfc5113b2d) ) ROM_CONTINUE( 0x6000, 0x1000 ) ROM_LOAD( "7snd.1g", 0x3000, 0x1000, CRC(c722eff8) SHA1(d8d1c091ab80ea2d6616e4dc030adc9905c0a496) ) diff --git a/src/mame/includes/laserbat.h b/src/mame/includes/laserbat.h index 1df1e972b4e..a07cdd97a87 100644 --- a/src/mame/includes/laserbat.h +++ b/src/mame/includes/laserbat.h @@ -203,8 +203,6 @@ public: DECLARE_READ8_MEMBER(pia_porta_r); DECLARE_WRITE8_MEMBER(pia_porta_w); DECLARE_WRITE8_MEMBER(pia_portb_w); - DECLARE_WRITE_LINE_MEMBER(pia_irqa); - DECLARE_WRITE_LINE_MEMBER(pia_irqb); // PSG handlers DECLARE_WRITE8_MEMBER(psg1_porta_w); diff --git a/src/mame/includes/zaccaria.h b/src/mame/includes/zaccaria.h index 62a76a1df44..6bcfa72798d 100644 --- a/src/mame/includes/zaccaria.h +++ b/src/mame/includes/zaccaria.h @@ -1,60 +1,25 @@ // license:BSD-3-Clause // copyright-holders:Nicola Salmoria -#include "machine/6821pia.h" -#include "machine/clock.h" -#include "sound/ay8910.h" -#include "sound/tms5220.h" +#include "emu.h" +#include "audio/zaccaria.h" class zaccaria_state : public driver_device { public: zaccaria_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_audio2(*this, "audio2"), - m_pia0(*this, "pia0"), - m_ay1(*this, "ay1"), - m_ay2(*this, "ay2"), - m_tms(*this, "tms"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_videoram(*this, "videoram"), - m_attributesram(*this, "attributesram"), - m_spriteram(*this, "spriteram"), - m_spriteram2(*this, "spriteram2"), - m_dsw_port(*this, "DSW") { } - - - - /* devices */ - required_device m_maincpu; - required_device m_audio2; - required_device m_pia0; - required_device m_ay1; - required_device m_ay2; - required_device m_tms; - required_device m_gfxdecode; - required_device m_palette; - - /* memory pointers */ - required_shared_ptr m_videoram; - required_shared_ptr m_attributesram; - required_shared_ptr m_spriteram; - required_shared_ptr m_spriteram2; - - required_ioport_array<3> m_dsw_port; - - int m_dsw_sel; - int m_active_8910; - int m_port0a; - int m_acs; - int m_last_port0b; - tilemap_t *m_bg_tilemap; - UINT8 m_nmi_mask; + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_gfxdecode(*this, "gfxdecode") + , m_palette(*this, "palette") + , m_audiopcb(*this, "audiopcb") + , m_videoram(*this, "videoram") + , m_attributesram(*this, "attributesram") + , m_spriteram(*this, "spriteram") + , m_spriteram2(*this, "spriteram2") + , m_dsw_port(*this, "DSW") + { } DECLARE_READ8_MEMBER(dsw_r); - DECLARE_WRITE8_MEMBER(sound_command_w); - DECLARE_WRITE8_MEMBER(sound1_command_w); DECLARE_READ8_MEMBER(prot1_r); DECLARE_READ8_MEMBER(prot2_r); DECLARE_WRITE8_MEMBER(coin_w); @@ -63,13 +28,8 @@ public: DECLARE_WRITE8_MEMBER(attributes_w); DECLARE_WRITE8_MEMBER(flip_screen_x_w); DECLARE_WRITE8_MEMBER(flip_screen_y_w); - DECLARE_CUSTOM_INPUT_MEMBER(acs_r); + DECLARE_WRITE8_MEMBER(ressound_w); DECLARE_WRITE8_MEMBER(dsw_sel_w); - DECLARE_WRITE8_MEMBER(ay8910_port0a_w); - DECLARE_READ8_MEMBER(port0a_r); - DECLARE_WRITE8_MEMBER(port0a_w); - DECLARE_WRITE8_MEMBER(port0b_w); - DECLARE_WRITE8_MEMBER(port1b_w); TILE_GET_INFO_MEMBER(get_tile_info); virtual void machine_start() override; virtual void machine_reset() override; @@ -78,4 +38,21 @@ public: UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(vblank_irq); void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect,UINT8 *spriteram,int color,int section); + +protected: + required_device m_maincpu; + required_device m_gfxdecode; + required_device m_palette; + required_device m_audiopcb; + + required_shared_ptr m_videoram; + required_shared_ptr m_attributesram; + required_shared_ptr m_spriteram; + required_shared_ptr m_spriteram2; + + required_ioport_array<3> m_dsw_port; + + int m_dsw_sel; + tilemap_t *m_bg_tilemap; + UINT8 m_nmi_mask; }; From 3a2fe0398a50d902a0a56dae2e69d40eb6f991f9 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Fri, 12 Feb 2016 13:34:12 +0000 Subject: [PATCH 4/8] new clones Super Bobble Bobble (bootleg, set 4) [jordigahan] --- src/mame/arcade.lst | 1 + src/mame/drivers/bublbobl.cpp | 37 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/mame/arcade.lst b/src/mame/arcade.lst index bf808c28c26..d3307077951 100644 --- a/src/mame/arcade.lst +++ b/src/mame/arcade.lst @@ -2107,6 +2107,7 @@ sboblbobl // bootleg sboblbobla // bootleg sboblboblb // bootleg sboblboblc // bootleg +sboblbobld // bootleg bublboblb // bootleg bub68705 // bootleg dland // bootleg diff --git a/src/mame/drivers/bublbobl.cpp b/src/mame/drivers/bublbobl.cpp index f2fba272e1d..f79a6e7c61a 100644 --- a/src/mame/drivers/bublbobl.cpp +++ b/src/mame/drivers/bublbobl.cpp @@ -1550,6 +1550,42 @@ ROM_START( sboblboblc ) ROM_END + +ROM_START( sboblbobld ) + ROM_REGION( 0x30000, "maincpu", 0 ) + ROM_LOAD( "3.bin", 0x00000, 0x08000, CRC(524cdc4f) SHA1(f778e53f664e911a5b992a4f85bcad1097eaa36f) ) + /* ROMs banked at 8000-bfff */ + ROM_LOAD( "5.bin", 0x10000, 0x08000, CRC(13118eb1) SHA1(5a5da40c2cc82420f70bc58ffa32de1088c6c82f) ) + ROM_LOAD( "4.bin", 0x18000, 0x08000, CRC(13fe9baa) SHA1(ca1ca240d755621e533d9bbbdd8d953154670499) ) + /* 20000-2ffff empty */ + + ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_LOAD( "1.bin", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ + ROM_LOAD( "2.bin", 0x0000, 0x08000, CRC(4f9a26e8) SHA1(3105b34b88a7134493c2b3f584729f8b0407a011) ) + + ROM_REGION( 0x80000, "gfx1", ROMREGION_INVERT ) + ROM_LOAD( "12", 0x00000, 0x8000, CRC(20358c22) SHA1(2297af6c53d5807bf90a8e081075b8c72a994fc5) ) /* 1st plane */ + ROM_LOAD( "13", 0x08000, 0x8000, CRC(930168a9) SHA1(fd358c3c3b424bca285f67a1589eb98a345ff670) ) + ROM_LOAD( "14", 0x10000, 0x8000, CRC(9773e512) SHA1(33c1687ee575d66bf0e98add45d06da827813765) ) + ROM_LOAD( "15", 0x18000, 0x8000, CRC(d045549b) SHA1(0c12077d3ddc2ce6aa45a0224ad5540f3f218446) ) + ROM_LOAD( "16", 0x20000, 0x8000, CRC(d0af35c5) SHA1(c5a89f4d73acc0db86654540b3abfd77b3757db5) ) + ROM_LOAD( "17", 0x28000, 0x8000, CRC(7b5369a8) SHA1(1307b26d80e6f36ebe6c442bebec41d20066eaf9) ) + /* 0x30000-0x3ffff empty */ + ROM_LOAD( "6", 0x40000, 0x8000, CRC(6b61a413) SHA1(44eddf12fb46fceca2addbe6da929aaea7636b13) ) /* 2nd plane */ + ROM_LOAD( "7", 0x48000, 0x8000, CRC(b5492d97) SHA1(d5b045e3ebaa44809757a4220cefb3c6815470da) ) + ROM_LOAD( "8", 0x50000, 0x8000, CRC(d69762d5) SHA1(3326fef4e0bd86681a3047dc11886bb171ecb609) ) + ROM_LOAD( "9", 0x58000, 0x8000, CRC(9f243b68) SHA1(32dce8d311a4be003693182a999e4053baa6bb0a) ) + ROM_LOAD( "10", 0x60000, 0x8000, CRC(66e9438c) SHA1(b94e62b6fbe7f4e08086d0365afc5cff6e0ccafd) ) + ROM_LOAD( "11", 0x68000, 0x8000, CRC(9ef863ad) SHA1(29f91b5a3765e4d6e6c3382db1d8d8297b6e56c8) ) + /* 0x70000-0x7ffff empty */ + + ROM_REGION( 0x0100, "proms", 0 ) + ROM_LOAD( "a71-25.41", 0x0000, 0x0100, CRC(2d0f8545) SHA1(089c31e2f614145ef2743164f7b52ae35bc06808) ) /* video timing */ + +ROM_END + ROM_START( bub68705 ) ROM_REGION( 0x30000, "maincpu", 0 ) /* Program roms match Bubble Bobble (older) */ ROM_LOAD( "2.bin", 0x00000, 0x08000, CRC(32c8305b) SHA1(6bf69b3edfbefd33cd670a762b4bf0b39629a220) ) @@ -1861,6 +1897,7 @@ GAME( 1986, boblbobl, bublbobl, boblbobl, boblbobl, bublbobl_state, bublbobl GAME( 1986, sboblbobl, bublbobl, boblbobl, sboblbobl, bublbobl_state, bublbobl, ROT0, "bootleg (Datsu)", "Super Bobble Bobble (bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, sboblbobla, bublbobl, boblbobl, boblbobl, bublbobl_state, bublbobl, ROT0, "bootleg", "Super Bobble Bobble (bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, sboblboblb, bublbobl, boblbobl, sboblboblb, bublbobl_state, bublbobl, ROT0, "bootleg", "Super Bobble Bobble (bootleg, set 3)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, sboblbobld, bublbobl, boblbobl, sboblboblb, bublbobl_state, bublbobl, ROT0, "bootleg", "Super Bobble Bobble (bootleg, set 4)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, sboblboblc, bublbobl, boblbobl, sboblboblb, bublbobl_state, bublbobl, ROT0, "bootleg", "Super Bubble Bobble (bootleg)", MACHINE_SUPPORTS_SAVE ) // the title screen on this one isn't hacked GAME( 1986, bub68705, bublbobl, bub68705, bublbobl, bublbobl_state, bublbobl, ROT0, "bootleg", "Bubble Bobble (bootleg with 68705)", MACHINE_SUPPORTS_SAVE ) From 61bada0d914cdcd33cdef2f132743e7bf6a50d48 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 12 Feb 2016 14:49:36 +0100 Subject: [PATCH 5/8] Added multi window support for BGFX backend (nw) --- src/osd/modules/osdwindow.h | 4 +- src/osd/modules/render/drawbgfx.cpp | 143 +++++++++++++++++++++------- src/osd/sdl/window.cpp | 12 +++ src/osd/windows/window.cpp | 12 +++ 4 files changed, 135 insertions(+), 36 deletions(-) diff --git a/src/osd/modules/osdwindow.h b/src/osd/modules/osdwindow.h index a702569c581..3145a784c42 100644 --- a/src/osd/modules/osdwindow.h +++ b/src/osd/modules/osdwindow.h @@ -37,8 +37,9 @@ public: #else m_hwnd(0), m_dc(0), m_focus_hwnd(0), m_resize_state(0), #endif - m_primlist(NULL), + m_primlist(nullptr), m_index(0), + m_main(nullptr), m_prescale(1) {} virtual ~osd_window() { } @@ -80,6 +81,7 @@ public: render_primitive_list *m_primlist; osd_window_config m_win_config; int m_index; + osd_window *m_main; protected: int m_prescale; }; diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 8f0bc447d6e..293fe3c41b2 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -63,7 +63,8 @@ public: : osd_renderer(w, FLAG_NONE), m_blittimer(0), m_blit_dim(0, 0), m_last_hofs(0), m_last_vofs(0), - m_last_blit_time(0), m_last_blit_pixels(0) + m_last_blit_time(0), m_last_blit_pixels(0), + m_dimensions(0,0) {} virtual int create() override; @@ -111,8 +112,9 @@ public: bgfx::ProgramHandle m_progQuadTexture; bgfx::ProgramHandle m_progLine; bgfx::UniformHandle m_s_texColor; - + bgfx::FrameBufferHandle fbh; // Original display_mode + osd_dim m_dimensions; }; @@ -158,6 +160,28 @@ static void drawbgfx_exit(void) // renderer_bgfx::create //============================================================ bgfx::ProgramHandle loadProgram(const char* _vsName, const char* _fsName); + + +#ifdef OSD_SDL +static void* sdlNativeWindowHandle(SDL_Window* _window) +{ + SDL_SysWMinfo wmi; + SDL_VERSION(&wmi.version); + if (!SDL_GetWindowWMInfo(_window, &wmi)) + { + return NULL; + } + +# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD + return (void*)wmi.info.x11.window; +# elif BX_PLATFORM_OSX + return wmi.info.cocoa.window; +# elif BX_PLATFORM_WINDOWS + return wmi.info.win.window; +# endif // BX_PLATFORM_ +} + +#endif int renderer_bgfx::create() { // create renderer @@ -165,26 +189,39 @@ int renderer_bgfx::create() #ifdef OSD_WINDOWS RECT client; GetClientRect(window().m_hwnd, &client); - - bgfx::winSetHwnd(window().m_hwnd); - bgfx::init(); - bgfx::reset(rect_width(&client), rect_height(&client), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); + if (window().m_index == 0) + { + bgfx::winSetHwnd(window().m_hwnd); + bgfx::init(); + bgfx::reset(rect_width(&client), rect_height(&client), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); + // Enable debug text. + bgfx::setDebug(BGFX_DEBUG_TEXT); //BGFX_DEBUG_STATS + m_dimensions = osd_dim(rect_width(&client), rect_height(&client)); + } + else { + fbh = bgfx::createFrameBuffer(window().m_hwnd, rect_width(&client), rect_height(&client)); + bgfx::touch(window().m_index); + } #else osd_dim wdim = window().get_size(); - bgfx::sdlSetWindow(window().sdl_window()); - bgfx::init(); - bgfx::reset(wdim.width(), wdim.height(), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); + if (window().m_index == 0) + { + bgfx::sdlSetWindow(window().sdl_window()); + bgfx::init(); + bgfx::reset(wdim.width(), wdim.height(), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); + m_dimensions = osd_dim(wdim.width(), wdim.height()); + } + else { + fbh = bgfx::createFrameBuffer(sdlNativeWindowHandle(window().sdl_window()), wdim.width(), wdim.height()); + bgfx::touch(window().m_index); + } #endif - - // Enable debug text. - bgfx::setDebug(BGFX_DEBUG_TEXT); //BGFX_DEBUG_STATS // Create program from shaders. m_progQuad = loadProgram("vs_quad", "fs_quad"); m_progQuadTexture = loadProgram("vs_quad_texture", "fs_quad_texture"); m_progLine = loadProgram("vs_line", "fs_line"); m_s_texColor = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1); - osd_printf_verbose("Leave drawsdl2_window_create\n"); return 0; } @@ -195,17 +232,19 @@ int renderer_bgfx::create() void renderer_bgfx::destroy() { // free the memory in the window + if (window().m_index == 0) + { + // destroy_all_textures(); + // + bgfx::destroyUniform(m_s_texColor); + // Cleanup. + bgfx::destroyProgram(m_progQuad); + bgfx::destroyProgram(m_progQuadTexture); + bgfx::destroyProgram(m_progLine); - // destroy_all_textures(); - // - bgfx::destroyUniform(m_s_texColor); - // Cleanup. - bgfx::destroyProgram(m_progQuad); - bgfx::destroyProgram(m_progQuadTexture); - bgfx::destroyProgram(m_progLine); - - // Shutdown bgfx. - bgfx::shutdown(); + // Shutdown bgfx. + bgfx::shutdown(); + } } @@ -738,8 +777,8 @@ static inline void copyline_yuy16_to_argb(UINT32 *dst, const UINT16 *src, int wi } int renderer_bgfx::draw(int update) { - initVertexDecls(); - + initVertexDecls(); + int index = window().m_index; // Set view 0 default viewport. int width, height; #ifdef OSD_WINDOWS @@ -747,14 +786,48 @@ int renderer_bgfx::draw(int update) GetClientRect(window().m_hwnd, &client); width = rect_width(&client); height = rect_height(&client); + #else osd_dim wdim = window().get_size(); width = wdim.width(); height = wdim.height(); #endif - bgfx::setViewSeq(0, true); - bgfx::setViewRect(0, 0, 0, width, height); - bgfx::reset(width, height, video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); + if (index == 0) + { + if ((m_dimensions != osd_dim(width, height))) { + bgfx::reset(width, height, video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); + m_dimensions = osd_dim(width, height); + } + } + else { + if ((m_dimensions != osd_dim(width, height))) { + bgfx::reset(window().m_main->get_size().width(), window().m_main->get_size().height(), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); + if (bgfx::isValid(fbh)) + { + bgfx::destroyFrameBuffer(fbh); + } +#ifdef OSD_WINDOWS + fbh = bgfx::createFrameBuffer(window().m_hwnd, width, height); +#else + fbh = bgfx::createFrameBuffer(sdlNativeWindowHandle(window().sdl_window()), width, height); +#endif + bgfx::setViewFrameBuffer(index, fbh); + m_dimensions = osd_dim(width, height); + bgfx::setViewClear(index + , BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH + , 0x000000ff + , 1.0f + , 0 + ); + bgfx::touch(index); + bgfx::frame(); + return 0; + } + } + if (index != 0) bgfx::setViewFrameBuffer(index, fbh); + bgfx::setViewSeq(index, true); + bgfx::setViewRect(index, 0, 0, width, height); + // Setup view transform. { float view[16]; @@ -766,9 +839,9 @@ int renderer_bgfx::draw(int update) float bottom = height; float proj[16]; bx::mtxOrtho(proj, left, right, bottom, top, 0.0f, 100.0f); - bgfx::setViewTransform(0, view, proj); + bgfx::setViewTransform(index, view, proj); } - bgfx::setViewClear(0 + bgfx::setViewClear(index , BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH , 0x000000ff , 1.0f @@ -777,7 +850,7 @@ int renderer_bgfx::draw(int update) // This dummy draw call is here to make sure that view 0 is cleared // if no other draw calls are submitted to view 0. - bgfx::touch(0); + bgfx::touch(index); window().m_primlist->acquire_lock(); // Draw quad. @@ -815,7 +888,7 @@ int renderer_bgfx::draw(int update) u32Color(prim->color.r * 255, prim->color.g * 255, prim->color.b * 255, prim->color.a * 255), 1.0f); bgfx::setState(flags); - bgfx::submit(0, m_progLine); + bgfx::submit(index, m_progLine); break; case render_primitive::QUAD: @@ -826,7 +899,7 @@ int renderer_bgfx::draw(int update) screenQuad(prim->bounds.x0, prim->bounds.y0, prim->bounds.x1, prim->bounds.y1, u32Color(prim->color.r * 255, prim->color.g * 255, prim->color.b * 255, prim->color.a * 255), uv); bgfx::setState(flags); - bgfx::submit(0, m_progQuad); + bgfx::submit(index, m_progQuad); } else { screenQuad(prim->bounds.x0, prim->bounds.y0, prim->bounds.x1, prim->bounds.y1, @@ -926,7 +999,7 @@ int renderer_bgfx::draw(int update) } bgfx::setTexture(0, m_s_texColor, m_texture); bgfx::setState(flags); - bgfx::submit(0, m_progQuadTexture); + bgfx::submit(index, m_progQuadTexture); bgfx::destroyTexture(m_texture); } break; @@ -939,7 +1012,7 @@ int renderer_bgfx::draw(int update) window().m_primlist->release_lock(); // Advance to next frame. Rendering thread will be kicked to // process submitted rendering primitives. - bgfx::frame(); + if (index==0) bgfx::frame(); return 0; } diff --git a/src/osd/sdl/window.cpp b/src/osd/sdl/window.cpp index 47ab3cdd162..85f945874d9 100644 --- a/src/osd/sdl/window.cpp +++ b/src/osd/sdl/window.cpp @@ -1269,6 +1269,18 @@ OSDWORK_CALLBACK( sdl_window_info::complete_create_wt ) SDL_WM_SetCaption(window->m_title, "SDLMAME"); #endif + // set main window + if (window->m_index > 0) + { + for (auto w = sdl_window_list; w != NULL; w = w->m_next) + { + if (w->m_index == 0) + { + window->m_main = w; + break; + } + } + } window->monitor()->refresh(); // initialize the drawing backend if (window->renderer().create()) diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp index 4dcbd1661e7..f39199d7b50 100644 --- a/src/osd/windows/window.cpp +++ b/src/osd/windows/window.cpp @@ -661,6 +661,18 @@ void win_window_info::create(running_machine &machine, int index, osd_monitor_in window->m_fullscreen = !video_config.windowed; window->m_index = index; + // set main window + if (index > 0) + { + for (auto w = win_window_list; w != NULL; w = w->m_next) + { + if (w->m_index == 0) + { + window->m_main = w; + break; + } + } + } // see if we are safe for fullscreen window->m_fullscreen_safe = TRUE; for (win = win_window_list; win != NULL; win = win->m_next) From 244e00775a6d2a232a495d7404644f30ffa91157 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 12 Feb 2016 15:15:11 +0100 Subject: [PATCH 6/8] simplify code (nw) --- src/osd/modules/render/drawbgfx.cpp | 43 +++++++++-------------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 293fe3c41b2..7644bccb9f1 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -180,42 +180,34 @@ static void* sdlNativeWindowHandle(SDL_Window* _window) return wmi.info.win.window; # endif // BX_PLATFORM_ } - #endif + int renderer_bgfx::create() { // create renderer -#ifdef OSD_WINDOWS - RECT client; - GetClientRect(window().m_hwnd, &client); - if (window().m_index == 0) - { - bgfx::winSetHwnd(window().m_hwnd); - bgfx::init(); - bgfx::reset(rect_width(&client), rect_height(&client), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); - // Enable debug text. - bgfx::setDebug(BGFX_DEBUG_TEXT); //BGFX_DEBUG_STATS - m_dimensions = osd_dim(rect_width(&client), rect_height(&client)); - } - else { - fbh = bgfx::createFrameBuffer(window().m_hwnd, rect_width(&client), rect_height(&client)); - bgfx::touch(window().m_index); - } -#else osd_dim wdim = window().get_size(); if (window().m_index == 0) { +#ifdef OSD_WINDOWS + bgfx::winSetHwnd(window().m_hwnd); +#else bgfx::sdlSetWindow(window().sdl_window()); +#endif bgfx::init(); bgfx::reset(wdim.width(), wdim.height(), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); + // Enable debug text. + bgfx::setDebug(BGFX_DEBUG_TEXT); //BGFX_DEBUG_STATS m_dimensions = osd_dim(wdim.width(), wdim.height()); } else { +#ifdef OSD_WINDOWS + fbh = bgfx::createFrameBuffer(window().m_hwnd, wdim.width(), wdim.height()); +#else fbh = bgfx::createFrameBuffer(sdlNativeWindowHandle(window().sdl_window()), wdim.width(), wdim.height()); +#endif bgfx::touch(window().m_index); } -#endif // Create program from shaders. m_progQuad = loadProgram("vs_quad", "fs_quad"); m_progQuadTexture = loadProgram("vs_quad_texture", "fs_quad_texture"); @@ -780,18 +772,9 @@ int renderer_bgfx::draw(int update) initVertexDecls(); int index = window().m_index; // Set view 0 default viewport. - int width, height; -#ifdef OSD_WINDOWS - RECT client; - GetClientRect(window().m_hwnd, &client); - width = rect_width(&client); - height = rect_height(&client); - -#else osd_dim wdim = window().get_size(); - width = wdim.width(); - height = wdim.height(); -#endif + int width = wdim.width(); + int height = wdim.height(); if (index == 0) { if ((m_dimensions != osd_dim(width, height))) { From e7e6420ca7ada52e8df29739832aab6d4f943b94 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 12 Feb 2016 15:58:24 +0100 Subject: [PATCH 7/8] cleanup and fix for xy_to_render_target (nw) --- src/osd/modules/render/drawbgfx.cpp | 37 ++++------------------------- 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 7644bccb9f1..6a0b1ca448f 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -60,10 +60,7 @@ class renderer_bgfx : public osd_renderer { public: renderer_bgfx(osd_window *w) - : osd_renderer(w, FLAG_NONE), m_blittimer(0), - m_blit_dim(0, 0), - m_last_hofs(0), m_last_vofs(0), - m_last_blit_time(0), m_last_blit_pixels(0), + : osd_renderer(w, FLAG_NONE), m_dimensions(0,0) {} @@ -79,35 +76,11 @@ public: virtual void destroy() override; virtual render_primitive_list *get_primitives() override { -#ifdef OSD_WINDOWS - RECT client; - GetClientRect(window().m_hwnd, &client); - window().target()->set_bounds(rect_width(&client), rect_height(&client), window().aspect()); - return &window().target()->get_primitives(); -#else osd_dim wdim = window().get_size(); window().target()->set_bounds(wdim.width(), wdim.height(), window().aspect()); return &window().target()->get_primitives(); -#endif } - // void render_quad(texture_info *texture, const render_primitive *prim, const int x, const int y); - - //texture_info *texture_find(const render_primitive &prim, const quad_setup_data &setup); - //texture_info *texture_update(const render_primitive &prim); - - INT32 m_blittimer; - - //simple_list m_texlist; // list of active textures - - osd_dim m_blit_dim; - float m_last_hofs; - float m_last_vofs; - - // Stats - INT64 m_last_blit_time; - INT64 m_last_blit_pixels; - bgfx::ProgramHandle m_progQuad; bgfx::ProgramHandle m_progQuadTexture; bgfx::ProgramHandle m_progLine; @@ -247,11 +220,11 @@ void renderer_bgfx::destroy() #ifdef OSD_SDL int renderer_bgfx::xy_to_render_target(int x, int y, int *xt, int *yt) { - *xt = x - m_last_hofs; - *yt = y - m_last_vofs; - if (*xt<0 || *xt >= m_blit_dim.width()) + *xt = x; + *yt = y; + if (*xt<0 || *xt >= m_dimensions.width()) return 0; - if (*yt<0 || *yt >= m_blit_dim.height()) + if (*yt<0 || *yt >= m_dimensions.height()) return 0; return 1; } From e8f547428d6a544b5d36a2d11d1f597e44543e3e Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 12 Feb 2016 16:29:18 +0100 Subject: [PATCH 8/8] proper memory handling (nw) --- src/osd/modules/render/drawbgfx.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 6a0b1ca448f..35a50609cf4 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -127,6 +127,8 @@ int drawbgfx_init(running_machine &machine, osd_draw_callbacks *callbacks) static void drawbgfx_exit(void) { + // Shutdown bgfx. + bgfx::shutdown(); } //============================================================ @@ -196,20 +198,15 @@ int renderer_bgfx::create() void renderer_bgfx::destroy() { - // free the memory in the window - if (window().m_index == 0) + if (window().m_index > 0) { - // destroy_all_textures(); - // - bgfx::destroyUniform(m_s_texColor); - // Cleanup. - bgfx::destroyProgram(m_progQuad); - bgfx::destroyProgram(m_progQuadTexture); - bgfx::destroyProgram(m_progLine); - - // Shutdown bgfx. - bgfx::shutdown(); + bgfx::destroyFrameBuffer(fbh); } + bgfx::destroyUniform(m_s_texColor); + // Cleanup. + bgfx::destroyProgram(m_progQuad); + bgfx::destroyProgram(m_progQuadTexture); + bgfx::destroyProgram(m_progLine); }